diff --git a/DEPS b/DEPS index 1e38bff..7cb5e9694 100644 --- a/DEPS +++ b/DEPS
@@ -222,11 +222,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'f5bd4e4b9f6bd1b508dd5eb67129bfca528ef39b', + 'skia_revision': '50f0dadb7fc864de7baa31946eb83c03e1d68bdc', # 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': 'e1c59dfd37b6196f5b1156eb8b3808c471aa62e1', + 'v8_revision': '2bc9e275213af0df521c4ab3d8cd1bc16780de9c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -238,7 +238,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '65498c15ca60362b11673a023d326d60db1f6e9b', + 'swiftshader_revision': '02834d41a934f5707300a9f15f83214169242369', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -269,7 +269,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': 'b695f311a8a7ede3b22f4f6b39d87fdab699d291', + 'nacl_revision': '7d3880119eeff880e5c2108324ad97b28ed3e2ba', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -301,7 +301,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': 'cbc2f8eb8ee6643651e5d045c711c7b9f38d4788', + 'devtools_frontend_revision': '9d5b8f2d3bdce7f2fa15962c1d1f272a7b77dfb5', # 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. @@ -581,7 +581,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '07271357576a22fb9325300793c4fb5e26601c70', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'afd83e4c9037967079201edd6e934bbd66cfa6b5', 'condition': 'checkout_ios', }, @@ -651,7 +651,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'Px9wnwF_5wm8GWzFTISnnUdIXX0ZuH1_mUtTcPSeTk8C', + 'version': 'GTpANs0YNFUNxMMTjDT3vBa-yrDzj0-S3vvytwnEjokC', }, ], 'dep_type': 'cipd', @@ -662,7 +662,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'K1-2F6AIH6XC3p7sc0SeR8HizBweUyKcKaxmPXqdASgC', + 'version': 'SbuZWuVQVjXuVxrdc7Cs2UypoQp2AxefcyIg4nc3hHYC', }, ], 'dep_type': 'cipd', @@ -673,7 +673,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'AEREMiplAGUDrQYWkb5GCwbOWnjB5bGyMc6Sx_vBsH0C', + 'version': 'CFDm-IBP2ay-3oZqHxg3Z6-XaIVecx-pEx3bgrQw1SQC', }, ], 'dep_type': 'cipd', @@ -738,7 +738,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': '7rK3FRn0Lb5wAO4thkxAj_sMaGdwXTOhMCY4YUPpWrIC', + 'version': 'Pn2p1tIiK3wuyswQrPaVSJRE9I7wYRbQ2cThXLfguOIC', }, ], 'condition': 'checkout_android', @@ -954,7 +954,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' + '@' + '0f1b3b9918b7f87c98a1919dcda569e2804a4884', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '65b7b24c002d0a5f488459d0ec27baa9ca7bc7f7', 'condition': 'checkout_chromeos', }, @@ -1360,7 +1360,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'cc178a3f172732fa9b107cda5281c98c1ac9fead', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '6908f0ef6c79e5ecacd7ba4e8e2d001cd709a302', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1468,7 +1468,7 @@ }, 'src/third_party/re2/src': - Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '4606f89f43b2991908b904576bb1b936891115bc', + Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '892ed217d3ac114d51fa0738f82783282a5e8230', 'src/third_party/r8': { 'packages': [ @@ -1551,7 +1551,7 @@ }, 'src/third_party/usrsctp/usrsctplib': - Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '965b19a8636bbcd9617c1658cfe874a10cedb15d', + Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'fc5cba21a01b60977d277b0e6b5b72146383dcf6', 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@388827e09d3753d16922479ec813f3ddb8d2fa52', @@ -1592,7 +1592,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e2aeec9de7a742ae131b2f56fc22de6b17b8d0e1', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '2bbbd6686e44a87579d2df0020e907d2c4fd5090', + Var('webrtc_git') + '/src.git' + '@' + 'b629aee669460dba38accb015d024cc1270ff0f5', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1653,7 +1653,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a3e374223fdcc69220004307c21f17bd55e27fed', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b774ad8003fed1f1a56fcf0d891276ce1c290d26', 'condition': 'checkout_src_internal', }, @@ -1661,7 +1661,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/eche_app/app', - 'version': 'jpm9CCFb7x6u-2IuadKlG4J0ssHT3j7ZvQK06uBTpf0C', + 'version': 'kG2kLjG-qa6xbUHokVwPT3YeV5-h581elsnbyCJs3nAC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1672,7 +1672,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'eCmMPkRdaeHi1w0Qy1-XqCmaLmNxlzo1L2xSrTt1To0C', + 'version': 'lwZVZjthTdfygLVY49X4zUW8Ij4Y6Rsf4pUDv-ljTOoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1683,7 +1683,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': '_TIm0eEyE6_6IK2yI5nM7vZbCJxOwa7yRXLnOTTcAnwC', + 'version': 'AKSLFhhRLW6DdlQcoypIyBKIx6eI_NJCgafynRL5wM4C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index aca601b..3dd2d849 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc
@@ -588,9 +588,14 @@ // doesn't actually call into an arbitrary client, it just posts a task to // call onPageStarted. shouldOverrideUrlLoading happens earlier (see // ContentBrowserClient::ShouldOverrideUrlLoading). - throttles.push_back( - navigation_interception::InterceptNavigationDelegate::CreateThrottleFor( - navigation_handle, navigation_interception::SynchronyMode::kSync)); + std::unique_ptr<content::NavigationThrottle> intercept_navigation_throttle = + navigation_interception::InterceptNavigationDelegate:: + MaybeCreateThrottleFor( + navigation_handle, + navigation_interception::SynchronyMode::kSync); + if (intercept_navigation_throttle) + throttles.push_back(std::move(intercept_navigation_throttle)); + throttles.push_back(std::make_unique<PolicyBlocklistNavigationThrottle>( navigation_handle, AwBrowserContext::FromWebContents(navigation_handle->GetWebContents()),
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 286fa2c..082c2f24 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">ለማዘመን ዳግም ያስነሱ</translation> <translation id="2595239820337756193">5 ሺሕ በማይሎች</translation> <translation id="2596078834055697711">የመስኮት ቅጽበታዊ ገጽ እይታን ያንሱ</translation> +<translation id="2607678425161541573">በመስመር ላይ መግባት ያስፈልጋል</translation> <translation id="2617342710774726426">ሲም ካርድ ተዘግቷል</translation> <translation id="2621713457727696555">ደህንነቱ ተጠብቋል</translation> <translation id="2653019840645008922">የመስኮት መቅረጽ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 4b77ebb..5082c9b 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">إعادة التشغيل للتحديث</translation> <translation id="2595239820337756193">5 كيلومتر بالميل</translation> <translation id="2596078834055697711">أخذ لقطة شاشة للنافذة</translation> +<translation id="2607678425161541573">يجب تسجيل الدخول على الإنترنت</translation> <translation id="2617342710774726426">تم قفل شريحة SIM</translation> <translation id="2621713457727696555">مؤمّنة</translation> <translation id="2653019840645008922">لقطة نافذة</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 7f021fe..ba9c38d3 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Güncəlləmək üçün yenidən başladın</translation> <translation id="2595239820337756193">5000 mil</translation> <translation id="2596078834055697711">Pəncərənin skrinşotunu çəkin</translation> +<translation id="2607678425161541573">Onlayn giriş tələb olunur</translation> <translation id="2617342710774726426">SIM kart kilidlənib</translation> <translation id="2621713457727696555">Güvənli</translation> <translation id="2653019840645008922">Pəncərə çəkimi</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 1ee3a1b..7cc95e1 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Перазапусціць і абнавіць</translation> <translation id="2595239820337756193">5 кіламетраў у мілях</translation> <translation id="2596078834055697711">Зрабіць здымак акна</translation> +<translation id="2607678425161541573">Неабходна выканаць уваход праз інтэрнэт</translation> <translation id="2617342710774726426">SIM-карта заблакіравана</translation> <translation id="2621713457727696555">Абаронена</translation> <translation id="2653019840645008922">Здыманне акна</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index aa9d0ee..6105198 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Рестартирайте, за да актуализирате</translation> <translation id="2595239820337756193">5 km in miles</translation> <translation id="2596078834055697711">Правене на екранна снимка на прозореца</translation> +<translation id="2607678425161541573">Изисква се онлайн вход</translation> <translation id="2617342710774726426">SIM картата е заключена</translation> <translation id="2621713457727696555">защитена</translation> <translation id="2653019840645008922">Заснемане на прозореца</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index cf208711..9b56f5f 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Reinicia per actualitzar</translation> <translation id="2595239820337756193">5 km en milles</translation> <translation id="2596078834055697711">Fes una captura de pantalla de la finestra</translation> +<translation id="2607678425161541573">Cal iniciar la sessió en línia</translation> <translation id="2617342710774726426">La targeta SIM està bloquejada</translation> <translation id="2621713457727696555">Segura</translation> <translation id="2653019840645008922">Captura de la finestra</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index dc2dc39..cbbfd57e 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Restartovat a aktualizovat</translation> <translation id="2595239820337756193">5 km v mílích</translation> <translation id="2596078834055697711">Pořídit snímek obrazovky okna</translation> +<translation id="2607678425161541573">Je vyžadováno online přihlášení</translation> <translation id="2617342710774726426">SIM karta je uzamčena</translation> <translation id="2621713457727696555">Zabezpečeno</translation> <translation id="2653019840645008922">Záznam okna</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index ef760bf..544c9129 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Genstart for at opdatere</translation> <translation id="2595239820337756193">5 kilometer i miles</translation> <translation id="2596078834055697711">Tag screenshot af vinduet</translation> +<translation id="2607678425161541573">Onlinelogin er påkrævet</translation> <translation id="2617342710774726426">SIM-kortet er låst</translation> <translation id="2621713457727696555">Beskyttet</translation> <translation id="2653019840645008922">Tag et screenshot af et vindue</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index e918bf0..bae6e1a 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Zum Aktualisieren neu starten</translation> <translation id="2595239820337756193">5 km in Meilen</translation> <translation id="2596078834055697711">Screenshot von Fenster erstellen</translation> +<translation id="2607678425161541573">Online-Anmeldung erforderlich</translation> <translation id="2617342710774726426">SIM-Karte ist gesperrt</translation> <translation id="2621713457727696555">Gesichert</translation> <translation id="2653019840645008922">Fensteraufnahme</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 387e7a553..885d3c0 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Επανεκκίνηση για ενημέρωση</translation> <translation id="2595239820337756193">5 χλμ. σε μίλια</translation> <translation id="2596078834055697711">Λήψη στιγμιότυπου οθόνης παραθύρου</translation> +<translation id="2607678425161541573">Απαιτείται σύνδεση στο διαδίκτυο</translation> <translation id="2617342710774726426">Η κάρτα SIM είναι κλειδωμένη</translation> <translation id="2621713457727696555">Unsecured</translation> <translation id="2653019840645008922">Λήψη παραθύρου</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 1979bd9e..a8582d9 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Restart to update</translation> <translation id="2595239820337756193">5 K in miles</translation> <translation id="2596078834055697711">Take window screenshot</translation> +<translation id="2607678425161541573">Online sign-in required</translation> <translation id="2617342710774726426">SIM card is locked</translation> <translation id="2621713457727696555">Secured</translation> <translation id="2653019840645008922">Window capture</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index ca812e23..395dc26b 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Reiniciar para actualizar</translation> <translation id="2595239820337756193">5 km en millas</translation> <translation id="2596078834055697711">Tomar captura de pantalla de la ventana</translation> +<translation id="2607678425161541573">Se requiere acceso en línea</translation> <translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation> <translation id="2621713457727696555">Segura</translation> <translation id="2653019840645008922">Captura de ventana</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 24a048bb..38d92cfa0 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Reiniciar para actualizar</translation> <translation id="2595239820337756193">5 km en millas</translation> <translation id="2596078834055697711">Hacer una captura de pantalla de la ventana</translation> +<translation id="2607678425161541573">Se requiere inicio de sesión online</translation> <translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation> <translation id="2621713457727696555">Segura</translation> <translation id="2653019840645008922">Captura de ventana</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index fc2d9ecb..fad86c7 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Eguneratzeko, berrabiarazi</translation> <translation id="2595239820337756193">Zenbat da 5 km miliatan</translation> <translation id="2596078834055697711">Atera leihoaren pantaila-argazkia</translation> +<translation id="2607678425161541573">Saioa hasi behar da sarean</translation> <translation id="2617342710774726426">Blokeatuta dago SIM txartela</translation> <translation id="2621713457727696555">Babestuta</translation> <translation id="2653019840645008922">Kapturatu leihoko edukia</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index a2b7d8e..67614da 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">بازراهاندازی برای بهروزرسانی</translation> <translation id="2595239820337756193">5K in miles (۵ کیلومتر به مایل)</translation> <translation id="2596078834055697711">گرفتن عکس از پنجره صفحهنمایش</translation> +<translation id="2607678425161541573">ورود به سیستم آنلاین لازم است</translation> <translation id="2617342710774726426">سیمکارت قفل است</translation> <translation id="2621713457727696555">ایمن شد</translation> <translation id="2653019840645008922">ضبط پنجره</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index a77aafcc..5aabade 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Päivitä käynnistämällä uudelleen</translation> <translation id="2595239820337756193">5 km maileina</translation> <translation id="2596078834055697711">Ota kuvakaappaus</translation> +<translation id="2607678425161541573">Edellyttää kirjautumista verkossa</translation> <translation id="2617342710774726426">SIM-kortti on lukittu.</translation> <translation id="2621713457727696555">Suojattu</translation> <translation id="2653019840645008922">Ikkunan tallennus</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index c984b9bd..1a5cbd5 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">I-restart para mag-update</translation> <translation id="2595239820337756193">5K sa milya</translation> <translation id="2596078834055697711">Kumuha ng screenshot ng window</translation> +<translation id="2607678425161541573">Kailangang mag-sign in online</translation> <translation id="2617342710774726426">Naka-lock ang SIM card</translation> <translation id="2621713457727696555">Secured</translation> <translation id="2653019840645008922">Window capture</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index baccf24..baac3155 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Redémarrer pour faire la mise à jour</translation> <translation id="2595239820337756193">Combien y a-t-il de milles dans 5 km?</translation> <translation id="2596078834055697711">Faire une capture d'écran de la fenêtre</translation> +<translation id="2607678425161541573">Connexion en ligne requise</translation> <translation id="2617342710774726426">La carte SIM est verrouillée</translation> <translation id="2621713457727696555">Sécurisé</translation> <translation id="2653019840645008922">Capturer la fenêtre</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index a574df10..7618839 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">अपडेट करने के लिए रीस्टार्ट करें</translation> <translation id="2595239820337756193">5 हज़ार कितने मील होता है</translation> <translation id="2596078834055697711">विंडो का स्क्रीनशॉट लें</translation> +<translation id="2607678425161541573">ऑनलाइन साइन इन करना ज़रूरी है</translation> <translation id="2617342710774726426">सिम कार्ड लॉक है</translation> <translation id="2621713457727696555">सुरक्षित</translation> <translation id="2653019840645008922">विंडो कैप्चर</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 08dc6af..795b3af 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Újraindítás és frissítés</translation> <translation id="2595239820337756193">5000 mérföld</translation> <translation id="2596078834055697711">Képernyőkép készítése az ablakról</translation> +<translation id="2607678425161541573">Online bejelentkezés szükséges</translation> <translation id="2617342710774726426">A SIM-kártya zárolva van</translation> <translation id="2621713457727696555">Biztonságos</translation> <translation id="2653019840645008922">Felvétel készítése az ablakról</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index ad8b8c6..796d5e90 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Թարմացնելու համար վերագործարկեք</translation> <translation id="2595239820337756193">5 հազար մղոն</translation> <translation id="2596078834055697711">Ստանալ պատուհանի պատկեր</translation> +<translation id="2607678425161541573">Անհրաժեշտ է առցանց մուտք գործել</translation> <translation id="2617342710774726426">SIM քարտը կողպված է</translation> <translation id="2621713457727696555">Պաշտպանված է</translation> <translation id="2653019840645008922">Պատուհանի տեսագրում</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index f677590..85ae13c 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Nyalakan ulang untuk mengupdate</translation> <translation id="2595239820337756193">Lima kilometer dalam mil</translation> <translation id="2596078834055697711">Mengambil screenshot jendela</translation> +<translation id="2607678425161541573">Perlu login online</translation> <translation id="2617342710774726426">Kartu SIM terkunci</translation> <translation id="2621713457727696555">Aman</translation> <translation id="2653019840645008922">Tangkapan jendela</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index da92de9a..aaff203 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Riavvia per aggiornare</translation> <translation id="2595239820337756193">5 km in miglia</translation> <translation id="2596078834055697711">Consente di acquisire uno screenshot della finestra</translation> +<translation id="2607678425161541573">Accesso online richiesto</translation> <translation id="2617342710774726426">La scheda SIM è bloccata</translation> <translation id="2621713457727696555">Protetta</translation> <translation id="2653019840645008922">Acquisizione finestra</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 45aeeba3..42561715 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">צריך להפעיל מחדש כדי לעדכן</translation> <translation id="2595239820337756193">כמה מיילים יש ב-5 קילומטרים</translation> <translation id="2596078834055697711">צילום מסך של חלון</translation> +<translation id="2607678425161541573">נדרשת כניסה אונליין</translation> <translation id="2617342710774726426">כרטיס ה-SIM נעול</translation> <translation id="2621713457727696555">מאובטחת</translation> <translation id="2653019840645008922">צילום חלון</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 2711936..f63d38a 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">再起動して更新</translation> <translation id="2595239820337756193">5 km は何マイル</translation> <translation id="2596078834055697711">ウィンドウのスクリーンショットを撮影する</translation> +<translation id="2607678425161541573">オンライン ログインが必要です</translation> <translation id="2617342710774726426">SIM カードはロックされています</translation> <translation id="2621713457727696555">保護あり</translation> <translation id="2653019840645008922">ウィンドウ キャプチャ</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index f122bb91..9ce4580c 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">გადატვირთვა გასაახლებლად</translation> <translation id="2595239820337756193">5K მილებში</translation> <translation id="2596078834055697711">ფანჯრის ანაბეჭდის გადაღება</translation> +<translation id="2607678425161541573">საჭიროა სიტემაში ონლაინ შესვლა</translation> <translation id="2617342710774726426">SIM ბარათი დაბლოკილია</translation> <translation id="2621713457727696555">დაცული</translation> <translation id="2653019840645008922">ფანჯრის აღბეჭდვა</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index b593cbd13..cdf694d 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Жаңарту үшін қайта іске қосу</translation> <translation id="2595239820337756193">5 км неше миляға тең</translation> <translation id="2596078834055697711">Терезенің скриншотын жасау</translation> +<translation id="2607678425161541573">Онлайн кіру қажет</translation> <translation id="2617342710774726426">SIM картасы құлыпталған</translation> <translation id="2621713457727696555">Қорғалған</translation> <translation id="2653019840645008922">Терезені түсіру</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 4172482..b312c9f 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">ចាប់ផ្តើមឡើងវិញដើម្បីដំឡើងជំនាន់</translation> <translation id="2595239820337756193">5 ពាន់ម៉ាយល៍</translation> <translation id="2596078834055697711">ថតរូបថតអេក្រង់វិនដូ</translation> +<translation id="2607678425161541573">តម្រូវឱ្យចូលគណនីលើអ៊ីនធឺណិត</translation> <translation id="2617342710774726426">ស៊ីមកាតជាប់សោ</translation> <translation id="2621713457727696555">មានសុវត្ថិភាព</translation> <translation id="2653019840645008922">ថតវិនដូ</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index ab9cc1df..5e4483d 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -320,6 +320,7 @@ <translation id="3510164367642747937">ಮೌಸ್ ಕರ್ಸರ್ ಎದ್ದುಗಾಣಿಸಿ</translation> <translation id="3513798432020909783"><ph name="MANAGER_EMAIL" /> ಮೂಲಕ ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation> <translation id="3552189655002856821">ವೈ-ಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation> +<translation id="3560866052109807830">ಡ್ರಾಯಿಂಗ್ ಟೂಲ್ಗಳ ಮಾರ್ಕರ್</translation> <translation id="3563775809269155755">ಹಾಟ್ಸ್ಪಾಟ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="3571734092741541777">ಹೊಂದಿಸು</translation> <translation id="3573179567135747900">"<ph name="FROM_LOCALE" />" ಗೆ ಮರುಬದಲಾಯಿಸಿ (ಮರುಪ್ರಾರಂಭಿಸುವ ಅಗತ್ಯವಿದೆ)</translation> @@ -417,6 +418,7 @@ <translation id="4274537685965975248">Ctrl + Alt + ಡೌನ್ ಆ್ಯರೋ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಬದಲಿಸಲಾಗಿದೆ. End ಕೀ ಬಳಸಲು, <ph name="LAUNCHER_KEY_NAME" /> ಕೀ + ರೈಟ್ ಆ್ಯರೋ ಒತ್ತಿ.</translation> <translation id="4279490309300973883">ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ</translation> <translation id="4285498937028063278">ಅನ್ಪಿನ್</translation> +<translation id="429402653707266969">ಟೂಲ್ಬಾರ್ ಸ್ಥಳವನ್ನು ಟಾಗಲ್ ಮಾಡಿ</translation> <translation id="4294319844246081198">ಶುಭೋದಯ <ph name="GIVEN_NAME" /> ಅವರೇ,</translation> <translation id="4296136865091727875">ಎಲ್ಲಾ <ph name="COUNT" /> ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> <translation id="4302592941791324970">ಲಭ್ಯವಿಲ್ಲ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index e382c3d4..f06d96ea 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">업데이트하려면 다시 시작</translation> <translation id="2595239820337756193">5km를 마일로 변환</translation> <translation id="2596078834055697711">창 스크린샷 찍기</translation> +<translation id="2607678425161541573">온라인 로그인 필요</translation> <translation id="2617342710774726426">SIM 카드가 잠겨 있습니다.</translation> <translation id="2621713457727696555">보안</translation> <translation id="2653019840645008922">창 캡처</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index f95390e4..c3015a6 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Жаңыртуу үчүн өчүрүп күйгүзүңүз</translation> <translation id="2595239820337756193">5 миң миля</translation> <translation id="2596078834055697711">Терезенин скриншотун тартып алуу</translation> +<translation id="2607678425161541573">Онлайн аккаунтка кирүү талап кылынат</translation> <translation id="2617342710774726426">SIM-карта кулпуланган</translation> <translation id="2621713457727696555">Корголгон</translation> <translation id="2653019840645008922">Терезени сүрөткө тартып алуу</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 20f6852..904fdf3 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">ປິດເປີດຄືນໃໝ່ເພື່ອອັບເດດ</translation> <translation id="2595239820337756193">5 ພັນໄມລ໌</translation> <translation id="2596078834055697711">ຖ່າຍພາບໜ້າຈໍ</translation> +<translation id="2607678425161541573">ຕ້ອງເຂົ້າສູ່ລະບົບອອນລາຍ</translation> <translation id="2617342710774726426">ແຜ່ນ SIM ລັອກແລ້ວ</translation> <translation id="2621713457727696555">ຮັກສາຄວາມປອດໄພແລ້ວ</translation> <translation id="2653019840645008922">ຖ່າຍຮູບໜ້າຈໍ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 633401f..3e081291 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Paleisti iš naujo, kad būtų atnaujinta</translation> <translation id="2595239820337756193">5 tūkst. mylių</translation> <translation id="2596078834055697711">Sukurti lango ekrano kopiją</translation> +<translation id="2607678425161541573">Reikia prisijungti internete</translation> <translation id="2617342710774726426">SIM kortelė užrakinta</translation> <translation id="2621713457727696555">Apsaugota</translation> <translation id="2653019840645008922">Lango užfiksavimas</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 55383fe1..0acbcd6 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Restartēt, lai atjauninātu</translation> <translation id="2595239820337756193">5 kilometri jūdzēs</translation> <translation id="2596078834055697711">Uzņemt loga ekrānuzņēmumu</translation> +<translation id="2607678425161541573">Nepieciešama pierakstīšanās tiešsaistē</translation> <translation id="2617342710774726426">SIM karte ir bloķēta.</translation> <translation id="2621713457727696555">Aizsargāts</translation> <translation id="2653019840645008922">Loga uzņemšana</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 2ceb91c..610b19cc 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Рестартирај за да се ажурира</translation> <translation id="2595239820337756193">5 km во милји</translation> <translation id="2596078834055697711">Прави слика од екранот</translation> +<translation id="2607678425161541573">Задолжително е најавување онлајн</translation> <translation id="2617342710774726426">SIM-картичката е заклучена</translation> <translation id="2621713457727696555">Заштитена</translation> <translation id="2653019840645008922">Снимање прозорец</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 4b2c8d6..253b546 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Mulakan semula untuk mengemas kini</translation> <translation id="2595239820337756193">5000 batu</translation> <translation id="2596078834055697711">Ambil tangkapan skrin tetingkap</translation> +<translation id="2607678425161541573">Log masuk dalam talian diperlukan</translation> <translation id="2617342710774726426">Kad SIM dikunci</translation> <translation id="2621713457727696555">Selamat</translation> <translation id="2653019840645008922">Tangkapan tetingkap</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 348002b..20d53ab 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">အပ်ဒိတ်လုပ်ရန်အတွက် ပြန်လည်စတင်ရန်</translation> <translation id="2595239820337756193">၅ ကီလိုမီတာကို မိုင်ပြောင်းပါ</translation> <translation id="2596078834055697711">ဝင်းဒိုး မျက်နှာပြင်ပုံ ရိုက်ရန်</translation> +<translation id="2607678425161541573">အွန်လိုင်း လက်မှတ်ထိုးဝင်ခြင်း လိုအပ်သည်</translation> <translation id="2617342710774726426">ဆင်းမ်ကတ် လော့ခ်ကျနေပါသည်</translation> <translation id="2621713457727696555">လုံခြုံပြီ</translation> <translation id="2653019840645008922">ဝင်းဒိုး ပုံဖမ်းယူမှု</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 38f73842..e450cb50 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">अद्यावधिक गर्न पुनः सुरु गर्नुहोस्</translation> <translation id="2595239820337756193">५ किलोमिटर बराबर कति माइल हुन्छ</translation> <translation id="2596078834055697711">विन्डोको स्क्रिनसट लिनुहोस्</translation> +<translation id="2607678425161541573">अनलाइन मार्फत साइन इन गर्नु पर्ने हुन्छ</translation> <translation id="2617342710774726426">SIM कार्ड लक गरिएको छ</translation> <translation id="2621713457727696555">सुरक्षित पारियो</translation> <translation id="2653019840645008922">विन्डो क्याप्चर</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 7c59514..a157231 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Start på nytt for å oppdatere</translation> <translation id="2595239820337756193">5 km i miles</translation> <translation id="2596078834055697711">Ta en skjermdump av vinduet</translation> +<translation id="2607678425161541573">Nettbasert pålogging kreves</translation> <translation id="2617342710774726426">SIM-kortet er låst</translation> <translation id="2621713457727696555">Sikret</translation> <translation id="2653019840645008922">Vindusopptak</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index fb38e7c..170fdea 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Uruchom ponownie, by zaktualizować</translation> <translation id="2595239820337756193">Przelicz 5 km na mile</translation> <translation id="2596078834055697711">Zrób zrzut ekranu okna</translation> +<translation id="2607678425161541573">Wymagane jest zalogowanie w trybie online</translation> <translation id="2617342710774726426">Karta SIM jest zablokowana</translation> <translation id="2621713457727696555">Zabezpieczona</translation> <translation id="2653019840645008922">Przechwytywanie okna</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 30ba293..8156f2b 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Reiniciar para atualizar</translation> <translation id="2595239820337756193">5 km em milhas</translation> <translation id="2596078834055697711">Fazer captura de tela da janela</translation> +<translation id="2607678425161541573">É necessário fazer login on-line</translation> <translation id="2617342710774726426">O chip está bloqueado</translation> <translation id="2621713457727696555">Protegida</translation> <translation id="2653019840645008922">Captura de janela</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 6084e63e..70590ba 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Reiniciar para atualizar</translation> <translation id="2595239820337756193">5 km em milhas</translation> <translation id="2596078834055697711">Criar uma captura de ecrã da janela</translation> +<translation id="2607678425161541573">É necessário iniciar sessão online</translation> <translation id="2617342710774726426">O cartão SIM está bloqueado</translation> <translation id="2621713457727696555">Protegida</translation> <translation id="2653019840645008922">Captura da janela</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 5190025..0fda9b1e 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Repornește pentru a actualiza</translation> <translation id="2595239820337756193">5 km în mile</translation> <translation id="2596078834055697711">Realizează o captură de ecran a ferestrei</translation> +<translation id="2607678425161541573">Este necesară conectarea online</translation> <translation id="2617342710774726426">Cardul SIM este blocat</translation> <translation id="2621713457727696555">Securizată</translation> <translation id="2653019840645008922">Capturarea ferestrei</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 555d283..71ea6af 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Перезагрузить и обновить</translation> <translation id="2595239820337756193">5 миль в км</translation> <translation id="2596078834055697711">Сделать скриншот окна</translation> +<translation id="2607678425161541573">Войдите в аккаунт в режиме онлайн</translation> <translation id="2617342710774726426">SIM-карта заблокирована</translation> <translation id="2621713457727696555">Защищена</translation> <translation id="2653019840645008922">Съемка окна</translation> @@ -836,7 +837,7 @@ <translation id="7593891976182323525">Search или Shift</translation> <translation id="7600875258240007829">Показать все уведомления</translation> <translation id="7607002721634913082">Приостановлен</translation> -<translation id="7618774594543487847">Нейтральные</translation> +<translation id="7618774594543487847">Нейтральные цвета</translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" /> °F</translation> <translation id="7631906263969450674">Фломастер</translation> <translation id="7633755430369750696">Показать настройки Обмена с окружением</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 12df778..5e3cd67 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Reštartovaním vykonáte aktualizáciu</translation> <translation id="2595239820337756193">5 km v míľach</translation> <translation id="2596078834055697711">Vytvorenie snímky obrazovky okna</translation> +<translation id="2607678425161541573">Vyžaduje sa prihlásenie online</translation> <translation id="2617342710774726426">SIM karta je uzamknutá</translation> <translation id="2621713457727696555">Zabezpečená</translation> <translation id="2653019840645008922">Snímanie okna</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index f1767f5..da78b43a 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Znova zaženite za posodobitev</translation> <translation id="2595239820337756193">5 km v miljah</translation> <translation id="2596078834055697711">Ustvarjanje posnetka okna</translation> +<translation id="2607678425161541573">Obvezna je spletna prijava</translation> <translation id="2617342710774726426">Kartica SIM je zaklenjena</translation> <translation id="2621713457727696555">Varno</translation> <translation id="2653019840645008922">Zajem okna</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 678b97e2..a3b650fd 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Restartujte da biste ažurirali</translation> <translation id="2595239820337756193">5 km u miljama</translation> <translation id="2596078834055697711">Napravite snimak ekrana prozora</translation> +<translation id="2607678425161541573">Onlajn prijavljivanje je obavezno</translation> <translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2621713457727696555">Zaštićeno</translation> <translation id="2653019840645008922">Snimanje prozora</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index ba3e5361..1036ecc 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Рестартујте да бисте ажурирали</translation> <translation id="2595239820337756193">5 km у миљама</translation> <translation id="2596078834055697711">Направите снимак екрана прозора</translation> +<translation id="2607678425161541573">Онлајн пријављивање је обавезно</translation> <translation id="2617342710774726426">SIM картица је закључана</translation> <translation id="2621713457727696555">Заштићено</translation> <translation id="2653019840645008922">Снимање прозора</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 56d603e4..2e501a3 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Starta om för att uppdatera</translation> <translation id="2595239820337756193">5 km i miles</translation> <translation id="2596078834055697711">Ta en skärmbild av fönstret</translation> +<translation id="2607678425161541573">Onlineinloggning krävs</translation> <translation id="2617342710774726426">SIM-kortet är låst</translation> <translation id="2621713457727696555">Skyddat</translation> <translation id="2653019840645008922">Skärmbild/skärminspelning av fönster</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index f49bc61..a51c181 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Zima kisha uwashe ili usasishe</translation> <translation id="2595239820337756193">Kilomita tano kwa maili</translation> <translation id="2596078834055697711">Piga picha ya skrini ya dirisha</translation> +<translation id="2607678425161541573">Unahitaji kuingia katika akaunti mtandaoni</translation> <translation id="2617342710774726426">SIM kadi imefungwa</translation> <translation id="2621713457727696555">Unalindwa</translation> <translation id="2653019840645008922">Kupiga picha ya dirisha</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 84e442c..0094f861 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">รีสตาร์ทเพื่ออัปเดต</translation> <translation id="2595239820337756193">5 กม. เท่ากับกี่ไมล์</translation> <translation id="2596078834055697711">ถ่ายภาพหน้าจอของหน้าต่าง</translation> +<translation id="2607678425161541573">ต้องลงชื่อเข้าใช้ออนไลน์</translation> <translation id="2617342710774726426">ซิมการ์ดถูกล็อก</translation> <translation id="2621713457727696555">ปลอดภัย</translation> <translation id="2653019840645008922">การจับภาพหน้าต่าง</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 447cad6..c152627c 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Güncellemek için yeniden başlat</translation> <translation id="2595239820337756193">5 km kaç mildir</translation> <translation id="2596078834055697711">Pencerenin ekran görüntüsünü alır</translation> +<translation id="2607678425161541573">Online oturum açma gerekli</translation> <translation id="2617342710774726426">SIM kart kilitli</translation> <translation id="2621713457727696555">Güvenlik sağlandı</translation> <translation id="2653019840645008922">Pencere ekran görüntüsü alma</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index f3aaf827..3b972f3 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Перезапустіть, щоб оновити</translation> <translation id="2595239820337756193">Скільки миль у 5 км</translation> <translation id="2596078834055697711">Зробити знімок екрана вікна</translation> +<translation id="2607678425161541573">Необхідно ввійти в режимі онлайн</translation> <translation id="2617342710774726426">SIM-карту заблоковано</translation> <translation id="2621713457727696555">Захищено</translation> <translation id="2653019840645008922">Зйомка вікна</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 578008f..b0c7aae 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">重新啟動即可更新</translation> <translation id="2595239820337756193">5 公里等於幾多英里</translation> <translation id="2596078834055697711">擷取視窗螢幕畫面</translation> +<translation id="2607678425161541573">需要線上登入</translation> <translation id="2617342710774726426">SIM 卡已鎖定</translation> <translation id="2621713457727696555">已受保護</translation> <translation id="2653019840645008922">視窗擷取</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index fc8973ed3..f71d4727 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">重新啟動即可更新</translation> <translation id="2595239820337756193">5 公里等於多少英里</translation> <translation id="2596078834055697711">擷取視窗螢幕畫面</translation> +<translation id="2607678425161541573">需要線上登入</translation> <translation id="2617342710774726426">SIM 卡已鎖定</translation> <translation id="2621713457727696555">已受到安全保護</translation> <translation id="2653019840645008922">擷取視窗畫面</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 2245a56..73a06dc3 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -208,6 +208,7 @@ <translation id="2582112259361606227">Qala kabusha ukuze ubuyekeze</translation> <translation id="2595239820337756193">Amamayela angu-5K</translation> <translation id="2596078834055697711">Thatha isithombe-skrini sewindi</translation> +<translation id="2607678425161541573">Ukungena ngemvume ku-inthanethi kuyadingeka</translation> <translation id="2617342710774726426">I-SIM card ikhiyiwe</translation> <translation id="2621713457727696555">Kuvikelwe</translation> <translation id="2653019840645008922">Ukuthatha iwindi</translation>
diff --git a/base/enterprise_util_mac.mm b/base/enterprise_util_mac.mm index 24e067b..bbb851e1 100644 --- a/base/enterprise_util_mac.mm +++ b/base/enterprise_util_mac.mm
@@ -24,240 +24,253 @@ } MacDeviceManagementStateOld IsDeviceRegisteredWithManagementOld() { - @autoreleasepool { - std::vector<std::string> profiler_argv{"/usr/sbin/system_profiler", - "SPConfigurationProfileDataType", - "-detailLevel", - "mini", - "-timeout", - "15", - "-xml"}; + static MacDeviceManagementStateOld state = [] { + @autoreleasepool { + std::vector<std::string> profiler_argv{"/usr/sbin/system_profiler", + "SPConfigurationProfileDataType", + "-detailLevel", + "mini", + "-timeout", + "15", + "-xml"}; - std::string profiler_stdout; - if (!GetAppOutput(profiler_argv, &profiler_stdout)) { - LOG(WARNING) << "Could not get system_profiler output."; - return MacDeviceManagementStateOld::kFailureAPIUnavailable; - }; + std::string profiler_stdout; + if (!GetAppOutput(profiler_argv, &profiler_stdout)) { + LOG(WARNING) << "Could not get system_profiler output."; + return MacDeviceManagementStateOld::kFailureAPIUnavailable; + }; - NSArray* root = base::mac::ObjCCast<NSArray>([NSPropertyListSerialization - propertyListWithData:[SysUTF8ToNSString(profiler_stdout) - dataUsingEncoding:NSUTF8StringEncoding] - options:NSPropertyListImmutable - format:nil - error:nil]); - if (!root) { - LOG(WARNING) << "Could not parse system_profiler output."; - return MacDeviceManagementStateOld::kFailureUnableToParseResult; - }; + NSArray* root = base::mac::ObjCCast<NSArray>([NSPropertyListSerialization + propertyListWithData:[SysUTF8ToNSString(profiler_stdout) + dataUsingEncoding:NSUTF8StringEncoding] + options:NSPropertyListImmutable + format:nil + error:nil]); + if (!root) { + LOG(WARNING) << "Could not parse system_profiler output."; + return MacDeviceManagementStateOld::kFailureUnableToParseResult; + }; - for (NSDictionary* results in root) { - for (NSDictionary* dict in results[@"_items"]) { - for (NSDictionary* device_config_profiles in dict[@"_items"]) { - for (NSDictionary* profile_item in - device_config_profiles[@"_items"]) { - if (![profile_item[@"_name"] isEqual:@"com.apple.mdm"]) - continue; + for (NSDictionary* results in root) { + for (NSDictionary* dict in results[@"_items"]) { + for (NSDictionary* device_config_profiles in dict[@"_items"]) { + for (NSDictionary* profile_item in + device_config_profiles[@"_items"]) { + if (![profile_item[@"_name"] isEqual:@"com.apple.mdm"]) + continue; - NSString* payload_data = - profile_item[@"spconfigprofile_payload_data"]; - NSDictionary* payload_data_dict = base::mac::ObjCCast< - NSDictionary>([NSPropertyListSerialization - propertyListWithData:[payload_data - dataUsingEncoding:NSUTF8StringEncoding] - options:NSPropertyListImmutable - format:nil - error:nil]); + NSString* payload_data = + profile_item[@"spconfigprofile_payload_data"]; + NSDictionary* payload_data_dict = + base::mac::ObjCCast<NSDictionary>([NSPropertyListSerialization + propertyListWithData: + [payload_data dataUsingEncoding:NSUTF8StringEncoding] + options:NSPropertyListImmutable + format:nil + error:nil]); - if (!payload_data_dict) - continue; + if (!payload_data_dict) + continue; - // Verify that the URL validates. - if ([NSURL URLWithString:payload_data_dict[@"CheckInURL"]]) - return MacDeviceManagementStateOld::kMDMEnrollment; + // Verify that the URL validates. + if ([NSURL URLWithString:payload_data_dict[@"CheckInURL"]]) + return MacDeviceManagementStateOld::kMDMEnrollment; + } + } + } + } + + return MacDeviceManagementStateOld::kNoEnrollment; + } + }(); + + return state; +} + +MacDeviceManagementStateNew IsDeviceRegisteredWithManagementNew() { + static MacDeviceManagementStateNew state = [] { + if (@available(macOS 10.13.4, *)) { + std::vector<std::string> profiles_argv{"/usr/bin/profiles", "status", + "-type", "enrollment"}; + + std::string profiles_stdout; + if (!GetAppOutput(profiles_argv, &profiles_stdout)) { + LOG(WARNING) << "Could not get profiles output."; + return MacDeviceManagementStateNew::kFailureAPIUnavailable; + } + + // Sample output of `profiles` with full MDM enrollment: + // Enrolled via DEP: Yes + // MDM enrollment: Yes (User Approved) + // MDM server: https://applemdm.example.com/some/path?foo=bar + StringPairs property_states; + if (!SplitStringIntoKeyValuePairs(profiles_stdout, ':', '\n', + &property_states)) { + return MacDeviceManagementStateNew::kFailureUnableToParseResult; + } + + bool enrolled_via_dep = false; + bool mdm_enrollment_not_approved = false; + bool mdm_enrollment_user_approved = false; + + for (const auto& property_state : property_states) { + StringPiece property = + TrimString(property_state.first, kWhitespaceASCII, TRIM_ALL); + StringPiece state = + TrimString(property_state.second, kWhitespaceASCII, TRIM_ALL); + + if (property == "Enrolled via DEP") { + if (state == "Yes") + enrolled_via_dep = true; + else if (state != "No") + return MacDeviceManagementStateNew::kFailureUnableToParseResult; + } else if (property == "MDM enrollment") { + if (state == "Yes") + mdm_enrollment_not_approved = true; + else if (state == "Yes (User Approved)") + mdm_enrollment_user_approved = true; + else if (state != "No") + return MacDeviceManagementStateNew::kFailureUnableToParseResult; + } else { + // Ignore any other output lines, for future extensibility. + } + } + + if (!enrolled_via_dep && !mdm_enrollment_not_approved && + !mdm_enrollment_user_approved) { + return MacDeviceManagementStateNew::kNoEnrollment; + } + + if (!enrolled_via_dep && mdm_enrollment_not_approved && + !mdm_enrollment_user_approved) { + return MacDeviceManagementStateNew::kLimitedMDMEnrollment; + } + + if (!enrolled_via_dep && !mdm_enrollment_not_approved && + mdm_enrollment_user_approved) { + return MacDeviceManagementStateNew::kFullMDMEnrollment; + } + + if (enrolled_via_dep && !mdm_enrollment_not_approved && + mdm_enrollment_user_approved) { + return MacDeviceManagementStateNew::kDEPMDMEnrollment; + } + + return MacDeviceManagementStateNew::kFailureUnableToParseResult; + } else { + return MacDeviceManagementStateNew::kFailureAPIUnavailable; + } + }(); + + return state; +} + +DeviceUserDomainJoinState AreDeviceAndUserJoinedToDomain() { + static DeviceUserDomainJoinState state = [] { + DeviceUserDomainJoinState state{false, false}; + + @autoreleasepool { + ODSession* session = [ODSession defaultSession]; + if (session == nil) { + DLOG(WARNING) << "ODSession default session is nil."; + return state; + } + + NSError* error = nil; + + NSArray<NSString*>* all_node_names = + [session nodeNamesAndReturnError:&error]; + if (!all_node_names) { + DLOG(WARNING) << "ODSession failed to give node names: " + << error.localizedDescription.UTF8String; + return state; + } + + NSUInteger num_nodes = all_node_names.count; + if (num_nodes < 3) { + DLOG(WARNING) << "ODSession returned too few node names: " + << all_node_names.description.UTF8String; + return state; + } + + if (num_nodes > 3) { + // Non-enterprise machines have:"/Search", "/Search/Contacts", + // "/Local/Default". Everything else would be enterprise management. + state.device_joined = true; + } + + ODNode* node = [ODNode nodeWithSession:session + type:kODNodeTypeAuthentication + error:&error]; + if (node == nil) { + DLOG(WARNING) << "ODSession cannot obtain the authentication node: " + << error.localizedDescription.UTF8String; + return state; + } + + // Now check the currently logged on user. + ODQuery* query = [ODQuery queryWithNode:node + forRecordTypes:kODRecordTypeUsers + attribute:kODAttributeTypeRecordName + matchType:kODMatchEqualTo + queryValues:NSUserName() + returnAttributes:kODAttributeTypeAllAttributes + maximumResults:0 + error:&error]; + if (query == nil) { + DLOG(WARNING) << "ODSession cannot create user query: " + << mac::NSToCFCast(error); + return state; + } + + NSArray* results = [query resultsAllowingPartial:NO error:&error]; + if (!results) { + DLOG(WARNING) << "ODSession cannot obtain current user node: " + << error.localizedDescription.UTF8String; + return state; + } + + if (results.count != 1) { + DLOG(WARNING) << @"ODSession unexpected number of user nodes: " + << results.count; + } + + for (id element in results) { + ODRecord* record = mac::ObjCCastStrict<ODRecord>(element); + NSArray* attributes = + [record valuesForAttribute:kODAttributeTypeMetaRecordName + error:nil]; + for (id attribute in attributes) { + NSString* attribute_value = mac::ObjCCastStrict<NSString>(attribute); + // Example: "uid=johnsmith,ou=People,dc=chromium,dc=org + NSRange domain_controller = + [attribute_value rangeOfString:@"(^|,)\\s*dc=" + options:NSRegularExpressionSearch]; + if (domain_controller.length > 0) { + state.user_joined = true; + } + } + + // Scan alternative identities. + attributes = + [record valuesForAttribute:kODAttributeTypeAltSecurityIdentities + error:nil]; + for (id attribute in attributes) { + NSString* attribute_value = mac::ObjCCastStrict<NSString>(attribute); + NSRange icloud = + [attribute_value rangeOfString:@"CN=com.apple.idms.appleid.prd" + options:NSCaseInsensitiveSearch]; + if (!icloud.length) { + // Any alternative identity that is not iCloud is likely enterprise + // management. + state.user_joined = true; } } } } - return MacDeviceManagementStateOld::kNoEnrollment; - } -} - -MacDeviceManagementStateNew IsDeviceRegisteredWithManagementNew() { - if (@available(macOS 10.13.4, *)) { - std::vector<std::string> profiles_argv{"/usr/bin/profiles", "status", - "-type", "enrollment"}; - - std::string profiles_stdout; - if (!GetAppOutput(profiles_argv, &profiles_stdout)) { - LOG(WARNING) << "Could not get profiles output."; - return MacDeviceManagementStateNew::kFailureAPIUnavailable; - } - - // Sample output of `profiles` with full MDM enrollment: - // Enrolled via DEP: Yes - // MDM enrollment: Yes (User Approved) - // MDM server: https://applemdm.example.com/some/path?foo=bar - StringPairs property_states; - if (!SplitStringIntoKeyValuePairs(profiles_stdout, ':', '\n', - &property_states)) { - return MacDeviceManagementStateNew::kFailureUnableToParseResult; - } - - bool enrolled_via_dep = false; - bool mdm_enrollment_not_approved = false; - bool mdm_enrollment_user_approved = false; - - for (const auto& property_state : property_states) { - StringPiece property = - TrimString(property_state.first, kWhitespaceASCII, TRIM_ALL); - StringPiece state = - TrimString(property_state.second, kWhitespaceASCII, TRIM_ALL); - - if (property == "Enrolled via DEP") { - if (state == "Yes") - enrolled_via_dep = true; - else if (state != "No") - return MacDeviceManagementStateNew::kFailureUnableToParseResult; - } else if (property == "MDM enrollment") { - if (state == "Yes") - mdm_enrollment_not_approved = true; - else if (state == "Yes (User Approved)") - mdm_enrollment_user_approved = true; - else if (state != "No") - return MacDeviceManagementStateNew::kFailureUnableToParseResult; - } else { - // Ignore any other output lines, for future extensibility. - } - } - - if (!enrolled_via_dep && !mdm_enrollment_not_approved && - !mdm_enrollment_user_approved) { - return MacDeviceManagementStateNew::kNoEnrollment; - } - - if (!enrolled_via_dep && mdm_enrollment_not_approved && - !mdm_enrollment_user_approved) { - return MacDeviceManagementStateNew::kLimitedMDMEnrollment; - } - - if (!enrolled_via_dep && !mdm_enrollment_not_approved && - mdm_enrollment_user_approved) { - return MacDeviceManagementStateNew::kFullMDMEnrollment; - } - - if (enrolled_via_dep && !mdm_enrollment_not_approved && - mdm_enrollment_user_approved) { - return MacDeviceManagementStateNew::kDEPMDMEnrollment; - } - - return MacDeviceManagementStateNew::kFailureUnableToParseResult; - } else { - return MacDeviceManagementStateNew::kFailureAPIUnavailable; - } -} - -DeviceUserDomainJoinState AreDeviceAndUserJoinedToDomain() { - DeviceUserDomainJoinState state{false, false}; - - @autoreleasepool { - ODSession* session = [ODSession defaultSession]; - if (session == nil) { - DLOG(WARNING) << "ODSession default session is nil."; - return state; - } - - NSError* error = nil; - - NSArray<NSString*>* all_node_names = - [session nodeNamesAndReturnError:&error]; - if (!all_node_names) { - DLOG(WARNING) << "ODSession failed to give node names: " - << error.localizedDescription.UTF8String; - return state; - } - - NSUInteger num_nodes = all_node_names.count; - if (num_nodes < 3) { - DLOG(WARNING) << "ODSession returned too few node names: " - << all_node_names.description.UTF8String; - return state; - } - - if (num_nodes > 3) { - // Non-enterprise machines have:"/Search", "/Search/Contacts", - // "/Local/Default". Everything else would be enterprise management. - state.device_joined = true; - } - - ODNode* node = [ODNode nodeWithSession:session - type:kODNodeTypeAuthentication - error:&error]; - if (node == nil) { - DLOG(WARNING) << "ODSession cannot obtain the authentication node: " - << error.localizedDescription.UTF8String; - return state; - } - - // Now check the currently logged on user. - ODQuery* query = [ODQuery queryWithNode:node - forRecordTypes:kODRecordTypeUsers - attribute:kODAttributeTypeRecordName - matchType:kODMatchEqualTo - queryValues:NSUserName() - returnAttributes:kODAttributeTypeAllAttributes - maximumResults:0 - error:&error]; - if (query == nil) { - DLOG(WARNING) << "ODSession cannot create user query: " - << mac::NSToCFCast(error); - return state; - } - - NSArray* results = [query resultsAllowingPartial:NO error:&error]; - if (!results) { - DLOG(WARNING) << "ODSession cannot obtain current user node: " - << error.localizedDescription.UTF8String; - return state; - } - - if (results.count != 1) { - DLOG(WARNING) << @"ODSession unexpected number of user nodes: " - << results.count; - } - - for (id element in results) { - ODRecord* record = mac::ObjCCastStrict<ODRecord>(element); - NSArray* attributes = - [record valuesForAttribute:kODAttributeTypeMetaRecordName error:nil]; - for (id attribute in attributes) { - NSString* attribute_value = mac::ObjCCastStrict<NSString>(attribute); - // Example: "uid=johnsmith,ou=People,dc=chromium,dc=org - NSRange domain_controller = - [attribute_value rangeOfString:@"(^|,)\\s*dc=" - options:NSRegularExpressionSearch]; - if (domain_controller.length > 0) { - state.user_joined = true; - } - } - - // Scan alternative identities. - attributes = - [record valuesForAttribute:kODAttributeTypeAltSecurityIdentities - error:nil]; - for (id attribute in attributes) { - NSString* attribute_value = mac::ObjCCastStrict<NSString>(attribute); - NSRange icloud = - [attribute_value rangeOfString:@"CN=com.apple.idms.appleid.prd" - options:NSCaseInsensitiveSearch]; - if (!icloud.length) { - // Any alternative identity that is not iCloud is likely enterprise - // management. - state.user_joined = true; - } - } - } - } + return state; + }(); return state; }
diff --git a/base/threading/hang_watcher.cc b/base/threading/hang_watcher.cc index 7a9c955..1ec97ec 100644 --- a/base/threading/hang_watcher.cc +++ b/base/threading/hang_watcher.cc
@@ -193,6 +193,12 @@ return; } + // If the thread was unregistered since construction there is also nothing to + // do . + if (!current_hang_watch_state) { + return; + } + // If a hang is currently being captured we should block here so execution // stops and we avoid recording unrelated stack frames in the crash. if (current_hang_watch_state->IsFlagSet(
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py index 22097d0b..d38c2a6 100755 --- a/build/android/gradle/generate_gradle.py +++ b/build/android/gradle/generate_gradle.py
@@ -178,9 +178,6 @@ def NinjaTarget(self): return self._gn_target[2:] - def GnBuildConfigTarget(self): - return '%s__build_config_crbug_908819' % self._gn_target - def GradleSubdir(self): """Returns the output subdirectory.""" ninja_target = self.NinjaTarget()
diff --git a/build/android/gyp/extract_unwind_tables.py b/build/android/gyp/extract_unwind_tables.py index 31da4fc..65c2db44 100755 --- a/build/android/gyp/extract_unwind_tables.py +++ b/build/android/gyp/extract_unwind_tables.py
@@ -268,7 +268,7 @@ help='The path of the dump_syms binary') args = parser.parse_args() - cmd = ['./' + args.dump_syms_path, args.input_path] + cmd = ['./' + args.dump_syms_path, args.input_path, '-v'] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) cfi_data = _GetAllCfiRows(proc.stdout) if proc.wait():
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index 32e1200..3537798a 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni
@@ -69,7 +69,7 @@ # Chrome's clang. crbug.com/1033839 use_thin_lto = is_cfi || - (is_official_build && chrome_pgo_phase != 1 && + (is_official_build && (is_linux || is_win || (is_android && target_os != "chromeos") || ((is_chromeos_ash || is_chromeos_lacros) && is_chromeos_device)))
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index aa15b23..2d9a3c1 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -5.20210708.3.1 +5.20210709.1.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index b5505723..2d9a3c1 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -5.20210708.2.1 +5.20210709.1.1
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index f35b30d..107ea875 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -761,6 +761,7 @@ "java/src/org/chromium/chrome/browser/metrics/VariationsSession.java", "java/src/org/chromium/chrome/browser/metrics/WebApkSplashscreenMetrics.java", "java/src/org/chromium/chrome/browser/metrics/WebApkUma.java", + "java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java", "java/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenter.java", "java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java", "java/src/org/chromium/chrome/browser/modules/ModuleInstallUi.java",
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java index 8dd281c..0fd6619 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java
@@ -231,7 +231,7 @@ // Toolbar layout should be hidden if start surface toolbar is shown on the top of the // screen. onView(withId(R.id.toolbar)) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.INVISIBLE))); // The home button shouldn't show on homepage. onView(withId(R.id.home_button)) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)));
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 83bb70e..401cd02 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -85,7 +85,6 @@ "java/res/layout/tab_selection_editor_toolbar.xml", "java/res/layout/tab_strip_item.xml", "java/res/layout/tasks_view_layout.xml", - "java/res/values-night/dimens.xml", "java/res/values/colors.xml", "java/res/values/dimens.xml", "java/res/values/drawables.xml",
diff --git a/chrome/android/features/tab_ui/java/res/values-night/dimens.xml b/chrome/android/features/tab_ui/java/res/values-night/dimens.xml deleted file mode 100644 index 087a641..0000000 --- a/chrome/android/features/tab_ui/java/res/values-night/dimens.xml +++ /dev/null
@@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2021 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> -<resources> - <integer name="tab_thumbnail_placeholder_color_alpha">38</integer> - <integer name="tab_thumbnail_placeholder_selected_color_alpha">255</integer> -</resources>
diff --git a/chrome/android/features/tab_ui/java/res/values/colors.xml b/chrome/android/features/tab_ui/java/res/values/colors.xml index ea75dd99..423e7c1 100644 --- a/chrome/android/features/tab_ui/java/res/values/colors.xml +++ b/chrome/android/features/tab_ui/java/res/values/colors.xml
@@ -54,10 +54,4 @@ <color name="incognito_tab_title_color">@color/baseline_neutral_100</color> <color name="incognito_tab_title_selected_color">@color/baseline_primary_800</color> - - <color name="incognito_tab_thumbnail_placeholder_color">@color/baseline_neutral_variant_200_alpha_15</color> - <color name="incognito_tab_thumbnail_placeholder_selected_color">@color/baseline_primary_100</color> - - <color name="incognito_tab_tile_number_color">@color/baseline_neutral_100</color> - <color name="incognito_tab_tile_number_selected_color">@color/baseline_primary_900</color> </resources>
diff --git a/chrome/android/features/tab_ui/java/res/values/dimens.xml b/chrome/android/features/tab_ui/java/res/values/dimens.xml index 21713600..7e892a5 100644 --- a/chrome/android/features/tab_ui/java/res/values/dimens.xml +++ b/chrome/android/features/tab_ui/java/res/values/dimens.xml
@@ -49,7 +49,4 @@ <!-- Elevation --> <dimen name="tab_bg_elevation">@dimen/default_elevation_4</dimen> - - <integer name="tab_thumbnail_placeholder_color_alpha">255</integer> - <integer name="tab_thumbnail_placeholder_selected_color_alpha">97</integer> </resources>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java index a32b2d80..83d65f9 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
@@ -50,11 +50,8 @@ private final int mThumbnailHeight; private final Paint mEmptyThumbnailPaint; private final Paint mThumbnailFramePaint; - private final Paint mThumbnailBasePaint; private final Paint mTextPaint; private final Paint mFaviconBackgroundPaint; - private final Paint mSelectedEmptyThumbnailPaint; - private final Paint mSelectedTextPaint; private final int mFaviconBackgroundPaintColor; private final List<Rect> mFaviconRects = new ArrayList<>(4); private final List<RectF> mThumbnailRects = new ArrayList<>(4); @@ -67,7 +64,6 @@ private final Callback<Bitmap> mFinalCallback; private final boolean mForceUpdate; private final boolean mWriteToCache; - private final boolean mIsTabSelected; private final List<PseudoTab> mTabs = new ArrayList<>(4); private final AtomicInteger mThumbnailsToFetch = new AtomicInteger(); @@ -76,17 +72,14 @@ private String mText; /** - * Fetcher that get the thumbnail drawable depending on if the tab is selected. * @see TabContentManager#getTabThumbnailWithCallback - * @param isTabSelected Whether the thumbnail is for a currently selected tab. */ MultiThumbnailFetcher(PseudoTab initialTab, Callback<Bitmap> finalCallback, - boolean forceUpdate, boolean writeToCache, boolean isTabSelected) { + boolean forceUpdate, boolean writeToCache) { mFinalCallback = finalCallback; mInitialTab = initialTab; mForceUpdate = forceUpdate; mWriteToCache = writeToCache; - mIsTabSelected = isTabSelected; } private void initializeAndStartFetching(PseudoTab tab) { @@ -149,38 +142,35 @@ drawThumbnailBitmapOnCanvasWithFrame(null, i); if (mText != null && i == 3) { // Draw the text exactly centered on the thumbnail rect. - Paint textPaint = mIsTabSelected ? mSelectedTextPaint : mTextPaint; mCanvas.drawText(mText, (mThumbnailRects.get(i).left + mThumbnailRects.get(i).right) / 2, (mThumbnailRects.get(i).top + mThumbnailRects.get(i).bottom) / 2 - ((mTextPaint.descent() + mTextPaint.ascent()) / 2), - textPaint); + mTextPaint); } } } } private void drawThumbnailBitmapOnCanvasWithFrame(Bitmap thumbnail, int index) { - if (thumbnail == null) { - Paint emptyThumbnailPaint = - mIsTabSelected ? mSelectedEmptyThumbnailPaint : mEmptyThumbnailPaint; - mCanvas.drawRoundRect( - mThumbnailRects.get(index), mRadius, mRadius, emptyThumbnailPaint); - return; - } - + // Draw the rounded rect. If Bitmap is not null, this is used for XferMode. mCanvas.drawRoundRect( - mThumbnailRects.get(index), mRadius, mRadius, mThumbnailBasePaint); + mThumbnailRects.get(index), mRadius, mRadius, mEmptyThumbnailPaint); + + if (thumbnail == null) return; thumbnail = Bitmap.createScaledBitmap(thumbnail, (int) mThumbnailRects.get(index).width(), (int) mThumbnailRects.get(index).height(), true); - mThumbnailBasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + + mEmptyThumbnailPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); mCanvas.drawBitmap(thumbnail, new Rect(0, 0, thumbnail.getWidth(), thumbnail.getHeight()), - mThumbnailRects.get(index), mThumbnailBasePaint); + mThumbnailRects.get(index), mEmptyThumbnailPaint); thumbnail.recycle(); + mEmptyThumbnailPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); + mCanvas.drawRoundRect( mThumbnailRects.get(index), mRadius, mRadius, mThumbnailFramePaint); } @@ -227,18 +217,9 @@ // Initialize Paints to use. mEmptyThumbnailPaint = new Paint(); mEmptyThumbnailPaint.setStyle(Paint.Style.FILL); + mEmptyThumbnailPaint.setColor(ApiCompatibilityUtils.getColor( + resource, R.color.tab_list_mini_card_default_background_color)); mEmptyThumbnailPaint.setAntiAlias(true); - mEmptyThumbnailPaint.setColor( - TabUiColorProvider.getMiniThumbnailPlaceHolderColor(context, false, false)); - - mSelectedEmptyThumbnailPaint = new Paint(mEmptyThumbnailPaint); - mSelectedEmptyThumbnailPaint.setColor( - TabUiColorProvider.getMiniThumbnailPlaceHolderColor(context, false, true)); - - // Paint used to set base for thumbnails, in case mEmptyThumbnailPaint has transparency. - mThumbnailBasePaint = new Paint(mEmptyThumbnailPaint); - mThumbnailBasePaint.setColor(Color.BLACK); - mThumbnailBasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); mThumbnailFramePaint = new Paint(); mThumbnailFramePaint.setStyle(Paint.Style.STROKE); @@ -255,11 +236,7 @@ mTextPaint.setFakeBoldText(true); mTextPaint.setAntiAlias(true); mTextPaint.setTextAlign(Paint.Align.CENTER); - mTextPaint.setColor(TabUiColorProvider.getTabGroupNumberTextColor(context, false, false)); - - mSelectedTextPaint = new Paint(mTextPaint); - mSelectedTextPaint.setColor( - TabUiColorProvider.getTabGroupNumberTextColor(context, false, true)); + mTextPaint.setColor(ApiCompatibilityUtils.getColor(resource, R.color.default_text_color)); mFaviconBackgroundPaintColor = ApiCompatibilityUtils.getColor(resource, R.color.favicon_background_color); @@ -320,20 +297,14 @@ @Override public void onTabModelSelected(TabModel newModel, TabModel oldModel) { boolean isIncognito = newModel.isIncognito(); - mEmptyThumbnailPaint.setColor(TabUiColorProvider.getMiniThumbnailPlaceHolderColor( - context, isIncognito, false)); - mTextPaint.setColor( - TabUiColorProvider.getTabGroupNumberTextColor(context, isIncognito, false)); + mEmptyThumbnailPaint.setColor( + TabUiColorProvider.getMiniThumbnailPlaceHolderColor(context, isIncognito)); mThumbnailFramePaint.setColor( TabUiColorProvider.getMiniThumbnailFrameColor(context, isIncognito)); + mTextPaint.setColor( + TabUiColorProvider.getTabGroupNumberTextColor(context, isIncognito)); mFaviconBackgroundPaint.setColor( TabUiColorProvider.getFaviconBackgroundColor(context, isIncognito)); - - mSelectedEmptyThumbnailPaint.setColor( - TabUiColorProvider.getMiniThumbnailPlaceHolderColor( - context, isIncognito, true)); - mSelectedTextPaint.setColor( - TabUiColorProvider.getTabGroupNumberTextColor(context, isIncognito, true)); } }; mTabModelSelector.addObserver(mTabModelSelectorObserver); @@ -362,8 +333,7 @@ tabId, finalCallback, forceUpdate, writeToCache); return; } - boolean isSelected = tabId == mTabModelSelector.getCurrentTabId(); - new MultiThumbnailFetcher(tab, finalCallback, forceUpdate, writeToCache, isSelected) - .fetch(); + + new MultiThumbnailFetcher(tab, finalCallback, forceUpdate, writeToCache).fetch(); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java index 9a9348a..e603e59 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -6,7 +6,6 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.CARD_ALPHA; -import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; @@ -114,7 +113,6 @@ if (CachedFeatureFlags.isEnabled(ChromeFeatureList.THEME_REFACTOR_ANDROID)) { updateColor(view, model.get(TabProperties.IS_INCOGNITO), model.get(TabProperties.IS_SELECTED)); - updateThumbnail(view, model); } else { int selectedTabBackground = model.get(TabProperties.SELECTED_TAB_BACKGROUND_DRAWABLE_ID); @@ -417,11 +415,6 @@ if (thumbnail.getDrawable() == null) { thumbnail.setImageResource( TabUiColorProvider.getThumbnailPlaceHolderColorResource(isIncognito)); - if (CachedFeatureFlags.isEnabled(ChromeFeatureList.THEME_REFACTOR_ANDROID)) { - thumbnail.setImageTintList( - ColorStateList.valueOf(TabUiColorProvider.getMiniThumbnailPlaceHolderColor( - backgroundView.getContext(), isIncognito, isSelected))); - } } if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(rootView.getContext())) {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java index 62d9f03..8828958 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java
@@ -77,27 +77,13 @@ * * @param context {@link Context} used to retrieve color. * @param isIncognito Whether the color is used for incognito mode. - * @param isSelected Whether the tab is currently selected. * @return The text color for the number used on the tab group cards. */ @ColorInt - public static int getTabGroupNumberTextColor( - Context context, boolean isIncognito, boolean isSelected) { - if (!themeRefactorEnabled()) { - return ApiCompatibilityUtils.getColor(context.getResources(), - isIncognito ? R.color.tab_group_number_text_color_incognito - : R.color.tab_group_number_text_color); - } - if (isIncognito) { - @ColorRes - int colorRes = isSelected ? R.color.incognito_tab_tile_number_selected_color - : R.color.incognito_tab_tile_number_color; - return ApiCompatibilityUtils.getColor(context.getResources(), colorRes); - } else { - return isSelected - ? MaterialColors.getColor(context, R.attr.colorOnPrimaryContainer, TAG) - : MaterialColors.getColor(context, R.attr.colorOnSurface, TAG); - } + public static int getTabGroupNumberTextColor(Context context, boolean isIncognito) { + return ApiCompatibilityUtils.getColor(context.getResources(), + isIncognito ? R.color.tab_group_number_text_color_incognito + : R.color.tab_group_number_text_color); } /** @@ -202,34 +188,13 @@ * * @param context {@link Context} used to retrieve color. * @param isIncognito Whether the color is used for incognito mode. - * @param isSelected Whether the tab is currently selected. * @return The mini-thumbnail placeholder color. */ @ColorInt - public static int getMiniThumbnailPlaceHolderColor( - Context context, boolean isIncognito, boolean isSelected) { - if (!themeRefactorEnabled()) { - return ApiCompatibilityUtils.getColor(context.getResources(), - isIncognito ? R.color.tab_list_mini_card_default_background_color_incognito - : R.color.tab_list_mini_card_default_background_color); - } - - if (isIncognito) { - @ColorRes - int colorRes = isSelected ? R.color.incognito_tab_thumbnail_placeholder_selected_color - : R.color.incognito_tab_thumbnail_placeholder_color; - return ApiCompatibilityUtils.getColor(context.getResources(), colorRes); - } else { - int alpha = context.getResources().getInteger(isSelected - ? R.integer.tab_thumbnail_placeholder_selected_color_alpha - : R.integer.tab_thumbnail_placeholder_color_alpha); - @ColorInt - int baseColor = isSelected - ? MaterialColors.getColor(context, R.attr.colorPrimaryContainer, TAG) - // TODO (crrev.com/c/2994242): Change light mode to Surface1. - : MaterialColors.getColor(context, R.attr.colorOnSurfaceVariant, TAG); - return MaterialColors.compositeARGBWithAlpha(baseColor, alpha); - } + public static int getMiniThumbnailPlaceHolderColor(Context context, boolean isIncognito) { + return ApiCompatibilityUtils.getColor(context.getResources(), + isIncognito ? R.color.tab_list_mini_card_default_background_color_incognito + : R.color.tab_list_mini_card_default_background_color); } /**
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java index 336ba74..33ce9f9 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java
@@ -798,8 +798,11 @@ return new NtpListContentManager.NativeViewContent( sliceId, org.chromium.chrome.R.layout.no_connection); } + // TODO(crbug/1152592): Add new UI for NO_WEB_FEED_SUBSCRIPTIONS. assert slice.getZeroStateSlice().getType() - == FeedUiProto.ZeroStateSlice.Type.NO_CARDS_AVAILABLE; + == FeedUiProto.ZeroStateSlice.Type.NO_CARDS_AVAILABLE + || slice.getZeroStateSlice().getType() + == FeedUiProto.ZeroStateSlice.Type.NO_WEB_FEED_SUBSCRIPTIONS; return new NtpListContentManager.NativeViewContent( sliceId, org.chromium.chrome.R.layout.no_content_v2); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClientAppBroadcastReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClientAppBroadcastReceiver.java index 0bec068..dd882a1dc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClientAppBroadcastReceiver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClientAppBroadcastReceiver.java
@@ -12,7 +12,7 @@ import org.chromium.chrome.browser.ChromeApplicationImpl; import org.chromium.chrome.browser.browserservices.metrics.BrowserServicesTimingMetrics; import org.chromium.chrome.browser.browserservices.permissiondelegation.PermissionUpdater; -import org.chromium.chrome.browser.metrics.WebApkUma; +import org.chromium.chrome.browser.metrics.WebApkUninstallUmaTracker; import org.chromium.chrome.browser.version.ChromeVersionInfo; import org.chromium.components.embedder_support.util.Origin; import org.chromium.components.webapk.lib.common.WebApkConstants; @@ -111,7 +111,7 @@ && packageName.startsWith(WebApkConstants.WEBAPK_PACKAGE_PREFIX)) { // Native is likely not loaded. Defer recording UMA and UKM till the next browser // launch. - WebApkUma.deferRecordWebApkUninstalled(packageName); + WebApkUninstallUmaTracker.deferRecordWebApkUninstalled(packageName); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index dcc9e03..ce9b878a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -59,7 +59,7 @@ import org.chromium.chrome.browser.media.MediaViewerUtils; import org.chromium.chrome.browser.metrics.LaunchMetrics; import org.chromium.chrome.browser.metrics.PackageMetrics; -import org.chromium.chrome.browser.metrics.WebApkUma; +import org.chromium.chrome.browser.metrics.WebApkUninstallUmaTracker; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.notifications.channels.ChannelsUpdater; import org.chromium.chrome.browser.offlinepages.measurements.OfflineMeasurementsBackgroundTask; @@ -399,7 +399,7 @@ deferredStartupHandler.addDeferredTask( ChromeApplicationImpl.getComponent() .resolveTwaClearDataDialogRecorder()::makeDeferredRecordings); - deferredStartupHandler.addDeferredTask(WebApkUma::recordDeferredUma); + deferredStartupHandler.addDeferredTask(WebApkUninstallUmaTracker::recordDeferredUma); deferredStartupHandler.addDeferredTask( () -> IncognitoTabLauncher.updateComponentEnabledState());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkSplashscreenMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkSplashscreenMetrics.java index b771da0..9fbad86 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkSplashscreenMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkSplashscreenMetrics.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.metrics; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.browserservices.ui.splashscreen.SplashscreenObserver; /** @@ -32,11 +33,13 @@ // commit both shown/hidden histograms here because native may not be loaded when the // splashscreen is shown. - WebApkUma.recordShellApkLaunchToSplashVisible(startTimestamp - mShellApkLaunchTimestamp); - WebApkUma.recordShellApkLaunchToSplashHidden(endTimestamp - mShellApkLaunchTimestamp); + WebApkUmaRecorder.recordShellApkLaunchToSplashVisible( + startTimestamp - mShellApkLaunchTimestamp); + WebApkUmaRecorder.recordShellApkLaunchToSplashHidden( + endTimestamp - mShellApkLaunchTimestamp); if (mNewStyleSplashShownTimestamp != -1) { - WebApkUma.recordNewStyleShellApkLaunchToSplashVisible( + WebApkUmaRecorder.recordNewStyleShellApkLaunchToSplashVisible( mNewStyleSplashShownTimestamp - mShellApkLaunchTimestamp); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java index 224a7b0f..d3168f47 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java
@@ -14,47 +14,21 @@ import org.chromium.base.ContextUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.AsyncTask; -import org.chromium.chrome.browser.browserservices.intents.WebappIntentUtils; -import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; -import org.chromium.chrome.browser.preferences.SharedPreferencesManager; -import org.chromium.chrome.browser.webapps.WebApkUkmRecorder; -import org.chromium.chrome.browser.webapps.WebappDataStorage; -import org.chromium.chrome.browser.webapps.WebappRegistry; import org.chromium.components.browser_ui.util.ConversionUtils; -import org.chromium.components.webapps.WebApkDistributor; import java.io.File; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.HashSet; -import java.util.Set; /** * Centralizes UMA data collection for WebAPKs. NOTE: Histogram names and values are defined in * tools/metrics/histograms/histograms.xml. Please update that file if any change is made. + * TODO(crbug.com/1219648): Temporarily keep this around to avoid breaking down stream. This + * class should be removed once down stream is updated. */ public class WebApkUma { - // This enum is used to back UMA histograms, and should therefore be treated as append-only. - @IntDef({UpdateRequestSent.WHILE_WEBAPK_CLOSED}) - @Retention(RetentionPolicy.SOURCE) - public @interface UpdateRequestSent { - // Deprecated: FIRST_TRY = 0; - // Deprecated: ONSTOP = 1; - // Deprecated: WHILE_WEBAPK_IN_FOREGROUND = 2; - int WHILE_WEBAPK_CLOSED = 3; - int NUM_ENTRIES = 4; - } - - // This enum is used to back UMA histograms, and should therefore be treated as append-only. - // The queued request times shouldn't exceed three. - @IntDef({UpdateRequestQueued.ONCE, UpdateRequestQueued.TWICE, UpdateRequestQueued.THREE_TIMES}) - @Retention(RetentionPolicy.SOURCE) - public @interface UpdateRequestQueued { - int ONCE = 0; - int TWICE = 1; - int THREE_TIMES = 2; - int NUM_ENTRIES = 3; - } + private static final long WEBAPK_EXTRA_INSTALLATION_SPACE_BYTES = + 100 * (long) ConversionUtils.BYTES_PER_MEGABYTE; // 100 MB // This enum is used to back UMA histograms, and should therefore be treated as append-only. @IntDef({GooglePlayInstallResult.SUCCESS, GooglePlayInstallResult.FAILED_NO_DELEGATE, @@ -95,122 +69,6 @@ int NUM_ENTRIES = 16; } - public static final String HISTOGRAM_UPDATE_REQUEST_SENT = "WebApk.Update.RequestSent"; - - public static final String HISTOGRAM_UPDATE_REQUEST_QUEUED = "WebApk.Update.RequestQueued"; - - private static final String HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_VISIBLE = - "WebApk.Startup.Cold.ShellLaunchToSplashscreenVisible"; - private static final String HISTOGRAM_NEW_STYLE_LAUNCH_TO_SPLASHSCREEN_VISIBLE = - "WebApk.Startup.Cold.NewStyle.ShellLaunchToSplashscreenVisible"; - private static final String HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_HIDDEN = - "WebApk.Startup.Cold.ShellLaunchToSplashscreenHidden"; - - private static final int WEBAPK_OPEN_MAX = 3; - public static final int WEBAPK_OPEN_LAUNCH_SUCCESS = 0; - // Obsolete: WEBAPK_OPEN_NO_LAUNCH_INTENT = 1; - public static final int WEBAPK_OPEN_ACTIVITY_NOT_FOUND = 2; - - private static final long WEBAPK_EXTRA_INSTALLATION_SPACE_BYTES = - 100 * (long) ConversionUtils.BYTES_PER_MEGABYTE; // 100 MB - - /** Makes recordings that were deferred in order to not load native. */ - public static void recordDeferredUma() { - SharedPreferencesManager preferencesManager = SharedPreferencesManager.getInstance(); - Set<String> uninstalledPackages = - preferencesManager.readStringSet(ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES); - if (uninstalledPackages.isEmpty()) return; - - long fallbackUninstallTimestamp = System.currentTimeMillis(); - WebappRegistry.warmUpSharedPrefs(); - for (String uninstalledPackage : uninstalledPackages) { - RecordHistogram.recordBooleanHistogram("WebApk.Uninstall.Browser", true); - - String webApkId = WebappIntentUtils.getIdForWebApkPackage(uninstalledPackage); - WebappDataStorage webappDataStorage = - WebappRegistry.getInstance().getWebappDataStorage(webApkId); - if (webappDataStorage != null) { - long uninstallTimestamp = webappDataStorage.getWebApkUninstallTimestamp(); - if (uninstallTimestamp == 0) { - uninstallTimestamp = fallbackUninstallTimestamp; - } - WebApkUkmRecorder.recordWebApkUninstall(webappDataStorage.getWebApkManifestUrl(), - WebApkDistributor.BROWSER, webappDataStorage.getWebApkVersionCode(), - webappDataStorage.getLaunchCount(), - uninstallTimestamp - webappDataStorage.getWebApkInstallTimestamp()); - } - } - preferencesManager.writeStringSet( - ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES, new HashSet<String>()); - - // TODO(http://crbug.com/1000312): Clear WebappDataStorage for uninstalled WebAPK. - } - - /** Sets WebAPK uninstall to be recorded next time that native is loaded. */ - public static void deferRecordWebApkUninstalled(String packageName) { - SharedPreferencesManager.getInstance().addToStringSet( - ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES, packageName); - String webApkId = WebappIntentUtils.getIdForWebApkPackage(packageName); - WebappRegistry.warmUpSharedPrefsForId(webApkId); - WebappDataStorage webappDataStorage = - WebappRegistry.getInstance().getWebappDataStorage(webApkId); - if (webappDataStorage != null) { - webappDataStorage.setWebApkUninstallTimestamp(); - } - } - - /** - * Records the time point when a request to update a WebAPK is sent to the WebAPK Server. - * @param type representing when the update request is sent to the WebAPK server. - */ - public static void recordUpdateRequestSent(@UpdateRequestSent int type) { - RecordHistogram.recordEnumeratedHistogram( - HISTOGRAM_UPDATE_REQUEST_SENT, type, UpdateRequestSent.NUM_ENTRIES); - } - - /** - * Records the times that an update request has been queued once, twice and three times before - * sending to WebAPK server. - * @param times representing the times that an update has been queued. - */ - public static void recordUpdateRequestQueued(@UpdateRequestQueued int times) { - RecordHistogram.recordEnumeratedHistogram( - HISTOGRAM_UPDATE_REQUEST_QUEUED, times, UpdateRequestQueued.NUM_ENTRIES); - } - - /** - * Records duration between starting the WebAPK shell until the splashscreen is shown. - * @param durationMs duration in milliseconds - */ - public static void recordShellApkLaunchToSplashVisible(long durationMs) { - RecordHistogram.recordMediumTimesHistogram( - HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_VISIBLE, durationMs); - } - - /** - * Records duration between starting the WebAPK shell until the shell displays the - * splashscreen for new-style WebAPKs. - */ - public static void recordNewStyleShellApkLaunchToSplashVisible(long durationMs) { - RecordHistogram.recordMediumTimesHistogram( - HISTOGRAM_NEW_STYLE_LAUNCH_TO_SPLASHSCREEN_VISIBLE, durationMs); - } - - /** - * Records duration between starting of the WebAPK shell until the splashscreen is hidden. - * @param durationMs duration in milliseconds - */ - public static void recordShellApkLaunchToSplashHidden(long durationMs) { - RecordHistogram.recordMediumTimesHistogram( - HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_HIDDEN, durationMs); - } - - /** Records whether a WebAPK has permission to display notifications. */ - public static void recordNotificationPermissionStatus(boolean permissionEnabled) { - RecordHistogram.recordBooleanHistogram( - "WebApk.Notification.Permission.Status", permissionEnabled); - } - /** * Records whether installing a WebAPK from Google Play succeeded. If not, records the reason * that the install failed. @@ -237,62 +95,6 @@ GooglePlayInstallResult.NUM_ENTRIES); } - /** Records the duration of a WebAPK session (from launch/foreground to background). */ - public static void recordWebApkSessionDuration( - @WebApkDistributor int distributor, long duration) { - RecordHistogram.recordLongTimesHistogram( - "WebApk.Session.TotalDuration2." + getWebApkDistributorUmaSuffix(distributor), - duration); - } - - /** Records the current Shell APK version. */ - public static void recordShellApkVersion( - int shellApkVersion, @WebApkDistributor int distributor) { - RecordHistogram.recordSparseHistogram( - "WebApk.ShellApkVersion2." + getWebApkDistributorUmaSuffix(distributor), - shellApkVersion); - } - - private static String getWebApkDistributorUmaSuffix(@WebApkDistributor int distributor) { - switch (distributor) { - case WebApkDistributor.BROWSER: - return "Browser"; - case WebApkDistributor.DEVICE_POLICY: - return "DevicePolicy"; - default: - return "Other"; - } - } - - /** Records to UMA the count of old "WebAPK update request" files. */ - public static void recordNumberOfStaleWebApkUpdateRequestFiles(int count) { - RecordHistogram.recordCountHistogram("WebApk.Update.NumStaleUpdateRequestFiles", count); - } - - /** Records whether Chrome could bind to the WebAPK service. */ - public static void recordBindToWebApkServiceSucceeded(boolean bindSucceeded) { - RecordHistogram.recordBooleanHistogram("WebApk.WebApkService.BindSuccess", bindSucceeded); - } - - /** Records the network error code caught when a WebAPK is launched. */ - public static void recordNetworkErrorWhenLaunch(int errorCode) { - RecordHistogram.recordSparseHistogram("WebApk.Launch.NetworkError", -errorCode); - } - - /** - * Records whether a WebAPK navigation is within the WebAPK's scope. - * @param isChildTab Whether {@link Tab#getParentId()} is non-empty. - * @param isNavigationInScope - */ - public static void recordNavigation(boolean isNavigationInScope) { - RecordHistogram.recordBooleanHistogram("WebApk.Navigation.InScope", isNavigationInScope); - } - - /** Records number of unique origins for WebAPKs in WebappRegistry */ - public static void recordWebApksCount(int count) { - RecordHistogram.recordCount100Histogram("WebApk.WebappRegistry.NumberOfOrigins", count); - } - /** * Log necessary disk usage and cache size UMAs when WebAPK installation fails. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java new file mode 100644 index 0000000..5b6f8c46 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java
@@ -0,0 +1,69 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.metrics; + +import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.browser.browserservices.intents.WebappIntentUtils; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.browser.webapps.WebApkUkmRecorder; +import org.chromium.chrome.browser.webapps.WebappDataStorage; +import org.chromium.chrome.browser.webapps.WebappRegistry; +import org.chromium.components.webapps.WebApkDistributor; + +import java.util.HashSet; +import java.util.Set; + +/** + * Record WebAPKs uninstall UMA. + */ +public class WebApkUninstallUmaTracker { + /** Makes recordings that were deferred in order to not load native. */ + public static void recordDeferredUma() { + SharedPreferencesManager preferencesManager = SharedPreferencesManager.getInstance(); + Set<String> uninstalledPackages = + preferencesManager.readStringSet(ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES); + if (uninstalledPackages.isEmpty()) return; + + long fallbackUninstallTimestamp = System.currentTimeMillis(); + WebappRegistry.warmUpSharedPrefs(); + for (String uninstalledPackage : uninstalledPackages) { + RecordHistogram.recordBooleanHistogram("WebApk.Uninstall.Browser", true); + + String webApkId = WebappIntentUtils.getIdForWebApkPackage(uninstalledPackage); + WebappDataStorage webappDataStorage = + WebappRegistry.getInstance().getWebappDataStorage(webApkId); + if (webappDataStorage != null) { + long uninstallTimestamp = webappDataStorage.getWebApkUninstallTimestamp(); + if (uninstallTimestamp == 0) { + uninstallTimestamp = fallbackUninstallTimestamp; + } + WebApkUkmRecorder.recordWebApkUninstall(webappDataStorage.getWebApkManifestUrl(), + WebApkDistributor.BROWSER, webappDataStorage.getWebApkVersionCode(), + webappDataStorage.getLaunchCount(), + uninstallTimestamp - webappDataStorage.getWebApkInstallTimestamp()); + } + } + preferencesManager.writeStringSet( + ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES, new HashSet<String>()); + + // TODO(http://crbug.com/1000312): Clear WebappDataStorage for uninstalled WebAPK. + } + + /** Sets WebAPK uninstall to be recorded next time that native is loaded. */ + public static void deferRecordWebApkUninstalled(String packageName) { + SharedPreferencesManager.getInstance().addToStringSet( + ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES, packageName); + String webApkId = WebappIntentUtils.getIdForWebApkPackage(packageName); + WebappRegistry.warmUpSharedPrefsForId(webApkId); + WebappDataStorage webappDataStorage = + WebappRegistry.getInstance().getWebappDataStorage(webApkId); + if (webappDataStorage != null) { + webappDataStorage.setWebApkUninstallTimestamp(); + } + } + + private WebApkUninstallUmaTracker() {} +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java index ab77e79a..432191f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java
@@ -21,6 +21,7 @@ import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.intents.WebApkExtras; import org.chromium.chrome.browser.browserservices.intents.WebappIntentUtils; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.browserservices.ui.splashscreen.SplashController; import org.chromium.chrome.browser.dependency_injection.ActivityScope; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; @@ -28,7 +29,6 @@ import org.chromium.chrome.browser.lifecycle.PauseResumeWithNativeObserver; import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker; import org.chromium.chrome.browser.metrics.WebApkSplashscreenMetrics; -import org.chromium.chrome.browser.metrics.WebApkUma; import javax.inject.Inject; import javax.inject.Named; @@ -75,7 +75,8 @@ if (lifecycleDispatcher.isActivityFinishingOrDestroyed()) return; WebApkExtras webApkExtras = mIntentDataProvider.getWebApkExtras(); - WebApkUma.recordShellApkVersion(webApkExtras.shellApkVersion, webApkExtras.distributor); + WebApkUmaRecorder.recordShellApkVersion( + webApkExtras.shellApkVersion, webApkExtras.distributor); }); } @@ -114,7 +115,7 @@ public void onPauseWithNative() { WebApkExtras webApkExtras = mIntentDataProvider.getWebApkExtras(); long sessionDuration = SystemClock.elapsedRealtime() - mStartTime; - WebApkUma.recordWebApkSessionDuration(webApkExtras.distributor, sessionDuration); + WebApkUmaRecorder.recordWebApkSessionDuration(webApkExtras.distributor, sessionDuration); WebApkUkmRecorder.recordWebApkSessionDuration(webApkExtras.manifestUrl, webApkExtras.distributor, webApkExtras.webApkVersionCode, sessionDuration); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java index 478cb88..712fc07 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
@@ -16,7 +16,7 @@ import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.intents.WebappIntentUtils; -import org.chromium.chrome.browser.metrics.WebApkUma; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; /** * Java counterpart to webapk_installer.h @@ -72,8 +72,8 @@ if (mInstallDelegate == null) { notify(WebApkInstallResult.FAILURE); - WebApkUma.recordGooglePlayInstallResult( - WebApkUma.GooglePlayInstallResult.FAILED_NO_DELEGATE); + WebApkUmaRecorder.recordGooglePlayInstallResult( + WebApkUmaRecorder.GooglePlayInstallResult.FAILED_NO_DELEGATE); return; } @@ -142,11 +142,12 @@ new AsyncTask<Integer>() { @Override protected Integer doInBackground() { - long availableSpaceInBytes = WebApkUma.getAvailableSpaceAboveLowSpaceLimit(); + long availableSpaceInBytes = + WebApkUmaRecorder.getAvailableSpaceAboveLowSpaceLimit(); if (availableSpaceInBytes > 0) return SpaceStatus.ENOUGH_SPACE; - long cacheSizeInBytes = WebApkUma.getCacheDirSize(); + long cacheSizeInBytes = WebApkUmaRecorder.getCacheDirSize(); if (cacheSizeInBytes + availableSpaceInBytes > 0) { return SpaceStatus.ENOUGH_SPACE_AFTER_FREE_UP_CACHE; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java index 829ca1c41..1af747ab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java
@@ -20,7 +20,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.chrome.browser.browserservices.intents.WebApkExtras; -import org.chromium.chrome.browser.metrics.WebApkUma; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.notifications.NotificationBuilderBase; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions; @@ -42,13 +42,13 @@ @Override public void onConnected(IBinder api) { if (api == null) { - WebApkUma.recordBindToWebApkServiceSucceeded(false); + WebApkUmaRecorder.recordBindToWebApkServiceSucceeded(false); return; } try { useApi(IWebApkApi.Stub.asInterface(api)); - WebApkUma.recordBindToWebApkServiceSucceeded(true); + WebApkUmaRecorder.recordBindToWebApkServiceSucceeded(true); } catch (RemoteException e) { Log.w(TAG, "WebApkAPI use failed.", e); } @@ -105,7 +105,7 @@ api.notifyNotificationWithChannel(platformTag, platformID, notificationBuilder.build(metadata).getNotification(), channelName); } - WebApkUma.recordNotificationPermissionStatus(notificationPermissionEnabled); + WebApkUmaRecorder.recordNotificationPermissionStatus(notificationPermissionEnabled); } };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java index a7623055..0818178 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
@@ -9,7 +9,7 @@ import org.chromium.base.ContextUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.metrics.WebApkUma; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.content_public.browser.NavigationHandle; @@ -61,7 +61,7 @@ } break; } - WebApkUma.recordNetworkErrorWhenLaunch(-navigation.errorCode()); + WebApkUmaRecorder.recordNetworkErrorWhenLaunch(-navigation.errorCode()); } private void onNetworkChanged(Tab tab) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java index 1dacb7f..5566b82 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -23,13 +23,13 @@ import org.chromium.chrome.browser.browserservices.intents.WebApkShareTarget; import org.chromium.chrome.browser.browserservices.intents.WebDisplayMode; import org.chromium.chrome.browser.browserservices.intents.WebappInfo; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder.UpdateRequestQueued; import org.chromium.chrome.browser.dependency_injection.ActivityScope; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.DestroyObserver; -import org.chromium.chrome.browser.metrics.WebApkUma; -import org.chromium.chrome.browser.metrics.WebApkUma.UpdateRequestQueued; import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory; import org.chromium.components.background_task_scheduler.TaskIds; @@ -260,7 +260,7 @@ /** Schedules update for when WebAPK is not running. */ private void scheduleUpdate() { - WebApkUma.recordUpdateRequestQueued(UpdateRequestQueued.TWICE); + WebApkUmaRecorder.recordUpdateRequestQueued(UpdateRequestQueued.TWICE); TaskInfo updateTask; if (mStorage.shouldForceUpdate()) { // Start an update task ASAP for forced updates. @@ -295,7 +295,8 @@ callback.run(); }; - WebApkUma.recordUpdateRequestSent(WebApkUma.UpdateRequestSent.WHILE_WEBAPK_CLOSED); + WebApkUmaRecorder.recordUpdateRequestSent( + WebApkUmaRecorder.UpdateRequestSent.WHILE_WEBAPK_CLOSED); WebApkUpdateManagerJni.get().updateWebApkFromFile( storage.getPendingUpdateRequestPath(), callbackRunner); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java index 45d7dae..68f9efa1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java
@@ -10,10 +10,10 @@ import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver; import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.browserservices.ui.controller.CurrentPageVerifier; import org.chromium.chrome.browser.browserservices.ui.controller.CurrentPageVerifier.VerificationState; import org.chromium.chrome.browser.browserservices.ui.controller.CurrentPageVerifier.VerificationStatus; -import org.chromium.chrome.browser.metrics.WebApkUma; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData; import org.chromium.content_public.browser.NavigationHandle; @@ -48,7 +48,7 @@ VerificationState verificationState = mCurrentPageVerifier.getState(); boolean isNavigationInScope = (verificationState == null || verificationState.status != VerificationStatus.FAILURE); - WebApkUma.recordNavigation(isNavigationInScope); + WebApkUmaRecorder.recordNavigation(isNavigationInScope); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java index 05ec902..ce8e5d1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java
@@ -12,7 +12,7 @@ import org.chromium.base.PathUtils; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.BackgroundOnlyAsyncTask; -import org.chromium.chrome.browser.metrics.WebApkUma; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import java.io.File; import java.util.concurrent.atomic.AtomicBoolean; @@ -75,7 +75,7 @@ } } - WebApkUma.recordNumberOfStaleWebApkUpdateRequestFiles(count); + WebApkUmaRecorder.recordNumberOfStaleWebApkUpdateRequestFiles(count); } /** Returns the directory containing all of Chrome's web app data, creating it if needed. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java index f0afe206..cdb776a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java
@@ -20,10 +20,10 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.PostTask; +import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionStore; import org.chromium.chrome.browser.browsing_data.UrlFilter; import org.chromium.chrome.browser.browsing_data.UrlFilterBridge; -import org.chromium.chrome.browser.metrics.WebApkUma; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.components.embedder_support.util.Origin; @@ -456,7 +456,7 @@ } } if (isInitalizing) { - WebApkUma.recordWebApksCount(getOriginsWithWebApk().size()); + WebApkUmaRecorder.recordWebApksCount(getOriginsWithWebApk().size()); } } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java index 7f0e0cc..7750af05 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java
@@ -44,6 +44,7 @@ import org.chromium.base.CommandLine; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeTabbedActivity; @@ -598,6 +599,7 @@ @Test @SmallTest @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + @DisabledTest(message = "https://crbug.com/1227573") public void testOmniboxSearchEngineLogo_unfocusedOnSRP_nonGoogleSearchEngine() { setupSearchEngineLogo(NON_GOOGLE_URL); startActivityNormally();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java index 610f3e7..18cfd0e1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
@@ -24,10 +24,12 @@ import org.chromium.base.test.util.CriteriaHelper; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.external_intents.ExternalNavigationHandler; import org.chromium.components.external_intents.ExternalNavigationParams; import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; @@ -70,6 +72,8 @@ BASE_PAGE + "navigation_from_image_onload.html"; private static final String NAVIGATION_FROM_USER_GESTURE_IFRAME_PAGE = BASE_PAGE + "navigation_from_user_gesture_to_iframe_page.html"; + private static final String NAVIGATION_FROM_PRERENDERING_PAGE = + BASE_PAGE + "navigation_from_prerender.html"; private static final long DEFAULT_MAX_TIME_TO_WAIT_IN_MS = 3000; private static final long LONG_MAX_TIME_TO_WAIT_IN_MS = 20000; @@ -215,4 +219,21 @@ Assert.assertTrue( mExternalNavParamHistory.get(2).getRedirectHandler().shouldStayInApp(true, false)); } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.PRERENDER2}) + public void testExternalAppPrerenderingNavigation() throws TimeoutException { + // Ensure that a prerendering main frame doesn't call into the delegate. + sActivityTestRule.loadUrl(mTestServer.getURL(NAVIGATION_FROM_PRERENDERING_PAGE)); + Assert.assertEquals(1, mNavParamHistory.size()); + + // The click will reload the page with a user gesture. The delegate + // should still only hear about the navigation in the primary main + // frame, not the prerendering one. + DOMUtils.clickNode(mActivity.getActivityTab().getWebContents(), "link"); + waitTillExpectedCallsComplete(2, DEFAULT_MAX_TIME_TO_WAIT_IN_MS); + Assert.assertEquals(2, mNavParamHistory.size()); + Assert.assertEquals(2, mExternalNavParamHistory.size()); + } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java index 5ed2a73..c4ca300 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
@@ -115,7 +115,6 @@ when(mPrefService.getBoolean(Pref.ENABLE_SNIPPETS)).thenReturn(true); when(mPrefService.getBoolean(Pref.ENABLE_WEB_FEED_UI)).thenReturn(true); - when(mWebFeedBridgeJniMock.isWebFeedSubscriber()).thenReturn(true); when(mIdentityService.getSigninManager(any(Profile.class))).thenReturn(mSigninManager); when(mSigninManager.getIdentityManager()).thenReturn(mIdentityManager); when(mIdentityManager.hasPrimaryAccount()).thenReturn(true);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index a3f4c28..7b8b881d 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -3503,7 +3503,7 @@ Stop </message> <message name="IDS_TAB_SHARING_INFOBAR_SWITCH_TO_BUTTON" desc="Text displayed on an infobar button offering to change focus to another tab."> - Switch to tab <ph name="TAB_ORIGIN">$1<ex>meet.google.com</ex></ph> + Switch to tab (<ph name="TAB_ORIGIN">$1<ex>meet.google.com</ex></ph>) </message> <message name="IDS_TAB_SHARING_INFOBAR_SWITCH_TO_CAPTURER_BUTTON" desc="Text displayed on an infobar button offering to change focus to the capturer if its hostname cannot be determined. (Otherwise, IDS_TAB_SHARING_INFOBAR_SWITCH_TO_BUTTON will be used.)"> Switch to capturing tab @@ -4994,10 +4994,10 @@ Customize and control <ph name="APP_NAME">$1<ex>GMail</ex></ph> </message> <message name="IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP"> - Enable window controls overlay + Hide title bar </message> <message name="IDS_WEB_APP_DISABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP"> - Disable window controls overlay + Show title bar </message> <!-- Components --> @@ -5092,9 +5092,6 @@ <message name="IDS_PASSWORD_MANAGER_CONFIRM_SAVED_TITLE" desc="The title text used in the passwords bubble after the user has saved a password."> Password saved </message> - <message name="IDS_PASSWORD_MANAGER_SYNC_PROMO_TITLE" desc="The title text used in the sync promo bubble when the user has saved a password."> - Password saved on this device - </message> <message name="IDS_PASSWORD_GENERATION_SUGGESTION" desc="Text shown next to a generated password describing it as a suggestion."> Use suggested password </message> @@ -10143,20 +10140,6 @@ </message> </if> - <!-- Confirmation dialog for getCurrentBrowsingContextMedia API --> - <message name="IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TITLE" desc="Title for the confirmation dialog shown when getCurrentBrowsingContextMedia is requested by an app."> - Share this tab - </message> - <message name="IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TEXT_REQUESTED_BY_APP" desc="Text for the confirmation dialog shown when getCurrentBrowsingContextMedia is requested by an app."> - <ph name="TARGET_NAME">$1<ex>https://google.com</ex></ph> is asking for permission to capture the contents of this tab. - </message> - <message name="IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_AUDIO_SHARE" desc="Text for the checkbox on the confirmation dialog for getCurrentBrowsingContextMedia API, when checked, audio will be shared, otherwise just video sharing"> - Share audio - </message> - <message name="IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_SHARE_BUTTON" desc="Used for Share on buttons"> - Share - </message> - <!--Printer registration message for local discovery and Print Preview--> <message name="IDS_CLOUD_PRINT_REGISTER_PRINTER_INFORMATION" desc="Information about registering printers with Google Cloud Print shown to the user before they confirm registration."> Documents are <ph name="BEGIN_LINK_HELP"><a is="action-link" href="https://support.google.com/cloudprint/answer/2541843" target="_blank"></ph>sent to Google<ph name="END_LINK_HELP"></a></ph> to prepare them for printing. View, edit and manage your printers and printer history on the <ph name="BEGIN_LINK_DASHBOARD"><a is="action-link" href="https://www.google.com/cloudprint#jobs" target="_blank"></ph>Google Cloud Print dashboard<ph name="END_LINK_DASHBOARD"></a></ph>.
diff --git a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_AUDIO_SHARE.png.sha1 b/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_AUDIO_SHARE.png.sha1 deleted file mode 100644 index dbb7865..0000000 --- a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_AUDIO_SHARE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -282e4397adbf6cbc51adad6fca84783715c4681a \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_SHARE_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_SHARE_BUTTON.png.sha1 deleted file mode 100644 index dbb7865..0000000 --- a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_SHARE_BUTTON.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -282e4397adbf6cbc51adad6fca84783715c4681a \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TEXT_REQUESTED_BY_APP.png.sha1 b/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TEXT_REQUESTED_BY_APP.png.sha1 deleted file mode 100644 index bd215cf..0000000 --- a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TEXT_REQUESTED_BY_APP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -0836b3016785247f5f95badc7df41abdbf791747 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TITLE.png.sha1 deleted file mode 100644 index dbb7865..0000000 --- a/chrome/app/generated_resources_grd/IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -282e4397adbf6cbc51adad6fca84783715c4681a \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_SHARING_INFOBAR_SWITCH_TO_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_SHARING_INFOBAR_SWITCH_TO_BUTTON.png.sha1 index 0e9815c..ba4e8cd9 100644 --- a/chrome/app/generated_resources_grd/IDS_TAB_SHARING_INFOBAR_SWITCH_TO_BUTTON.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_TAB_SHARING_INFOBAR_SWITCH_TO_BUTTON.png.sha1
@@ -1 +1 @@ -290fec5cc889c015dbeacd791f5c71aeedc67a3e \ No newline at end of file +6e1429c2d243c15d5f89017b3ca7c8c86390812c \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEB_APP_DISABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEB_APP_DISABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1 index c124a70..cd66f32 100644 --- a/chrome/app/generated_resources_grd/IDS_WEB_APP_DISABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_WEB_APP_DISABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1
@@ -1 +1 @@ -2a1d941e940bd8adefb63167d2e7311b96513e1c \ No newline at end of file +389e44f4ac97d678f8f55420414da8f7535e9814 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1 index e8ac7e0..9be85b0 100644 --- a/chrome/app/generated_resources_grd/IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP.png.sha1
@@ -1 +1 @@ -0232d5cb499de6cfd92e63be6130fdf9d1c37918 \ No newline at end of file +563a8b31ec898c18714c9f90637c04810d3c41ba \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 226482c7..540c288 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Maak Bluetooth-toestel los</translation> <translation id="1651008383952180276">Jy moet dieselfde wagfrase twee keer invoer</translation> <translation id="1652326691684645429">Aktiveer Nabydeling</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Voeg die drukker by Google Wolk-drukker sodat jy van enige plek af kan druk.}other{Voeg # drukkers by Google Wolk-drukker sodat jy van enige plek af kan druk.}}</translation> <translation id="1653631694606464309">Webprogramme vra gewoonlik om sekere tipes lêers oop te maak sodat jy aan daardie lêers kan werk wanneer jy wil, soos om dokumente in jou voorkeurwoordverwerker oop te maak</translation> <translation id="1656528038316521561">Agtergrondondeursigtigheid</translation> <translation id="1657406563541664238">Help om <ph name="PRODUCT_NAME" /> te verbeter deur gebruikstatistiek en omvalverslae outomaties na Google te stuur</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Jy gebruik tans 'n omgewingveranderlike wat nie gesteun word nie: <ph name="BAD_VAR" />. Stabiliteit en veiligheid sal daaronder ly.</translation> <translation id="4095264805865317199">Maak Sellulêre Aktivering UI oop</translation> <translation id="4095507791297118304">Primêre skerm</translation> -<translation id="409579654357498729">Voeg by Wolkdruk</translation> <translation id="4096508467498758490">Deaktiveer ontwikkelaarmodus se uitbreidings</translation> <translation id="4097406557126260163">Programme en uitbreidings</translation> <translation id="409742781329613461">Wenke vir Chrome</translation> @@ -4839,7 +4837,6 @@ <ph name="DOMAIN" /> vereis dat jy jou slimkaart ingesteek hou.</translation> <translation id="628352644014831790">4 sekondes</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> word nie gewoonlik afgelaai nie en kan gevaarlik wees.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nuwe drukker in jou netwerk}other{Nuwe drukkers in jou netwerk}}</translation> <translation id="6285770818046456882">Die toestel wat tans met jou deel, het die oordrag gekanselleer</translation> <translation id="6290613030083731160">Geen beskikbare toestelle in die omtrek deel tans nie <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verifieer tans aktiveringkode. Dit kan 'n paar minute neem.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 34e7afa..78603c7c0 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">የብሉቱዝ መሣሪያን ነጥል</translation> <translation id="1651008383952180276">ተመሳሳዩ የይለፍ ሐረጉን ሁለት ጊዜ ማስገባት አለብዎት</translation> <translation id="1652326691684645429">የአቅራቢያ አጋራን ያንቁ</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{ከማንኛውም ቦታ ሆነው ማተም እንዲችሉ አታሚውን ወደ Google Cloud አታሚ ያክሉ።}one{ከማንኛውም ቦታ ሆነው ማተም እንዲችሉ # አታሚዎችን ወደ Google Cloud አታሚ ያክሉ።}other{ከማንኛውም ቦታ ሆነው ማተም እንዲችሉ # አታሚዎችን ወደ Google Cloud አታሚ ያክሉ።}}</translation> <translation id="1653631694606464309">እንደ በተመረጡ የጽሑፍ ማቀናበሪያዎ ውስጥ ሰነዶችን እንደ መክፈት ያሉ በሚፈልጉት ፋይሎች ላይ መስራት እንዲችሉ የድር መተግበሪያዎች በተለምዶ የተወሰኑ የፋይሎች ዓይነቶችን እንዲከፍቱ ይጠይቃሉ።</translation> <translation id="1656528038316521561">የበስተጀርባ ብርሃን-ከልነት</translation> <translation id="1657406563541664238">የአጠቃቀም ስታቲክሶችን እና የስንኩል ሪፖርቶችን ወደ Google በቀጥታ በመላክ <ph name="PRODUCT_NAME" />ን የተሻለ ለማድረግ እገዛ ያድርጉ።</translation> @@ -2910,7 +2909,6 @@ <translation id="4094647278880271855">የማይደገፍ የድባብ ተለዋዋጭ በመጠቀም ላይ ነዎት፦ <ph name="BAD_VAR" />። ማረጋጊያ እና ደህንነት ይቸገራሉ።</translation> <translation id="4095264805865317199">ተንቀሳቃሽ ማግበሪያ ዩአይ ይክፈቱ</translation> <translation id="4095507791297118304">ዋና ማሳያ</translation> -<translation id="409579654357498729">ወደ የደመና ህትመት ያክሉ</translation> <translation id="4096508467498758490">የገንቢ ሁኔታ ቅጥያዎችን ያሰናክሉ</translation> <translation id="4097406557126260163">መተግበሪያዎች እና ቅጥያዎች</translation> <translation id="409742781329613461">ጠቃሚ ምክሮች ለChrome</translation> @@ -4386,6 +4384,7 @@ <translation id="5794700615121138172">የተጋሩ የLinux አቃፊዎች</translation> <translation id="5794786537412027208">ከሁሉም የChrome መተግበሪያዎች ውጣ</translation> <translation id="5797070761912323120">Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ የእርስዎን ታሪክ ሊጠቀም ይችላል</translation> +<translation id="5797521893972859201">በፍለጋ ሳጥኑ ውስጥ ጨምሮ ታሪክን ያጸዳል</translation> <translation id="5798079537501238810">ጣቢያዎች የክፍያ ተቆጣጣሪዎችን መጫን ይችላሉ</translation> <translation id="579907812742603813">ጥበቃ የሚደረግለት ይዘት</translation> <translation id="579915268381781820">የእርስዎ የደህንነት ቁልፍ ተወግዷል።</translation> @@ -4469,6 +4468,7 @@ <translation id="5900302528761731119">Google የመገለጫ ፎቶ</translation> <translation id="590036993063074298">የጥራት ዝርዝሮችን ማንጸባረቅ</translation> <translation id="5901069264981746702">የጣት አሻራዎ ውሂብ ደህንነቱ በተጠበቀ ሁኔታ ይከማቻል እና በጭራሽ ከእርስዎ <ph name="DEVICE_TYPE" /> አይወጣም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">ወደ የሚቀርጽ ትር ይቀይሩ</translation> <translation id="5901494423252125310">የማተሚያ በር ክፍት ነው</translation> <translation id="5901630391730855834">ቢጫ</translation> <translation id="5904614460720589786">በውቅረት ችግር ምክንያት <ph name="APP_NAME" />ን ማቀናበር አልተቻለም። እባክዎ አስተዳዳሪዎን ያነጋግሩ። የስሕተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> @@ -4741,6 +4741,7 @@ <translation id="6196854373336333322">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ የተኪ ቅንብሮችዎን ተቆጣጥሯል፣ ይሄ ማለት መስመር ላይ የሚያደርጉት ማንኛውም ነገር ሊቀይር፣ ሊሰብር ወይም በድብቅ ሊከታተል ይችላል። ይሄ ለውጥ ለምን እንደተከሰተ እርግጠኛ ካልሆኑ የማይፈልጉት ነገር ሳይሆን አይቀርም።</translation> <translation id="6198102561359457428">ዘግተው ይውጡና ከዚያ እንደገና ይግቡ...</translation> <translation id="6198252989419008588">ፒን ይቀይሩ</translation> +<translation id="6200047250927636406">ፋይልን አስወግድ</translation> <translation id="6202304368170870640">ወደ መሣሪያዎ ለመግባት ወይም መሣሪያዎን ለመቆለፍ የእርስዎን ፒን መጠቀም ይችላሉ።</translation> <translation id="6206311232642889873">ምስል ቅ&ዳ</translation> <translation id="6207200176136643843">ወደ ነባሪ የማጉላት ደረጃ ዳግም አስጀምር</translation> @@ -4826,7 +4827,6 @@ <ph name="DOMAIN" /> የእርስዎን ዘመናዊ ካርድ እንደገባ እንዲቆይ ይፈልግብዎታል።</translation> <translation id="628352644014831790">4 ሰከንዶች</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> በተለምዶ የሚወርድ ፋይል አይደለም፣ እና አደገኛ ሊሆን ይችላል።</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{በእርስዎ አውታረ መረብ ላይ ያለ አዲስ አታሚ}one{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}other{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}}</translation> <translation id="6285770818046456882">ከእርስዎ ጋር የተጋራው መሣሪያ ዝውውሩን ሰርዞታል</translation> <translation id="6290613030083731160">በአቅራቢያ የሚጋሩ መሣሪያዎች የሉም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="6291086328725007688">የማግበሪያ ኮድን በማረጋገጥ ላይ። ይህ ጥቂት ደቂቃዎችን ሊወስድ ይችላል።</translation> @@ -5309,6 +5309,7 @@ <translation id="6831043979455480757">መተርጎም</translation> <translation id="6833479554815567477">ትር ከቡድን <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> ተወግዷል</translation> <translation id="683373380308365518">ወደ ዘመናዊ እና ደህንነቱ የተጠበቀ አሳሽ ይቀይሩ</translation> +<translation id="6834652994408928492">የጨለማ ሁነታ ፀሐይ ስትጠልቅ በራስ-ሰር ይበራል</translation> <translation id="683540480453879381">የ<ph name="FILE_EXTENSIONS" /> ፋይሎችን መክፈት</translation> <translation id="6835762382653651563">የእርስዎን <ph name="DEVICE_TYPE" /> ለማዘመን እባክዎ ከበይነመረብ ጋር ይገናኙ።</translation> <translation id="6838034009068684089">አንድ ጣቢያ መስኮቶችን መክፈትና በማያ ገጾችዎ ላይ ሊያስቀምጣቸው ሲፈልግ ጠይቅ (የሚመከር)</translation> @@ -6021,6 +6022,7 @@ <translation id="7622114377921274169">ኃይል በመሙላት ላይ።</translation> <translation id="7622768823216805500">ጣቢያዎች አብዛኛው ጊዜ እንደ የቀለለ ከፍሎ ማውጫ ላሉ የግዢ ባህሪዎች የክፍያ ተቆጣጣሪዎችን ይጭናሉ</translation> <translation id="7622903810087708234">የይለፍ ቃል ዝርዝሮች</translation> +<translation id="7622966771025050155">ወደ የተቀረጸ ትር ይቀይሩ</translation> <translation id="7624337243375417909">አቢያት ማድረጊያ ጠፍቷል</translation> <translation id="7625568159987162309">ፈቃዶችን እና በመላ ጣቢያዎች ላይ የተከማቸ ውሂብን አሳይ</translation> <translation id="7628201176665550262">የዕድሳት ፍጥነት</translation> @@ -6187,6 +6189,7 @@ <translation id="7784067724422331729">በኮምፒውተርዎ ላይ ያሉት የደህንነት ቅንብሮች ይህንን ፋይል አግደውታል።</translation> <translation id="7784796923038949829">የጣቢያን ውሂብ ማንበብ ወይም መቀየር አልተቻለም</translation> <translation id="778480864305029524">ቅጽበታዊ እንደ ሞደም መሰካትን ለመጠቀም ለGoogle Play አገልግሎቶች ማሳወቂያዎችን ያብሩ።</translation> +<translation id="7785471469930192436">መተግበር የሚችል ከሆነ የፍለጋ ታሪክዎን ለመሰረዝ የፍለጋ ፕሮግራምዎን መመሪያዎች ይመልከቱ።</translation> <translation id="7786889348652477777">&መተግበሪያን ዳግም ጫን</translation> <translation id="7787308148023287649">በሌላ ማያ ገጽ ላይ አሳይ</translation> <translation id="7788298548579301890">ሌላ ፕሮግራም Chrome የሚሰራበትን መንገድ የሚለውጥ መተግበሪያ በኮምፒውተርዎ ታክሏል። @@ -6804,6 +6807,7 @@ <translation id="8438566539970814960">ፍለጋዎችን እና አሰሳን የተሻለ አድርግ</translation> <translation id="8439506636278576865">በዚህ ቋንቋ ውስጥ ያሉ ገጾችን ለመተርጎም ያቅርቡ</translation> <translation id="8440630305826533614">Linux መተግበሪያዎች</translation> +<translation id="8446225304314102060">ወደ ትር <ph name="TAB_ORIGIN" /> ቀይር</translation> <translation id="8446884382197647889">ተጨማሪ ለመረዳት</translation> <translation id="8447409163267621480">Ctrl ወይም Alt ያካትቱ</translation> <translation id="8448729345478502352">በማያ ገጽዎ ላይ ያሉ ንጥሎችን ያሳንሱ ወይም ያተልቁ</translation> @@ -7466,6 +7470,7 @@ <translation id="9148058034647219655">ውጣ</translation> <translation id="9148126808321036104">እንደገና ይግቡ</translation> <translation id="9148963623915467028">ይህ ጣቢያ አካባቢዎን ሊደርስበት ይችላል።</translation> +<translation id="9149529198050266366">የጨለማ ሁነታ ፀሐይ ስትወጣ በራስ-ሰር ይጠፋል</translation> <translation id="9149866541089851383">አርትዕ…</translation> <translation id="9150045010208374699">ካሜራዎን ይጠቀማል</translation> <translation id="9150079578948279438">መገለጫ ሊወገድ አልቻለም። እባክዎ እንደገና ይሞክሩ ወይም ለቴክኒካዊ ድጋፍ አገልግሎት አቅራቢዎን ያነጋግሩ።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 9e57adfa..3295b9c 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">إلغاء الإقران بجهاز عبر بلوتوث</translation> <translation id="1651008383952180276">يجب إدخال عبارة المرور نفسها مرتين</translation> <translation id="1652326691684645429">تفعيل ميزة "المشاركة عن قرب"</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{إضافة طابعة إلى الطباعة السحابية من Google حتى تتمكن من الطباعة من أي مكان.}zero{إضافة # من الطابعات إلى الطباعة السحابية من Google حتى تتمكن من الطباعة من أي مكان.}two{إضافة طابعتين (#) إلى الطباعة السحابية من Google حتى تتمكن من الطباعة من أي مكان.}few{إضافة # طابعات إلى الطباعة السحابية من Google حتى تتمكن من الطباعة من أي مكان.}many{إضافة # طابعة إلى الطباعة السحابية من Google حتى تتمكن من الطباعة من أي مكان.}other{إضافة # من الطابعات إلى الطباعة السحابية من Google حتى تتمكن من الطباعة من أي مكان.}}</translation> <translation id="1653631694606464309">تطلب عادةً تطبيقات الويب الإذن منك لفتح أنواع معيّنة من الملفات كي يتسنى لك العمل على هذه الملفات باستخدام تلك التطبيقات أينما شئت، مثل فتح المستندات من خلال معالج النصوص المفضّل لديك.</translation> <translation id="1656528038316521561">درجة تعتيم الخلفية</translation> <translation id="1657406563541664238">المساعدة في تحسين <ph name="PRODUCT_NAME" /> بإرسال إحصاءات الاستخدام وتقارير الأعطال إلى Google تلقائيًا</translation> @@ -2906,7 +2905,6 @@ <translation id="4094647278880271855">أنت تستخدم متغير بيئة غير معتمد: <ph name="BAD_VAR" />. وسيؤثر ذلك سلبًا على الثبات والأمان.</translation> <translation id="4095264805865317199">فتح واجهة مستخدم لتفعيل شبكة الجوّال</translation> <translation id="4095507791297118304">شاشة أساسية</translation> -<translation id="409579654357498729">إضافة إلى الطباعة السحابية</translation> <translation id="4096508467498758490">إيقاف إضافات وضع مطور البرامج</translation> <translation id="4097406557126260163">التطبيقات والإضافات</translation> <translation id="409742781329613461">معلومات بشأن استخدام متصفّح Chrome</translation> @@ -4382,6 +4380,7 @@ <translation id="5794700615121138172">مجلدات نظام التشغيل Linux التي تمت مشاركتها</translation> <translation id="5794786537412027208">إنهاء جميع تطبيقات Chrome</translation> <translation id="5797070761912323120">قد تستخدم Google سجلّك لتخصيص البحث والإعلانات وخدمات Google الأخرى.</translation> +<translation id="5797521893972859201">محو السجلّ، بما في ذلك السجلّ الخاص بمربّع البحث</translation> <translation id="5798079537501238810">السماح للمواقع الإلكترونية بتثبيت معالجات الدفع</translation> <translation id="579907812742603813">المحتوى المحمي</translation> <translation id="579915268381781820">تمت إزالة مفتاح الأمان.</translation> @@ -4465,6 +4464,7 @@ <translation id="5900302528761731119">صورة الملف الشخصي في Google</translation> <translation id="590036993063074298">تفاصيل جودة النسخ المطابق</translation> <translation id="5901069264981746702">يتم تخزين بيانات بصمة الإصبع بشكل آمن وتظلّ محفوظة على جهاز <ph name="DEVICE_TYPE" /> فقط. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">التبديل إلى علامة التبويب التي تسجّل المحتوى</translation> <translation id="5901494423252125310">باب الطابعة مفتوح</translation> <translation id="5901630391730855834">أصفر</translation> <translation id="5904614460720589786">تعذّر إعداد <ph name="APP_NAME" /> بسبب مشكلة في الضبط. يُرجى التواصل مع مشرفك. رمز الخطأ: <ph name="ERROR_CODE" />.</translation> @@ -4737,6 +4737,7 @@ <translation id="6196854373336333322">أصبح بإمكان الإضافة "<ph name="EXTENSION_NAME" />" التحكم في إعدادات الخادم الوكيل التابعة لك، مما يعني أن بإمكانها تغيير أي إجراء لك على الإنترنت أو قطعه أو التجسس عليه. إذا كنت غير متيقن من سبب حدوث هذا التغيير، فأنت لا ترغب فيه على الأرجح.</translation> <translation id="6198102561359457428">الخروج ثم إعادة تسجيل الدخول...</translation> <translation id="6198252989419008588">تغيير رقم التعريف الشخصي</translation> +<translation id="6200047250927636406">تجاهل الملف</translation> <translation id="6202304368170870640">يمكنك استخدام رقم تعريفك الشخصي لتسجيل الدخول أو فتح قفل جهازك.</translation> <translation id="6206311232642889873">نس&خ صورة</translation> <translation id="6207200176136643843">إعادة الضبط على مستوى التكبير أو التصغير التلقائي</translation> @@ -4822,7 +4823,6 @@ يتطلَّب <ph name="DOMAIN" /> منك الإبقاء على بطاقتك الذكية مُدخَلة.</translation> <translation id="628352644014831790">4 ثوانٍ</translation> <translation id="6285120108426285413">لا يتم تنزيل <ph name="FILE_NAME" /> بشكل شائع وربما يكون ضارًا.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{طابعة جديدة على شبكتك}zero{طابعات جديدة على شبكتك}two{طابعتان جديدتان على شبكتك}few{طابعات جديدة على شبكتك}many{طابعات جديدة على شبكتك}other{طابعات جديدة على شبكتك}}</translation> <translation id="6285770818046456882">ألغى الجهاز الذي يشارك معك الملف عملية النقل.</translation> <translation id="6290613030083731160">ما مِن أجهزة متوفِّرة بالقرب منك للمشاركة معها. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="6291086328725007688">جارٍ التحقّق من رمز التفعيل. قد تستغرق هذه العملية بضع دقائق.</translation> @@ -5305,6 +5305,7 @@ <translation id="6831043979455480757">ترجمة</translation> <translation id="6833479554815567477">تمت إزالة علامة التبويب من المجموعة <ph name="GROUP_NAME" /> والتي تحتوي على <ph name="GROUP_CONTENTS" />.</translation> <translation id="683373380308365518">التبديل إلى متصفح ذكي وآمن</translation> +<translation id="6834652994408928492">سيتم تفعيل الوضع المُعتِم تلقائيًا عند غروب الشمس.</translation> <translation id="683540480453879381">فتح ملفات <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">يُرجى الاتصال بالإنترنت لتحديث <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">السؤال عند محاولة موقع إلكتروني فتح النوافذ ووضعها على شاشتك (إعداد مُستحسَن)</translation> @@ -6017,6 +6018,7 @@ <translation id="7622114377921274169">جارٍ الشحن.</translation> <translation id="7622768823216805500">تعمل المواقع الإلكترونية عادةً على تثبيت معالجات الدفع لتتيح ميزات التسوّق، مثل الدفع بسهولة.</translation> <translation id="7622903810087708234">تفاصيل كلمة المرور</translation> +<translation id="7622966771025050155">التبديل إلى علامة التبويب التي يتم تسجيلها</translation> <translation id="7624337243375417909">مفتاح caps lock متوقف</translation> <translation id="7625568159987162309">عرض الأذونات والبيانات المُخزَّنة على المواقع</translation> <translation id="7628201176665550262">معدّل إعادة التحميل</translation> @@ -6183,6 +6185,7 @@ <translation id="7784067724422331729">حظرت إعدادات الأمان بجهاز الكمبيوتر هذا الملف.</translation> <translation id="7784796923038949829">يتعذَّر الاطِّلاع على بيانات الموقع الإلكتروني أو تغييرها</translation> <translation id="778480864305029524">فعّل الإشعارات لخدمات Google Play لاستخدام التوصيل الفوري</translation> +<translation id="7785471469930192436">يمكنك الاطّلاع على تعليمات محرّك البحث بشأن حذف سجلّ البحث، إن أمكن.</translation> <translation id="7786889348652477777">&إعادة تحميل التطبيق</translation> <translation id="7787308148023287649">عرض على شاشة أخرى</translation> <translation id="7788298548579301890">أضاف برنامج آخر بجهاز الكمبيوتر تطبيقًا قد يؤدي إلى تغيير طريقة عمل Chrome. @@ -6795,6 +6798,7 @@ <translation id="8438566539970814960">تحسين عمليات البحث والتصفُّح</translation> <translation id="8439506636278576865">عرض ترجمة الصفحات المكتوبة بهذه اللغة</translation> <translation id="8440630305826533614">تطبيقات Linux</translation> +<translation id="8446225304314102060">التبديل إلى علامة التبويب <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">مزيد من المعلومات</translation> <translation id="8447409163267621480">تضمين إما مفتاح Ctrl أو Alt</translation> <translation id="8448729345478502352">تصغير العناصر المعروضة على شاشتك أو تكبيرها</translation> @@ -7459,6 +7463,7 @@ <translation id="9148058034647219655">إنهاء</translation> <translation id="9148126808321036104">تسجيل الدخول مرة أخرى</translation> <translation id="9148963623915467028">يمكن لهذا الموقع الإلكتروني الوصول إلى موقعك الجغرافي.</translation> +<translation id="9149529198050266366">سيتم إيقاف الوضع المُعتِم تلقائيًا عند شروق الشمس.</translation> <translation id="9149866541089851383">تعديل...</translation> <translation id="9150045010208374699">استخدام الكاميرا</translation> <translation id="9150079578948279438">تعذَّرت إزالة الملف الشخصي. يُرجى إعادة المحاولة أو التواصل مع فريق الدعم الفني لدى مشغّل شبكة الجوّال.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index febf34d0..b518d80e 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">ব্লুটুথ ডিভাইচ আনপেয়াৰ কৰক</translation> <translation id="1651008383952180276">আপুনি একেটা পাছফ্ৰেজ দুবাৰ দিবই লাগিব</translation> <translation id="1652326691684645429">Nearby Share সুবিধাটো সক্ষম কৰক</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{আপুনি যিকোনো ঠাইৰে পৰা প্ৰিণ্ট কৰিবলৈ Google ক্লাউড প্ৰিণ্টত প্ৰিণ্টাৰটো যোগ কৰক।}one{আপুনি যিকোনো ঠাইৰে পৰা প্ৰিণ্ট কৰিবলৈ Google ক্লাউড প্ৰিণ্টত #টা প্ৰিণ্টাৰ যোগ কৰক।}other{আপুনি যিকোনো ঠাইৰে পৰা প্ৰিণ্ট কৰিবলৈ Google ক্লাউড প্ৰিণ্টত #টা প্ৰিণ্টাৰ যোগ কৰক।}}</translation> <translation id="1653631694606464309">ৱেব এপে সাধাৰণতে নির্দিষ্ট প্ৰকাৰৰ ফাইলসমূহ খুলিবলৈ বিচাৰিব পাৰে, যাতে আপুনি য'তে সেই ফাইলসমূহত কাম কৰিব বিচাৰে তাতে কৰিব পাৰে, যেনে, আপুনি পচন্দ কৰা ৱর্ড প্ৰছে'শ্বৰত নথি খোলা</translation> <translation id="1656528038316521561">নেপথ্যৰ অস্বচ্ছতা</translation> <translation id="1657406563541664238">Googleলৈ ব্যৱহাৰৰ পৰিসংখ্যা আৰু ক্ৰেশ্বৰ অভিযোগ স্বয়ংক্ৰিয়ভাৱে পঠিয়াই <ph name="PRODUCT_NAME" />ক অধিক উন্নত কৰাত সহায় কৰক</translation> @@ -2912,7 +2911,6 @@ <translation id="4094647278880271855">আপুনি এটা অসমর্থিত পাৰিপাৰ্শ্বিক চলক ব্যৱহাৰ কৰি আছে: <ph name="BAD_VAR" />। স্থিৰতা আৰু সুৰক্ষাত বেয়া প্ৰভাৱ পৰিব।</translation> <translation id="4095264805865317199">চেলুলাৰ সক্ৰিয়কৰণৰ UI খোলক</translation> <translation id="4095507791297118304">মুখ্য ডিছপ্লে’</translation> -<translation id="409579654357498729">Cloud Printত যোগ কৰক</translation> <translation id="4096508467498758490">বিকাশকর্তাৰ ম’ড এক্সটেনশ্বন অক্ষম কৰক</translation> <translation id="4097406557126260163">এপ্ আৰু এক্সটেনশ্বনসমূহ</translation> <translation id="409742781329613461">Chromeৰ বাবে পৰামৰ্শ</translation> @@ -4826,7 +4824,6 @@ <ph name="DOMAIN" />ৰ বাবে আপুনি নিজৰ স্মাৰ্ট কাৰ্ডখন ভৰাই ৰখাৰ আৱশ্যক।</translation> <translation id="628352644014831790">৪ছেকেণ্ড</translation> <translation id="6285120108426285413">সাধাৰণতে <ph name="FILE_NAME" /> ডাউনল'ড কৰা নহয় আৰু ই ক্ষতিকাৰক হ'ব পাৰে।</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{আপোনাৰ নেটৱর্কত দেখুওৱা নতুন প্ৰিণ্টাৰ}one{আপোনাৰ নেটৱর্কত দেখুওৱা নতুন প্ৰিণ্টাৰসমূহ}other{আপোনাৰ নেটৱর্কত দেখুওৱা নতুন প্ৰিণ্টাৰসমূহ}}</translation> <translation id="6285770818046456882">আপোনাৰ সৈতে শ্বেয়াৰ কৰি থকা ডিভাইচটোৱে স্থানান্তৰণটো বাতিল কৰিছে</translation> <translation id="6290613030083731160">কোনো উপলব্ধ ডিভাইচে ওচৰত শ্বেয়াৰ কৰি থকা নাই। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="6291086328725007688">সক্ৰিয়কৰণৰ ক’ডটো সত্যাপন কৰি থকা হৈছে। এই কামত কেইমিনিটমান সময় লাগিব পাৰে।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index ca6bfc4..2a6c475 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -609,7 +609,6 @@ <translation id="164936512206786300">Bluetooth cihazını ayırın</translation> <translation id="1651008383952180276">Eyni parol sözü iki dəfə daxil etməlisiniz</translation> <translation id="1652326691684645429">Yaxındakılarla Paylaşmanı aktivləşdirin</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google Bulud Print'ə printer əlavə edin, bununla istənilən yerdən çap edə bilərsiniz.}other{Google Bulud Print'ə # printer əlavə edin, bununla istənilən yerdən çap edə bilərsiniz.}}</translation> <translation id="1653631694606464309">Veb tətbiqlər adətən müəyyən növ faylları açmağı tələb edir ki, həmin faylların üzərində istədiyiniz yerdə işləyə biləsiniz (məsələn, tərcih etdiyiniz söz emalçısında sənədlərin açılması).</translation> <translation id="1656528038316521561">Arxa fonun qeyri-şəffaflığı</translation> <translation id="1657406563541664238">İstifadə statistikası və xəta hesabatlarını avtomatik Google'a göndərməklə <ph name="PRODUCT_NAME" /> tətbiqini təkmilləşdirməyə kömək edin</translation> @@ -2899,7 +2898,6 @@ <translation id="4094647278880271855">Dəstəklənməyən mühitin dəyişənindən istifadə edirsiniz: <ph name="BAD_VAR" />. Bu, stabillik və təhlükəsizliyə təsir edə bilər.</translation> <translation id="4095264805865317199">Mobil Aktivasiya UI-ni Açın</translation> <translation id="4095507791297118304">Əsas ekran</translation> -<translation id="409579654357498729">Bulud Çapına əlavə edin</translation> <translation id="4096508467498758490">Developer rejimi artırmalarını deaktiv edin</translation> <translation id="4097406557126260163">Tətbiqlər və artırmalar</translation> <translation id="409742781329613461">Chrome üçün məsləhətlər</translation> @@ -4375,6 +4373,7 @@ <translation id="5794700615121138172">Linux'un paylaşılan qovluqları</translation> <translation id="5794786537412027208">Bütün Chrome Tətbiqlərindən çıxın</translation> <translation id="5797070761912323120">Axtarış, reklam və digər Google xidmətlərini fərdiləşdirmək üçün Google tarixçədən istifadə edə bilər</translation> +<translation id="5797521893972859201">Axtarış bölməsindəki daxil olmaqla, tarixçəni silir</translation> <translation id="5798079537501238810">Saytlar ödəniş emalçılarını quraşdıra bilər</translation> <translation id="579907812742603813">qorunan məzmun</translation> <translation id="579915268381781820">Təhlükəsizlik açarınız silindi.</translation> @@ -4458,6 +4457,7 @@ <translation id="5900302528761731119">Google Profil şəkli</translation> <translation id="590036993063074298">Əksetdirmə keyfiyyəti təfərrüatları</translation> <translation id="5901069264981746702">Barmaq izi datanız təhlükəsiz şəkildə saxlanılır və heç vaxt <ph name="DEVICE_TYPE" /> cihazınızdan kənara ötürülmür. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Çəkilənlər tabına keçin</translation> <translation id="5901494423252125310">Printerin qapağı açıqdır</translation> <translation id="5901630391730855834">Sarı</translation> <translation id="5904614460720589786">Konfiqurasiya xətasına görə <ph name="APP_NAME" /> tətbiqini ayarlamaq mümkün olmadı. Administratorunuz ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation> @@ -4728,6 +4728,7 @@ <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" artırması proksi ayarlarınıza nəzarət edir, bu o dəməkdir ki, onlayn etdiyiniz hər bir şey üzərində dəyişdirə, poza və gizli izləyə bilər. Bu dəyişikliyin niyə baş verdiyinə əmin deyilsinizsə, yəqin Siz bunu istəməmisiniz.</translation> <translation id="6198102561359457428">Hesabdan çıxın və yenidən daxil olun...</translation> <translation id="6198252989419008588">PİN kodu dəyişdirin</translation> +<translation id="6200047250927636406">Fayldan imtina edin</translation> <translation id="6202304368170870640">Cihaza daxil olmaq və ya kiliddən çıxarmaq üçün PIN-dən istifadə edə bilərsiniz.</translation> <translation id="6206311232642889873">Şəkli kopyalayın</translation> <translation id="6207200176136643843">Defolt miqyas səviyyəsinə sıfırlayın</translation> @@ -4813,7 +4814,6 @@ <ph name="DOMAIN" /> smart kartınızın taxılı qalmasını tələb edir.</translation> <translation id="628352644014831790">4 saniyə</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> adətən endirilmir və təhlükəli ola bilər.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Şəbəkənizdəki yeni printer}other{Şəbəkənizdəki yeni printerlər}}</translation> <translation id="6285770818046456882">Sizinlə paylaşım edən cihaz köçürməni ləğv etdi</translation> <translation id="6290613030083731160">Yaxınlıqda paylaşım edən əlçatan cihaz yoxdur. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktivləşdirmə kodu doğrulanır. Bu, bir neçə dəqiqə çəkə bilər.</translation> @@ -5296,6 +5296,7 @@ <translation id="6831043979455480757">Tərcümə et</translation> <translation id="6833479554815567477">Tab bu qrupdan silindi: <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Ağıllı və təhlükəsiz brauzerə keçin</translation> +<translation id="6834652994408928492">Qaranlıq rejim qürub vaxtı avtomatik aktiv ediləcək</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> fayllarını açın</translation> <translation id="6835762382653651563">Yeniləmə İnternetə qoşulmaq edin sizin <ph name="DEVICE_TYPE" /> .</translation> <translation id="6838034009068684089">Sayt ekranlarınızda pəncərələri açmaq və yerləşdirmək istədikdə soruşun (tövsiyə edilir)</translation> @@ -6008,6 +6009,7 @@ <translation id="7622114377921274169">Enerji yığır.</translation> <translation id="7622768823216805500">Saytlar adətən asan ödəmə kimi alış-veriş xüsusiyyətləri üçün ödəniş emalçıları quraşdırır</translation> <translation id="7622903810087708234">Parol detalları</translation> +<translation id="7622966771025050155">Çəkilmişlər tabına keçin</translation> <translation id="7624337243375417909">böyük hərflər deaktivdir</translation> <translation id="7625568159987162309">Saytlarda icazələrə və saxlanılan dataya baxın</translation> <translation id="7628201176665550262">Yeniləmə sürəti</translation> @@ -6174,6 +6176,7 @@ <translation id="7784067724422331729">Kompüterinizdəki güvənlik ayarları bu faylı blokladı.</translation> <translation id="7784796923038949829">Saytın datasını oxumaq yaxud dəyişmək mümkün deyil</translation> <translation id="778480864305029524">Modem rejimini istifadə etmək üçün Google Play Xidmətlərində bildirişləri aktiv edin.</translation> +<translation id="7785471469930192436">Axtarış tarixçənizi silmək üçün axtarış sisteminizin təlimatlarına (təmin edilibsə) baxın</translation> <translation id="7786889348652477777">Tətbiqi yenidən yükləyin</translation> <translation id="7787308148023287649">Digər ekranda göstərin</translation> <translation id="7788298548579301890">Kompüterinizdə başqa bir proqram Chrome'un necə işlədiyini dəyişdirən tətbiq əlavə etdi. @@ -6784,6 +6787,7 @@ <translation id="8438566539970814960">Axtarış və brauzer fəaliyyətini təkmilləşdirin</translation> <translation id="8439506636278576865">Bu dildə səhifə tərcümələri təklif edin</translation> <translation id="8440630305826533614">Linux tətbiqləri</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> tabına keçin</translation> <translation id="8446884382197647889">Ətraflı Məlumat</translation> <translation id="8447409163267621480">Ya Ctrl, ya da Alt daxil edin</translation> <translation id="8448729345478502352">Elementləri ekranda balacalaşdırın və ya böyüdün</translation> @@ -7443,6 +7447,7 @@ <translation id="9148058034647219655">Çıxış</translation> <translation id="9148126808321036104">Yenidən daxil olun</translation> <translation id="9148963623915467028">Bu sayt məkanınıza giriş edə bilər.</translation> +<translation id="9149529198050266366">Qaranlıq rejim şəfəq vaxtı avtomatik deaktiv ediləcək</translation> <translation id="9149866541089851383">Düzəliş edin...</translation> <translation id="9150045010208374699">Kameranızı istifadə edin</translation> <translation id="9150079578948279438">Profili silmək mümkün olmadı. Yenidən cəhd edin və ya texniki dəstək üçün operatorunuz ilə əlaqə saxlayın.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 2b685080..840fb18 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Разлучыць прыладу Bluetooth</translation> <translation id="1651008383952180276">Вам трэба двойчы ўвесці аднолькавую фразу-пароль</translation> <translation id="1652326691684645429">Уключыць функцыю "Абагульванне паблізу"</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Дадайце прынтар у Google Cloud Print – і друкуйце з любой прылады.}one{Дадайце # прынтар у Google Cloud Print – і друкуйце з любой прылады.}few{Дадайце # прынтары ў Google Cloud Print – і друкуйце з любой прылады.}many{Дадайце # прынтараў у Google Cloud Print – і друкуйце з любой прылады.}other{Дадайце # прынтара ў Google Cloud Print – і друкуйце з любой прылады.}}</translation> <translation id="1653631694606464309">Звычайна вэб-праграмы запытваюць дазвол на адкрыццё файлаў пэўных тыпаў, дзякуючы чаму вы можаце апрацоўваць гэтыя файлы ў праграмах, якім аддаяце перавагу (напрыклад, адкрываць дакументы ў тым тэкставым рэдактары, у якім вам будзе зручней працаваць)</translation> <translation id="1656528038316521561">Непразрыстасць фону</translation> <translation id="1657406563541664238">Дапамажыце палепшыць <ph name="PRODUCT_NAME" />, дазволіўшы аўтаматычна адпраўляць у Google статыстыку выкарыстання і справаздачы аб збоях</translation> @@ -2905,7 +2904,6 @@ <translation id="4094647278880271855">Вы выкарыстоўваеце пераменную асяроддзя, якая не падтрымліваецца: <ph name="BAD_VAR" />. Стабільнасць і бяспека пагоршацца.</translation> <translation id="4095264805865317199">Адкрыць інтэрфейс актывацыі ў мабільнай сетцы</translation> <translation id="4095507791297118304">Асноўны дысплэй</translation> -<translation id="409579654357498729">Дадаць у Cloud Print</translation> <translation id="4096508467498758490">Выключыце пашырэнні, якія працуюць у рэжыме распрацоўшчыка</translation> <translation id="4097406557126260163">Праграмы і пашырэнні</translation> <translation id="409742781329613461">Парады па выкарыстанні Chrome</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Абагуленыя папкі Linux</translation> <translation id="5794786537412027208">Выйсці з усіх праграм Chrome</translation> <translation id="5797070761912323120">Google можа выкарыстоўваць вашу гісторыю, каб персаналізаваць пошук, паказ рэкламы і іншыя сэрвісы Google</translation> +<translation id="5797521893972859201">Будзе выдалена гісторыя, у тым ліку даныя, якія ўводзіліся ў полі пошуку</translation> <translation id="5798079537501238810">Сайты могуць усталёўваць апрацоўшчыкі плацяжоў</translation> <translation id="579907812742603813">абароненае змесціва</translation> <translation id="579915268381781820">Ключ бяспекі адключаны.</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Фота профілю Google</translation> <translation id="590036993063074298">Падрабязныя звесткі пра якасць адлюстравання</translation> <translation id="5901069264981746702">Адбіткі пальцаў надзейна захоўваюцца на вашай прыладзе <ph name="DEVICE_TYPE" /> і нікуды не перадаюцца. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Пераключыцца на ўкладку, якая ажыццяўляла здымку</translation> <translation id="5901494423252125310">Дзверцы прынтара адкрыты</translation> <translation id="5901630391730855834">Жоўты</translation> <translation id="5904614460720589786">Не ўдалося наладзіць праграму <ph name="APP_NAME" /> з-за праблемы канфігурацыі. Звярніцеся да адміністратара. Код памылкі: <ph name="ERROR_CODE" />.</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">Пашырэнне "<ph name="EXTENSION_NAME" />" узяло пад кантроль налады проксі-сервера: яно можа змяняць, пашкоджваць і праслухоўваць усе даныя падчас вашай працы ў інтэрнэце. Калі вы не ведаеце, чаму гэта адбылося, хутчэй за ўсё, гэта непатрэбная вам змена.</translation> <translation id="6198102561359457428">Выйдзіце і ўвайдзіце зноў...</translation> <translation id="6198252989419008588">Змяніць PIN-код</translation> +<translation id="6200047250927636406">Адхіліць файл</translation> <translation id="6202304368170870640">Для разблакіроўкі прылады і для ўваходу ва ўліковы запіс на ёй выкарыстоўвайце PIN-код.</translation> <translation id="6206311232642889873">&Капіраваць відарыс</translation> <translation id="6207200176136643843">Скінуць маштаб да стандартнага</translation> @@ -4819,7 +4820,6 @@ Па правілах дамена <ph name="DOMAIN" /> разумная картка павінна быць устаўлена.</translation> <translation id="628352644014831790">4 секунды</translation> <translation id="6285120108426285413">Файл "<ph name="FILE_NAME" />" звычайна не спампоўваецца і можа быць небяспечным.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Новы прынтар у сетцы}one{Новыя прынтары ў сетцы}few{Новыя прынтары ў сетцы}many{Новыя прынтары ў сетцы}other{Новыя прынтары ў сетцы}}</translation> <translation id="6285770818046456882">Перадача скасавана прыладай, якая ажыццяўляла абагульванне</translation> <translation id="6290613030083731160">Няма даступных прылад, якія б ажыццяўлялі абагульванне паблізу. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Ідзе спраўджанне кода актывацыі. Гэта можа заняць некалькі хвілін.</translation> @@ -5299,6 +5299,7 @@ <translation id="6831043979455480757">Перакласці</translation> <translation id="6833479554815567477">Укладка выдалена з групы "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Пераходзьце на разумны і бяспечны браўзер</translation> +<translation id="6834652994408928492">Цёмны рэжым уключыцца аўтаматычна пасля захаду сонца</translation> <translation id="683540480453879381">Адкрываць файлы з наступнымі пашырэннямі: <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Каб абнавіць <ph name="DEVICE_TYPE" />, падключыцеся да інтэрнэту.</translation> <translation id="6838034009068684089">Пытацца, калі сайт запытвае дазвол адкрываць і размяшчаць вокны на экранах (рэкамендуецца)</translation> @@ -6011,6 +6012,7 @@ <translation id="7622114377921274169">Ідзе зарадка.</translation> <translation id="7622768823216805500">Сайты звычайна ўсталёўваюць апрацоўшчыкі плацяжоў для рэалізацыі функцый купляў, напрыклад для спрашчэння афармлення заказу</translation> <translation id="7622903810087708234">Падрабязныя звесткі аб паролі</translation> +<translation id="7622966771025050155">Пераключыцца на ўкладку, здымка якой ажыццяўлялася</translation> <translation id="7624337243375417909">Caps Lock выключаны</translation> <translation id="7625568159987162309">Праглядзець дазволы і захаваныя з сайтаў даныя</translation> <translation id="7628201176665550262">Частата абнаўлення</translation> @@ -6177,6 +6179,7 @@ <translation id="7784067724422331729">Гэты файл быў заблакіраваны згодна з наладамі бяспекі вашага камп'ютара.</translation> <translation id="7784796923038949829">Не ўдаецца праглядзець або змяніць даныя сайта</translation> <translation id="778480864305029524">Каб выкарыстоўваць Імгненны рэжым мадэма, уключыце апавяшчэнні для Сэрвісаў Google Play.</translation> +<translation id="7785471469930192436">Каб выдаліць гісторыю пошуку, выканайце інструкцыі вашай пошукавай сістэмы (калі яны даступныя)</translation> <translation id="7786889348652477777">&Перазагрузіць праграму</translation> <translation id="7787308148023287649">Паказваць на іншым экране</translation> <translation id="7788298548579301890">Іншая праграма на камп'ютары дадала праграму, якая можа змяніць працу Chrome. @@ -6787,6 +6790,7 @@ <translation id="8438566539970814960">Паскорыць пошук і прагляд</translation> <translation id="8439506636278576865">Прапаноўваць перакладаць старонкі на гэтай мове</translation> <translation id="8440630305826533614">Linux-праграмы</translation> +<translation id="8446225304314102060">Пераключыцца на ўкладку <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Даведацца больш</translation> <translation id="8447409163267621480">Уключыце ў спалучэнне клавішу Ctrl або Alt</translation> <translation id="8448729345478502352">Павелічэнне або памяншэнне элементаў на экране</translation> @@ -7451,6 +7455,7 @@ <translation id="9148058034647219655">Выйсці</translation> <translation id="9148126808321036104">Увайсці зноў</translation> <translation id="9148963623915467028">Гэты сайт можа атрымліваць доступ да даных пра ваша месцазнаходжанне.</translation> +<translation id="9149529198050266366">Цёмны рэжым выключыцца аўтаматычна пасля ўсходу сонца</translation> <translation id="9149866541089851383">Змяніць...</translation> <translation id="9150045010208374699">Выкарыстоўваць камеру</translation> <translation id="9150079578948279438">Не ўдалося выдаліць профіль. Паўтарыце спробу або звярніцеся да свайго аператара па тэхнічную падтрымку.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 6b3964a..63313ff 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Прекратяване на сдвояването на устройство с Bluetooth</translation> <translation id="1651008383952180276">Трябва да въведете един и същ пропуск два пъти</translation> <translation id="1652326691684645429">Активиране на „Споделяне наблизо“</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Добавете принтера към Google Отпечатване в облак, за да можете да печатате от всяко място.}other{Добавете # принтера към Google Отпечатване в облак, за да можете да печатате от всяко място.}}</translation> <translation id="1653631694606464309">Обикновено уеб приложенията извеждат запитвания за отваряне на определени типове файлове, за да можете да работите по тях по желания от вас начин, например да отварят документи в предпочитания от вас текстов редактор</translation> <translation id="1656528038316521561">Плътност на фона</translation> <translation id="1657406563541664238">Помогнете ни да подобрим <ph name="PRODUCT_NAME" /> като автоматично изпращате на Google статистически данни за използването му и сигнали за сривове</translation> @@ -2915,7 +2914,6 @@ <translation id="4094647278880271855">Използвате неподдържана променлива на средата: <ph name="BAD_VAR" />. Стабилността и сигурността ще пострадат.</translation> <translation id="4095264805865317199">Отваряне на ПИ за активиране на мобилна мрежа</translation> <translation id="4095507791297118304">Основен екран</translation> -<translation id="409579654357498729">Добавяне към Отпечатване в облак</translation> <translation id="4096508467498758490">Деактивиране на разширенията в режим за програмисти</translation> <translation id="4097406557126260163">Приложения и разширения</translation> <translation id="409742781329613461">Съвети за Chrome</translation> @@ -4393,6 +4391,7 @@ <translation id="5794700615121138172">Споделяне на папки в Linux</translation> <translation id="5794786537412027208">Затваряне на всички приложения в Chrome</translation> <translation id="5797070761912323120">Възможно е да използваме историята ви, за да персонализираме търсенето, рекламите и други услуги на Google</translation> +<translation id="5797521893972859201">Изчиства историята, включително в полето за търсене</translation> <translation id="5798079537501238810">Сайтовете могат да инсталират инструменти за обработване на плащания</translation> <translation id="579907812742603813">защитено съдържание</translation> <translation id="579915268381781820">Ключът за сигурност бе премахнат.</translation> @@ -4476,6 +4475,7 @@ <translation id="5900302528761731119">Снимка на потребителския профил в Google</translation> <translation id="590036993063074298">Подробности за качеството на дублиране</translation> <translation id="5901069264981746702">Данните за отпечатъка ви се съхраняват надеждно и никога не напускат устройството ви <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Превключване към записващия раздел</translation> <translation id="5901494423252125310">Вратичката на принтера е отворена</translation> <translation id="5901630391730855834">жълто</translation> <translation id="5904614460720589786">Настройването на <ph name="APP_NAME" /> не бе успешно поради проблем с конфигурирането. Моля, обърнете се към администратора си. Код на грешката: <ph name="ERROR_CODE" />.</translation> @@ -4748,6 +4748,7 @@ <translation id="6196854373336333322">Разширението „<ph name="EXTENSION_NAME" />“ е поело контрол над настройките ви за прокси сървър. Това означава, че то може да променя, прекъсва или следи всичко, което правите онлайн. Ако не сте сигурни какво е причинило тази промяна, вероятно не искате тя да остава в сила.</translation> <translation id="6198102561359457428">Излезте от профила си и влезте отново...</translation> <translation id="6198252989419008588">Промяна на ПИН</translation> +<translation id="6200047250927636406">Отхвърляне на файла</translation> <translation id="6202304368170870640">Можете да използвате ПИН кода си, за да влизате в устройството си и да го отключвате.</translation> <translation id="6206311232642889873">Копи&ране на изображението</translation> <translation id="6207200176136643843">Възстановяване на стандартното ниво на мащаба</translation> @@ -4833,7 +4834,6 @@ <ph name="DOMAIN" /> изисква да не изваждате смарткартата си.</translation> <translation id="628352644014831790">4 секунди</translation> <translation id="6285120108426285413">Файлът „<ph name="FILE_NAME" />“ не е често изтеглян и може да е опасен.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов принтер в мрежата ви}other{Нови принтери в мрежата ви}}</translation> <translation id="6285770818046456882">Устройството, което споделя с вас, анулира прехвърлянето</translation> <translation id="6290613030083731160">В близост няма налични споделящи устройства. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Кодът за активиране се проверява. Това може да отнеме няколко минути.</translation> @@ -5316,6 +5316,7 @@ <translation id="6831043979455480757">Превод</translation> <translation id="6833479554815567477">Разделът бе премахнат от групата „<ph name="GROUP_NAME" />“ – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Преминете към интелигентен и сигурен браузър</translation> +<translation id="6834652994408928492">Тъмният режим ще се включи автоматично при залез</translation> <translation id="683540480453879381">Отваря файловете във формат <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Моля, свържете се с интернет, за да актуализирате устройството си <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Извеждане на запитване, когато сайт иска да отваря и разполага прозорци на екраните ви (препоръчително)</translation> @@ -6028,6 +6029,7 @@ <translation id="7622114377921274169">Зарежда се.</translation> <translation id="7622768823216805500">Сайтовете обикновено инсталират инструменти за обработване на плащания, за да осигуряват функции за пазаруване, като например по-лесно плащане</translation> <translation id="7622903810087708234">Подробности за паролата</translation> +<translation id="7622966771025050155">Превключване към записания раздел</translation> <translation id="7624337243375417909">caps lock е изключен</translation> <translation id="7625568159987162309">Преглед на разрешенията и данните, съхранявани в сайтовете</translation> <translation id="7628201176665550262">Честота на опресняване</translation> @@ -6194,6 +6196,7 @@ <translation id="7784067724422331729">Настройките за сигурност на компютъра ви блокираха този файл.</translation> <translation id="7784796923038949829">Данните на сайта не могат да бъдат прочетени или променени</translation> <translation id="778480864305029524">За да използвате незабавен тетъринг, включете известията за услугите за Google Play.</translation> +<translation id="7785471469930192436">Вижте инструкциите на търсещата си машина относно изтриването на историята на търсенията ви (ако е приложимо)</translation> <translation id="7786889348652477777">&Презареждане на приложението</translation> <translation id="7787308148023287649">Показване на друг екран</translation> <translation id="7788298548579301890">Друга програма на компютъра ви добави приложение, което може да промени начина на работа на Chrome. @@ -6806,6 +6809,7 @@ <translation id="8438566539970814960">Подобряване на търсенията и сърфирането</translation> <translation id="8439506636278576865">Предлагане страниците на този език да се превеждат</translation> <translation id="8440630305826533614">Приложения за Linux</translation> +<translation id="8446225304314102060">Превключване към раздела <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Научете повече</translation> <translation id="8447409163267621480">Използвайте или Ctrl, или Alt</translation> <translation id="8448729345478502352">Смаляване или уголемяване на елементите на екрана</translation> @@ -7467,6 +7471,7 @@ <translation id="9148058034647219655">Изход</translation> <translation id="9148126808321036104">Влезте отново</translation> <translation id="9148963623915467028">Този сайт има достъп до местоположението ви.</translation> +<translation id="9149529198050266366">Тъмният режим ще се изключи автоматично при изгрев</translation> <translation id="9149866541089851383">Редактиране...</translation> <translation id="9150045010208374699">Използване на камерата ви</translation> <translation id="9150079578948279438">Потребителският профил не бе премахнат. Моля, опитайте отново или се обърнете към оператора си за техническа поддръжка.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 0c8f631f1..b2ce2cc 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">ব্লুটুথ ডিভাইস আনপেয়ার করুন</translation> <translation id="1651008383952180276">আপনাকে একই পাসফ্রেজ অবশ্যই দু'বার লিখতে হবে</translation> <translation id="1652326691684645429">'নিয়ারবাই শেয়ার' ফিচারটি চালু করুন</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{আপনি যাতে যেকোনো জায়গা থেকে প্রিন্ট করতে পারেন সেই জন্য Google ক্লাউড প্রিন্টে প্রিন্টারটি যোগ করুন।}one{আপনি যাতে যেকোনো জায়গা থেকে প্রিন্ট করতে পারেন সেই জন্য Google ক্লাউড প্রিন্টে #টি প্রিন্টার যোগ করুন।}other{আপনি যাতে যেকোনো জায়গা থেকে প্রিন্ট করতে পারেন সেই জন্য Google ক্লাউড প্রিন্টে #টি প্রিন্টার যোগ করুন।}}</translation> <translation id="1653631694606464309">বিশেষ ধরনের ফাইল খোলার ক্ষেত্রে সাধারণত ওয়েব অ্যাপ অনুমতি চেয়ে থাকে সুতরাং যেখানে চাইবেন সেখানেই ওই সব ফাইলে কাজ করতে পারবেন, যেমন আপনার পছন্দের ওয়ার্ড প্রসেসরে ডকুমেন্ট খোলা</translation> <translation id="1656528038316521561">ব্যাকগ্রাউন্ডের অস্বচ্ছতা</translation> <translation id="1657406563541664238">Google-এ ব্যবহারের পরিসংখ্যান এবং ক্র্যাশ রিপোর্ট অটোমেটিক পাঠিয়ে <ph name="PRODUCT_NAME" />কে আরও ভালো করে তুলতে সাহায্য করুন</translation> @@ -2917,7 +2916,6 @@ <translation id="4094647278880271855">আপনি অসমর্থিত এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করছেন: <ph name="BAD_VAR" /> স্থিতিশীলতা এবং নিরাপত্তা ক্ষতিগ্রস্ত হতে পারে।</translation> <translation id="4095264805865317199">সেলুলার চালু করার UI খুলুন</translation> <translation id="4095507791297118304">প্রাথমিক প্রদর্শন</translation> -<translation id="409579654357498729">ক্লাউড প্রিন্টে যোগ করুন</translation> <translation id="4096508467498758490">ডেভেলপার মোড এক্সটেনশন বন্ধ করুন</translation> <translation id="4097406557126260163">অ্যাপ ও এক্সটেনশন</translation> <translation id="409742781329613461">Chrome ব্যবহারের জন্য পরামর্শ</translation> @@ -4835,7 +4833,6 @@ <ph name="DOMAIN" />-এর জন্য আপনার স্মার্ট কার্ড প্রবেশ করিয়ে রাখতে হবে।</translation> <translation id="628352644014831790">৪ সেকেন্ড</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> সাধারণভাবে ডাউনলোড করা হয় না এবং এটি বিপজ্জনক হতে পারে।</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{আপনার নেটওয়ার্কে নতুন প্রিন্টারটি}one{আপনার নেটওয়ার্কে নতুন প্রিন্টারগুলি}other{আপনার নেটওয়ার্কে নতুন প্রিন্টারগুলি}}</translation> <translation id="6285770818046456882">যে ডিভাইস ব্যবহার করে আপনাকে ফাইল ট্রান্সফার করা হচ্ছিল সেটি ট্রান্সফার বন্ধ করে দিয়েছে</translation> <translation id="6290613030083731160">শেয়ার করার মতো আশেপাশে কোনও ডিভাইস উপলভ্য নেই। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="6291086328725007688">অ্যাক্টিভেশন কোড যাচাই করা হচ্ছে। এর জন্য কয়েক মিনিট সময় লাগতে পারে।</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index c832024..9c41684 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -618,7 +618,6 @@ <translation id="164936512206786300">Okončaj uparivanje Bluetooth uređaja</translation> <translation id="1651008383952180276">Morate dvaput unijeti isti pristupni izraz</translation> <translation id="1652326691684645429">Omogući Dijeljenje u blizini</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Dodajte štampač na Google Cloud Print da možete štampati s bilo koje lokacije.}one{Dodajte # štampač na Google Cloud Print da možete štampati s bilo koje lokacije.}few{Dodajte # štampača na Google Cloud Print da možete štampati s bilo koje lokacije.}other{Dodajte # štampača na Google Cloud Print da možete štampati s bilo koje lokacije.}}</translation> <translation id="1653631694606464309">Web aplikacije obično traže da otvaraju određene vrste fajlova da na njima možete raditi gdje to želite, naprimjer za otvaranje dokumenata u preferiranom obrađivaču teksta</translation> <translation id="1656528038316521561">Neprozirnost pozadine</translation> <translation id="1657406563541664238">Pomozite nam da poboljšamo <ph name="PRODUCT_NAME" /> automatskim slanjem statistika korištenja i izvještaja o padovima aplikacija Googleu</translation> @@ -2916,7 +2915,6 @@ <translation id="4094647278880271855">Koristite varijablu okruženja koja nije podržana: <ph name="BAD_VAR" />. To će negativno uticati na stabilnost i sigurnost.</translation> <translation id="4095264805865317199">Otvori korisnički interfejs za aktiviranje mobilne mreže</translation> <translation id="4095507791297118304">Primarni ekran</translation> -<translation id="409579654357498729">Dodaj u štampanje u oblaku</translation> <translation id="4096508467498758490">Onemogućite ekstenzije u načinu rada za programere</translation> <translation id="4097406557126260163">Aplikacije i ekstenzije</translation> <translation id="409742781329613461">Savjeti za Chrome</translation> @@ -4393,7 +4391,7 @@ <translation id="5794700615121138172">Dijeljeni folderi na Linuxu</translation> <translation id="5794786537412027208">Napusti sve Chromeove aplikacije</translation> <translation id="5797070761912323120">Google može koristiti vašu historiju za personalizaciju Pretraživanja, oglasa i drugih Googleovih usluga</translation> -<translation id="5797521893972859201">Briše povijest, uključujući u okviru za pretraživanje</translation> +<translation id="5797521893972859201">Briše historiju, uključujući onu u okviru za pretraživanje</translation> <translation id="5798079537501238810">Web lokacije mogu instalirati obrađivače plaćanja</translation> <translation id="579907812742603813">zaštićeni sadržaj</translation> <translation id="579915268381781820">Vaš sigurnosni ključ je uklonjen.</translation> @@ -4477,7 +4475,7 @@ <translation id="5900302528761731119">Fotografija Google profila</translation> <translation id="590036993063074298">Detalji o kvalitetu preslikavanja</translation> <translation id="5901069264981746702">Vaši podaci otiska prsta su sigurno pohranjeni i nikada ne napuštaju uređaj <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> -<translation id="5901089233978050985">Prijeđi na snimanje kartice</translation> +<translation id="5901089233978050985">Pređi na snimanje kartice</translation> <translation id="5901494423252125310">Otvoren je poklopac štampača</translation> <translation id="5901630391730855834">Žuta</translation> <translation id="5904614460720589786">Postavljanje aplikacije <ph name="APP_NAME" /> nije uspjelo zbog problema s konfiguracijom. Kontaktirajte administratora. Kȏd greške: <ph name="ERROR_CODE" />.</translation> @@ -4750,7 +4748,7 @@ <translation id="6196854373336333322">Ekstenzija "<ph name="EXTENSION_NAME" />" je preuzela kontrolu nad postavkama vašeg proksi servera, što znači da može promijeniti, prekinuti ili prisluškivati sve što radite na mreži. Ako niste sigurni zašto je došlo do ove promjene, vjerovatno je i ne želite.</translation> <translation id="6198102561359457428">Odjavite se i ponovo se prijavite…</translation> <translation id="6198252989419008588">Promijeni PIN</translation> -<translation id="6200047250927636406">Odbaci datoteku</translation> +<translation id="6200047250927636406">Odbaci fajl</translation> <translation id="6202304368170870640">Možete koristiti PIN za prijavu ili otključavanje uređaja.</translation> <translation id="6206311232642889873">Kop&iraj sliku</translation> <translation id="6207200176136643843">Vraćanje na zadani nivo zumiranja</translation> @@ -4836,7 +4834,6 @@ Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.</translation> <translation id="628352644014831790">4 sekunde</translation> <translation id="6285120108426285413">Fajl <ph name="FILE_NAME" /> se obično ne preuzima i može biti opasan.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Novi štampač na vašoj mreži}one{Novi štampači na vašoj mreži}few{Novi štampači na vašoj mreži}other{Novi štampači na vašoj mreži}}</translation> <translation id="6285770818046456882">Uređaj koji dijeli sadržaj s vama je otkazao prijenos</translation> <translation id="6290613030083731160">Nema dostupnih uređaja koji dijele sadržaj u blizini. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Potvrđivanje koda za aktivaciju. To može potrajati nekoliko minuta.</translation> @@ -5319,7 +5316,7 @@ <translation id="6831043979455480757">Prevedi</translation> <translation id="6833479554815567477">Kartica je uklonjena iz grupe <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Prijeđite na pametan i siguran preglednik</translation> -<translation id="6834652994408928492">Tamni način rada uključit će se automatski kad sunce zađe</translation> +<translation id="6834652994408928492">Tamni način rada će se automatski uključiti u sumrak</translation> <translation id="683540480453879381">otvara <ph name="FILE_EXTENSIONS" /> fajlove</translation> <translation id="6835762382653651563">Povežite se na internet da ažurirate uređaj <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Traži odobrenje kada web lokacija želi otvarati i postavljati prozore na ekranima (preporučeno)</translation> @@ -6032,7 +6029,7 @@ <translation id="7622114377921274169">Punjenje.</translation> <translation id="7622768823216805500">Web lokacije obično instaliraju obrađivače plaćanja za funkcije kupovine, naprimjer, za lakše plaćanje</translation> <translation id="7622903810087708234">Detalji o lozinci</translation> -<translation id="7622966771025050155">Prijeđi na snimljenu karticu</translation> +<translation id="7622966771025050155">Pređi na snimljenu karticu</translation> <translation id="7624337243375417909">velika slova su isključena</translation> <translation id="7625568159987162309">Pregledajte dopuštenja i podatke pohranjene na web-lokacijama</translation> <translation id="7628201176665550262">Brzina osvježavanja</translation> @@ -6199,7 +6196,7 @@ <translation id="7784067724422331729">Sigurnosne postavke na vašem računalu blokirale su ovu datoteku.</translation> <translation id="7784796923038949829">Nije moguće čitati ili mijenjati podatke web lokacije</translation> <translation id="778480864305029524">Za korištenje Trenutnog povezivanja putem mobitela, uključite obavještenja za Google Play usluge.</translation> -<translation id="7785471469930192436">Potražite upute za svoju tražilicu da biste saznali kako izbrisati svoju povijest pretraživanja, ako je primjenjivo</translation> +<translation id="7785471469930192436">Ako je primjenjivo, pogledajte uputstva pretraživača da saznate kako izbrisati historiju pretraživanja</translation> <translation id="7786889348652477777">&Ponovo učitaj stranicu</translation> <translation id="7787308148023287649">Prikaz na drugom ekranu</translation> <translation id="7788298548579301890">Drugi program na vašem računaru je dodao aplikaciju koja može promijeniti način na koji Chrome radi. @@ -6812,7 +6809,7 @@ <translation id="8438566539970814960">Poboljšajte pretraživanje i pregledanje</translation> <translation id="8439506636278576865">Ponudi prijevod stranica na ovom jeziku</translation> <translation id="8440630305826533614">Linux aplikacije</translation> -<translation id="8446225304314102060">Prijeđi na karticu <ph name="TAB_ORIGIN" /></translation> +<translation id="8446225304314102060">Pređi na karticu <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Saznajte više</translation> <translation id="8447409163267621480">Uključite Ctrl ili Alt</translation> <translation id="8448729345478502352">Smanjite ili povećajte stavke na ekranu</translation> @@ -7476,7 +7473,7 @@ <translation id="9148058034647219655">Izađi</translation> <translation id="9148126808321036104">Prijavi se ponovo</translation> <translation id="9148963623915467028">Ova web lokacija može pristupiti vašoj lokaciji.</translation> -<translation id="9149529198050266366">Tamni način rada isključit će se automatski kad sunce izađe</translation> +<translation id="9149529198050266366">Tamni način rada će se automatski isključiti u svitanje</translation> <translation id="9149866541089851383">Uredi…</translation> <translation id="9150045010208374699">Korištenje kamere</translation> <translation id="9150079578948279438">Uklanjanje profila nije uspjelo. Pokušajte ponovo ili kontaktirajte svog mobilnog operatora za tehničku podršku.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 8d35d238..9d2a732f 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Desvincula el dispositiu Bluetooth</translation> <translation id="1651008383952180276">Has d'escriure la mateixa frase de contrasenya dues vegades</translation> <translation id="1652326691684645429">Activa Compartició Nearby</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Afegiu la impressora a Google Cloud Print per poder imprimir des de qualsevol lloc.}other{Afegiu # impressores a Google Cloud Print per poder imprimir des de qualsevol lloc.}}</translation> <translation id="1653631694606464309">Normalment, les aplicacions web demanen obrir determinats tipus de fitxers perquè hi puguis treballar on vulguis; per exemple, demanen obrir els documents al teu processador de textos preferit</translation> <translation id="1656528038316521561">Opacitat del fons</translation> <translation id="1657406563541664238">Ajuda'ns a millorar <ph name="PRODUCT_NAME" /> enviant estadístiques d'ús i informes d'error a Google automàticament.</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Utilitzes una variable d'entorn que no és compatible: <ph name="BAD_VAR" />. L'estabilitat i la seguretat quedaran afectades.</translation> <translation id="4095264805865317199">Obre la IU d'activació de la xarxa mòbil</translation> <translation id="4095507791297118304">Pantalla principal</translation> -<translation id="409579654357498729">Afegeix a Cloud Print</translation> <translation id="4096508467498758490">Desactivació de les extensions del mode de desenvolupador</translation> <translation id="4097406557126260163">Aplicacions i extensions</translation> <translation id="409742781329613461">Consells per utilitzar Chrome</translation> @@ -4380,6 +4378,7 @@ <translation id="5794700615121138172">Carpetes compartides de Linux</translation> <translation id="5794786537412027208">Surt de totes les aplicacions de Chrome</translation> <translation id="5797070761912323120">És possible que Google utilitzi el teu historial per personalitzar la Cerca, els anuncis i altres serveis de Google</translation> +<translation id="5797521893972859201">Esborra l'historial, inclòs el del quadre de cerca</translation> <translation id="5798079537501238810">Els llocs web poden instal·lar gestors de pagament</translation> <translation id="579907812742603813">contingut protegit</translation> <translation id="579915268381781820">La clau de seguretat s'ha tret.</translation> @@ -4463,6 +4462,7 @@ <translation id="5900302528761731119">Foto del perfil de Google</translation> <translation id="590036993063074298">Informació sobre la qualitat de la rèplica</translation> <translation id="5901069264981746702">Les dades de l'empremta digital s'emmagatzemen de manera segura i no surten mai del <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Canvia a la pestanya en procés de captura</translation> <translation id="5901494423252125310">La porta de la impressora és oberta</translation> <translation id="5901630391730855834">Groc</translation> <translation id="5904614460720589786">No s'ha pogut configurar <ph name="APP_NAME" /> a causa d'un problema de configuració. Contacta amb l'administrador. Codi d'error: <ph name="ERROR_CODE" />.</translation> @@ -4735,6 +4735,7 @@ <translation id="6196854373336333322">L'extensió <ph name="EXTENSION_NAME" /> ha passat a controlar la configuració del servidor intermediari. Això vol dir que pot modificar, desfer o espiar qualsevol acció que feu en línia. Si no esteu segur del motiu d'aquest canvi, és possible que no el vulgueu aplicar.</translation> <translation id="6198102561359457428">Tanca la sessió i torna-la a iniciar...</translation> <translation id="6198252989419008588">Canvia el PIN</translation> +<translation id="6200047250927636406">Descarta el fitxer</translation> <translation id="6202304368170870640">Pots utilitzar el PIN per iniciar la sessió al dispositiu o per desbloquejar-lo.</translation> <translation id="6206311232642889873">Cop&ia la imatge</translation> <translation id="6207200176136643843">Restableix el nivell de zoom predeterminat</translation> @@ -4820,7 +4821,6 @@ <ph name="DOMAIN" /> requereix que mantinguis la targeta intel·ligent inserida.</translation> <translation id="628352644014831790">4 segons</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> no se sol baixar i podria ser perillós.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Impressora nova a la xarxa}other{Impressores noves a la xarxa}}</translation> <translation id="6285770818046456882">El dispositiu que està compartint contingut amb tu ha cancel·lat la transferència</translation> <translation id="6290613030083731160">No hi ha cap dispositiu disponible a prop per compartir contingut. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="6291086328725007688">S'està verificant el codi d'activació. Aquest procés pot tardar uns minuts.</translation> @@ -5303,6 +5303,7 @@ <translation id="6831043979455480757">Tradueix</translation> <translation id="6833479554815567477">La pestanya s'ha suprimit del grup <ph name="GROUP_NAME" />: <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Canvia a un navegador intel·ligent i segur</translation> +<translation id="6834652994408928492">El mode fosc s'activarà automàticament al vespre</translation> <translation id="683540480453879381">Obre fitxers <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Connecteu-vos a Internet per actualitzar el dispositiu <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Pregunta'm quan un lloc web vulgui obrir i col·locar finestres a les pantalles (opció recomanada)</translation> @@ -6015,6 +6016,7 @@ <translation id="7622114377921274169">S'està carregant.</translation> <translation id="7622768823216805500">Els llocs web solen instal·lar gestors de pagament per a funcions de compra com ara una tramitació més senzilla</translation> <translation id="7622903810087708234">Detalls de la contrasenya</translation> +<translation id="7622966771025050155">Canvia a la pestanya capturada</translation> <translation id="7624337243375417909">bloqueig de majúscules desactivat</translation> <translation id="7625568159987162309">Mostra els permisos i les dades emmagatzemades als llocs web</translation> <translation id="7628201176665550262">Freqüència d'actualització</translation> @@ -6181,6 +6183,7 @@ <translation id="7784067724422331729">La configuració de seguretat del vostre ordinador ha bloquejat aquest fitxer.</translation> <translation id="7784796923038949829">No es poden llegir o canviar les dades del lloc web</translation> <translation id="778480864305029524">Per utilitzar la compartició de xarxa instantània, activa les notificacions per a Serveis de Google Play.</translation> +<translation id="7785471469930192436">Consulta les instruccions del teu motor de cerca per suprimir l'historial de cerques, si escau</translation> <translation id="7786889348652477777">&Tornar a carregar l'aplicació</translation> <translation id="7787308148023287649">Mostra en una altra pantalla</translation> <translation id="7788298548579301890">Un altre programa de l'ordinador ha afegit una aplicació que pot canviar el funcionament de Chrome. @@ -6794,6 +6797,7 @@ <translation id="8438566539970814960">Millora les cerques i la navegació</translation> <translation id="8439506636278576865">Proposa'm traduir pàgines en aquest idioma</translation> <translation id="8440630305826533614">Aplicacions per a Linux</translation> +<translation id="8446225304314102060">Canvia a la pestanya <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Més informació</translation> <translation id="8447409163267621480">Inclou la tecla Ctrl o Alt</translation> <translation id="8448729345478502352">Amplia o redueix els elements de la pantalla</translation> @@ -7455,6 +7459,7 @@ <translation id="9148058034647219655">Surt</translation> <translation id="9148126808321036104">Torna a iniciar la sessió</translation> <translation id="9148963623915467028">Aquest lloc web pot accedir a la teva ubicació.</translation> +<translation id="9149529198050266366">El mode fosc es desactivarà automàticament a l'alba</translation> <translation id="9149866541089851383">Edita...</translation> <translation id="9150045010208374699">Utilitzar la càmera</translation> <translation id="9150079578948279438">No s'ha pogut suprimir el perfil. Torna-ho a provar o contacta amb el teu operador per rebre assistència tècnica.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index feb286b..ac1a2fd9 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Zrušit spárování se zařízením Bluetooth</translation> <translation id="1651008383952180276">Musíte zadat dvakrát stejnou heslovou frázi</translation> <translation id="1652326691684645429">Aktivovat sdílení nablízko</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Přidejte tiskárnu do služby Google Cloud Print a tiskněte odkudkoli.}few{Přidejte # tiskárny do služby Google Cloud Print a tiskněte odkudkoli.}many{Přidejte # tiskárny do služby Google Cloud Print a tiskněte odkudkoli.}other{Přidejte # tiskáren do služby Google Cloud Print a tiskněte odkudkoli.}}</translation> <translation id="1653631694606464309">O povolení otevírat určité typy souborů obvykle webové aplikace žádají proto, abyste s danými soubory mohli pracovat, kde chcete (například abyste dokumenty mohli otevírat ve svém oblíbeném textovém procesoru)</translation> <translation id="1656528038316521561">Neprůhlednost pozadí</translation> <translation id="1657406563541664238">Pomozte <ph name="PRODUCT_NAME" /> zlepšit tím, že budete Googlu automaticky zasílat statistiky o využívání a zprávy o selhání aplikace</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Používáte nepodporované proměnné prostředí: <ph name="BAD_VAR" />. Bude to mít negativní vliv na stabilitu a zabezpečení.</translation> <translation id="4095264805865317199">Otevřít uživatelské rozhraní k aktivaci mobilní sítě</translation> <translation id="4095507791297118304">Primární obrazovka</translation> -<translation id="409579654357498729">Přidat do služby Cloud Print</translation> <translation id="4096508467498758490">Deaktivovat rozšíření v režimu pro vývojáře</translation> <translation id="4097406557126260163">Aplikace a rozšíření</translation> <translation id="409742781329613461">Tipy pro Chrome</translation> @@ -4378,6 +4376,7 @@ <translation id="5794700615121138172">Sdílené složky Linuxu</translation> <translation id="5794786537412027208">Ukončit všechny aplikace Chrome</translation> <translation id="5797070761912323120">Google vaši historii může používat k personalizaci Vyhledávání, reklam a dalších služeb Google</translation> +<translation id="5797521893972859201">Vymaže historii, včetně vyhledávacího pole</translation> <translation id="5798079537501238810">Weby mohou instalovat obslužné nástroje plateb</translation> <translation id="579907812742603813">chráněný obsah</translation> <translation id="579915268381781820">Bezpečnostní klíč byl odpojen.</translation> @@ -4461,6 +4460,7 @@ <translation id="5900302528761731119">Profilová fotka Google</translation> <translation id="590036993063074298">Podrobnosti o kvalitě zrcadlení</translation> <translation id="5901069264981746702">Váš otisk prstu je bezpečně uložen a nikdy neopouští <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Přepnout na zachycující kartu</translation> <translation id="5901494423252125310">Dvířka tiskárny jsou otevřená</translation> <translation id="5901630391730855834">Žlutá</translation> <translation id="5904614460720589786">Nastavení aplikace <ph name="APP_NAME" /> se kvůli problému s konfigurací nezdařilo. Obraťte se na administrátora. Kód chyby: <ph name="ERROR_CODE" />.</translation> @@ -4733,6 +4733,7 @@ <translation id="6196854373336333322">Rozšíření <ph name="EXTENSION_NAME" /> převzalo kontrolu nad nastavením proxy serveru, což znamená, že může změnit, narušit nebo sledovat vše, co děláte na internetu. Pokud si nejste jisti, proč k tomu došlo, zřejmě se jedná o nežádoucí změnu.</translation> <translation id="6198102561359457428">Odhlaste se a poté se znovu přihlaste...</translation> <translation id="6198252989419008588">Změnit kód PIN</translation> +<translation id="6200047250927636406">Zahodit soubor</translation> <translation id="6202304368170870640">Pomocí kódu PIN se můžete přihlásit na zařízení nebo jej odemknout.</translation> <translation id="6206311232642889873">&Kopírovat obrázek</translation> <translation id="6207200176136643843">Obnovit výchozí úroveň přiblížení</translation> @@ -4818,7 +4819,6 @@ <ph name="DOMAIN" /> vyžaduje, abyste čipovou kartu ponechali vloženou.</translation> <translation id="628352644014831790">4 sekundy</translation> <translation id="6285120108426285413">Soubor <ph name="FILE_NAME" /> se běžně nestahuje a může být nebezpečný.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nová tiskárna v síti}few{Nové tiskárny v síti}many{Nové tiskárny v síti}other{Nové tiskárny v síti}}</translation> <translation id="6285770818046456882">Zařízení, které s vámi sdílí obsah, přenos zrušilo</translation> <translation id="6290613030083731160">V okolí nejsou dostupná žádná zařízení sdílející obsah. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Ověřování aktivačního kódu. Může to trvat několik minut.</translation> @@ -5301,6 +5301,7 @@ <translation id="6831043979455480757">Přeložit</translation> <translation id="6833479554815567477">Karta byla odstraněna ze skupiny <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Přejděte na chytrý a zabezpečený prohlížeč</translation> +<translation id="6834652994408928492">Tmavý režim se zapne automaticky za soumraku</translation> <translation id="683540480453879381">Otevírat soubory <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Chcete-li zařízení <ph name="DEVICE_TYPE" /> aktualizovat, připojte se k internetu.</translation> <translation id="6838034009068684089">Zeptat se, když chce web otevřít okna a umístit je na obrazovky (doporučeno)</translation> @@ -6013,6 +6014,7 @@ <translation id="7622114377921274169">Nabíjení.</translation> <translation id="7622768823216805500">Weby obvykle instalují obslužné nástroje plateb pro funkce nákupů, jako je jednodušší pokladna</translation> <translation id="7622903810087708234">Podrobnosti hesla</translation> +<translation id="7622966771025050155">Přepnout na zachycenou kartu</translation> <translation id="7624337243375417909">caps lock je vypnut</translation> <translation id="7625568159987162309">Zobrazit oprávnění a uložená data webů</translation> <translation id="7628201176665550262">Obnovovací frekvence</translation> @@ -6179,6 +6181,7 @@ <translation id="7784067724422331729">Tento soubor byl zablokován nastavením zabezpečení vašeho počítače.</translation> <translation id="7784796923038949829">Nelze přečíst či změnit data webu</translation> <translation id="778480864305029524">Chcete-li používat dynamický tethering, zapněte oznámení Služeb Google Play.</translation> +<translation id="7785471469930192436">Prostudujte si pokyny vyhledávače pro smazání historie vyhledávání (pokud je k dispozici).</translation> <translation id="7786889348652477777">Znovu načíst &aplikaci</translation> <translation id="7787308148023287649">Zobrazit na jiné obrazovce</translation> <translation id="7788298548579301890">Jiný program ve vašem počítači nainstaloval aplikaci, která může měnit funkce Chromu. @@ -6789,6 +6792,7 @@ <translation id="8438566539970814960">Vylepšit vyhledávání a procházení</translation> <translation id="8439506636278576865">Nabízet překlad stránek v tomto jazyce</translation> <translation id="8440630305826533614">Aplikace pro Linux</translation> +<translation id="8446225304314102060">Přepnout na kartu <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Další informace</translation> <translation id="8447409163267621480">Zahrňte klávesu Ctrl nebo Alt</translation> <translation id="8448729345478502352">Umožňuje zvětšit nebo zmenšit položky na obrazovce</translation> @@ -7452,6 +7456,7 @@ <translation id="9148058034647219655">Ukončit</translation> <translation id="9148126808321036104">Znovu přihlásit</translation> <translation id="9148963623915467028">Tento web má přístup k vaší poloze.</translation> +<translation id="9149529198050266366">Tmavý režim se vypne automaticky za úsvitu</translation> <translation id="9149866541089851383">Upravit...</translation> <translation id="9150045010208374699">Používat fotoaparát</translation> <translation id="9150079578948279438">Profil se nepodařilo odstranit. Zkuste to znovu nebo požádejte o technickou podporu operátora.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 3a39bc2..b65f2f8 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">Fjern parring af Bluetooth-enhed</translation> <translation id="1651008383952180276">Du skal angive den samme adgangssætning to gange</translation> <translation id="1652326691684645429">Slå Deling tæt på til</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Føj printeren til Google Cloudprinter, så du kan udskrive, uanset hvor du befinder dig.}one{Føj # printere til Google Cloudprinter, så du kan udskrive, uanset hvor du befinder dig.}other{Føj # printere til Google Cloudprinter, så du kan udskrive, uanset hvor du befinder dig.}}</translation> <translation id="1653631694606464309">Webapps anmoder typisk om at åbne visse typer af filer, så du kan arbejde i de pågældende filer, hvor det passer dig, f.eks. åbning af dokumenter i dit foretrukne tekstbehandlingsprogram</translation> <translation id="1656528038316521561">Baggrundens gennemsigtighed</translation> <translation id="1657406563541664238">Vær med til at gøre <ph name="PRODUCT_NAME" /> bedre ved automatisk at sende forbrugsstatistikker og rapportere om nedbrud til Google</translation> @@ -2919,7 +2918,6 @@ <translation id="4094647278880271855">Du bruger en variabel for miljøet, der ikke understøttes: <ph name="BAD_VAR" />. Dette går ud over stabiliteten og sikkerheden.</translation> <translation id="4095264805865317199">Åbn brugerflade for aktivering af mobildata</translation> <translation id="4095507791297118304">Primær skærm</translation> -<translation id="409579654357498729">Føj til Cloudprinter</translation> <translation id="4096508467498758490">Deaktiver udvidelser, der kører i udviklertilstand</translation> <translation id="4097406557126260163">Apps og udvidelser</translation> <translation id="409742781329613461">Tips til Chrome</translation> @@ -4396,6 +4394,7 @@ <translation id="5794700615121138172">Delte mapper i Linux</translation> <translation id="5794786537412027208">Afslut alle Chrome-apps</translation> <translation id="5797070761912323120">Google kan bruge din historik til at tilpasse Søgning, annoncer og andre Google-tjenester</translation> +<translation id="5797521893972859201">Rydder historikken, herunder fra søgefeltet</translation> <translation id="5798079537501238810">Websites kan installere betalingshandlere</translation> <translation id="579907812742603813">beskyttet indhold</translation> <translation id="579915268381781820">Din sikkerhedsnøgle blev fjernet.</translation> @@ -4479,6 +4478,7 @@ <translation id="5900302528761731119">Google-profilbillede</translation> <translation id="590036993063074298">Oplysninger om spejlingskvaliteten</translation> <translation id="5901069264981746702">Dine fingeraftryksdata gemmes sikkert og forlader aldrig din <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Skift til den fane, der registreres</translation> <translation id="5901494423252125310">Lågen på printeren er åben</translation> <translation id="5901630391730855834">Gul</translation> <translation id="5904614460720589786"><ph name="APP_NAME" /> kunne ikke konfigureres, da der opstod et konfigurationsproblem. Kontakt din administrator. Fejlkode: <ph name="ERROR_CODE" />.</translation> @@ -4751,6 +4751,7 @@ <translation id="6196854373336333322">Udvidelsen <ph name="EXTENSION_NAME" /> har taget kontrol over dine proxyindstillinger, hvilket betyder, at den kan ændre, ødelægge eller aflytte alt, hvad du foretager dig på nettet. Hvis du ikke er sikker på, hvorfor denne ændring er sket, er den sandsynligvis uønsket.</translation> <translation id="6198102561359457428">Log ud, og log derefter ind igen...</translation> <translation id="6198252989419008588">Skift pinkode</translation> +<translation id="6200047250927636406">Kassér fil</translation> <translation id="6202304368170870640">Du kan bruge din pinkode til at logge ind på din enhed eller låse den op.</translation> <translation id="6206311232642889873">Ko&pier billede</translation> <translation id="6207200176136643843">Nulstil til standardniveauet for zoom</translation> @@ -4836,7 +4837,6 @@ <ph name="DOMAIN" /> kræver, at chipkortet er indsat.</translation> <translation id="628352644014831790">4 sekunder</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> downloades normalt ikke og kan være skadelig.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny printer på dit netværk}one{Nye printere på dit netværk}other{Nye printere på dit netværk}}</translation> <translation id="6285770818046456882">Den enhed, der deler med dig, annullerede overførslen</translation> <translation id="6290613030083731160">Der er ingen enheder, som deler i nærheden. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktiveringskoden bekræftes. Dette kan tage et par minutter.</translation> @@ -5319,6 +5319,7 @@ <translation id="6831043979455480757">Oversæt</translation> <translation id="6833479554815567477">Fanen blev fjernet fra gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Skift til en smart og sikker browser</translation> +<translation id="6834652994408928492">Mørk tilstand aktiveres automatisk ved solnedgang</translation> <translation id="683540480453879381">Åbne <ph name="FILE_EXTENSIONS" />-filer</translation> <translation id="6835762382653651563">Opret forbindelse til internettet for at opdatere din <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Spørg, når et website vil åbne og placere vinduer på dine skærme (anbefales)</translation> @@ -6031,6 +6032,7 @@ <translation id="7622114377921274169">Oplader.</translation> <translation id="7622768823216805500">Websites installerer normalt betalingshandlere til shoppingformål såsom nemmere betaling</translation> <translation id="7622903810087708234">Oplysninger om adgangskode</translation> +<translation id="7622966771025050155">Skift til den registrerede fane</translation> <translation id="7624337243375417909">capslock er slået fra</translation> <translation id="7625568159987162309">Se tilladelser og data, der er gemt på alle websites</translation> <translation id="7628201176665550262">Opdateringshastighed</translation> @@ -6197,6 +6199,7 @@ <translation id="7784067724422331729">Sikkerhedsindstillingerne på din computer blokerede denne fil.</translation> <translation id="7784796923038949829">Kan hverken læse eller ændre websitedata</translation> <translation id="778480864305029524">Hvis du vil bruge Øjeblikkelig netdeling, skal du aktivere notifikationer om Google Play-tjenester.</translation> +<translation id="7785471469930192436">Se din søgemaskines vejledning i, hvordan du sletter din søgehistorik, hvis det er relevant</translation> <translation id="7786889348652477777">&Genindlæs app</translation> <translation id="7787308148023287649">Vis på en anden skærm</translation> <translation id="7788298548579301890">Et andet program på din computer har tilføjet en app, som kan ændre måden, Chrome fungerer på. @@ -6808,6 +6811,7 @@ <translation id="8438566539970814960">Gør søgninger og browsing endnu bedre</translation> <translation id="8439506636278576865">Tilbyd at oversætte sider på dette sprog</translation> <translation id="8440630305826533614">Linux-apps</translation> +<translation id="8446225304314102060">Skift til fanen <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Få flere oplysninger</translation> <translation id="8447409163267621480">Skal indeholde enten Ctrl eller Alt</translation> <translation id="8448729345478502352">Gør elementer på skærmen mindre eller større</translation> @@ -7471,6 +7475,7 @@ <translation id="9148058034647219655">Afslut</translation> <translation id="9148126808321036104">Log ind igen</translation> <translation id="9148963623915467028">Dette website har adgang til din placering.</translation> +<translation id="9149529198050266366">Mørk tilstand deaktiveres automatisk ved solopgang</translation> <translation id="9149866541089851383">Rediger...</translation> <translation id="9150045010208374699">Bruge dit kamera</translation> <translation id="9150079578948279438">Profilen kunne ikke fjernes. Prøv igen, eller kontakt dit mobilselskab for at få teknisk support.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 5deba6e..92dbbd3 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">Bluetooth-Gerät entkoppeln</translation> <translation id="1651008383952180276">Sie müssen zweimal dieselbe Passphrase eingeben</translation> <translation id="1652326691684645429">Nearby Share aktivieren</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Fügen Sie den Drucker zu Google Cloud Print hinzu, damit Sie von überall aus drucken können.}other{Fügen Sie # Drucker zu Google Cloud Print hinzu, damit Sie von überall aus drucken können.}}</translation> <translation id="1653631694606464309">Webanwendungen fragen in der Regel nach, ob sie bestimmte Dateitypen öffnen können, damit Sie die Dateien von überall aus bearbeiten können, beispielsweise in Ihrem bevorzugten Textverarbeitungsprogramm</translation> <translation id="1656528038316521561">Deckkraft des Hintergrunds</translation> <translation id="1657406563541664238">Zur Verbesserung von <ph name="PRODUCT_NAME" /> Nutzungsstatistiken und Absturzberichte automatisch an Google senden</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">Sie verwenden eine nicht unterstützte Umgebungsvariable: <ph name="BAD_VAR" />. Dadurch werden Stabilität und Sicherheit beeinträchtigt.</translation> <translation id="4095264805865317199">Benutzeroberfläche für Mobilfunkaktivierung öffnen</translation> <translation id="4095507791297118304">Hauptbildschirm</translation> -<translation id="409579654357498729">Zu Cloud Print hinzufügen</translation> <translation id="4096508467498758490">Erweiterungen im Entwicklermodus deaktivieren</translation> <translation id="4097406557126260163">Apps und Erweiterungen</translation> <translation id="409742781329613461">Tipps für Chrome</translation> @@ -4374,6 +4372,7 @@ <translation id="5794700615121138172">Freigegebene Linux-Ordner</translation> <translation id="5794786537412027208">Alle Chrome-Apps beenden</translation> <translation id="5797070761912323120">Anhand Ihres Verlaufs kann Google die Google Suche, Werbung und andere Google-Dienste personalisieren</translation> +<translation id="5797521893972859201">Löscht den Verlauf, auch im Suchfeld</translation> <translation id="5798079537501238810">Websites dürfen Zahlungs-Handler installieren</translation> <translation id="579907812742603813">Geschützte Inhalte</translation> <translation id="579915268381781820">Ihr Sicherheitsschlüssel wurde entfernt.</translation> @@ -4457,6 +4456,7 @@ <translation id="5900302528761731119">Google Profile-Foto</translation> <translation id="590036993063074298">Details zur Qualität der Spiegelung</translation> <translation id="5901069264981746702">Ihr Fingerabdruck wird sicher und niemals außerhalb Ihres Geräts (<ph name="DEVICE_TYPE" />) gespeichert. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Zum aufnehmenden Tab wechseln</translation> <translation id="5901494423252125310">Druckerklappe offen</translation> <translation id="5901630391730855834">Gelb</translation> <translation id="5904614460720589786"><ph name="APP_NAME" /> konnte aufgrund eines Konfigurationsproblems nicht eingerichtet werden. Bitte wenden Sie sich an Ihren Administrator. Fehlercode: <ph name="ERROR_CODE" />.</translation> @@ -4729,6 +4729,7 @@ <translation id="6196854373336333322">Die Erweiterung <ph name="EXTENSION_NAME" /> hat die Kontrolle über Ihre Proxyeinstellungen übernommen. Das bedeutet, dass sie sämtliche Onlineaktivitäten ändern, abbrechen oder überwachen kann. Wenn Sie nicht sicher sind, wie es zu dieser Änderung gekommen ist, war sie wahrscheinlich nicht beabsichtigt.</translation> <translation id="6198102561359457428">Abmelden und dann erneut anmelden...</translation> <translation id="6198252989419008588">PIN ändern</translation> +<translation id="6200047250927636406">Datei verwerfen</translation> <translation id="6202304368170870640">Mit Ihrer PIN können Sie sich auf Ihrem Gerät anmelden oder es entsperren.</translation> <translation id="6206311232642889873">Bild kop&ieren</translation> <translation id="6207200176136643843">Auf Standard-Zoomstufe zurücksetzen</translation> @@ -4814,7 +4815,6 @@ <ph name="DOMAIN" /> erfordert, dass deine Smartcard eingesteckt ist.</translation> <translation id="628352644014831790">4 Sekunden</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ist ein ungewöhnlicher Download und könnte schädlich sein.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Neuer Drucker in Ihrem Netzwerk gefunden}other{Neue Drucker in Ihrem Netzwerk gefunden}}</translation> <translation id="6285770818046456882">Das Gerät, das Daten mit Ihnen geteilt hat, hat die Übertragung abgebrochen</translation> <translation id="6290613030083731160">Keine Geräte in der Nähe verfügbar, die Daten teilen. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktivierungscode wird geprüft. Das kann einige Minuten dauern.</translation> @@ -5294,6 +5294,7 @@ <translation id="6831043979455480757">Übersetzen</translation> <translation id="6833479554815567477">Tab wurde aus folgender Gruppe entfernt: <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Steigen Sie auf einen intelligenten und sicheren Browser um</translation> +<translation id="6834652994408928492">Dunkler Modus wird bei Sonnenuntergang automatisch aktiviert</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" />-Dateien öffnen</translation> <translation id="6835762382653651563">Stellen Sie eine Internetverbindung her, um Ihr Gerät (<ph name="DEVICE_TYPE" />) zu aktualisieren.</translation> <translation id="6838034009068684089">Nachfragen, wenn eine Website Fenster auf meinen Bildschirmen öffnen und platzieren möchte (empfohlen)</translation> @@ -6006,6 +6007,7 @@ <translation id="7622114377921274169">Wird aufgeladen.</translation> <translation id="7622768823216805500">Websites installieren normalerweise Zahlungs-Handler für Einkaufsfunktionen wie eine schnellere Bezahlung</translation> <translation id="7622903810087708234">Passwortdetails</translation> +<translation id="7622966771025050155">Zum aufgenommenen Tab wechseln</translation> <translation id="7624337243375417909">Feststelltaste aus</translation> <translation id="7625568159987162309">Nach Websites sortierte Berechtigungen und gespeicherte Daten aufrufen</translation> <translation id="7628201176665550262">Aktualisierungsrate</translation> @@ -6172,6 +6174,7 @@ <translation id="7784067724422331729">Diese Datei wurde von den Sicherheitseinstellungen auf Ihrem Computer blockiert.</translation> <translation id="7784796923038949829">Daten der Website können nicht gelesen oder geändert werden</translation> <translation id="778480864305029524">Zum Verwenden von Instant Tethering Benachrichtigungen für Google Play-Dienste aktivieren.</translation> +<translation id="7785471469930192436">Informationen zum Löschen Ihres Suchverlaufs finden Sie in der Anleitung Ihrer Suchmaschine</translation> <translation id="7786889348652477777">App &neu laden</translation> <translation id="7787308148023287649">Anzeige auf einem anderen Display</translation> <translation id="7788298548579301890">Ein anderes Programm auf Ihrem Computer hat eine App hinzugefügt, die sich möglicherweise auf die Funktionsweise von Chrome auswirkt. @@ -6783,6 +6786,7 @@ <translation id="8438566539970814960">Suchanfragen und das Surfen verbessern</translation> <translation id="8439506636278576865">Übersetzung für Seiten in dieser Sprache anbieten</translation> <translation id="8440630305826533614">Linux-Apps</translation> +<translation id="8446225304314102060">Zum Tab „<ph name="TAB_ORIGIN" />“ wechseln</translation> <translation id="8446884382197647889">Weitere Informationen</translation> <translation id="8447409163267621480">Entweder Strg oder Alt integrieren</translation> <translation id="8448729345478502352">Die Elemente auf dem Bildschirm vergrößern oder verkleinern</translation> @@ -7444,6 +7448,7 @@ <translation id="9148058034647219655">Beenden</translation> <translation id="9148126808321036104">Erneut anmelden</translation> <translation id="9148963623915467028">Diese Website hat Zugriff auf Ihren Standort.</translation> +<translation id="9149529198050266366">Dunkler Modus wird bei Sonnenaufgang automatisch deaktiviert</translation> <translation id="9149866541089851383">Bearbeiten...</translation> <translation id="9150045010208374699">Ihre Kamera verwenden</translation> <translation id="9150079578948279438">Das Profil konnte nicht entfernt werden. Bitte versuchen Sie es noch einmal oder wenden Sie sich an den technischen Support.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 931aaf0..7e4734e6 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Διακοπή σύζευξης συσκευής Bluetooth</translation> <translation id="1651008383952180276">Πρέπει να εισαγάγετε δύο φορές την ίδια φράση πρόσβασης</translation> <translation id="1652326691684645429">Ενεργοποίηση Κοινοποίησης κοντά</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Προσθέστε τον εκτυπωτή στο Google Cloud Print, για να μπορείτε να εκτυπώνετε όπου και αν βρίσκεστε.}other{Προσθέστε # εκτυπωτές στο Google Cloud Print, για να μπορείτε να εκτυπώνετε όπου και αν βρίσκεστε.}}</translation> <translation id="1653631694606464309">Συνήθως, οι εφαρμογές ιστού ρωτούν για να ανοίξουν συγκεκριμένους τύπους αρχείων για να μπορείτε να εργαστείτε σε αυτά τα αρχεία όπου επιθυμείτε, όπως για το άνοιγμα εγγράφων στο πρόγραμμα επεξεργασίας κειμένου που προτιμάτε</translation> <translation id="1656528038316521561">Αδιαφάνεια φόντου</translation> <translation id="1657406563541664238">Συμβάλετε στη βελτίωση του <ph name="PRODUCT_NAME" /> στέλνοντας αυτόματα στην Google στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Χρησιμοποιείτε μη υποστηριζόμενη μεταβλητή περιβάλλοντος: <ph name="BAD_VAR" />. Αυτό θα επηρεάσει αρνητικά τη σταθερότητα και την ασφάλεια.</translation> <translation id="4095264805865317199">Άνοιγμα διεπαφής χρήστη ενεργοποίησης δικτύου κινητής τηλεφωνίας</translation> <translation id="4095507791297118304">Κύρια οθόνη</translation> -<translation id="409579654357498729">Προσθήκη στο Cloud Print</translation> <translation id="4096508467498758490">Απενεργοποίηση επεκτάσεων λειτουργίας προγραμματιστή</translation> <translation id="4097406557126260163">Εφαρμογές και επεκτάσεις</translation> <translation id="409742781329613461">Συμβουλές για το Chrome</translation> @@ -4396,6 +4394,7 @@ <translation id="5794700615121138172">Κοινόχρηστοι φάκελοι Linux</translation> <translation id="5794786537412027208">Τερματισμός όλων των εφαρμογών του Chrome</translation> <translation id="5797070761912323120">Η Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google</translation> +<translation id="5797521893972859201">Διαγράφει το ιστορικό, συμπεριλαμβανομένου του πλαισίου αναζήτησης.</translation> <translation id="5798079537501238810">Οι ιστότοποι μπορούν να εγκαθιστούν δείκτες χειρισμού πληρωμής</translation> <translation id="579907812742603813">προστατευμένο περιεχόμενο</translation> <translation id="579915268381781820">Το κλειδί ασφαλείας καταργήθηκε.</translation> @@ -4479,6 +4478,7 @@ <translation id="5900302528761731119">Φωτογραφία προφίλ Google</translation> <translation id="590036993063074298">Λεπτομέρειες ποιότητας κατοπτρισμού</translation> <translation id="5901069264981746702">Τα δεδομένα δακτυλικών αποτυπωμάτων σας αποθηκεύονται με ασφάλεια και παραμένουν πάντα στη συσκευή <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Μετάβαση στην καρτέλα λήψης σε εξέλιξη</translation> <translation id="5901494423252125310">Η θύρα του εκτυπωτή είναι ανοικτή</translation> <translation id="5901630391730855834">Κίτρινο</translation> <translation id="5904614460720589786">Δεν ήταν δυνατή η ρύθμιση της εφαρμογής <ph name="APP_NAME" /> λόγω προβλήματος διαμόρφωσης. Επικοινωνήστε με τον διαχειριστή. Κωδικός σφάλματος: <ph name="ERROR_CODE" />.</translation> @@ -4751,6 +4751,7 @@ <translation id="6196854373336333322">Η επέκταση "<ph name="EXTENSION_NAME" />" ελέγχει τις ρυθμίσεις διακομιστή μεσολάβησης. Αυτό σημαίνει ότι μπορεί να αλλάξει, να διακόψει ή να παρακολουθήσει όλες τις ενέργειες που εκτελείτε στο διαδίκτυο. Εάν δεν είστε βέβαιοι για το λόγο αυτής της αλλαγής, πιθανότατα να μην την επιθυμούσατε.</translation> <translation id="6198102561359457428">Αποσυνδεθείτε και συνδεθείτε ξανά...</translation> <translation id="6198252989419008588">Αλλαγή PIN</translation> +<translation id="6200047250927636406">Απόρριψη αρχείου</translation> <translation id="6202304368170870640">Μπορείτε να χρησιμοποιήσετε το PIN σας για να συνδεθείτε ή να ξεκλειδώσετε τη συσκευή σας.</translation> <translation id="6206311232642889873">Αντι&γραφή Εικόνας</translation> <translation id="6207200176136643843">Επαναφορά στο προεπιλεγμένο επίπεδο εστίασης</translation> @@ -4836,7 +4837,6 @@ Ο τομέας <ph name="DOMAIN" /> απαιτεί να μην αφαιρέσετε την έξυπνη κάρτα.</translation> <translation id="628352644014831790">4 δευτερόλεπτα</translation> <translation id="6285120108426285413">Η λήψη του αρχείου <ph name="FILE_NAME" /> δεν είναι συνήθης και μπορεί να είναι επικίνδυνη.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Εντοπίστηκε νέος εκτυπωτής στο δίκτυό σας}other{Εντοπίστηκαν νέοι εκτυπωτές στο δίκτυό σας}}</translation> <translation id="6285770818046456882">Η συσκευή που μοιράζεται περιεχόμενο μαζί σας ακύρωσε τη μεταφορά.</translation> <translation id="6290613030083731160">Δεν υπάρχουν διαθέσιμες συσκευές για κοινή χρήση περιεχομένου σε κοντινή απόσταση. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Επαλήθευση κωδικού ενεργοποίησης. Ενδέχεται να χρειαστούν μερικά λεπτά.</translation> @@ -5319,6 +5319,7 @@ <translation id="6831043979455480757">Μετάφραση</translation> <translation id="6833479554815567477">Η καρτέλα καταργήθηκε από την ομάδα <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Κάντε εναλλαγή σε ένα έξυπνο και ασφαλές πρόγραμμα περιήγησης</translation> +<translation id="6834652994408928492">Η Λειτουργία χαμηλού φωτισμού θα ενεργοποιείται αυτόματα κατά τη δύση του ηλίου</translation> <translation id="683540480453879381">Άνοιγμα αρχείων <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Συνδεθείτε στο Διαδίκτυο για να ενημερώσετε τη συσκευή σας <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Να γίνεται ερώτηση όταν ένας ιστότοπος θέλει να ανοίξει και να τοποθετήσει παράθυρα στις οθόνες σας (συνιστάται)</translation> @@ -6031,6 +6032,7 @@ <translation id="7622114377921274169">Φόρτιση σε εξέλιξη.</translation> <translation id="7622768823216805500">Οι ιστότοποι εγκαθιστούν συνήθως δείκτες χειρισμού πληρωμών για λειτουργίες αγορών, όπως η ευκολότερη ολοκλήρωση αγοράς.</translation> <translation id="7622903810087708234">Λεπτομέρειες κωδικού πρόσβασης</translation> +<translation id="7622966771025050155">Μετάβαση στην καρτέλα ολοκλήρωσης λήψης</translation> <translation id="7624337243375417909">η λειτουργία Caps Lock ενεργοποιήθηκε</translation> <translation id="7625568159987162309">Δείτε άδειες και δεδομένα που έχουν αποθηκευτεί σε ιστοτόπους</translation> <translation id="7628201176665550262">Ρυθμός ανανέωσης</translation> @@ -6197,6 +6199,7 @@ <translation id="7784067724422331729">Οι ρυθμίσεις ασφαλείας του υπολογιστή σας απέκλεισαν αυτό το αρχείο.</translation> <translation id="7784796923038949829">Δεν είναι δυνατή η ανάγνωση ή η αλλαγή των δεδομένων του ιστοτόπου</translation> <translation id="778480864305029524">Για να χρησιμοποιήσετε την Άμεση σύνδεση, ενεργοποιήστε τις ειδοποιήσεις για τις Υπηρεσίες Google Play.</translation> +<translation id="7785471469930192436">Ανατρέξτε στις οδηγίες της μηχανής αναζήτησης σχετικά με τη διαγραφή του ιστορικού αναζήτησής σας, εφόσον υπάρχουν.</translation> <translation id="7786889348652477777">Ε&πανάληψη φόρτωσης εφαρμογής</translation> <translation id="7787308148023287649">Προβολή σε άλλη οθόνη</translation> <translation id="7788298548579301890">Κάποιο άλλο πρόγραμμα στον υπολογιστή σας πρόσθεσε μια εφαρμογή, η οποία μπορεί να αλλάξει τον τρόπο λειτουργίας του Chrome. @@ -6809,6 +6812,7 @@ <translation id="8438566539970814960">Βελτιώστε τις αναζητήσεις και την περιήγηση</translation> <translation id="8439506636278576865">Ερώτηση για τη μετάφραση σελίδων σε αυτήν τη γλώσσα</translation> <translation id="8440630305826533614">Εφαρμογές Linux</translation> +<translation id="8446225304314102060">Μετάβαση στην καρτέλα <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Μάθετε περισσότερα</translation> <translation id="8447409163267621480">Συμπερίληψη είτε του Ctrl είτε του Alt</translation> <translation id="8448729345478502352">Κάντε τα στοιχεία στην οθόνη μικρότερα ή μεγαλύτερα</translation> @@ -7468,6 +7472,7 @@ <translation id="9148058034647219655">Έξοδος</translation> <translation id="9148126808321036104">Συνδεθείτε ξανά</translation> <translation id="9148963623915467028">Ο ιστότοπος έχει πρόσβαση στην τοποθεσία σας.</translation> +<translation id="9149529198050266366">Η Λειτουργία χαμηλού φωτισμού θα απενεργοποιείται αυτόματα κατά την ανατολή του ηλίου</translation> <translation id="9149866541089851383">Επεξεργασία...</translation> <translation id="9150045010208374699">Χρήση της κάμεράς σας</translation> <translation id="9150079578948279438">Δεν ήταν δυνατή η κατάργηση του προφίλ. Δοκιμάστε ξανά ή επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για τεχνική υποστήριξη.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 0bc7821..7dba129 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Unpair Bluetooth device</translation> <translation id="1651008383952180276">You must enter the same passphrase twice</translation> <translation id="1652326691684645429">Enable Nearby Share</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Add the printer to Google Cloud Print so that you can print from anywhere.}other{Add # printers to Google Cloud Print so that you can print from anywhere.}}</translation> <translation id="1653631694606464309">Web apps typically ask to open certain types of files so that you can work on those files where you want, like opening documents in your preferred word processor</translation> <translation id="1656528038316521561">Background opacity</translation> <translation id="1657406563541664238">Help make <ph name="PRODUCT_NAME" /> better by automatically sending usage statistics and crash reports to Google.</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">You are using an unsupported environment variable: <ph name="BAD_VAR" />. Stability and security will suffer.</translation> <translation id="4095264805865317199">Open Mobile Activation UI</translation> <translation id="4095507791297118304">Primary display</translation> -<translation id="409579654357498729">Add to Cloud Print</translation> <translation id="4096508467498758490">Disable developer mode extensions</translation> <translation id="4097406557126260163">Apps and extensions</translation> <translation id="409742781329613461">Tips for Chrome</translation> @@ -4395,6 +4393,7 @@ <translation id="5794700615121138172">Linux shared folders</translation> <translation id="5794786537412027208">Quit all Chrome Apps</translation> <translation id="5797070761912323120">Google may use your history to personalise Search, ads and other Google services</translation> +<translation id="5797521893972859201">Clears history, including in the search box</translation> <translation id="5798079537501238810">Sites can install payment handlers</translation> <translation id="579907812742603813">protected content</translation> <translation id="579915268381781820">Your security key was removed.</translation> @@ -4478,6 +4477,7 @@ <translation id="5900302528761731119">Google Profile photo</translation> <translation id="590036993063074298">Mirroring quality details</translation> <translation id="5901069264981746702">Your fingerprint data is stored securely and never leaves your <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Switch to capturing tab</translation> <translation id="5901494423252125310">Printer door open</translation> <translation id="5901630391730855834">Yellow</translation> <translation id="5904614460720589786">Couldn't set up <ph name="APP_NAME" /> because of a configuration problem. Please contact your administrator. Error code: <ph name="ERROR_CODE" />.</translation> @@ -4750,6 +4750,7 @@ <translation id="6196854373336333322">The extension "<ph name="EXTENSION_NAME" />" has taken control of your proxy settings, which means it can change, break or eavesdrop on anything you do online. If you aren't sure why this change happened, you probably don't want it.</translation> <translation id="6198102561359457428">Sign out then sign in again...</translation> <translation id="6198252989419008588">Change PIN</translation> +<translation id="6200047250927636406">Discard file</translation> <translation id="6202304368170870640">You can use your PIN to sign in to or unlock your device.</translation> <translation id="6206311232642889873">Cop&y Image</translation> <translation id="6207200176136643843">Reset to default zoom level</translation> @@ -4835,7 +4836,6 @@ <ph name="DOMAIN" /> requires you to keep your smart card inserted.</translation> <translation id="628352644014831790">4 seconds</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> is not commonly downloaded and may be dangerous.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{New printer on your network}other{New printers on your network}}</translation> <translation id="6285770818046456882">The device sharing with you cancelled the transfer</translation> <translation id="6290613030083731160">No available devices sharing nearby. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verifying activation code. This may take a few minutes.</translation> @@ -5318,6 +5318,7 @@ <translation id="6831043979455480757">Translate</translation> <translation id="6833479554815567477">Tab removed from group <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Switch to a smart and secure browser</translation> +<translation id="6834652994408928492">Dark mode will turn on automatically at sunset</translation> <translation id="683540480453879381">Open <ph name="FILE_EXTENSIONS" /> files</translation> <translation id="6835762382653651563">Please connect to the Internet to update your <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Ask when a site wants to open and place windows on your screens (recommended)</translation> @@ -6030,6 +6031,7 @@ <translation id="7622114377921274169">Charging.</translation> <translation id="7622768823216805500">Sites usually install payment handlers for shopping features like easier checkout</translation> <translation id="7622903810087708234">Password details</translation> +<translation id="7622966771025050155">Switch to captured tab</translation> <translation id="7624337243375417909">caps lock off</translation> <translation id="7625568159987162309">View permissions and data stored across sites</translation> <translation id="7628201176665550262">Refresh rate</translation> @@ -6196,6 +6198,7 @@ <translation id="7784067724422331729">Security settings on your computer blocked this file.</translation> <translation id="7784796923038949829">Can't read or change site's data</translation> <translation id="778480864305029524">To use Instant Tethering, turn on notifications for Google Play Services.</translation> +<translation id="7785471469930192436">See your search engine's instructions for deleting your search history, if applicable</translation> <translation id="7786889348652477777">&Reload App</translation> <translation id="7787308148023287649">Display on another screen</translation> <translation id="7788298548579301890">Another program on your computer added an app that may change the way Chrome works. @@ -6808,6 +6811,7 @@ <translation id="8438566539970814960">Make searches and browsing better</translation> <translation id="8439506636278576865">Offer to translate pages in this language</translation> <translation id="8440630305826533614">Linux apps</translation> +<translation id="8446225304314102060">Switch to tab <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Learn More</translation> <translation id="8447409163267621480">Include either Ctrl or Alt</translation> <translation id="8448729345478502352">Make items on your screen smaller or larger</translation> @@ -7469,6 +7473,7 @@ <translation id="9148058034647219655">Exit</translation> <translation id="9148126808321036104">Sign in again</translation> <translation id="9148963623915467028">This site can access your location.</translation> +<translation id="9149529198050266366">Dark mode will turn off automatically at sunrise</translation> <translation id="9149866541089851383">Edit...</translation> <translation id="9150045010208374699">Use your camera</translation> <translation id="9150079578948279438">Profile could not be removed. Please try again or contact your operator for technical support.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index ed1b40c8..539f63b 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">Desvincular el dispositivo Bluetooth</translation> <translation id="1651008383952180276">Debes ingresar la misma frase de contraseña dos veces</translation> <translation id="1652326691684645429">Habilitar Compartir con Nearby</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Agrega la impresora a Google Cloud Print para poder imprimir desde todas partes.}other{Agrega # impresoras a Google Cloud Print para poder imprimir desde todas partes.}}</translation> <translation id="1653631694606464309">Las aplicaciones web por lo general solicitan permiso para abrir determinados tipos de archivos para que puedas trabajar en ellos donde quieras, como en tu procesador de texto preferido</translation> <translation id="1656528038316521561">Opacidad del fondo</translation> <translation id="1657406563541664238">Ayúdanos a <ph name="PRODUCT_NAME" /> mejorar enviando automáticamente estadísticas de uso e informes de fallos a Google.</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">Usas una variable de entorno no compatible: <ph name="BAD_VAR" />. Se verán afectadas la estabilidad y la seguridad.</translation> <translation id="4095264805865317199">Abrir la IU de Activación del teléfono celular</translation> <translation id="4095507791297118304">Pantalla principal</translation> -<translation id="409579654357498729">Agregar a Google Cloud Print</translation> <translation id="4096508467498758490">Inhabilitar extensiones en modo de programador</translation> <translation id="4097406557126260163">Apps y extensiones</translation> <translation id="409742781329613461">Sugerencias para Chrome</translation> @@ -4376,6 +4374,7 @@ <translation id="5794700615121138172">Carpetas compartidas de Linux</translation> <translation id="5794786537412027208">Salir de todas las aplicaciones de Chrome</translation> <translation id="5797070761912323120">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> +<translation id="5797521893972859201">Borra el historial, incluido el del cuadro de búsqueda.</translation> <translation id="5798079537501238810">Los sitios pueden instalar controladores de pago.</translation> <translation id="579907812742603813">contenido protegido</translation> <translation id="579915268381781820">Se quitó la llave de seguridad.</translation> @@ -4459,6 +4458,7 @@ <translation id="5900302528761731119">Foto de perfil de Google</translation> <translation id="590036993063074298">Detalles sobre la calidad de la proyección</translation> <translation id="5901069264981746702">Los datos de las huellas digitales se guardan en un lugar seguro de tu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Cambiar a la pestaña que se capturará</translation> <translation id="5901494423252125310">La tapa de la impresora está abierta</translation> <translation id="5901630391730855834">Amarillo</translation> <translation id="5904614460720589786">No se pudo instalar <ph name="APP_NAME" /> debido a un problema de configuración. Comunícate con el administrador. Código de error: <ph name="ERROR_CODE" />.</translation> @@ -4731,6 +4731,7 @@ <translation id="6196854373336333322">La extensión "<ph name="EXTENSION_NAME" />" tomó el control de la configuración de proxy, lo que significa que puede modificar, dañar o espiar cualquier actividad que lleves a cabo en línea. Si no sabes con certeza por qué se produjo este cambio, probablemente no lo desees.</translation> <translation id="6198102561359457428">Salir y volver a acceder</translation> <translation id="6198252989419008588">Cambiar PIN</translation> +<translation id="6200047250927636406">Descartar archivo</translation> <translation id="6202304368170870640">Puedes usar el PIN para acceder a tu dispositivo o desbloquearlo.</translation> <translation id="6206311232642889873">Cop&iar imagen</translation> <translation id="6207200176136643843">Restablece el nivel de zoom predeterminado</translation> @@ -4816,7 +4817,6 @@ <ph name="DOMAIN" /> requiere que no quites la tarjeta inteligente.</translation> <translation id="628352644014831790">4 segundos</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> no es un archivo que se descargue de forma habitual y es posible que sea peligroso.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nueva impresora en la red}other{Nuevas impresoras en la red}}</translation> <translation id="6285770818046456882">El dispositivo que compartía contenido contigo canceló la transferencia</translation> <translation id="6290613030083731160">No hay dispositivos disponibles cerca que compartan contenido. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Se está verificando el código de activación. Es posible que este proceso demore unos minutos.</translation> @@ -5299,6 +5299,7 @@ <translation id="6831043979455480757">Traducir</translation> <translation id="6833479554815567477">Se quitó la pestaña del grupo <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Cambia a un navegador inteligente y seguro</translation> +<translation id="6834652994408928492">Se activa el modo oscuro automáticamente al atardecer.</translation> <translation id="683540480453879381">Abrir archivos <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Conéctate a Internet para actualizar tu <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Preguntar cuando un sitio web quiera abrir y colocar ventanas en tus pantallas (recomendado)</translation> @@ -6011,6 +6012,7 @@ <translation id="7622114377921274169">Cargando</translation> <translation id="7622768823216805500">Por lo general los sitios instalan controladores de pago para habilitar funciones de compra, por ejemplo, a fin de facilitar la confirmación de las compras.</translation> <translation id="7622903810087708234">Detalles de la contraseña</translation> +<translation id="7622966771025050155">Cambiar a la pestaña capturada</translation> <translation id="7624337243375417909">bloqueo de mayúscula desactivado</translation> <translation id="7625568159987162309">Ver permisos y datos almacenados de los sitios</translation> <translation id="7628201176665550262">Frecuencia de actualización</translation> @@ -6177,6 +6179,7 @@ <translation id="7784067724422331729">La configuración de seguridad de tu computadora bloqueó este archivo.</translation> <translation id="7784796923038949829">No se pueden leer ni cambiar los datos del sitio</translation> <translation id="778480864305029524">Para usar la conexión instantánea mediante dispositivo móvil, activa las notificaciones para los Servicios de Google Play</translation> +<translation id="7785471469930192436">Consulta las instrucciones de tu motor de búsqueda para borrar el historial de búsqueda (si corresponde).</translation> <translation id="7786889348652477777">&Volver a cargar la aplicación</translation> <translation id="7787308148023287649">Mostrar en otra pantalla</translation> <translation id="7788298548579301890">Otro programa en tu computadora agregó una app que puede cambiar el funcionamiento de Chrome. @@ -6789,6 +6792,7 @@ <translation id="8438566539970814960">Mejorar las búsquedas y la navegación</translation> <translation id="8439506636278576865">Ofrecer la traducción de páginas en este idioma</translation> <translation id="8440630305826533614">Apps de Linux</translation> +<translation id="8446225304314102060">Cambiar a la pestaña <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Más información</translation> <translation id="8447409163267621480">Incluir Ctrl o Alt</translation> <translation id="8448729345478502352">Aumenta o reduce el tamaño de los elementos en tu pantalla</translation> @@ -7450,6 +7454,7 @@ <translation id="9148058034647219655">Salir</translation> <translation id="9148126808321036104">Accede nuevamente</translation> <translation id="9148963623915467028">Este sitio puede acceder a tu ubicación.</translation> +<translation id="9149529198050266366">El modo oscuro se desactivará automáticamente al amanecer.</translation> <translation id="9149866541089851383">Editar...</translation> <translation id="9150045010208374699">Usar tu cámara</translation> <translation id="9150079578948279438">No se pudo quitar el perfil. Vuelve a intentarlo o comunícate con tu proveedor para solicitarle asistencia técnica.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index cfc0fc2..ec618d7 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Desemparejar dispositivo Bluetooth</translation> <translation id="1651008383952180276">Debes introducir la misma frase de contraseña dos veces</translation> <translation id="1652326691684645429">Habilitar Compartir con Nearby</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Añade la impresora a Google Cloud Print para que puedas imprimir desde cualquier parte.}other{Añade # impresoras a Google Cloud Print para que puedas imprimir desde cualquier parte.}}</translation> <translation id="1653631694606464309">Normalmente, las aplicaciones web solicitan abrir ciertos tipos de archivo (por ejemplo, abrir documentos en tu procesador de textos preferido) para que puedas trabajar con ellos donde quieras</translation> <translation id="1656528038316521561">Opacidad del fondo</translation> <translation id="1657406563541664238">Ayúdanos a mejorar <ph name="PRODUCT_NAME" /> enviando estadísticas de uso e informes sobre fallos.</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Estás usando una variable de entorno no admitida: <ph name="BAD_VAR" />. La estabilidad y la seguridad se verán afectadas.</translation> <translation id="4095264805865317199">Abrir la interfaz de usuario de la activación de datos móviles</translation> <translation id="4095507791297118304">Pantalla principal</translation> -<translation id="409579654357498729">Añadir a Cloud Print</translation> <translation id="4096508467498758490">Inhabilitar extensiones en modo de desarrollador</translation> <translation id="4097406557126260163">Aplicaciones y extensiones</translation> <translation id="409742781329613461">Consejos para usar Chrome</translation> @@ -4378,6 +4376,7 @@ <translation id="5794700615121138172">Carpetas compartidas de Linux</translation> <translation id="5794786537412027208">Salir de todas las aplicaciones de Chrome</translation> <translation id="5797070761912323120">Es posible que Google utilice tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> +<translation id="5797521893972859201">Borra el historial, incluido el del cuadro de búsqueda.</translation> <translation id="5798079537501238810">Los sitios pueden instalar controladores de pago</translation> <translation id="579907812742603813">contenido protegido</translation> <translation id="579915268381781820">Se ha desconectado la llave de seguridad.</translation> @@ -4461,6 +4460,7 @@ <translation id="5900302528761731119">Foto de perfil de Google</translation> <translation id="590036993063074298">Detalles sobre la calidad de la proyección</translation> <translation id="5901069264981746702">Los datos de tu huella digital se almacenan de forma segura y nunca salen de tu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Cambiar a pestaña de captura</translation> <translation id="5901494423252125310">La cubierta de la impresora está abierta</translation> <translation id="5901630391730855834">Amarillo</translation> <translation id="5904614460720589786">No se ha podido configurar <ph name="APP_NAME" /> debido a un problema de configuración. Ponte en contacto con tu administrador. Código de error: <ph name="ERROR_CODE" />.</translation> @@ -4733,6 +4733,7 @@ <translation id="6196854373336333322">La extensión <ph name="EXTENSION_NAME" /> ahora controla la configuración del proxy, lo que significa que puede cambiar, deshacer o espiar cualquier acción que hagas online. Si no estás seguro de los motivos por los que se ha producido este cambio, probablemente no haya sido intencionado.</translation> <translation id="6198102561359457428">Cerrar y volver a iniciar sesión...</translation> <translation id="6198252989419008588">Cambiar PIN</translation> +<translation id="6200047250927636406">Descartar archivo</translation> <translation id="6202304368170870640">Puedes usar el PIN para iniciar sesión en tu dispositivo o para desbloquearlo.</translation> <translation id="6206311232642889873">Copia&r imagen</translation> <translation id="6207200176136643843">Restablecer el nivel de zoom predeterminado</translation> @@ -4818,7 +4819,6 @@ <ph name="DOMAIN" /> requiere que mantengas insertada tu tarjeta inteligente.</translation> <translation id="628352644014831790">4 segundos</translation> <translation id="6285120108426285413">El archivo <ph name="FILE_NAME" /> no se descarga habitualmente y puede ser peligroso.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nueva impresora en tu red}other{Nuevas impresoras en tu red}}</translation> <translation id="6285770818046456882">El dispositivo que estaba compartiendo archivos contigo ha cancelado la transferencia</translation> <translation id="6290613030083731160">No hay dispositivos cercanos disponibles para compartir archivos. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verificando el código de activación. Este proceso puede durar unos minutos.</translation> @@ -5301,6 +5301,7 @@ <translation id="6831043979455480757">Traducir</translation> <translation id="6833479554815567477">Pestaña quitada del grupo <ph name="GROUP_NAME" /> (<ph name="GROUP_CONTENTS" />)</translation> <translation id="683373380308365518">Cambia a un navegador seguro e inteligente</translation> +<translation id="6834652994408928492">El modo oscuro se activará automáticamente cuando anochezca.</translation> <translation id="683540480453879381">Abrir archivos <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Conéctate a Internet para actualizar tu <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Preguntar cuando un sitio web quiera abrir y colocar ventanas en tus pantallas (recomendado)</translation> @@ -6013,6 +6014,7 @@ <translation id="7622114377921274169">Cargando.</translation> <translation id="7622768823216805500">Los sitios suelen instalar controladores de pago para utilizarlos en funciones relacionadas con compras, como facilitar los pagos.</translation> <translation id="7622903810087708234">Detalles de la contraseña</translation> +<translation id="7622966771025050155">Cambiar a pestaña capturada</translation> <translation id="7624337243375417909">bloqueo de mayúsculas desactivado</translation> <translation id="7625568159987162309">Ver permisos y datos almacenados en todos los sitios</translation> <translation id="7628201176665550262">Frecuencia de actualización</translation> @@ -6179,6 +6181,7 @@ <translation id="7784067724422331729">La configuración de seguridad de tu ordenador ha bloqueado este archivo.</translation> <translation id="7784796923038949829">No se pueden leer ni cambiar los datos del sitio web</translation> <translation id="778480864305029524">Para utilizar la conexión compartida instantánea, activa las notificaciones de Servicios de Google Play.</translation> +<translation id="7785471469930192436">Consulta las instrucciones del buscador para eliminar tu historial de búsqueda (si corresponde).</translation> <translation id="7786889348652477777">&Volver a cargar aplicación</translation> <translation id="7787308148023287649">Mostrar en otra pantalla</translation> <translation id="7788298548579301890">Otro programa de tu ordenador ha añadido una aplicación que puede cambiar el funcionamiento de Chrome. @@ -6791,6 +6794,7 @@ <translation id="8438566539970814960">Mejorar las búsquedas y la navegación</translation> <translation id="8439506636278576865">Ofrecer la traducción de páginas en este idioma</translation> <translation id="8440630305826533614">Aplicaciones de Linux</translation> +<translation id="8446225304314102060">Cambiar a la pestaña <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Más información</translation> <translation id="8447409163267621480">Incluye Ctrl o Alt</translation> <translation id="8448729345478502352">Reducir o aumentar el tamaño de los elementos de la pantalla</translation> @@ -7452,6 +7456,7 @@ <translation id="9148058034647219655">Salir</translation> <translation id="9148126808321036104">Volver a iniciar sesión</translation> <translation id="9148963623915467028">Este sitio web puede acceder a tu ubicación.</translation> +<translation id="9149529198050266366">El modo oscuro se desactivará automáticamente cuando amanezca.</translation> <translation id="9149866541089851383">Editar...</translation> <translation id="9150045010208374699">Utilizar la cámara</translation> <translation id="9150079578948279438">No se ha podido quitar el perfil. Inténtalo de nuevo o ponte en contacto con tu operador para recibir asistencia técnica.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 70b48579..e7c60dd 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Bluetooth-seadme seose tühistamine</translation> <translation id="1651008383952180276">Peate sisestama sama parooli kaks korda</translation> <translation id="1652326691684645429">Läheduses jagamise lubamine</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Lisage printer teenusesse Google'i pilvprintimine, et saaksite printida kõikjal.}other{Lisage # printerit teenusesse Google'i pilvprintimine, et saaksite printida kõikjal.}}</translation> <translation id="1653631694606464309">Veebirakendused küsivad tavaliselt luba teatud tüüpi failide avamiseks, et saaksite nende failidega soovitud kohas töötada (nt dokumentide avamine eelistatud tekstitöötlusprogrammis)</translation> <translation id="1656528038316521561">Tausta läbipaistvus</translation> <translation id="1657406563541664238">Aidake muuta rakendus <ph name="PRODUCT_NAME" /> paremaks, saates Google'ile automaatselt kasutusstatistikat ja veaaruandeid</translation> @@ -2909,7 +2908,6 @@ <translation id="4094647278880271855">Kasutate keskkonna toetamata muutujat: <ph name="BAD_VAR" />. See vähendab stabiilsust ja turvalisust.</translation> <translation id="4095264805865317199">Ava mobiilsidevõrgu aktiveerimise kasutajaliides</translation> <translation id="4095507791297118304">Peamine ekraan</translation> -<translation id="409579654357498729">Lisa pilvprintimisse</translation> <translation id="4096508467498758490">Arendaja režiimi laienduste keelamine</translation> <translation id="4097406557126260163">Rakendused ja laiendused</translation> <translation id="409742781329613461">Chrome'i nõuanded</translation> @@ -4828,7 +4826,6 @@ <ph name="DOMAIN" /> nõuab, et teie kiipkaart oleks pidevalt sisestatud.</translation> <translation id="628352644014831790">4 sekundit</translation> <translation id="6285120108426285413">Faili <ph name="FILE_NAME" /> ei laadita sageli alla ja see võib olla ohtlik.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Teie võrgus on uus printer}other{Teie võrgus on uued printerid}}</translation> <translation id="6285770818046456882">Teiega jagav seade tühistas ülekandmise</translation> <translation id="6290613030083731160">Mitte ükski saadaolev seade ei jaga läheduses. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktiveerimiskoodi kinnitamine. See võib võtta mõne minuti.</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index ce216bd..b950522 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Desparekatu Bluetooth bidezko gailua</translation> <translation id="1651008383952180276">Pasaesaldi bera idatzi behar duzu bietan</translation> <translation id="1652326691684645429">Gaitu Nearby Share</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Gehitu inprimagailua Google Cloud Print zerbitzuan, edonondik inprimatu ahal izateko.}other{Gehitu # inprimagailu Google Cloud Print zerbitzuan, edonondik inprimatu ahal izateko.}}</translation> <translation id="1653631694606464309">Sareko aplikazioek fitxategi mota jakin batzuk irekitzea eskatu ohi dute, nahi duzun tokian lan egin ahal izan dezazun fitxategi horiekin (adibidez, hitz-prozesadore hobetsian dokumentuak irekitzea eskatu ohi dute)</translation> <translation id="1656528038316521561">Atzeko planoaren opakutasuna</translation> <translation id="1657406563541664238">Lagundu <ph name="PRODUCT_NAME" /> hobetzen Google-ra erabilera-estatistikak eta hutsegite-txostenak bidalita</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Onartzen ez den ingurune-aldagai bat erabiltzen ari zara: <ph name="BAD_VAR" />. Egonkortasunak eta segurtasunak okerrera egingo dute.</translation> <translation id="4095264805865317199">Ireki sare mugikorretarako SIM txartelak aktibatzeko erabiltzaile-interfazea</translation> <translation id="4095507791297118304">Pantaila nagusia</translation> -<translation id="409579654357498729">Gehitu Cloud Print zerbitzuan</translation> <translation id="4096508467498758490">Desgaitu garatzaile moduaren luzapenak</translation> <translation id="4097406557126260163">Aplikazioak eta luzapenak</translation> <translation id="409742781329613461">Chrome erabiltzeko aholkuak</translation> @@ -4378,6 +4376,7 @@ <translation id="5794700615121138172">Linux-eko karpeta partekatuak</translation> <translation id="5794786537412027208">Irten Chrome-ren aplikazio guztietatik</translation> <translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> +<translation id="5797521893972859201">Historia garbitzen du, bilaketa-koadroa barne</translation> <translation id="5798079537501238810">Webguneek ordainketa-kudeatzaileak instala ditzakete</translation> <translation id="579907812742603813">eduki babestua</translation> <translation id="579915268381781820">Kendu egin da segurtasun-giltza.</translation> @@ -4461,6 +4460,7 @@ <translation id="5900302528761731119">Google-ko profileko argazkia</translation> <translation id="590036993063074298">Islatzearen kalitateari buruzko xehetasunak</translation> <translation id="5901069264981746702">Zure hatz-marken datuak modu seguruan gordeko dira eta ez dira inoiz aterako <ph name="DEVICE_TYPE" /> gailutik. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Aldatu grabatzen ari den fitxara</translation> <translation id="5901494423252125310">Inprimagailuaren estalkia irekita dago</translation> <translation id="5901630391730855834">Horia</translation> <translation id="5904614460720589786">Ezin izan da instalatu <ph name="APP_NAME" /> konfigurazio-arazo batengatik. Jarri administratzailearekin harremanetan. Errore-kodea: <ph name="ERROR_CODE" />.</translation> @@ -4733,6 +4733,7 @@ <translation id="6196854373336333322"><ph name="EXTENSION_NAME" /> luzapenak zure proxy-ezarpenen kontrola hartu du; alegia, sarean egiten duzun edozer alda, honda edo zelata dezake. Aldaketa zergatik gertatu den ziur ez badakizu, baliteke aldaketa nahi ez izatea.</translation> <translation id="6198102561359457428">Amaitu saioa eta hasi berriro</translation> <translation id="6198252989419008588">Aldatu PINa</translation> +<translation id="6200047250927636406">Baztertu fitxategia</translation> <translation id="6202304368170870640">Gailua desblokeatzeko edo bertan saioa hasteko erabil dezakezu PINa.</translation> <translation id="6206311232642889873">Kop&iatu irudia</translation> <translation id="6207200176136643843">Berrezarri zoom-maila lehenetsia</translation> @@ -4818,7 +4819,6 @@ Txartel adimenduna sartuta edukitzea eskatzen du <ph name="DOMAIN" /> domeinuak.</translation> <translation id="628352644014831790">4 segundo</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ez da deskargatzen sarriegi, eta arriskutsua izan liteke.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Inprimagailu berria dago sarean}other{Inprimagailu berriak daude sarean}}</translation> <translation id="6285770818046456882">Zurekin partekatzen ari zen gailuak bertan behera utzi du transferentzia</translation> <translation id="6290613030083731160">Ez dago partekatzen ari den gailurik inguruan. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktibazio-kodea egiaztatzen. Agian minutu batzuk beharko dira.</translation> @@ -5301,6 +5301,7 @@ <translation id="6831043979455480757">Itzuli</translation> <translation id="6833479554815567477"><ph name="GROUP_NAME" /> taldetik kendu da fitxa (<ph name="GROUP_CONTENTS" />)</translation> <translation id="683373380308365518">Aldatu arakatzaile adimendun eta seguru batera</translation> +<translation id="6834652994408928492">Modu iluna automatikoki aktibatuko da iluntzean</translation> <translation id="683540480453879381">Ireki <ph name="FILE_EXTENSIONS" /> fitxategiak</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" /> eguneratzeko, konektatu Internetera.</translation> <translation id="6838034009068684089">Eskatu zure baimena webguneren batek zure pantailetan leihoak ireki eta kokatu nahi dituenean (gomendatua)</translation> @@ -6013,6 +6014,7 @@ <translation id="7622114377921274169">Kargatzen.</translation> <translation id="7622768823216805500">Webguneek ordainketa-kudeatzaileak instalatu ohi dituzte ordainketa erraza eta antzeko erosketa-eginbideak eskaintzeko</translation> <translation id="7622903810087708234">Pasahitzaren xehetasunak</translation> +<translation id="7622966771025050155">Aldatu grabatutako fitxara</translation> <translation id="7624337243375417909">maiuskulak desaktibatuta daude</translation> <translation id="7625568159987162309">Ikusi webguneetan gordetako baimenak eta datuak</translation> <translation id="7628201176665550262">Freskatze-abiadura</translation> @@ -6179,6 +6181,7 @@ <translation id="7784067724422331729">Fitxategia blokeatu da ordenagailuan dituzun segurtasun-ezarpenen ondorioz</translation> <translation id="7784796923038949829">Ezin dira irakurri edo aldatu webguneko datuak</translation> <translation id="778480864305029524">Konexioa bizkor partekatzeko eginbidea erabiltzeko, aktibatu Google Play Services-en jakinarazpenak.</translation> +<translation id="7785471469930192436">Behar izanez gero, joan bilatzailearen argibideetara bilaketa-historia ezabatzeari buruzko informazio gehiago lortzeko</translation> <translation id="7786889348652477777">Kar&gatu berriro aplikazioa</translation> <translation id="7787308148023287649">Erakutsi beste pantaila batean</translation> <translation id="7788298548579301890">Ordenagailuko beste programa batek Chrome-ren funtzionamenduari eragin diezaiokeen aplikazio bat gehitu du. @@ -6789,6 +6792,7 @@ <translation id="8438566539970814960">Hobetu bilaketak eta arakatze-jarduerak</translation> <translation id="8439506636278576865">Eskaini hizkuntza honetako orriak itzultzea</translation> <translation id="8440630305826533614">Linux aplikazioak</translation> +<translation id="8446225304314102060">Aldatu <ph name="TAB_ORIGIN" /> fitxara</translation> <translation id="8446884382197647889">Lortu informazio gehiago</translation> <translation id="8447409163267621480">Erabili Ktrl edo Alt</translation> <translation id="8448729345478502352">Handitu edo txikitu pantailako elementuak</translation> @@ -7449,6 +7453,7 @@ <translation id="9148058034647219655">Irten</translation> <translation id="9148126808321036104">Hasi saioa berriro</translation> <translation id="9148963623915467028">Webgune honek zure kokapena atzi dezake.</translation> +<translation id="9149529198050266366">Modu iluna automatikoki desaktibatuko da egunsentian</translation> <translation id="9149866541089851383">Editatu…</translation> <translation id="9150045010208374699">Erabili zure kamera</translation> <translation id="9150079578948279438">Ezin izan da kendu profila. Saiatu berriro edo jarri operadorearekin harremanetan laguntza teknikoa lortzeko.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 15d5169f..2bb427d 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">لغو مرتبطسازی دستگاه بلوتوث</translation> <translation id="1651008383952180276">باید همان گذرعبارت را دو بار وارد کنید</translation> <translation id="1652326691684645429">فعال کردن «همرسانی با اطراف»</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{چاپگر را به Google Cloud Print اضافه کنید تا بتوانید از هر کجا چاپ کنید.}one{# چاپگر را به Google Cloud Print اضافه کنید تا بتوانید از هر کجا چاپ کنید.}other{# چاپگر را به Google Cloud Print اضافه کنید تا بتوانید از هر کجا چاپ کنید.}}</translation> <translation id="1653631694606464309">برنامههای وب معمولاً درخواست میکنند تا انواع خاصی از فایل را باز کنند تا بتوانید در جاییکه میخواهید روی آن فایلها کار کنید، مثل باز کردن اسناد در واژهپرداز ترجیحیتان.</translation> <translation id="1656528038316521561">ماتی پسزمینه</translation> <translation id="1657406563541664238">با ارسال خودکار آمار استفاده و گزارشهای خرابی به Google، به بهتر شدن <ph name="PRODUCT_NAME" /> کمک کنید.</translation> @@ -2915,7 +2914,6 @@ <translation id="4094647278880271855">از متغیر محیطی پشتیبانینشدهای استفاده میکنید: <ph name="BAD_VAR" />. ثبات و امنیت دچار مشکل میشود.</translation> <translation id="4095264805865317199">باز کردن میانای کاربر فعالسازی شبکه داده تلفن همراه</translation> <translation id="4095507791297118304">نمایشگر اصلی</translation> -<translation id="409579654357498729">افزودن به Cloud Print</translation> <translation id="4096508467498758490">غیرفعال کردن افزونههای حالت برنامهنویس</translation> <translation id="4097406557126260163">برنامهها و افزونهها</translation> <translation id="409742781329613461">نکاتی درباره Chrome</translation> @@ -4392,6 +4390,7 @@ <translation id="5794700615121138172">پوشههای همرسانیشده Linux</translation> <translation id="5794786537412027208">خروج از همه برنامههای Chrome</translation> <translation id="5797070761912323120">Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو، آگهیها و سایر سرویسهای Google استفاده کند</translation> +<translation id="5797521893972859201">سابقهها، ازجمله سابقه موجود در چارگوش جستجو پاک میشود</translation> <translation id="5798079537501238810">سایتها میتوانند کنترلکننده پرداخت نصب کنند</translation> <translation id="579907812742603813">محتوای محافظتشده</translation> <translation id="579915268381781820">کلید امنیتیتان برداشته شد.</translation> @@ -4475,6 +4474,7 @@ <translation id="5900302528761731119">عکس نمایهٔ Google</translation> <translation id="590036993063074298">جزئیات کیفیت بازتاب</translation> <translation id="5901069264981746702">دادههای اثر انگشتتان بهصورت ایمن ذخیره میشود و هرگز از <ph name="DEVICE_TYPE" /> شما خارج نمیشود. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">رفتن به برگه درحال ضبط</translation> <translation id="5901494423252125310">در چاپگر باز است</translation> <translation id="5901630391730855834">زرد</translation> <translation id="5904614460720589786">بهدلیل مشکل پیکربندی، <ph name="APP_NAME" /> راهاندازی نشد. لطفاً با سرپرست تماس بگیرید. کد خطا: <ph name="ERROR_CODE" />.</translation> @@ -4747,6 +4747,7 @@ <translation id="6196854373336333322">افزونه «<ph name="EXTENSION_NAME" />»، کنترل تنظیمات پروکسی شما را در اختیار گرفته است یعنی میتواند هر چیزی که در حالت آنلاین انجام میدهید تغییر دهد، خراب کند یا استراق سمع کند. اگر مطمئن نیستید چرا این تغییر انجام شده است، احتمالاً این افزونه را نمیخواهید.</translation> <translation id="6198102561359457428">خارج شده و دوباره وارد سیستم شوید...</translation> <translation id="6198252989419008588">تغییر دادن پین</translation> +<translation id="6200047250927636406">صرفنظر کردن از فایل</translation> <translation id="6202304368170870640">میتوانید برای ورود به سیستم یا باز کردن قفل دستگاه از پین استفاده کنید.</translation> <translation id="6206311232642889873">&کپی تصویر</translation> <translation id="6207200176136643843">بازنشانی به سطح بزرگنمایی پیشفرض</translation> @@ -4832,7 +4833,6 @@ برای اینکه از سیستم <ph name="DOMAIN" /> خارج نشوید، باید کارت هوشمندتان را در دستگاه نگه دارید.</translation> <translation id="628352644014831790">۴ ثانیه</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> معمولاً بارگیری نمیشود و ممکن است خطرناک باشد.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{چاپگر جدید در شبکه شما}one{چاپگر جدید در شبکه شما}other{چاپگر جدید در شبکه شما}}</translation> <translation id="6285770818046456882">دستگاهی که با شما همرسانی میکرد انتقال را لغو کرد</translation> <translation id="6290613030083731160">دستگاهی که درحال همرسانی با اطراف باشد وجود ندارد. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="6291086328725007688">درحال راستیآزمایی کد فعالسازی. ممکن است چند دقیقه طول بکشد.</translation> @@ -5315,6 +5315,7 @@ <translation id="6831043979455480757">ترجمه</translation> <translation id="6833479554815567477">برگه از گروه <ph name="GROUP_NAME" /> برداشته شد - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">به مرورگری هوشمند و ایمن جابهجا شوید</translation> +<translation id="6834652994408928492">«حالت تاریک» هنگام غروب آفتاب بهطور خودکار روشن خواهد شد</translation> <translation id="683540480453879381">باز کردن فایلهای <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">برای بهروزرسانی <ph name="DEVICE_TYPE" />، لطفاً به اینترنت وصل شوید.</translation> <translation id="6838034009068684089">وقتی سایتی میخواهد پنجرهها را باز کند و در صفحه جایگذاری کند سؤال شود (توصیه میشود)</translation> @@ -6027,6 +6028,7 @@ <translation id="7622114377921274169">درحال شارژ شدن.</translation> <translation id="7622768823216805500">سایتها معمولاً کنترلکنندههای پرداخت را برای ارائه ویژگیهای خرید، مانند تسویهحساب آسانتر، نصب میکنند</translation> <translation id="7622903810087708234">جزئیات گذرواژه</translation> +<translation id="7622966771025050155">رفتن به برگه ضبطشده</translation> <translation id="7624337243375417909">caps lock غیرفعال</translation> <translation id="7625568159987162309">مشاهده مجوزها و دادههای ذخیرهشده در همه سایتها</translation> <translation id="7628201176665550262">نرخ بازخوانی</translation> @@ -6193,6 +6195,7 @@ <translation id="7784067724422331729">تنظیمات امنیتی رایانه شما این فایل را مسدود کرد.</translation> <translation id="7784796923038949829">خواندن یا تغییر دادههای سایت امکانپذیر نیست</translation> <translation id="778480864305029524">برای استفاده از «اشتراکگذاری اینترنت فوری»، اعلانها را برای «خدمات Google Play» روشن کنید.</translation> +<translation id="7785471469930192436">برای اینکه سابقه جستجویتان را درصورت امکان حذف کنید، به دستورالعملهای موتور جستجو مراجعه کنید</translation> <translation id="7786889348652477777">&تازهسازی برنامه</translation> <translation id="7787308148023287649">نمایش در صفحه دیگر</translation> <translation id="7788298548579301890">برنامه دیگری در رایانه شما برنامهای اضافه کرده که ممکن است نحوه کارکرد Chrome را تغییر دهد. @@ -6805,6 +6808,7 @@ <translation id="8438566539970814960">بهبود جستجوها و مرور</translation> <translation id="8439506636278576865">ترجمه صفحات نوشته شده به این زبان پیشنهاد داده شود</translation> <translation id="8440630305826533614">برنامههای Linux</translation> +<translation id="8446225304314102060">رفتن به برگه <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">بیشتر بیاموزید</translation> <translation id="8447409163267621480">باید شامل Ctrl یا Alt باشد</translation> <translation id="8448729345478502352">بزرگتر با کوچکتر کردن موارد روی صفحه</translation> @@ -7467,6 +7471,7 @@ <translation id="9148058034647219655">خروج</translation> <translation id="9148126808321036104">ورود مجدد به سیستم</translation> <translation id="9148963623915467028">این سایت میتواند به مکان شما دسترسی داشته باشد.</translation> +<translation id="9149529198050266366">«حالت تاریک» هنگام طلوع آفتاب بهطور خودکار خاموش خواهد شد</translation> <translation id="9149866541089851383">ویرایش...</translation> <translation id="9150045010208374699">استفاده از دوربین شما</translation> <translation id="9150079578948279438">نمایه برداشته نشد. لطفاً دوباره امتحان کنید یا برای دریافت پشتیبانی فنی، با شرکت مخابراتیتان تماس بگیرید.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 86cc391..77e072f 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Poista Bluetooth-laitteen pari</translation> <translation id="1651008383952180276">Kirjoita sama tunnuslause kahdesti.</translation> <translation id="1652326691684645429">Ota lähijakaminen käyttöön</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Lisää tulostin Google Cloud Printiin, jotta voit tulostaa mistä tahansa.}other{Lisää # tulostinta Google Cloud Printiin, jotta voit tulostaa mistä tahansa.}}</translation> <translation id="1653631694606464309">Verkkosovellukset pyytävät yleensä lupaa avata tietyntyyppisiä tiedostoja, jotta voit työstää kyseisiä tiedostoja missä tahansa, esim. avata dokumentteja haluamassasi tekstinkäsittelyohjelmassa</translation> <translation id="1656528038316521561">Taustan läpinäkyvyys</translation> <translation id="1657406563541664238">Auta parantamaan tuotetta <ph name="PRODUCT_NAME" /> lähettämällä automaattisesti käyttötilastoja ja virheraportteja Googlelle.</translation> @@ -2914,7 +2913,6 @@ <translation id="4094647278880271855">Käytät ympäristön muuttujaa, jota ei tueta: <ph name="BAD_VAR" />. Tämä heikentää vakautta ja tietoturvaa.</translation> <translation id="4095264805865317199">Avaa mobiiliyhteyden aktivoinnin käyttöliittymä</translation> <translation id="4095507791297118304">Ensisijainen näyttö</translation> -<translation id="409579654357498729">Lisää Cloud Printiin</translation> <translation id="4096508467498758490">Poista kehittäjätilassa olevat laajennukset käytöstä</translation> <translation id="4097406557126260163">Sovellukset ja laajennukset</translation> <translation id="409742781329613461">Vinkkejä Chromen käyttöön</translation> @@ -4391,6 +4389,7 @@ <translation id="5794700615121138172">Linuxin jaetut kansiot</translation> <translation id="5794786537412027208">Sulje kaikki Chrome-sovellukset</translation> <translation id="5797070761912323120">Google voi muokata Hakua, mainoksia ja muita Googlen palveluita historiasi perusteella</translation> +<translation id="5797521893972859201">Tyhjentää historian esim. hakukentästä</translation> <translation id="5798079537501238810">Sivustot voivat asentaa maksunkäsittelijöitä</translation> <translation id="579907812742603813">suojattu sisältö</translation> <translation id="579915268381781820">Suojausavain poistettiin.</translation> @@ -4474,6 +4473,7 @@ <translation id="5900302528761731119">Google-profiilin kuva</translation> <translation id="590036993063074298">Peilauksen laatutiedot</translation> <translation id="5901069264981746702">Sormenjälkidata tallennetaan turvallisesti vain laitteellesi (<ph name="DEVICE_TYPE" />). <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Vaihda tallennettavalle välilehdelle</translation> <translation id="5901494423252125310">Tulostimen luukku auki</translation> <translation id="5901630391730855834">Keltainen</translation> <translation id="5904614460720589786"><ph name="APP_NAME" />:n asennus ei onnistunut konfiguraatio-ongelman vuoksi. Ota yhteyttä järjestelmänvalvojaasi. Virhekoodi: <ph name="ERROR_CODE" />.</translation> @@ -4746,6 +4746,7 @@ <translation id="6196854373336333322">Välityspalvelimesi asetuksia hallinnoi tällä hetkellä tämä laajennus <ph name="EXTENSION_NAME" />, joka voi muokata, haitata tai salakuunnella kaikkia verkkotoimiasi. Jos et tiedä, miksi tämä muutos tehtiin, et luultavasti halua käyttää sitä.</translation> <translation id="6198102561359457428">Kirjaudu ulos ja kirjaudu uudelleen sisään...</translation> <translation id="6198252989419008588">Vaihda PIN-koodi</translation> +<translation id="6200047250927636406">Hylkää tiedosto</translation> <translation id="6202304368170870640">PIN-koodin avulla voit kirjautua laitteeseen tai avata sen lukituksen.</translation> <translation id="6206311232642889873">K&opioi kuva</translation> <translation id="6207200176136643843">Palauta zoomauksen oletustaso</translation> @@ -4831,7 +4832,6 @@ <ph name="DOMAIN" /> ei salli älykortin poistamista.</translation> <translation id="628352644014831790">4 sekuntia</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> on harvinainen ladattava tiedosto, ja se voi olla vaarallinen.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Verkossasi on uusi tulostin}other{Verkossasi on uusia tulostimia}}</translation> <translation id="6285770818046456882">Sinulle sisältöä jakanut laite peruutti siirron</translation> <translation id="6290613030083731160">Ei sisältöä jakavia laitteita lähistöllä. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktivointikoodia todennetaan… Tämä voi kestää muutaman minuutin.</translation> @@ -5314,6 +5314,7 @@ <translation id="6831043979455480757">Käännä</translation> <translation id="6833479554815567477">Välilehti poistettu ryhmästä <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Siirry käyttämään älykästä ja turvallista selainta.</translation> +<translation id="6834652994408928492">Tumma tila menee automaattisesti päälle, kun aurinko laskee</translation> <translation id="683540480453879381">avata tiedostot: <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Muodosta internetyhteys, niin voit päivittää laitteen <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Kysy, kun sivusto haluaa avata ikkunoita ja sijoittaa niitä näytöillesi (suositus)</translation> @@ -6026,6 +6027,7 @@ <translation id="7622114377921274169">Ladataan</translation> <translation id="7622768823216805500">Sivustot asentavat yleensä maksunkäsittelijöitä tarjotakseen osto-ominaisuuksia, esim. helpomman maksamisen</translation> <translation id="7622903810087708234">Salasanan tiedot</translation> +<translation id="7622966771025050155">Vaihda tallennetulle välilehdelle</translation> <translation id="7624337243375417909">caps lock pois päältä</translation> <translation id="7625568159987162309">Näytä kaikki sivustoille tallennetut käyttöoikeudet ja data</translation> <translation id="7628201176665550262">Päivitysväli</translation> @@ -6192,6 +6194,7 @@ <translation id="7784067724422331729">Tietokoneesi suojausasetukset estivät tämän tiedoston.</translation> <translation id="7784796923038949829">Sivuston dataa ei voi lukea tai muuttaa</translation> <translation id="778480864305029524">Jotta voit käyttää yhteyden pikajakamista, ota Google Play Palveluiden ilmoitukset käyttöön.</translation> +<translation id="7785471469930192436">Katso tarvittaessa hakukoneen ohjeet hakuhistorian poistamiselle</translation> <translation id="7786889348652477777">&Lataa sovellus uudelleen</translation> <translation id="7787308148023287649">Näytä toisella näytöllä</translation> <translation id="7788298548579301890">Toinen tietokoneellasi oleva ohjelma on lisännyt sovelluksen, joka voi muuttaa Chromen toimintaa. @@ -6803,6 +6806,7 @@ <translation id="8438566539970814960">Paranna hakuja ja selausta</translation> <translation id="8439506636278576865">Tarjoudu kääntämään sivuja tälle kielelle</translation> <translation id="8440630305826533614">Linux-sovellukset</translation> +<translation id="8446225304314102060">Vaihda välilehdelle <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Lisätietoja</translation> <translation id="8447409163267621480">Lisää alkuun joko Ctrl tai Alt</translation> <translation id="8448729345478502352">Pienennä tai suurenna näytöllä näkyviä kohteita</translation> @@ -7464,6 +7468,7 @@ <translation id="9148058034647219655">Poistu</translation> <translation id="9148126808321036104">Kirjaudu sisään uudelleen</translation> <translation id="9148963623915467028">Tämä sivusto voi käyttää sijaintitietojasi.</translation> +<translation id="9149529198050266366">Tumma tila menee automaattisesti pois päältä, kun aurinko nousee</translation> <translation id="9149866541089851383">Muokkaa...</translation> <translation id="9150045010208374699">Käyttää kameraa</translation> <translation id="9150079578948279438">Profiilin poisto ei onnistunut. Yritä uudelleen tai pyydä operaattorilta teknistä tukea.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 2bb54d2e..3af3a0cc 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">I-unpair ang Bluetooth device</translation> <translation id="1651008383952180276">Dapat mong ilagay ang katulad na passphrase nang dalawang beses</translation> <translation id="1652326691684645429">I-enable ang Nearby Share</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Idagdag ang printer sa Google Cloud Print nang sa gayon ay makakapag-print ka kahit saan.}one{Idagdag ang # printer sa Google Cloud Print nang sa gayon ay makakapag-print ka kahit saan.}other{Idagdag ang # na printer sa Google Cloud Print nang sa gayon ay makakapag-print ka kahit saan.}}</translation> <translation id="1653631694606464309">Karaniwang humihiling ang mga web app na magbukas ng ilang partikular na uri ng mga file para makapagtrabaho ka sa mga file na iyon kung saan mo gusto, gaya ng pagbubukas ng mga dokumento sa iyong gustong word processor</translation> <translation id="1656528038316521561">Opacity ng background</translation> <translation id="1657406563541664238">Tulungan ang <ph name="PRODUCT_NAME" /> na maging mas mahusay sa pamamagitan ng awtomatikong pagpapadala ng mga istatistika ng paggamit at mga crash report sa Google</translation> @@ -2919,7 +2918,6 @@ <translation id="4094647278880271855">Gumagamit ka ng hindi sinusuportahang variable ng environment: <ph name="BAD_VAR" />. Magkakaproblema sa stability at seguridad.</translation> <translation id="4095264805865317199">Buksan ang UI sa Pag-activate ng Cellular Network</translation> <translation id="4095507791297118304">Pangunahing display</translation> -<translation id="409579654357498729">Idagdag sa Cloud Print</translation> <translation id="4096508467498758490">I-disable ang mga extension ng developer mode</translation> <translation id="4097406557126260163">Mga App at extension</translation> <translation id="409742781329613461">Mga Tip para sa Chrome</translation> @@ -4396,6 +4394,7 @@ <translation id="5794700615121138172">Mga nakabahaging folder ng Linux</translation> <translation id="5794786537412027208">Umalis sa lahat ng Chrome Apps</translation> <translation id="5797070761912323120">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation> +<translation id="5797521893972859201">Kini-clear ang history, kasama ang nasa box para sa paghahanap</translation> <translation id="5798079537501238810">Puwedeng mag-install ang mga site ng mga tagapangasiwa ng pagbabayad</translation> <translation id="579907812742603813">pinoprotektahang content</translation> <translation id="579915268381781820">Inalis ang iyong security key.</translation> @@ -4479,6 +4478,7 @@ <translation id="5900302528761731119">Larawan sa Profile sa Google</translation> <translation id="590036993063074298">Mga Detalye ng Kalidad ng Pag-mirror</translation> <translation id="5901069264981746702">Secure na sino-store ang data ng iyong fingerprint at hindi ito kailanman aalisin sa <ph name="DEVICE_TYPE" /> mo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Lumipat sa kina-capture na tab</translation> <translation id="5901494423252125310">Nakabukas ang takip ng printer</translation> <translation id="5901630391730855834">Dilaw</translation> <translation id="5904614460720589786">Hindi ma-set up ang <ph name="APP_NAME" /> dahil sa isang problema sa configuration. Makipag-ugnayan sa iyong administrator. Code ng error: <ph name="ERROR_CODE" />.</translation> @@ -4751,6 +4751,7 @@ <translation id="6196854373336333322">Kinokontrol na ng extension na "<ph name="EXTENSION_NAME" />" ang iyong mga setting ng proxy, na ang ibig sabihin ay maaari nitong baguhin, sirain o alamin ang anumang bagay na gagawin mo online. Kung hindi ka sigurado kung bakit naganap ang pagbabagong ito, malamang ay hindi mo ito ginustong mangyari.</translation> <translation id="6198102561359457428">Mag-sign out pagkatapos ay mag-sign in muli...</translation> <translation id="6198252989419008588">Palitan ang PIN</translation> +<translation id="6200047250927636406">I-discard ang file</translation> <translation id="6202304368170870640">Maaari mong gamitin ang iyong PIN para mag-sign in sa o para ma-unlock ang device mo.</translation> <translation id="6206311232642889873">Kop&yahin ang Imahe</translation> <translation id="6207200176136643843">I-reset sa default na antas ng pag-zoom</translation> @@ -4836,7 +4837,6 @@ Inaatasan ka ng <ph name="DOMAIN" /> na panatilihing nakalagay ang iyong smart card.</translation> <translation id="628352644014831790">4 na segundo</translation> <translation id="6285120108426285413">Hindi karaniwang dina-download ang <ph name="FILE_NAME" /> at maaaring mapanganib ito.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Bagong printer sa iyong network}one{Mga bagong printer sa iyong network}other{Mga bagong printer sa iyong network}}</translation> <translation id="6285770818046456882">Kinansela ng device na nagbabahagi sa iyo ang paglilipat</translation> <translation id="6290613030083731160">Walang available na kalapit na nagbabahaging device. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Vine-verify ang code sa pag-activate. Puwede itong tumagal nang ilang minuto.</translation> @@ -5319,6 +5319,7 @@ <translation id="6831043979455480757">Isalin</translation> <translation id="6833479554815567477">Inalis ang tab sa grupong <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Lumipat sa isang mahusay at ligtas na browser</translation> +<translation id="6834652994408928492">Awtomatikong mag-o-on ang dark mode sa paglubog ng araw</translation> <translation id="683540480453879381">Open mga <ph name="FILE_EXTENSIONS" /> file</translation> <translation id="6835762382653651563">Mangyaring kumonekta sa Internet upang ma-update ang iyong <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Magtanong kapag gusto ng isang site na magbukas at maglagay ng mga window sa iyong mga screen (inirerekomenda)</translation> @@ -6031,6 +6032,7 @@ <translation id="7622114377921274169">Nagcha-charge.</translation> <translation id="7622768823216805500">Karaniwang nag-i-install ang mga site ng mga tagapangasiwa ng pagbabayad para sa mga feature sa pamimili gaya ng mas madaling pag-check out</translation> <translation id="7622903810087708234">Mga detalye ng password</translation> +<translation id="7622966771025050155">Lumipat sa na-capture na tab</translation> <translation id="7624337243375417909">naka-off ang caps lock</translation> <translation id="7625568159987162309">Tingnan ang mga pahintulot at data na naka-store sa lahat ng site</translation> <translation id="7628201176665550262">Rate ng Pag-refresh</translation> @@ -6197,6 +6199,7 @@ <translation id="7784067724422331729">Na-block ng mga setting ng seguridad sa iyong computer ang file na ito.</translation> <translation id="7784796923038949829">Hindi mabasa o mapalitan ang data ng site</translation> <translation id="778480864305029524">Upang magamit ang Instant na Pag-tether, i-on ang mga notification para sa Mga Serbisyo ng Google Play.</translation> +<translation id="7785471469930192436">Tingnan ang mga tagubilin ng iyong search engine para sa pag-delete sa iyong history ng paghahanap, kung naaangkop</translation> <translation id="7786889348652477777">I-&reload ang App</translation> <translation id="7787308148023287649">Ipakita sa isa pang screen</translation> <translation id="7788298548579301890">Isa pang program sa iyong computer ang nagdagdag ng app na maaaring magpabago sa paraan ng paggana ng Chrome. @@ -6810,6 +6813,7 @@ <translation id="8439506636278576865">Mag-alok na magsalin ng mga page sa wikang ito </translation> <translation id="8440630305826533614">Mga Linux app</translation> +<translation id="8446225304314102060">Lumipat sa tab na <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Matuto Pa</translation> <translation id="8447409163267621480">Isama ang Ctrl o Alt</translation> <translation id="8448729345478502352">Paliitin o palakihin ang mga item sa iyong screen</translation> @@ -7473,6 +7477,7 @@ <translation id="9148058034647219655">Lumabas</translation> <translation id="9148126808321036104">Muling mag-sign in</translation> <translation id="9148963623915467028">Maa-access ng site na ito ang iyong lokasyon.</translation> +<translation id="9149529198050266366">Awtomatikong mag-o-off ang dark mode sa pagsikat ng araw</translation> <translation id="9149866541089851383">I-edit...</translation> <translation id="9150045010208374699">Gamitin ang iyong camera</translation> <translation id="9150079578948279438">Hindi maalis ang profile. Pakisubukan ulit o makipag-ugnayan sa iyong carrier para sa technical support.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index c2c8228f..8ff4119 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">Annuler l'association de l'appareil Bluetooth</translation> <translation id="1651008383952180276">Vous devez entrer deux fois la même phrase de passe</translation> <translation id="1652326691684645429">Activer la fonctionnalité Partage à proximité</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Ajoutez l'imprimante à Google Cloud Print pour imprimer des documents où que vous soyez.}one{Ajoutez # imprimante à Google Cloud Print pour imprimer des documents où que vous soyez.}other{Ajoutez # imprimantes à Google Cloud Print pour imprimer des documents où que vous soyez.}}</translation> <translation id="1653631694606464309">Les applications Web demandent habituellement l'autorisation d'ouvrir certains types de fichiers pour que vous puissiez travailler sur ces fichiers où vous le voulez, par exemple, ouvrir des documents dans votre logiciel de traitement de texte préféré</translation> <translation id="1656528038316521561">Opacité de l'arrière-plan</translation> <translation id="1657406563541664238">Aidez-nous à améliorer <ph name="PRODUCT_NAME" /> en envoyant automatiquement des statistiques d'utilisation et des rapports d'erreur à Google</translation> @@ -2905,7 +2904,6 @@ <translation id="4094647278880271855">Vous utilisez une variable d'environnement incompatible : <ph name="BAD_VAR" />. Cela aura un impact sur la stabilité et la sécurité.</translation> <translation id="4095264805865317199">Ouvrir l'IU d'activation cellulaire</translation> <translation id="4095507791297118304">Affichage principal</translation> -<translation id="409579654357498729">Ajouter à Google Cloud Print</translation> <translation id="4096508467498758490">Désactiver les extensions du mode développeur</translation> <translation id="4097406557126260163">Applications et extensions</translation> <translation id="409742781329613461">Astuces pour Chrome</translation> @@ -4381,6 +4379,7 @@ <translation id="5794700615121138172">Dossiers partagés Linux</translation> <translation id="5794786537412027208">Quitter toutes les applications Chrome</translation> <translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> +<translation id="5797521893972859201">Efface l'historique, y compris le contenu du champ de recherche</translation> <translation id="5798079537501238810">Les sites peuvent installer des modules de traitement de paiement</translation> <translation id="579907812742603813">Contenu protégé</translation> <translation id="579915268381781820">Votre clé de sécurité a été retirée.</translation> @@ -4464,6 +4463,7 @@ <translation id="5900302528761731119">Photo du profil Google</translation> <translation id="590036993063074298">Renseignements sur la qualité de la duplication d'écran</translation> <translation id="5901069264981746702">Les données liées à votre empreinte digitale sont stockées de façon sécurisée et ne quittent jamais votre <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Passer à l'onglet de capture</translation> <translation id="5901494423252125310">La porte de l'imprimante est ouverte</translation> <translation id="5901630391730855834">Jaune</translation> <translation id="5904614460720589786">Impossible de configurer <ph name="APP_NAME" /> en raison d'une erreur de configuration. Veuillez communiquer avec votre administrateur. Code d'erreur : <ph name="ERROR_CODE" />.</translation> @@ -4736,6 +4736,7 @@ <translation id="6196854373336333322">L'extension « <ph name="EXTENSION_NAME" /> » a pris le contrôle de vos paramètres de mandataire, ce qui signifie qu'elle peut modifier ou espionner tout ce que vous faites en ligne. Si vous ne savez pas pourquoi ce changement s'est produit, vous ne voulez probablement pas l'accepter.</translation> <translation id="6198102561359457428">Déconnectez-vous, puis connectez-vous de nouveau...</translation> <translation id="6198252989419008588">Modifier le NIP</translation> +<translation id="6200047250927636406">Supprimer le fichier</translation> <translation id="6202304368170870640">Vous pouvez utiliser votre NIP pour vous connecter à votre appareil ou pour le déverrouiller.</translation> <translation id="6206311232642889873">Cop&ier l'image</translation> <translation id="6207200176136643843">Rétablir le niveau de zoom par défaut</translation> @@ -4821,7 +4822,6 @@ <ph name="DOMAIN" /> vous demande de laisser votre carte à puce insérée.</translation> <translation id="628352644014831790">4 secondes</translation> <translation id="6285120108426285413">Le fichier <ph name="FILE_NAME" /> n'est pas souvent téléchargé et peut être dangereux.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nouvelle imprimante sur le réseau}one{Nouvelle imprimante sur le réseau}other{Nouvelles imprimantes sur le réseau}}</translation> <translation id="6285770818046456882">L'appareil qui partage du contenu avec vous a annulé le transfert</translation> <translation id="6290613030083731160">Aucun appareil à proximité avec qui partager du contenu. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Vérification du code d'activation en cours… Cette opération peut prendre quelques minutes.</translation> @@ -5304,6 +5304,7 @@ <translation id="6831043979455480757">Traduire</translation> <translation id="6833479554815567477">Onglet retiré du groupe <ph name="GROUP_NAME" /> : <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Passer à un navigateur intelligent et sécurisé</translation> +<translation id="6834652994408928492">Le mode sombre s'activera automatiquement au coucher du soleil</translation> <translation id="683540480453879381">Ouvrir les fichiers <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Veuillez vous connecter à Internet pour mettre à jour votre <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Demander la permission lorsqu'un site souhaite ouvrir et placer des fenêtres sur vos écrans (recommandé)</translation> @@ -6016,6 +6017,7 @@ <translation id="7622114377921274169">Charge en cours…</translation> <translation id="7622768823216805500">Les sites font généralement appel à des modules de paiement pour proposer certaines fonctionnalités d'achat, comme un paiement plus simple</translation> <translation id="7622903810087708234">Renseignements sur le mot de passe</translation> +<translation id="7622966771025050155">Passer à l'onglet capturé</translation> <translation id="7624337243375417909">verrouillage des majuscules désactivé</translation> <translation id="7625568159987162309">Afficher les autorisations et les données stockées sur tous les sites</translation> <translation id="7628201176665550262">Fréquence d'actualisation</translation> @@ -6182,6 +6184,7 @@ <translation id="7784067724422331729">Les paramètres de sécurité de votre ordinateur ont entraîné le blocage de ce fichier.</translation> <translation id="7784796923038949829">Impossible de lire ou de modifier les données du site</translation> <translation id="778480864305029524">Pour utiliser la fonction Partage de connexion instantané, activez les notifications pour les services Google Play.</translation> +<translation id="7785471469930192436">Le cas échéant, consultez les instructions de votre moteur de recherche pour supprimer votre historique de recherche</translation> <translation id="7786889348652477777">Actua&liser l'application</translation> <translation id="7787308148023287649">Afficher sur un autre écran</translation> <translation id="7788298548579301890">Un autre programme sur votre ordinateur a ajouté une application qui risque de modifier le fonctionnement de Google Chrome. @@ -6793,6 +6796,7 @@ <translation id="8438566539970814960">Amélioration des recherches et de la navigation</translation> <translation id="8439506636278576865">Me proposer de traduire les pages dans cette langue</translation> <translation id="8440630305826533614">Applications Linux</translation> +<translation id="8446225304314102060">Passer à l'onglet <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">En savoir plus</translation> <translation id="8447409163267621480">Vous devez inclure la touche Ctrl ou Alt</translation> <translation id="8448729345478502352">Agrandir ou réduire les éléments affichés</translation> @@ -7455,6 +7459,7 @@ <translation id="9148058034647219655">Quitter</translation> <translation id="9148126808321036104">Connectez-vous de nouveau</translation> <translation id="9148963623915467028">Ce site peut accéder à votre position.</translation> +<translation id="9149529198050266366">Le mode sombre se désactivera automatiquement au lever du soleil</translation> <translation id="9149866541089851383">Modifier...</translation> <translation id="9150045010208374699">Utiliser votre caméra</translation> <translation id="9150079578948279438">Impossible de retirer le profil. Veuillez réessayer ou communiquer avec votre fournisseur de services pour obtenir de l'assistance technique.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 9bf8a468..f7e4fb3 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">Dissocier l'appareil Bluetooth</translation> <translation id="1651008383952180276">Vous devez saisir deux fois la même phrase secrète</translation> <translation id="1652326691684645429">Activer le Partage à proximité</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Ajoutez l'imprimante à Google Cloud Print pour imprimer des documents où que vous soyez.}one{Ajoutez # imprimante à Google Cloud Print pour imprimer des documents où que vous soyez.}other{Ajoutez # imprimantes à Google Cloud Print pour imprimer des documents où que vous soyez.}}</translation> <translation id="1653631694606464309">En général, les applis Web demandent l'autorisation d'ouvrir certains types de fichiers pour vous permettre de travailler sur ces fichiers où vous le souhaitez, par exemple dans votre outil de traitement de texte préféré</translation> <translation id="1656528038316521561">Opacité de l'arrière-plan</translation> <translation id="1657406563541664238">Nous aider à améliorer <ph name="PRODUCT_NAME" /> en envoyant automatiquement les statistiques d'utilisation et les rapports d'erreur à Google</translation> @@ -2765,7 +2764,7 @@ au moyen de <ph name="CONTROL_PANEL_APPLET_NAME" /> dans le panneau de configuration. Souhaitez-vous lancer <ph name="CONTROL_PANEL_APPLET_NAME" /> ?</translation> -<translation id="3942420633017001071">Diagnostics</translation> +<translation id="3942420633017001071">Diagnostic</translation> <translation id="3943494825379372497">Restaurer les applis et les pages ?</translation> <translation id="3943582379552582368">R&etour</translation> <translation id="3943857333388298514">Coller</translation> @@ -2904,7 +2903,6 @@ <translation id="4094647278880271855">Vous utilisez une variable d'environnement non compatible : <ph name="BAD_VAR" />. La stabilité et la sécurité en seront affectées.</translation> <translation id="4095264805865317199">Ouvrir l'UI d'activation mobile</translation> <translation id="4095507791297118304">Affichage principal</translation> -<translation id="409579654357498729">Ajouter à Google Cloud Print</translation> <translation id="4096508467498758490">Désactiver les extensions exécutées en mode développeur ?</translation> <translation id="4097406557126260163">Applications et extensions</translation> <translation id="409742781329613461">Conseils pour Chrome</translation> @@ -4821,7 +4819,6 @@ <ph name="DOMAIN" /> vous demande de laisser votre carte à puce insérée.</translation> <translation id="628352644014831790">4 secondes</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> n'est pas un fichier couramment téléchargé. Il est peut-être dangereux.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nouvelle imprimante sur le réseau}one{Nouvelle imprimante sur le réseau}other{Nouvelles imprimantes sur le réseau}}</translation> <translation id="6285770818046456882">L'appareil qui partage du contenu avec vous a annulé le transfert</translation> <translation id="6290613030083731160">Aucun appareil disponible pour partager du contenu à proximité. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Vérification du code d'activation… Cela peut prendre quelques minutes.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 33c5c50..8845029 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -612,7 +612,6 @@ <translation id="164936512206786300">Desvincular dispositivo Bluetooth</translation> <translation id="1651008383952180276">Debes introducir a mesma frase de acceso dúas veces</translation> <translation id="1652326691684645429">Activar Compartir por Nearby</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Engade a impresora a Google Cloud Print para poder imprimir desde calquera lugar.}other{Engade # impresoras a Google Cloud Print para poder imprimir desde calquera lugar.}}</translation> <translation id="1653631694606464309">As aplicacións web adoitan pedir permiso para abrir certos tipos de ficheiros, o que che ofrece a posibilidade de traballar con eles onde queiras (por exemplo, abrir documentos co teu procesador de texto preferido)</translation> <translation id="1656528038316521561">Opacidade do fondo</translation> <translation id="1657406563541664238">Axúdanos a mellorar <ph name="PRODUCT_NAME" /> enviando automaticamente estatísticas de uso e informes de erros a Google</translation> @@ -2901,7 +2900,6 @@ <translation id="4094647278880271855">Estás usando unha variable de ambiente non compatible: <ph name="BAD_VAR" />. A estabilidade e a seguranza veranse afectadas.</translation> <translation id="4095264805865317199">Abrir IU de activación móbil</translation> <translation id="4095507791297118304">Pantalla principal</translation> -<translation id="409579654357498729">Engadir a Cloud Print</translation> <translation id="4096508467498758490">Desactivar extensións do modo de programador</translation> <translation id="4097406557126260163">Aplicacións e extensións</translation> <translation id="409742781329613461">Consellos para Chrome</translation> @@ -4817,7 +4815,6 @@ <ph name="DOMAIN" /> require que manteñas a tarxeta intelixente inserida.</translation> <translation id="628352644014831790">4 segundos</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> non se descarga habitualmente e pode ser perigoso.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nova impresora na túa rede}other{Novas impresoras na túa rede}}</translation> <translation id="6285770818046456882">O dispositivo que estaba compartindo o ficheiro contigo cancelou a transferencia</translation> <translation id="6290613030083731160">Non hai dispositivos próximos dispoñibles para compartir ficheiros. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verificando código de activación. Esta acción pode tardar uns minutos.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 965ffa6..0b8394a 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">બ્લૂટૂથ ડિવાઇસ સાથેનું જોડાણ તોડો</translation> <translation id="1651008383952180276">તમારે તે જ પાસફ્રેઝ બે વાર દાખલ કરવો આવશ્યક છે</translation> <translation id="1652326691684645429">'નજીકના શેર' સુવિધા ચાલુ કરો</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google ક્લાઉડ પ્રિન્ટમાં પ્રિન્ટર ઉમેરો જેથી તમે ગમે-ત્યાંથી પ્રિન્ટ કાઢી શકો.}one{Google ક્લાઉડ પ્રિન્ટમાં # પ્રિન્ટર ઉમેરો જેથી તમે ગમે-ત્યાંથી પ્રિન્ટ કાઢી શકો.}other{Google ક્લાઉડ પ્રિન્ટમાં # પ્રિન્ટર ઉમેરો જેથી તમે ગમે-ત્યાંથી પ્રિન્ટ કાઢી શકો.}}</translation> <translation id="1653631694606464309">સામાન્ય રીતે વેબ ઍપ અમુક ચોક્કસ પ્રકારની ફાઇલો ખોલવા માટે પૂછે છે જેથી તમે ઇચ્છો તે ઍપમાં તે ફાઇલો ખોલીને તેના પર કામ કરી શકો, જેમ કે તમારી પસંદગીના વર્ડ પ્રોસેસરમાં દસ્તાવેજો ખોલવા</translation> <translation id="1656528038316521561">બૅકગ્રાઉન્ડની અપારદર્શકતા</translation> <translation id="1657406563541664238">ઉપયોગનાં આંકડાઓ અને ક્રૅશ રિપોર્ટ ઑટોમૅટિક રીતે Googleને મોકલીને <ph name="PRODUCT_NAME" />ને વધુ સારું બનાવવામાં મદદ કરો</translation> @@ -2901,7 +2900,6 @@ <translation id="4094647278880271855">તમે અનસપોર્ટેડ એન્વાયર્મેન્ટ વૅરિએબલનો ઉપયોગ કરી રહ્યા છો: <ph name="BAD_VAR" />. સ્થિરતા અને સુરક્ષા જોખમાશે.</translation> <translation id="4095264805865317199">સેલ્યુલર સક્રિયકરણ UI ખોલો</translation> <translation id="4095507791297118304">પ્રાથમિક ડિસ્પ્લે</translation> -<translation id="409579654357498729">ક્લાઉડ પ્રિન્ટ પર ઉમેરો</translation> <translation id="4096508467498758490">ડેવલપર મોડ એક્સ્ટેન્શન બંધ કરો</translation> <translation id="4097406557126260163">ઍપ અને એક્સ્ટેંશન</translation> <translation id="409742781329613461">Chrome માટે ટિપ</translation> @@ -4819,7 +4817,6 @@ <ph name="DOMAIN" /> માટે જરૂરી છે કે તમે તમારું સ્માર્ટ કાર્ડ દાખલ કરેલું રાખો.</translation> <translation id="628352644014831790">4 સેકન્ડ</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> સામાન્ય રીતે ડાઉનલોડ થયેલું નથી અને જોખમકારક હોઈ શકે છે.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{તમારા નેટવર્ક પર નવું પ્રિન્ટર}one{તમારા નેટવર્ક પર નવા પ્રિન્ટર્સ}other{તમારા નેટવર્ક પર નવા પ્રિન્ટર્સ}}</translation> <translation id="6285770818046456882">તમારી સાથે શેર કરી રહેલા ડિવાઇસે ટ્રાન્સફર રદ કર્યું</translation> <translation id="6290613030083731160">નજીકમાં શેર કરનારું કોઈ ડિવાઇસ ઉપલબ્ધ નથી. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="6291086328725007688">સક્રિયકરણનો કોડ ચકાસી રહ્યાં છીએ. આમાં થોડો સમય લાગી શકે છે.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index a1d9be41..52fa3f3 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">ब्लूटूथ डिवाइस से जुड़ा हुआ डिवाइस हटाएं</translation> <translation id="1651008383952180276">आपको एक ही 'पासफ़्रेज़' दो बार डालना होगा</translation> <translation id="1652326691684645429">आस-पास शेयर करने की सुविधा चालू करें</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{'Google क्लाउड प्रिंट' में प्रिंटर जोड़ें ताकि आप कहीं से भी प्रिंट कर सकें.}one{'Google क्लाउड प्रिंट' में # प्रिंटर जोड़ें ताकि आप कहीं से भी प्रिंट कर सकें.}other{'Google क्लाउड प्रिंट' में # प्रिंटर जोड़ें ताकि आप कहीं से भी प्रिंट कर सकें.}}</translation> <translation id="1653631694606464309">वेब ऐप्लिकेशन, आम तौर पर कुछ खास तरह की फ़ाइलें खोलने के लिए कहते हैं, इसलिए आप उन फ़ाइलों पर किसी भी सॉफ़्टवेयर की मदद से काम कर सकते हैं. जैसे, दस्तावेज़ों को अपनी पसंद के वर्ड प्रोसेसर में खोलना</translation> <translation id="1656528038316521561">बैकग्राउंड की ओपैसिटी</translation> <translation id="1657406563541664238">Google को अपने आप इस्तेमाल के आंकड़े और खराबी रिपोर्ट भेजकर <ph name="PRODUCT_NAME" /> को बेहतर बनाने में मदद करें</translation> @@ -2917,7 +2916,6 @@ <translation id="4094647278880271855">आप ऐसे एनवायरमेंट वैरिएबल का इस्तेमाल कर रहे हैं जो काम नहीं करता है: <ph name="BAD_VAR" />. स्थिरता और सुरक्षा पर असर पड़ेगा.</translation> <translation id="4095264805865317199">'सेल्युलर एक्टिवेशन यूज़र इंटरफ़ेस (यूआई)' खोलें</translation> <translation id="4095507791297118304">प्राथमिक डिसप्ले</translation> -<translation id="409579654357498729">क्लाउड प्रिंट में जोड़ें</translation> <translation id="4096508467498758490">डेवलपर मोड एक्सटेंशन को बंद करें</translation> <translation id="4097406557126260163">ऐप्लिकेशन और एक्सटेंशन</translation> <translation id="409742781329613461">Chrome के लिए सलाहें</translation> @@ -4394,6 +4392,7 @@ <translation id="5794700615121138172">Linux से Chromebook के साथ शेयर किए गए फ़ोल्डर</translation> <translation id="5794786537412027208">सभी Chrome Apps से बाहर निकलें</translation> <translation id="5797070761912323120">खोज, विज्ञापन, और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता है</translation> +<translation id="5797521893972859201">ब्राउज़िंग इतिहास मिटाता है और इसमें खोज बॉक्स का ब्राउज़िंग इतिहास भी शामिल है</translation> <translation id="5798079537501238810">साइटें पेमेंट हैंडलर इंस्टॉल कर सकती हैं</translation> <translation id="579907812742603813">सुरक्षित कॉन्टेंट</translation> <translation id="579915268381781820">आपकी सुरक्षा कुंजी हटा दी गई.</translation> @@ -4477,6 +4476,7 @@ <translation id="5900302528761731119">Google प्रोफ़ाइल फ़ोटो</translation> <translation id="590036993063074298">स्क्रीन शेयर करने की सुविधा की क्वालिटी के बारे में जानकारी</translation> <translation id="5901069264981746702">आपके फ़िंगरप्रिंट का डेटा सुरक्षित तरीके से सेव किया जाता है और यह आपके <ph name="DEVICE_TYPE" /> में ही रहता है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">कैप्चर करने वाले टैब पर जाएं</translation> <translation id="5901494423252125310">प्रिंटर का दरवाज़ा खुला है</translation> <translation id="5901630391730855834">पीला</translation> <translation id="5904614460720589786">कॉन्फ़िगर करते समय हुई गड़बड़ी की वजह से <ph name="APP_NAME" /> को सेट अप नहीं किया जा सका. कृपया अपने एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation> @@ -4749,6 +4749,7 @@ <translation id="6196854373336333322">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह ऑनलाइन किए जाने वाले काम को बदल सकता है, रोक सकता है या उसे छिप कर सुन सकता है. अगर आप पक्का नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation> <translation id="6198102561359457428">साइन आउट करें और फिर से साइन इन करें...</translation> <translation id="6198252989419008588">पिन बदलें</translation> +<translation id="6200047250927636406">फ़ाइल खारिज करें</translation> <translation id="6202304368170870640">आप अपने डिवाइस में साइन इन करने या उसे अनलॉक करने के लिए अपने पिन का इस्तेमाल कर सकते हैं.</translation> <translation id="6206311232642889873">इमेज को कॉपी करें</translation> <translation id="6207200176136643843">डिफ़ॉल्ट ज़ूम स्तर पर रीसेट करें</translation> @@ -4834,7 +4835,6 @@ <ph name="DOMAIN" /> के लिए ज़रूरी है कि आप अपना स्मार्ट कार्ड डालकर रखें.</translation> <translation id="628352644014831790">4 सेकंड</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> को आमतौर पर डाउनलोड नहीं किया जाता और यह खतरनाक हो सकता है.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{आपके नेटवर्क पर नया प्रिंटर}one{आपके नेटवर्क पर नए प्रिंटर}other{आपके नेटवर्क पर नए प्रिंटर}}</translation> <translation id="6285770818046456882">आपके साथ शेयर करने वाले डिवाइस ने ट्रांसफ़र रद्द कर दिया है</translation> <translation id="6290613030083731160">आस-पास शेयर करने वाला कोई भी डिवाइस उपलब्ध नहीं है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="6291086328725007688">ऐक्टिवेशन कोड की पुष्टि की जा रही है. इसमें कुछ मिनट लग सकते हैं.</translation> @@ -5317,6 +5317,7 @@ <translation id="6831043979455480757">Translate</translation> <translation id="6833479554815567477"><ph name="GROUP_NAME" /> ग्रुप में मौजूद टैब हटाया गया - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">किसी स्मार्ट और सुरक्षित ब्राउज़र पर जाएं</translation> +<translation id="6834652994408928492">सूरज की रोशनी न होने पर, 'गहरे रंग वाला मोड' अपने-आप चालू हो जाएगा</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> फ़ाइलें खोलें</translation> <translation id="6835762382653651563">अपने <ph name="DEVICE_TYPE" /> को अपडेट करने के लिए कृपया इंटरनेट से कनेक्ट करें.</translation> <translation id="6838034009068684089">जब कोई साइट, विंडो को खोलकर आपकी स्क्रीन पर लगाना चाहे, तो इसके लिए पूछें (सुझाया गया)</translation> @@ -6029,6 +6030,7 @@ <translation id="7622114377921274169">चार्ज हो रहा है.</translation> <translation id="7622768823216805500">आम तौर पर, साइटें आसान चेकआउट जैसी खरीदारी से जुड़ी सुविधाओं के लिए, पेमेंट हैंडलर (पैसे चुकाने से जुड़े सॉफ़्टवेयर) इंस्टॉल करती हैं</translation> <translation id="7622903810087708234">पासवर्ड की जानकारी</translation> +<translation id="7622966771025050155">कैप्चर किए गए टैब पर जाएं</translation> <translation id="7624337243375417909">caps lock बंद है</translation> <translation id="7625568159987162309">सभी साइटों की अनुमतियां और साइटों पर स्टोर डेटा देखें</translation> <translation id="7628201176665550262">रीफ़्रेश दर</translation> @@ -6195,6 +6197,7 @@ <translation id="7784067724422331729">आपके कंप्यूटर की सुरक्षा सेटिंग ने इस फ़ाइल को अवरोधित किया है.</translation> <translation id="7784796923038949829">साइट का डेटा पढ़ा या बदला नहीं जा सकता</translation> <translation id="778480864305029524">इंस्टैंट टेदरिंग का इस्तेमाल करने के लिए, Google Play सेवाओं के लिए सूचनाएं चालू करें.</translation> +<translation id="7785471469930192436">अपना खोज इतिहास मिटाने के लिए, अपने सर्च इंजन के निर्देश देखें, अगर लागू हो</translation> <translation id="7786889348652477777">और ऐप्लिकेशन रीलोड करें</translation> <translation id="7787308148023287649">किसी दूसरी स्क्रीन पर दिखाएं</translation> <translation id="7788298548579301890">आपके कंप्यूटर पर किसी दूसरे प्रोग्राम ने ऐसा ऐप्लिकेशन जोड़ा है जो Chrome के काम करने के तरीके को बदल सकता है. @@ -6806,6 +6809,7 @@ <translation id="8438566539970814960">खोजों और ब्राउज़िंग को बेहतर बनाएं</translation> <translation id="8439506636278576865">इस भाषा में पृष्ठों का अनुवाद करने का ऑफ़र दें</translation> <translation id="8440630305826533614">Linux ऐप्लिकेशन</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> टैब पर जाएं</translation> <translation id="8446884382197647889">ज़्यादा जानें</translation> <translation id="8447409163267621480">Ctrl या Alt में से किसी एक को शामिल करें</translation> <translation id="8448729345478502352">अपनी स्क्रीन पर मौजूद आइटम को छोटा या बड़ा करें</translation> @@ -7467,6 +7471,7 @@ <translation id="9148058034647219655">बाहर निकलें</translation> <translation id="9148126808321036104">फिर से साइन इन करें</translation> <translation id="9148963623915467028">यह साइट आपकी जगह की जानकारी ऐक्सेस कर सकती है.</translation> +<translation id="9149529198050266366">सूरज की रोशनी में 'गहरे रंग वाला मोड' अपने-आप बंद हो जाएगा</translation> <translation id="9149866541089851383">बदलाव करें...</translation> <translation id="9150045010208374699">अपना कैमरा उपयोग करें</translation> <translation id="9150079578948279438">प्रोफ़ाइल को नहीं हटाया जा सका. कृपया फिर से कोशिश करें या तकनीकी सहायता पाने के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 79b9d8fb..c76b04ec 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">Rasparivanje Bluetooth uređaja</translation> <translation id="1651008383952180276">Morate dvaput unijeti istu šifru</translation> <translation id="1652326691684645429">Omogući dijeljenje u blizini</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Dodajte pisač na Google Cloud Print kako biste mogli ispisivati s bilo kojeg mjesta.}one{Dodajte # pisač na Google Cloud Print kako biste mogli ispisivati s bilo kojeg mjesta.}few{Dodajte # pisača na Google Cloud Print kako biste mogli ispisivati s bilo kojeg mjesta.}other{Dodajte # pisača na Google Cloud Print kako biste mogli ispisivati s bilo kojeg mjesta.}}</translation> <translation id="1653631694606464309">Web-aplikacije obično traže dopuštenje za otvaranje određenih vrsta datoteka kako biste mogli raditi na njima gdje god želite, primjerice otvoriti dokumente u željenom programu za obradu teksta</translation> <translation id="1656528038316521561">Prozirnost pozadine</translation> <translation id="1657406563541664238">Olakšajte nam poboljšanje preglednika <ph name="PRODUCT_NAME" /> automatskim slanjem statistike o upotrebi i izvješća o padu programa Googleu</translation> @@ -2905,7 +2904,6 @@ <translation id="4094647278880271855">Koristite nepodržanu varijablu okruženja: <ph name="BAD_VAR" />. Ugrožena je stabilnost i sigurnost.</translation> <translation id="4095264805865317199">Otvori korisničko sučelje za mobilnu aktivaciju</translation> <translation id="4095507791297118304">Primarni zaslon</translation> -<translation id="409579654357498729">Dodaj na Cloud Print</translation> <translation id="4096508467498758490">Onemogućivanje proširenja u načinu rada razvojnog programera</translation> <translation id="4097406557126260163">Aplikacije i proširenja</translation> <translation id="409742781329613461">Savjeti za Chrome</translation> @@ -4824,7 +4822,6 @@ <ph name="DOMAIN" /> zahtijeva da vaša pametna kartica ostane umetnuta.</translation> <translation id="628352644014831790">Četiri sekunde</translation> <translation id="6285120108426285413">Datoteka <ph name="FILE_NAME" /> obično se ne preuzima i mogla bi biti opasna.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Novi pisač na vašoj mreži}one{Novi pisači na vašoj mreži}few{Novi pisači na vašoj mreži}other{Novi pisači na vašoj mreži}}</translation> <translation id="6285770818046456882">Dijeljenje uređaja s vama otkazalo je prijenos</translation> <translation id="6290613030083731160">U blizini nema uređaja dostupnih za dijeljenje. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6291086328725007688">U tijeku je potvrđivanje aktivacijskog koda. To može potrajati nekoliko minuta.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 6670845..7fd8c39 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Bluetooth-párosítás megszüntetése</translation> <translation id="1651008383952180276">Mindkét alkalommal ugyanazt az összetett jelszót kell megadnia</translation> <translation id="1652326691684645429">Közeli megosztás bekapcsolása</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Adja hozzá a nyomtatót a Google Cloud Print szolgáltatáshoz, hogy bárhonnan nyomtathasson.}other{Adjon hozzá # nyomtatót a Google Cloud Print szolgáltatáshoz, hogy bárhonnan nyomtathasson.}}</translation> <translation id="1653631694606464309">Az internetes alkalmazások általában rákérdeznek bizonyos fájltípusok megnyitására, így Ön ott dolgozhat a fájlokkal, ahol szeretne; például a kedvenc szövegszerkesztőjében nyithatja meg a dokumentumokat.</translation> <translation id="1656528038316521561">Háttér átlátszatlansága</translation> <translation id="1657406563541664238">Segítsen a <ph name="PRODUCT_NAME" /> fejlesztésében azáltal, hogy automatikusan elküldi a használati statisztikákat és hibajelentéseket a Google részére</translation> @@ -2915,7 +2914,6 @@ <translation id="4094647278880271855">Nem támogatott környezeti változót használ: <ph name="BAD_VAR" />. Ennek a stabilitás és a biztonság látja kárát.</translation> <translation id="4095264805865317199">Mobilhálózati aktiválás kezelőfelületének megnyitása</translation> <translation id="4095507791297118304">Elsődleges kijelző</translation> -<translation id="409579654357498729">Hozzáadás a Cloud Printhez</translation> <translation id="4096508467498758490">A fejlesztői módban futó bővítmények kikapcsolása</translation> <translation id="4097406557126260163">Alkalmazások és bővítmények</translation> <translation id="409742781329613461">Tippek a Chrome-hoz</translation> @@ -4394,6 +4392,7 @@ <translation id="5794700615121138172">Megosztott Linux-mappák</translation> <translation id="5794786537412027208">Összes Chrome-alkalmazás bezárása</translation> <translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására</translation> +<translation id="5797521893972859201">Törli az előzményeket, köztük a keresőmező előzményeit is.</translation> <translation id="5798079537501238810">A webhelyek telepíthetik a fizetéskezelőket</translation> <translation id="579907812742603813">védett tartalmak</translation> <translation id="579915268381781820">Eltávolította a biztonsági hardverkulcsot.</translation> @@ -4477,6 +4476,7 @@ <translation id="5900302528761731119">Google-profil fotó</translation> <translation id="590036993063074298">A tükrözés minőségének részletei</translation> <translation id="5901069264981746702">Az ujjlenyomatadatokat a(z) <ph name="DEVICE_TYPE" /> biztonságosan tárolja, és soha nem kerülnek ki az eszközről. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> +<translation id="5901089233978050985">Váltás rögzítő lapra</translation> <translation id="5901494423252125310">A nyomtató fedele nyitva van</translation> <translation id="5901630391730855834">Sárga</translation> <translation id="5904614460720589786">A(z) <ph name="APP_NAME" /> beállítása konfigurációs probléma miatt nem sikerült. Forduljon a rendszergazdájához. Hibakód: <ph name="ERROR_CODE" />.</translation> @@ -4749,6 +4749,7 @@ <translation id="6196854373336333322">A(z) <ph name="EXTENSION_NAME" /> bővítmény átvette az irányítást proxybeállításai felett, ami azt jelenti, hogy a bővítmény minden internetes tevékenységét módosíthatja, feltörheti vagy lehallgathatja. Ha nem biztos benne, hogy miért történt a változás, akkor valószínűleg nem is akarja azt.</translation> <translation id="6198102561359457428">Jelentkezzen ki, majd jelentkezzen be újra...</translation> <translation id="6198252989419008588">PIN-kód megváltoztatása</translation> +<translation id="6200047250927636406">Fájl elvetése</translation> <translation id="6202304368170870640">PIN-kódjával bejelentkezhet, és feloldhatja eszköze zárolását.</translation> <translation id="6206311232642889873">Ké&p másolása</translation> <translation id="6207200176136643843">Visszaállítás az alapértelmezett nagyítási szintre</translation> @@ -4834,7 +4835,6 @@ A(z) <ph name="DOMAIN" /> megköveteli, hogy ne távolítsa el az intelligens kártyát.</translation> <translation id="628352644014831790">4 másodperc</translation> <translation id="6285120108426285413">A(z) <ph name="FILE_NAME" /> fájlt nem gyakran töltik le, és veszélyes lehet.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Új nyomtató a hálózaton}other{Új nyomtatók a hálózaton}}</translation> <translation id="6285770818046456882">A megosztásban részt vevő másik eszköz megszakította az átküldést</translation> <translation id="6290613030083731160">Nincsenek rendelkezésre álló eszközök a Közeli megosztáshoz. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="6291086328725007688">Az aktiváló kód ellenőrzése folyamatban van. Ez eltarthat néhány percig.</translation> @@ -5317,6 +5317,7 @@ <translation id="6831043979455480757">Fordítás</translation> <translation id="6833479554815567477">Lap eltávolítva a következő csoportból: <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Váltás intelligens és biztonságos böngészőre</translation> +<translation id="6834652994408928492">A sötét mód automatikusan bekapcsol naplementekor</translation> <translation id="683540480453879381">A következő kiterjesztésű fájlok megnyitása: <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">A(z) <ph name="DEVICE_TYPE" /> frissítése érdekében csatlakozzon az internethez.</translation> <translation id="6838034009068684089">Kérdezzen rá, amikor a webhelyek ablakokat nyitnának meg és helyeznének el a képernyőn</translation> @@ -6029,6 +6030,7 @@ <translation id="7622114377921274169">Töltés.</translation> <translation id="7622768823216805500">A webhelyek általában fizetéskezelőket telepítenek bizonyos vásárlási funkciók (például az egyszerűbb fizetés) biztosítása érdekében</translation> <translation id="7622903810087708234">Jelszó részletes adatai</translation> +<translation id="7622966771025050155">Váltás rögzített lapra</translation> <translation id="7624337243375417909">caps lock kikapcsolva</translation> <translation id="7625568159987162309">A webhelyek engedélyeinek és az általuk tárolt adatoknak a megtekintése</translation> <translation id="7628201176665550262">Frissítési gyakoriság</translation> @@ -6195,6 +6197,7 @@ <translation id="7784067724422331729">A számítógép biztonsági beállításai letiltották ezt a fájlt.</translation> <translation id="7784796923038949829">Nem lehetséges a webhely adatainak olvasása és módosítása</translation> <translation id="778480864305029524">Az azonnali internetmegosztás használatához kapcsolja be a Google Play-szolgáltatások értesítéseit.</translation> +<translation id="7785471469930192436">A keresési előzmények törléséről a keresőmotorja útmutatójából tájékozódhat, ha van ilyen</translation> <translation id="7786889348652477777">Alkalmazás új&ratöltése</translation> <translation id="7787308148023287649">Megjelenítés másik képernyőn</translation> <translation id="7788298548579301890">A számítógépén lévő egyik program hozzáadott egy alkalmazást, amely megváltoztathatja a Chrome működését. @@ -6806,6 +6809,7 @@ <translation id="8438566539970814960">Keresések és böngészés javítása</translation> <translation id="8439506636278576865">Kínálja fel az ezen a nyelven írt oldalak fordítását</translation> <translation id="8440630305826533614">Linux-alkalmazások</translation> +<translation id="8446225304314102060">Váltás erre a lapra: <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">További információ</translation> <translation id="8447409163267621480">Használja a Ctrl vagy az Alt gombot</translation> <translation id="8448729345478502352">Nagyíthatja és kicsinyítheti a képernyőn megjelenő elemeket</translation> @@ -7467,6 +7471,7 @@ <translation id="9148058034647219655">Kilépés</translation> <translation id="9148126808321036104">Jelentkezzen be újra</translation> <translation id="9148963623915467028">Ez a webhely hozzáférhet az Ön tartózkodási helyéhez.</translation> +<translation id="9149529198050266366">A sötét mód automatikusan kikapcsol napkeltekor</translation> <translation id="9149866541089851383">Szerkesztés...</translation> <translation id="9150045010208374699">Kamera használata</translation> <translation id="9150079578948279438">A profilt nem sikerült eltávolítani. Próbálja újra, vagy technikai segítségért forduljon a szolgáltatójához.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index daaa14a..d89b6e5 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Անջատել Bluetooth սարքը</translation> <translation id="1651008383952180276">Դուք պետք է երկու անգամ մուտքագրեք միևնույն անցաբառը</translation> <translation id="1652326691684645429">Միացնել մոտակա սարքերի հետ փոխանակումը</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Ավելացրեք տպիչ Google Cloud Print-ին, որպեսզի կարողանաք տպել ցանկացած վայրից:}one{Ավելացրեք # տպիչ Google Cloud Print-ին, որպեսզի կարողանաք տպել ցանկացած վայրից:}other{Ավելացրեք # տպիչ Google Cloud Print-ին, որպեսզի կարողանաք տպել ցանկացած վայրից:}}</translation> <translation id="1653631694606464309">Սովորաբար վեբ հավելվածները որոշակի տեսակի ֆայլեր բացելու թույլտվություն են խնդրում, որպեսզի դուք կարողանաք ֆայլերի հետ աշխատել ձեր նախընտրած հավելվածում։</translation> <translation id="1656528038316521561">Ֆոնի թափանցիկությունը</translation> <translation id="1657406563541664238">Օգնեք բարելավել <ph name="PRODUCT_NAME" />-ը՝ ավտոմատ Google-in ուղարկելով օգտագործման վիճակագրությունը և խափանումների մասին հաշվետվությունները</translation> @@ -2904,7 +2903,6 @@ <translation id="4094647278880271855">Դուք օգտագործում եք միջավայրի չաջակցվող փոփոխական՝ <ph name="BAD_VAR" />: Դա կազդի կայունության և անվտանգության վրա:</translation> <translation id="4095264805865317199">Բացել բջջացին ցանցի ակտիվացման միջերեսը</translation> <translation id="4095507791297118304">Հիմնական էկրան</translation> -<translation id="409579654357498729">Ավելացնել Cloud Print-ին</translation> <translation id="4096508467498758490">Անջատեք մշակողի ռեժիմի ընդլայնումները</translation> <translation id="4097406557126260163">Հավելվածներ և ընդլայնումներ</translation> <translation id="409742781329613461">Խորհուրդներ Chrome-ի օգտագործման համար</translation> @@ -4383,6 +4381,7 @@ <translation id="5794700615121138172">Լինուքսի ընդհանուր պանակներ</translation> <translation id="5794786537412027208">Դուրս գալ Chrome-ի բոլոր հավելվածներից</translation> <translation id="5797070761912323120">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել` Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> +<translation id="5797521893972859201">Մաքրում է պատմությունը, այդ թվում որոնման դաշտում</translation> <translation id="5798079537501238810">Կայքերը կարող են տեղադրել վճարումների մշակիչներ</translation> <translation id="579907812742603813">պաշտպանված բովանդակություն</translation> <translation id="579915268381781820">Անվտանգության բանալին հեռացվել է:</translation> @@ -4466,6 +4465,7 @@ <translation id="5900302528761731119">Google պրոֆիլի լուսանկար</translation> <translation id="590036993063074298">Հայելապատճենման որակի մանրամասները</translation> <translation id="5901069264981746702">Մատնահետքի տվյալներն ապահով պահվում են ձեր <ph name="DEVICE_TYPE" /> սարքում և երբեք չեն փոխանցվում այլ անձանց։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Անցնել «լուսանկարում» ներդիր</translation> <translation id="5901494423252125310">Տպիչի դռնակը բաց է</translation> <translation id="5901630391730855834">Դեղին</translation> <translation id="5904614460720589786">Կազմաձևման խնդրի պատճառով չհաջողվեց կարգավորել <ph name="APP_NAME" /> հավելվածը։ Դիմեք ձեր ադմինիստրատորին։ Սխալի կոդը՝ <ph name="ERROR_CODE" />։</translation> @@ -4738,6 +4738,7 @@ <translation id="6196854373336333322">Ձեր պրոքսիի կարգավորումները վերահսկվում են «<ph name="EXTENSION_NAME" />» ընդլայնման կողմից: Դա նշանակում է, որ այն կարող է փոխել, խափանել կամ աննկատ գրառել այն ամենը, ինչ անում եք առցանց: Եթե չգիտեք, թե ինչու է այդ փոփոխությունը տեղի ունեցել, հավանաբար դուք դա չէիք ուզում:</translation> <translation id="6198102561359457428">Դուրս գրվել և նորից մուտք գործել…</translation> <translation id="6198252989419008588">Փոխել PIN-ը</translation> +<translation id="6200047250927636406">Հեռացնել ֆայլը</translation> <translation id="6202304368170870640">Դուք կարող եք օգտագործել ձեր PIN կոդը՝ ձեր սարք մտնելու կամ այն ապակողպելու համար:</translation> <translation id="6206311232642889873">Պատ&ճենել պատկերը</translation> <translation id="6207200176136643843">Վերակայել կանխադրված մասշտաբը</translation> @@ -4823,7 +4824,6 @@ Համաձայն <ph name="DOMAIN" /> տիրույթի կանոնների՝ խելացի քարտը պետք է տեղադրված լինի։</translation> <translation id="628352644014831790">4 վայրկյան</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ֆայլը խորհուրդ չի տրվում ներբեռնել, այն կարող է վտանգավոր լինել:</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ձեր ցանցում նոր տպիչ է հայտնվել}one{Ձեր ցանցում նոր տպիչներ են հայտնվել}other{Ձեր ցանցում նոր տպիչներ են հայտնվել}}</translation> <translation id="6285770818046456882">Ուղարկողը չեղարկել է տվյալների փոխանցումը</translation> <translation id="6290613030083731160">Մոտակայքում չկան սարքեր, որոնց հետ հնարավոր է տվյալներ փոխանակել։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Ակտիվացման կոդը ստուգվում է։ Դա կարող է մի քանի րոպե տևել։</translation> @@ -5306,6 +5306,7 @@ <translation id="6831043979455480757">Թարգմանել</translation> <translation id="6833479554815567477">Ներդիրը հեռացվեց «<ph name="GROUP_NAME" />» խմբից – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Ընտրեք խելացի ու անվտանգ դիտարկիչ</translation> +<translation id="6834652994408928492">Մութն ընկնելուն պես մուգ ռեժիմը ավտոմատ կմիանա</translation> <translation id="683540480453879381">Բացել <ph name="FILE_EXTENSIONS" /> ֆայլերը</translation> <translation id="6835762382653651563">Ձեր <ph name="DEVICE_TYPE" /> սարքը թարմացնելու համար կապակցվեք համացանցին:</translation> <translation id="6838034009068684089">Հարցնել, երբ կայքն ուզում է բացել և տեղակայել պատուհաններ ձեր էկրաններին (խորհուրդ է տրվում)</translation> @@ -6018,6 +6019,7 @@ <translation id="7622114377921274169">Լիցքավորում</translation> <translation id="7622768823216805500">Կայքերը սովորաբար վճարումների մշակիչներ են տեղադրում գնումների գործառույթների, օրինակ՝ արագ վճարման համար</translation> <translation id="7622903810087708234">Տեղեկություններ գաղտնաբառերի մասին</translation> +<translation id="7622966771025050155">Անցնել «լուսանկարված» ներդիր</translation> <translation id="7624337243375417909">Caps Lock-ն անջատված է</translation> <translation id="7625568159987162309">Դիտել թույլտվությունները և կայքերում պահված տվյալները</translation> <translation id="7628201176665550262">Թարմացման հաճախականություն</translation> @@ -6184,6 +6186,7 @@ <translation id="7784067724422331729">Ձեր համակարգչի անվտանգության կարգավորումներն արգելափակել են այս ֆայլը:</translation> <translation id="7784796923038949829">Չի կարող կարդալ կամ փոխել կայքի տվյալները</translation> <translation id="778480864305029524">Ակնթարթային մուտքի կետն օգտագործելու համար միացրեք Google Play ծառայությունների ծանուցումները։</translation> +<translation id="7785471469930192436">Որոնումների պատմությունը ջնջելու համար կարդացեք ձեր որոնողական համակարգի համապատասխան ցուցումները։</translation> <translation id="7786889348652477777">&Վերաբեռնել հավելվածը</translation> <translation id="7787308148023287649">Ցուցադրել այլ էկրանին</translation> <translation id="7788298548579301890">Մեկ այլ ծրագիր ձեր համակարգչում ավելացրել է հավելված, որը կարող է ազդել Chrome-ի աշխատանքի վրա: @@ -6793,6 +6796,7 @@ <translation id="8438566539970814960">Լավացնել որոնումն ու էջերի դիտումը</translation> <translation id="8439506636278576865">Առաջարկել թարգմանել էջերն այս լեզվով</translation> <translation id="8440630305826533614">Լինուքսի հավելվածներ</translation> +<translation id="8446225304314102060">Անցնել <ph name="TAB_ORIGIN" /> ներդիր</translation> <translation id="8446884382197647889">Մանրամասն</translation> <translation id="8447409163267621480">Սկզբում սեղմեք Ctrl կամ Alt</translation> <translation id="8448729345478502352">Փոփոխեք էկրանի տարրերի չափը</translation> @@ -7455,6 +7459,7 @@ <translation id="9148058034647219655">Ելնել</translation> <translation id="9148126808321036104">Նորից մուտք գործել</translation> <translation id="9148963623915467028">Այս կայքը կարող է օգտագործել ձեր տեղադրության մասին տվյալները։</translation> +<translation id="9149529198050266366">Լույսը բացվելուն պես մուգ ռեժիմը ավտոմատ կանջատվի</translation> <translation id="9149866541089851383">Փոխել…</translation> <translation id="9150045010208374699">Օգտագործել տեսախցիկը</translation> <translation id="9150079578948279438">Չհաջողվեց հեռացնել պրոֆիլը։ Նորից փորձեք կամ դիմեք օպերատորին՝ տեխնիկական աջակցման համար։</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 0fbeebb..41320009 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Lepaskan sambungan perangkat Bluetooth</translation> <translation id="1651008383952180276">Anda harus memasukkan frasa sandi yang sama dua kali</translation> <translation id="1652326691684645429">Aktifkan Berbagi Langsung</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Tambahkan printer ke Google Cloud Print agar Anda dapat mencetak dari mana saja.}other{Tambahkan # printer ke Google Cloud Print agar Anda dapat mencetak dari mana saja.}}</translation> <translation id="1653631694606464309">Aplikasi web biasanya meminta untuk membuka jenis file tertentu agar Anda dapat menangani file tersebut di aplikasi yang Anda inginkan, seperti membuka dokumen di pemroses kata pilihan Anda</translation> <translation id="1656528038316521561">Opasitas latar belakang</translation> <translation id="1657406563541664238">Bantu menjadikan <ph name="PRODUCT_NAME" /> lebih baik dengan mengirim statistik penggunaan dan laporan kerusakan secara otomatis ke Google</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Anda menggunakan variabel lingkungan yang tidak didukung: <ph name="BAD_VAR" />. Stabilitas dan keamanan akan terganggu.</translation> <translation id="4095264805865317199">Buka UI Aktivasi Seluler</translation> <translation id="4095507791297118304">Tampilan utama</translation> -<translation id="409579654357498729">Tambahkan ke Cloud Print</translation> <translation id="4096508467498758490">Nonaktifkan ekstensi mode pengembang</translation> <translation id="4097406557126260163">Aplikasi dan ekstensi</translation> <translation id="409742781329613461">Tips untuk Chrome</translation> @@ -4395,6 +4393,7 @@ <translation id="5794700615121138172">Folder bersama Linux</translation> <translation id="5794786537412027208">Keluar dari semua Aplikasi Chrome</translation> <translation id="5797070761912323120">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya</translation> +<translation id="5797521893972859201">Menghapus histori, termasuk di kotak penelusuran</translation> <translation id="5798079537501238810">Situs dapat menginstal pengendali pembayaran</translation> <translation id="579907812742603813">konten yang dilindungi</translation> <translation id="579915268381781820">Kunci keamanan Anda dihapus.</translation> @@ -4478,6 +4477,7 @@ <translation id="5900302528761731119">Foto Google profil</translation> <translation id="590036993063074298">Detail Kualitas Pencerminan</translation> <translation id="5901069264981746702">Data sidik jari Anda disimpan dengan aman dan hanya ada di <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Beralih ke tab yang sedang direkam</translation> <translation id="5901494423252125310">Tutup printer terbuka</translation> <translation id="5901630391730855834">Kuning</translation> <translation id="5904614460720589786">Tidak dapat menyiapkan <ph name="APP_NAME" /> karena ada masalah konfigurasi. Harap hubungi administrator Anda. Kode error: <ph name="ERROR_CODE" />.</translation> @@ -4750,6 +4750,7 @@ <translation id="6196854373336333322">Ekstensi "<ph name="EXTENSION_NAME" />" telah mengambil alih kontrol setelan proxy Anda, yang berarti ekstensi dapat mengubah, merusak, atau menyadap apa pun yang Anda lakukan secara online. Jika tidak yakin mengapa perubahan ini terjadi, mungkin Anda tidak menginginkannya.</translation> <translation id="6198102561359457428">Keluar kemudian masuk lagi...</translation> <translation id="6198252989419008588">Ubah PIN</translation> +<translation id="6200047250927636406">Hapus file</translation> <translation id="6202304368170870640">Anda dapat menggunakan PIN untuk login atau membuka kunci perangkat.</translation> <translation id="6206311232642889873">Sali&n Gambar</translation> <translation id="6207200176136643843">Reset ke tingkat zoom default</translation> @@ -4835,7 +4836,6 @@ <ph name="DOMAIN" /> mengharuskan Anda tetap memasang kartu smart.</translation> <translation id="628352644014831790">4 detik</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> tidak biasa didownload dan mungkin berbahaya.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printer baru di jaringan Anda}other{Printer baru di jaringan Anda}}</translation> <translation id="6285770818046456882">Perangkat yang berbagi dengan Anda membatalkan transfer</translation> <translation id="6290613030083731160">Tidak ada perangkat yang tersedia untuk berbagi di sekitar. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Memverifikasi kode aktivasi. Proses ini mungkin perlu waktu beberapa menit.</translation> @@ -5318,6 +5318,7 @@ <translation id="6831043979455480757">Terjemahkan</translation> <translation id="6833479554815567477">Tab dihapus dari grup <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Beralih ke browser cerdas dan aman</translation> +<translation id="6834652994408928492">Mode gelap akan otomatis diaktifkan saat matahari terbenam</translation> <translation id="683540480453879381">Membuka file <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Sambungkan ke internet untuk memperbarui <ph name="DEVICE_TYPE" /> Anda.</translation> <translation id="6838034009068684089">Tanyakan saat situs ingin membuka dan menempatkan jendela di layar Anda (direkomendasikan)</translation> @@ -6030,6 +6031,7 @@ <translation id="7622114377921274169">Mengisi daya.</translation> <translation id="7622768823216805500">Situs biasanya menginstal pengelola pembayaran untuk fitur belanja seperti pembayaran yang lebih mudah</translation> <translation id="7622903810087708234">Detail sandi</translation> +<translation id="7622966771025050155">Beralih ke tab yang telah direkam</translation> <translation id="7624337243375417909">caps lock nonaktif</translation> <translation id="7625568159987162309">Lihat izin dan data yang disimpan di seluruh situs</translation> <translation id="7628201176665550262">Rasio Refresh</translation> @@ -6196,6 +6198,7 @@ <translation id="7784067724422331729">Setelan keamanan di komputer Anda memblokir file ini.</translation> <translation id="7784796923038949829">Tidak dapat membaca atau mengubah data situs</translation> <translation id="778480864305029524">Untuk menggunakan Tethering Instan, aktifkan notifikasi untuk Layanan Google Play.</translation> +<translation id="7785471469930192436">Lihat petunjuk mesin telusur untuk menghapus histori penelusuran Anda, jika memungkinkan</translation> <translation id="7786889348652477777">&Muat Ulang Aplikasi</translation> <translation id="7787308148023287649">Tampilkan di layar lain</translation> <translation id="7788298548579301890">Program lain di komputer Anda menambahkan aplikasi yang dapat mengubah cara kerja Chrome. @@ -6808,6 +6811,7 @@ <translation id="8438566539970814960">Jadikan penelusuran dan penjelajahan lebih baik</translation> <translation id="8439506636278576865">Tawarkan penerjemahan halaman ke dalam bahasa ini</translation> <translation id="8440630305826533614">Aplikasi Linux</translation> +<translation id="8446225304314102060">Beralih ke tab <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Pelajari Lebih Lanjut</translation> <translation id="8447409163267621480">Sertakan Ctrl atau Alt</translation> <translation id="8448729345478502352">Membuat item di layar menjadi lebih kecil atau lebih besar</translation> @@ -7469,6 +7473,7 @@ <translation id="9148058034647219655">Keluar</translation> <translation id="9148126808321036104">Login sekali lagi</translation> <translation id="9148963623915467028">Situs ini dapat mengakses lokasi Anda</translation> +<translation id="9149529198050266366">Mode gelap akan otomatis dinonaktifkan saat matahari terbit</translation> <translation id="9149866541089851383">Edit...</translation> <translation id="9150045010208374699">Menggunakan kamera Anda</translation> <translation id="9150079578948279438">Profil tidak dapat dihapus. Coba lagi atau hubungi operator Anda untuk meminta dukungan teknis.</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index c1df1a1..177cf74a 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">Aftengja Bluetooth-tæki</translation> <translation id="1651008383952180276">Þú verður að slá sama aðgangsorðið inn tvisvar</translation> <translation id="1652326691684645429">Kveikja á Nærdeilingu</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Bættu prentaranum við Google skýjaprentun til að prenta hvaðan sem er.}one{Bættu # prentara við Google skýjaprentun til að prenta hvaðan sem er.}other{Bættu # prenturum við Google skýjaprentun til að prenta hvaðan sem er.}}</translation> <translation id="1653631694606464309">Vefforrit biðja yfirleitt um að opna tilteknar skráargerðir svo þú getir unnið að þessum skrám þar sem þú vilt, eins og að opna skjöl í ritvinnsluforriti að eigin vali</translation> <translation id="1656528038316521561">Gagnsæi bakgrunns</translation> <translation id="1657406563541664238">Hjálpa til við að bæta <ph name="PRODUCT_NAME" /> með því að senda sjálfkrafa talnagögn um notkun og tilkynningar um hrun til Google</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Þú ert að nota óstudda umhverfisbreytu: <ph name="BAD_VAR" />. Þetta hefur áhrif á stöðugleika og öryggi.</translation> <translation id="4095264805865317199">Opna viðmót fyrir farsímavirkjun</translation> <translation id="4095507791297118304">Aðalskjár</translation> -<translation id="409579654357498729">Bæta við skýjaprentun</translation> <translation id="4096508467498758490">Slökkva á viðbótum í forritarastillingu</translation> <translation id="4097406557126260163">Forrit og viðbætur</translation> <translation id="409742781329613461">Ábendingar fyrir Chrome</translation> @@ -4835,7 +4833,6 @@ <ph name="DOMAIN" /> krefst þess að snjallkortið sé haft í.</translation> <translation id="628352644014831790">4 sekúndur</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> er ekki sótt oft og kann að vera hættulegt.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nýr prentari á netinu}one{Nýir prentarar á netinu}other{Nýir prentarar á netinu}}</translation> <translation id="6285770818046456882">Tækið sem er að deila með þér hætti við flutninginn</translation> <translation id="6290613030083731160">Engin tæki eru að deila nálægt. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Staðfestir virkjunarkóða. Þetta gæti tekið nokkrar mínútur.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index cf229c08..824b0c1 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Disaccoppiare dispositivo Bluetooth</translation> <translation id="1651008383952180276">Devi inserire la stessa passphrase due volte</translation> <translation id="1652326691684645429">Attiva Condivisione nelle vicinanze</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Aggiungi la stampante a Google Cloud Print per poter stampare ovunque.}other{Aggiungi # stampanti a Google Cloud Print per poter stampare ovunque.}}</translation> <translation id="1653631694606464309">Generalmente le app web chiedono di aprire determinati tipi di file in modo che tu possa lavorarci con il programma che vuoi, ad esempio con il tuo elaboratore di testi preferito</translation> <translation id="1656528038316521561">Opacità sfondo</translation> <translation id="1657406563541664238">Aiutaci a migliorare <ph name="PRODUCT_NAME" /> inviando automaticamente a Google le statistiche sull'utilizzo e segnalazioni sugli arresti anomali</translation> @@ -2903,7 +2902,6 @@ <translation id="4094647278880271855">Stai utilizzando una variabile di ambiente non supportata: <ph name="BAD_VAR" />. Sicurezza e stabilità ne risentiranno.</translation> <translation id="4095264805865317199">Apri UI di attivazione rete mobile</translation> <translation id="4095507791297118304">Display principale</translation> -<translation id="409579654357498729">Aggiungi a Cloud Print</translation> <translation id="4096508467498758490">Disattiva estensioni in modalità sviluppatore</translation> <translation id="4097406557126260163">App ed estensioni</translation> <translation id="409742781329613461">Suggerimenti per Chrome</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Cartelle condivise di Linux</translation> <translation id="5794786537412027208">Chiudi tutte le app di Chrome</translation> <translation id="5797070761912323120">Google può utilizzare la tua cronologia per personalizzare la Ricerca, gli annunci e altri servizi Google</translation> +<translation id="5797521893972859201">Viene cancellata la cronologia, anche nella casella di ricerca</translation> <translation id="5798079537501238810">I siti possono installare gestori dei pagamenti</translation> <translation id="579907812742603813">contenuti protetti</translation> <translation id="579915268381781820">Il token di sicurezza è stato rimosso.</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Foto profilo Google</translation> <translation id="590036993063074298">Informazioni sulla qualità del mirroring</translation> <translation id="5901069264981746702">I dati relativi alle tue impronte vengono memorizzati in modo sicuro e non possono essere trasferiti in alcun modo dal tuo <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Scopri di più<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Passa alla scheda in fase di acquisizione</translation> <translation id="5901494423252125310">Sportello della stampante aperto</translation> <translation id="5901630391730855834">Giallo</translation> <translation id="5904614460720589786">Impossibile installare <ph name="APP_NAME" /> a causa di un problema di configurazione. Contatta l'amministratore. Codice di errore: <ph name="ERROR_CODE" />.</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">L'estensione "<ph name="EXTENSION_NAME" />" ha assunto il controllo delle tue impostazioni proxy, il che significa che può cambiare, interrompere o intercettare tutto ciò che fai online. Se non sei sicuro del motivo per cui si sia verificato questo cambiamento, è probabile che sia indesiderato.</translation> <translation id="6198102561359457428">Esci e accedi di nuovo...</translation> <translation id="6198252989419008588">Modifica PIN</translation> +<translation id="6200047250927636406">Ignora file</translation> <translation id="6202304368170870640">Puoi utilizzare il PIN per accedere al tuo dispositivo o per sbloccarlo.</translation> <translation id="6206311232642889873">Cop&ia immagine</translation> <translation id="6207200176136643843">Ripristina il livello di zoom predefinito</translation> @@ -4819,7 +4820,6 @@ <ph name="DOMAIN" /> richiede di lasciare la smart card inserita.</translation> <translation id="628352644014831790">4 secondi</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> non viene scaricato spesso e potrebbe essere pericoloso.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nuova stampante in rete}other{Nuove stampanti in rete}}</translation> <translation id="6285770818046456882">Il dispositivo che stava condividendo dei contenuti ha annullato il trasferimento</translation> <translation id="6290613030083731160">Non sono disponibili dispositivi per condividere contenuti nelle vicinanze. <ph name="LINK_BEGIN" />Scopri di più<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verifica del codice di attivazione in corso. Questa operazione può richiedere alcuni minuti.</translation> @@ -5302,6 +5302,7 @@ <translation id="6831043979455480757">Traduci</translation> <translation id="6833479554815567477">Scheda spostata dal gruppo <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Passa a un browser intelligente e sicuro</translation> +<translation id="6834652994408928492">La modalità Buio verrà attivata automaticamente al tramonto</translation> <translation id="683540480453879381">Apri file <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Connettiti a Internet per aggiornare il tuo <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Chiedi conferma quando un sito vuole aprire e posizionare finestre sugli schermi (opzione consigliata)</translation> @@ -6014,6 +6015,7 @@ <translation id="7622114377921274169">In carica.</translation> <translation id="7622768823216805500">In genere, i siti installano gestori dei pagamenti per funzionalità di acquisto come il pagamento semplificato</translation> <translation id="7622903810087708234">Dettagli password</translation> +<translation id="7622966771025050155">Passa alla scheda acquisita</translation> <translation id="7624337243375417909">bloc maiusc non attivo</translation> <translation id="7625568159987162309">Visualizza le autorizzazioni e i dati memorizzati sui siti</translation> <translation id="7628201176665550262">Frequenza di aggiornamento</translation> @@ -6180,6 +6182,7 @@ <translation id="7784067724422331729">Le impostazioni di sicurezza del computer hanno bloccato questo file.</translation> <translation id="7784796923038949829">Impossibile leggere i dati del sito o modificarli</translation> <translation id="778480864305029524">Per usare il tethering istantaneo devi attivare le notifiche di Google Play Services.</translation> +<translation id="7785471469930192436">Consulta le istruzioni del tuo motore di ricerca per eliminare la tua cronologia delle ricerche, se possibile</translation> <translation id="7786889348652477777">&Ricarica app</translation> <translation id="7787308148023287649">Mostra sull'altro schermo</translation> <translation id="7788298548579301890">Un altro programma sul computer ha aggiunto un'app che potrebbe modificare il funzionamento di Chrome. @@ -6792,6 +6795,7 @@ <translation id="8438566539970814960">Migliora le ricerche e le attività di navigazione</translation> <translation id="8439506636278576865">Proponi di tradurre pagine in questa lingua</translation> <translation id="8440630305826533614">App Linux</translation> +<translation id="8446225304314102060">Passa alla scheda <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Ulteriori informazioni</translation> <translation id="8447409163267621480">Includi CTRL o ALT</translation> <translation id="8448729345478502352">Ingrandisci o rimpicciolisci gli elementi sullo schermo</translation> @@ -7453,6 +7457,7 @@ <translation id="9148058034647219655">Esci</translation> <translation id="9148126808321036104">Esegui di nuovo l'accesso</translation> <translation id="9148963623915467028">Questo sito può accedere alla tua posizione.</translation> +<translation id="9149529198050266366">La modalità Buio verrà disattivata automaticamente all'alba</translation> <translation id="9149866541089851383">Modifica...</translation> <translation id="9150045010208374699">Utilizzare la fotocamera</translation> <translation id="9150079578948279438">Impossibile rimuovere il profilo. Riprova oppure contatta il tuo operatore per ricevere assistenza tecnica.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 63092c0..88f7dab 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">ביטול הצמדה של התקן Bluetooth</translation> <translation id="1651008383952180276">עליך להזין אותו ביטוי סיסמה פעמיים</translation> <translation id="1652326691684645429">הפעלה של 'שיתוף בקרבת מקום'</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{יש להוסיף את המדפסת אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}two{יש להוסיף # מדפסות אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}many{יש להוסיף # מדפסות אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}other{יש להוסיף # מדפסות אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}}</translation> <translation id="1653631694606464309">לרוב, אפליקציות אינטרנט מציגות בקשה לפתיחת סוגי קבצים מסוימים כדי שניתן יהיה לעבוד על הקבצים האלה בתוכנות הרצויות לך. לדוגמה: פתיחת מסמכים במעבד התמלילים המועדף עליך</translation> <translation id="1656528038316521561">שקיפות רקע</translation> <translation id="1657406563541664238">רוצה לעזור לנו לשפר את <ph name="PRODUCT_NAME" /> על ידי שליחה אוטומטית של נתוני שימוש ודוחות קריסה אל Google?</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">נעשה שימוש במשתנה סביבה שאינו נתמך: <ph name="BAD_VAR" />. השימוש בו פוגע ביציבות ובאבטחה.</translation> <translation id="4095264805865317199">פתיחת ממשק המשתמש להפעלה סלולרית</translation> <translation id="4095507791297118304">צג ראשי</translation> -<translation id="409579654357498729">הוספה ל-Google Cloud Print</translation> <translation id="4096508467498758490">השבתת תוספים של מצב מפתח</translation> <translation id="4097406557126260163">אפליקציות ותוספים</translation> <translation id="409742781329613461">טיפים לשימוש ב-Chrome</translation> @@ -4395,6 +4393,7 @@ <translation id="5794700615121138172">תיקיות משותפות של Linux</translation> <translation id="5794786537412027208">יציאה מכל אפליקציות Chrome</translation> <translation id="5797070761912323120">Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים</translation> +<translation id="5797521893972859201">יתבצע ניקוי של ההיסטוריה שבתיבת החיפוש</translation> <translation id="5798079537501238810">אתרים מורשים להתקין רכיבי handler של תשלומים</translation> <translation id="579907812742603813">תוכן מוגן</translation> <translation id="579915268381781820">מפתח האבטחה שלך הוסר.</translation> @@ -4478,6 +4477,7 @@ <translation id="5900302528761731119">תמונת פרופיל Google</translation> <translation id="590036993063074298">פרטי האיכות של שיקוף המסך</translation> <translation id="5901069264981746702">נתוני טביעות האצבע מאוחסנים באופן מאובטח ואף פעם לא נשלחים ממכשיר ה-<ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">לכרטיסיית ההקלטה</translation> <translation id="5901494423252125310">דלת המדפסת פתוחה</translation> <translation id="5901630391730855834">צהוב</translation> <translation id="5904614460720589786">לא ניתן להתקין את האפליקציה <ph name="APP_NAME" /> עקב בעיה בהגדרות. יש לפנות למנהל המערכת. קוד שגיאה: <ph name="ERROR_CODE" />.</translation> @@ -4750,6 +4750,7 @@ <translation id="6196854373336333322">התוסף "<ph name="EXTENSION_NAME" />" השתלט על הגדרות שרת ה-Proxy. פירוש הדבר שהוא יכול לשנות ולקטוע לכל פעולה שביצעת באינטרנט או לצותת לה. אם לא ידוע לך בוודאות מדוע שינוי זה התרחש, סביר להניח שזהו שינוי לא רצוי.</translation> <translation id="6198102561359457428">יש לצאת ולהיכנס שוב...</translation> <translation id="6198252989419008588">שינוי קוד אימות</translation> +<translation id="6200047250927636406">מחיקת הקובץ</translation> <translation id="6202304368170870640">קוד האימות מאפשר להיכנס למכשיר או לבטל את נעילתו.</translation> <translation id="6206311232642889873">העת&קת תמונה</translation> <translation id="6207200176136643843">איפוס למרחק התצוגה המוגדר כברירת המחדל</translation> @@ -4835,7 +4836,6 @@ כדי לעבוד עם הדומיין <ph name="DOMAIN" />, צריך להשאיר את הכרטיס החכם בפנים.</translation> <translation id="628352644014831790">4 שניות</translation> <translation id="6285120108426285413">הורדת הקובץ <ph name="FILE_NAME" /> אינה נפוצה והוא עלול להיות מסוכן.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{מדפסת חדשה ברשת שלך}two{מדפסות חדשות ברשת שלך}many{מדפסות חדשות ברשת שלך}other{מדפסות חדשות ברשת שלך}}</translation> <translation id="6285770818046456882">ההעברה בוטלה במכשיר שמשתף איתך</translation> <translation id="6290613030083731160">אין מכשירים זמינים שמשתפים בקרבת מקום. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="6291086328725007688">מתבצע אימות של קוד ההפעלה. הפעולה עשויה להימשך מספר דקות.</translation> @@ -5318,6 +5318,7 @@ <translation id="6831043979455480757">תרגום</translation> <translation id="6833479554815567477">הכרטיסייה הוסרה מהקבוצה <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">החלפה לדפדפן חכם ובטוח</translation> +<translation id="6834652994408928492">מצב כהה יופעל באופן אוטומטי בשעת השקיעה</translation> <translation id="683540480453879381">פתיחת קבצים מסוג <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">יש להתחבר לאינטרנט כדי לעדכן את ה-<ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">תוצג שאלה כשאתר ירצה לפתוח ולהציב חלונות במסכים שלך (מומלץ)</translation> @@ -6030,6 +6031,7 @@ <translation id="7622114377921274169">בטעינה.</translation> <translation id="7622768823216805500">אתרים מתקינים בדרך כלל רכיבי handler של תשלומים כדי להציע תכונות קנייה, כמו תשלום קל יותר בקופה</translation> <translation id="7622903810087708234">פרטי סיסמה</translation> +<translation id="7622966771025050155">לכרטיסייה המוקלטת</translation> <translation id="7624337243375417909">caps lock מושבת</translation> <translation id="7625568159987162309">הצגת הרשאות ונתונים המאוחסנים באתרים שונים</translation> <translation id="7628201176665550262">קצב רענון</translation> @@ -6196,6 +6198,7 @@ <translation id="7784067724422331729">הגדרות אבטחה במחשב שלך חסמו קובץ זה.</translation> <translation id="7784796923038949829">אי אפשר לקרוא את נתוני האתר או לשנות אותם</translation> <translation id="778480864305029524">כדי להשתמש בשיתוף אינטרנט מיידי בין מכשירים, צריך להפעיל את ההודעות של שירותי Google Play.</translation> +<translation id="7785471469930192436">ניתן לעיין בהוראות של מנוע החיפוש שמשמש אותך לגבי מחיקת היסטוריית החיפושים, אם רלוונטי</translation> <translation id="7786889348652477777">&טעינת האפליקציה מחדש</translation> <translation id="7787308148023287649">הצגה במסך אחר</translation> <translation id="7788298548579301890">תוכנית אחרת במחשב הוסיפה יישום שעשוי לשנות את אופן הפעולה של Chrome. @@ -6809,6 +6812,7 @@ <translation id="8438566539970814960">שיפור החיפושים והגלישה</translation> <translation id="8439506636278576865">הצעות לתרגום דפים שנכתבו בשפה זו</translation> <translation id="8440630305826533614">אפליקציות Linux</translation> +<translation id="8446225304314102060">לכרטיסייה <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">למידע נוסף</translation> <translation id="8447409163267621480">יש לכלול את Ctrl או Alt</translation> <translation id="8448729345478502352">הגדלה או הקטנה של פריטים במסך</translation> @@ -7472,6 +7476,7 @@ <translation id="9148058034647219655">יציאה</translation> <translation id="9148126808321036104">כניסה חוזרת</translation> <translation id="9148963623915467028">האתר הזה קיבל גישה למיקום שלך.</translation> +<translation id="9149529198050266366">מצב כהה יושבת באופן אוטומטי בשעת הזריחה</translation> <translation id="9149866541089851383">עריכה…</translation> <translation id="9150045010208374699">להשתמש במצלמה</translation> <translation id="9150079578948279438">לא ניתן היה להסיר את הפרופיל. יש לנסות שוב, או לפנות לספק לקבלת תמיכה טכנית.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index b2c49eb..4a4965e 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Bluetooth デバイスのペア設定の解除</translation> <translation id="1651008383952180276">同じパスフレーズを 2 回入力する必要があります</translation> <translation id="1652326691684645429">ニアバイシェアを有効にする</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{プリンタを Google クラウド プリントに追加してください。登録したプリンタにはどこからでも印刷できます。}other{# 件のプリンタを Google クラウド プリントに追加してください。登録したプリンタにはどこからでも印刷できます。}}</translation> <translation id="1653631694606464309">ウェブアプリは、ユーザーが作業しやすいように、ファイル形式が関連付けられたプログラムを開くよう求めることがあります(普段使用しているワード プロセッサーでドキュメントを開くなど)</translation> <translation id="1656528038316521561">背景の透明度</translation> <translation id="1657406563541664238">使用統計データや障害レポートを Google に自動送信して <ph name="PRODUCT_NAME" /> の機能向上に役立てる</translation> @@ -2903,7 +2902,6 @@ <translation id="4094647278880271855">サポートされていない環境変数が使用されています: <ph name="BAD_VAR" />。これにより、安全性とセキュリティが損なわれます。</translation> <translation id="4095264805865317199">モバイル有効化 UI を開く</translation> <translation id="4095507791297118304">メイン ディスプレイ</translation> -<translation id="409579654357498729">クラウド プリントに追加</translation> <translation id="4096508467498758490">デベロッパー モードの拡張機能を無効にする</translation> <translation id="4097406557126260163">アプリと拡張機能</translation> <translation id="409742781329613461">Chrome のヒント</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Linux の共有フォルダ</translation> <translation id="5794786537412027208">すべての Chrome アプリを終了</translation> <translation id="5797070761912323120">検索、広告、その他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります</translation> +<translation id="5797521893972859201">検索ボックスなどの履歴を削除します</translation> <translation id="5798079537501238810">サイトが支払いハンドラをインストールできるようにする</translation> <translation id="579907812742603813">保護されたコンテンツ</translation> <translation id="579915268381781820">セキュリティ キーは削除されています。</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Google プロフィール写真</translation> <translation id="590036993063074298">ミラーリング品質の詳細</translation> <translation id="5901069264981746702">指紋データは <ph name="DEVICE_TYPE" /> にのみ安全に保存されます。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">キャプチャ中のタブに切り替え</translation> <translation id="5901494423252125310">プリンタの扉が開いています</translation> <translation id="5901630391730855834">黄</translation> <translation id="5904614460720589786">設定に問題があったため、<ph name="APP_NAME" /> をセットアップできませんでした。管理者にお問い合わせください。エラーコード: <ph name="ERROR_CODE" />。</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">拡張機能「<ph name="EXTENSION_NAME" />」によってプロキシ設定が制御されています。オンラインで行う操作は、この拡張機能によって変更、遮断、傍受される可能性があります。この変更が行われた理由に心当たりがない場合、これは不正な変更と考えられます。</translation> <translation id="6198102561359457428">ログアウトしてから再度ログイン...</translation> <translation id="6198252989419008588">PIN を変更</translation> +<translation id="6200047250927636406">ファイルを破棄</translation> <translation id="6202304368170870640">デバイスのログインやロック解除に PIN を使用できます。</translation> <translation id="6206311232642889873">画像をコピー(&Y)</translation> <translation id="6207200176136643843">リセットしてデフォルトのズームレベルに戻す</translation> @@ -4819,7 +4820,6 @@ <ph name="DOMAIN" /> では必ずスマートカードを挿入した状態にしてください。</translation> <translation id="628352644014831790">4秒</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> は一般的にダウンロードされているファイルではなく、危害を及ぼす可能性があります。</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ネットワーク上の新しいプリンタ}other{ネットワーク上の新しいプリンタ}}</translation> <translation id="6285770818046456882">共有元のデバイスによって転送がキャンセルされました</translation> <translation id="6290613030083731160">近くに共有可能なデバイスはありません。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="6291086328725007688">アクティベーション コードを確認しています。この処理には数分かかることがあります。</translation> @@ -5302,6 +5302,7 @@ <translation id="6831043979455480757">翻訳</translation> <translation id="6833479554815567477">タブを <ph name="GROUP_NAME" /> グループから削除しました - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">スマートで安全なブラウザをぜひご利用ください</translation> +<translation id="6834652994408928492">ダークモードは日の入り時刻に自動的にオンになります</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> ファイルを開く</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" /> を更新するにはインターネットに接続してください。</translation> <translation id="6838034009068684089">サイトから画面上にウィンドウを開いて配置することを求められたときに確認する(推奨)</translation> @@ -6014,6 +6015,7 @@ <translation id="7622114377921274169">充電しています。</translation> <translation id="7622768823216805500">多くのサイトは、お支払い手続きを簡易化するなど、ショッピングをより快適にするために支払いハンドラをインストールします。</translation> <translation id="7622903810087708234">パスワードの詳細</translation> +<translation id="7622966771025050155">キャプチャしたタブに切り替え</translation> <translation id="7624337243375417909">CapsLock オフ</translation> <translation id="7625568159987162309">すべてのサイトに保存されている権限とデータを表示</translation> <translation id="7628201176665550262">リフレッシュ レート</translation> @@ -6180,6 +6182,7 @@ <translation id="7784067724422331729">お使いのパソコンのセキュリティ設定により、このファイルはブロックされました。</translation> <translation id="7784796923038949829">サイトのデータを読み取れないか、変更できません</translation> <translation id="778480864305029524">インスタント テザリングを使用するには、Google Play 開発者サービスの通知を有効にしてください。</translation> +<translation id="7785471469930192436">検索履歴を削除する場合は、お使いの検索エンジンの手順をご確認ください(該当する場合)</translation> <translation id="7786889348652477777">アプリを再読み込み(&R)</translation> <translation id="7787308148023287649">別の画面で表示</translation> <translation id="7788298548579301890">パソコン上の別のプログラムにより、Chrome の動作に影響を及ぼす可能性のあるアプリが追加されました。 @@ -6791,6 +6794,7 @@ <translation id="8438566539970814960">検索とブラウジングを改善する</translation> <translation id="8439506636278576865">この言語のページで翻訳ツールを表示する</translation> <translation id="8440630305826533614">Linux アプリ</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> のタブに切り替え</translation> <translation id="8446884382197647889">詳細</translation> <translation id="8447409163267621480">Ctrl キーまたは Alt キーが必要です</translation> <translation id="8448729345478502352">アイテムの表示サイズを変更します</translation> @@ -7452,6 +7456,7 @@ <translation id="9148058034647219655">終了</translation> <translation id="9148126808321036104">もう一度ログインする</translation> <translation id="9148963623915467028">このサイトでは位置情報へのアクセスが許可されています。</translation> +<translation id="9149529198050266366">ダークモードは日の出時刻に自動的にオフになります</translation> <translation id="9149866541089851383">編集...</translation> <translation id="9150045010208374699">カメラを使用する</translation> <translation id="9150079578948279438">プロファイルを削除できませんでした。もう一度お試しいただくか、ご利用の携帯通信会社のテクニカル サポートにお問い合わせください。</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 569fb41..e3fee1d5 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Bluetooth მოწყობილობის დაწყვილების გაუქმება</translation> <translation id="1651008383952180276">შეყვანილი საიდუმლო ფრაზები უნდა ემთხვეოდეს</translation> <translation id="1652326691684645429">მახლობლად გაზიარების გააქტიურება</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{დაამატეთ პრინტერი Google Cloud Print-ს ნებისმიერი ადგილიდან ბეჭდვისთვის.}other{დაამატეთ # პრინტერი Google Cloud Print-ს ნებისმიერი ადგილიდან ბეჭდვისთვის.}}</translation> <translation id="1653631694606464309">როგორც წესი, ვებ-აპები კონკრეტული ტიპის ფაილების გახსნას ითხოვს იმისთვის, რომ ამ ფაილებთან სასურველ ადგილას იმუშაოთ, მაგალითად, როცა დოკუმენტების გახსნა ამა თუ იმ ტექსტურ რედაქტორში გსურთ</translation> <translation id="1656528038316521561">ფონის გაუმჭვირობა</translation> <translation id="1657406563541664238">დახმარება აუმჯობესებს <ph name="PRODUCT_NAME" /> ს Google-ისათვის მეხსიერების სტატისტიკის და ავარიული ანგარიშების ავტომატურ მიწოდებას</translation> @@ -2903,7 +2902,6 @@ <translation id="4094647278880271855">თქვენ იყენებთ გარემოს მხარდაუჭერელ ცვლადს: <ph name="BAD_VAR" />. აღნიშნული უარყოფითად იმოქმედებს სტაბილურობასა და უსაფრთხოებაზე.</translation> <translation id="4095264805865317199">მობილური ქსელის გააქტიურების ინტერფეისის გახსნა</translation> <translation id="4095507791297118304">ძირითადი ეკრანი</translation> -<translation id="409579654357498729">Cloud Print-ში დამატება</translation> <translation id="4096508467498758490">შემმუშავებლის რეჟიმის გაფართოებების გამორთვა</translation> <translation id="4097406557126260163">აპები და გაფართოებები</translation> <translation id="409742781329613461">რჩევები Chrome-ისთვის</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Linux-ის გაზიარებული საქაღალდეები</translation> <translation id="5794786537412027208">Chrome-ის ყველა პროგრამის დახურვა</translation> <translation id="5797070761912323120">Google-მა შეიძლება გამოიყენოს თქვენი ისტორია Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation> +<translation id="5797521893972859201">გაასუფთავებს ისტორიას, მათ შორის, საძიებო ველში</translation> <translation id="5798079537501238810">საიტებს შეუძლია გადახდის დამმუშავებლების ინსტალაცია</translation> <translation id="579907812742603813">დაცული კონტენტი</translation> <translation id="579915268381781820">თქვენი უსაფრთხოების გასაღები ამოღებულია.</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Google პროფილის ფოტო</translation> <translation id="590036993063074298">დეტალები არეკვლის ფუნქციის ხარისხის შესახებ</translation> <translation id="5901069264981746702">თქვენი თითის ანაბეჭდის მონაცემები უსაფრთხოდ შეინახება მხოლოდ და მხოლოდ თქვენს <ph name="DEVICE_TYPE" />-ზე. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">აღბეჭდად ჩანართზე გადართვა</translation> <translation id="5901494423252125310">პრინტერის კარი ღიაა</translation> <translation id="5901630391730855834">ყვითელი</translation> <translation id="5904614460720589786"><ph name="APP_NAME" />-ის დაყენება ვერ მოხერხდა კონფიგურაციის პრობლემის გამო. გთხოვთ, დაუკავშირდეთ ადმინისტრატორს. შეცდომის კოდი: <ph name="ERROR_CODE" />.</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">გაფართოება „<ph name="EXTENSION_NAME" />“ ახლა თქვენი პროქსის პარამეტრებს აკონტროლებს, რაც იმას ნიშნავს, რომ მას თქვენი ონლაინ საქმიანობის შეცვლა, შეწყვეტა ან მასზე ფარულად თვალთვალი შეუძლია. თუ ეს ცვლილება გაურკვეველი ხასიათისაა, შესაძლოა, იგი თქვენი ნებართვის გარეშე განხორციელდა.</translation> <translation id="6198102561359457428">გამოდით, შემდეგ ისევ შედით…</translation> <translation id="6198252989419008588">შეცვალეთ PIN-ი</translation> +<translation id="6200047250927636406">ფაილის წაშლა</translation> <translation id="6202304368170870640">PIN-კოდის მეშვეობით შეგიძლიათ თქვენს მოწყობილობაში შესვლა ან მისი განბლოკვა.</translation> <translation id="6206311232642889873">გამოსახულების &კოპირება</translation> <translation id="6207200176136643843">მასშტაბირების ნაგულისხმევ დონეზე გადაყენება</translation> @@ -4819,7 +4820,6 @@ <ph name="DOMAIN" /> მოითხოვს, რომ თქვენი სმარტ-ბარათი ჩასმული იყოს.</translation> <translation id="628352644014831790">4 წამი</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> შეიძლება სახიფათო იყოს, რადგან მისი ჩამოტვირთვა ხშირად არ ხორციელდება ხოლმე.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ახალი პრინტერი თქვენს ქსელში}other{ახალი პრინტერები თქვენს ქსელში}}</translation> <translation id="6285770818046456882">მონაცემთა გადაცემა გაუქმდა მოწყობილობიდან, რომლიდანაც კონტენტი ზიარდებოდა</translation> <translation id="6290613030083731160">ახლომახლო არ არის მოწყობილობები, რომლებიდანაც რაიმე ზიარდება. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="6291086328725007688">მიმდინარეობს გააქტიურების კოდის დადასტურება. ამას შეიძლება რამდენიმე წუთი დასჭირდეს.</translation> @@ -5302,6 +5302,7 @@ <translation id="6831043979455480757">თარგმნა</translation> <translation id="6833479554815567477">ჩანართი ამოიშალა ჯგუფიდან <ph name="GROUP_NAME" /> — <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">გადადით გონიერ და უსაფრთხო ბრაუზერზე</translation> +<translation id="6834652994408928492">მუქი რეჟიმი ავტომატურად ჩაირთვება მზის ჩასვლისას</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> ფაილების გახსნა</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" />-ის განსაახლებლად, გთხოვთ, დაუკავშირდეთ ინტერნეტს.</translation> <translation id="6838034009068684089">შეკითხვა საიტის მიერ თქვენს ეკრანებზე ფანჯრების გახსნისა და განლაგების მოთხოვნისას (რეკომენდებული)</translation> @@ -6014,6 +6015,7 @@ <translation id="7622114377921274169">იტენება.</translation> <translation id="7622768823216805500">როგორც წესი, გადახდის დამმუშავებლები საიტების მიერ ინსტალირდება საყიდლებთან დაკავშირებული მიზნით, მაგალითად, უფრო მარტივი ანგარიშსწორებისთვის</translation> <translation id="7622903810087708234">პაროლის დეტალები</translation> +<translation id="7622966771025050155">აღბეჭდილ ჩანართზე გადართვა</translation> <translation id="7624337243375417909">Caps Lock გამორთულია</translation> <translation id="7625568159987162309">ნებართვებისა და საიტების მასშტაბით შენახული მონაცემების ნახვა</translation> <translation id="7628201176665550262">განახლების სიხშირე</translation> @@ -6180,6 +6182,7 @@ <translation id="7784067724422331729">თქვენს კომპიუტერში არსებულმა უსაფრთხოების პარამეტრებმა გამოწვია ამ ფაილების დაბლოკვა.</translation> <translation id="7784796923038949829">საიტის მონაცემების წაკითხვა თუ შეცვლა ვერ ხერხდება</translation> <translation id="778480864305029524">მყისიერი ტეტერინგის გამოსაყენებლად ჩართეთ შეტყობინებები Google Play Services-ისთვის.</translation> +<translation id="7785471469930192436">გაეცანით თქვენი საძიებო სისტემის ინსტრუქციას იმის თაობაზე, როგორ წაშალოთ თქვენი ძიების ისტორია, თუ ეს შესაძლებელია</translation> <translation id="7786889348652477777">აპის &ხელახლა ჩატვირთვა</translation> <translation id="7787308148023287649">სხვა ეკრანზე ჩვენება</translation> <translation id="7788298548579301890">თქვენს კომპიუტერში არსებულმა სხვა პროგრამამ დაამატა აპი, რომელსაც Chrome-ის მუშაობის შეცვლა შეუძლია. @@ -6790,6 +6793,7 @@ <translation id="8438566539970814960">გააუმჯობესეთ ძიებები და ვებსაიტების დათვალიერება</translation> <translation id="8439506636278576865">გვერდის ამ ენაზე გადათარგმნის შემოთავაზება</translation> <translation id="8440630305826533614">Linux აპები</translation> +<translation id="8446225304314102060">ჩანართზე გადართვა: <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">შეიტყვეთ მეტი</translation> <translation id="8447409163267621480">დაურთეთ Ctrl ან Alt</translation> <translation id="8448729345478502352">ეკრანზე ერთეულების დაპატარავება ან გადიდება</translation> @@ -7451,6 +7455,7 @@ <translation id="9148058034647219655">გასვლა</translation> <translation id="9148126808321036104">ხელახლა შედით</translation> <translation id="9148963623915467028">ამ საიტს შეუძლია თქვენს მდებარეობაზე წვდომა.</translation> +<translation id="9149529198050266366">მუქი რეჟიმი ავტომატურად გამოირთვება მზის ამოსვლისას</translation> <translation id="9149866541089851383">რედაქტირება…</translation> <translation id="9150045010208374699">გამოიყენეთ თქვენი კამერა</translation> <translation id="9150079578948279438">პროფილის ამოშლა ვერ მოხერხდა. ცადეთ ხელახლა ან დაუკავშირდით თქვენს ოპერატორს ტექნიკური მხარდაჭერისთვის.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 2e6e1d2..ee75ce4 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">Bluetooth құрылғысын ажырату</translation> <translation id="1651008383952180276">Бір құпия фразаны екі рет енгізу керек</translation> <translation id="1652326691684645429">Nearby Share функциясын қосу</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Кез келген жерден басып шығара алу үшін, принтерді Google Cloud Print қызметіне қосыңыз.}other{Кез келген жерден басып шығара алу үшін, # принтерді Google Cloud Print қызметіне қосыңыз.}}</translation> <translation id="1653631694606464309">Веб-қолданбалар әдетте белгілі бір файл түрлерімен қалағаныңызша жұмыс істей алуыңыз үшін оларды ашуды сұрайды. Мысалы, құжаттарды қалаған мәтін өңдегіште ашуға болады.</translation> <translation id="1656528038316521561">Фон бұлдырлығы</translation> <translation id="1657406563541664238">Пайдалану статистикасын және бұзылу туралы есептерді Google компаниясына автоматты түрде жіберу арқылы <ph name="PRODUCT_NAME" /> өнімін жақсартуға көмектесіңіз</translation> @@ -2899,7 +2898,6 @@ <translation id="4094647278880271855">Қолдау көрсетілмейтін орта айнымалысын қолданып жатырсыз: <ph name="BAD_VAR" />. Тұрақтылық пен қауіпсіздікке нұқсан келеді.</translation> <translation id="4095264805865317199">Ұялы байланысты іске қосу интерфейсін ашу</translation> <translation id="4095507791297118304">Негізгі дисплей</translation> -<translation id="409579654357498729">Cloud Print қызметіне қосу</translation> <translation id="4096508467498758490">Әзірлеуші режимі кеңейтімдерін өшіру</translation> <translation id="4097406557126260163">Қолданбалар және кеңейтімдер</translation> <translation id="409742781329613461">Chrome браузеріне қатысты кеңестер</translation> @@ -4375,6 +4373,7 @@ <translation id="5794700615121138172">Linux ортақ қалталары</translation> <translation id="5794786537412027208">Барлық Chrome қолданбаларынан шығу</translation> <translation id="5797070761912323120">Search, жарнамалар және басқа да Google қызметтерін жеке қажеттеліктерге бейімдеу үшін Google интернеттегі әрекеттеріңізді пайдалануы мүмкін.</translation> +<translation id="5797521893972859201">Тарих және іздеу өрісіндегі дерек өшіріледі.</translation> <translation id="5798079537501238810">Сайттар төлем өңдегіштерін орната алады.</translation> <translation id="579907812742603813">қорғалған мазмұн</translation> <translation id="579915268381781820">Қауіпсіздік кілтіңіз өшірілді.</translation> @@ -4458,6 +4457,7 @@ <translation id="5900302528761731119">Google профиль фотосуреті</translation> <translation id="590036993063074298">Экран көшірмесін көрсету сапасы туралы мәліметтер</translation> <translation id="5901069264981746702">Саусағыңыздың ізі туралы деректер қауіпсіз сақталған және <ph name="DEVICE_TYPE" /> құрылғысынан басқа ешқайда жіберілмейді. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Суретке түсірілетін қойындыға ауысу</translation> <translation id="5901494423252125310">Принтер есігі ашық</translation> <translation id="5901630391730855834">Сары</translation> <translation id="5904614460720589786">Конфигурациядағы қатеге байланысты <ph name="APP_NAME" /> орнатылмады. Әкімшіге хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation> @@ -4730,6 +4730,7 @@ <translation id="6196854373336333322">«<ph name="EXTENSION_NAME" />» кеңейтімі прокси-сервер параметрлерін бақылауға алды, яғни сіздің онлайн орындайтын кез келген әрекетіңізді өзгерте, бұза немесе ұстап қала алады. Ондай бақылаудың жасалуын қаламасаңыз, кеңейтімді өшіргеніңіз жөн болар.</translation> <translation id="6198102561359457428">Шығып, қайта кіріңіз…</translation> <translation id="6198252989419008588">PIN кодын өзгерту</translation> +<translation id="6200047250927636406">Файлды қабылдамау</translation> <translation id="6202304368170870640">Құрылғыларға кіру немесе құлпын ашу үшін PIN кодыңызды пайдалануыңызға болады.</translation> <translation id="6206311232642889873">Кескінді көші&ру</translation> <translation id="6207200176136643843">Әдепкі масштабтау деңгейін қайтару</translation> @@ -4815,7 +4816,6 @@ <ph name="DOMAIN" /> домені смарт картаңызды салып жүруіңізді талап етеді.</translation> <translation id="628352644014831790">4 секунд</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> әдетте жүктеп алынбайды және ол қауіпті болуы мүмкін.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Желіңіздегі жаңа принтер бар}other{Желіңізде жаңа принтерлер бар}}</translation> <translation id="6285770818046456882">Сізбен бөлісіп жатқан құрылғы тасымалдауды тоқтатты.</translation> <translation id="6290613030083731160">Маңайда сізбен бөлісіп жатқан ешқандай құрылғы жоқ. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Белсендіру коды тексерілуде. Бұл бірнеше минутқа созылуы мүмкін.</translation> @@ -5298,6 +5298,7 @@ <translation id="6831043979455480757">Аудару</translation> <translation id="6833479554815567477">Қойынды "<ph name="GROUP_NAME" />" тобынан (<ph name="GROUP_CONTENTS" />) өшірілді.</translation> <translation id="683373380308365518">Зерделі және қауіпсіз браузерге ауысыңыз</translation> +<translation id="6834652994408928492">Күн батқанда, қараңғы режим автоматты түрде қосылады.</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> файлдарын ашу</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" /> жаңарту үшін, интернетке қосылыңыз.</translation> <translation id="6838034009068684089">Сайт терезелерді ашып, экрандарға орналастырғысы келгенде сұрау (ұсынылады)</translation> @@ -6010,6 +6011,7 @@ <translation id="7622114377921274169">Зарядталуда.</translation> <translation id="7622768823216805500">Тапсырысты оңай рәсімдеу сияқты сауда-саттық функциялары үшін әдетте сайттарда төлем өңдегіштері орнатылады.</translation> <translation id="7622903810087708234">Құпия сөз мәліметтері</translation> +<translation id="7622966771025050155">Суретке түсірілген қойындыға ауысу</translation> <translation id="7624337243375417909">Caps Lock өшірулі</translation> <translation id="7625568159987162309">Сайттарда сақталған рұқсаттар мен деректерді көру</translation> <translation id="7628201176665550262">Жаңарту жылдамдығы</translation> @@ -6176,6 +6178,7 @@ <translation id="7784067724422331729">Компьютеріңіздегі қауіпсіздік параметрлері бұл файлды бөгеді.</translation> <translation id="7784796923038949829">Сайттың деректерін оқу немесе өзгерту мүмкін емес</translation> <translation id="778480864305029524">Лездік тетерингті пайдалану үшін Google Play Services хабарландыруларын қосыңыз.</translation> +<translation id="7785471469930192436">Қажет болса, іздеу жүйесінде берілген іздеу тарихын жою туралы нұсқауларды қараңыз.</translation> <translation id="7786889348652477777">&Қолданбаны қайта жүктеу</translation> <translation id="7787308148023287649">Басқа экраннан көрсету</translation> <translation id="7788298548579301890">Компьютеріңіздегі басқа бір бағдарлама жаңа қолданбаны енгізді, ол Chrome жұмысын өзгертуі мүмкін. @@ -6786,6 +6789,7 @@ <translation id="8438566539970814960">Іздеу және сайттарды шолу жұмысын жақсарту</translation> <translation id="8439506636278576865">Беттерді осы тілге аудару ұсынысы</translation> <translation id="8440630305826533614">Linux қолданбалары</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> қойындысына ауысу</translation> <translation id="8446884382197647889">Толығырақ</translation> <translation id="8447409163267621480">Ctrl не Alt пернесінен басталуы керек</translation> <translation id="8448729345478502352">Экрандағы элементтерді кішірейту немесе ұлғайту</translation> @@ -7447,6 +7451,7 @@ <translation id="9148058034647219655">Шығу</translation> <translation id="9148126808321036104">Қайта кіру</translation> <translation id="9148963623915467028">Бұл сайт геодерегіңізді пайдалана алады.</translation> +<translation id="9149529198050266366">Күн шыққанда, қараңғы режим автоматты түрде өшеді.</translation> <translation id="9149866541089851383">Өзгерту…</translation> <translation id="9150045010208374699">Камераңызды пайдалану</translation> <translation id="9150079578948279438">Профильді жою мүмкін болмады. Әрекетті қайталаңыз немесе техникалық қолдау үшін операторыңызға хабарласыңыз.</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 5e4c148..3e59b374 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">ឈប់ផ្គូផ្គងឧបករណ៍ប៊្លូធូស</translation> <translation id="1651008383952180276">អ្នកត្រូវតែបញ្ចូលឃ្លាសម្ងាត់ដូចគ្នាពីរដង</translation> <translation id="1652326691684645429">បើកការចែករំលែកនៅជិត</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{បន្ថែមម៉ាស៊ីនបោះពុម្ពទៅ Google Cloud Print ដូច្នេះអ្នកអាចបោះពុម្ពពីគ្រប់ទីកន្លែង។}other{បន្ថែមម៉ាស៊ីនបោះពុម្ព # ទៅ Google Cloud Print ដូច្នេះអ្នកអាចបោះពុម្ពពីគ្រប់ទីកន្លែង។}}</translation> <translation id="1653631694606464309">ជាធម្មតា កម្មវិធីលើអ៊ីនធឺណិតស្នើសុំបើកប្រភេទឯកសារជាក់លាក់ ដើម្បីអាចឱ្យអ្នកប្រើឯកសារទាំងនោះ នៅកន្លែងដែលអ្នកចង់ប្រើ ដូចជាការបើកឯកសារនៅក្នុងកម្មវិធីវាយអត្ថបទដែលអ្នកចង់ប្រើជាដើម</translation> <translation id="1656528038316521561">ភាពស្រអាប់ផ្ទៃខាងក្រោយ</translation> <translation id="1657406563541664238">ជួយធ្វើឲ្យ <ph name="PRODUCT_NAME" /> ប្រសើរជាងមុនដោយការផ្ញើស្ថិតិការប្រើប្រាស់ និងរបាយការណ៍គាំងទៅ Google ដោយស្វ័យប្រវត្តិ។</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">អ្នកកំពុងប្រើប្រាស់អថេរមជ្ឈដ្ឋានដែលមិនស្គាល់៖ <ph name="BAD_VAR" /> ។ នឹងមានបញ្ហាផ្នែកស្ថិរភាព និងសុវត្ថិភាព។</translation> <translation id="4095264805865317199">បើក UI សម្រាប់បើកដំណើរការបណ្តាញចល័ត</translation> <translation id="4095507791297118304">អេក្រង់ចម្បង</translation> -<translation id="409579654357498729">បន្ថែម Cloud Print</translation> <translation id="4096508467498758490">បិទដំណើរការកម្មវិធីបន្ថែមរបៀបអ្នកអភិវឌ្ឍន៍</translation> <translation id="4097406557126260163">កម្មវិធី និងកម្មវិធីបន្ថែម</translation> <translation id="409742781329613461">គន្លឹះសម្រាប់ Chrome</translation> @@ -4396,6 +4394,7 @@ <translation id="5794700615121138172">ថតដែល Linux បានចែករំលែក</translation> <translation id="5794786537412027208">ចាកចេញពីកម្មវិធី Chrome ទាំងអស់</translation> <translation id="5797070761912323120">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក</translation> +<translation id="5797521893972859201">សម្អាតប្រវត្តិ រួមទាំងប្រវត្តិនៅក្នុងប្រអប់ស្វែងរក</translation> <translation id="5798079537501238810">គេហទំព័រអាចដំឡើងឧបករណ៍ដោះស្រាយការបង់ប្រាក់</translation> <translation id="579907812742603813">ខ្លឹមសារដែលមានការការពារ</translation> <translation id="579915268381781820">សោសុវត្ថិភាពរបស់អ្នកត្រូវបានដកចេញ។</translation> @@ -4479,6 +4478,7 @@ <translation id="5900302528761731119">រូបថត Google ទម្រង់</translation> <translation id="590036993063074298">ព័ត៌មានលម្អិតអំពីគុណភាពនៃការបញ្ចាំង</translation> <translation id="5901069264981746702">ទិន្នន័យស្នាមម្រាមដៃរបស់អ្នកត្រូវបានរក្សាទុកយ៉ាងមានសុវត្ថិភាព និងមិនចេញពី <ph name="DEVICE_TYPE" /> របស់អ្នកឡើយ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">ប្ដូរទៅផ្ទាំងដែលកំពុងថត</translation> <translation id="5901494423252125310">គម្របម៉ាស៊ីនបោះពុម្ពបើក</translation> <translation id="5901630391730855834">លឿង</translation> <translation id="5904614460720589786">មិនអាចរៀបចំ <ph name="APP_NAME" /> បានទេ ដោយសារមានបញ្ហាក្នុងការកំណត់រចនាសម្ព័ន្ធ។ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។ លេខកូដបញ្ហា៖ <ph name="ERROR_CODE" />។</translation> @@ -4751,6 +4751,7 @@ <translation id="6196854373336333322">កម្មវិធីបន្ថែម "<ph name="EXTENSION_NAME" />" បានគ្រប់គ្រងការកំណត់ប្រូកស៊ីរបស់អ្នក មានន័យថាវាអាចប្តូរ បំបែក និងលួចតាមដានអ្វីទាំងអស់ដែលអ្នកធ្វើនៅលើអ៊ីនធឺណិត។ ប្រសិនបើអ្នកមិនប្រាកដថាហេតុអ្វីការប្តូរនេះបានកើតឡើង អ្នកប្រហែលជាមិនចង់បានវាទេ។</translation> <translation id="6198102561359457428">ចាកចេញ បន្ទាប់មកចូលម្តងទៀត...</translation> <translation id="6198252989419008588">ប្តូរលេខសម្គាល់</translation> +<translation id="6200047250927636406">លុបចោលឯកសារ</translation> <translation id="6202304368170870640">អ្នកអាចប្រើកូដ PIN របស់អ្នក ដើម្បីចូល ឬដោះសោឧបករណ៍របស់អ្នក។</translation> <translation id="6206311232642889873">ចម្លងរូបភាព</translation> <translation id="6207200176136643843">កំណត់ទៅកម្រិតពង្រីក/បង្រួមលំនាំដើមឡើងវិញ</translation> @@ -4836,7 +4837,6 @@ <ph name="DOMAIN" /> តម្រូវឱ្យអ្នកបន្តដោតកាតឆ្លាតវៃរបស់អ្នក។</translation> <translation id="628352644014831790">4 វិនាទី</translation> <translation id="6285120108426285413">ជាទូទៅ <ph name="FILE_NAME" /> មិនត្រូវបានទាញយកទេ ហើយវាអាចបង្កគ្រោះថ្នាក់។</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ម៉ាស៊ីនបោះពុម្ពថ្មីនៅលើបណ្តាញរបស់អ្នក}other{ម៉ាស៊ីនបោះពុម្ពថ្មីនៅលើបណ្តាញរបស់អ្នក}}</translation> <translation id="6285770818046456882">ឧបករណ៍ដែលកំពុងចែករំលែកជាមួយអ្នកបានបោះបង់ការផ្ទេរ</translation> <translation id="6290613030083731160">មិនមានការចែករំលែកឧបករណ៍ដែលនៅជិតទេ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="6291086328725007688">កំពុងផ្ទៀងផ្ទាត់លេខកូដបើកដំណើរការ។ ដំណើរការនេះអាចចំណាយពេលពីរបីនាទី។</translation> @@ -5319,6 +5319,7 @@ <translation id="6831043979455480757">បកប្រែ</translation> <translation id="6833479554815567477">បានលុបផ្ទាំងចេញពីក្រុម <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">ប្តូរទៅកម្មវិធីរុករកតាមអ៊ីនធឺណិតដែលឆ្លាតវៃ និងមានសុវត្ថិភាព</translation> +<translation id="6834652994408928492">មុខងារងងឹតនឹងបើកដោយស្វ័យប្រវត្តិនៅពេលថ្ងៃលិច</translation> <translation id="683540480453879381">បើកឯកសារ <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">សូមភា្ជប់អ៊ីនធឺណិតដើម្បីធ្វើបច្ចុប្បន្នភាព <ph name="DEVICE_TYPE" /> របស់អ្នក។</translation> <translation id="6838034009068684089">សួរនៅពេលគេហទំព័រចង់បើក និងដាក់វិនដូនៅលើអេក្រង់របស់អ្នក (បានណែនាំ)</translation> @@ -6031,6 +6032,7 @@ <translation id="7622114377921274169">កំពុងសាកថ្ម។</translation> <translation id="7622768823216805500">ជាធម្មតា គេហទំព័រដំឡើងឧបករណ៍ដោះស្រាយការបង់ប្រាក់សម្រាប់មុខងារទិញទំនិញដូចជា ការបង់ប្រាក់ងាយស្រួលជាងមុនជាដើម</translation> <translation id="7622903810087708234">ព័ត៌មានលម្អិតអំពីពាក្យសម្ងាត់</translation> +<translation id="7622966771025050155">ប្ដូរទៅផ្ទាំងដែលបានថត</translation> <translation id="7624337243375417909">បិទពុម្ពអក្សរធំ</translation> <translation id="7625568159987162309">មើលការអនុញ្ញាត និងទិន្នន័យដែលផ្ទុកនៅលើទំព័រនានា</translation> <translation id="7628201176665550262">អត្រាផ្ទុកឡើងវិញ</translation> @@ -6197,6 +6199,7 @@ <translation id="7784067724422331729">ការកំណត់សុវត្ថិភាពនៅលើកុំព្យូទ័ររបស់អ្នកបានរារាំងឯកសារនេះ។</translation> <translation id="7784796923038949829">មិនអាចអាន ឬប្ដូរទិន្នន័យរបស់គេហទំព័របានទេ</translation> <translation id="778480864305029524">ដើម្បីប្រើការភ្ជាប់ភ្លាមៗ សូមបើកការជូនដំណឹងសម្រាប់សេវាកម្ម Google Play ។</translation> +<translation id="7785471469930192436">មើលការណែនាំរបស់ម៉ាស៊ីនស្វែងរកអ្នក ដើម្បីដឹងអំពីរបៀបលុបប្រវត្តិស្វែងរករបស់អ្នក ប្រសិនបើអាច</translation> <translation id="7786889348652477777">ដំណើរការកម្មវិធីឡើងវិញ</translation> <translation id="7787308148023287649">បង្ហាញនៅលើអេក្រង់ផ្សេងទៀត</translation> <translation id="7788298548579301890">កម្មវិធីផ្សេងទៀតនៅលើកុំព្យូទ័ររបស់អ្នកបានបន្ថែមកម្មវិធី ដែលអាចផ្លាស់ប្តូររបៀបដែល Chrome ដំណើរការ។ @@ -6808,6 +6811,7 @@ <translation id="8438566539970814960">ធ្វើឱ្យការស្វែងរក និងការរុករកប្រសើរជាងមុន</translation> <translation id="8439506636278576865">ផ្តល់ជូនការបកប្រែទំព័រនៅក្នុងភាសានេះ</translation> <translation id="8440630305826533614">កម្មវិធី Linux</translation> +<translation id="8446225304314102060">ប្ដូរទៅផ្ទាំង <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">ស្វែងយល់បន្ថែម</translation> <translation id="8447409163267621480">រួមមាន Ctrl ឬ Alt</translation> <translation id="8448729345478502352">ធ្វើឱ្យធាតុនៅលើអេក្រង់របស់អ្នកតូចជាងមុន ឬធំជាងមុន</translation> @@ -7468,6 +7472,7 @@ <translation id="9148058034647219655">ចាកចេញ</translation> <translation id="9148126808321036104">ចូលម្តងទៀត</translation> <translation id="9148963623915467028">គេហទំព័រនេះអាចចូលប្រើទីតាំងរបស់អ្នក។</translation> +<translation id="9149529198050266366">មុខងារងងឹតនឹងបិទដោយស្វ័យប្រវត្តិនៅពេលថ្ងៃរះ</translation> <translation id="9149866541089851383">កែប្រែ...</translation> <translation id="9150045010208374699">ប្រើកាមេរ៉ារបស់អ្នក</translation> <translation id="9150079578948279438">មិនអាចលុបកម្រងព័ត៌មាននេះបានទេ។ សូមព្យាយាមម្ដងទៀត ឬទាក់ទងក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក ដើម្បីទទួលបានជំនួយបច្ចេកទេស។</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 11a3a13c..7e61342 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -618,7 +618,6 @@ <translation id="164936512206786300">ಬ್ಲೂಟೂತ್ ಸಾಧನದ ಜೋಡಿ ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="1651008383952180276">ನೀವು ಒಂದೇ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ಎರಡು ಬಾರಿ ನಮೂದಿಸಬೇಕು</translation> <translation id="1652326691684645429">Nearby ಶೇರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google ಕ್ಲೌಡ್ ಪ್ರಿಂಟ್ಗೆ ಪ್ರಿಂಟರ್ ಅನ್ನು ಸೇರಿಸಿ, ಈ ಮೂಲಕ ನೀವು ಎಲ್ಲಿಂದಲಾದರೂ ಪ್ರಿಂಟ್ ಮಾಡಬಹುದು.}one{Google ಕ್ಲೌಡ್ ಪ್ರಿಂಟ್ಗೆ # ಪ್ರಿಂಟರ್ಗಳನ್ನು ಸೇರಿಸಿ, ಈ ಮೂಲಕ ನೀವು ಎಲ್ಲಿಂದಲಾದರೂ ಪ್ರಿಂಟ್ ಮಾಡಬಹುದು.}other{Google ಕ್ಲೌಡ್ ಪ್ರಿಂಟ್ಗೆ # ಪ್ರಿಂಟರ್ಗಳನ್ನು ಸೇರಿಸಿ, ಈ ಮೂಲಕ ನೀವು ಎಲ್ಲಿಂದಲಾದರೂ ಪ್ರಿಂಟ್ ಮಾಡಬಹುದು.}}</translation> <translation id="1653631694606464309">ವೆಬ್ ಆ್ಯಪ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ನಿರ್ದಿಷ್ಟ ಫೈಲ್ಗಳ ಪ್ರಕಾರಗಳನ್ನು ತೆರೆಯಲು ಕೇಳತ್ತದೆ, ಇದರಿಂದ ನೀವು ಬಯಸಿದಲ್ಲಿ ಆ ಫೈಲ್ಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಉದಾಹರಣೆ: ನಿಮ್ಮ ಆದ್ಯತೆಯ ವರ್ಡ್ ಪ್ರೋಸೆಸರ್ನಲ್ಲಿನ ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ತೆರೆಯಬಹುದು</translation> <translation id="1656528038316521561">ಹಿನ್ನೆಲೆ ಅಪಾರದರ್ಶಕತೆ</translation> <translation id="1657406563541664238">Google ಗೆ ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಶ್ ವರದಿಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ <ph name="PRODUCT_NAME" /> ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation> @@ -1928,6 +1927,7 @@ <translation id="3027296729579831126">Nearby ಶೇರ್ ಆನ್ ಮಾಡಿ</translation> <translation id="3029466929721441205">ಶೆಲ್ಫ್ನಲ್ಲಿ ಸ್ಟೈಲಸ್ ಪರಿಕರಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{ಇಂದು ನೀವು ಅಪ್ಡೇಟ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ. ನೀವು ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿದಾಗ, ಅಪ್ಡೇಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಆಗುತ್ತದೆ.}one{ಗಡುವಿನ ಮೊದಲು ಈ ಅನ್ನು ನೀವು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ. ನೀವು ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿದಾಗ, ಅಪ್ಡೇಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಆಗುತ್ತದೆ.}other{ಗಡುವಿನ ಮೊದಲು ಈ ಅನ್ನು ನೀವು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ. ನೀವು ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿದಾಗ, ಅಪ್ಡೇಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಆಗುತ್ತದೆ.}}</translation> +<translation id="3030967311408872958">ಸೂರ್ಯಾಸ್ತದಿಂದ ಸೂರ್ಯೋದಯದವರೆಗೆ</translation> <translation id="3031417829280473749">ಏಜೆಂಟ್ X</translation> <translation id="3031557471081358569">ಆಮದು ಮಾಡಲು ಐಟಂಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ:</translation> <translation id="3036327949511794916">ಈ <ph name="DEVICE_TYPE" /> ಸಾಧನವನ್ನು ಹಿಂತಿರುಗಿಸುವ ಗಡುವು ಮೀರಿದೆ.</translation> @@ -2910,7 +2910,6 @@ <translation id="4094647278880271855">ಬೆಂಬಲವಿಲ್ಲದ ಎನ್ವಾಯರ್ಮೆಂಟ್ ವೇರಿಯೇಬಲ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ: <ph name="BAD_VAR" />. ಇದು ಸ್ಥಿರತೆ ಮತ್ತು ಸುರಕ್ಷತೆಯ ಮೇಲೆ ನಕಾರಾತ್ಮಕ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ.</translation> <translation id="4095264805865317199">ಸೆಲ್ಯುಲರ್ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ UI ಅನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="4095507791297118304">ಪ್ರಾಥಮಿಕ ಡಿಸ್ಪ್ಲೇ</translation> -<translation id="409579654357498729">ಕ್ಲೌಡ್ ಮುದ್ರಣಕ್ಕೆ ಸೇರಿಸು</translation> <translation id="4096508467498758490">ವಿಸ್ತರಣೆಗಳ ಡೆವೆಲಪರ್ ಮೋಡ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="4097406557126260163">ಆ್ಯಪ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳು</translation> <translation id="409742781329613461">Chrome ಗಾಗಿ ಸಲಹೆಗಳು</translation> @@ -4136,6 +4135,7 @@ <translation id="5502500733115278303">Firefox ಇಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಲಾಗಿದೆ</translation> <translation id="5502915260472117187">ಮಗು</translation> <translation id="5503982651688210506">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಮತ್ತು ಸರಿಸಲು ಹಾಗೂ ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಬಳಸಲು <ph name="HOST" /> ಗೆ ಅನುಮತಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> +<translation id="5504909642107847870">ಗೌಪ್ಯತೆ ಮತ್ತು ಸುರಕ್ಷತೆ ಪರಿಶೀಲನೆ</translation> <translation id="5505264765875738116">ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಬಹುದೇ ಎಂದು ಸೈಟ್ಗಳು ಕೇಳಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="5505307013568720083">ಶಾಯಿ ಖಾಲಿಯಾಗಿದೆ</translation> <translation id="5505794066310932198">ಕಮಾಂಡರ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ</translation> @@ -4827,7 +4827,6 @@ <ph name="DOMAIN" />, ನಿಮ್ಮ ಸ್ಮಾರ್ಟ್ ಕಾರ್ಡ್ ಅನ್ನು ಸೇರಿಸಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.</translation> <translation id="628352644014831790">4 ಸೆಕೆಂಡುಗಳು</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ಅನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ಹೊಸ ಪ್ರಿಂಟರ್}one{ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ಹೊಸ ಪ್ರಿಂಟರ್ಗಳು}other{ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ಹೊಸ ಪ್ರಿಂಟರ್ಗಳು}}</translation> <translation id="6285770818046456882">ನಿಮ್ಮ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳುತ್ತಿದ್ದ ಸಾಧನವು ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿದೆ</translation> <translation id="6290613030083731160">ಯಾವುದೇ ಸಾಧನಗಳು ಸಮೀಪದಲ್ಲಿ ಹಂಚಿಕೊಳ್ಳುತ್ತಿಲ್ಲ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="6291086328725007688">ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ಕೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ. ಇದಕ್ಕೆ ಕೆಲವು ನಿಮಿಷಗಳ ಕಾಲಾವಕಾಶ ಬೇಕಾಗಬಹುದು.</translation> @@ -4965,6 +4964,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> - ಬ್ಲೂಟೂತ್ ಸ್ಕ್ಯಾನ್ ಸಕ್ರಿಯವಾಗಿದೆ</translation> <translation id="6445450263907939268">ನಿಮಗೆ ಈ ಬದಲಾವಣೆಗಳು ಅಗತ್ಯವಿಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಹಿಂದಿನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನೀವು ಪುನಃಸ್ಥಾಪಿಸಬಹುದು.</translation> <translation id="6446213738085045933">ಡೆಸ್ಕ್ಟಾಪ್ ಶಾರ್ಟ್ಕಟ್ ರಚಿಸಿ</translation> +<translation id="6447210166804596538">ಪ್ರಮುಖ ಗೌಪ್ಯತೆ ಮತ್ತು ಸುರಕ್ಷತಾ ನಿಯಂತ್ರಣಗಳನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ಪರಿಶೀಲಿಸಿ</translation> <translation id="6447842834002726250">ಕುಕೀಸ್</translation> <translation id="6450876761651513209">ನಿಮ್ಮ ಗೌಪ್ಯತೆಗೆ ಸಂಬಂಧಿಸಿದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> ಮತ್ತು 1 ಇತರ ಟ್ಯಾಬ್}one{<ph name="PAGE_TITLE" /> ಮತ್ತು # ಇತರ ಟ್ಯಾಬ್ಗಳು}other{<ph name="PAGE_TITLE" /> ಮತ್ತು # ಇತರ ಟ್ಯಾಬ್ಗಳು}}</translation> @@ -6977,6 +6977,7 @@ <translation id="8655972064210167941">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲದಿರುವುದರಿಂದ ಸೈನ್ ಇನ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8657393004602556571">ನೀವು ಪ್ರತಿಕ್ರಿಯೆ ತ್ಯಜಿಸಲು ಬಯಸುವಿರಾ?</translation> <translation id="8658645149275195032"><ph name="TAB_NAME" /> ಜೊತೆಗೆ ನಿಮ್ಮ ಪರದೆ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> +<translation id="8660073998956001352">ನಿಮ್ಮ ಹುಡುಕಾಟದ ಎಂಜಿನ್ಗಳು</translation> <translation id="8661290697478713397">ಅಜ್ಞಾ&ತ ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation> <translation id="8662671328352114214"><ph name="TYPE" /> ನೆಟ್ವರ್ಕ್ಗೆ ಸೇರಿಕೊಳ್ಳಿ</translation> <translation id="8662795692588422978">ಜನರು</translation> @@ -7167,6 +7168,7 @@ <translation id="8845001906332463065">ಸಹಾಯ ಪಡೆಯಿರಿ</translation> <translation id="8846132060409673887">ಈ ಕಂಪ್ಯೂಟರ್ನ ತಯಾರಕರು ಮತ್ತು ಮಾದರಿಯನ್ನು ಓದಿ</translation> <translation id="8846163936679269230">eSIM ಪ್ರೊಫೈಲ್ಗಳನ್ನು ರೀಸೆಟ್ ಮಾಡಿ</translation> +<translation id="8846746259444262774">ಇನ್ಸ್ಟಾಲೇಶನ್ ವಿಫಲವಾಗಿದೆ</translation> <translation id="8847523528195140327">ಕವರ್ ಮುಚ್ಚಿದ ನಂತರ ಸೈನ್ ಔಟ್ ಆಗಿ</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">ಮರೆಮಾಡಲಾಗಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index e3c0f4b0..fb8151e 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">블루투스 기기 페어링 해제</translation> <translation id="1651008383952180276">동일한 암호를 두 번 입력해야 합니다.</translation> <translation id="1652326691684645429">Nearby Share 사용</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google 클라우드 프린트에 프린터를 추가하여 어디서나 인쇄하세요.}other{Google 클라우드 프린트에 프린터 #개를 추가하여 어디서나 인쇄하세요.}}</translation> <translation id="1653631694606464309">웹 앱은 일반적으로 원하는 워드 프로세서에서 문서를 열 때와 같이 원하는 곳에서 파일로 작업할 수 있도록 여러 유형의 파일을 열어도 되는지 묻습니다.</translation> <translation id="1656528038316521561">배경 불투명도</translation> <translation id="1657406563541664238">사용 통계 및 비정상 종료 보고서가 Google로 자동 전송되게 하여 <ph name="PRODUCT_NAME" /> 개선에 도움 주기</translation> @@ -2916,7 +2915,6 @@ <translation id="4094647278880271855">지원되지 않는 환경 변수(<ph name="BAD_VAR" />)를 사용 중이므로 안정성 및 보안에 문제가 발생할 수 있습니다.</translation> <translation id="4095264805865317199">모바일 활성화 UI 열기</translation> <translation id="4095507791297118304">기본 디스플레이</translation> -<translation id="409579654357498729">클라우드 프린트에 추가</translation> <translation id="4096508467498758490">개발자 모드 확장 프로그램 사용 중지</translation> <translation id="4097406557126260163">앱 및 확장 프로그램</translation> <translation id="409742781329613461">Chrome 도움말</translation> @@ -4392,6 +4390,7 @@ <translation id="5794700615121138172">Linux 공유 폴더</translation> <translation id="5794786537412027208">모든 Chrome 앱 종료</translation> <translation id="5797070761912323120">Google에서 내 방문 기록을 사용하여 Google 검색, 광고 및 다른 Google 서비스를 맞춤설정할 수 있습니다.</translation> +<translation id="5797521893972859201">검색창에 입력한 내용을 비롯한 기록 삭제</translation> <translation id="5798079537501238810">사이트에서 결제 핸들러를 설치할 수 있음</translation> <translation id="579907812742603813">보호된 콘텐츠</translation> <translation id="579915268381781820">보안 키가 삭제되었습니다.</translation> @@ -4475,6 +4474,7 @@ <translation id="5900302528761731119">Google 프로필 사진</translation> <translation id="590036993063074298">미러링 품질 세부정보</translation> <translation id="5901069264981746702">지문 데이터는 안전하게 저장되며 절대 <ph name="DEVICE_TYPE" /> 외부로 유출되지 않습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">캡처 중인 탭으로 전환</translation> <translation id="5901494423252125310">프린터 덮개 열림</translation> <translation id="5901630391730855834">노란색</translation> <translation id="5904614460720589786">구성 문제로 인해 <ph name="APP_NAME" /> 앱을 설정할 수 없습니다. 관리자에게 문의하세요. 오류 코드: <ph name="ERROR_CODE" /></translation> @@ -4747,6 +4747,7 @@ <translation id="6196854373336333322">'<ph name="EXTENSION_NAME" />' 확장 프로그램이 프록시 설정을 제어할 수 있게 되었으며, 따라서 사용자가 온라인에서 수행하는 모든 작업을 변경, 중단하거나 엿볼 수 있게 되었습니다. 이와 같이 변경된 이유를 잘 모른다면 이 설정을 사용하지 않는 것이 좋습니다.</translation> <translation id="6198102561359457428">로그아웃한 후 다시 로그인...</translation> <translation id="6198252989419008588">PIN 변경</translation> +<translation id="6200047250927636406">파일 삭제</translation> <translation id="6202304368170870640">PIN을 사용하여 로그인하거나 기기를 잠금 해제할 수 있습니다.</translation> <translation id="6206311232642889873">이미지 복사(&Y)</translation> <translation id="6207200176136643843">기본 확대/축소 수준으로 재설정</translation> @@ -4832,7 +4833,6 @@ <ph name="DOMAIN" />에서 스마트 카드를 삽입해 둔 상태로 둘 것을 요청합니다.</translation> <translation id="628352644014831790">4초</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" />은(는) 위험할 수 있으므로 다운로드하지 않습니다.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{네트워크에 새로운 프린터 있음}other{네트워크에 새로운 프린터 있음}}</translation> <translation id="6285770818046456882">나와 공유 중인 기기에서 전송을 취소했습니다.</translation> <translation id="6290613030083731160">근처에 공유 가능한 기기가 없습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="6291086328725007688">활성화 코드를 확인하는 중입니다. 몇 분 정도 소요될 수 있습니다.</translation> @@ -5315,6 +5315,7 @@ <translation id="6831043979455480757">번역</translation> <translation id="6833479554815567477"><ph name="GROUP_NAME" /> 그룹에서 탭이 삭제됨 - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">편리하고 안전한 브라우저로 전환</translation> +<translation id="6834652994408928492">일몰 시 어두운 모드가 자동으로 켜짐</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> 파일 열기</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" />을(를) 업데이트하려면 인터넷에 연결하세요.</translation> <translation id="6838034009068684089">사이트에서 창을 열 때 확인하고 화면에 창 배치(권장)</translation> @@ -6027,6 +6028,7 @@ <translation id="7622114377921274169">충전 중</translation> <translation id="7622768823216805500">사이트에서는 일반적으로 간편 결제와 같은 쇼핑 기능을 사용하기 위해 결제 핸들러를 설치합니다.</translation> <translation id="7622903810087708234">비밀번호 세부정보</translation> +<translation id="7622966771025050155">캡처된 탭으로 전환</translation> <translation id="7624337243375417909">Caps Lock 사용 안함</translation> <translation id="7625568159987162309">사이트 전체에 저장된 권한 및 데이터 보기</translation> <translation id="7628201176665550262">새로고침 빈도</translation> @@ -6193,6 +6195,7 @@ <translation id="7784067724422331729">컴퓨터의 보안 설정에 의해 파일이 차단되었습니다.</translation> <translation id="7784796923038949829">사이트 데이터를 읽거나 변경할 수 없음</translation> <translation id="778480864305029524">인스턴트 테더링을 사용하려면 Google Play 서비스의 알림을 사용 설정하세요</translation> +<translation id="7785471469930192436">Google이 아닌 다른 검색엔진을 사용 중이라면 해당 검색엔진의 검색 기록 삭제 안내를 확인하세요.</translation> <translation id="7786889348652477777">앱 새로고침(&R)</translation> <translation id="7787308148023287649">다른 화면에 표시</translation> <translation id="7788298548579301890">컴퓨터의 다른 프로그램에서 Chrome 작동에 영향을 줄 수 있는 앱을 추가했습니다. @@ -6805,6 +6808,7 @@ <translation id="8438566539970814960">검색 및 탐색 기능 개선</translation> <translation id="8439506636278576865">이 언어로 된 페이지에 대한 번역 옵션 제공</translation> <translation id="8440630305826533614">Linux 앱</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> 탭으로 전환</translation> <translation id="8446884382197647889">자세히 알아보기</translation> <translation id="8447409163267621480">Ctrl 또는 Alt 중 하나를 포함해야 합니다</translation> <translation id="8448729345478502352">화면에 표시되는 항목을 축소 또는 확대합니다.</translation> @@ -7466,6 +7470,7 @@ <translation id="9148058034647219655">나가기</translation> <translation id="9148126808321036104">다시 로그인</translation> <translation id="9148963623915467028">이 사이트는 위치에 액세스할 수 있습니다.</translation> +<translation id="9149529198050266366">일출 시 어두운 모드가 자동으로 꺼짐</translation> <translation id="9149866541089851383">수정...</translation> <translation id="9150045010208374699">카메라 사용</translation> <translation id="9150079578948279438">프로필을 삭제할 수 없습니다. 다시 시도하거나 이동통신사에 기술 지원을 요청하세요.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 8ed68947..bcbca514 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Bluetooth түзмөгүн ажыратуу</translation> <translation id="1651008383952180276">Бир купуя сөз айкашын эки жолу киргизишиңиз керек</translation> <translation id="1652326691684645429">Nearby Share функциясын иштетүү</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Принтерди Google Булуттагы Принтерге кошуп, керектүү нерселериңизди каалаган жерден басып чыгара аласыз.}other{# принтерди Google Булуттагы Принтерге кошуп, керектүү нерселериңизди каалаган жерден басып чыгара аласыз.}}</translation> <translation id="1653631694606464309">Веб-колдонмолор түзмөгүңүздө файлдардын белгилүү бир түрлөрүн ачканда сизден уруксат сурашат. Мисалы, документти өзүңүз каалаган программада ачып алсаңыз болот</translation> <translation id="1656528038316521561">Фондун тунуктугу</translation> <translation id="1657406563541664238">Google'га автоматтык түрдө колдонуу статистикасы жана каталар жөнүндө кабар берип, <ph name="PRODUCT_NAME" /> өркүндөткөнгө кол кабыш кылыңыз</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Колдоого алынбаган чөйрөнүн өзгөрмө маанисин колдонуп жатасыз: <ph name="BAD_VAR" />. Туруктуулук менен коопсуздук үчүн коркунуч бар.</translation> <translation id="4095264805865317199">Мобилдик тармакты жандыра турган колдонуучу интерфейсин ачуу</translation> <translation id="4095507791297118304">Негизги дисплей</translation> -<translation id="409579654357498729">Cloud Принтерге кошуу</translation> <translation id="4096508467498758490">Иштеп чыгуучу режиминин кеңейтүүлөрүн өчүрүп коюу</translation> <translation id="4097406557126260163">Колдонмолор жана кеңейтүүлөр</translation> <translation id="409742781329613461">Chrome үчүн кеңештер</translation> @@ -4395,6 +4393,7 @@ <translation id="5794700615121138172">Linux'тун бөлүшүлгөн папкалары</translation> <translation id="5794786537412027208">Бардык Chrome Колдонмолорунан чыгуу</translation> <translation id="5797070761912323120">Издөө, жарнама жана башка Google кызматтарын жекечелештирүү үчүн, Google таржымалыңызды колдонушу мүмкүн</translation> +<translation id="5797521893972859201">Издөө таржымалы, анын ичинде издөө кутучасындагы таржымал тазаланат</translation> <translation id="5798079537501238810">Сайттар төлөм иштеткичтерин орното алат</translation> <translation id="579907812742603813">корголгон мазмун</translation> <translation id="579915268381781820">Коопсуздук ачкычыңыз өчүрүлдү.</translation> @@ -4478,6 +4477,7 @@ <translation id="5900302528761731119">Google профиль сүрөтү</translation> <translation id="590036993063074298">Күзгүдөй чагылдыруу сапаты</translation> <translation id="5901069264981746702">Манжа изиңиздин маалыматы <ph name="DEVICE_TYPE" /> түзмөгүңүздө коопсуз сакталат. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Тартылган өтмөккө которулуу</translation> <translation id="5901494423252125310">Принтердин эшиги ачык</translation> <translation id="5901630391730855834">Сары</translation> <translation id="5904614460720589786">Конфигурациялоо маселесинен улам <ph name="APP_NAME" /> жөндөлгөн жок. Администраторуңузга кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation> @@ -4750,6 +4750,7 @@ <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" кеңейтүүсү прокси жөндөөлөрүңүздү көзөмөлдөйт, демек, ал аны өзгөртүп, бузуп же онлайн абалындагы аракеттериңизге көз салып тура алат. Бул эмне болгон өзгөрүү экендигин түшүнбөсөңүз, анын сизге кереги жок болушу мүмкүн.</translation> <translation id="6198102561359457428">Чыгып кайра кириңиз…</translation> <translation id="6198252989419008588">PIN'ди өзгөртүү</translation> +<translation id="6200047250927636406">Файлды жоюу</translation> <translation id="6202304368170870640">Түзмөгүңүзгө кирүү же кулпусун ачуу үчүн PIN кодуңузду колдонсоңуз болот.</translation> <translation id="6206311232642889873">Сүрөттү көчү&рүү</translation> <translation id="6207200176136643843">Чоңойтуп/кичирейтүү деңгээлин баштапкы абалга келтирүү</translation> @@ -4835,7 +4836,6 @@ <ph name="DOMAIN" /> эрежелери боюнча акылдуу картаңыз салынып турушу керек.</translation> <translation id="628352644014831790">4 секунд</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> негизинен жүктөлүп алынбайт, ошондуктан коркунучтуу болушу мүмкүн.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Тармагыңыздагы жаңы принтер}other{Тармагыңыздагы жаңы принтерлер}}</translation> <translation id="6285770818046456882">Жөнөтүүчү файлды өткөрүүнү жокко чыгарды</translation> <translation id="6290613030083731160">Жакын жерде маалымат бөлүшүлө турган түзмөк жок. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Жандандыруу коду текшерилүүдө. Бир нече мүнөткө созулушу мүмкүн.</translation> @@ -5318,6 +5318,7 @@ <translation id="6831043979455480757">Которуу</translation> <translation id="6833479554815567477">Өтмөк төмөнкү топтон өчүрүлдү: <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Шамдагай жана коопсуз серепчиге которулуу</translation> +<translation id="6834652994408928492">Караңгы тема күн батканда автоматтык түрдө күйөт</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> файлдарын ачуу</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" /> түзмөгүңүздү жаңыртуу үчүн сырсөзүңүздү кайра киргизиңиз.</translation> <translation id="6838034009068684089">Сайт терезени ачып, экрандарыңызга жайгаштырганы жатканда уруксат суралсын (сунушталат)</translation> @@ -6030,6 +6031,7 @@ <translation id="7622114377921274169">Кубатталууда.</translation> <translation id="7622768823216805500">Сайттар адатта төлөмдү жеңилдетүү сыяктуу сатып алуу функциялары үчүн төлөм иштеткичтерин орнотот</translation> <translation id="7622903810087708234">Сырсөздүн чоо-жайы</translation> +<translation id="7622966771025050155">Тартылган өтмөккө которулуу</translation> <translation id="7624337243375417909">Caps Lock өчүк</translation> <translation id="7625568159987162309">Уруксаттарды жана сайттарда сакталган дайындарды көрүү</translation> <translation id="7628201176665550262">Жаңыртуу ылдамдыгы</translation> @@ -6196,6 +6198,7 @@ <translation id="7784067724422331729">Компьютериңиздеги коопсуздук жөндөөлөрү бул файлды бөгөттөдү.</translation> <translation id="7784796923038949829">Сайттын дайындары окулбай же өзгөрбөй жатат</translation> <translation id="778480864305029524">Ыкчам байланыш түйүнүн колдонуу үчүн Google Play кызматтарынын эскертмелерин күйгүзүңүз.</translation> +<translation id="7785471469930192436">Издөө таржымалын өчүрүү үчүн, бар болсо, издөө каражатындагы нускамаларды караңыз</translation> <translation id="7786889348652477777">&Колдонмону кайра жүктөө</translation> <translation id="7787308148023287649">Башка экранда көрсөтүү</translation> <translation id="7788298548579301890">Компьютериңиздеги программалардын бири Chrome'дун иштешин өзгөртө турган колдонмону кошуп койду. @@ -6807,6 +6810,7 @@ <translation id="8438566539970814960">Издөө жана серептөө аракеттериңизди жакшыртыңыз</translation> <translation id="8439506636278576865">Ушул тилдеги беттерди которуу сунушталсын</translation> <translation id="8440630305826533614">Linux колдонмолору</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> өтмөгүнө которулуу</translation> <translation id="8446884382197647889">Көбүрөөк билүү</translation> <translation id="8447409163267621480">Же Ctrl, же Alt камтылсын</translation> <translation id="8448729345478502352">Экраныңыздагы элементтерди кичирейтип же чоңойтот</translation> @@ -7468,6 +7472,7 @@ <translation id="9148058034647219655">Чыгуу</translation> <translation id="9148126808321036104">Кайра кириңиз</translation> <translation id="9148963623915467028">Бул сайт жайгашкан жериңизди көрө алат.</translation> +<translation id="9149529198050266366">Караңгы тема күн чыкканда автоматтык түрдө өчөт</translation> <translation id="9149866541089851383">Түзөтүү…</translation> <translation id="9150045010208374699">Камераңызды колдонуңуз</translation> <translation id="9150079578948279438">Профиль өчүрүлгөн жок. Кайталап көрүңүз же техникалык колдоо көрүү үчүн байланыш операторуна кайрылыңыз.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 5ec999c..1edf28d2 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">ຍົກເລີກການຈັບຄູ່ອຸປະກອນ Bluetooth</translation> <translation id="1651008383952180276">ທ່ານຕ້ອງປ້ອນວະລີຜ່ານອັນດຽວກັນສອງເທື່ອ</translation> <translation id="1652326691684645429">ເປີດການນຳໃຊ້ການແບ່ງປັນໃກ້ຄຽງ</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{ເພີ່ມເຄື່ອງພິມໃສ່ Google Cloud Print ເພື່ອໃຫ້ທ່ານສາມາດພິມໄດ້ຢູ່ທຸກບ່ອນ.}other{ເພີ່ມ # ເຄື່ອງພິມໃສ່ Google Cloud Print ເພື່ອໃຫ້ທ່ານສາມາດພິມໄດ້ຢູ່ທຸກບ່ອນ.}}</translation> <translation id="1653631694606464309">ປົກກະຕິເວັບແອັບຈະຂໍເປີດປະເພດຂອງໄຟລ໌ບາງຢ່າງເພື່ອໃຫ້ທ່ານສາມາດເຮັດວຽກກັບໄຟລ໌ເຫຼົ່ານັ້ນຢູ່ບ່ອນທີ່ທ່ານຕ້ອງການໄດ້ ເຊັ່ນ: ການເປີດເອກະສານໃນໂປຣແກຣມປະມວນຜົນຄຳສັບທີ່ທ່ານຕ້ອງການ</translation> <translation id="1656528038316521561">ຄວາມທຶບແສງຂອງພື້ນຫຼັງ</translation> <translation id="1657406563541664238">ຊ່ວຍເຮັດໃຫ້ <ph name="PRODUCT_NAME" /> ດີຂຶ້ນໂດຍການສົ່ງສະຖິຕິການນໍາໃຊ້ ແລະລາຍງານການຂັດຂ້ອງຫາ Google ໂດຍອັດຕະໂນມັດ</translation> @@ -2915,7 +2914,6 @@ <translation id="4094647278880271855">ທ່ານກຳລັງໃຊ້ຕົວແປສະພາບແວດລ້ອມທີ່ບໍ່ຮອງຮັບ: <ph name="BAD_VAR" />. ຄວາມສະຖຽນ ແລະ ຄວາມປອດໄພຈະໄດ້ຮັບຜົນກະທົບ.</translation> <translation id="4095264805865317199">ເປີດສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ສຳລັບການເປີດນຳໃຊ້ເຄືອຂ່າຍມືຖື</translation> <translation id="4095507791297118304">ຈໍສະແດງຜົນຫຼັກ</translation> -<translation id="409579654357498729">ເພີ່ມໃສ່ Cloud Print</translation> <translation id="4096508467498758490">ປິດໃຊ້ງານສ່ວນຂະຫຍາຍໂໝດຜູ້ພັດທະນາ</translation> <translation id="4097406557126260163">ແອັບ ແລະ ສ່ວນຂະຫຍາຍ</translation> <translation id="409742781329613461">ເຄັດລັບສຳລັບ Chrome</translation> @@ -4392,6 +4390,7 @@ <translation id="5794700615121138172">ໂຟນເດີທີ່ແບ່ງປັນຂອງ Linux</translation> <translation id="5794786537412027208">ອອກທຸກແອັບ Chrome</translation> <translation id="5797070761912323120">Google ອາດຈະໃຊ້ປະຫວັດຂອງທ່ານເພື່ອປັບແຕ່ງຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນຂອງ Google</translation> +<translation id="5797521893972859201">ລຶບລ້າງປະຫວັດ, ຮວມທັງໃນກ່ອງຊອກຫາ</translation> <translation id="5798079537501238810">ເວັບໄຊສາມາດຕິດຕັ້ງຕົວຈັດການການຈ່າຍເງິນໄດ້</translation> <translation id="579907812742603813">ເນື້ອຫາທີ່ໄດ້ຮັບການປົກປ້ອງ</translation> <translation id="579915268381781820">ຖອດກະແຈຄວາມປອດໄພອອກແລ້ວ.</translation> @@ -4475,6 +4474,7 @@ <translation id="5900302528761731119">ຮູບໂປຣໄຟລ໌ Google</translation> <translation id="590036993063074298">ລາຍລະອຽດຄຸນນະພາບການສະທ້ອນ</translation> <translation id="5901069264981746702">ຂໍ້ມູນລາຍນິ້ວມືຂອງທ່ານຈະຖືກຈັດເກັບໄວ້ຢ່າງປອດໄພ ແລະ ຈະບໍ່ຖືກສົ່ງອອກຈາກ <ph name="DEVICE_TYPE" /> ຂອງທ່ານເດັດຂາດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">ສະຫຼັບໄປຫາແຖບທີ່ກຳລັງບັນທຶກ</translation> <translation id="5901494423252125310">ຝາເຄື່ອງພິມເປີດຢູ່</translation> <translation id="5901630391730855834">ສີເຫຼືອງ</translation> <translation id="5904614460720589786">ບໍ່ສາມາດຕິດຕັ້ງ <ph name="APP_NAME" /> ໄດ້ ເນື່ອງຈາກບັນຫາການຕັ້ງຄ່າ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ. ລະຫັດຂໍ້ຜິດພາດ: <ph name="ERROR_CODE" />.</translation> @@ -4747,6 +4747,7 @@ <translation id="6196854373336333322">ສ່ວນຂະຫຍາຍ "<ph name="EXTENSION_NAME" />" ໄດ້ດໍາເນີນການຄວບຄຸມການຕັ້ງຄ່າພຣັອກຊີຂອງທ່ານ, ເຊິ່ງໝາຍຄວາມວ່າ ມັນສາມາດປ່ຽນແປງ, ທໍາລາຍ, ຫຼືລັກຟັງອັນໃດອັນໜຶ່ງທີ່ທ່ານເຮັດອອນລາຍນ໌ໄດ້. ຖ້າທ່ານບໍ່ແນ່ໃຈວ່າ ເປັນຫຍັງການປ່ຽນແປງນີ້ຈິ່ງເກີດຂຶ້ນ, ທ່ານອາດຈະບໍ່ຕ້ອງການມັນ.</translation> <translation id="6198102561359457428">ອອກຈາກລະບົບ ຈາກນັ້ນລົງຊື່ເຂົ້າໃຊ້ອີກ...</translation> <translation id="6198252989419008588">ປ່ຽນ PIN</translation> +<translation id="6200047250927636406">ຍົກເລີກໄຟລ໌</translation> <translation id="6202304368170870640">ທ່ານສາມາດໃຊ້ PIN ຂອງທ່ານເພື່ອເຂົ້າສູ່ລະບົບ ຫຼື ປົດລັອກອຸປະກອນຂອງທ່ານໄດ້.</translation> <translation id="6206311232642889873">ກັອບປີ້ຮູບ</translation> <translation id="6207200176136643843">ຣີເຊັດເປັນລະດັບການຊູມເລີ່ມຕົ້ນ</translation> @@ -4832,7 +4833,6 @@ <ph name="DOMAIN" /> ກຳນົດໃຫ້ທ່ານສຽບບັດອັດສະລິຍະຄ້າງໄວ້.</translation> <translation id="628352644014831790">4 ວິນາທີ</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ບໍ່ຖືກດາວໂຫຼດໂດຍທົ່ວໄປ ແລະ ອາດຈະເປັນອັນຕະລາຍ.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ເຄື່ອງພິມໃຫມ່ຢູ່ເທິງເຄືອຂ່າຍຂອງທ່ານ}other{ເຄື່ອງພິມໃຫມ່ຢູ່ເທິງເຄືອຂ່າຍຂອງທ່ານ}}</translation> <translation id="6285770818046456882">ອຸປະກອນທີ່ແບ່ງປັນກັບທ່ານໄດ້ຍົກເລີກການໂອນຍ້າຍແລ້ວ</translation> <translation id="6290613030083731160">ບໍ່ມີອຸປະກອນທີ່ກຳລັງແບ່ງປັນຢູ່ໃກ້ຄຽງ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="6291086328725007688">ກຳລັງຢັ້ງຢືນລະຫັດການເປີດນຳໃຊ້. ຂັ້ນຕອນນີ້ອາດໃຊ້ເວລາສອງສາມນາທີ.</translation> @@ -5315,6 +5315,7 @@ <translation id="6831043979455480757">ແປພາສາ</translation> <translation id="6833479554815567477">ລຶບແຖບອອກຈາກກຸ່ມ <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> ແລ້ວ</translation> <translation id="683373380308365518">ປ່ຽນເປັນໂປຣແກຣມທ່ອງເວັບທີ່ສະຫຼາດ ແລະ ປອດໄພ</translation> +<translation id="6834652994408928492">ໂໝດມືດຈະເປີດອັດຕະໂນມັດເມື່ອຕາເວັນຕົກ</translation> <translation id="683540480453879381">ເປີດໄຟລ໌ <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">ກະລຸນາເຊື່ອມຕໍ່ກັບອິນເຕີເນັດເພື່ອອັບເດດ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ.</translation> <translation id="6838034009068684089">ຖາມເມື່ອເວັບໄຊຕ້ອງການເປີດ ແລະ ວາງໜ້າຈໍໃສ່ໃນໜ້າຈໍຂອງທ່ານ (ແນະນຳ)</translation> @@ -6027,6 +6028,7 @@ <translation id="7622114377921274169">ກຳລັງສາກໄຟ.</translation> <translation id="7622768823216805500">ໂດຍປົກກະຕິແລ້ວ ເວັບໄຊຈະຕິດຕັ້ງຕົວຈັດການການຈ່າຍເງິນສຳລັບຄຸນສົມບັດການຊື້ເຄື່ອງ ເຊັ່ນ: ການຈ່າຍຄ່າສິນຄ້າທີ່ງ່າຍກວ່າ</translation> <translation id="7622903810087708234">ລາຍລະອຽດລະຫັດຜ່ານ</translation> +<translation id="7622966771025050155">ສະຫຼັບໄປຫາແຖບທີ່ບັນທຶກໄວ້</translation> <translation id="7624337243375417909">Caps Lock ປິດຢູ່</translation> <translation id="7625568159987162309">ເບິ່ງການອະນຸຍາດ ແລະ ຂໍ້ມູນທີ່ເກັບໄວ້ໃນທົ່ວເວັບໄຊ</translation> <translation id="7628201176665550262">ອັດຕາໂຫຼດຂໍ້ມູນຄືນໃໝ່</translation> @@ -6193,6 +6195,7 @@ <translation id="7784067724422331729">ການຕັ້ງຄ່າຄວາມປອດໄພຢູ່ໃນຄອມພິວເຕີຂອງທ່ານບລັອກໄຟລ໌ນີ້ແລ້ວ.</translation> <translation id="7784796923038949829">ບໍ່ສາມາດອ່ານ ຫຼື ປ່ຽນຂໍ້ມູນເວັບໄຊໄດ້</translation> <translation id="778480864305029524">ເພື່ອໃຊ້ການປ່ອຍສັນຍານທັນທີ, ກະລຸນາເປີດການແຈ້ງເຕືອນສຳລັບການບໍລິການ Google Play.</translation> +<translation id="7785471469930192436">ກະລຸນາອ່ານຄຳແນະນຳຂອງໂປຣແກຣມຊອກຫາຂອງທ່ານສຳລັບວິທີການລຶບປະຫວັດການຊອກຫາ, ຖ້າມີ</translation> <translation id="7786889348652477777">ໂຫຼດແອັບໃໝ່</translation> <translation id="7787308148023287649">ສະແດງໃນໜ້າຈໍອື່ນ</translation> <translation id="7788298548579301890">ໂປຣແກຣມອື່ນຢູ່ໃນຄອມພິວເຕີຂອງທ່ານໄດ້ເພີ່ມແອັບທີ່ອາດຈະປ່ຽນແປງແບບວິທີທີ່ Chrome ເຮັດວຽກແລ້ວ. @@ -6803,6 +6806,7 @@ <translation id="8438566539970814960">ເຮັດໃຫ້ການຊອກຫາ ແລະ ການທ່ອງເວັບດີຂຶ້ນ</translation> <translation id="8439506636278576865">ສະເໜີແປໜ້ານີ້ເປັນພາສານີ້</translation> <translation id="8440630305826533614">ແອັບ Linux</translation> +<translation id="8446225304314102060">ສະຫຼັບໄປຫາແຖບ <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">ຮຽນຮູ້ເພີ່ມເຕີມ</translation> <translation id="8447409163267621480">ລວມມີ Ctrl ຫຼື Alt</translation> <translation id="8448729345478502352">ເຮັດໃຫ້ລາຍການຕ່າງໆໃນໜ້າຈໍຂອງທ່ານນ້ອຍລົງ ຫຼື ໃຫຍ່ຂຶ້ນ</translation> @@ -7464,6 +7468,7 @@ <translation id="9148058034647219655">ອອກ</translation> <translation id="9148126808321036104">ລົງຊື່ເຂົ້າໃຊ້ອີກ</translation> <translation id="9148963623915467028">ເວັບໄຊນີ້ສາມາດເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານໄດ້.</translation> +<translation id="9149529198050266366">ໂໝດມືດຈະປິດອັດຕະໂນມັດເມື່ອຕາເວັນຂຶ້ນ</translation> <translation id="9149866541089851383">ແກ້ໄຂ...</translation> <translation id="9150045010208374699">ໃຊ້ກ້ອງຖ່າຍຮູບຂອງທ່ານ</translation> <translation id="9150079578948279438">ບໍ່ສາມາດລຶບໂປຣໄຟລ໌ອອກໄດ້. ກະລຸນາລອງໃໝ່ ຫຼື ຕິດຕໍ່ຫາຜູ້ໃຫ້ບໍລິການຂອງທ່ານສຳລັບການຊ່ວຍເຫຼືອທາງເທັກນິກ.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 093d6fd..8a80fc49 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -619,7 +619,6 @@ <translation id="164936512206786300">„Bluetooth“ įrenginio atsiejimas</translation> <translation id="1651008383952180276">Reikia dukart įvesti tą pačią slaptafrazę</translation> <translation id="1652326691684645429">Įjungti Bendrinimo netoliese funkciją</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Pridėkite spausdintuvą prie „Google“ spausdinimo iš debesies, kad galėtumėte spausdinti iš bet kurios vietos.}one{Pridėkite # spausdintuvą prie „Google“ spausdinimo iš debesies, kad galėtumėte spausdinti iš bet kurios vietos.}few{Pridėkite # spausdintuvus prie „Google“ spausdinimo iš debesies, kad galėtumėte spausdinti iš bet kurios vietos.}many{Pridėkite # spausdintuvo prie „Google“ spausdinimo iš debesies, kad galėtumėte spausdinti iš bet kurios vietos.}other{Pridėkite # spausdintuvų prie „Google“ spausdinimo iš debesies, kad galėtumėte spausdinti iš bet kurios vietos.}}</translation> <translation id="1653631694606464309">Žiniatinklio programos įprastai prašo atidaryti tam tikrų tipų failus, kad galėtumėte atlikti su šiais failais susijusius veiksmus norimoje vietoje, pvz., atidaryti dokumentus naudodami norimą tekstų rengyklę</translation> <translation id="1656528038316521561">Fono nepermatomumas</translation> <translation id="1657406563541664238">Padėkite tobulinti „<ph name="PRODUCT_NAME" />“ automatiškai siųsdami „Google“ naudojimo statistiką ir trikčių ataskaitas</translation> @@ -2921,7 +2920,6 @@ <translation id="4094647278880271855">Naudojate nepalaikomą aplinkos kintamąjį: <ph name="BAD_VAR" />. Tai neigiamai paveiks stabilumą ir saugą.</translation> <translation id="4095264805865317199">Atidaryti mobiliojo ryšio aktyvinimo NS</translation> <translation id="4095507791297118304">Pagrindinis vaizdas</translation> -<translation id="409579654357498729">Pridėti prie Spausdinimo iš debesies</translation> <translation id="4096508467498758490">Išjunkite kūrėjo režimu veikiančius plėtinius</translation> <translation id="4097406557126260163">Programos ir plėtiniai</translation> <translation id="409742781329613461">„Chrome“ patarimai</translation> @@ -4399,6 +4397,7 @@ <translation id="5794700615121138172">„Linux“ bendrinami aplankai</translation> <translation id="5794786537412027208">Uždaryti visas „Chrome“ programas</translation> <translation id="5797070761912323120">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas</translation> +<translation id="5797521893972859201">Išvaloma istorija, įskaitant paieškos laukelį</translation> <translation id="5798079537501238810">Svetainėse galima įdiegti mokėjimo dorokles</translation> <translation id="579907812742603813">saugomas turinys</translation> <translation id="579915268381781820">Saugos raktas buvo pašalintas.</translation> @@ -4482,6 +4481,7 @@ <translation id="5900302528761731119">„Google“ profilio nuotrauka</translation> <translation id="590036993063074298">Išsami ekrano vaizdo bendrinimo kokybės informacija</translation> <translation id="5901069264981746702">Kontrolinio kodo duomenys saugomi saugiai ir niekada nepatenka už „<ph name="DEVICE_TYPE" />“ ribų. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Perjungti į užfiksuojamą skirtuką</translation> <translation id="5901494423252125310">Spausdintuvo durelės atidarytos</translation> <translation id="5901630391730855834">Geltona</translation> <translation id="5904614460720589786">Nepavyko nustatyti programos „<ph name="APP_NAME" />“ dėl konfigūravimo problemos. Susisiekite su administratoriumi. Klaidos kodas: <ph name="ERROR_CODE" />.</translation> @@ -4754,6 +4754,7 @@ <translation id="6196854373336333322">Plėtinys „<ph name="EXTENSION_NAME" />“ perėmė tarpinio serverio valdymą. Tai reiškia, kad jis gali keisti, nutraukti ar stebėti visus prisijungus atliekamus veiksmus. Jei nesate tikri, kodėl įvyko šis pakeitimas, tikriausiai jūs jo nenorite.</translation> <translation id="6198102561359457428">Atsijunkite, tada vėl prisijunkite...</translation> <translation id="6198252989419008588">Keisti PIN kodą</translation> +<translation id="6200047250927636406">Atmesti failą</translation> <translation id="6202304368170870640">Naudodami PIN kodą galite prisijungti prie įrenginio arba jį atrakinti.</translation> <translation id="6206311232642889873">Kopijuo&ti vaizdą</translation> <translation id="6207200176136643843">Nustatomas numatytasis mastelis</translation> @@ -4839,7 +4840,6 @@ <ph name="DOMAIN" /> reikia, kad paliktumėte įdėtą išmaniąją kortelę.</translation> <translation id="628352644014831790">4 sek.</translation> <translation id="6285120108426285413">„<ph name="FILE_NAME" />“ nėra įprastai atsisiunčiamas ir gali būti pavojingas.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Naujas spausdintuvas tinkle}one{Nauji spausdintuvai tinkle}few{Nauji spausdintuvai tinkle}many{Nauji spausdintuvai tinkle}other{Nauji spausdintuvai tinkle}}</translation> <translation id="6285770818046456882">Įrenginys, kuris bendrina su jumis, atšaukė perdavimą</translation> <translation id="6290613030083731160">Nėra jokių pasiekiamų įrenginių, bendrinančių netoliese. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Patvirtinamas aktyvinimo kodas. Tai gali užtrukti kelias minutes.</translation> @@ -5322,6 +5322,7 @@ <translation id="6831043979455480757">Vertėjas</translation> <translation id="6833479554815567477">Skirtukas pašalintas iš grupės „<ph name="GROUP_NAME" />“ – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Perjunkite į išmanią ir saugią naršyklę</translation> +<translation id="6834652994408928492">Tamsus režimas automatiškai įsijungs saulei leidžiantis</translation> <translation id="683540480453879381">Atidaryti <ph name="FILE_EXTENSIONS" /> failus</translation> <translation id="6835762382653651563">Prisijunkite prie interneto, kad galėtumėte atnaujinti „<ph name="DEVICE_TYPE" />“.</translation> <translation id="6838034009068684089">Klausti, kai svetainė nori atidaryti ir įdėti langų jūsų ekranuose (rekomenduojama)</translation> @@ -6034,6 +6035,7 @@ <translation id="7622114377921274169">Įkraunama.</translation> <translation id="7622768823216805500">Paprastai svetainėse įdiegiamos mokėjimų doroklės, naudojamos vykdant apsipirkimo funkcijas, pvz., norint supaprastinti atsiskaitymo procesą</translation> <translation id="7622903810087708234">Išsami slaptažodžio informacija</translation> +<translation id="7622966771025050155">Perjungti į užfiksuotą skirtuką</translation> <translation id="7624337243375417909">didžiųjų raidžių režimas išjungtas</translation> <translation id="7625568159987162309">Peržiūrėti leidimus ir saugomus svetainių duomenis</translation> <translation id="7628201176665550262">Atnaujinimo dažnis</translation> @@ -6200,6 +6202,7 @@ <translation id="7784067724422331729">Kompiuterio saugos nustatymai užblokavo šį failą.</translation> <translation id="7784796923038949829">Nepavyko nuskaityti arba pakeisti svetainės duomenų</translation> <translation id="778480864305029524">Jei norite naudoti momentinio įrenginio kaip modemo naudojimo funkciją, įjunkite „Google Play“ paslaugų pranešimus.</translation> +<translation id="7785471469930192436">Peržiūrėkite paieškos variklio instrukcijas, kaip ištrinti paieškos istoriją (jei taikoma).</translation> <translation id="7786889348652477777">&Įkelti programą iš naujo</translation> <translation id="7787308148023287649">Rodyti kitame ekrane</translation> <translation id="7788298548579301890">Kita kompiuterio programa pridėjo programą, kuri gali pakeisti, kaip veikia „Chrome“. @@ -6812,6 +6815,7 @@ <translation id="8438566539970814960">Tobulinti paieškas ir naršymą</translation> <translation id="8439506636278576865">Siūlyti versti puslapius šia kalba</translation> <translation id="8440630305826533614">„Linux“ programos</translation> +<translation id="8446225304314102060">Perjungti į skirtuką <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Sužinokite daugiau</translation> <translation id="8447409163267621480">Naudokite „Ctrl“ arba „Alt“</translation> <translation id="8448729345478502352">Padidinkite arba sumažinkite elementus ekrane</translation> @@ -7476,6 +7480,7 @@ <translation id="9148058034647219655">Išeiti</translation> <translation id="9148126808321036104">Prisijungti dar kartą</translation> <translation id="9148963623915467028">Ši svetainė gali pasiekti jūsų vietovės informaciją.</translation> +<translation id="9149529198050266366">Tamsus režimas automatiškai išsijungs saulei tekant</translation> <translation id="9149866541089851383">Redaguoti...</translation> <translation id="9150045010208374699">Naudoti kamerą</translation> <translation id="9150079578948279438">Nepavyko pašalinti profilio. Bandykite dar kartą arba susisiekite su operatoriumi dėl techninio palaikymo paslaugų.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 4af04fd..b17ac19 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Savienošanas pārī atcelšana ar Bluetooth ierīci</translation> <translation id="1651008383952180276">Jums divreiz jāievada viena un tā pati ieejas frāze.</translation> <translation id="1652326691684645429">Iespējot funkciju Kopīgošana tuvumā</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Pievienojiet printeri pakalpojumam Google mākoņdruka, lai varētu drukāt, atrodoties jebkurā vietā.}zero{Pievienojiet # printerus pakalpojumam Google mākoņdruka, lai varētu drukāt, atrodoties jebkurā vietā.}one{Pievienojiet # printeri pakalpojumam Google mākoņdruka, lai varētu drukāt, atrodoties jebkurā vietā.}other{Pievienojiet # printerus pakalpojumam Google mākoņdruka, lai varētu drukāt, atrodoties jebkurā vietā.}}</translation> <translation id="1653631694606464309">Tīmekļa lietotnes parasti vaicā atļauju atvērt noteikta tipa failus, lai jūs ar tiem varētu strādāt sev vēlamajā vietā, piemēram, varat atvērt dokumentus vēlamajā tekstapstrādes programmā</translation> <translation id="1656528038316521561">Fona necaurredzamība</translation> <translation id="1657406563541664238">Palīdziet uzlabot programmu <ph name="PRODUCT_NAME" />, automātiski nosūtot lietošanas statistiku un avārijas pārskatus uzņēmumam Google</translation> @@ -2905,7 +2904,6 @@ <translation id="4094647278880271855">Jūs izmantojat neatbalstītu vides mainīgo: <ph name="BAD_VAR" />. Pasliktināsies stabilitāte un drošība.</translation> <translation id="4095264805865317199">Atvērt mobilā tīkla aktivizācijas lietotāja saskarni</translation> <translation id="4095507791297118304">Galvenais displejs</translation> -<translation id="409579654357498729">Pievienot mākoņdrukai</translation> <translation id="4096508467498758490">Izstrādātāja režīma paplašinājumu atspējošana</translation> <translation id="4097406557126260163">Lietotnes un paplašinājumi</translation> <translation id="409742781329613461">Padomi par Chrome</translation> @@ -4381,6 +4379,7 @@ <translation id="5794700615121138172">Linux koplietotās mapes</translation> <translation id="5794786537412027208">Aizvērt visas Chrome lietotnes</translation> <translation id="5797070761912323120">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus.</translation> +<translation id="5797521893972859201">Tiek notīrīta vēsture, tostarp arī meklēšanas lodziņā</translation> <translation id="5798079537501238810">Atļaut vietnēm instalēt maksājumu apdarinātājus</translation> <translation id="579907812742603813">aizsargāts saturs</translation> <translation id="579915268381781820">Drošības atslēga tika noņemta.</translation> @@ -4464,6 +4463,7 @@ <translation id="5900302528761731119">Google profila fotoattēls</translation> <translation id="590036993063074298">Detalizēta informācija par spoguļošanas kvalitāti</translation> <translation id="5901069264981746702">Jūsu pirkstu nospiedumu dati tiek glabāti drošībā un vienmēr atrodas tikai jūsu ierīcē (<ph name="DEVICE_TYPE" />). <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Pāriet uz ierakstāmo cilni</translation> <translation id="5901494423252125310">Printera durvis ir atvērtas</translation> <translation id="5901630391730855834">Dzeltena</translation> <translation id="5904614460720589786">Konfigurācijas problēmas dēļ nevarēja iestatīt lietotni <ph name="APP_NAME" />. Lūdzu, sazinieties ar administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation> @@ -4736,6 +4736,7 @@ <translation id="6196854373336333322">Paplašinājums “<ph name="EXTENSION_NAME" />” pārvalda jūsu starpniekservera iestatījumus. Tas nozīmē, ka tas var mainīt, pārtraukt vai izsekot visas jūsu darbības tiešsaistē. Ja neesat pārliecināts, kāpēc notika šīs izmaiņas, visticamāk, jūs tās nevēlaties.</translation> <translation id="6198102561359457428">Izrakstīties un tad pierakstīties vēlreiz</translation> <translation id="6198252989419008588">Mainīt PIN</translation> +<translation id="6200047250927636406">Atmest failu</translation> <translation id="6202304368170870640">Varat izmantot PIN kodu, lai pierakstītos vai atbloķētu savu ierīci.</translation> <translation id="6206311232642889873">Kopēt &attēlu</translation> <translation id="6207200176136643843">Atiestatīt noklusējuma tālummaiņas līmeni</translation> @@ -4821,7 +4822,6 @@ Saskaņā ar domēna <ph name="DOMAIN" /> prasībām viedkartei ir jābūt ievietotai.</translation> <translation id="628352644014831790">4 sekundes</translation> <translation id="6285120108426285413">Fails <ph name="FILE_NAME" /> parasti netiek lejupielādēts, un tas var būt bīstams.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Jauns printeris jūsu tīklā}zero{Jauni printeri jūsu tīklā}one{Jauni printeri jūsu tīklā}other{Jauni printeri jūsu tīklā}}</translation> <translation id="6285770818046456882">Ierīcē, no kuras ar jums tiek kopīgots saturs, tika atcelta satura pārsūtīšana.</translation> <translation id="6290613030083731160">Tuvumā nav pieejamu ierīču, kas kopīgotu saturu. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="6291086328725007688">Notiek aktivizācijas koda verifikācija. Tas var ilgt dažas minūtes.</translation> @@ -5301,6 +5301,7 @@ <translation id="6831043979455480757">Tulkot</translation> <translation id="6833479554815567477">Cilne tika noņemta no grupas “<ph name="GROUP_NAME" />” — <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Pāreja uz viedu un drošu pārlūku</translation> +<translation id="6834652994408928492">Tumšais režīms tika automātiski ieslēgts saulrietā</translation> <translation id="683540480453879381">Atvērt <ph name="FILE_EXTENSIONS" /> failus</translation> <translation id="6835762382653651563">Lai atjauninātu savu <ph name="DEVICE_TYPE" /> ierīci, lūdzu, izveidojiet savienojumu ar internetu.</translation> <translation id="6838034009068684089">Vaicāt, ja vietne pieprasa atvērt un izvietot logus jūsu ekrānos (ieteicams)</translation> @@ -6013,6 +6014,7 @@ <translation id="7622114377921274169">Notiek uzlāde.</translation> <translation id="7622768823216805500">Parasti vietnes instalē maksājumu apdarinātājus, lai nodrošinātu iepirkšanās funkcijas, piemēram, ērtāku norēķināšanos.</translation> <translation id="7622903810087708234">Informācija par paroli</translation> +<translation id="7622966771025050155">Pāriet uz ierakstīto cilni</translation> <translation id="7624337243375417909">burtslēga taustiņš izslēgts</translation> <translation id="7625568159987162309">Skatīt vietnēs glabātās atļaujas un datus</translation> <translation id="7628201176665550262">Atsvaidzināšanas biežums</translation> @@ -6179,6 +6181,7 @@ <translation id="7784067724422331729">Šis fails tika bloķēts datora drošības iestatījumu dēļ.</translation> <translation id="7784796923038949829">Nevar lasīt vai mainīt vietnes datus</translation> <translation id="778480864305029524">Lai izmantotu tūlītējo piesaisti, ieslēdziet Google Play pakalpojumu paziņojumus.</translation> +<translation id="7785471469930192436">Skatiet savas meklētājprogrammas norādījumus par meklēšanas vēstures dzēšanu, ja šāda iespēja ir pieejama</translation> <translation id="7786889348652477777">&Atkārtoti ielādēt lietotni</translation> <translation id="7787308148023287649">Attēlot citā ekrānā</translation> <translation id="7788298548579301890">Cita datorā instalētā programma pievienoja lietotni, kas var izmainīt Chrome darbību. @@ -6790,6 +6793,7 @@ <translation id="8438566539970814960">Uzlabot meklēšanu un pārlūkošanu</translation> <translation id="8439506636278576865">Piedāvāt tulkot lapas šajā valodā</translation> <translation id="8440630305826533614">Linux lietotnes</translation> +<translation id="8446225304314102060">Pāriet uz cilni <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Uzziniet vairāk</translation> <translation id="8447409163267621480">Jāiekļauj “Ctrl” vai “Alt”</translation> <translation id="8448729345478502352">Palieliniet vai samaziniet ekrānā redzamos vienumus.</translation> @@ -7452,6 +7456,7 @@ <translation id="9148058034647219655">Iziet</translation> <translation id="9148126808321036104">Pierakstieties vēlreiz</translation> <translation id="9148963623915467028">Šī vietne var piekļūt jūsu atrašanās vietas datiem.</translation> +<translation id="9149529198050266366">Tumšais režīms tika automātiski izslēgts saullēktā</translation> <translation id="9149866541089851383">Rediģēt ...</translation> <translation id="9150045010208374699">Izmantot jūsu videokameru</translation> <translation id="9150079578948279438">Nevarēja noņemt profilu. Lūdzu, mēģiniet vēlreiz vai sazinieties ar mobilo sakaru operatoru, lai saņemtu tehnisko atbalstu.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 6d17117a..27bfe521 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">Распари уред со Bluetooth</translation> <translation id="1651008383952180276">Мора да ја внесете истата лозинка двапати</translation> <translation id="1652326691684645429">Овозможете „Споделување во близина“</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Додајте го печатачот во Печатење во облакот на Google за да може да печатите од каде било.}one{Додајте # печатач во Печатење во облакот на Google за да може да печатите од каде било.}other{Додајте # печатачи во Печатење во облакот на Google за да може да печатите од каде било.}}</translation> <translation id="1653631694606464309">Веб-апликациите обично бараат дозвола за отворање одредени типови датотеки за да можете да работите на нив каде што сакате, како отворање документи во претпочитаниот процесор на текст</translation> <translation id="1656528038316521561">Непроѕирност на заднината</translation> <translation id="1657406563541664238">Помогнете да го подобриме <ph name="PRODUCT_NAME" /> со автоматско испраќање статистика за користење и извештај за пад до Google</translation> @@ -2919,7 +2918,6 @@ <translation id="4094647278880271855">Користите неподдржана променлива за средината: <ph name="BAD_VAR" />. Ќе настрадаат стабилноста и безбедноста.</translation> <translation id="4095264805865317199">Отвори го корисничкиот интерфејс за активирање мобилна мрежа</translation> <translation id="4095507791297118304">Примарен приказ</translation> -<translation id="409579654357498729">Додај во Печатење во облак</translation> <translation id="4096508467498758490">Оневозможува наставки во режим на развивач</translation> <translation id="4097406557126260163">Апликации и екстензии</translation> <translation id="409742781329613461">Совети за Chrome</translation> @@ -4396,6 +4394,7 @@ <translation id="5794700615121138172">Споделени папки на Linux</translation> <translation id="5794786537412027208">Затвори ги сите апликации на Chrome</translation> <translation id="5797070761912323120">Google може да ја користи вашата историја за да го персонализира „Пребарувањето“, рекламите и другите услуги на Google</translation> +<translation id="5797521893972859201">Ја брише историјата, вклучително и во полето за пребарување</translation> <translation id="5798079537501238810">Сајтовите може да инсталираат ракувачи со плаќања</translation> <translation id="579907812742603813">заштитени содржини</translation> <translation id="579915268381781820">Вашиот безбедносен клуч е отстранет.</translation> @@ -4479,6 +4478,7 @@ <translation id="5900302528761731119">Фотографија на профилот на Google</translation> <translation id="590036993063074298">Детали за квалитет на отсликувањето</translation> <translation id="5901069264981746702">Податоците за отпечатокот безбедно се складираат и никогаш не го напуштаат <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Префрли на снимање картичка</translation> <translation id="5901494423252125310">Отворена е вратата на печатачот</translation> <translation id="5901630391730855834">Жолта боја</translation> <translation id="5904614460720589786">Не може да се постави <ph name="APP_NAME" /> поради конфигурациски проблем. Контактирајте со администраторот. Код за грешка: <ph name="ERROR_CODE" />.</translation> @@ -4751,6 +4751,7 @@ <translation id="6196854373336333322">Наставката „<ph name="EXTENSION_NAME" />“ ја презеде контролата врз поставките за прокси, што значи дека може да менува, прекинува или прислушува сѐ што правите на интернет. Доколку не сте сигурни зошто се случила промената, веројатно не ја сакате.</translation> <translation id="6198102561359457428">Одјавете се, па повторно најавете се...</translation> <translation id="6198252989419008588">Промена на PIN</translation> +<translation id="6200047250927636406">Отфрли ја датотеката</translation> <translation id="6202304368170870640">PIN-кодот може да го користите за да се најавите или да го отклучите уредот.</translation> <translation id="6206311232642889873">Коп&ирај слика</translation> <translation id="6207200176136643843">Ресетирај на стандардно ниво на зумирање</translation> @@ -4836,7 +4837,6 @@ <ph name="DOMAIN" /> бара паметната картичка да ви остане вметната.</translation> <translation id="628352644014831790">4 секунди</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> обично не се презема и може да биде опасно.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов печатач на мрежата}one{Нов печатач на мрежата}other{Нови печатачи на мрежата}}</translation> <translation id="6285770818046456882">Уредот што споделуваше со вас го откажа преносот</translation> <translation id="6290613030083731160">Нема достапни уреди што споделуваат во близина. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Се потврдува кодот за активација. Може да потрае неколку минути.</translation> @@ -5319,6 +5319,7 @@ <translation id="6831043979455480757">Преведи</translation> <translation id="6833479554815567477">Картичката е отстранета од групата <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Префрлете се на паметен и безбеден прелистувач</translation> +<translation id="6834652994408928492">Темниот режим ќе се вклучи автоматски на зајдисонце</translation> <translation id="683540480453879381">да отвора датотеки во следниве формати: <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Поврзете се на интернет за да го ажурирате <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Прашувај кога некој сајт сака да отвора и поставува прозорци на екраните (препорачано)</translation> @@ -6031,6 +6032,7 @@ <translation id="7622114377921274169">Се полни.</translation> <translation id="7622768823216805500">Сајтовите обично инсталираат ракувачи со плаќања за функциите за купување како што е полесната наплата</translation> <translation id="7622903810087708234">Детали за лозинката</translation> +<translation id="7622966771025050155">Префрли на снимената картичка</translation> <translation id="7624337243375417909">Caps Lock е исклучено</translation> <translation id="7625568159987162309">Прегледајте ги дозволите и податоците складирани на сајтовите</translation> <translation id="7628201176665550262">Брзина на освежување</translation> @@ -6197,6 +6199,7 @@ <translation id="7784067724422331729">Безбедносните поставки на вашиот компјутер ја блокираа оваа датотека.</translation> <translation id="7784796923038949829">Не може да ги чита или менува податоците на сајтот</translation> <translation id="778480864305029524">За да користите инстант врзување, вклучете ги известувањата за услугите на Google Play.</translation> +<translation id="7785471469930192436">Погледнете го упатството на пребарувачот за бришење на историјата на пребарување доколку е применливо</translation> <translation id="7786889348652477777">&Вчитај ја апликацијата повторно</translation> <translation id="7787308148023287649">Прикажи на друг екран</translation> <translation id="7788298548579301890">Друга програма на компјутерот додаде апликација што може да промени како работи Chrome. @@ -6811,6 +6814,7 @@ <translation id="8438566539970814960">Подобрете ги пребарувањата и прелистувањето</translation> <translation id="8439506636278576865">Нуди да ги преведува страниците на овој јазик</translation> <translation id="8440630305826533614">Апликации за Linux</translation> +<translation id="8446225304314102060">Префрли се на картичката <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Дознај повеќе</translation> <translation id="8447409163267621480">Опфатете или Ctrl или Alt</translation> <translation id="8448729345478502352">Намалете ги или зголемете ги ставките на екранот</translation> @@ -7473,6 +7477,7 @@ <translation id="9148058034647219655">Излези</translation> <translation id="9148126808321036104">Најави се повторно</translation> <translation id="9148963623915467028">Сајтов може да пристапува до вашата локација.</translation> +<translation id="9149529198050266366">Темниот режим ќе се исклучи автоматски на изгрејсонце</translation> <translation id="9149866541089851383">Измени...</translation> <translation id="9150045010208374699">Користи ја камерата</translation> <translation id="9150079578948279438">Профилот не можеше да се отстрани. Обидете се повторно или побарајте техничка поддршка од вашиот оператор.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index c88f76e7..202322b 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -612,7 +612,6 @@ <translation id="164936512206786300">Bluetooth ഉപകരണം ജോടി പിരിക്കുക</translation> <translation id="1651008383952180276">ഒരേ പാസ്ഫ്രെയ്സ് തന്നെ നിങ്ങള് രണ്ടുതവണ നല്കേണ്ടതുണ്ട്</translation> <translation id="1652326691684645429">സമീപമുള്ള പങ്കിടൽ പ്രവർത്തനക്ഷമമാക്കുക</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{പ്രിന്റർ Google ക്ലൗഡ് പ്രിന്റിൽ ചേർക്കുന്നതിനാൽ നിങ്ങൾക്ക് എവിടെനിന്നും പ്രിന്റ് ചെയ്യാനാകും.}other{# പ്രിന്ററുകൾ Google ക്ലൗഡ് പ്രിന്റിൽ ചേർക്കുന്നതിനാൽ നിങ്ങൾക്ക് എവിടെനിന്നും പ്രിന്റ് ചെയ്യാനാകും.}}</translation> <translation id="1653631694606464309">ചില തരം ഫയലുകൾ തുറക്കാൻ വെബ് ആപ്പുകൾ സാധാരണയായി അനുവാദം ചോദിക്കുന്നതിനാൽ, നിങ്ങൾ മുൻഗണന നൽകുന്ന വേഡ് പ്രോസസറിൽ ഡോക്യുമെന്റുകൾ തുറക്കുന്നതുപോലെ നിങ്ങൾക്ക് താൽപ്പര്യമുള്ളിടത്ത് ആ ഫയലുകളിൽ വർക്ക് ചെയ്യാനാകും</translation> <translation id="1656528038316521561">പശ്ചാത്തല അതാര്യത</translation> <translation id="1657406563541664238">Google ലേക്ക് ഉപയോഗ സ്ഥിതിവിവരകണക്കുകളും ക്രാഷ് റിപ്പോര്ട്ടുകളും സ്വയമേവ അയച്ചുകൊണ്ട് <ph name="PRODUCT_NAME" /> മെച്ചപ്പെട്ട രീതിയില് നിര്മ്മിക്കാന് സഹായിക്കുക</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">നിങ്ങള് പിന്തുണയ്ക്കാത്ത എൻവയോൺമെന്റ് വേരിയബിൾ ഉപയോഗിക്കുന്നു:<ph name="BAD_VAR" />. സ്ഥിരതയെയും സുരക്ഷയെയും ബാധിക്കും.</translation> <translation id="4095264805865317199">Cellular Activation UI തുറക്കുക</translation> <translation id="4095507791297118304">പ്രാഥമിക ഡിസ്പ്ലേ</translation> -<translation id="409579654357498729">ക്ലൗഡ് പ്രിന്റിൽ ചേർക്കുക</translation> <translation id="4096508467498758490">ഡെവലപ്പർ മോഡ് വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക</translation> <translation id="4097406557126260163">ആപ്പുകളും വിപുലീകരണങ്ങളും</translation> <translation id="409742781329613461">Chrome-നുള്ള നുറുങ്ങുകൾ</translation> @@ -4817,7 +4815,6 @@ <ph name="DOMAIN" />-ൽ തുടരുന്നതിന് നിങ്ങളുടെ സ്മാർട്ട് കാർഡ് ഇൻസേർട്ട് ചെയ്ത നിലയിൽ തുടരേണ്ടതുണ്ട്.</translation> <translation id="628352644014831790">4 സെക്കൻഡ്</translation> <translation id="6285120108426285413">സാധാരണ <ph name="FILE_NAME" /> ഡൗൺലോഡ് ചെയ്യാറില്ല, അത് അപകടകരമാകാനും ഇടയുണ്ട്.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{നിങ്ങളുടെ നെറ്റ്വർക്കിലെ പുതിയ പ്രിന്റർ}other{നിങ്ങളുടെ നെറ്റ്വർക്കിലെ പുതിയ പ്രിന്ററുകൾ}}</translation> <translation id="6285770818046456882">നിങ്ങളുമായി പങ്കിടുന്ന ഉപകരണം, കൈമാറ്റം റദ്ദാക്കി</translation> <translation id="6290613030083731160">പങ്കിടുന്ന ഉപകരണങ്ങളൊന്നും സമീപത്ത് ലഭ്യമല്ല. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="6291086328725007688">സജീവമാക്കൽ കോഡ് പരിശോധിച്ചുറപ്പിക്കുന്നു. ഇതിന് കുറച്ച് സമയമെടുത്തേക്കാം.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 359dc4d..16e63914 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -612,7 +612,6 @@ <translation id="164936512206786300">Bluetooth төхөөрөмжийг үл хослуулах</translation> <translation id="1651008383952180276">Та нэвтрэх үгээ хоёр удаа зөв оруулах шаардлагатай</translation> <translation id="1652326691684645429">Ойролцоо хуваалцах онцлогийг идэвхжүүлэх</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Хаанаас ч хэвлэхийн тулд Google Cloud Print-д хэвлэгч машин нэмэх.}other{Хаанаас ч хэвлэхийн тулд Google Cloud Print-д # хэвлэгч машин нэмэх.}}</translation> <translation id="1653631694606464309">Веб аппууд ихэвчлэн тодорхой файлуудын төрлийг нээхийг хүсдэг тул та сонгосон үг боловсруулагчаараа документ нээх зэргээр тэдгээр файл дээр хүссэн газраасаа ажиллах боломжтой</translation> <translation id="1656528038316521561">Дэвсгэрийн бүдэгрэл</translation> <translation id="1657406563541664238"><ph name="PRODUCT_NAME" />-г сайжруулахад дэмжлэг үзүүлэх зорилгоор хэрэглээний статистик болон гэмтлийн тайланг автоматаар Google-д илгээх</translation> @@ -2913,7 +2912,6 @@ <translation id="4094647278880271855">Та дэмжигдээгүй орчин тойрны хувьсагчийг ашиглаж байна: <ph name="BAD_VAR" />. Тогтвортой байдал болон аюулгүй байдал алдагдах болно.</translation> <translation id="4095264805865317199">Үүрэн сүлжээг идэвхжүүлэх UI-г нээх</translation> <translation id="4095507791297118304">Үндсэн дэлгэц</translation> -<translation id="409579654357498729">Cloud Print рүү нэмэх</translation> <translation id="4096508467498758490">Хөгжүүлэгч горимын өргөтгөлүүдийг идэвхгүй болгох</translation> <translation id="4097406557126260163">Аппууд болон өргөтгөлүүд</translation> <translation id="409742781329613461">Chrome-н зөвлөгөө</translation> @@ -4833,7 +4831,6 @@ <ph name="DOMAIN" /> таныг ухаалаг картаа оруулсан хэвээр байхыг шаардана.</translation> <translation id="628352644014831790">4 секунд</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" />-г тогтмол татдаггүй бөгөөд аюултай байж болзошгүй.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Таны сүлжээнд шинэ хэвлэгч байна}other{ Таны сүлжээнд хэд хэдэн шинэ хэвлэгч байна}}</translation> <translation id="6285770818046456882">Тантай хуваалцаж буй төхөөрөмж шилжүүлгийг цуцалсан</translation> <translation id="6290613030083731160">Ойролцоо хуваалцаж буй боломжтой төхөөрөмж алга. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Идэвхжүүлэх кодыг бататгаж байна. Үүнд хэдэн минут шаардлагатай байж магадгүй.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index e87abc6..a6f1ee97 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">ब्लूटूथ डिव्हाइसचे पेअरिंग काढा</translation> <translation id="1651008383952180276">समान सांकेतिक पासफ्रेझ दोनदा एंटर करणे आवश्यक आहे</translation> <translation id="1652326691684645429">Nearby सह शेअरिंग सुरू करा</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google क्लाउड प्रिंट वर प्रिंटर जोडा जेणेकरून तुम्ही कुठूनही प्रिंट करू शकता.}other{Google क्लाउड प्रिंट वर # प्रिंटर जोडा जेणेकरून तुम्ही कुठूनही प्रिंट करू शकता.}}</translation> <translation id="1653631694606464309">वेब अॅप्स साधारणतः विविध प्रकारच्या फाइल उघडण्याची विनंती करते त्यामुळे त्या फाइलवर तुम्हाला जिथे हवे आहे तिथे काम करू शकता जसे की, तुमच्या प्राधान्यकृत वर्ड प्रोसेसरमध्ये दस्तऐवज उघडणे</translation> <translation id="1656528038316521561">बॅकग्राउंडची अपारदर्शकता</translation> <translation id="1657406563541664238">वापर आकडेवारी आणि क्रॅश अहवाल आपोआप Google कडे पाठवून <ph name="PRODUCT_NAME" /> ला अधिक चांगले करण्यास मदत करा</translation> @@ -2915,7 +2914,6 @@ <translation id="4094647278880271855">तुम्ही सपोर्ट नसलेले पर्यावरण व्हेरिएबल वापरत आहात: <ph name="BAD_VAR" />. स्थिरता आणि सुरक्षेवर परिणाम होईल.</translation> <translation id="4095264805865317199">सेल्युलर अॅक्टिव्हेशन UI उघडा</translation> <translation id="4095507791297118304">प्राथमिक डिस्प्ले</translation> -<translation id="409579654357498729">क्लाउड प्रिंट वर जोडा</translation> <translation id="4096508467498758490">डेव्हलपर मोड एक्स्टेंशन अक्षम करा</translation> <translation id="4097406557126260163">अॅप्स आणि एक्स्टेंशन</translation> <translation id="409742781329613461">Chrome साठी टिपा</translation> @@ -4833,7 +4831,6 @@ <ph name="DOMAIN" /> ला तुम्ही तुमचे स्मार्ट कार्ड घालून ठेवणे आवश्यक आहे.</translation> <translation id="628352644014831790">चार सेकंद</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> सामान्यपणे डाउनलोड केले जात नाही आणि ते धोकादायक ठरु शकते.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{आपल्या नेटवर्कवरील नवीन प्रिंटर}other{आपल्या नेटवर्कवरील नवीन प्रिंटर}}</translation> <translation id="6285770818046456882">तुमच्यासोबत शेअर करत असलेल्या डिव्हाइसने ट्रान्सफर रद्द केली</translation> <translation id="6290613030083731160">जवळपास शेअर करत असलेली कोणतीही डिव्हाइस उपलब्ध नाहीत. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="6291086328725007688">अॅक्टिव्हेशन कोडची पडताळणी करत आहे. याला काही मिनिटे लागू शकतात.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index b9c20422c..8d0aaea 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Nyahgandingkan peranti Bluetooth</translation> <translation id="1651008383952180276">Anda mesti memasukkan ungkapan laluan yang sama dua kali</translation> <translation id="1652326691684645429">Dayakan Kongsi Berdekatan</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Tambahkan pencetak kepada Pencetak Awan Google supaya anda dapat mencetak dari mana-mana sahaja.}other{Tambahkan # pencetak kepada Pencetak Awan Google supaya anda dapat mencetak dari mana-mana sahaja.}}</translation> <translation id="1653631694606464309">Biasanya apl web meminta untuk membuka jenis fail tertentu supaya anda boleh menggunakan fail tersebut dalam mana-mana perisian, seperti membuka dokumen dalam pemproses kata pilihan anda</translation> <translation id="1656528038316521561">Kelegapan latar</translation> <translation id="1657406563541664238">Bantu jadikan <ph name="PRODUCT_NAME" /> lebih baik dengan menghantar statistik dan laporan nahas secara automatik kepada Google</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Anda sedang menggunakan pemboleh ubah persekitaran yang tidak disokong: <ph name="BAD_VAR" />. Kestabilan dan keselamatan akan terjejas.</translation> <translation id="4095264805865317199">Buka UI Pengaktifan Selular</translation> <translation id="4095507791297118304">Paparan utama</translation> -<translation id="409579654357498729">Tambahkan pada Cetakan Awan</translation> <translation id="4096508467498758490">Lumpuhkan sambungan mod pembangun</translation> <translation id="4097406557126260163">Apl dan sambungan</translation> <translation id="409742781329613461">Petua untuk Chrome</translation> @@ -4395,6 +4393,7 @@ <translation id="5794700615121138172">Folder kongsi Linux</translation> <translation id="5794786537412027208">Hentikan semua Apl Chrome</translation> <translation id="5797070761912323120">Google boleh menggunakan sejarah anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain</translation> +<translation id="5797521893972859201">Kosongkan sejarah, termasuk item dalam kotak carian</translation> <translation id="5798079537501238810">Laman boleh memasang pengendali pembayaran</translation> <translation id="579907812742603813">kandungan yang dilindungi</translation> <translation id="579915268381781820">Kunci keselamatan anda telah dialih keluar.</translation> @@ -4478,6 +4477,7 @@ <translation id="5900302528761731119">Foto Profil Google</translation> <translation id="590036993063074298">Butiran Kualiti Pencerminan</translation> <translation id="5901069264981746702">Data cap jari anda disimpan dengan selamat dan tidak sekali-kali dihantar keluar daripada <ph name="DEVICE_TYPE" /> anda. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Beralih kepada menangkap tab</translation> <translation id="5901494423252125310">Pintu pencetak terbuka</translation> <translation id="5901630391730855834">Kuning</translation> <translation id="5904614460720589786">Tidak dapat menyediakan <ph name="APP_NAME" /> kerana terdapat masalah konfigurasi. Sila hubungi pentadbir anda. Kod ralat: <ph name="ERROR_CODE" />.</translation> @@ -4750,6 +4750,7 @@ <translation id="6196854373336333322">Sambungan "<ph name="EXTENSION_NAME" />" telah mengambil alih kawalan tetapan proksi anda, yang bermakna sambungan ini boleh mengubah, menghentikan atau mencuri dengar apa-apa sahaja yang anda lakukan dalam talian. Jika anda tidak pasti mengapa perubahan ini berlaku, anda mungkin tidak mahukannya.</translation> <translation id="6198102561359457428">Log keluar kemudian log masuk semula...</translation> <translation id="6198252989419008588">Tukar PIN</translation> +<translation id="6200047250927636406">Buang fail</translation> <translation id="6202304368170870640">Anda boleh menggunakan PIN anda untuk log masuk atau membuka kunci peranti anda.</translation> <translation id="6206311232642889873">Sal&in Imej</translation> <translation id="6207200176136643843">Tetapkan semula kepada tahap zum lalai</translation> @@ -4835,7 +4836,6 @@ <ph name="DOMAIN" /> menghendaki anda memastikan kad pintar anda tidak dikeluarkan.</translation> <translation id="628352644014831790">4 saat</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> tidak biasa dimuat turun dan mungkin berbahaya.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Pencetak baharu pada rangkaian anda}other{Pencetak baharu pada rangkaian anda}}</translation> <translation id="6285770818046456882">Peranti yang berkongsi dengan anda telah membatalkan pemindahan</translation> <translation id="6290613030083731160">Tiada peranti yang tersedia berkongsi berdekatan. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Mengesahkan kod pengaktifan. Proses ini mungkin mengambil masa beberapa minit.</translation> @@ -5318,6 +5318,7 @@ <translation id="6831043979455480757">Terjemah</translation> <translation id="6833479554815567477">Tab dialih keluar daripada kumpulan <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Tukar kepada penyemak imbas yang pintar dan selamat</translation> +<translation id="6834652994408928492">Mod gelap akan dihidupkan secara automatik pada waktu matahari terbenam</translation> <translation id="683540480453879381">Buka fail <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Sila sambung ke Internet untuk mengemaskinikan <ph name="DEVICE_TYPE" /> anda.</translation> <translation id="6838034009068684089">Tanya apabila tapak mahu membuka dan meletakkan tetingkap pada skrin anda (disyorkan)</translation> @@ -6030,6 +6031,7 @@ <translation id="7622114377921274169">Mengecas.</translation> <translation id="7622768823216805500">Tapak biasanya memasang pengendali pembayaran untuk ciri beli-belah seperti daftar keluar yang lebih mudah</translation> <translation id="7622903810087708234">Butiran kata laluan</translation> +<translation id="7622966771025050155">Beralih kepada tab yang ditangkap</translation> <translation id="7624337243375417909">kunci huruf besar dimatikan</translation> <translation id="7625568159987162309">Lihat kebenaran dan data yang disimpan pada semua tapak</translation> <translation id="7628201176665550262">Kadar Muat Semula</translation> @@ -6196,6 +6198,7 @@ <translation id="7784067724422331729">Tetapan keselamatan pada komputer anda telah menyekat fail ini.</translation> <translation id="7784796923038949829">Tidak dapat membaca atau menukar data tapak</translation> <translation id="778480864305029524">Untuk menggunakan Penambatan Segera, hidupkan pemberitahuan untuk Perkhidmatan Google Play.</translation> +<translation id="7785471469930192436">Lihat arahan enjin carian anda untuk memadamkan sejarah carian anda, jika berkenaan</translation> <translation id="7786889348652477777">&Muat Semula Apl</translation> <translation id="7787308148023287649">Paparkan pada skrin lain</translation> <translation id="7788298548579301890">Atur cara lain pada komputer anda telah menambahkan apl yang boleh mengubah cara Chrome berfungsi. @@ -6809,6 +6812,7 @@ <translation id="8438566539970814960">Mempertingkatkan carian dan penyemakan imbas</translation> <translation id="8439506636278576865">Tawaran untuk menterjemahkan halaman dalam bahasa ini</translation> <translation id="8440630305826533614">Apl Linux</translation> +<translation id="8446225304314102060">Beralih kepada tab <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Ketahui Lebih Lanjut</translation> <translation id="8447409163267621480">Termasuk sama ada Ctrl atau Alt</translation> <translation id="8448729345478502352">Kecilkan atau besarkan item pada skrin anda</translation> @@ -7470,6 +7474,7 @@ <translation id="9148058034647219655">Keluar</translation> <translation id="9148126808321036104">Log masuk semula</translation> <translation id="9148963623915467028">Tapak ini boleh mengakses lokasi anda.</translation> +<translation id="9149529198050266366">Mod gelap akan dimatikan secara automatik pada waktu matahari terbit</translation> <translation id="9149866541089851383">Edit...</translation> <translation id="9150045010208374699">Gunakan kamera anda</translation> <translation id="9150079578948279438">Profil tidak dapat dialih keluar. Sila cuba lagi atau hubungi pembawa anda untuk mendapatkan sokongan teknikal.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 939601f0..27243fec 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -615,8 +615,6 @@ <translation id="164936512206786300">ဘလူးတုသ်စက် ချိတ်ဆက်မှု ဖြုတ်ရန်</translation> <translation id="1651008383952180276">တူညီသည့် လျှို့ဝှက်စကားစုကို နှစ်ကြိမ်ထည့်ရပါမည်</translation> <translation id="1652326691684645429">'အနီးတစ်ဝိုက် မျှဝေခြင်း' ကို ဖွင့်ရန်</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{သင့်အနေနှင့် ဘယ်နေရာမှမဆို ပရင့်ထုတ်ယူနိုင်ရန် ပရင်တာအား Google Cloud Print သို့ ထည့်ထားပါ။}other{ဘယ်နေရာမှမဆို သင် ပရင့်ထုတ်ယူနိုင်ရန် ပရင်တာ # အား Google Cloud Print သို့ ထည့်ထားပါ။ -}}</translation> <translation id="1653631694606464309">ဝဘ်အက်ပ်များသည် ဖိုင်အမျိုးအစားအချို့ကို ဖွင့်ရန် ခွင့်တောင်းလေ့ရှိသည့်အတွက် သင့်ဦးစားပေး စာလုံးပရိုဆက်စာတွင် မှတ်တမ်းများဖွင့်ခြင်းကဲ့သို့ သင်နှစ်သက်ရာတွင် အဆိုပါဖိုင်များဖြင့် အလုပ်လုပ်နိုင်သည်</translation> <translation id="1656528038316521561">နောက်ခံ အလင်းပိတ်နှုန်း</translation> <translation id="1657406563541664238">Google ထံသို့ သုံးစွဲမှု စာရင်းအင်းများ နှင့် ပျက်စီးမှု အစီရင်ခံစာများကို အလိုအလျောက် ပို့ပေးခြင်းဖြင့် <ph name="PRODUCT_NAME" />ကို ပိုကောင်းလာအောင် ကူညီပေးပါ။</translation> @@ -2916,7 +2914,6 @@ <translation id="4094647278880271855">သင်သည် ပံ့ပိုးမထားသော ပတ်ဝန်းကျင်ကိန်းရှင်− <ph name="BAD_VAR" /> ကို အသုံးပြုနေသည်။ တည်ငြိမ်မှုနှင့် လုံခြုံရေး ပြဿနာရှိနိုင်သည်။</translation> <translation id="4095264805865317199">ဆယ်လူလာ စတင်ခြင်း UI ဖွင့်ရန်</translation> <translation id="4095507791297118304">မူရင်း မျက်နှာပြင် ပြသမှု</translation> -<translation id="409579654357498729">မိုးတိမ် ပရင့်သို့ ထည့်ရန်</translation> <translation id="4096508467498758490">ပြုစုသူ မုဒ်တိုးချဲ့မှုများ ပိတ်ထားရန်</translation> <translation id="4097406557126260163">အက်ပ်များနှင့် နောက်ဆက်တွဲများ</translation> <translation id="409742781329613461">Chrome အတွက် အကြံပြုချက်များ</translation> @@ -4394,6 +4391,7 @@ <translation id="5794700615121138172">Linux မျှဝေထားသော ဖိုင်တွဲများ</translation> <translation id="5794786537412027208">Chrome အက်ပ်များ အားလုံး ရပ်တန့်ရန်</translation> <translation id="5797070761912323120">Search၊ ကြော်ငြာနှင့် အခြား Google ဝန်ဆောင်မှုများအား ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် Google က သင့်မှတ်တမ်းကို သုံးနိုင်သည်</translation> +<translation id="5797521893972859201">ရှာဖွေစာလုံးဖြည့်ကွက်လပ် အပါအဝင် မှတ်တမ်းကို ရှင်းပေးသည်</translation> <translation id="5798079537501238810">ဝဘ်ဆိုက်များက ငွေပေးချေမှု စီမံသူများ ထည့်သွင်းနိုင်သည်</translation> <translation id="579907812742603813">ကာကွယ်ထားသည့် အကြောင်းအရာ</translation> <translation id="579915268381781820">သင့်လုံခြုံရေးကီးကို ဖယ်ရှားလိုက်ပါပြီ။</translation> @@ -4477,6 +4475,7 @@ <translation id="5900302528761731119">Google ပရိုဖိုင်ဓါတ်ပုံ</translation> <translation id="590036993063074298">စကရင်ပွားခြင်း အရည်အသွေး အသေးစိတ်</translation> <translation id="5901069264981746702">သင့်လက်ဗွေဒေတာကို သင်၏ <ph name="DEVICE_TYPE" /> တွင်သာ လုံခြုံစွာ သိမ်းထားသည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">ရိုက်ကူးနေသောတဘ်သို့ ပြောင်းရန်</translation> <translation id="5901494423252125310">ပရင်တာတံခါး ပွင့်နေခြင်း</translation> <translation id="5901630391730855834">အၐါရောင်</translation> <translation id="5904614460720589786">စီစဉ်သတ်မှတ်မှု ပြဿနာကြောင့် <ph name="APP_NAME" /> ကို စနစ်ထည့်သွင်း၍မရပါ။ သင့်စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။ အမှားကုဒ်- <ph name="ERROR_CODE" />။</translation> @@ -4747,6 +4746,7 @@ <translation id="6196854373336333322">တိုးချဲ့လိုင်း "<ph name="EXTENSION_NAME" />" သည် သင့် ပရောက်စီ ဆက်တင်များအား ထိန်းချုပ်ထားသည်၊ ဆိုလိုသည်မှာ ၎င်းမှ အွန်လိုင်းတွင် သင်ပြုလုပ်သည်များအား ပြင်ဆင်နိုင်၊ ဖောက်ဖျက်နိုင်၊ သို့မဟုတ် ချောင်းနားထောင်နိုင်သည်။ ဤအပြောင်းအလဲဖြစ်ရခြင်းအကြောင်းရင်းအား သင် သေချာမသိပါက၊ သင် ၎င်းအား လိုအပ်မည် မထင်ပါ။</translation> <translation id="6198102561359457428">ထွက်လိုက်ပါ၊ ပြီးမှ ထပ်ဝင်ပါ...</translation> <translation id="6198252989419008588">ပင်နံပါတ် ပြောင်းလဲမည်</translation> +<translation id="6200047250927636406">ဖိုင်ကို ဖယ်ပစ်ရန်</translation> <translation id="6202304368170870640">သင့်စက်ပစ္စည်းသို့ လက်မှတ်ထိုးဝင်ရန် (သို့) လော့ခ်ဖွင့်ရန် သင်၏' ပင်နံပါတ်' ကို အသုံးပြုနိုင်သည်။</translation> <translation id="6206311232642889873">ပုံ&ကို ကူးယူရန်</translation> <translation id="6207200176136643843">မူရင်းဇူးမ်ပမာဏသို့ ပြင်ဆင်သတ်မှတ်ရန်</translation> @@ -4833,7 +4833,6 @@ သင့်စမတ်ကတ်ကို ထည့်သွင်းထားရန် <ph name="DOMAIN" /> က သတ်မှတ်ထားသည်။</translation> <translation id="628352644014831790">၄ စက္ကန့်</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ကို ဒေါင်းလုဒ်လုပ်လေ့ မရှိကြပါ။ အန္တရာယ် ရှိနိုင်သည်။</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{သင့်ကွန်ရက်ရှိ ပရင်တာအသစ်}other{သင့်ကွန်ရက်ရှိ ပရင်တာ အသစ်များ}}</translation> <translation id="6285770818046456882">သင်နှင့်မျှဝေထားသောစက်က လွှဲပြောင်းမှုကို ပယ်ဖျက်လိုက်သည်</translation> <translation id="6290613030083731160">အနီးတွင် မျှဝေနေသော စက်များမရှိပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="6291086328725007688">စသုံးရန်ကုဒ် စိစစ်နေသည်။ မိနစ်အနည်းငယ် ကြာနိုင်ပါသည်။</translation> @@ -5314,6 +5313,7 @@ <translation id="6831043979455480757">ဘာသာပြန်ရန်</translation> <translation id="6833479554815567477"><ph name="GROUP_NAME" /> အုပ်စုမှ တဘ်ကို ဖယ်ရှားလိုက်သည် - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">ပါးနပ်ပြီး လုံခြုံမှုရှိသော ဘရောင်ဇာသို့ ပြောင်းလိုက်ပါ</translation> +<translation id="6834652994408928492">နေဝင်ချိန်တွင် အမှောင်မုဒ် အလိုအလျောက်ဖွင့်မည်</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> ဖိုင်များ ဖွင့်ရန်</translation> <translation id="6835762382653651563">သင့် <ph name="DEVICE_TYPE" /> ကို အသစ်မွမ်းမံရန် ကျေးဇူးပြု၍ အင်တာနက်နှင့် ချိတ်ဆက်ပါ။</translation> <translation id="6838034009068684089">သင့်ဖန်သားပြင်များတွင် ဝဘ်ဆိုက်က ဝင်းဒိုးများ ဖွင့်ပြီး နေရာချထားလိုသည့်အခါ ခွင့်တောင်းရန် (အကြံပြုထားသည်)</translation> @@ -6026,6 +6026,7 @@ <translation id="7622114377921274169">အားသွင်းနေပါသည်။</translation> <translation id="7622768823216805500">လွယ်ကူစွာငွေရှင်းရန်ကဲ့သို့ ဈေးဝယ်ဝန်ဆောင်မှုများအတွက် ဝဘ်ဆိုက်များက ငွေပေးချေမှုစီမံသူများ ထည့်သွင်းလေ့ရှိသည်</translation> <translation id="7622903810087708234">စကားဝှက် အသေးစိတ်များ</translation> +<translation id="7622966771025050155">ရိုက်ကူးထားသောတဘ်သို့ ပြောင်းရန်</translation> <translation id="7624337243375417909">စာလုံးကြီး ခလုတ် ပိတ်ထားသည်</translation> <translation id="7625568159987162309">ဝဘ်ဆိုက်များအတွက် ခွင့်ပြုချက်များနှင့် သိမ်းဆည်းထားသည့် ဒေတာများကို ကြည့်ရန်</translation> <translation id="7628201176665550262">ပြန်လည်စတင်နှုန်း</translation> @@ -6192,6 +6193,7 @@ <translation id="7784067724422331729">သင့်ကွန်ပျူတာရှိ လုံခြုံရေး ကြိုတင်ချိန်ညှိမှုများသည် ဤဖိုင်အား ပိတ်ဆို့ထားသည်။</translation> <translation id="7784796923038949829">ဝဘ်ဆိုက်၏ဒေတာများကို ဖတ်၍ (သို့) ပြောင်း၍ မရပါ</translation> <translation id="778480864305029524">မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ် တစ်မုဟုတ်ခြင်းသုံးရန် Google Play ဝန်ဆောင်မှုများအတွက် အကြောင်းကြားချက်များကို ဖွင့်ပါ။</translation> +<translation id="7785471469930192436">သက်ဆိုင်မှုရှိပါက သင်၏ရှာဖွေမှတ်တမ်းကို ဖျက်ရန်အတွက် သင့်ရှာဖွေရေး အင်ဂျင်၏ ညွှန်ကြားချက်များကို ကြည့်ပါ</translation> <translation id="7786889348652477777">အက်ပ်ကို ပြန်စရန်</translation> <translation id="7787308148023287649">အခြားမျက်နှာပြင်တစ်ခုပေါ်တွင် ပြသပါ</translation> <translation id="7788298548579301890">Chrome အလုပ်လုပ်ပုံကို ပြောင်းလဲစေမည့် အက်ပ်တစ်ခုကို သင့်ကွန်ပျူတာပေါ်ရှိ အခြားပရိုဂရမ်တစ်ခုက ထည့်သွင်းခဲ့သည်။ @@ -6803,6 +6805,7 @@ <translation id="8438566539970814960">ရှာဖွေမှုနှင့် ဖွင့်ကြည့်မှု ပိုမိုကောင်းမွန်လာအောင် လုပ်ခြင်း</translation> <translation id="8439506636278576865">ဒီဘာသာစကားဖြင့် စာမျက်နှာများကို ဘာသာပြန်ပေးရန် ကမ်းလှမ်းပါ</translation> <translation id="8440630305826533614">Linux အက်ပ်များ</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> တဘ်သို့ ပြောင်းရန်</translation> <translation id="8446884382197647889">ပိုမို လေ့လာရန်</translation> <translation id="8447409163267621480">Ctrl သို့မဟုတ် Alt ကို နှိပ်ပါ</translation> <translation id="8448729345478502352">သင်၏ မျက်နှာပြင်ပေါ်ရှိ အရာများကို ပိုသေးအောင် သို့မဟုတ် ပိုကြီးအောင် ပြုလုပ်ပါ</translation> @@ -7464,6 +7467,7 @@ <translation id="9148058034647219655">ထွက်</translation> <translation id="9148126808321036104">ထပ်ပြီး လက်မှတ်ထိုး ဝင်ရန်</translation> <translation id="9148963623915467028">ဤဝဘ်ဆိုက်သည် သင့်တည်နေရာကို သုံးနိုင်သည်။</translation> +<translation id="9149529198050266366">နေထွက်ချိန်တွင် အမှောင်မုဒ် အလိုအလျောက်ပိတ်မည်</translation> <translation id="9149866541089851383">တည်းဖြတ်ရန်...</translation> <translation id="9150045010208374699">သင့်ကင်မရာအား အသုံးပြုမည်</translation> <translation id="9150079578948279438">ပရိုဖိုင်ကို ဖယ်ရှား၍မရပါ။ ထပ်စမ်းကြည့်ပါ (သို့) နည်းပညာအကူအညီအတွက် သင့်ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index e1e0f151..98256d1e 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">ब्लुटुथ यन्त्रको जोडा हटाउनुहोस्</translation> <translation id="1651008383952180276">तपाईंले अनिवार्य रूपले उही पासफ्रेज दुई पटक प्रविष्ट गर्नुपर्छ</translation> <translation id="1652326691684645429">नजिकैका डिभाइससँग सेयर गर्ने सुविधा सक्षम पार्नुहोस्</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{प्रिन्टर Goolge क्लाउड प्रिन्टमा थप्नुहोस् ताकि तपाईँले जहाँबाट पनि प्रिन्ट गर्न सक्नुहुन्छ।}other{ # प्रिन्टरहरू Goolge क्लाउड प्रिन्टमा थप्नुहोस् ताकि तपाईँले जहाँबाट पनि प्रिन्ट गर्न सक्नुहुन्छ।}}</translation> <translation id="1653631694606464309">तपाईं निश्चित प्रकारका फाइलहरू आफूले चाहेको ह्यान्ड्लरमार्फत खोलेर तिनमा काम गर्न सक्नुहोस् भन्नाका खातिर वेब एपहरूले सामान्यतया निश्चित प्रकारका फाइलहरू खोल्ने अनुमति माग्छन्। उदाहरणका लागि तपाईं डकुमेन्टहरू आफूले चाहेको वर्ड प्रोसेसरमा खोल्न सक्नुहुन्छ</translation> <translation id="1656528038316521561">पृष्ठभूमिको अपारदर्शिता</translation> <translation id="1657406563541664238">Google लाई स्वत: उपयोग तथ्याङ्क र क्र्यास रिपोर्टहरू पठाएर <ph name="PRODUCT_NAME" /> लाई अझ राम्रो बनाउन मद्दत गर्नुहोस्</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">तपाईं वातावरणसम्बन्धी एउटा असमर्थित चर प्रयोग गर्दै हुनुहुन्छ: <ph name="BAD_VAR" />। यसले स्थिरता र सुरक्षालाई नकारात्मक प्रभाव पार्ने छ।</translation> <translation id="4095264805865317199">सेलुलर सक्रिय गर्नेसम्बन्धी UI खोल्नुहोस्</translation> <translation id="4095507791297118304">प्राथमिक प्रदर्शन</translation> -<translation id="409579654357498729">क्लाउड प्रिन्टमा थप्नुहोस्</translation> <translation id="4096508467498758490">विकारकर्ता मोड विस्तारहरू असक्षम गर्नुहोस्</translation> <translation id="4097406557126260163">एप र एक्स्टेन्सनहरू</translation> <translation id="409742781329613461">Chrome सम्बन्धी सुझावहरू</translation> @@ -4376,6 +4374,7 @@ <translation id="5794700615121138172">Linux बाट सेयर गरिएका फोल्डरहरू</translation> <translation id="5794786537412027208">सबै Chrome एप्स छोड्नुहोस्</translation> <translation id="5797070761912323120">Google ले खोज, विज्ञापन र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको इतिहाससम्बन्धी जानकारी प्रयोग गर्न सक्छ</translation> +<translation id="5797521893972859201">यसले खोज बाकसको इतिहासलगायतका ब्राउजिङ इतिहास मेटाउँछ</translation> <translation id="5798079537501238810">साइटहरूले भुक्तानी ह्यान्ड्लरहरू इन्स्टल गर्न सक्छन्</translation> <translation id="579907812742603813">संरक्षित सामग्री</translation> <translation id="579915268381781820">तपाईंको सुरक्षा साँचो हटाइयो।</translation> @@ -4459,6 +4458,7 @@ <translation id="5900302528761731119">Google प्रोफाइल तस्बिर</translation> <translation id="590036993063074298">मिररिङको गुणस्तरसम्बन्धी विवरण</translation> <translation id="5901069264981746702">तपाईंको फिंगरप्रिन्टसम्बन्धी डेटा सुरक्षित रूपमा भण्डारण गरिन्छ र यो डेटा तपाईंको <ph name="DEVICE_TYPE" /> बाट अन्यत्र पठाइँदैन। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">क्याप्चर गरिँदै गरेको ट्याबमा जानुहोस्</translation> <translation id="5901494423252125310">प्रिन्टरको कभर खुला छ</translation> <translation id="5901630391730855834">पहेँलो</translation> <translation id="5904614460720589786">कन्फिगुरेसनसम्बन्धी कुनै समस्याका कारण <ph name="APP_NAME" /> सेटअप गर्न सकिएन। कृपया आफ्ना एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation> @@ -4730,6 +4730,7 @@ <translation id="6196854373336333322">विस्तार "<ph name="EXTENSION_NAME" />" ले तपाईंका प्रोक्सी सेटिङहरूको नियन्त्रण गरेको छ, मतलब तपाईंले अनलाइन गरेको जुनसुकै कुरालाई यसले परिवर्तन गर्न, बिगार्न वा चियो गर्न सक्छ। यो किन परिवर्तन भयो भन्नेमा सुनिश्चित हुनुहुन्न भने सायद तपाईं यसलाई चाहनुहुन्न।</translation> <translation id="6198102561359457428">साइन आउट गर्नुहोस् र त्यसपछि पुन: साइन इन गर्नुहोस्...</translation> <translation id="6198252989419008588">PIN परिवर्तन गर्नुहोस्</translation> +<translation id="6200047250927636406">फाइल खारेज गर्नुहोस्</translation> <translation id="6202304368170870640">तपाईं आफ्नो यन्त्रमा साइन इन गर्न वा त्यसलाई अनलक गर्न आफ्नो PIN प्रयोग गर्न सक्नुहुन्छ।</translation> <translation id="6206311232642889873">छविको प्रतिलिपि गर्नुहोस्</translation> <translation id="6207200176136643843">डिफल्ट जुम स्तरमा रिसेट गर्नुहोस्</translation> @@ -4815,7 +4816,6 @@ <ph name="DOMAIN" /> मा तपाईंले आफ्नो स्मार्ट कार्ड इन्सर्ट गरिराख्नु पर्ने हुन्छ।</translation> <translation id="628352644014831790">४ सेकेन्ड</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> लाई सामान्यत: डाउनलोड गरिँदैन र यो खतरनाक हुन सक्छ।</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{तपाईँको नेटवर्कमा नयाँ प्रिन्टर}other{ तपाईँको नेटवर्कमा नयाँ प्रिन्टरहरू}}</translation> <translation id="6285770818046456882">तपाईंको डिभाइसमा फाइल सेयर गरिरहेको यन्त्रले सार्ने काम रद्द गरेको छ</translation> <translation id="6290613030083731160">वरपर सामग्री सेयर गर्नका निम्ति कुनै पनि यन्त्र उपलब्ध छैन। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="6291086328725007688">एक्टिभेसन कोड पुष्टि गरिँदै छ। यो कार्य पूरा हुन केही बेर लाग्न सक्छ।</translation> @@ -5298,6 +5298,7 @@ <translation id="6831043979455480757">अनुवाद गर्नुहोस्</translation> <translation id="6833479554815567477">यो ट्याब <ph name="GROUP_NAME" /> समूहबाट हटाइयो - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">कुनै स्मार्ट तथा सुरक्षित ब्राउजरमा बदल्नुहोस्</translation> +<translation id="6834652994408928492">अँध्यारो मोड सूर्यास्तको बेला स्वतः अफ हुने छ</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> फाइलहरू खोल्नुहोस्</translation> <translation id="6835762382653651563">कृपया तपाईँको <ph name="DEVICE_TYPE" /> अद्यावधिक गर्न इन्टरनेटमा कनेक्ट गर्नुहोस्।</translation> <translation id="6838034009068684089">कुनै साइटले मेरा स्क्रिनहरूमा विन्डो राख्न र त्यहाँ भएका विन्डो खोल्न खोज्दा त्यसो गर्न दिने कि नदिने भनी सोधियोस् (सिफारिस गरिएको)</translation> @@ -6010,6 +6011,7 @@ <translation id="7622114377921274169">चार्ज गर्दै।</translation> <translation id="7622768823216805500">साइटहरूले अझ सहज रूपमा चेकआउट गर्नेलगायतका किनमेलसम्बन्धी सुविधाहरू प्रदान गर्न सामान्यतया भुक्तानी ह्यान्ड्लर इन्स्टल गर्छन्</translation> <translation id="7622903810087708234">पासवर्डसम्बन्धी विवरणहरू</translation> +<translation id="7622966771025050155">क्याप्चर गरिएको ट्याबमा जानुहोस्</translation> <translation id="7624337243375417909">क्याप्स लक निष्क्रिय छ</translation> <translation id="7625568159987162309">विभिन्न साइटहरूमा भण्डारण गरिएका अनुमति र डेटा हेर्नुहोस्</translation> <translation id="7628201176665550262">रिफ्रेस हुने दर</translation> @@ -6176,6 +6178,7 @@ <translation id="7784067724422331729">तपाइँको कम्प्युटरमा भएको सुरक्षा सेटिङहरूले यस फाइलहरूलाई रोकेको छ।</translation> <translation id="7784796923038949829">साइटको डेटा पढ्न वा त्यसमा परिवर्तन गर्न सकिएन</translation> <translation id="778480864305029524">तात्कालिक टेदरिङ नामक सुविधा प्रयोग गर्न Google Play Services का सूचनाहरू सक्रिय पार्नुहोस्।</translation> +<translation id="7785471469930192436">तपाईंको सर्च इन्जिनमा खोजको इतिहास मेटाउन मिल्छ भने खोज इतिहास मेटाउन सर्च इन्जिनले उपलब्ध गराएका निर्देशनहरू हेर्नुहोस्</translation> <translation id="7786889348652477777">एप पुन: &लोड गर्नुहोस्</translation> <translation id="7787308148023287649">अर्को स्क्रिनमा प्रदर्शन गर्नुहोस्</translation> <translation id="7788298548579301890">तपाईंको कम्प्युटरमा भएको अर्को प्रोग्रामले Chrome ले कार्य गर्ने तरिकालाई परिवर्तन गर्न सक्ने एप थपेको छ। @@ -6787,6 +6790,7 @@ <translation id="8438566539970814960">खोज तथा ब्राउजिङलाई अझ राम्रो बनाउनुहोस्</translation> <translation id="8439506636278576865">यस भाषामा पृष्ठहरू अनुवाद प्रस्ताव गर्नुहोस्</translation> <translation id="8440630305826533614">Linux का एपहरू</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> ट्याबमा जानुहोस्</translation> <translation id="8446884382197647889">थप जान्नुहोस्</translation> <translation id="8447409163267621480">Ctrl वा Alt कुञ्जी समावेश गर्नुहोस्</translation> <translation id="8448729345478502352">तपाईंको स्क्रिनमा भएका वस्तुहरूलाई अझ ठुलो वा सानो पार्नुहोस्</translation> @@ -7448,6 +7452,7 @@ <translation id="9148058034647219655">बाहिर निस्कनुहोस्</translation> <translation id="9148126808321036104">पुन: साइन इन गर्नुहोस्</translation> <translation id="9148963623915467028">यो साइटले तपाईंको स्थानसम्बन्धी जानकारी प्रयोग गर्न सक्छ।</translation> +<translation id="9149529198050266366">अँध्यारो मोड सूर्योदयको बेला स्वतः अफ हुने छ</translation> <translation id="9149866541089851383">सम्पादन गर्नुहोस्...</translation> <translation id="9150045010208374699">तपाइँको क्यामेरा प्रयोग गर्नुहोस्</translation> <translation id="9150079578948279438">प्रोफाइल हटाउन सकिएन। कृपया फेरि प्रयास गर्नुहोस् वा प्राविधिक सहायता प्राप्त गर्न आफ्नो मोबाइल सेवा प्रदायकमा सम्पर्क गर्नुहोस्।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 80302b2..7632176 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Bluetooth-apparaat ontkoppelen</translation> <translation id="1651008383952180276">Je moet twee keer dezelfde wachtwoordzin opgeven</translation> <translation id="1652326691684645429">Dichtbij delen aanzetten</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Voeg de printer toe aan Google Cloudprinter zodat je overal kunt afdrukken.}other{Voeg # printers toe aan Google Cloudprinter zodat je overal kunt afdrukken.}}</translation> <translation id="1653631694606464309">Web-apps vragen gewoonlijk of bepaalde typen bestanden mogen worden geopend, zodat je waar je wilt aan die bestanden kunt werken (zoals documenten openen in je favoriete tekstverwerker)</translation> <translation id="1656528038316521561">Ondoorzichtigheid van achtergrond</translation> <translation id="1657406563541664238">Help <ph name="PRODUCT_NAME" /> beter te maken door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden</translation> @@ -2672,7 +2671,7 @@ <translation id="3855676282923585394">Bookmarks en instellingen importeren...</translation> <translation id="3856096718352044181">Controleer of dit een geldige provider is of probeer het later opnieuw</translation> <translation id="3856800405688283469">Tijdzone selecteren</translation> -<translation id="3857807444929313943">Til je vinger op en plaats deze opnieuw op de sensor</translation> +<translation id="3857807444929313943">Raak de sensor opnieuw aan</translation> <translation id="3861638017150647085">De gebruikersnaam '<ph name="USERNAME" />' is niet beschikbaar</translation> <translation id="3861977424605124250">Tonen bij opstarten</translation> <translation id="386239283124269513">G&roep herstellen</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Je gebruikt een niet-ondersteunde omgevingsvariabele: <ph name="BAD_VAR" />. Dit heeft negatieve gevolgen voor de stabiliteit en beveiliging.</translation> <translation id="4095264805865317199">UI voor mobiele activering openen</translation> <translation id="4095507791297118304">Primair scherm</translation> -<translation id="409579654357498729">Toevoegen aan Cloudprinter</translation> <translation id="4096508467498758490">Extensies van ontwikkelaarsmodus uitzetten</translation> <translation id="4097406557126260163">Apps en extensies</translation> <translation id="409742781329613461">Tips voor Chrome</translation> @@ -4819,7 +4817,6 @@ <ph name="DOMAIN" /> vereist dat je smartcard geplaatst blijft.</translation> <translation id="628352644014831790">4 seconden</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> wordt niet vaak gedownload en kan gevaarlijk zijn.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nieuwe printer in je netwerk}other{Nieuwe printers in je netwerk}}</translation> <translation id="6285770818046456882">Het apparaat dat met je deelt, heeft de overdracht geannuleerd</translation> <translation id="6290613030083731160">Geen beschikbare apparaten die delen in de buurt. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Activeringscode verifiëren. Dit kan een paar minuten duren.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 4320209..a8d3acc 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Koble fra Bluetooth-enheten</translation> <translation id="1651008383952180276">Du må skrive inn den samme passordfrasen to ganger</translation> <translation id="1652326691684645429">Slå på nærdeling</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Legg til skriveren i Google Cloud Print, slik at du kan skrive ut fra hvor som helst.}other{Legg til # skrivere i Google Cloud Print, slik at du kan skrive ut fra hvor som helst.}}</translation> <translation id="1653631694606464309">Nettprogrammer pleier å be om å få åpne visse typer filer slik at du kan jobbe med disse filene hvor du vil, for eksempel ved å åpne dokumenter i tekstbehandlingsprogrammet du foretrekker</translation> <translation id="1656528038316521561">Bakgrunnsopasitet</translation> <translation id="1657406563541664238">Bidra til å gjøre <ph name="PRODUCT_NAME" /> bedre ved å sende brukerstatistikk og programstopprapporter til Google automatisk</translation> @@ -2910,7 +2909,6 @@ <translation id="4094647278880271855">Du bruker en miljøvariabel som ikke støttes: <ph name="BAD_VAR" />. Stabiliteten og sikkerheten blir rammet.</translation> <translation id="4095264805865317199">Åpne UI for aktivering med mobiltelefon</translation> <translation id="4095507791297118304">Hovedskjerm</translation> -<translation id="409579654357498729">Legg til Cloud Print</translation> <translation id="4096508467498758490">Deaktiver utvidelser for utviklermodus</translation> <translation id="4097406557126260163">Apper og utvidelser</translation> <translation id="409742781329613461">Tips for Chrome</translation> @@ -4386,6 +4384,7 @@ <translation id="5794700615121138172">Delte mapper i Linux</translation> <translation id="5794786537412027208">Avslutt alle Chrome-apper</translation> <translation id="5797070761912323120">Google kan bruke loggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation> +<translation id="5797521893972859201">Tømmer loggen, inkludert loggen i søkefeltet</translation> <translation id="5798079537501238810">Nettsteder kan installere betalingsbehandlere</translation> <translation id="579907812742603813">beskyttet innhold</translation> <translation id="579915268381781820">Sikkerhetsnøkkelen er fjernet.</translation> @@ -4469,6 +4468,7 @@ <translation id="5900302528761731119">Google-profilbilde</translation> <translation id="590036993063074298">Detaljer om speilingskvalitet</translation> <translation id="5901069264981746702">Fingeravtrykksdataene lagres sikkert og sendes aldri fra <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Bytt til fanen som tar opp</translation> <translation id="5901494423252125310">Skriverdekselet er åpent</translation> <translation id="5901630391730855834">Gul</translation> <translation id="5904614460720589786">Kunne ikke konfigurere <ph name="APP_NAME" /> på grunn av et konfigurasjonsproblem. Kontakt administratoren din. Feilkode: <ph name="ERROR_CODE" />.</translation> @@ -4741,6 +4741,7 @@ <translation id="6196854373336333322">Utvidelsen «<ph name="EXTENSION_NAME" />» har tatt kontroll over proxy-tjenerinnstillingene dine, noe som betyr at den kan endre, ødelegge eller spionere på alt du foretar deg på nettet. Hvis du ikke er sikker på hvorfor denne endringen fant sted, vil du mest sannsynlig ikke ha den.</translation> <translation id="6198102561359457428">Logg deg av og på igjen</translation> <translation id="6198252989419008588">Endre personlig kode</translation> +<translation id="6200047250927636406">Forkast filen</translation> <translation id="6202304368170870640">Du kan bruke PIN-koden til å logge på eller låse opp enheten.</translation> <translation id="6206311232642889873">&Kopier bilde</translation> <translation id="6207200176136643843">Tilbakestill til standard zoomnivå</translation> @@ -4826,7 +4827,6 @@ <ph name="DOMAIN" /> krever at smartkortet blir stående i.</translation> <translation id="628352644014831790">4 sekunder</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> lastes sjelden ned og kan være farlig.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny skriver på nettverket}other{Nye skrivere på nettverket}}</translation> <translation id="6285770818046456882">Enheten som deler med deg, avbrøt overføringen</translation> <translation id="6290613030083731160">Ingen tilgjengelige enheter i nærheten deler. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Bekrefter aktiveringskoden. Dette kan ta noen minutter.</translation> @@ -5309,6 +5309,7 @@ <translation id="6831043979455480757">Oversett</translation> <translation id="6833479554815567477">Fanen er fjernet fra gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Bytt til en smart og sikker nettleser</translation> +<translation id="6834652994408928492">Mørk modus blir slått på automatisk ved solnedgang</translation> <translation id="683540480453879381">åpne <ph name="FILE_EXTENSIONS" />-filer</translation> <translation id="6835762382653651563">Koble til Internett for å oppdatere <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Spør når nettsteder vil åpne og plassere vinduer på skjermene dine (anbefales)</translation> @@ -6021,6 +6022,7 @@ <translation id="7622114377921274169">Lader.</translation> <translation id="7622768823216805500">Nettsteder installerer vanligvis betalingsbehandlere for å kunne tilby shoppingfunksjoner, som enklere betaling</translation> <translation id="7622903810087708234">Passorddetaljer</translation> +<translation id="7622966771025050155">Bytt til fanen som tas opp</translation> <translation id="7624337243375417909">capslock er av</translation> <translation id="7625568159987162309">Se tillatelser og data lagret på alle nettsteder</translation> <translation id="7628201176665550262">Oppdateringsfrekvens</translation> @@ -6187,6 +6189,7 @@ <translation id="7784067724422331729">Sikkerhetsinnstillingene på datamaskinen din blokkerte denne filen.</translation> <translation id="7784796923038949829">Kan ikke lese eller endre data på nettstedet</translation> <translation id="778480864305029524">For å bruke umiddelbar internettdeling, slå på varsler for Google Play Tjenester.</translation> +<translation id="7785471469930192436">Se eventuelt instruksjonene fra søkemotoren din om hvordan du sletter søkeloggen</translation> <translation id="7786889348652477777">&Last inn appen på nytt</translation> <translation id="7787308148023287649">Vis på en annen skjerm</translation> <translation id="7788298548579301890">Et annet program på datamaskinen har lagt til en app som kan endre måten Chrome fungerer på. @@ -6798,6 +6801,7 @@ <translation id="8438566539970814960">Gjør søking og surfing bedre</translation> <translation id="8439506636278576865">Tilby å oversette nettsider på dette språket</translation> <translation id="8440630305826533614">Linux-apper</translation> +<translation id="8446225304314102060">Bytt til fanen <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Les mer</translation> <translation id="8447409163267621480">Inkluder enten Ctrl eller Alt</translation> <translation id="8448729345478502352">Gjør elementer på skjermen mindre eller større.</translation> @@ -7459,6 +7463,7 @@ <translation id="9148058034647219655">Avslutt</translation> <translation id="9148126808321036104">Logg på igjen</translation> <translation id="9148963623915467028">Dette nettstedet har tilgang til posisjonen din.</translation> +<translation id="9149529198050266366">Mørk modus blir slått av automatisk ved soloppgang</translation> <translation id="9149866541089851383">Endre</translation> <translation id="9150045010208374699">bruke kameraet ditt</translation> <translation id="9150079578948279438">Kunne ikke fjerne profilen. Prøv på nytt, eller kontakt operatøren for å få teknisk støtte.</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 2233742..66f8908a 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -612,7 +612,6 @@ <translation id="164936512206786300">ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍ ଅନପେୟାର୍ କରନ୍ତୁ</translation> <translation id="1651008383952180276">ଆପଣ ସେହି ଏକା ପାସ୍ଫ୍ରେଜ୍ ଦୁଇଥର ଲେଖିବା ଆବଶ୍ୟକ</translation> <translation id="1652326691684645429">Nearby Share ସକ୍ଷମ କରନ୍ତୁ</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{'Google କ୍ଲାଉଡ୍ ପ୍ରିଣ୍ଟ'ରେ ପ୍ରିଣ୍ଟର୍ଟିକୁ ଯୋଗ କରନ୍ତୁ ଯାହାଫଳରେ ଆପଣ ଯେକୌଣସି ସ୍ଥାନରୁ ପ୍ରିଣ୍ଟ କରିପାରିବେ।}other{'Google କ୍ଲାଉଡ୍ ପ୍ରିଣ୍ଟ'ରେ #ଟି ପ୍ରିଣ୍ଟର୍କୁ ଯୋଗ କରନ୍ତୁ ଯାହାଫଳରେ ଆପଣ ଯେକୌଣସି ସ୍ଥାନରୁ ପ୍ରିଣ୍ଟ କରିପାରିବେ।}}</translation> <translation id="1653631694606464309">ୱେବ୍ ଆପଗୁଡ଼ିକ ସାଧାରଣତଃ ନିର୍ଦ୍ଦିଷ୍ଟ ପ୍ରକାରର ଫାଇଲ୍ ଖୋଲିବାକୁ ପଚାରେ ଯାହା ଫଳରେ ଆପଣ ଆପଣଙ୍କ ପସନ୍ଦର ୱାର୍ଡ ପ୍ରୋସେସରରେ ଡକ୍ୟୁମେଣ୍ଟ ଖୋଲିବା ପରି ଆପଣ ଯେଉଁଠାରେ ଚାହିଁବେ ସେଠାରେ ସେହି ଫାଇଲଗୁଡ଼ିକରେ କାମ କରିପାରିବେ</translation> <translation id="1656528038316521561">ପୃଷ୍ଠପଟ ଅସ୍ପଷ୍ଟତା</translation> <translation id="1657406563541664238">Googleକୁ ବ୍ୟବହାରର ସାଂଖ୍ୟିକ ତଥ୍ୟ ଓ କ୍ରାସ୍ ରିପୋର୍ଟ ସ୍ୱଚାଳିତ ଭାବେ ପଠାଇ <ph name="PRODUCT_NAME" />କୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">ଆପଣ ଏକ ଅଣସମର୍ଥିତ ପରିବେଶ ଭିନ୍ନତା ବ୍ୟବହାର କରୁଛନ୍ତି: <ph name="BAD_VAR" />। ସ୍ଥିରତା ଏବଂ ସୁରକ୍ଷାରେ ଅସୁବିଧା ହେବ।</translation> <translation id="4095264805865317199">ସେଲ୍ୟୁଲାର୍ ସକ୍ରିୟକରଣ UI ଖୋଲନ୍ତୁ</translation> <translation id="4095507791297118304">ପ୍ରାଥମିକ ଡିସ୍ପ୍ଲେ</translation> -<translation id="409579654357498729">କ୍ଲାଉଡ୍ ପ୍ରିଣ୍ଟରେ ଯୋଗ କରନ୍ତୁ</translation> <translation id="4096508467498758490">ଡେଭଲପର୍ ମୋଡ୍ର ଏକ୍ସଟେନ୍ସନ୍ ଅକ୍ଷମ କରନ୍ତୁ</translation> <translation id="4097406557126260163">ଆପ୍ ଏବଂ ଏକ୍ସଟେନସନଗୁଡ଼ିକ</translation> <translation id="409742781329613461">Chrome ପାଇଁ ପରାମର୍ଶ</translation> @@ -4817,7 +4815,6 @@ <ph name="DOMAIN" /> ପାଇଁ ଆପଣ ଆପଣଙ୍କ ସ୍ମାର୍ଟ କାର୍ଡକୁ ଇନସାର୍ଟ କରି ରଖିବା ଆବଶ୍ୟକ।</translation> <translation id="628352644014831790">4 ସେକେଣ୍ଡ</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ସାଧାରଣତଃ ଡାଉନ୍ଲୋଡ୍ କରାଯାଏ ନାହିଁ ଏବଂ ଏହା ହୁଏତ ବିପଜ୍ଜନକ ହୋଇଥାଇପାରେ।</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ଆପଣଙ୍କ ନେଟ୍ୱାର୍କରେ ନୂତନ ପ୍ରିଣ୍ଟର୍}other{ଆପଣଙ୍କ ନେଟ୍ୱାର୍କରେ ନୂତନ ପ୍ରିଣ୍ଟର୍ଗୁଡ଼ିକ}}</translation> <translation id="6285770818046456882">ଆପଣଙ୍କ ସହ ସେୟାର୍ କରାଯାଇଥିବା ଡିଭାଇସଟି ସ୍ଥାନାନ୍ତରକୁ ବାତିଲ୍ କରିଛି</translation> <translation id="6290613030083731160">ଆଖପାଖର କୌଣସି ସେୟାର୍ କରୁଥିବା ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="6291086328725007688">ସକ୍ରିୟକରଣ କୋଡକୁ ଯାଞ୍ଚ କରାଯାଉଛି। ଏଥିପାଇଁ କିଛି ସମୟ ଲାଗିପାରେ।</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 4ab7f76..5d0b68c 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਦਾ ਜੋੜਾਬੱਧ ਹਟਾਓ</translation> <translation id="1651008383952180276">ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੱਕੋ ਪਾਸਫਰੇਜ਼ ਦੋ ਵਾਰ ਦਾਖਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</translation> <translation id="1652326691684645429">ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਚਾਲੂ ਕਰੋ</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{'Google ਕਲਾਊਡ ਪ੍ਰਿੰਟ' ਵਿੱਚ ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਕਰੋ ਤਾਂ ਜੋ ਤੁਸੀਂ ਕਿਤੋਂ ਵੀ ਪ੍ਰਿੰਟ ਕਰ ਸਕੋ।}one{'Google ਕਲਾਊਡ ਪ੍ਰਿੰਟ' ਵਿੱਚ # ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਕਰੋ ਤਾਂ ਜੋ ਤੁਸੀਂ ਕਿਤੋਂ ਵੀ ਪ੍ਰਿੰਟ ਕਰ ਸਕੋ।}other{'Google ਕਲਾਊਡ ਪ੍ਰਿੰਟ' ਵਿੱਚ # ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਕਰੋ ਤਾਂ ਜੋ ਤੁਸੀਂ ਕਿਤੋਂ ਵੀ ਪ੍ਰਿੰਟ ਕਰ ਸਕੋ।}}</translation> <translation id="1653631694606464309">ਆਮ ਤੌਰ 'ਤੇ ਵੈੱਬ ਐਪਾਂ ਕੁਝ ਖਾਸ ਕਿਸਮਾਂ ਦੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ ਤਾਂ ਜੋ ਤੁਸੀਂ ਉਹਨਾਂ ਫ਼ਾਈਲਾਂ 'ਤੇ ਉੱਥੇ ਕੰਮ ਕਰ ਸਕੋ ਜਿੱਥੇ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ, ਜਿਵੇਂ ਕਿ ਆਪਣੇ ਤਰਜੀਹੀ ਵਰਡ ਪ੍ਰੋਸੈੱਸਰ ਵਿੱਚ ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਖੋਲ੍ਹਣਾ</translation> <translation id="1656528038316521561">ਬੈਕਗ੍ਰਾਊਂਡ ਅਪਾਰਦਰਸ਼ਤਾ</translation> <translation id="1657406563541664238">Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਵਰਤੋਂ ਅੰਕੜੇ ਅਤੇ ਕ੍ਰੈਸ਼ ਰਿਪੋਰਟਾਂ ਭੇਜ ਕੇ <ph name="PRODUCT_NAME" /> ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">ਤੁਸੀਂ ਅਸਮਰਥਿਤ ਵਾਤਾਵਰਨ ਵੇਰੀਏਬਲ ਵਰਤ ਰਹੇ ਹੋ: <ph name="BAD_VAR" />. ਸਥਿਰਤਾ ਅਤੇ ਸੁਰੱਖਿਆ 'ਤੇ ਮਾੜਾ ਅਸਰ ਪਵੇਗਾ।</translation> <translation id="4095264805865317199">ਸੈਲਿਊਲਰ ਕਿਰਿਆਸ਼ੀਲਤਾ UI ਖੋਲ੍ਹੋ</translation> <translation id="4095507791297118304">ਪ੍ਰਾਇਮਰੀ ਡਿਸਪਲੇ</translation> -<translation id="409579654357498729">'ਕਲਾਊਟ ਪ੍ਰਿੰਟ' ਵਿੱਚ ਸਾਮਲ ਕਰੋ</translation> <translation id="4096508467498758490">ਵਿਕਾਸਕਾਰ ਮੋਡ ਐਕਸਟੈਂਸ਼ਨ ਬੰਦ ਕਰੋ</translation> <translation id="4097406557126260163">ਐਪਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ</translation> <translation id="409742781329613461">Chrome ਲਈ ਨੁਕਤੇ</translation> @@ -4835,7 +4833,6 @@ <ph name="DOMAIN" /> ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਸਮਾਰਟ ਕਾਰਡ ਪਾਈ ਰੱਖਣ ਦੀ ਲੋੜ ਹੈ।</translation> <translation id="628352644014831790">4 ਸਕਿੰਟ</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ਆਮ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ ਅਤੇ ਇਹ ਹਾਨੀਕਾਰਕ ਹੋ ਸਕਦੀ ਹੈ।</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ਤੁਹਾਡੇ ਨੈਟਵਰਕ ਤੇ ਨਵਾਂ ਪ੍ਰਿੰਟਰ}one{ਤੁਹਾਡੇ ਨੈਟਵਰਕ ਤੇ ਨਵੇਂ ਪ੍ਰਿੰਟਰ}other{ਤੁਹਾਡੇ ਨੈਟਵਰਕ ਤੇ ਨਵੇਂ ਪ੍ਰਿੰਟਰ}}</translation> <translation id="6285770818046456882">ਤੁਹਾਡੇ ਨਾਲ ਡੀਵਾਈਸ ਸਾਂਝਾਕਰਨ ਨੇ ਟ੍ਰਾਂਸਫ਼ਰ ਰੱਦ ਕੀਤਾ</translation> <translation id="6290613030083731160">ਕੋਈ ਨਜ਼ਦੀਕੀ ਸਾਂਝਾਕਰਨ ਡੀਵਾਈਸ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="6291086328725007688">ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਇਸ ਵਿੱਚ ਕੁਝ ਮਿੰਟ ਲੱਗ ਸਕਦੇ ਹਨ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 69b4d71..ec53e2f 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Rozparowywanie urządzenia Bluetooth</translation> <translation id="1651008383952180276">Musisz dwukrotnie wpisać to samo hasło</translation> <translation id="1652326691684645429">Włącz Udostępnianie w pobliżu</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Dodaj drukarkę do Google Cloud Print, by móc drukować z dowolnego miejsca.}few{Dodaj # drukarki do Google Cloud Print, by móc drukować z dowolnego miejsca.}many{Dodaj # drukarek do Google Cloud Print, by móc drukować z dowolnego miejsca.}other{Dodaj # drukarki do Google Cloud Print, by móc drukować z dowolnego miejsca.}}</translation> <translation id="1653631694606464309">Aplikacje internetowe zwykle proszą o zezwolenie na otwieranie określonych typów plików (np. dokumentów w ulubionym edytorze tekstu), aby umożliwić Ci pracę z plikami tam, gdzie chcesz</translation> <translation id="1656528038316521561">Przezroczystość tła</translation> <translation id="1657406563541664238">Pomóż ulepszyć <ph name="PRODUCT_NAME" />, przesyłając do Google statystyki użytkowania i raporty o awariach</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">Korzystasz z nieobsługiwanej zmiennej środowiskowej: <ph name="BAD_VAR" />. Ma to negatywny wpływ na stabilność i zabezpieczenia.</translation> <translation id="4095264805865317199">Otwórz interfejs aktywacji sieci komórkowej</translation> <translation id="4095507791297118304">Ekran główny</translation> -<translation id="409579654357498729">Dodaj do Cloud Print</translation> <translation id="4096508467498758490">Wyłącz rozszerzenia trybu dewelopera</translation> <translation id="4097406557126260163">Aplikacje i rozszerzenia</translation> <translation id="409742781329613461">Wskazówki dotyczące Chrome</translation> @@ -4376,6 +4374,7 @@ <translation id="5794700615121138172">Foldery udostępnione Linuksa</translation> <translation id="5794786537412027208">Zamknij wszystkie aplikacje Chrome</translation> <translation id="5797070761912323120">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania, reklamy i działanie innych usług</translation> +<translation id="5797521893972859201">Usuwa historię, również z pola wyszukiwania</translation> <translation id="5798079537501238810">Strony mogą instalować moduły do obsługi płatności</translation> <translation id="579907812742603813">treść chroniona</translation> <translation id="579915268381781820">Klucz bezpieczeństwa został odłączony.</translation> @@ -4459,6 +4458,7 @@ <translation id="5900302528761731119">Zdjęcie z profilu Google</translation> <translation id="590036993063074298">Ocena jakości funkcji odbicia lustrzanego</translation> <translation id="5901069264981746702">Odcisk palca jest przechowywany w bezpieczny sposób i jest dostępny tylko na Twoim urządzeniu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Przełącz na przechwytywanie karty</translation> <translation id="5901494423252125310">Otwarte drzwiczki drukarki</translation> <translation id="5901630391730855834">Żółty</translation> <translation id="5904614460720589786">Z powodu błędu konfiguracji nie udało się skonfigurować <ph name="APP_NAME" />. Skontaktuj się z administratorem. Kod błędu: <ph name="ERROR_CODE" />.</translation> @@ -4731,6 +4731,7 @@ <translation id="6196854373336333322">Rozszerzenie „<ph name="EXTENSION_NAME" />” przejęło kontrolę nad ustawieniami serwera proxy, co oznacza, że może zmieniać, przerywać lub podglądać wszystko, co robisz online. Jeśli nie masz pewności, skąd wzięła się ta zmiana, prawdopodobnie jej nie chcesz.</translation> <translation id="6198102561359457428">Wyloguj się i ponownie zaloguj</translation> <translation id="6198252989419008588">Zmień kod PIN</translation> +<translation id="6200047250927636406">Odrzuć plik</translation> <translation id="6202304368170870640">Kodu PIN możesz używać do logowania się lub do odblokowywania urządzenia.</translation> <translation id="6206311232642889873">Kop&iuj grafikę</translation> <translation id="6207200176136643843">Przywróć domyślny poziom powiększenia</translation> @@ -4816,7 +4817,6 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieździe.</translation> <translation id="628352644014831790">4 s</translation> <translation id="6285120108426285413">Plik <ph name="FILE_NAME" /> jest rzadko pobierany i może być niebezpieczny.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nowa drukarka w Twojej sieci}few{Nowe drukarki w Twojej sieci}many{Nowe drukarki w Twojej sieci}other{Nowe drukarki w Twojej sieci}}</translation> <translation id="6285770818046456882">Urządzenie udostępniające Ci dane anulowało przesyłanie</translation> <translation id="6290613030083731160">W pobliżu nie ma dostępnych urządzeń udostępniających dane. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Sprawdzam kod aktywacyjny. Może to potrwać kilka minut.</translation> @@ -5296,6 +5296,7 @@ <translation id="6831043979455480757">Tłumacz</translation> <translation id="6833479554815567477">Karta została usunięta z grupy <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Przejdź na inteligentną i bezpieczną przeglądarkę</translation> +<translation id="6834652994408928492">Tryb ciemny włączy się automatycznie o zachodzie słońca</translation> <translation id="683540480453879381">Otwierać pliki <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Aby zaktualizować urządzenie <ph name="DEVICE_TYPE" />, połącz się z internetem.</translation> <translation id="6838034009068684089">Pytaj, gdy strona chce otwierać i umieszczać okna na Twoich ekranach (zalecane)</translation> @@ -6008,6 +6009,7 @@ <translation id="7622114377921274169">Ładuję.</translation> <translation id="7622768823216805500">Strony zwykle instalują moduły obsługi płatności na przykład w celu ułatwienia płatności za zakupy</translation> <translation id="7622903810087708234">Szczegóły haseł</translation> +<translation id="7622966771025050155">Przełącz na przechwyconą kartę</translation> <translation id="7624337243375417909">caps lock wyłączony</translation> <translation id="7625568159987162309">Pokaż uprawnienia i zapisane dane wszystkich witryn</translation> <translation id="7628201176665550262">Częstotliwość odświeżania</translation> @@ -6174,6 +6176,7 @@ <translation id="7784067724422331729">Ustawienia zabezpieczeń na komputerze zablokowały ten plik.</translation> <translation id="7784796923038949829">Nie udało się odczytać ani zmienić danych strony internetowej</translation> <translation id="778480864305029524">Aby używać funkcji Instant Tethering, włącz powiadomienia dla Usług Google Play.</translation> +<translation id="7785471469930192436">Jeśli chcesz usunąć historię wyszukiwania, zapoznaj się z instrukcjami wyszukiwarki</translation> <translation id="7786889348652477777">P&rzeładuj aplikację</translation> <translation id="7787308148023287649">Wyświetl na innym ekranie</translation> <translation id="7788298548579301890">Inny program na Twoim komputerze dodał aplikację, która może zmieniać sposób działania Chrome. @@ -6786,6 +6789,7 @@ <translation id="8438566539970814960">Ulepsz wyszukiwanie i przeglądanie</translation> <translation id="8439506636278576865">Proponuj tłumaczenie stron w tym języku</translation> <translation id="8440630305826533614">Aplikacje na Linuksa</translation> +<translation id="8446225304314102060">Przełącz na kartę <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Więcej informacji</translation> <translation id="8447409163267621480">Uwzględnij Ctrl lub Alt</translation> <translation id="8448729345478502352">Powiększ lub pomniejsz elementy na ekranie</translation> @@ -7449,6 +7453,7 @@ <translation id="9148058034647219655">Zakończ</translation> <translation id="9148126808321036104">Zaloguj się ponownie</translation> <translation id="9148963623915467028">Ta strona ma dostęp do Twojej lokalizacji.</translation> +<translation id="9149529198050266366">Tryb ciemny wyłączy się automatycznie o wschodzie słońca</translation> <translation id="9149866541089851383">Edytuj...</translation> <translation id="9150045010208374699">Korzystanie z Twojej kamery</translation> <translation id="9150079578948279438">Nie udało się usunąć profilu. Spróbuj jeszcze raz lub skontaktuj się z operatorem, aby uzyskać pomoc techniczną.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 2bc4f67..2c97b4f 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -617,7 +617,6 @@ <translation id="164936512206786300">Desparear dispositivo Bluetooth</translation> <translation id="1651008383952180276">Informe a mesma senha longa duas vezes</translation> <translation id="1652326691684645429">Ativar o "Compartilhar por proximidade"</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Adicionar a impressora ao Google Cloud Print para poder imprimir de qualquer lugar.}one{Adicionar # impressoras ao Google Cloud Print para poder imprimir de qualquer lugar.}other{Adicionar # impressoras ao Google Cloud Print para poder imprimir de qualquer lugar.}}</translation> <translation id="1653631694606464309">Normalmente, os apps da Web pedem para abrir tipos de arquivo específicos para que você possa trabalhar com eles onde quiser. Por exemplo, você pode abrir documentos no processador de texto da sua preferência</translation> <translation id="1656528038316521561">Opacidade do plano de fundo</translation> <translation id="1657406563541664238">Ajudar a tornar o <ph name="PRODUCT_NAME" /> melhor enviando automaticamente estatísticas de uso e relatórios de problemas ao Google.</translation> @@ -2920,7 +2919,6 @@ <translation id="4094647278880271855">Você está usando uma variável de ambiente não compatível: <ph name="BAD_VAR" />. Isso causará problemas de estabilidade e segurança.</translation> <translation id="4095264805865317199">Abrir IU de ativação da rede celular</translation> <translation id="4095507791297118304">Tela principal</translation> -<translation id="409579654357498729">Adicionar ao Google Cloud Print</translation> <translation id="4096508467498758490">Desativar extensões no modo de desenvolvedor</translation> <translation id="4097406557126260163">Apps e extensões</translation> <translation id="409742781329613461">Dicas para o Chrome</translation> @@ -4398,6 +4396,7 @@ <translation id="5794700615121138172">Pastas compartilhadas do Linux</translation> <translation id="5794786537412027208">Sair de todos os aplicativos do Google Chrome</translation> <translation id="5797070761912323120">O histórico será usado para personalizar a Pesquisa, anúncios e outros serviços Google.</translation> +<translation id="5797521893972859201">Limpa o histórico, inclusive da caixa de pesquisa</translation> <translation id="5798079537501238810">Os sites podem instalar gerenciadores de pagamento</translation> <translation id="579907812742603813">conteúdo protegido</translation> <translation id="579915268381781820">Sua chave de segurança foi removida.</translation> @@ -4481,6 +4480,7 @@ <translation id="5900302528761731119">Foto do perfil do Google</translation> <translation id="590036993063074298">Detalhes da qualidade do espelhamento</translation> <translation id="5901069264981746702">Seus dados de impressão digital são armazenados de forma segura e nunca saem do <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Alternar para a guia que será capturada</translation> <translation id="5901494423252125310">A porta da impressora está aberta</translation> <translation id="5901630391730855834">Amarelo</translation> <translation id="5904614460720589786">Não foi possível definir o app <ph name="APP_NAME" /> devido a um problema de configuração. Entre em contato com o administrador. Código do erro: <ph name="ERROR_CODE" />.</translation> @@ -4753,6 +4753,7 @@ <translation id="6196854373336333322">A extensão "<ph name="EXTENSION_NAME" />" assumiu o controle das suas configurações de proxy, o que significa que ela pode alterar, invadir ou escutar qualquer coisa que você fizer on-line. Se você não tiver certeza do motivo dessa alteração, provavelmente não a deseja.</translation> <translation id="6198102561359457428">Saia e faça login novamente...</translation> <translation id="6198252989419008588">Alterar PIN</translation> +<translation id="6200047250927636406">Descartar arquivo</translation> <translation id="6202304368170870640">Use seu PIN para fazer login ou desbloquear seu dispositivo.</translation> <translation id="6206311232642889873">&Copiar imagem</translation> <translation id="6207200176136643843">Redefinir para o nível de zoom padrão</translation> @@ -4838,7 +4839,6 @@ <ph name="DOMAIN" /> requer que você mantenha o cartão inteligente inserido.</translation> <translation id="628352644014831790">4 segundos</translation> <translation id="6285120108426285413">O arquivo <ph name="FILE_NAME" /> não costuma ser transferido por download e pode ser perigoso.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nova impressora na sua rede}one{Novas impressoras na sua rede}other{Novas impressoras na sua rede}}</translation> <translation id="6285770818046456882">O dispositivo que estava fazendo o compartilhamento cancelou a transferência</translation> <translation id="6290613030083731160">Não há dispositivos disponíveis por perto. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verificando o código de ativação. Isso pode levar alguns minutos.</translation> @@ -5321,6 +5321,7 @@ <translation id="6831043979455480757">Traduzir</translation> <translation id="6833479554815567477">A guia foi removida do grupo <ph name="GROUP_NAME" />: <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Mudar para um navegador inteligente e seguro</translation> +<translation id="6834652994408928492">O modo escuro será ativado automaticamente ao pôr do sol</translation> <translation id="683540480453879381">Abrir arquivos <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Conecte-se à Internet para atualizar seu <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Perguntar quando um site quiser abrir e posicionar janelas nas suas telas (recomendado)</translation> @@ -6033,6 +6034,7 @@ <translation id="7622114377921274169">Carregando.</translation> <translation id="7622768823216805500">Os sites geralmente instalam gerenciadores de pagamento para recursos de compras, como finalizações de compra facilitadas</translation> <translation id="7622903810087708234">Detalhes da senha</translation> +<translation id="7622966771025050155">Alternar para a guia capturada</translation> <translation id="7624337243375417909">tecla caps lock desativada</translation> <translation id="7625568159987162309">Ver permissões e dados armazenados em sites</translation> <translation id="7628201176665550262">Taxa de atualização</translation> @@ -6199,6 +6201,7 @@ <translation id="7784067724422331729">As configurações de segurança em seu computador bloquearam este arquivo.</translation> <translation id="7784796923038949829">Não é possível ler ou alterar dados do site</translation> <translation id="778480864305029524">Para usar o tethering instantâneo, ative as notificações para o Google Play Services.</translation> +<translation id="7785471469930192436">Veja as instruções do seu mecanismo de pesquisa para excluir o histórico de pesquisa, se aplicável</translation> <translation id="7786889348652477777">&Recarregar aplicativo</translation> <translation id="7787308148023287649">Exibir em outra tela</translation> <translation id="7788298548579301890">Outro programa no seu computador adicionou um app que pode alterar a forma como o Chrome funciona. @@ -6811,6 +6814,7 @@ <translation id="8438566539970814960">Melhorar as pesquisas e a navegação</translation> <translation id="8439506636278576865">Oferecer a tradução de páginas neste idioma</translation> <translation id="8440630305826533614">Aplicativos Linux</translation> +<translation id="8446225304314102060">Alternar para a guia <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Saiba mais</translation> <translation id="8447409163267621480">Incluir a tecla Ctrl ou Alt</translation> <translation id="8448729345478502352">Torne os itens na tela menores ou maiores</translation> @@ -7473,6 +7477,7 @@ <translation id="9148058034647219655">Sair</translation> <translation id="9148126808321036104">Faça login novamente</translation> <translation id="9148963623915467028">Este site pode acessar sua localização.</translation> +<translation id="9149529198050266366">O modo escuro será desativado automaticamente ao amanhecer</translation> <translation id="9149866541089851383">Editar...</translation> <translation id="9150045010208374699">Usar câmera</translation> <translation id="9150079578948279438">Não foi possível remover o perfil. Tente novamente ou entre em contato com a operadora para receber suporte técnico.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 32ada23..0c31039 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Dessincronizar dispositivo Bluetooth</translation> <translation id="1651008383952180276">Tem de introduzir a mesma frase de acesso duas vezes</translation> <translation id="1652326691684645429">Ativar a funcionalidade Partilhar na proximidade</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Adicione a impressora ao Google Cloud Print para poder imprimir em qualquer local.}other{Adicione # impressoras ao Google Cloud Print para poder imprimir em qualquer local.}}</translation> <translation id="1653631694606464309">Geralmente, as apps para a Web pedem para abrir determinados tipos de ficheiros para que possa trabalhar nesses ficheiros quando pretender, como abrir documentos no seu processador de texto favorito</translation> <translation id="1656528038316521561">Opacidade do fundo</translation> <translation id="1657406563541664238">Ajude a melhorar o <ph name="PRODUCT_NAME" /> enviando automaticamente estatísticas de utilização e relatórios de falhas para a Google</translation> @@ -2904,7 +2903,6 @@ <translation id="4094647278880271855">Está a utilizar uma variável de ambiente não suportada: <ph name="BAD_VAR" />. A estabilidade e a segurança serão afetadas.</translation> <translation id="4095264805865317199">Abrir IU de ativação de rede móvel</translation> <translation id="4095507791297118304">Ecrã principal</translation> -<translation id="409579654357498729">Adicionar ao Google Cloud Print</translation> <translation id="4096508467498758490">Desativar extensões de modo de programador</translation> <translation id="4097406557126260163">Apps e extensões</translation> <translation id="409742781329613461">Sugestões para o Chrome</translation> @@ -4381,6 +4379,7 @@ <translation id="5794700615121138172">Pastas partilhadas do Linux</translation> <translation id="5794786537412027208">Sair de todas as Apps do Chrome</translation> <translation id="5797070761912323120">A Google pode utilizar o seu histórico para personalizar a Pesquisa, os anúncios e outros serviços Google.</translation> +<translation id="5797521893972859201">Limpa o histórico, incluindo na caixa de pesquisa</translation> <translation id="5798079537501238810">Os sites podem instalar controladores de pagamentos</translation> <translation id="579907812742603813">conteúdo protegido</translation> <translation id="579915268381781820">A sua chave de segurança foi removida.</translation> @@ -4464,6 +4463,7 @@ <translation id="5900302528761731119">Fotografia do Perfil do Google</translation> <translation id="590036993063074298">Detalhes da qualidade do espelhamento</translation> <translation id="5901069264981746702">Os seus dados de impressões digitais são armazenados em segurança e nunca saem do <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Mudar para o separador a capturar</translation> <translation id="5901494423252125310">Porta da impressora aberta</translation> <translation id="5901630391730855834">Amarelo</translation> <translation id="5904614460720589786">Não foi possível configurar a app <ph name="APP_NAME" /> devido a um problema na configuração. Contacte o seu administrador. Código de erro: <ph name="ERROR_CODE" />.</translation> @@ -4736,6 +4736,7 @@ <translation id="6196854373336333322">A extensão "<ph name="EXTENSION_NAME" />" apoderou-se das suas definições de proxy, o que significa que pode alterar, interromper ou intercetar qualquer coisa que esteja a fazer online. Se não tem a certeza do motivo pelo qual aconteceu esta alteração, é provável que não a queira.</translation> <translation id="6198102561359457428">Terminar sessão e, em seguida, iniciar sessão novamente...</translation> <translation id="6198252989419008588">Alterar PIN</translation> +<translation id="6200047250927636406">Rejeitar ficheiro</translation> <translation id="6202304368170870640">Pode utilizar o PIN para iniciar sessão ou desbloquear o dispositivo.</translation> <translation id="6206311232642889873">Cop&iar Imagem</translation> <translation id="6207200176136643843">Repor o nível de zoom predefinido</translation> @@ -4821,7 +4822,6 @@ <ph name="DOMAIN" /> requer que mantenha o seu cartão inteligente inserido.</translation> <translation id="628352644014831790">4 segundos</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> não é habitualmente transferido e pode ser perigoso.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nova impressora na rede}other{Novas impressoras na rede}}</translation> <translation id="6285770818046456882">O dispositivo que estava a partilhar consigo cancelou a transferência.</translation> <translation id="6290613030083731160">Nenhum dispositivo disponível a partilhar nas proximidades. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="6291086328725007688">A validar o código de ativação. Esta ação pode demorar alguns minutos.</translation> @@ -5304,6 +5304,7 @@ <translation id="6831043979455480757">Traduzir</translation> <translation id="6833479554815567477">Separador removido do grupo <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Mude para um navegador inteligente e seguro</translation> +<translation id="6834652994408928492">O modo escuro ativa-se automaticamente ao pôr do sol</translation> <translation id="683540480453879381">Abrir ficheiros <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Ligue-se à Internet para atualizar o <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Perguntar quando um site pretender abrir e colocar janelas nos seus ecrãs (recomendado)</translation> @@ -6016,6 +6017,7 @@ <translation id="7622114377921274169">A carregar…</translation> <translation id="7622768823216805500">Normalmente, os sites instalam controladores de pagamentos para funcionalidades de compras como o pagamento mais fácil.</translation> <translation id="7622903810087708234">Detalhes da palavra-passe</translation> +<translation id="7622966771025050155">Mudar para o separador capturado</translation> <translation id="7624337243375417909">caps lock desligado</translation> <translation id="7625568159987162309">Ver autorizações e dados armazenados em sites</translation> <translation id="7628201176665550262">Taxa de atualização</translation> @@ -6182,6 +6184,7 @@ <translation id="7784067724422331729">As definições de segurança do computador bloquearam este ficheiro.</translation> <translation id="7784796923038949829">Não é possível ler nem alterar os dados do site.</translation> <translation id="778480864305029524">Para utilizar a Ligação via telemóvel instantânea, ative as notificações dos Serviços do Google Play</translation> +<translation id="7785471469930192436">Se aplicável, consulte as instruções do motor de pesquisa para eliminar o histórico de pesquisas</translation> <translation id="7786889348652477777">&Recarregar aplicação</translation> <translation id="7787308148023287649">Apresentar noutro ecrã</translation> <translation id="7788298548579301890">Outro programa no computador adicionou uma aplicação que pode alterar o funcionamento do Chrome. @@ -6794,6 +6797,7 @@ <translation id="8438566539970814960">Melhorar as pesquisas e a navegação</translation> <translation id="8439506636278576865">Oferecer para traduzir páginas neste idioma</translation> <translation id="8440630305826533614">Apps para Linux</translation> +<translation id="8446225304314102060">Mudar para o separador <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Saiba Mais</translation> <translation id="8447409163267621480">Inclua Ctrl ou Alt.</translation> <translation id="8448729345478502352">Diminuir ou aumentar os elementos no ecrã</translation> @@ -7455,6 +7459,7 @@ <translation id="9148058034647219655">Sair</translation> <translation id="9148126808321036104">Iniciar sessão novamente</translation> <translation id="9148963623915467028">Este site pode aceder à sua localização.</translation> +<translation id="9149529198050266366">O modo escuro desativa-se automaticamente ao nascer do sol</translation> <translation id="9149866541089851383">Editar...</translation> <translation id="9150045010208374699">Utilizar a sua câmara</translation> <translation id="9150079578948279438">Não foi possível remover o perfil. Tente novamente ou contacte o operador para obter apoio técnico.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 46c8f48..5cd4a7c 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -614,7 +614,6 @@ <translation id="164936512206786300">Anulează asocierea dispozitivului Bluetooth</translation> <translation id="1651008383952180276">Trebuie să introduci aceeași expresie de acces de două ori</translation> <translation id="1652326691684645429">Activează Trimiterea în apropiere</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Pentru a putea printa de oriunde, adaugă imprimanta în Google Cloud Print.}few{Pentru a putea printa de oriunde, adaugă cele # imprimante în Google Cloud Print.}other{Pentru a putea printa de oriunde, adaugă cele # de imprimante în Google Cloud Print.}}</translation> <translation id="1653631694606464309">Aplicațiile web solicită de obicei permisiunea de a deschide anumite tipuri de fișiere, ca să poți lucra în acestea oricând dorești, de exemplu, deschizând documente în procesorul de text preferat</translation> <translation id="1656528038316521561">Opacitatea fundalului</translation> <translation id="1657406563541664238">Trimite automat statistici de utilizare și rapoarte de blocare la Google pentru a contribui la îmbunătățirea <ph name="PRODUCT_NAME" />.</translation> @@ -2904,7 +2903,6 @@ <translation id="4094647278880271855">Folosești o variabilă de mediu neacceptată: <ph name="BAD_VAR" />. Stabilitatea și securitatea vor avea de suferit.</translation> <translation id="4095264805865317199">Deschide IU pentru activarea celulară</translation> <translation id="4095507791297118304">Afișare principală</translation> -<translation id="409579654357498729">Adăugați la Cloud Print</translation> <translation id="4096508467498758490">Dezactivați extensiile care rulează în modul pentru dezvoltatori</translation> <translation id="4097406557126260163">Aplicații și extensii</translation> <translation id="409742781329613461">Sfaturi pentru Chrome</translation> @@ -4380,6 +4378,7 @@ <translation id="5794700615121138172">Dosare comune în Linux</translation> <translation id="5794786537412027208">Ieși din toate aplicațiile Chrome</translation> <translation id="5797070761912323120">Google poate folosi istoricul pentru a personaliza Căutarea, anunțurile și alte servicii Google</translation> +<translation id="5797521893972859201">Șterge istoricul, inclusiv din caseta de căutare</translation> <translation id="5798079537501238810">Site-urile pot instala handlere pentru plăți</translation> <translation id="579907812742603813">Conținut protejat</translation> <translation id="579915268381781820">Cheia de securitate a fost eliminată.</translation> @@ -4463,6 +4462,7 @@ <translation id="5900302528761731119">Fotografie de profil Google</translation> <translation id="590036993063074298">Detalii privind calitatea oglindirii</translation> <translation id="5901069264981746702">Datele privind amprentele sunt stocate în siguranță și nu părăsesc niciodată dispozitivul <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Comută la capturarea filei</translation> <translation id="5901494423252125310">Capacul imprimantei este deschis</translation> <translation id="5901630391730855834">Galben</translation> <translation id="5904614460720589786"><ph name="APP_NAME" /> nu s-a instalat din cauza unei probleme de configurație. Contactează administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation> @@ -4735,6 +4735,7 @@ <translation id="6196854373336333322">Extensia „<ph name="EXTENSION_NAME" />” a preluat controlul asupra setărilor de proxy, ceea ce înseamnă că poate modifica, întrerupe sau intercepta tot ceea ce faci online. Dacă nu știi sigur de ce a apărut această modificare, probabil că nu ai aprobat-o.</translation> <translation id="6198102561359457428">Deconectați-vă, apoi conectați-vă din nou...</translation> <translation id="6198252989419008588">Schimbă codul PIN</translation> +<translation id="6200047250927636406">Șterge fișierul</translation> <translation id="6202304368170870640">Poți folosi codul PIN ca să te conectezi la dispozitiv sau să-l deblochezi.</translation> <translation id="6206311232642889873">Cop&iază imaginea</translation> <translation id="6207200176136643843">Resetează la nivelul de zoom prestabilit</translation> @@ -4820,7 +4821,6 @@ <ph name="DOMAIN" /> solicită să nu scoți cardul inteligent din dispozitiv.</translation> <translation id="628352644014831790">4 secunde</translation> <translation id="6285120108426285413">Fișierul <ph name="FILE_NAME" /> nu este descărcat de obicei și ar putea fi periculos.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Imprimantă nouă în rețea}few{Imprimante noi în rețea}other{Imprimante noi în rețea}}</translation> <translation id="6285770818046456882">Dispozitivul care îți trimitea fișiere a anulat transferul</translation> <translation id="6290613030083731160">Nu sunt disponibile dispozitive care trimit fișiere în apropiere. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Este verificat codul de activare. Poate dura câteva minute.</translation> @@ -5303,6 +5303,7 @@ <translation id="6831043979455480757">Tradu</translation> <translation id="6833479554815567477">Fila a fost eliminată din grupul <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Comută la un browser inteligent și securizat</translation> +<translation id="6834652994408928492">Modul întunecat se va activa automat la apus</translation> <translation id="683540480453879381">Să deschidă fișiere <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Accesează internetul pentru a actualiza dispozitivul <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Anunță-mă dacă un site vrea să deschidă și să plaseze ferestre în ecrane (recomandat)</translation> @@ -6015,6 +6016,7 @@ <translation id="7622114377921274169">Se încarcă.</translation> <translation id="7622768823216805500">Site-urile instalează de obicei handlere pentru plăți pentru opțiuni oferite la cumpărare, de exemplu, finalizarea mai simplă a achiziției</translation> <translation id="7622903810087708234">Detalii privind parola</translation> +<translation id="7622966771025050155">Comută la fila capturată</translation> <translation id="7624337243375417909">tasta Caps Lock este dezactivată</translation> <translation id="7625568159987162309">Vezi permisiunile și datele stocate pe toate site-urile</translation> <translation id="7628201176665550262">Rata de actualizare</translation> @@ -6181,6 +6183,7 @@ <translation id="7784067724422331729">Setările de securitate de pe computer au blocat acest fișier.</translation> <translation id="7784796923038949829">Nu se pot citi sau modifica datele site-ului</translation> <translation id="778480864305029524">Pentru a folosi Tetheringul instantaneu, activează notificările pentru serviciile Google Play.</translation> +<translation id="7785471469930192436">Vezi instrucțiunile motorului de căutare pentru ștergerea istoricului căutărilor, dacă este cazul</translation> <translation id="7786889348652477777">&Reîncarcă aplicația</translation> <translation id="7787308148023287649">Afișează pe alt ecran</translation> <translation id="7788298548579301890">Un alt program de pe computerul tău a adăugat o aplicație care poate schimba modul în care funcționează Chrome. @@ -6792,6 +6795,7 @@ <translation id="8438566539970814960">Îmbunătățește căutările și navigarea</translation> <translation id="8439506636278576865">Oferă-te să traduci paginile în această limbă</translation> <translation id="8440630305826533614">Aplicații Linux</translation> +<translation id="8446225304314102060">Comută la fila <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Află mai multe</translation> <translation id="8447409163267621480">Include Ctrl sau Alt</translation> <translation id="8448729345478502352">Micșorează sau mărește elementele de pe ecran</translation> @@ -7453,6 +7457,7 @@ <translation id="9148058034647219655">Ieși</translation> <translation id="9148126808321036104">Conectează-te din nou</translation> <translation id="9148963623915467028">Acest site îți poate accesa locația.</translation> +<translation id="9149529198050266366">Modul întunecat se va dezactiva automat la răsărit</translation> <translation id="9149866541089851383">Editează...</translation> <translation id="9150045010208374699">Utilizează camera foto</translation> <translation id="9150079578948279438">Profilul nu a putut fi eliminat. Încearcă din nou sau contactează operatorul pentru asistență tehnică.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 655d931..0a612822 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Отключить устройство Bluetooth</translation> <translation id="1651008383952180276">Необходимо дважды ввести одну кодовую фразу</translation> <translation id="1652326691684645429">Включить Обмен с окружением</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Добавьте принтер в приложение "Google Виртуальный принтер" и печатайте документы с любого устройства.}one{Добавьте # принтер в приложение "Google Виртуальный принтер" и печатайте документы с любого устройства.}few{Добавьте # принтера в приложение "Google Виртуальный принтер" и печатайте документы с любого устройства.}many{Добавьте # принтеров в приложение "Google Виртуальный принтер" и печатайте документы с любого устройства.}other{Добавьте # принтера в приложение "Google Виртуальный принтер" и печатайте документы с любого устройства.}}</translation> <translation id="1653631694606464309">Веб-приложения обычно запрашивают разрешение на открытие файлов определенных типов. Это позволяет работать с файлами в удобном приложении.</translation> <translation id="1656528038316521561">Прозрачность фона</translation> <translation id="1657406563541664238">Автоматическая отправка в Google статистики использования и отчетов о сбоях с целью улучшения <ph name="PRODUCT_NAME" /></translation> @@ -2904,7 +2903,6 @@ <translation id="4094647278880271855">Вы используете неподдерживаемую переменную среды: <ph name="BAD_VAR" />. Это негативно скажется на стабильности и безопасности.</translation> <translation id="4095264805865317199">Открыть интерфейс активации мобильной сети</translation> <translation id="4095507791297118304">Основной дисплей</translation> -<translation id="409579654357498729">Добавить в Виртуальный принтер</translation> <translation id="4096508467498758490">Отключение расширений в режиме разработчика</translation> <translation id="4097406557126260163">Приложения и расширения</translation> <translation id="409742781329613461">Советы по работе с браузером Chrome</translation> @@ -4380,6 +4378,7 @@ <translation id="5794700615121138172">Общие папки Linux</translation> <translation id="5794786537412027208">Закрыть все приложения Chrome</translation> <translation id="5797070761912323120">Google может использовать вашу историю, чтобы персонализировать рекламу, а также Поиск и другие сервисы.</translation> +<translation id="5797521893972859201">История будет удалена, в том числе в окне поиска</translation> <translation id="5798079537501238810">Разрешить сайтам устанавливать обработчики платежей</translation> <translation id="579907812742603813">Защищенный контент</translation> <translation id="579915268381781820">Электронный ключ не подключен.</translation> @@ -4463,6 +4462,7 @@ <translation id="5900302528761731119">Фотография профиля Google</translation> <translation id="590036993063074298">Сведения о качестве трансляции</translation> <translation id="5901069264981746702">Данные отпечатков пальцев хранятся только на устройстве <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Перейти на записываемую вкладку</translation> <translation id="5901494423252125310">Дверца принтера открыта</translation> <translation id="5901630391730855834">Желтый</translation> <translation id="5904614460720589786">Не удалось настроить <ph name="APP_NAME" /> из-за проблем с конфигурацией. Обратитесь к администратору. Код ошибки: <ph name="ERROR_CODE" />.</translation> @@ -4735,6 +4735,7 @@ <translation id="6196854373336333322">Расширение "<ph name="EXTENSION_NAME" />" контролирует настройки прокси-сервера. Это значит, что оно может отследить или изменить передаваемые вами данные, а также оборвать интернет-соединение. Если вы не знали об этом, вам следует отключить расширение.</translation> <translation id="6198102561359457428">Выйти и войти снова</translation> <translation id="6198252989419008588">Изменить PIN-код</translation> +<translation id="6200047250927636406">Удалить файл</translation> <translation id="6202304368170870640">Вы можете использовать PIN-код для входа в аккаунт или разблокировки устройства.</translation> <translation id="6206311232642889873">Копировать изображение</translation> <translation id="6207200176136643843">Восстановить масштаб по умолчанию</translation> @@ -4820,7 +4821,6 @@ По правилам домена <ph name="DOMAIN" /> смарт-карта должна быть вставлена.</translation> <translation id="628352644014831790">4 секунды</translation> <translation id="6285120108426285413">Файл <ph name="FILE_NAME" /> скачивают редко. Возможно, он вредоносный.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Новый принтер в сети}one{Новые принтеры в сети}few{Новые принтеры в сети}many{Новые принтеры в сети}other{Новые принтеры в сети}}</translation> <translation id="6285770818046456882">Отправитель отменил передачу данных.</translation> <translation id="6290613030083731160">Поблизости нет устройств, с которыми можно обмениваться данными. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Выполняется проверка кода активации. Это может занять несколько минут.</translation> @@ -5303,6 +5303,7 @@ <translation id="6831043979455480757">Перевести</translation> <translation id="6833479554815567477">Вкладка удалена из группы "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Перейдите на умный и безопасный браузер</translation> +<translation id="6834652994408928492">Тёмная тема автоматически включается на закате</translation> <translation id="683540480453879381">открывать файлы <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Чтобы обновить устройство <ph name="DEVICE_TYPE" />, требуется подключение к Интернету.</translation> <translation id="6838034009068684089">Запрашивать разрешение на открытие и размещение сайтами окон на экранах (рекомендуется)</translation> @@ -6010,11 +6011,12 @@ <translation id="7617263010641145920">Включить Play Маркет</translation> <translation id="7617366389578322136">Подключение к устройству "<ph name="DEVICE_NAME" />"</translation> <translation id="7617648809369507487">Использование тихого режима для уведомлений</translation> -<translation id="7618774594543487847">Нейтральные</translation> +<translation id="7618774594543487847">Нейтральные цвета</translation> <translation id="7621382409404463535">Не удалось сохранить конфигурацию устройства.</translation> <translation id="7622114377921274169">Зарядка…</translation> <translation id="7622768823216805500">Обычно сайты устанавливают обработчики платежей, чтобы использовать такие функции, как упрощенная оплата покупок.</translation> <translation id="7622903810087708234">Сведения о пароле</translation> +<translation id="7622966771025050155">Перейти на записанную вкладку</translation> <translation id="7624337243375417909">клавиша Caps Lock не нажата</translation> <translation id="7625568159987162309">Посмотреть текущие разрешения и сохраненные данные сайтов</translation> <translation id="7628201176665550262">Частота обновления</translation> @@ -6181,6 +6183,7 @@ <translation id="7784067724422331729">Этот файл заблокирован согласно настройкам безопасности компьютера.</translation> <translation id="7784796923038949829">Невозможно прочитать или изменить данные сайта</translation> <translation id="778480864305029524">Чтобы использовать мгновенную точку доступа, включите уведомления от сервисов Google Play</translation> +<translation id="7785471469930192436">Изучите инструкции по удалению истории поиска, для этого ознакомьтесь со справочными материалами используемой поисковой системы.</translation> <translation id="7786889348652477777">Пере&загрузить приложение</translation> <translation id="7787308148023287649">Показывать на другом экране</translation> <translation id="7788298548579301890">Одна из программ на вашем компьютере установила приложение, которое может влиять на работу Chrome. @@ -6792,6 +6795,7 @@ <translation id="8438566539970814960">Помогать улучшить просмотр страниц и поиск</translation> <translation id="8439506636278576865">Предлагать перевести страницы на этом языке</translation> <translation id="8440630305826533614">Приложения для Linux</translation> +<translation id="8446225304314102060">Переключиться на вкладку <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Подробнее...</translation> <translation id="8447409163267621480">Сочетание должно начинаться с клавиши Ctrl или Alt</translation> <translation id="8448729345478502352">Уменьшить или увеличить объекты на экране</translation> @@ -7455,6 +7459,7 @@ <translation id="9148058034647219655">Выйти</translation> <translation id="9148126808321036104">Повторите вход</translation> <translation id="9148963623915467028">Этому сайту разрешено получать информацию о том, где вы находитесь.</translation> +<translation id="9149529198050266366">Тёмная тема автоматически выключается на рассвете</translation> <translation id="9149866541089851383">Изменить...</translation> <translation id="9150045010208374699">Использование камеры</translation> <translation id="9150079578948279438">Не удалось удалить профиль. Повторите попытку или обратитесь к своему оператору за технической поддержкой.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index fab72d4..5e6f3643b 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">බ්ලූටූත් උපාංගය යුගලන නොකරන්න</translation> <translation id="1651008383952180276">ඔබ එකම මුරවැකිකඩ දෙවරක් ඇතුළු කළ යුතුය</translation> <translation id="1652326691684645429">ළඟ බෙදා ගැනීම සබල කරන්න</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{ඔබට ඕනෑම තැනක සිට මුද්රණයට මුද්රණ යන්ත්රය Google වළාකුළු මුද්රණය වෙත එක් කරන්න.}one{ඔබට ඕනෑම තැනක සිට මුද්රණයට මුද්රණ යන්ත්ර # ක් Google වළාකුළු මුද්රණය වෙත එක් කරන්න.}other{ඔබට ඕනෑම තැනක සිට මුද්රණයට මුද්රණ යන්ත්ර # ක් Google වළාකුළු මුද්රණය වෙත එක් කරන්න.}}</translation> <translation id="1653631694606464309">වෙබ් යෙදුම් දර්ශීයව ඇතැම් වර්ගවල ගොනු විවෘත කිරීමට ඉල්ලන අතර එවිට ඔබට වඩා කැමති වදන් සැකසුමක ලේඛන විවෘත කිරීම වැනි, ඔබට අවශ්ය ගොනුවල වැඩ කළ හැකිය.</translation> <translation id="1656528038316521561">පසුබිම් පාරාන්ධතාව</translation> <translation id="1657406563541664238">Google වෙත භාවිත සංඛ්යාල්ඛන සහ කඩිනම් වාර්තා ස්වයංක්රියව යවා <ph name="PRODUCT_NAME" /> වඩා යහපත් කිරීමට උපකාර වන්න.</translation> @@ -2907,7 +2906,6 @@ <translation id="4094647278880271855">ඔබ සහය නොදැක්වෙන පරිසර විචල්යයක් භාවිත කරයි: <ph name="BAD_VAR" />. ස්ථායිතාව සහ ආරක්ෂාව පාඩු ලබති.</translation> <translation id="4095264805865317199">සෙලියුලර් ක්රියාත්මක කිරීමේ UI එක විවෘත කරන්න</translation> <translation id="4095507791297118304">මූලික සංදර්ශකය</translation> -<translation id="409579654357498729">ක්ලවුඩ් ප්රින්ට් වෙත එක් කරන්න</translation> <translation id="4096508467498758490">සංවර්ධක ප්රකාර දිගු අබල කරන්න</translation> <translation id="4097406557126260163">යෙදුම් සහ දිගු</translation> <translation id="409742781329613461">Chrome සඳහා ඉඟි</translation> @@ -4827,7 +4825,6 @@ <ph name="DOMAIN" /> හට ඔබ ඔබගේ ස්මාර්ට් කාඩ්පත ඇතුළු කර තබා ගැනීමට අවශ්යයි.</translation> <translation id="628352644014831790">තත්පර 4ක</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> නිතර බාගැනීම සිදු නොවන අතර අනතුරුදායක විය හැකිය.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ඔබේ ජාලයේ නව මුද්රණ යන්ත්රය}one{ඔබේ ජාලයේ නව මුද්රණ යන්ත්ර}other{ඔබේ ජාලයේ නව මුද්රණ යන්ත්ර}}</translation> <translation id="6285770818046456882">ඔබ සමඟ බෙදා ගන්නා උපාංගය මාරුව අවලංගු කරන ලදි</translation> <translation id="6290613030083731160">අවට බෙදා ගන්නා ලබා ගත හැකි උපාංග නැත. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> <translation id="6291086328725007688">සක්රිය කිරීමේ කේතය සත්යාපනය කරමින් මෙයට මිනිත්තු කිහිපයක් ගත විය හැකිය.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 4bb4852..999278f 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Zrušenie párovania zariadenia Bluetooth</translation> <translation id="1651008383952180276">Rovnakú prístupovú frázu musíte zadať dvakrát</translation> <translation id="1652326691684645429">Povoliť Zdieľanie nablízku</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Pridajte si tlačiareň do služby Google Cloud Print, aby ste mohli tlačiť odkiaľkoľvek.}few{Pridajte si # tlačiarne do služby Google Cloud Print, aby ste mohli tlačiť odkiaľkoľvek.}many{Pridajte si # tlačiarne do služby Google Cloud Print, aby ste mohli tlačiť odkiaľkoľvek.}other{Pridajte si # tlačiarní do služby Google Cloud Print, aby ste mohli tlačiť odkiaľkoľvek.}}</translation> <translation id="1653631694606464309">Webové aplikácie zvyčajne žiadajú o otvorenie konkrétnych typov súborov, aby ste mohli s danými súbormi pracovať v ľubovoľnom programe, napríklad otvárať dokumenty v preferovanom textovom procesore.</translation> <translation id="1656528038316521561">Nepriehľadnosť pozadia</translation> <translation id="1657406563541664238">Pomôžte zlepšiť aplikáciu <ph name="PRODUCT_NAME" /> aktivovaním automatického odosielania štatistických údajov o používaní prehliadača a správ o chybách spoločnosti Google.</translation> @@ -2905,7 +2904,6 @@ <translation id="4094647278880271855">Používate nepodporovanú premennú prostredia: <ph name="BAD_VAR" />. Negatívne to ovplyvní stabilitu a zabezpečenie.</translation> <translation id="4095264805865317199">Otvoriť rozhranie aktivácie mobilnej siete</translation> <translation id="4095507791297118304">Primárna obrazovka</translation> -<translation id="409579654357498729">Pridať do služby Cloud Print</translation> <translation id="4096508467498758490">Zakázanie rozšírení spustených v režime vývojára</translation> <translation id="4097406557126260163">Aplikácie a rozšírenia</translation> <translation id="409742781329613461">Tip pre Chrome</translation> @@ -4381,6 +4379,7 @@ <translation id="5794700615121138172">Zdieľané priečinky v systéme Linux</translation> <translation id="5794786537412027208">Ukončiť všetky aplikácie Chrome</translation> <translation id="5797070761912323120">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie, reklamy a ďalšie služby Googlu</translation> +<translation id="5797521893972859201">Vymaže históriu (aj vo vyhľadávacom poli)</translation> <translation id="5798079537501238810">Weby môžu inštalovať obslužné nástroje platieb</translation> <translation id="579907812742603813">chránený obsah</translation> <translation id="579915268381781820">Bezpečnostný kľúč bol odstránený.</translation> @@ -4464,6 +4463,7 @@ <translation id="5900302528761731119">Fotografia profilu Google</translation> <translation id="590036993063074298">Podrobnosti o kvalite zrkadlenia</translation> <translation id="5901069264981746702">Údaje odtlačkov prstov sú uložené bezpečne a nikdy sa nedostanú mimo zariadenia <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Prepnúť na zaznamenávanú kartu</translation> <translation id="5901494423252125310">Dvierka tlačiarne sú otvorené</translation> <translation id="5901630391730855834">Žltá</translation> <translation id="5904614460720589786"><ph name="APP_NAME" /> sa nepodarilo nastaviť pre problém s konfiguráciou. Kontaktujte správcu. Kód chyby: <ph name="ERROR_CODE" />.</translation> @@ -4736,6 +4736,7 @@ <translation id="6196854373336333322">Toto rozšírenie „<ph name="EXTENSION_NAME" />“ prevzalo kontrolu nad vašimi nastaveniami servera proxy, čo znamená, že môže zmeniť, prerušiť alebo zachytiť všetku vašu činnosť online. Ak neviete, prečo k tomu došlo, pravdepodobne si to neželáte.</translation> <translation id="6198102561359457428">Odhláste sa a potom sa znova prihláste...</translation> <translation id="6198252989419008588">Zmeniť PIN</translation> +<translation id="6200047250927636406">Zahodiť súbor</translation> <translation id="6202304368170870640">Pomocou kódu PIN sa môžete prihlásiť do zariadenia alebo ho odomknúť.</translation> <translation id="6206311232642889873">&Kopírovať obrázok</translation> <translation id="6207200176136643843">Resetovať na predvolenú úroveň lupy</translation> @@ -4821,7 +4822,6 @@ <ph name="DOMAIN" /> vyžaduje, aby ste svoju čipovú kartu ponechali vloženú.</translation> <translation id="628352644014831790">4 sekundy</translation> <translation id="6285120108426285413">Súbor <ph name="FILE_NAME" /> sa bežne nesťahuje a môže byť nebezpečný.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nová tlačiareň v sieti}few{Nové tlačiarne v sieti}many{Nové tlačiarne v sieti}other{Nové tlačiarne v sieti}}</translation> <translation id="6285770818046456882">Zariadenie, ktoré s vami zdieľa obsah, zrušilo prenos</translation> <translation id="6290613030083731160">Nablízku nie sú žiadne dostupné zdieľajúce zariadenia. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Overuje sa aktivačný kód. Môže to trvať niekoľko minút.</translation> @@ -5304,6 +5304,7 @@ <translation id="6831043979455480757">Preložiť</translation> <translation id="6833479554815567477">Karta bola odstránená zo skupiny <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Prepnite na inteligentný a bezpečný prehliadač</translation> +<translation id="6834652994408928492">Tmavý režim sa automaticky zapne pri západe slnka</translation> <translation id="683540480453879381">Otvárať súbory s príponami <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Ak chcete aktualizovať zariadenie <ph name="DEVICE_TYPE" />, pripojte sa k internetu.</translation> <translation id="6838034009068684089">Opýtať sa, keď chce web otvárať a umiestňovať okná na vaše obrazovky (odporúčané)</translation> @@ -6016,6 +6017,7 @@ <translation id="7622114377921274169">Nabíja sa.</translation> <translation id="7622768823216805500">Weby zvyčajne inštalujú obslužné nástroje platieb, aby mohli poskytovať nákupné funkcie, ako je ľahšie platenie</translation> <translation id="7622903810087708234">Podrobnosti o hesle</translation> +<translation id="7622966771025050155">Prepnúť na zaznamenanú kartu</translation> <translation id="7624337243375417909">Funkcia Caps Lock je vypnutá</translation> <translation id="7625568159987162309">Zobraziť povolenia a uložené dáta webov</translation> <translation id="7628201176665550262">Frekvencia obnovenia</translation> @@ -6182,6 +6184,7 @@ <translation id="7784067724422331729">Tento súbor je blokovaný nastaveniami zabezpečenia počítača.</translation> <translation id="7784796923038949829">Údaje webu sa nedajú prečítať ani zmeniť</translation> <translation id="778480864305029524">Ak chcete používať Dynamický tethering, zapnite upozornenia pre Služby Google Play.</translation> +<translation id="7785471469930192436">Prečítajte si pokyny vyhľadávača, ako odstrániť históriu vyhľadávania (ak je to možné)</translation> <translation id="7786889348652477777">&Znova načítať aplikáciu</translation> <translation id="7787308148023287649">Zobraziť na inej obrazovke</translation> <translation id="7788298548579301890">Iný program v počítači pridal aplikáciu, ktorá môže zmeniť spôsob fungovania Chromu. @@ -6793,6 +6796,7 @@ <translation id="8438566539970814960">Zlepšovať vyhľadávanie a prehliadanie</translation> <translation id="8439506636278576865">Ponúkať preklad stránok v tomto jazyku</translation> <translation id="8440630305826533614">Aplikácie pre Linux</translation> +<translation id="8446225304314102060">Prepnúť na kartu <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Ďalšie informácie</translation> <translation id="8447409163267621480">Použite buď Ctrl, alebo Alt</translation> <translation id="8448729345478502352">Zväčšte alebo zmenšite položky na obrazovke</translation> @@ -7456,6 +7460,7 @@ <translation id="9148058034647219655">Ukončiť</translation> <translation id="9148126808321036104">Znova sa prihlásiť</translation> <translation id="9148963623915467028">Tento web má povolený prístup k vašej polohe.</translation> +<translation id="9149529198050266366">Tmavý režim sa automaticky vypne pri východe slnka</translation> <translation id="9149866541089851383">Upraviť...</translation> <translation id="9150045010208374699">Používať vašu kameru</translation> <translation id="9150079578948279438">Profil sa nepodarilo odstrániť. Skúste to znova alebo požiadajte o technickú podporu operátora.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index b1713040..86b41ed5 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -619,7 +619,6 @@ <translation id="164936512206786300">Preklic seznanitve z napravo Bluetooth</translation> <translation id="1651008383952180276">Dvakrat morate vnesti isto geslo</translation> <translation id="1652326691684645429">Omogočanje deljenja v bližini</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Dodajte tiskalnik v Google Tiskanje v oblaku, da boste lahko tiskali od koder koli.}one{Dodajte # tiskalnik v Google Tiskanje v oblaku, da boste lahko tiskali od koder koli.}two{Dodajte # tiskalnika v Google Tiskanje v oblaku, da boste lahko tiskali od koder koli.}few{Dodajte # tiskalnike v Google Tiskanje v oblaku, da boste lahko tiskali od koder koli.}other{Dodajte # tiskalnikov v Google Tiskanje v oblaku, da boste lahko tiskali od koder koli.}}</translation> <translation id="1653631694606464309">Spletne aplikacije običajno zahtevajo odpiranje nekaterih vrst datotek, tako da lahko s temi datotekami delate, kjer želite, na primer odprete dokumente v prednostnem urejevalniku besedil.</translation> <translation id="1656528038316521561">Neprosojnost ozadja</translation> <translation id="1657406563541664238">Pomagajte izboljšati <ph name="PRODUCT_NAME" /> s samodejnim pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu</translation> @@ -2921,7 +2920,6 @@ <translation id="4094647278880271855">Uporabljate nepodprto vrednost spremenljivke okolja <ph name="BAD_VAR" />. Ogroženi bosta stabilnost in varnost.</translation> <translation id="4095264805865317199">Odpri uporabniški vmesnik za aktiviranje mobilnega omrežja</translation> <translation id="4095507791297118304">Glavni zaslon</translation> -<translation id="409579654357498729">Dodaj v Google Tiskanje v oblaku</translation> <translation id="4096508467498758490">Onemogočanje razširitev za razvijalski način</translation> <translation id="4097406557126260163">Aplikacije in razširitve</translation> <translation id="409742781329613461">Nasveti za Chrome</translation> @@ -4400,6 +4398,7 @@ <translation id="5794700615121138172">Mape Linux, deljene z drugimi</translation> <translation id="5794786537412027208">Zapri vse aplikacije za Chrome</translation> <translation id="5797070761912323120">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev</translation> +<translation id="5797521893972859201">Izbriše zgodovino, vključno s tisto v iskalnem polju.</translation> <translation id="5798079537501238810">Spletna mesta lahko namestijo rutine za obravnavo plačil.</translation> <translation id="579907812742603813">zaščitena vsebina</translation> <translation id="579915268381781820">Varnostni ključ je bil odstranjen.</translation> @@ -4483,6 +4482,7 @@ <translation id="5900302528761731119">Fotografija profila Google</translation> <translation id="590036993063074298">Podrobnosti o kakovosti zrcaljenja</translation> <translation id="5901069264981746702">Podatki o prstnih odtisih so varno shranjeni in nikoli ne zapustijo naprave <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Preklop na zajemanje zavihka</translation> <translation id="5901494423252125310">Vrata tiskalnika so odprta</translation> <translation id="5901630391730855834">Rumena</translation> <translation id="5904614460720589786">Aplikacije <ph name="APP_NAME" /> ni bilo mogoče nastaviti zaradi težave s konfiguracijo. Obrnite se na skrbnika. Koda napake: <ph name="ERROR_CODE" />.</translation> @@ -4755,6 +4755,7 @@ <translation id="6196854373336333322">Razširitev »<ph name="EXTENSION_NAME" />« je prevzela nadzor nad nastavitvami strežnika proxy, kar pomeni, da lahko spremeni, prekine ali nadzoruje vse, kar počnete v spletu. Če ne veste, zakaj je prišlo do te spremembe, je verjetno nezaželena.</translation> <translation id="6198102561359457428">Odjavite se in znova prijavite ...</translation> <translation id="6198252989419008588">Spremeni PIN</translation> +<translation id="6200047250927636406">Zavrzi datoteko</translation> <translation id="6202304368170870640">Kodo PIN lahko uporabite za prijavo ali odklepanje naprave.</translation> <translation id="6206311232642889873">Kop&iraj sliko</translation> <translation id="6207200176136643843">Ponastavitev na privzeto stopnjo povečave/pomanjšave</translation> @@ -4840,7 +4841,6 @@ Domena <ph name="DOMAIN" /> zahteva, da je pametna kartica vstavljena.</translation> <translation id="628352644014831790">4 sekunde</translation> <translation id="6285120108426285413">Datoteka <ph name="FILE_NAME" /> ni pogosto prenesena in je lahko nevarna.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nov tiskalnik v vašem omrežju}one{Novi tiskalniki v vašem omrežju}two{Novi tiskalniki v vašem omrežju}few{Novi tiskalniki v vašem omrežju}other{Novi tiskalniki v vašem omrežju}}</translation> <translation id="6285770818046456882">Naprava, ki deli z vami, je preklicala prenos.</translation> <translation id="6290613030083731160">V bližini ni naprav, na voljo za deljenje. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Preverjanje kode za aktiviranje. To lahko traja nekaj minut.</translation> @@ -5323,6 +5323,7 @@ <translation id="6831043979455480757">Prevedi</translation> <translation id="6833479554815567477">Zavihek je odstranjen iz skupine <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" />.</translation> <translation id="683373380308365518">Preklop na pametni in varni brskalnik</translation> +<translation id="6834652994408928492">Temni način se bo samodejno vklopil ob sončnem zahodu.</translation> <translation id="683540480453879381">odpirati datoteke <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Če želite posodobiti napravo <ph name="DEVICE_TYPE" />, vzpostavite internetno povezavo.</translation> <translation id="6838034009068684089">Vprašaj, ko želi spletno mesto odpreti okna in jih postaviti na zaslone (priporočljivo)</translation> @@ -6035,6 +6036,7 @@ <translation id="7622114377921274169">Polnjenje.</translation> <translation id="7622768823216805500">Spletna mesta običajno namestijo rutine za obravnavo plačil za funkcije nakupovanja, kot je lažje dokončanje nakupa.</translation> <translation id="7622903810087708234">Podrobnosti gesla</translation> +<translation id="7622966771025050155">Preklop na zajeti zavihek</translation> <translation id="7624337243375417909">zaklepanje velikih črk je izklopljeno</translation> <translation id="7625568159987162309">Ogled dovoljenj in podatkov, shranjenih na spletnih mestih</translation> <translation id="7628201176665550262">Hitrost osveževanja</translation> @@ -6201,6 +6203,7 @@ <translation id="7784067724422331729">Varnostne nastavitve v računalniku so blokirale datoteko.</translation> <translation id="7784796923038949829">Podatkov spletnega mesta ni mogoče prebrati ali spremeniti</translation> <translation id="778480864305029524">Če želite uporabiti takojšnjo povezavo z internetom prek mobilnega telefona, vklopite obvestila za storitve Google Play.</translation> +<translation id="7785471469930192436">Oglejte si navodila iskalnika za brisanje zgodovine iskanja, če so na voljo.</translation> <translation id="7786889348652477777">&Znova naloži aplikacijo</translation> <translation id="7787308148023287649">Prikaz na drugem zaslonu</translation> <translation id="7788298548579301890">Drug program v računalniku je dodal aplikacijo, ki lahko morda spremeni način delovanja Chroma. @@ -6813,6 +6816,7 @@ <translation id="8438566539970814960">Izboljšanje iskanja in brskanja</translation> <translation id="8439506636278576865">Ponudi prevajanje strani v tem jeziku</translation> <translation id="8440630305826533614">Aplikacije za Linux</translation> +<translation id="8446225304314102060">Preklop na zavihek <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Več o tem</translation> <translation id="8447409163267621480">Vključevati morajo ali Ctrl ali Alt</translation> <translation id="8448729345478502352">Pomanjšajte ali povečajte elemente na zaslonu.</translation> @@ -7477,6 +7481,7 @@ <translation id="9148058034647219655">Zapri</translation> <translation id="9148126808321036104">Prijavite se znova</translation> <translation id="9148963623915467028">To spletno mesto lahko dostopa do vaše lokacije.</translation> +<translation id="9149529198050266366">Temni način se bo samodejno izklopil ob sončnem vzhodu.</translation> <translation id="9149866541089851383">Uredi ...</translation> <translation id="9150045010208374699">Uporabite kamero</translation> <translation id="9150079578948279438">Profila ni bilo mogoče odstraniti. Poskusite znova ali se obrnite na operaterja za tehnično podporo.</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 846d2ea7..33d45174 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">Anulo çiftimin me pajisjen me Bluetooth</translation> <translation id="1651008383952180276">Duhet të fusësh dy herë të njëjtën frazë kalimi</translation> <translation id="1652326691684645429">Aktivizo "Ndarjen në afërsi"</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Shtoje printerin te "Printimi në renë kompjuterike" të Google që të mund të printosh nga çdo vend.}other{Shto # printerë te "Printimi në renë kompjuterike" të Google që të mund të printosh nga çdo vend.}}</translation> <translation id="1653631694606464309">Aplikacionet e uebit zakonisht pyesin për të hapur lloje të caktuara të skedarëve që të mund të punosh me ata skedarë ku të dëshirosh, si p.sh. t'i hapësh dokumentet në përpunuesin tënd të preferuar të fjalëve</translation> <translation id="1656528038316521561">Niveli i transparencës së sfondit</translation> <translation id="1657406563541664238">Ndihmo në përmirësimin e <ph name="PRODUCT_NAME" /> duke dërguar automatikisht te Google statistika të përdorimit dhe raporte të ndërprerjeve aksidentale</translation> @@ -2900,7 +2899,6 @@ <translation id="4094647278880271855">Po përdor një ndryshore mjedisi që nuk mbështetet: <ph name="BAD_VAR" />. Kjo do të ketë ndikim te qëndrueshmëria dhe siguria.</translation> <translation id="4095264805865317199">Hap ndërfaqen e përdorimit të aktivizimit celular</translation> <translation id="4095507791297118304">Ekrani kryesor</translation> -<translation id="409579654357498729">Shtoje te "Printim nëpërmjet resë kompjuterike"</translation> <translation id="4096508467498758490">Çaktivizo shtesat e modalitetit "si zhvillues"</translation> <translation id="4097406557126260163">Aplikacionet dhe shtesat</translation> <translation id="409742781329613461">Këshilla për Chrome</translation> @@ -4816,7 +4814,6 @@ <ph name="DOMAIN" /> kërkon që ti ta mbash kartën tënde smart të futur.</translation> <translation id="628352644014831790">4 sekonda</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> nuk shkarkohet zakonisht dhe mund të jetë i rrezikshëm.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printer i ri në rrjetin tënd}other{Printerë të rinj në rrjetin tënd}}</translation> <translation id="6285770818046456882">Pajisja që po ndan me ty e anuloi transfertën</translation> <translation id="6290613030083731160">Asnjë pajisje e disponueshme nuk po ndan në afërsi. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Po verifikon kodin e aktivizimit. Kjo mund të zgjasë disa minuta.</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 00c34531..0e3105b 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -612,7 +612,6 @@ <translation id="164936512206786300">Opozovite uprarivanje Bluetooth uređaja</translation> <translation id="1651008383952180276">Dvaput treba da unesete istu pristupnu frazu</translation> <translation id="1652326691684645429">Omogući Deljenje u blizini</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Dodajte štampač u Google Cloud štampanje da biste mogli da štampate bilo gde.}one{Dodajte # štampač u Google Cloud štampanje da biste mogli da štampate bilo gde.}few{Dodajte # štampača u Google Cloud štampanje da biste mogli da štampate bilo gde.}other{Dodajte # štampača u Google Cloud štampanje da biste mogli da štampate bilo gde.}}</translation> <translation id="1653631694606464309">Veb-aplikacije obično traže dozvolu za otvaranje određenih tipova fajlova da biste mogli da radite na tim fajlovima gde god poželite, na primer, da otvorite dokumente u željenom obrađivaču teksta</translation> <translation id="1656528038316521561">Neprozirnost pozadine</translation> <translation id="1657406563541664238">Pomozite unapređivanje <ph name="PRODUCT_NAME" /> pregledača tako što ćete automatski slati Google-u statistiku korišćenja i izveštaje o otkazivanju</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Koristite nepodržanu promenljivu okruženja: <ph name="BAD_VAR" />. To će se odraziti na stabilnost i bezbednost.</translation> <translation id="4095264805865317199">Otvori korisnički interfejs za mobilno aktiviranje</translation> <translation id="4095507791297118304">Glavni prikaz</translation> -<translation id="409579654357498729">Dodaj u Cloud štampanje</translation> <translation id="4096508467498758490">Onemogućite dodatke u režimu programera</translation> <translation id="4097406557126260163">Aplikacije i dodaci</translation> <translation id="409742781329613461">Saveti za Chrome</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Deljeni Linux direktorijumi</translation> <translation id="5794786537412027208">Izađi iz svih Chrome aplikacija</translation> <translation id="5797070761912323120">Google može da koristi istoriju za personalizaciju Pretrage, oglasa i drugih Google usluga</translation> +<translation id="5797521893972859201">Briše istoriju, uključujući istoriju u okviru za pretragu</translation> <translation id="5798079537501238810">Sajtovi mogu da instaliraju obrađivače plaćanja</translation> <translation id="579907812742603813">zaštićeni sadržaj</translation> <translation id="579915268381781820">Uklonili ste bezbednosni ključ.</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Slika Google profila</translation> <translation id="590036993063074298">Detalji kvaliteta preslikavanja</translation> <translation id="5901069264981746702">Podaci o otisku prsta se bezbedno čuvaju isključivo na uređaju <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Pređi na snimanje kartice</translation> <translation id="5901494423252125310">Vrata štampača su otvorena</translation> <translation id="5901630391730855834">Žuta</translation> <translation id="5904614460720589786">Podešavanje aplikacije <ph name="APP_NAME" /> nije uspelo zbog problema sa konfiguracijom. Obratite se administratoru. Kôd greške: <ph name="ERROR_CODE" />.</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">Dodatak „<ph name="EXTENSION_NAME" />“ je preuzeo kontrolu nad podešavanjima proksija, što znači da može da menja, prekida ili špijunira sve što radite onlajn. Ako niste sigurni zašto je došlo do ove promene, verovatno vam nije potrebna.</translation> <translation id="6198102561359457428">Odjavi me, pa me ponovo prijavi...</translation> <translation id="6198252989419008588">Promeni PIN</translation> +<translation id="6200047250927636406">Odbaci fajl</translation> <translation id="6202304368170870640">Možete da koristite PIN za prijavljivanje na uređaj ili za otključavanje uređaja.</translation> <translation id="6206311232642889873">Kop&iraj sliku</translation> <translation id="6207200176136643843">Resetuj na podrazumevani nivo zumiranja</translation> @@ -4819,7 +4820,6 @@ <ph name="DOMAIN" /> zahteva da pametna kartica ostane umetnuta.</translation> <translation id="628352644014831790">4 sekunde</translation> <translation id="6285120108426285413">Datoteka <ph name="FILE_NAME" /> se obično ne preuzima i može da bude opasna.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nov štampač na mreži}one{Novi štampači na mreži}few{Novi štampači na mreži}other{Novi štampači na mreži}}</translation> <translation id="6285770818046456882">Uređaj koji deli sa vama je otkazao prenos</translation> <translation id="6290613030083731160">Nema dostupnih uređaja koji dele u blizini. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Verifikuje se aktivacioni kôd. To može da potraje nekoliko minuta.</translation> @@ -5299,6 +5299,7 @@ <translation id="6831043979455480757">Prevedi</translation> <translation id="6833479554815567477">Kartica je uklonjena iz grupe <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Pređite na pametan i bezbedan pregledač</translation> +<translation id="6834652994408928492">Tamni režim se automatski uključuje kada sunce zađe</translation> <translation id="683540480453879381">otvara <ph name="FILE_EXTENSIONS" /> datoteke</translation> <translation id="6835762382653651563">Povežite se na internet da biste ažurirali <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Pitaj kada sajt želi da otvara i postavlja prozore na ekrane (preporučeno)</translation> @@ -6011,6 +6012,7 @@ <translation id="7622114377921274169">Puni se.</translation> <translation id="7622768823216805500">Sajtovi obično instaliraju obrađivače plaćanja za potrebe funkcija kupovine poput lakšeg plaćanja</translation> <translation id="7622903810087708234">Detalji lozinke</translation> +<translation id="7622966771025050155">Pređi na snimljenu karticu</translation> <translation id="7624337243375417909">caps lock je isključen</translation> <translation id="7625568159987162309">Pregledajte dozvole i podatke koji se čuvaju na svim sajtovima</translation> <translation id="7628201176665550262">Učestalost osvežavanja</translation> @@ -6177,6 +6179,7 @@ <translation id="7784067724422331729">Bezbednosna podešavanja na računaru su blokirala ovu datoteku.</translation> <translation id="7784796923038949829">Čitanje ili menjanje podataka sajta nije uspelo</translation> <translation id="778480864305029524">Da biste koristili instant privezivanje, uključite obaveštenja za Google Play usluge.</translation> +<translation id="7785471469930192436">Pogledajte uputstva pretraživača za brisanje istorije pretrage ako je to primenjivo</translation> <translation id="7786889348652477777">&Ponovo učitaj aplikaciju</translation> <translation id="7787308148023287649">Prikaz na drugom ekranu</translation> <translation id="7788298548579301890">Drugi program na računaru je dodao aplikaciju koja može da promeni način na koji Chrome funkcioniše. @@ -6788,6 +6791,7 @@ <translation id="8438566539970814960">Poboljšaj pretrage i pregledanje</translation> <translation id="8439506636278576865">Ponudi prevod stranica na ovom jeziku</translation> <translation id="8440630305826533614">Linux aplikacije</translation> +<translation id="8446225304314102060">Pređi na karticu <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Saznajte više</translation> <translation id="8447409163267621480">Koristite ili Ctrl ili Alt</translation> <translation id="8448729345478502352">Uvećajte ili umanjite stavke na ekranu</translation> @@ -7451,6 +7455,7 @@ <translation id="9148058034647219655">Izađi</translation> <translation id="9148126808321036104">Prijavi me ponovo</translation> <translation id="9148963623915467028">Ovaj sajt može da pristupa lokaciji.</translation> +<translation id="9149529198050266366">Tamni režim se automatski isključuje kada sunce izađe</translation> <translation id="9149866541089851383">Izmeni...</translation> <translation id="9150045010208374699">Korišćenje kamere</translation> <translation id="9150079578948279438">Uklanjanje profila nije uspelo. Probajte ponovo ili zatražite tehničku podršku od mobilnog operatera.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index b89bf75..c51dc5e 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -612,7 +612,6 @@ <translation id="164936512206786300">Опозовите упраривање Bluetooth уређаја</translation> <translation id="1651008383952180276">Двапут треба да унесете исту приступну фразу</translation> <translation id="1652326691684645429">Омогући Дељење у близини</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Додајте штампач у Google Cloud штампање да бисте могли да штампате било где.}one{Додајте # штампач у Google Cloud штампање да бисте могли да штампате било где.}few{Додајте # штампача у Google Cloud штампање да бисте могли да штампате било где.}other{Додајте # штампача у Google Cloud штампање да бисте могли да штампате било где.}}</translation> <translation id="1653631694606464309">Веб-апликације обично траже дозволу за отварање одређених типова фајлова да бисте могли да радите на тим фајловима где год пожелите, на пример, да отворите документе у жељеном обрађивачу текста</translation> <translation id="1656528038316521561">Непрозирност позадине</translation> <translation id="1657406563541664238">Помозите унапређивање <ph name="PRODUCT_NAME" /> прегледача тако што ћете аутоматски слати Google-у статистику коришћења и извештаје о отказивању</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Користите неподржану променљиву окружења: <ph name="BAD_VAR" />. То ће се одразити на стабилност и безбедност.</translation> <translation id="4095264805865317199">Отвори кориснички интерфејс за мобилно активирање</translation> <translation id="4095507791297118304">Главни приказ</translation> -<translation id="409579654357498729">Додај у Cloud штампање</translation> <translation id="4096508467498758490">Онемогућите додатке у режиму програмера</translation> <translation id="4097406557126260163">Апликације и додаци</translation> <translation id="409742781329613461">Савети за Chrome</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Дељени Linux директоријуми</translation> <translation id="5794786537412027208">Изађи из свих Chrome апликација</translation> <translation id="5797070761912323120">Google може да користи историју за персонализацију Претраге, огласа и других Google услуга</translation> +<translation id="5797521893972859201">Брише историју, укључујући историју у оквиру за претрагу</translation> <translation id="5798079537501238810">Сајтови могу да инсталирају обрађиваче плаћања</translation> <translation id="579907812742603813">заштићени садржај</translation> <translation id="579915268381781820">Уклонили сте безбедносни кључ.</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Слика Google профила</translation> <translation id="590036993063074298">Детаљи квалитета пресликавања</translation> <translation id="5901069264981746702">Подаци о отиску прста се безбедно чувају искључиво на уређају <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Пређи на снимање картице</translation> <translation id="5901494423252125310">Врата штампача су отворена</translation> <translation id="5901630391730855834">Жута</translation> <translation id="5904614460720589786">Подешавање апликације <ph name="APP_NAME" /> није успело због проблема са конфигурацијом. Обратите се администратору. Кôд грешке: <ph name="ERROR_CODE" />.</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">Додатак „<ph name="EXTENSION_NAME" />“ је преузео контролу над подешавањима проксија, што значи да може да мења, прекида или шпијунира све што радите онлајн. Ако нисте сигурни зашто је дошло до ове промене, вероватно вам није потребна.</translation> <translation id="6198102561359457428">Одјави ме, па ме поново пријави...</translation> <translation id="6198252989419008588">Промени PIN</translation> +<translation id="6200047250927636406">Одбаци фајл</translation> <translation id="6202304368170870640">Можете да користите PIN за пријављивање на уређај или за откључавање уређаја.</translation> <translation id="6206311232642889873">Коп&ирај слику</translation> <translation id="6207200176136643843">Ресетуј на подразумевани ниво зумирања</translation> @@ -4819,7 +4820,6 @@ <ph name="DOMAIN" /> захтева да паметна картица остане уметнута.</translation> <translation id="628352644014831790">4 секунде</translation> <translation id="6285120108426285413">Датотека <ph name="FILE_NAME" /> се обично не преузима и може да буде опасна.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов штампач на мрежи}one{Нови штампачи на мрежи}few{Нови штампачи на мрежи}other{Нови штампачи на мрежи}}</translation> <translation id="6285770818046456882">Уређај који дели са вама је отказао пренос</translation> <translation id="6290613030083731160">Нема доступних уређаја који деле у близини. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Верификује се активациони кôд. То може да потраје неколико минута.</translation> @@ -5299,6 +5299,7 @@ <translation id="6831043979455480757">Преведи</translation> <translation id="6833479554815567477">Картица је уклоњена из групе <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Пређите на паметан и безбедан прегледач</translation> +<translation id="6834652994408928492">Тамни режим се аутоматски укључује када сунце зађе</translation> <translation id="683540480453879381">отвара <ph name="FILE_EXTENSIONS" /> датотеке</translation> <translation id="6835762382653651563">Повежите се на интернет да бисте ажурирали <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Питај када сајт жели да отвара и поставља прозоре на екране (препоручено)</translation> @@ -6011,6 +6012,7 @@ <translation id="7622114377921274169">Пуни се.</translation> <translation id="7622768823216805500">Сајтови обично инсталирају обрађиваче плаћања за потребе функција куповине попут лакшег плаћања</translation> <translation id="7622903810087708234">Детаљи лозинке</translation> +<translation id="7622966771025050155">Пређи на снимљену картицу</translation> <translation id="7624337243375417909">caps lock је искључен</translation> <translation id="7625568159987162309">Прегледајте дозволе и податке који се чувају на свим сајтовима</translation> <translation id="7628201176665550262">Учесталост освежавања</translation> @@ -6177,6 +6179,7 @@ <translation id="7784067724422331729">Безбедносна подешавања на рачунару су блокирала ову датотеку.</translation> <translation id="7784796923038949829">Читање или мењање података сајта није успело</translation> <translation id="778480864305029524">Да бисте користили инстант привезивање, укључите обавештења за Google Play услуге.</translation> +<translation id="7785471469930192436">Погледајте упутства претраживача за брисање историје претраге ако је то примењиво</translation> <translation id="7786889348652477777">&Поново учитај апликацију</translation> <translation id="7787308148023287649">Приказ на другом екрану</translation> <translation id="7788298548579301890">Други програм на рачунару је додао апликацију која може да промени начин на који Chrome функционише. @@ -6788,6 +6791,7 @@ <translation id="8438566539970814960">Побољшај претраге и прегледање</translation> <translation id="8439506636278576865">Понуди превод страница на овом језику</translation> <translation id="8440630305826533614">Linux апликације</translation> +<translation id="8446225304314102060">Пређи на картицу <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Сазнајте више</translation> <translation id="8447409163267621480">Користите или Ctrl или Alt</translation> <translation id="8448729345478502352">Увећајте или умањите ставке на екрану</translation> @@ -7451,6 +7455,7 @@ <translation id="9148058034647219655">Изађи</translation> <translation id="9148126808321036104">Пријави ме поново</translation> <translation id="9148963623915467028">Овај сајт може да приступа локацији.</translation> +<translation id="9149529198050266366">Тамни режим се аутоматски искључује када сунце изађе</translation> <translation id="9149866541089851383">Измени...</translation> <translation id="9150045010208374699">Коришћење камере</translation> <translation id="9150079578948279438">Уклањање профила није успело. Пробајте поново или затражите техничку подршку од мобилног оператера.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index d44379b0..9075ffb 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Koppla från Bluetooth-enhet</translation> <translation id="1651008383952180276">Du måste ange samma lösenfras två gånger</translation> <translation id="1652326691684645429">Aktivera Närdelning</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Lägg till skrivaren i Google Cloud Print så att du kan skriva ut var du än befinner dig.}other{Lägg till # skrivare i Google Cloud Print så att du kan skriva ut var du än befinner dig.}}</translation> <translation id="1653631694606464309">Webbappar frågar vanligtvis om du vill öppna vissa filtyper så att du kan arbeta med dem där du vill, till exempel öppna dokument i det ordbehandlingsprogram du brukar använda</translation> <translation id="1656528038316521561">Bakgrundens genomskinlighet</translation> <translation id="1657406563541664238">Hjälp till att göra <ph name="PRODUCT_NAME" /> bättre genom att automatiskt skicka användningsstatistik och felrapporter till Google</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Du använder en miljövariabel som inte stöds: <ph name="BAD_VAR" />. Detta påverkar stabilitet och säkerhet negativt.</translation> <translation id="4095264805865317199">Öppna användargränssnittet för aktivering av mobilnätverk</translation> <translation id="4095507791297118304">Primär skärm</translation> -<translation id="409579654357498729">Lägg till i Cloud Print</translation> <translation id="4096508467498758490">Inaktivera tillägg i utvecklarläge</translation> <translation id="4097406557126260163">Appar och tillägg</translation> <translation id="409742781329613461">Tips för Chrome</translation> @@ -4395,6 +4393,7 @@ <translation id="5794700615121138172">Delade mappar i Linux</translation> <translation id="5794786537412027208">Stäng alla Chrome-appar</translation> <translation id="5797070761912323120">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån historiken</translation> +<translation id="5797521893972859201">Rensar historiken, inklusive från sökrutan</translation> <translation id="5798079537501238810">Webbplatser kan installera betalningshanterare</translation> <translation id="579907812742603813">skyddat innehåll</translation> <translation id="579915268381781820">Säkerhetsnyckeln har tagits bort.</translation> @@ -4478,6 +4477,7 @@ <translation id="5900302528761731119">Profilbild i Google Profiler</translation> <translation id="590036993063074298">Information om speglingskvalitet</translation> <translation id="5901069264981746702">Fingeravtrycksdata lagras på ett säkert sätt och lämnar aldrig din <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Byt till fliken som spelar in</translation> <translation id="5901494423252125310">Skrivarens lucka är öppen</translation> <translation id="5901630391730855834">Gul</translation> <translation id="5904614460720589786">Det gick inte att installera <ph name="APP_NAME" /> på grund av ett konfigurationsproblem. Kontakta administratören. Felkod: <ph name="ERROR_CODE" />.</translation> @@ -4750,6 +4750,7 @@ <translation id="6196854373336333322">Tillägget <ph name="EXTENSION_NAME" /> har tagit kontroll över dina proxyinställningar, vilket innebär att det kan ändra, knäcka eller tjuvlyssna på allt du gör på webben. Om du inte vet varför den här ändringen inträffade är den troligen inte önskvärd.</translation> <translation id="6198102561359457428">Logga ut och sedan in igen ...</translation> <translation id="6198252989419008588">Byt pinkod</translation> +<translation id="6200047250927636406">Släng filen</translation> <translation id="6202304368170870640">Du kan logga in på eller låsa upp enheten med pinkoden.</translation> <translation id="6206311232642889873">Kopiera &bild</translation> <translation id="6207200176136643843">Återställ standardzoomnivån</translation> @@ -4835,7 +4836,6 @@ <ph name="DOMAIN" /> kräver att du har smartkortet isatt.</translation> <translation id="628352644014831790">4 sekunder</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> brukar inte laddas ned och kan vara skadlig.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny skrivare i nätverket}other{Nya skrivare i nätverket}}</translation> <translation id="6285770818046456882">Enheten som delar med dig har avbrutit överföringen</translation> <translation id="6290613030083731160">Det finns inga enheter i närheten som delar. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktiveringskoden verifieras. Det kan ta några minuter.</translation> @@ -5318,6 +5318,7 @@ <translation id="6831043979455480757">Översätt</translation> <translation id="6833479554815567477">Fliken togs bort från gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Byt till en smart och säker webbläsare</translation> +<translation id="6834652994408928492">Mörkt läge aktiveras automatiskt vid solnedgången</translation> <translation id="683540480453879381">Öppna filer av typen <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Anslut till internet om du vill uppdatera din <ph name="DEVICE_TYPE" />.</translation> <translation id="6838034009068684089">Fråga när en webbplats vill öppna fönster och placera ut dem på skärmen (rekommenderas)</translation> @@ -6030,6 +6031,7 @@ <translation id="7622114377921274169">Laddas.</translation> <translation id="7622768823216805500">Att installera betalningshanterare brukar kunna behövas till exempel för att förenkla hanteringen i kassan på webbplatsen</translation> <translation id="7622903810087708234">Lösenordsinformation</translation> +<translation id="7622966771025050155">Byt till inspelad flik</translation> <translation id="7624337243375417909">caps lock av</translation> <translation id="7625568159987162309">Visa behörigheter och data som har lagrats på webbplatser</translation> <translation id="7628201176665550262">Uppdateringsfrekvens</translation> @@ -6196,6 +6198,7 @@ <translation id="7784067724422331729">Filen har blockerats av datorns säkerhetsinställningar.</translation> <translation id="7784796923038949829">Kan inte läsa eller ändra webbplatsens data</translation> <translation id="778480864305029524">Aktivera aviseringar för Google Play-tjänster om du vill använda direktinternetdelning.</translation> +<translation id="7785471469930192436">Läs sökmotorns anvisningar för att radera sökhistoriken om tillämpligt</translation> <translation id="7786889348652477777">&Läs in appen igen</translation> <translation id="7787308148023287649">Visa på en annan skärm</translation> <translation id="7788298548579301890">Ett annat program i datorn har lagt till en app som kan ändra hur Chrome fungerar. @@ -6808,6 +6811,7 @@ <translation id="8438566539970814960">Förbättra sökningar och surfandet</translation> <translation id="8439506636278576865">Erbjud att översätta sidor på detta språk</translation> <translation id="8440630305826533614">Linux-appar</translation> +<translation id="8446225304314102060">Byt till fliken <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Läs mer</translation> <translation id="8447409163267621480">Ctrl- eller alt-tangenten måste finnas med</translation> <translation id="8448729345478502352">Gör objekt på skärmen mindre eller större</translation> @@ -7469,6 +7473,7 @@ <translation id="9148058034647219655">Avsluta</translation> <translation id="9148126808321036104">Logga in igen</translation> <translation id="9148963623915467028">Den här webbplatsen har åtkomst till din plats.</translation> +<translation id="9149529198050266366">Mörkt läge inaktiveras automatiskt vid soluppgången</translation> <translation id="9149866541089851383">Redigera...</translation> <translation id="9150045010208374699">Använd kameran</translation> <translation id="9150079578948279438">Det gick inte att ta bort profilen. Försök igen eller kontakta operatören om du behöver teknisk support.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 184da4ae..20ea9d51 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Ondoa kifaa cha Bluetooth</translation> <translation id="1651008383952180276">Lazima uweke kauli ya siri sawa mara mbili</translation> <translation id="1652326691684645429">Washa kipengele cha Uhamishaji wa Karibu</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Ongeza printa kwenye Google Cloud Print ili uweze kuchapisha kutoka mahali popote.}other{Ongeza printa # kwenye Google Cloud Print ili uweze kuchapisha kutoka mahali popote.}}</translation> <translation id="1653631694606464309">Programu za wavuti kwa kawaida huomba ruhusa ya kufungua aina fulani za faili ili uweze kutumia faili hizo popote utakapo, kama vile kufungua hati katika programu ya kuchakata maandishi unayopendelea</translation> <translation id="1656528038316521561">Nuru ya mandharinyuma</translation> <translation id="1657406563541664238">Saidia kuboresha <ph name="PRODUCT_NAME" /> kwa kutumia Google takwimu za matumizi na ripoti wakati wowote huduma hii inapoacha kufanya kazi.</translation> @@ -2912,7 +2911,6 @@ <translation id="4094647278880271855">Unatumia mazingira ya thamani isiyotumika: <ph name="BAD_VAR" />. Usalama na uthabiti utaathiriwa</translation> <translation id="4095264805865317199">Fungua Kiolesura cha Kuwasha Mtandao wa Simu</translation> <translation id="4095507791297118304">Onyesho msingi</translation> -<translation id="409579654357498729">Ongeza kwenye Printa ya Wingu</translation> <translation id="4096508467498758490">Zima viendelezi vya hali ya msanidi programu</translation> <translation id="4097406557126260163">Programu na viendelezi</translation> <translation id="409742781329613461">Vidokezo vya kutumia Chrome</translation> @@ -4389,6 +4387,7 @@ <translation id="5794700615121138172">Folda zinazoshirikiwa za Linux</translation> <translation id="5794786537412027208">Ondoka kwenye Programu zote za Chrome</translation> <translation id="5797070761912323120">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google</translation> +<translation id="5797521893972859201">Hufuta historia, ikiwa ni pamoja na iliyo kwenye kisanduku cha kutafutia</translation> <translation id="5798079537501238810">Tovuti zinaweza kusakinisha vidhibiti vya malipo</translation> <translation id="579907812742603813">maudhui yanayolindwa</translation> <translation id="579915268381781820">Ufunguo wako wa usalama umeondolewa.</translation> @@ -4472,6 +4471,7 @@ <translation id="5900302528761731119">Picha ya Wasifu katika Google</translation> <translation id="590036993063074298">Maelezo ya Ubora wa Kuakisi</translation> <translation id="5901069264981746702">Data ya alama yako ya kidole itahifadhiwa kwa usalama na itasalia kwenye <ph name="DEVICE_TYPE" /> yako. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Nenda kwenye kichupo kinachonaswa</translation> <translation id="5901494423252125310">Mlango wa printa umefunguka</translation> <translation id="5901630391730855834">Manjano</translation> <translation id="5904614460720589786">Imeshindwa kusakinisha <ph name="APP_NAME" /> kwa sababu ya tatizo la mipangilio. Tafadhali wasiliana na msimamizi wako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation> @@ -4744,6 +4744,7 @@ <translation id="6196854373336333322">Kiendelezi hiki "<ph name="EXTENSION_NAME" />" kinadhibiti mipangilio yako ya seva mbadala, kumaanisha kuwa kinaweza kubadilisha, kuvunja, au kufuatilia chochote unachokifanya mtandaoni. Ikiwa huna uhakika kwa nini mabadiliko haya yamefanyika, huenda huyahitaji.</translation> <translation id="6198102561359457428">Ondoka na kisha uingie tena...</translation> <translation id="6198252989419008588">Badilisha PIN</translation> +<translation id="6200047250927636406">Ondoa faili</translation> <translation id="6202304368170870640">Unaweza kutumia PIN yako kuingia katika akaunti au kufungua kifaa chako.</translation> <translation id="6206311232642889873">&Nakili Picha</translation> <translation id="6207200176136643843">Rejesha kiwango cha kukuza kuwa chaguomsingi</translation> @@ -4829,7 +4830,6 @@ <ph name="DOMAIN" /> inahitaji usiondoe kadi yako mahiri.</translation> <translation id="628352644014831790">Sekunde 4</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> haipakuliwi kwa kawaida na huenda ikawa hatari.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printa mpya kwenye mtandao wako}other{Printa mpya kwenye mtandao wako}}</translation> <translation id="6285770818046456882">Kifaa kinachoshiriki nawe kimeghairi uhamishaji</translation> <translation id="6290613030083731160">Hakuna vifaa vinavyoshiriki karibu. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Inathibitisha msimbo wa kuanza kutumia. Hatua hii inaweza kuchukua dakika kadhaa.</translation> @@ -5312,6 +5312,7 @@ <translation id="6831043979455480757">Tafsiri</translation> <translation id="6833479554815567477">Kichupo kimeondolewa kwenye kikundi kiitwacho <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Badilisha ili utumie kivinjari mahiri na salama</translation> +<translation id="6834652994408928492">Hali nyeusi itawashwa kiotomatiki wakati wa machweo</translation> <translation id="683540480453879381">Kufungua faili za <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Tafadhali unganisha kwenye Intaneti ili usasishe <ph name="DEVICE_TYPE" /> yako.</translation> <translation id="6838034009068684089">Uliza wakati tovuti inataka kufungua na kuweka madirisha kwenye skrini zako (inapendekezwa)</translation> @@ -6024,6 +6025,7 @@ <translation id="7622114377921274169">Inachaji.</translation> <translation id="7622768823216805500">Tovuti husakinisha vidhibiti vya malipo kwa ajili ya vipengele vya ununuzi kama vile kulipa kwa haraka</translation> <translation id="7622903810087708234">Maelezo ya nenosiri</translation> +<translation id="7622966771025050155">Nenda kwenye kichupo kilichonaswa</translation> <translation id="7624337243375417909">kitufe cha herufi kubwa kimezimwa</translation> <translation id="7625568159987162309">Angalia ruhusu na data iliyohifadhiwa kwenye tovuti</translation> <translation id="7628201176665550262">Kiwango cha Kuonyesha Upya</translation> @@ -6190,6 +6192,7 @@ <translation id="7784067724422331729">Mipangilio ya usalama kwenye kompyuta yako imezuia faili hii.</translation> <translation id="7784796923038949829">Haiwezi kusoma wala kubadilisha data ya tovuti</translation> <translation id="778480864305029524">Ili utumie mtandao wa Kusambaza Papo Hapo, washa arifa za Huduma za Google Play.</translation> +<translation id="7785471469930192436">Angalia maagizo ya mtambo wako wa kutafuta, ikiwa yapo, kuhusu jinsi ya kufuta historia ya mambo uliyotafuta</translation> <translation id="7786889348652477777">Pakia upya Programu</translation> <translation id="7787308148023287649">Onyesha kwenye skrini nyingine</translation> <translation id="7788298548579301890">Programu nyingine kwenye kompyuta yako iliongeza programu ambayo inaweza kubadilisha jinsi Chrome hufanya kazi. @@ -6804,6 +6807,7 @@ <translation id="8438566539970814960">Boresha utafutaji na kuvinjari</translation> <translation id="8439506636278576865">Jitolee kutafsiri kurasa katika lugha hii</translation> <translation id="8440630305826533614">Programu za Linux</translation> +<translation id="8446225304314102060">Nenda kwenye kichupo cha <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Pata Maelezo Zaidi</translation> <translation id="8447409163267621480">Jumuisha kitufe cha Ctrl au Alt</translation> <translation id="8448729345478502352">Ongeza au upunguze ukubwa wa vipengee vilivyo kwenye skrini yako</translation> @@ -7465,6 +7469,7 @@ <translation id="9148058034647219655">Ondoka</translation> <translation id="9148126808321036104">Ingia tena</translation> <translation id="9148963623915467028">Tovuti hii inaweza kufikia maelezo ya mahali ulipo.</translation> +<translation id="9149529198050266366">Hali nyeusi itazimwa kiotomatiki wakati wa macheo</translation> <translation id="9149866541089851383">Badilisha...</translation> <translation id="9150045010208374699">Tumia kamera yako</translation> <translation id="9150079578948279438">Imeshindwa kuondoa maelezo ya eSIM. Tafadhali jaribu tena au wasiliana na mtoa huduma wako kwa usaidizi wa kiufundi.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 2147b5dc..df323a4 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">புளூடூத் சாதனத்தின் இணைப்பை அகற்றுதல்</translation> <translation id="1651008383952180276">ஒரே கடவுச்சொற்றொடரை இருமுறை உள்ளிட வேண்டும்</translation> <translation id="1652326691684645429">'அருகிலுள்ளவற்றுடன் பகிர்தல்' அம்சத்தை இயக்கு</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google கிளவுடு அச்சுடன் பிரிண்டரைச் சேர்த்து, எங்கிருந்தும் அச்சிடலாம்.}other{Google கிளவுடு அச்சுடன் # பிரிண்டர்களைச் சேர்த்து, எங்கிருந்தும் அச்சிடலாம்.}}</translation> <translation id="1653631694606464309">குறிப்பிட்ட சில கோப்புகளின் வகைகளைத் திறக்க இணைய ஆப்ஸ் வழக்கமாக அனுமதி கேட்கும் என்பதால் அவற்றில் எங்கிருந்து வேண்டுமானாலும் பணியாற்றலாம் (உதாரணத்திற்கு, விருப்பமான சொற்செயலியில் ஆவணங்களைத் திறப்பது)</translation> <translation id="1656528038316521561">பின்னணி ஒளிபுகாத்தன்மை</translation> <translation id="1657406563541664238">தானாகவே பயன்பாட்டு புள்ளிவிவரங்களையும் சிதைவு புகார்களையும் Google க்கு அனுப்புவதன் மூலம், <ph name="PRODUCT_NAME" /> ஐ மேலும் சிறப்பானதாக்க உதவுங்கள்</translation> @@ -2917,7 +2916,6 @@ <translation id="4094647278880271855">ஆதரிக்காத மாறியை பயன்படுத்துகிறீர்கள்: <ph name="BAD_VAR" />. நிலைப்புத்தன்மையும் பாதுகாப்பும் பாதிக்கப்படும்.</translation> <translation id="4095264805865317199">செல்லுலார் செயல்படுத்தலுக்கான UIயைத் திற</translation> <translation id="4095507791297118304">முதன்மைத் திரை</translation> -<translation id="409579654357498729">கிளவுடு அச்சில் சேர்</translation> <translation id="4096508467498758490">டெவெலப்பர் பயன்முறை நீட்டிப்புகளை முடக்கவும்</translation> <translation id="4097406557126260163">ஆப்ஸும் நீட்டிப்புகளும்</translation> <translation id="409742781329613461">Chrome உதவிக்குறிப்புகள்</translation> @@ -4834,7 +4832,6 @@ <ph name="DOMAIN" /> டொமைனைப் பயன்படுத்த, உங்கள் ஸ்மார்ட் கார்டு செருகப்பட்ட நிலையிலேயே இருக்க வேண்டும்.</translation> <translation id="628352644014831790">4 வினாடிகள்</translation> <translation id="6285120108426285413">பொதுவாக <ph name="FILE_NAME" /> பதிவிறக்கப்படாது, அத்துடன் இது ஆபத்துக்குரியதாக இருக்கலாம்.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர் உள்ளது}other{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர்கள் உள்ளன}}</translation> <translation id="6285770818046456882">உங்களுடன் ஃபைலைப் பகிர்ந்து கொண்டிருந்த சாதனம் பரிமாற்றத்தை ரத்துசெய்தது</translation> <translation id="6290613030083731160">அருகிலுள்ள சாதனங்கள் எதுவும் பகிரவில்லை. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="6291086328725007688">செயல்படுத்தல் குறியீட்டைச் சரிபார்க்கிறது. இதற்குச் சில நிமிடங்கள் ஆகலாம்.</translation> @@ -7428,7 +7425,7 @@ <translation id="9108808586816295166">பாதுகாப்பான DNS எப்போதும் கிடைக்காமல் போகலாம்</translation> <translation id="9109122242323516435">இடத்தைக் காலியாக்க, சாதனத்தின் சேமிப்பகத்தில் இருந்து கோப்புகளை நீக்கவும்.</translation> <translation id="9109283579179481106">மொபைல் நெட்வொர்க்குடன் இணைத்தல்</translation> -<translation id="9111102763498581341">பூட்டைத் திற</translation> +<translation id="9111102763498581341">அன்லாக் செய்</translation> <translation id="9111305600911828693">உரிமம் அமைக்கப்படவில்லை</translation> <translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation> <translation id="9111668656364922873">புதிய சுயவிவரத்திற்கு வரவேற்கிறோம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 2858d4ea..39f90735 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">బ్లూటూత్ పరికరాన్ని అన్పెయిర్ చేయండి</translation> <translation id="1651008383952180276">మీరు తప్పనిసరిగా ఒకే రహస్య పదబంధాన్ని రెండుసార్లు నమోదు చేయాలి</translation> <translation id="1652326691684645429">సమీప షేరింగ్ను ఎనేబుల్ చేయండి</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Add the printer to Google Cloud Print so you can print from anywhere.}other{Google క్లౌడ్ ప్రింట్కు # ప్రింటర్లను జోడించండి. అప్పుడు మీరు ఎక్కడి నుండైనా ముద్రించవచ్చు.}}</translation> <translation id="1653631694606464309">వెబ్ యాప్లు సాధారణంగా కొన్ని రకాల ఫైల్లను తెరవమని అడుగుతాయి, అప్పుడు ఆ ఫైల్ల మీద మీకు కావలసిన చోట మీరు పని చేసుకోగలుగుతారు, ఉదాహరణకు, మీ ప్రాధాన్య వర్డ్ ప్రాసెసర్లో డాక్యుమెంట్లను తెరవడం</translation> <translation id="1656528038316521561">నేపథ్య అపారదర్శకత</translation> <translation id="1657406563541664238">Googleకు వినియోగ గణాంకాలు, క్రాష్ నివేదికలను ఆటోమేటిక్గా పంపడం ద్వారా <ph name="PRODUCT_NAME" />ను మరింత మెరుగుపరచడంలో సహాయపడండి</translation> @@ -2917,7 +2916,6 @@ <translation id="4094647278880271855">మద్దతు లేని ఎన్విరాన్మెంట్ వేరియబుల్ను ఉపయోగిస్తున్నారు: <ph name="BAD_VAR" />. స్థిరత్వానికి, భద్రతకు సమస్య వస్తుంది.</translation> <translation id="4095264805865317199">సెల్యులార్ యాక్టివేషన్ UIని తెరువు</translation> <translation id="4095507791297118304">ప్రాథమిక డిస్ప్లే</translation> -<translation id="409579654357498729">క్లౌడ్ ప్రింట్కు జోడించు</translation> <translation id="4096508467498758490">డెవలపర్ మోడ్ ఎక్స్టెన్షన్లను నిలిపివేయండి</translation> <translation id="4097406557126260163">యాప్లు, ఎక్స్టెన్షన్లు</translation> <translation id="409742781329613461">Chrome కోసం చిట్కాలు</translation> @@ -4834,7 +4832,6 @@ మీ స్మార్ట్ కార్డ్ను ఇన్సర్ట్ చేసి ఉంచమని <ph name="DOMAIN" /> మిమ్మల్ని కోరుతుంది.</translation> <translation id="628352644014831790">4 సెకన్లు</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> సాధారణంగా డౌన్లోడ్ చేయబడలేదు మరియు ప్రమాదకరమైనది కావచ్చు.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{మీ నెట్వర్క్లోని కొత్త ప్రింటర్}other{మీ నెట్వర్క్లోని కొత్త ప్రింటర్లు}}</translation> <translation id="6285770818046456882">మీతో షేర్ చేస్తున్న పరికరం బదిలీని రద్దు చేసింది</translation> <translation id="6290613030083731160">సమీపంలోని షేర్ అవుతున్న పరికరాలు ఏవీ అందుబాటులో లేవు. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="6291086328725007688">యాక్టివేషన్ కోడ్ను వెరిఫై చేస్తోంది. దీనికి కొన్ని నిమిషాలు పట్టవచ్చు.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 97d1a6f..8eb182d 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">เลิกจับคู่อุปกรณ์บลูทูธ</translation> <translation id="1651008383952180276">คุณต้องป้อนรหัสผ่านเดียวกัน 2 ครั้ง</translation> <translation id="1652326691684645429">เปิดใช้การแชร์ใกล้เคียง</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{เพิ่มเครื่องพิมพ์ลงใน Google Cloud Print เพื่อให้คุณสามารถพิมพ์ได้จากทุกที่}other{เพิ่มเครื่องพิมพ์ # เครื่องลงใน Google Cloud Print เพื่อให้คุณสามารถพิมพ์ได้จากทุกที่}}</translation> <translation id="1653631694606464309">โดยปกติเว็บแอปจะขอเปิดไฟล์บางประเภทเพื่อให้คุณใช้ไฟล์เหล่านั้นในที่ที่ต้องการได้ เช่น เปิดเอกสารในตัวประมวลผลคำ</translation> <translation id="1656528038316521561">ความทึบแสงของพื้นหลัง</translation> <translation id="1657406563541664238">ช่วยปรับปรุง <ph name="PRODUCT_NAME" /> ให้ดีขึ้นโดยการส่งสถิติการใช้งานและรายงานปัญหาไปยัง Google โดยอัตโนมัติ</translation> @@ -2903,7 +2902,6 @@ <translation id="4094647278880271855">คุณใช้ตัวแปรสภาพแวดล้อมที่ระบบไม่รองรับ: <ph name="BAD_VAR" /> ซึ่งจะส่งผลต่อความเสถียรและความปลอดภัย</translation> <translation id="4095264805865317199">เปิด UI การเปิดใช้งานเครือข่ายมือถือ</translation> <translation id="4095507791297118304">การแสดงผลหลัก</translation> -<translation id="409579654357498729">เพิ่มไปยัง Cloud Print</translation> <translation id="4096508467498758490">ปิดส่วนขยายโหมดนักพัฒนาซอฟต์แวร์</translation> <translation id="4097406557126260163">แอปและส่วนขยาย</translation> <translation id="409742781329613461">เคล็ดลับสำหรับ Chrome</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">โฟลเดอร์ที่แชร์ใน Linux</translation> <translation id="5794786537412027208">ปิดแอป Chrome ทั้งหมด</translation> <translation id="5797070761912323120">Google อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ของ Google ให้เข้ากับคุณ</translation> +<translation id="5797521893972859201">ล้างประวัติการเข้าชม รวมถึงสิ่งที่อยู่ในช่องค้นหา</translation> <translation id="5798079537501238810">เว็บไซต์ติดตั้งเครื่องจัดการการชำระเงินได้</translation> <translation id="579907812742603813">เนื้อหาที่มีการคุ้มครอง</translation> <translation id="579915268381781820">นำคีย์ความปลอดภัยออกแล้ว</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">รูปภาพ Google โปรไฟล์</translation> <translation id="590036993063074298">รายละเอียดคุณภาพการมิเรอร์</translation> <translation id="5901069264981746702">ข้อมูลลายนิ้วมือจะจัดเก็บไว้อย่างปลอดภัยและอยู่ใน <ph name="DEVICE_TYPE" /> ของคุณเสมอ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">เปลี่ยนเป็นแท็บที่ใช้จับภาพ</translation> <translation id="5901494423252125310">ฝาเครื่องพิมพ์เปิดอยู่</translation> <translation id="5901630391730855834">สีเหลือง</translation> <translation id="5904614460720589786">ตั้งค่า <ph name="APP_NAME" /> ไม่ได้เนื่องจากมีปัญหาเกี่ยวกับการกำหนดค่า โปรดติดต่อผู้ดูแลระบบ รหัสข้อผิดพลาด: <ph name="ERROR_CODE" /></translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">ส่วนขยาย "<ph name="EXTENSION_NAME" />" ได้เข้าควบคุมการตั้งค่าพร็อกซีของคุณ ซึ่งหมายความว่าส่วนขยายนี้จะสามารถเปลี่ยนแปลง ทำให้เสียหาย หรือดักฟังทุกอย่างที่คุณทำทางออนไลน์ได้ หากคุณไม่แน่ใจว่าการเปลี่ยนแปลงนี้เกิดขึ้นได้อย่างไร คุณอาจไม่ต้องการส่วนขยายนี้</translation> <translation id="6198102561359457428">ออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง...</translation> <translation id="6198252989419008588">เปลี่ยน PIN</translation> +<translation id="6200047250927636406">ทิ้งไฟล์</translation> <translation id="6202304368170870640">คุณใช้ PIN เพื่อลงชื่อเข้าใช้หรือปลดล็อกอุปกรณ์ได้</translation> <translation id="6206311232642889873">คัดลอ&กรูปภาพ</translation> <translation id="6207200176136643843">รีเซ็ตเป็นระดับการซูมเริ่มต้น</translation> @@ -4819,7 +4820,6 @@ คุณต้องเสียบสมาร์ทการ์ดไว้ตลอดเพื่อให้ใช้งาน <ph name="DOMAIN" /> ต่อไปได้</translation> <translation id="628352644014831790">4 วินาที</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ไม่ได้ถูกดาวน์โหลดตามปกติและอาจเป็นอันตราย</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{เครื่องพิมพ์ใหม่บนเครือข่ายของคุณ}other{เครื่องพิมพ์ใหม่บนเครือข่ายของคุณ}}</translation> <translation id="6285770818046456882">อุปกรณ์ที่กำลังแชร์เนื้อหากับคุณยกเลิกการโอนแล้ว</translation> <translation id="6290613030083731160">ไม่มีอุปกรณ์ที่กำลังแชร์อยู่ใกล้เคียง <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="6291086328725007688">กำลังตรวจสอบรหัสเปิดใช้งาน การดำเนินการนี้อาจใช้เวลาสักครู่</translation> @@ -5302,6 +5302,7 @@ <translation id="6831043979455480757">แปลภาษา</translation> <translation id="6833479554815567477">แท็บถูกนำออกจากกลุ่ม <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">เปลี่ยนเป็นเบราว์เซอร์ที่มีประสิทธิภาพและปลอดภัย</translation> +<translation id="6834652994408928492">โหมดมืดจะเปิดโดยอัตโนมัติเมื่อพระอาทิตย์ตก</translation> <translation id="683540480453879381">เปิดไฟล์ <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">โปรดเชื่อมต่ออินเทอร์เน็ตเพื่ออัปเดต <ph name="DEVICE_TYPE" /></translation> <translation id="6838034009068684089">ถามเมื่อเว็บไซต์ต้องการเปิดและวางหน้าต่างบนหน้าจอ (แนะนำ)</translation> @@ -6014,6 +6015,7 @@ <translation id="7622114377921274169">กำลังชาร์จ</translation> <translation id="7622768823216805500">โดยปกติแล้วเว็บไซต์จะติดตั้งเครื่องจัดการการชำระเงินเพื่อดำเนินการตามฟีเจอร์สำหรับช็อปปิ้ง เช่น การชำระเงินสะดวกขึ้น</translation> <translation id="7622903810087708234">รายละเอียดของรหัสผ่าน</translation> +<translation id="7622966771025050155">เปลี่ยนเป็นแท็บที่ถูกจับภาพ</translation> <translation id="7624337243375417909">ปิด Caps Lock</translation> <translation id="7625568159987162309">ดูสิทธิ์และข้อมูลที่จัดเก็บในเว็บไซต์</translation> <translation id="7628201176665550262">อัตราการรีเฟรช</translation> @@ -6180,6 +6182,7 @@ <translation id="7784067724422331729">การตั้งค่าความปลอดภัยในคอมพิวเตอร์ของคุณบล็อกไฟล์นี้</translation> <translation id="7784796923038949829">อ่านหรือเปลี่ยนแปลงข้อมูลของเว็บไซต์ไม่ได้</translation> <translation id="778480864305029524">เปิดการแจ้งเตือนสำหรับบริการ Google Play เพื่อใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแบบด่วน</translation> +<translation id="7785471469930192436">ดูวิธีลบประวัติการค้นหา (หากมี) ของเครื่องมือค้นหาที่คุณใช้</translation> <translation id="7786889348652477777">โ&หลดแอปซ้ำ</translation> <translation id="7787308148023287649">แสดงบนหน้าจออื่น</translation> <translation id="7788298548579301890">โปรแกรมอื่นในคอมพิวเตอร์ได้เพิ่มแอปที่อาจเปลี่ยนลักษณะการทำงานของ Chrome @@ -6791,6 +6794,7 @@ <translation id="8438566539970814960">ปรับปรุงการค้นหาและการท่องเว็บให้ดียิ่งขึ้น</translation> <translation id="8439506636278576865">เสนอที่จะแปลหน้าต่างๆ ที่เป็นภาษานี้</translation> <translation id="8440630305826533614">แอป Linux</translation> +<translation id="8446225304314102060">เปลี่ยนเป็นแท็บ <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">ดูข้อมูลเพิ่มเติม</translation> <translation id="8447409163267621480">รวมปุ่ม Ctrl หรือ Alt</translation> <translation id="8448729345478502352">ทำให้รายการในหน้าจอมีขนาดเล็กลงหรือใหญ่ขึ้น</translation> @@ -7451,6 +7455,7 @@ <translation id="9148058034647219655">ออก</translation> <translation id="9148126808321036104">ลงชื่อเข้าใช้อีกครั้ง</translation> <translation id="9148963623915467028">เว็บไซต์นี้เข้าถึงตำแหน่งของคุณได้</translation> +<translation id="9149529198050266366">โหมดมืดจะปิดโดยอัตโนมัติเมื่อพระอาทิตย์ขึ้น</translation> <translation id="9149866541089851383">แก้ไข...</translation> <translation id="9150045010208374699">ใช้กล้องถ่ายรูปของคุณ</translation> <translation id="9150079578948279438">นำโปรไฟล์ออกไม่ได้ โปรดลองอีกครั้งหรือติดต่อผู้ให้บริการเพื่อรับการสนับสนุนด้านเทคนิค</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index b4ab964..2df6bab4 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">Bluetooth cihazı ile eşlemeyi kaldır</translation> <translation id="1651008383952180276">Aynı parolayı iki kez girmelisiniz</translation> <translation id="1652326691684645429">Yakındakilerle Paylaş'ı etkinleştir</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{İstediğiniz yerden yazdırma işlemi yapabilmek için yazıcıyı Google Cloud Print'e ekleyin.}other{İstediğiniz yerden yazdırma işlemi yapabilmek için # yazıcıyı Google Cloud Print'e ekleyin.}}</translation> <translation id="1653631694606464309">Web uygulamaları, genellikle belirli dosya türlerini açmak ister. Böylece, bu dosyalar üzerinde (dokümanlarınızı tercih ettiğiniz kelime işlemcide açmak gibi) istediğiniz yerde çalışabilirsiniz.</translation> <translation id="1656528038316521561">Arka plan opaklığı</translation> <translation id="1657406563541664238">Google'a otomatik olarak kullanım istatistikleri ve kilitlenme raporları göndererek <ph name="PRODUCT_NAME" /> ürününü iyileştirmemize yardımcı olun.</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">Desteklenmeyen bir ortam değişkeni kullanıyorsunuz: <ph name="BAD_VAR" />. Kararlılık ve güvenlikle ilgili sorun olacaktır.</translation> <translation id="4095264805865317199">Hücresel Etkinleştirme Kullanıcı Arayüzü'nü Aç</translation> <translation id="4095507791297118304">Birincil ekran</translation> -<translation id="409579654357498729">Google Cloud Print'e ekle</translation> <translation id="4096508467498758490">Geliştirici modu uzantılarını devre dışı bırakın</translation> <translation id="4097406557126260163">Uygulamalar ve uzantılar</translation> <translation id="409742781329613461">Chrome için ipuçları</translation> @@ -4379,6 +4377,7 @@ <translation id="5794700615121138172">Linux paylaşılan klasörler</translation> <translation id="5794786537412027208">Tüm Chrome Uygulamalarından Çık</translation> <translation id="5797070761912323120">Google; Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation> +<translation id="5797521893972859201">Arama kutusu da dahil olmak üzere geçmişi temizler</translation> <translation id="5798079537501238810">Siteler ödeme işleyici yükleyebilir</translation> <translation id="579907812742603813">korunan içerik</translation> <translation id="579915268381781820">Güvenlik anahtarınız takılı değil.</translation> @@ -4462,6 +4461,7 @@ <translation id="5900302528761731119">Google Profil fotoğrafı</translation> <translation id="590036993063074298">Yansıtma Kalitesi Ayrıntıları</translation> <translation id="5901069264981746702">Parmak izi verileriniz güvenli şekilde depolanır ve her zaman <ph name="DEVICE_TYPE" /> cihazınızda tutulur. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Yakalama sekmesine geç</translation> <translation id="5901494423252125310">Yazıcı kapağı açık</translation> <translation id="5901630391730855834">Sarı</translation> <translation id="5904614460720589786">Yapılandırma sorunu nedeniyle <ph name="APP_NAME" /> kurulumu yapılamadı. Lütfen yöneticinizle görüşün. Hata kodu: <ph name="ERROR_CODE" />.</translation> @@ -4734,6 +4734,7 @@ <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" uzantısı proxy ayarlarınızın denetimini ele geçirdi. Bu, uzantının çevrimiçinde yaptıklarınızı değiştirebileceği, kesebileceği veya dinleyebileceği anlamına gelir. Bu değişikliğin neden gerçekleştiğinden emin değilseniz muhtemelen bu değişikliği yapmayı istememişsinizdir.</translation> <translation id="6198102561359457428">Oturumu kapatıp tekrar açın...</translation> <translation id="6198252989419008588">PIN'i değiştir</translation> +<translation id="6200047250927636406">Dosyayı sil</translation> <translation id="6202304368170870640">Cihazınızda oturum açmak veya cihazınızın kilidini açmak için PIN'inizi kullanabilirsiniz.</translation> <translation id="6206311232642889873">Resmi Kop&yala</translation> <translation id="6207200176136643843">Varsayılan yakınlaştırma seviyesine sıfırla</translation> @@ -4819,7 +4820,6 @@ <ph name="DOMAIN" />, akıllı kartınızın takılı kalmasını gerektiriyor.</translation> <translation id="628352644014831790">4 saniye</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> yaygın indirilen bir öğe değil, tehlikeli olabilir.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ağınızda yeni yazıcı}other{Ağınızda yeni yazıcılar}}</translation> <translation id="6285770818046456882">Sizinle içerik paylaşan cihaz aktarımı iptal etti</translation> <translation id="6290613030083731160">Yakında paylaşımda bulunan cihaz yok. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Etkinleştirme kodu doğrulanıyor. Bu işlem birkaç dakika sürebilir.</translation> @@ -5301,6 +5301,7 @@ <translation id="6831043979455480757">Çevir</translation> <translation id="6833479554815567477">Sekme, <ph name="GROUP_NAME" /> adlı gruptan kaldırıldı - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Akıllı ve güvenli bir tarayıcıya geç</translation> +<translation id="6834652994408928492">Koyu mod, güneş battığında otomatik olarak açılır</translation> <translation id="683540480453879381"><ph name="FILE_EXTENSIONS" /> dosyalarını açmak</translation> <translation id="6835762382653651563"><ph name="DEVICE_TYPE" /> cihazınızı güncellemek için lütfen İnternet'e bağlanın.</translation> <translation id="6838034009068684089">Bir site ekranlarımda pencereler açıp yerleştirmek istediğinde sor (önerilir)</translation> @@ -6013,6 +6014,7 @@ <translation id="7622114377921274169">Şarj oluyor.</translation> <translation id="7622768823216805500">Daha kolay ödeme gibi alışveriş özelliklerinin kullanılması için siteler genellikle ödeme işleyiciler yükler</translation> <translation id="7622903810087708234">Şifre ayrıntıları</translation> +<translation id="7622966771025050155">Yakalanan sekmeye geç</translation> <translation id="7624337243375417909">caps lock kapalı</translation> <translation id="7625568159987162309">İzinleri ve sitelerde depolanan verileri göster</translation> <translation id="7628201176665550262">Yenileme Hızı</translation> @@ -6179,6 +6181,7 @@ <translation id="7784067724422331729">Bilgisayarınızdaki güvenlik ayarları bu dosyayı engelledi.</translation> <translation id="7784796923038949829">Sitenin verileri okunamıyor veya değiştirilemiyor</translation> <translation id="778480864305029524">Anında Tethering'i kullanmak için Google Play Hizmetleri bildirimlerini açın.</translation> +<translation id="7785471469930192436">Arama geçmişinizi silmek için arama motorunuzun bununla ilgili talimatlarını (varsa) inceleyin</translation> <translation id="7786889348652477777">&Uygulamayı Yeniden Yükle</translation> <translation id="7787308148023287649">Başka bir ekranda görüntüle</translation> <translation id="7788298548579301890">Bilgisayarınızdaki başka bir program, Chrome'un çalışma şeklini değiştirebilecek bir uygulama ekledi. @@ -6789,6 +6792,7 @@ <translation id="8438566539970814960">Aramaları ve göz atmayı daha iyi yap</translation> <translation id="8439506636278576865">Bu dildeki sayfaları çevirmeyi öner</translation> <translation id="8440630305826533614">Linux uygulamaları</translation> +<translation id="8446225304314102060"><ph name="TAB_ORIGIN" /> sekmesine geç</translation> <translation id="8446884382197647889">Daha Fazla Bilgi Edinin</translation> <translation id="8447409163267621480">Ctrl veya Alt tuşunu ekleyin</translation> <translation id="8448729345478502352">Ekranınızdaki öğeleri küçültün veya büyütün</translation> @@ -7450,6 +7454,7 @@ <translation id="9148058034647219655">Çıkış</translation> <translation id="9148126808321036104">Tekrar oturum açın</translation> <translation id="9148963623915467028">Bu site konumunuza erişebilir.</translation> +<translation id="9149529198050266366">Koyu mod, güneş doğduğunda otomatik olarak kapatılır</translation> <translation id="9149866541089851383">Düzenle...</translation> <translation id="9150045010208374699">Kameranızı kullanma</translation> <translation id="9150079578948279438">Profil kaldırılamadı. Lütfen tekrar deneyin veya teknik destek için operatörünüzle iletişime geçin.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 178f21e5..d860ee14 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -619,7 +619,6 @@ <translation id="164936512206786300">Відключити пристрій Bluetooth</translation> <translation id="1651008383952180276">Потрібно двічі ввести однакову парольну фразу</translation> <translation id="1652326691684645429">Увімкнути функцію "Передавання поблизу"</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Додайте принтер у Google Cloud Print, щоб друкувати з будь-якого пристрою.}one{Додайте # принтер у Google Cloud Print, щоб друкувати з будь-якого пристрою.}few{Додайте # принтери в Google Cloud Print, щоб друкувати з будь-якого пристрою.}many{Додайте # принтерів у Google Cloud Print, щоб друкувати з будь-якого пристрою.}other{Додайте # принтера в Google Cloud Print, щоб друкувати з будь-якого пристрою.}}</translation> <translation id="1653631694606464309">Веб-додатки зазвичай просять дозвіл відкривати певні типи файлів, щоб ви могли працювати з ними в зручному для вас додатку</translation> <translation id="1656528038316521561">Прозорість фону</translation> <translation id="1657406563541664238">Допоможіть покращити <ph name="PRODUCT_NAME" />, автоматично надсилаючи статистику використання та звіти про аварійне завершення роботи в Google</translation> @@ -2921,7 +2920,6 @@ <translation id="4094647278880271855">Використовується непідтримувана змінна середовища: <ph name="BAD_VAR" />. Це погано вплине на стабільність і безпеку.</translation> <translation id="4095264805865317199">Відкрити інтерфейс активації мобільної мережі</translation> <translation id="4095507791297118304">Основний дисплей</translation> -<translation id="409579654357498729">Додати в Cloud Print</translation> <translation id="4096508467498758490">Вимкнути розширення в режимі розробника</translation> <translation id="4097406557126260163">Додатки та розширення</translation> <translation id="409742781329613461">Поради для Chrome</translation> @@ -4398,6 +4396,7 @@ <translation id="5794700615121138172">Спільні папки Linux</translation> <translation id="5794786537412027208">Вийти з усіх додатків Chrome</translation> <translation id="5797070761912323120">Google може використовувати вашу історію, щоб персоналізувати Пошук, оголошення й інші сервіси Google</translation> +<translation id="5797521893972859201">Буде очищено історію, зокрема в полі пошуку</translation> <translation id="5798079537501238810">Сайти можуть установлювати обробники платежів</translation> <translation id="579907812742603813">захищений контент</translation> <translation id="579915268381781820">Ключ безпеки вилучено.</translation> @@ -4481,6 +4480,7 @@ <translation id="5900302528761731119">Фото профілю Google</translation> <translation id="590036993063074298">Відомості про якість трансляції</translation> <translation id="5901069264981746702"><ph name="DEVICE_TYPE" /> надійно зберігатиме дані про відбиток пальця та нікуди не надсилатиме їх. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Перейти на вкладку, яка записує</translation> <translation id="5901494423252125310">Кришка принтера відкрита</translation> <translation id="5901630391730855834">Жовтий</translation> <translation id="5904614460720589786">Не вдалося налаштувати додаток <ph name="APP_NAME" /> через проблему з конфігурацією. Зв'яжіться з адміністратором. Код помилки: <ph name="ERROR_CODE" />.</translation> @@ -4753,6 +4753,7 @@ <translation id="6196854373336333322">Розширення "<ph name="EXTENSION_NAME" />" керує налаштуваннями проксі-сервера, тобто може змінювати та переривати будь-які ваші дії онлайн, а також стежити за ними. Якщо ви не знаєте причини такої зміни, імовірно, вона небажана.</translation> <translation id="6198102561359457428">Вийти, а потім увійти знову...</translation> <translation id="6198252989419008588">Змінити PIN-код</translation> +<translation id="6200047250927636406">Відхилити файл</translation> <translation id="6202304368170870640">За допомогою PIN-коду ви можете входити в обліковий запис або розблоковувати пристрій.</translation> <translation id="6206311232642889873">Копіюват&и зображення</translation> <translation id="6207200176136643843">Відновити масштаб за умовчанням</translation> @@ -4838,7 +4839,6 @@ Домен <ph name="DOMAIN" /> вимагає, щоб ви не виймали розумну картку.</translation> <translation id="628352644014831790">4 секунди</translation> <translation id="6285120108426285413">Файл <ph name="FILE_NAME" /> рідко завантажують. Він може бути небезпечним.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Новий принтер у вашій мережі}one{Нові принтери у вашій мережі}few{Нові принтери у вашій мережі}many{Нові принтери у вашій мережі}other{Нові принтери у вашій мережі}}</translation> <translation id="6285770818046456882">Відправник скасував передачу даних</translation> <translation id="6290613030083731160">Неподалік немає пристроїв, з якими можна обмінюватися даними. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Триває перевірка коду активації. Це може зайняти кілька хвилин.</translation> @@ -5321,6 +5321,7 @@ <translation id="6831043979455480757">Перекласти</translation> <translation id="6833479554815567477">Вкладку видалено з групи "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Виберіть розумний і безпечний веб-переглядач</translation> +<translation id="6834652994408928492">Темний режим увімкнеться автоматично після заходу сонця</translation> <translation id="683540480453879381">Відкрити файли <ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Щоб оновити свій <ph name="DEVICE_TYPE" />, під’єднайтеся до Інтернету.</translation> <translation id="6838034009068684089">Запитувати, коли сайт хоче відкрити й розмістити вікна на ваших екранах (рекомендовано)</translation> @@ -6033,6 +6034,7 @@ <translation id="7622114377921274169">Заряджається.</translation> <translation id="7622768823216805500">Сайти зазвичай встановлюють обробники платежів для таких функцій покупок, як простіша оплата</translation> <translation id="7622903810087708234">Дані про пароль</translation> +<translation id="7622966771025050155">Перейти на записану вкладку</translation> <translation id="7624337243375417909">Caps Lock вимкнено</translation> <translation id="7625568159987162309">Переглянути дозволи й дані, збережені на сайтах</translation> <translation id="7628201176665550262">Частота оновлення</translation> @@ -6199,6 +6201,7 @@ <translation id="7784067724422331729">Цей файл заблоковано налаштуваннями безпеки на вашому комп’ютері.</translation> <translation id="7784796923038949829">Не вдається переглянути або змінити дані сайту</translation> <translation id="778480864305029524">Щоб використовувати миттєву точку доступу, увімкніть сповіщення для сервісів Google Play.</translation> +<translation id="7785471469930192436">Перегляньте вказівки пошукової системи щодо того, як видалити історію пошуку (якщо вона є)</translation> <translation id="7786889348652477777">&Перезавантажити додаток</translation> <translation id="7787308148023287649">Показати на іншому екрані</translation> <translation id="7788298548579301890">Інша програма на вашому комп’ютері встановила додаток, який може впливати на роботу Chrome. @@ -6811,6 +6814,7 @@ <translation id="8438566539970814960">Покращувати пошук і веб-перегляд</translation> <translation id="8439506636278576865">Пропонувати переклад сторінок цією мовою</translation> <translation id="8440630305826533614">Додатки Linux</translation> +<translation id="8446225304314102060">Перейти на вкладку <ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Докладніше</translation> <translation id="8447409163267621480">Натискайте Ctrl або Alt</translation> <translation id="8448729345478502352">Зменшуйте або збільшуйте елементи на екрані</translation> @@ -7475,6 +7479,7 @@ <translation id="9148058034647219655">Вийти</translation> <translation id="9148126808321036104">Увійти знову</translation> <translation id="9148963623915467028">Цей сайт має доступ до ваших геоданих.</translation> +<translation id="9149529198050266366">Темний режим вимкнеться автоматично на світанку</translation> <translation id="9149866541089851383">Редагувати...</translation> <translation id="9150045010208374699">Використовувати вашу камеру</translation> <translation id="9150079578948279438">Не вдалося вилучити профіль. Повторіть спробу або зв'яжіться з оператором, щоб отримати технічну підтримку.</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index e354712..8513b54 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">بلوٹوتھ آلہ کا جوڑا ختم کریں</translation> <translation id="1651008383952180276">آپ کو وہی پاس فریز دوبار درج کرنا ہوگا</translation> <translation id="1652326691684645429">قریبی آلات کے ساتھ اشتراک فعال کریں</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{پرنٹر کو Google کلاؤڈ پرنٹ میں شامل کریں تاکہ آپ کہیں سے بھی پرنٹ کر سکیں۔}other{# پرنٹرز کو Google کلاؤڈ پرنٹ میں شامل کریں تاکہ آپ کہیں سے بھی پرنٹ کر سکیں۔}}</translation> <translation id="1653631694606464309">ویب ایپس عام طور پر کچھ خاص قسم کی فائلز کو کھولنے کے لئے کہتی ہیں اس لئے آپ ان فائلز پر جہاں چاہیں کام کر سکتے ہیں جیسے اپنے ترجیحی ورڈ پروسیسر میں دستاویزات کھولنا</translation> <translation id="1656528038316521561">پس منظر کا دھندلا پن</translation> <translation id="1657406563541664238">Google کو استعمال کے اعداد و شمار اور کریش رپورٹس خودکار طور پر بھیج کر <ph name="PRODUCT_NAME" /> کو بہتر بنانے میں مدد کریں</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">آپ ماحول کے ایک غیر تعاون یافتہ تغیر کا استعمال کر رہے ہیں: <ph name="BAD_VAR" />۔ استحکام اور سیکیورٹی متاثر ہوگی۔</translation> <translation id="4095264805865317199">سیلولر فعالیت کی UI کھولیں</translation> <translation id="4095507791297118304">بنیادی ڈسپلے</translation> -<translation id="409579654357498729">کلاؤڈ پرنٹ میں شامل کریں</translation> <translation id="4096508467498758490">ڈویلپر وضع کے ایکسٹینشز کو غیر فعال کریں</translation> <translation id="4097406557126260163">ایپس اور ایکسٹینشنز</translation> <translation id="409742781329613461">Chrome کیلئے تجاویز</translation> @@ -4818,7 +4816,6 @@ <ph name="DOMAIN" /> آپ سے اپنا سمارٹ کارڈ داخل کئے رکھنے کا تقاضا کرتا ہے۔</translation> <translation id="628352644014831790">4 سیکنڈز</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> عام طور پر ڈاؤن لوڈ نہیں کی جاتی ہے اور یہ خطرناک ہو سکتی ہے۔</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{آپ کے نیٹ ورک پر نیا پرنٹر}other{آپ کے نیٹ ورک پر نئے پرنٹرز}}</translation> <translation id="6285770818046456882">آپ کے ساتھ اشتراک کرنے والے آلے نے منتقلی کو منسوخ کر دیا</translation> <translation id="6290613030083731160">قریبی اشتراک کرنے والا کوئی بھی آلہ دستیاب نہیں ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="6291086328725007688">فعالیت کے کوڈ کی توثیق کی جا رہی ہے۔ اس میں چند منٹ لگ سکتے ہیں۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index e17226c..597c731c6 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -611,7 +611,6 @@ <translation id="164936512206786300">Bluetooth qurilmani uzish</translation> <translation id="1651008383952180276">Siz kodli iborani ikki marta bir xil kiritishingiz kerak.</translation> <translation id="1652326691684645429">Nearby Share’ni yoqish</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google Virtual printer xizmatiga printer qo‘shing va hujjatlarni istalgan qurilmadan turib chop etishga yuboring.}other{Google Virtual printer xizmatiga # ta printer qo‘shing va hujjatlarni istalgan qurilmadan turib chop etishga yuboring.}}</translation> <translation id="1653631694606464309">Veb ilovalar odatda hujjatlarni maqbul muharrirda ochish singari fayl turlarini ochishga ruxsat soʻraydi</translation> <translation id="1656528038316521561">Orqa fon shaffofligi</translation> <translation id="1657406563541664238">Google’ga foydalanish statistikasi va ishdan chiqish hisobotlarini jo‘natish orqali <ph name="PRODUCT_NAME" />’ni takomillashtirishga yordam bering</translation> @@ -2905,7 +2904,6 @@ <translation id="4094647278880271855">Siz moslanmagan muhit qiymatidan foydalanyapsiz: <ph name="BAD_VAR" />. Barqarorlik va xavfsizlikka zarar tegishi mumkin.</translation> <translation id="4095264805865317199">Mobil tarmoqni faollashtirish interfeysini ochish</translation> <translation id="4095507791297118304">Asosiy ekran</translation> -<translation id="409579654357498729">Virtual printerga qo‘shish</translation> <translation id="4096508467498758490">Dasturchi rejimidagi kengaytmalarni o‘chirib qo‘yish</translation> <translation id="4097406557126260163">Ilova va kengaytmalar</translation> <translation id="409742781329613461">Chrome maslahati</translation> @@ -4825,7 +4823,6 @@ <ph name="DOMAIN" /> smart karta kiritilishini talab qilmoqda.</translation> <translation id="628352644014831790">4 soniya</translation> <translation id="6285120108426285413">“<ph name="FILE_NAME" />” faylini yuklab olish tavsiya etilmaydi, chunki bu fayl kompyuteringiz uchun xavfli bo‘lishi mumkin.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Tarmoqda yangi printer}other{Tarmoqda yangi printerlar}}</translation> <translation id="6285770818046456882">Fayl yuborayotgan qurilma uzatmani bekor qildi</translation> <translation id="6290613030083731160">Atrofda hech qanday qurilma topilmadi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Aktivatsiya kodi tekshirilmoqda. Bu bir necha daqiqa vaqt olishi mumkin.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 25abfae..f3b6d48a 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">Hủy ghép nối thiết bị Bluetooth</translation> <translation id="1651008383952180276">Bạn phải nhập cùng một cụm mật khẩu hai lần</translation> <translation id="1652326691684645429">Bật tính năng Chia sẻ lân cận</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Thêm máy in vào Google Cloud Print để bạn có thể in từ bất cứ đâu.}other{Thêm # máy in vào Google Cloud Print để bạn có thể in từ bất cứ đâu.}}</translation> <translation id="1653631694606464309">Ứng dụng web thường xin phép mở một số loại tệp để bạn có thể thao tác trên các tệp đó ở nơi mình muốn, chẳng hạn như mở tài liệu trong trình xử lý văn bản ưu tiên</translation> <translation id="1656528038316521561">Độ mờ của nền</translation> <translation id="1657406563541664238">Trợ giúp cải thiện <ph name="PRODUCT_NAME" /> bằng cách tự động gửi cho Google thống kê sử dụng và báo cáo sự cố</translation> @@ -2918,7 +2917,6 @@ <translation id="4094647278880271855">Bạn đang dùng một biến môi trường chưa được hỗ trợ: <ph name="BAD_VAR" />. Do đó, tính ổn định và độ bảo mật sẽ bị ảnh hưởng.</translation> <translation id="4095264805865317199">Mở giao diện kích hoạt mạng di động</translation> <translation id="4095507791297118304">Màn hình chính</translation> -<translation id="409579654357498729">Thêm vào Cloud Print</translation> <translation id="4096508467498758490">Vô hiệu hóa tiện ích chế độ nhà phát triển</translation> <translation id="4097406557126260163">Ứng dụng và tiện ích</translation> <translation id="409742781329613461">Mẹo dành cho Chrome</translation> @@ -4835,7 +4833,6 @@ <ph name="DOMAIN" /> yêu cầu bạn không tháo thẻ thông minh.</translation> <translation id="628352644014831790">4 giây</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> thường không được tải xuống và có thể nguy hiểm.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Máy in mới trên mạng của bạn}other{Máy in mới trên mạng của bạn}}</translation> <translation id="6285770818046456882">Thiết bị đang chia sẻ với bạn đã hủy quá trình chuyển tệp</translation> <translation id="6290613030083731160">Không có thiết bị nào ở gần đang chia sẻ với bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Đang xác minh mã kích hoạt. Quá trình này có thể mất vài phút.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 7f50925..5aa75e7 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -610,7 +610,6 @@ <translation id="164936512206786300">取消与蓝牙设备配对</translation> <translation id="1651008383952180276">您两次输入的密码必须相同</translation> <translation id="1652326691684645429">启用“附近分享”功能</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{请将该打印机添加到 Google 云打印,以便您可以随时随地进行打印。}other{请将 # 台打印机添加到 Google 云打印,以便您可以随时随地进行打印。}}</translation> <translation id="1653631694606464309">Web 应用通常会请求打开某些类型的文件,以便您能在所需程序中处理这些文件,例如在首选的文字处理程序中打开文档</translation> <translation id="1656528038316521561">背景不透明度</translation> <translation id="1657406563541664238">将使用情况统计信息和崩溃报告自动发送给 Google,帮助我们完善 <ph name="PRODUCT_NAME" /></translation> @@ -2898,7 +2897,6 @@ <translation id="4094647278880271855">您使用了不受支持的环境变量:<ph name="BAD_VAR" />。稳定性和安全性会有所下降。</translation> <translation id="4095264805865317199">打开移动网络激活界面</translation> <translation id="4095507791297118304">主显示屏</translation> -<translation id="409579654357498729">添加到云打印</translation> <translation id="4096508467498758490">请停用以开发者模式运行的扩展程序</translation> <translation id="4097406557126260163">应用和扩展程序</translation> <translation id="409742781329613461">Chrome 使用提示</translation> @@ -4814,7 +4812,6 @@ <ph name="DOMAIN" /> 要求您使智能卡保持插入状态。</translation> <translation id="628352644014831790">4 秒</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> 的下载方式实属异常,因此它可能存在危险。</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{您的网络中有 1 台新打印机}other{您的网络中有多台新打印机}}</translation> <translation id="6285770818046456882">正与您分享内容的设备取消了传输</translation> <translation id="6290613030083731160">附近没有正在分享内容的设备。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="6291086328725007688">正在验证激活码。这可能需要几分钟的时间。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index c8b73b3..0a00bde 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -616,7 +616,6 @@ <translation id="164936512206786300">取消配對藍牙裝置</translation> <translation id="1651008383952180276">您必須輸入兩次相同的密碼短語</translation> <translation id="1652326691684645429">啟用「咫尺共享」功能</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{將打印機新增至「Google 雲端打印」,即可隨時隨地列印。}other{將 # 部打印機新增至「Google 雲端打印」,即可隨時隨地列印。}}</translation> <translation id="1653631694606464309">網絡應用程式通常會要求開啟特定類型的檔案,讓您以適當方式處理這些檔案,例如在偏好的文書處理工具中開啟文件</translation> <translation id="1656528038316521561">背景透明度</translation> <translation id="1657406563541664238">將使用統計資料及當機報告自動傳送給 Google,助我們一臂之力,讓 <ph name="PRODUCT_NAME" /> 更臻完美</translation> @@ -2917,7 +2916,6 @@ <translation id="4094647278880271855">您使用的環境變數 (<ph name="BAD_VAR" />) 目前不受支援,有可能會影響穩定性和安全性。</translation> <translation id="4095264805865317199">開啟流動網絡啟用使用者介面</translation> <translation id="4095507791297118304">主要顯示屏</translation> -<translation id="409579654357498729">新增至雲端列印</translation> <translation id="4096508467498758490">停用開發人員模式擴充功能</translation> <translation id="4097406557126260163">應用程式和擴充程式</translation> <translation id="409742781329613461">Chrome 提示</translation> @@ -4394,6 +4392,7 @@ <translation id="5794700615121138172">Linux 共用資料夾</translation> <translation id="5794786537412027208">結束所有 Chrome 應用程式</translation> <translation id="5797070761912323120">Google 可能會使用您的記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務</translation> +<translation id="5797521893972859201">清除記錄 (包括搜尋框中的記錄)</translation> <translation id="5798079537501238810">網站可安裝付款處理常式</translation> <translation id="579907812742603813">受保護的內容</translation> <translation id="579915268381781820">您的安全密鑰已被移除。</translation> @@ -4477,6 +4476,7 @@ <translation id="5900302528761731119">Google 個人檔案相片</translation> <translation id="590036993063074298">鏡像品質詳情</translation> <translation id="5901069264981746702">系統會妥善地將您的指紋資料儲存在 <ph name="DEVICE_TYPE" /> 上,絕不會外洩。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">切換至目前擷取的分頁</translation> <translation id="5901494423252125310">打印機的外蓋應關上</translation> <translation id="5901630391730855834">黃色</translation> <translation id="5904614460720589786">設定發生問題,因此無法設定 <ph name="APP_NAME" />。請聯絡您的管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation> @@ -4749,6 +4749,7 @@ <translation id="6196854373336333322">您的 Proxy 設定已受到擴充功能「<ph name="EXTENSION_NAME" />」控制,該擴充功能可變更、中斷、或監視您在網上的行為。如果您不確定這項變更為何發生,建議您停用該擴充功能。</translation> <translation id="6198102561359457428">登出然後再次登入…</translation> <translation id="6198252989419008588">變更 PIN</translation> +<translation id="6200047250927636406">捨棄檔案</translation> <translation id="6202304368170870640">您可使用 PIN 登入或解鎖裝置。</translation> <translation id="6206311232642889873">複製圖片(&Y)</translation> <translation id="6207200176136643843">重設為預設縮放等級</translation> @@ -4834,7 +4835,6 @@ <ph name="DOMAIN" /> 需要您繼續插入智能卡。</translation> <translation id="628352644014831790">4 秒</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> 不常下載,代表此檔案可能不安全。</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{您網絡上的新打印機}other{您網絡上的新打印機}}</translation> <translation id="6285770818046456882">正在與您分享的裝置現已取消傳輸</translation> <translation id="6290613030083731160">附近沒有可分享內容的裝置。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6291086328725007688">正在驗證啟動碼。這項操作可能需時數分鐘。</translation> @@ -5317,6 +5317,7 @@ <translation id="6831043979455480757">翻譯</translation> <translation id="6833479554815567477">分頁已經由包含「<ph name="GROUP_CONTENTS" />」嘅「<ph name="GROUP_NAME" />」群組度移除</translation> <translation id="683373380308365518">改用智能且安全的瀏覽器</translation> +<translation id="6834652994408928492">「暗光模式」會在日落時自動開啟</translation> <translation id="683540480453879381">開啟 <ph name="FILE_EXTENSIONS" /> 檔案</translation> <translation id="6835762382653651563">請連接互聯網以更新 <ph name="DEVICE_TYPE" />。</translation> <translation id="6838034009068684089">在網站要求在您的螢幕上開啟並放置視窗時詢問您 (建議)</translation> @@ -6029,6 +6030,7 @@ <translation id="7622114377921274169">正在充電。</translation> <translation id="7622768823216805500">網站通常會安裝付款處理常式以提供購物功能,例如較易結帳</translation> <translation id="7622903810087708234">密碼詳情</translation> +<translation id="7622966771025050155">切換至已擷取的分頁</translation> <translation id="7624337243375417909">大寫鎖定已關閉</translation> <translation id="7625568159987162309">查看所有網站的權限和資料</translation> <translation id="7628201176665550262">重新整理頻率</translation> @@ -6195,6 +6197,7 @@ <translation id="7784067724422331729">您的電腦安全性設定封鎖了這個檔案。</translation> <translation id="7784796923038949829">無法讀取或變更網站資料</translation> <translation id="778480864305029524">如要使用即時網絡共享功能,請開啟「Google Play 服務」的通知功能。</translation> +<translation id="7785471469930192436">建議您查看搜尋引擎的搜尋記錄刪除指示 (如有)</translation> <translation id="7786889348652477777">重新載入應用程式(&R)</translation> <translation id="7787308148023287649">在另一個螢幕上顯示</translation> <translation id="7788298548579301890">電腦中的其他程式新增了一個應用程式,可能會變更 Chrome 的運作方式。 @@ -6807,6 +6810,7 @@ <translation id="8438566539970814960">改善搜尋和瀏覽體驗</translation> <translation id="8439506636278576865">翻譯這個語言的網頁</translation> <translation id="8440630305826533614">Linux 應用程式</translation> +<translation id="8446225304314102060">切換至 <ph name="TAB_ORIGIN" /> 分頁</translation> <translation id="8446884382197647889">瞭解詳情</translation> <translation id="8447409163267621480">必須以 Ctrl 或 Alt 鍵開頭</translation> <translation id="8448729345478502352">縮小或放大畫面上的項目</translation> @@ -7468,6 +7472,7 @@ <translation id="9148058034647219655">結束</translation> <translation id="9148126808321036104">重新登入</translation> <translation id="9148963623915467028">此網站可存取您的位置。</translation> +<translation id="9149529198050266366">「暗光模式」會在日出時自動關閉</translation> <translation id="9149866541089851383">編輯…</translation> <translation id="9150045010208374699">使用您的相機。</translation> <translation id="9150079578948279438">無法移除設定檔。請再試一次,或聯絡您的流動網絡供應商以獲取技術支援。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 9fd9555..1d3b7a7 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -613,7 +613,6 @@ <translation id="164936512206786300">取消配對藍牙裝置</translation> <translation id="1651008383952180276">你必須輸入兩次相同的通關密語</translation> <translation id="1652326691684645429">啟用鄰近分享功能</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{將這台印表機新增至 Google 雲端列印,即可隨時隨地進行列印。}other{將 # 台印表機新增至 Google 雲端列印,即可隨時隨地進行列印。}}</translation> <translation id="1653631694606464309">網頁應用程式通常會要求開啟裝置上特定類型的檔案,讓你能夠以適當方式處理這些檔案,例如在偏好的文書處理工具中開啟文件</translation> <translation id="1656528038316521561">背景不透明度</translation> <translation id="1657406563541664238">只要自動傳送使用統計資料及當機報告給 Google,就能助我們一臂之力,讓「<ph name="PRODUCT_NAME" />」更臻完美</translation> @@ -2902,7 +2901,6 @@ <translation id="4094647278880271855">你使用了系統不支援的環境變數 (<ph name="BAD_VAR" />),這會影響穩定性與安全性。</translation> <translation id="4095264805865317199">開啟行動網路啟用 UI</translation> <translation id="4095507791297118304">主要顯示畫面</translation> -<translation id="409579654357498729">新增至雲端列印</translation> <translation id="4096508467498758490">停用開發人員模式擴充功能</translation> <translation id="4097406557126260163">應用程式和擴充功能</translation> <translation id="409742781329613461">Chrome 使用提示</translation> @@ -4378,6 +4376,7 @@ <translation id="5794700615121138172">Linux 共用資料夾</translation> <translation id="5794786537412027208">結束所有 Chrome 應用程式</translation> <translation id="5797070761912323120">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務</translation> +<translation id="5797521893972859201">清除歷史記錄,包含搜尋框記錄</translation> <translation id="5798079537501238810">網站可以安裝付款處理常式</translation> <translation id="579907812742603813">受保護內容</translation> <translation id="579915268381781820">你的安全金鑰已移除。</translation> @@ -4461,6 +4460,7 @@ <translation id="5900302528761731119">Google 個人資料相片</translation> <translation id="590036993063074298">鏡像品質詳細資訊</translation> <translation id="5901069264981746702">你的指紋資料會安全地儲存在 <ph name="DEVICE_TYPE" /> 上,絕不會外洩。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">切換至目前擷取的分頁</translation> <translation id="5901494423252125310">印表機的蓋子處於開啟狀態</translation> <translation id="5901630391730855834">黃色</translation> <translation id="5904614460720589786">配置作業發生問題,因此無法設定「<ph name="APP_NAME" />」。請與系統管理員聯絡。錯誤代碼:<ph name="ERROR_CODE" />。</translation> @@ -4733,6 +4733,7 @@ <translation id="6196854373336333322">您的 Proxy 設定已受到擴充功能「<ph name="EXTENSION_NAME" />」控制,該擴充功能可變更、中斷、或監視您在網路上的行為。如果您不確定這項變更的發生原因,建議您停用該擴充功能。</translation> <translation id="6198102561359457428">登出然後再次登入...</translation> <translation id="6198252989419008588">變更 PIN 碼</translation> +<translation id="6200047250927636406">捨棄檔案</translation> <translation id="6202304368170870640">你可以使用 PIN 碼登入裝置,或將裝置解鎖。</translation> <translation id="6206311232642889873">複製圖片(&Y)</translation> <translation id="6207200176136643843">重設為預設縮放等級</translation> @@ -4818,7 +4819,6 @@ <ph name="DOMAIN" /> 需要你插入智慧型卡片,不得拔出。</translation> <translation id="628352644014831790">4 秒</translation> <translation id="6285120108426285413">一般使用者不常下載 <ph name="FILE_NAME" />,代表這個檔案可能不安全。</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{您的網路上有一台新印表機}other{您的網路上有多台新印表機}}</translation> <translation id="6285770818046456882">原本與你分享內容的裝置已取消傳輸作業</translation> <translation id="6290613030083731160">附近沒有可分享內容的裝置。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6291086328725007688">正在驗證啟用代碼。請稍候片刻。</translation> @@ -5301,6 +5301,7 @@ <translation id="6831043979455480757">翻譯</translation> <translation id="6833479554815567477">分頁已從包含「<ph name="GROUP_CONTENTS" />」的「<ph name="GROUP_NAME" />」群組中移除</translation> <translation id="683373380308365518">改用智慧又安全的瀏覽器</translation> +<translation id="6834652994408928492">深色模式會在日落時自動開啟</translation> <translation id="683540480453879381">開啟 <ph name="FILE_EXTENSIONS" /> 檔案</translation> <translation id="6835762382653651563">請連線至網際網路,以更新您的 <ph name="DEVICE_TYPE" />。</translation> <translation id="6838034009068684089">網站必須先詢問你,才能在你的畫面中開啟與放置視窗 (建議)</translation> @@ -6013,6 +6014,7 @@ <translation id="7622114377921274169">充電中。</translation> <translation id="7622768823216805500">網站通常會安裝付款處理常式,以便提供相關的購物功能 (例如更方便的結帳方式)</translation> <translation id="7622903810087708234">密碼詳細資料</translation> +<translation id="7622966771025050155">切換至已擷取的分頁</translation> <translation id="7624337243375417909">大寫鎖定模式已關閉</translation> <translation id="7625568159987162309">查看各網站的權限及儲存的資料</translation> <translation id="7628201176665550262">重新整理頻率</translation> @@ -6179,6 +6181,7 @@ <translation id="7784067724422331729">你的電腦安全性設定封鎖了這個檔案。</translation> <translation id="7784796923038949829">無法讀取或變更網站的資料</translation> <translation id="778480864305029524">如要使用即時網路共用功能,請開啟 Google Play 服務的通知。</translation> +<translation id="7785471469930192436">如要刪除搜尋記錄,請參閱搜尋引擎的相關操作說明 (如果有的話)</translation> <translation id="7786889348652477777">重新載入應用程式(&R)</translation> <translation id="7787308148023287649">在其他螢幕上顯示</translation> <translation id="7788298548579301890">電腦中的其他程式新增了一個應用程式,可能會使 Chrome 的運作方式發生變更。 @@ -6791,6 +6794,7 @@ <translation id="8438566539970814960">改善搜尋和瀏覽體驗</translation> <translation id="8439506636278576865">翻譯這個語言的網頁</translation> <translation id="8440630305826533614">Linux 應用程式</translation> +<translation id="8446225304314102060">切換至 <ph name="TAB_ORIGIN" /> 分頁</translation> <translation id="8446884382197647889">瞭解詳情</translation> <translation id="8447409163267621480">必須包含 Ctrl 或 Alt 鍵</translation> <translation id="8448729345478502352">縮小或放大畫面上的項目</translation> @@ -7452,6 +7456,7 @@ <translation id="9148058034647219655">結束</translation> <translation id="9148126808321036104">重新登入</translation> <translation id="9148963623915467028">這個網站可以存取你的位置資訊。</translation> +<translation id="9149529198050266366">深色模式會在日出時自動關閉</translation> <translation id="9149866541089851383">編輯...</translation> <translation id="9150045010208374699">使用你的相機</translation> <translation id="9150079578948279438">無法移除設定檔。請再試一次,或是向電信業者尋求技術支援。</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 0bc2b1e..ee452e7 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -615,7 +615,6 @@ <translation id="164936512206786300">Susa ukubhangqa idivayisi ye-Bluetooth</translation> <translation id="1651008383952180276">Kuzomele ufake umusho wokungena ofanayo kabili</translation> <translation id="1652326691684645429">Nika Amandla UkuThumela Eduze</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Engeza iphrinta Ekuphrinteni Kwamafu kwe-Google ukuze ukwazi ukuphrinta kusukela noma yikuphi.}one{Engeza amaphrinta angu-# Ekuphrinteni Kwamafu kwe-Google ukuze ukwazi ukuphrinta kusukela noma yikuphi.}other{Engeza amaphrinta angu-# Ekuphrinteni Kwamafu kwe-Google ukuze ukwazi ukuphrinta kusukela noma yikuphi.}}</translation> <translation id="1653631694606464309">Ama-app ewebhu avame ukucela ukuvula izinhlobo ezithile zamafayela ukuze usebenze ngalawo mafayela lapho ufuna, njengokuvula amadokhumenti ngesicubunguli sakho esincanyelwayo se-word</translation> <translation id="1656528038316521561">Ukufiphala kwangemuva</translation> <translation id="1657406563541664238">Siza ukwenza i-<ph name="PRODUCT_NAME" /> ibe ngcono ngokuthumela izibalo zokusetshenziswa nemibiko yokuphahlazeka ku-Google</translation> @@ -2916,7 +2915,6 @@ <translation id="4094647278880271855">Usebenzisa okuhlukile okungasekelwe kwemvelo: <ph name="BAD_VAR" />. Ukuzinza nokuvikelwa kuzolimala.</translation> <translation id="4095264805865317199">Vula i-Cellular Activation UI</translation> <translation id="4095507791297118304">Isiboniso esiyinhloko</translation> -<translation id="409579654357498729">Engeza ekuphrinteni kwamafu</translation> <translation id="4096508467498758490">Khubaza izandiso zemodi yomthuthukisi</translation> <translation id="4097406557126260163">Izinhlelo zokusebenza nezandiso</translation> <translation id="409742781329613461">Amathiphu e-Chrome</translation> @@ -4396,6 +4394,7 @@ <translation id="5794700615121138172">I-Linux yabelane ngamafolda</translation> <translation id="5794786537412027208">Yeka zonke izinhlelo zokusebenza ze-Chrome</translation> <translation id="5797070761912323120">I-Google ingasebenzisa umlando wakho ukuze yenze kube ngokwakho usesho, izikhangiso, namanye amasevisi e-Google</translation> +<translation id="5797521893972859201">Kusula umlando, okufaka phakathi ibhokisi losesho</translation> <translation id="5798079537501238810">Amasayithi angafaka izibambi zenkokhelo</translation> <translation id="579907812742603813">okuqukethwe okuvikelekile</translation> <translation id="579915268381781820">Ukhiye wakho wokuqinisekisa ubunikazi ususiwe.</translation> @@ -4479,6 +4478,7 @@ <translation id="5900302528761731119">Isithombe sephrofayela ye-Google</translation> <translation id="590036993063074298">Ifanisa Imininingwane Yekhwalithi</translation> <translation id="5901069264981746702">Idatha yakho yezigxivizo zeminwe igcinwe ngokuvikelekile futhi ayilokothi ishiye i-<ph name="DEVICE_TYPE" /> yakho. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> +<translation id="5901089233978050985">Shintshela kuthebhu yokuthatha</translation> <translation id="5901494423252125310">Umnyango wephrinta uvuliwe</translation> <translation id="5901630391730855834">Okuliphuzi</translation> <translation id="5904614460720589786">Ayikwazanga ukusetha i-<ph name="APP_NAME" /> ngenxa yenkinga yokulungiselela. Sicela uxhumane nomlawuli wakho. Ikhodi yephutha: <ph name="ERROR_CODE" />.</translation> @@ -4751,6 +4751,7 @@ <translation id="6196854373336333322">Isandiso se-"<ph name="EXTENSION_NAME" />" sithathe ulawulo lwezilungiselelo zakho zommeleli, okusho ukuthi ingaguqula, iphule, noma ilalele kungafanele noma yini oyenza ku-inthanethi. Uma ungaqinisekile ngokuthi kungani lokhu kuguqulwa kwenzekile, kungenzeka ukuthi awukudingi.</translation> <translation id="6198102561359457428">Phuma ngemvume bese ungena ngemvume futhi...</translation> <translation id="6198252989419008588">Guqula iphinikhodi</translation> +<translation id="6200047250927636406">Lahla ifayela</translation> <translation id="6202304368170870640">Ungasebenzisa i-PIN ukuze ungene ngemvume noma uvule idivayisi yakho.</translation> <translation id="6206311232642889873">Kopisha isithombe</translation> <translation id="6207200176136643843">Setha kabusha kuya kuleveli yokusondeza</translation> @@ -4836,7 +4837,6 @@ I-<ph name="DOMAIN" /> idinga ukuba ugcine ikhadi lakho elimsathi lifakiwe.</translation> <translation id="628352644014831790">4 amasekhondi</translation> <translation id="6285120108426285413">I-<ph name="FILE_NAME" /> ayivamisile ukulandwa futhi ingaba yingozi.</translation> -<translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Iphrinta entsha kunethiwekhi yakho}one{Amaphrinta amasha kunethiwekhi yakho}other{Amaphrinta amasha kunethiwekhi yakho}}</translation> <translation id="6285770818046456882">Ukwabelana kwedivayisi kanye nawe kukhansele ukudlulisa</translation> <translation id="6290613030083731160">Awekho amadivayisi atholakalayo abelana eduze. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="6291086328725007688">Iqinisekisa ikhodi yokwenza kusebenze. Lokhu kungathatha imizuzu embalwa.</translation> @@ -5319,6 +5319,7 @@ <translation id="6831043979455480757">Humusha</translation> <translation id="6833479554815567477">Ithebhu isusiwe kuqembu le-<ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="683373380308365518">Shintshela kusiphequluli esihlakaniphile nesiphephile</translation> +<translation id="6834652994408928492">Imodi emnyama izovula ngokuzenzekelayo uma kushona ilanga</translation> <translation id="683540480453879381">Vula amafayela we-<ph name="FILE_EXTENSIONS" /></translation> <translation id="6835762382653651563">Sicela uxhume ku-inthanethi ukuze ubuyekeze i-<ph name="DEVICE_TYPE" /> yakho.</translation> <translation id="6838034009068684089">Buza uma isayithi lifuna ukuvula liphinde libeke amawindi kuzikrini zakho (kuyanconywa)</translation> @@ -6031,6 +6032,7 @@ <translation id="7622114377921274169">Iyashaja.</translation> <translation id="7622768823216805500">Amasayithi avamise ukufaka izibambi zenkokhelo kuzici zokuthenga ezifana nokuphuma okulula</translation> <translation id="7622903810087708234">Imininingwane yephasiwedi</translation> +<translation id="7622966771025050155">Shintshela kuthebhu ethathiwe</translation> <translation id="7624337243375417909">Ofeleba bavaliwe</translation> <translation id="7625568159987162309">Buka izimvume nedatha egcinwe kumasayithi onkana</translation> <translation id="7628201176665550262">Isilinganiso sokuvuselela</translation> @@ -6197,6 +6199,7 @@ <translation id="7784067724422331729">Izilungiselelo zezokuvikela kukhompyutha yakho zivimbele leli fayela.</translation> <translation id="7784796923038949829">Ayikwazi ukufunda noma ukuguqula idatha yesayithi</translation> <translation id="778480864305029524">Ukuze usebenzise ukusebenzisa ifoni njengemodemu okusheshayo, vula izaziso zamasevisi e-Google Play.</translation> +<translation id="7785471469930192436">Bona imiyalelo yenjini yakho yokusesha yokusula umlando wakho wosesho, uma kusebenza</translation> <translation id="7786889348652477777">&Phinda ulayishe uhlelo lokusebenza</translation> <translation id="7787308148023287649">Bonisa kwesinye isikrini</translation> <translation id="7788298548579301890">Olunye uhlelo kukhompuyutha yakho lungeze uhlelo lokusebenza olungaguqula indlela i-Chrome esebenza ngayo. @@ -6808,6 +6811,7 @@ <translation id="8438566539970814960">Yenza usesho nokuphequlula kube ngcono</translation> <translation id="8439506636278576865">Nikezela ngokuhumusha amakhasi ngalolu limi</translation> <translation id="8440630305826533614">Izinhlelo zokusebenza ze-Linux</translation> +<translation id="8446225304314102060">Shintshela kuthebhu ye-<ph name="TAB_ORIGIN" /></translation> <translation id="8446884382197647889">Funda kabanzi</translation> <translation id="8447409163267621480">Faka phakathi noma u-Ctrl noma u-Alt</translation> <translation id="8448729345478502352">Yenza izinto kusikrini sakho zibe zincane noma zibe zinkulu</translation> @@ -7470,6 +7474,7 @@ <translation id="9148058034647219655">Phuma</translation> <translation id="9148126808321036104">Phinda ungene ngemvume</translation> <translation id="9148963623915467028">Leli sayithi lingafinyelela indawo yakho.</translation> +<translation id="9149529198050266366">Imodi emnyama izovala ngokuzenzekelayo lapho kuvela ilanga</translation> <translation id="9149866541089851383">Hlela...</translation> <translation id="9150045010208374699">Sebenzisa ikhamela yakho</translation> <translation id="9150079578948279438">Iphrofayela alikwazanga ukususwa. Sicela uzame futhi noma uxhumane nenkampani yakho yenethiwekhi mayelana nosekelo lobuchwepheshe.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index d4faa4c5..4b15ac4 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1368,6 +1368,7 @@ "profiles/profile_attributes_init_params.h", "profiles/profile_attributes_storage.cc", "profiles/profile_attributes_storage.h", + "profiles/profile_attributes_storage_observer.h", "profiles/profile_avatar_downloader.cc", "profiles/profile_avatar_downloader.h", "profiles/profile_avatar_icon_util.cc", @@ -1379,7 +1380,6 @@ "profiles/profile_downloader_delegate.h", "profiles/profile_impl.cc", "profiles/profile_impl.h", - "profiles/profile_info_cache_observer.h", "profiles/profile_io_data.cc", "profiles/profile_io_data.h", "profiles/profile_keep_alive_types.cc", @@ -1573,6 +1573,8 @@ "sharing/sms/sms_flags.h", "sharing/sms/sms_remote_fetcher.cc", "sharing/sms/sms_remote_fetcher.h", + "sharing/sms/sms_remote_fetcher_metrics.cc", + "sharing/sms/sms_remote_fetcher_metrics.h", "sharing/vapid_key_manager.cc", "sharing/vapid_key_manager.h", "sharing/web_push/json_web_token_util.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 91bab064..57028b3 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3318,6 +3318,10 @@ flag_descriptions::kDeviceDiscoveryNotificationsDescription, kOsDesktop, SINGLE_VALUE_TYPE(switches::kEnableDeviceDiscoveryNotifications)}, #endif // BUILDFLAG(ENABLE_SERVICE_DISCOVERY) + {"enable-webgl-developer-extensions", + flag_descriptions::kWebglDeveloperExtensionsName, + flag_descriptions::kWebglDeveloperExtensionsDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableWebGLDeveloperExtensions)}, {"enable-webgl-draft-extensions", flag_descriptions::kWebglDraftExtensionsName, flag_descriptions::kWebglDraftExtensionsDescription, kOsAll,
diff --git a/chrome/browser/android/browserservices/metrics/BUILD.gn b/chrome/browser/android/browserservices/metrics/BUILD.gn index e17ec1b0..16ba8eb 100644 --- a/chrome/browser/android/browserservices/metrics/BUILD.gn +++ b/chrome/browser/android/browserservices/metrics/BUILD.gn
@@ -8,9 +8,12 @@ sources = [ "java/src/org/chromium/chrome/browser/browserservices/metrics/BrowserServicesTimingMetrics.java", "java/src/org/chromium/chrome/browser/browserservices/metrics/OriginVerifierMetricsRecorder.java", + "java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java", ] deps = [ "//base:base_java", + "//chrome/browser/android/browserservices/constants:java", + "//components/browser_ui/util/android:java", "//third_party/androidx:androidx_annotation_annotation_java", ] }
diff --git a/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java b/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java new file mode 100644 index 0000000..cbc6dc8 --- /dev/null +++ b/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java
@@ -0,0 +1,342 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.browserservices.metrics; + +import android.content.ContentResolver; +import android.os.Environment; +import android.os.StatFs; +import android.provider.Settings; + +import androidx.annotation.IntDef; + +import org.chromium.base.ContextUtils; +import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.task.AsyncTask; +import org.chromium.components.browser_ui.util.ConversionUtils; +import org.chromium.components.webapps.WebApkDistributor; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Centralizes UMA data collection for WebAPKs. NOTE: Histogram names and values are defined in + * tools/metrics/histograms/histograms.xml. Please update that file if any change is made. + */ +public class WebApkUmaRecorder { + // This enum is used to back UMA histograms, and should therefore be treated as append-only. + @IntDef({UpdateRequestSent.WHILE_WEBAPK_CLOSED}) + @Retention(RetentionPolicy.SOURCE) + public @interface UpdateRequestSent { + // Deprecated: FIRST_TRY = 0; + // Deprecated: ONSTOP = 1; + // Deprecated: WHILE_WEBAPK_IN_FOREGROUND = 2; + int WHILE_WEBAPK_CLOSED = 3; + int NUM_ENTRIES = 4; + } + + // This enum is used to back UMA histograms, and should therefore be treated as append-only. + // The queued request times shouldn't exceed three. + @IntDef({UpdateRequestQueued.ONCE, UpdateRequestQueued.TWICE, UpdateRequestQueued.THREE_TIMES}) + @Retention(RetentionPolicy.SOURCE) + public @interface UpdateRequestQueued { + int ONCE = 0; + int TWICE = 1; + int THREE_TIMES = 2; + int NUM_ENTRIES = 3; + } + + // This enum is used to back UMA histograms, and should therefore be treated as append-only. + @IntDef({GooglePlayInstallResult.SUCCESS, GooglePlayInstallResult.FAILED_NO_DELEGATE, + GooglePlayInstallResult.FAILED_TO_CONNECT_TO_SERVICE, + GooglePlayInstallResult.FAILED_CALLER_VERIFICATION_FAILURE, + GooglePlayInstallResult.FAILED_POLICY_VIOLATION, + GooglePlayInstallResult.FAILED_API_DISABLED, + GooglePlayInstallResult.FAILED_REQUEST_FAILED, + GooglePlayInstallResult.FAILED_DOWNLOAD_CANCELLED, + GooglePlayInstallResult.FAILED_DOWNLOAD_ERROR, + GooglePlayInstallResult.FAILED_INSTALL_ERROR, + GooglePlayInstallResult.FAILED_INSTALL_TIMEOUT, + GooglePlayInstallResult.REQUEST_FAILED_POLICY_DISABLED, + GooglePlayInstallResult.REQUEST_FAILED_UNKNOWN_ACCOUNT, + GooglePlayInstallResult.REQUEST_FAILED_NETWORK_ERROR, + GooglePlayInstallResult.REQUSET_FAILED_RESOLVE_ERROR, + GooglePlayInstallResult.REQUEST_FAILED_NOT_GOOGLE_SIGNED}) + @Retention(RetentionPolicy.SOURCE) + public @interface GooglePlayInstallResult { + int SUCCESS = 0; + int FAILED_NO_DELEGATE = 1; + int FAILED_TO_CONNECT_TO_SERVICE = 2; + int FAILED_CALLER_VERIFICATION_FAILURE = 3; + int FAILED_POLICY_VIOLATION = 4; + int FAILED_API_DISABLED = 5; + int FAILED_REQUEST_FAILED = 6; + int FAILED_DOWNLOAD_CANCELLED = 7; + int FAILED_DOWNLOAD_ERROR = 8; + int FAILED_INSTALL_ERROR = 9; + int FAILED_INSTALL_TIMEOUT = 10; + // REQUEST_FAILED_* errors are the error codes shown in the "reason" of + // the returned Bundle when calling installPackage() API returns false. + int REQUEST_FAILED_POLICY_DISABLED = 11; + int REQUEST_FAILED_UNKNOWN_ACCOUNT = 12; + int REQUEST_FAILED_NETWORK_ERROR = 13; + int REQUSET_FAILED_RESOLVE_ERROR = 14; + int REQUEST_FAILED_NOT_GOOGLE_SIGNED = 15; + int NUM_ENTRIES = 16; + } + + public static final String HISTOGRAM_UPDATE_REQUEST_SENT = "WebApk.Update.RequestSent"; + + public static final String HISTOGRAM_UPDATE_REQUEST_QUEUED = "WebApk.Update.RequestQueued"; + + private static final String HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_VISIBLE = + "WebApk.Startup.Cold.ShellLaunchToSplashscreenVisible"; + private static final String HISTOGRAM_NEW_STYLE_LAUNCH_TO_SPLASHSCREEN_VISIBLE = + "WebApk.Startup.Cold.NewStyle.ShellLaunchToSplashscreenVisible"; + private static final String HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_HIDDEN = + "WebApk.Startup.Cold.ShellLaunchToSplashscreenHidden"; + + private static final int WEBAPK_OPEN_MAX = 3; + public static final int WEBAPK_OPEN_LAUNCH_SUCCESS = 0; + // Obsolete: WEBAPK_OPEN_NO_LAUNCH_INTENT = 1; + public static final int WEBAPK_OPEN_ACTIVITY_NOT_FOUND = 2; + + private static final long WEBAPK_EXTRA_INSTALLATION_SPACE_BYTES = + 100 * (long) ConversionUtils.BYTES_PER_MEGABYTE; // 100 MB + + /** + * Records the time point when a request to update a WebAPK is sent to the WebAPK Server. + * @param type representing when the update request is sent to the WebAPK server. + */ + public static void recordUpdateRequestSent(@UpdateRequestSent int type) { + RecordHistogram.recordEnumeratedHistogram( + HISTOGRAM_UPDATE_REQUEST_SENT, type, UpdateRequestSent.NUM_ENTRIES); + } + + /** + * Records the times that an update request has been queued once, twice and three times before + * sending to WebAPK server. + * @param times representing the times that an update has been queued. + */ + public static void recordUpdateRequestQueued(@UpdateRequestQueued int times) { + RecordHistogram.recordEnumeratedHistogram( + HISTOGRAM_UPDATE_REQUEST_QUEUED, times, UpdateRequestQueued.NUM_ENTRIES); + } + + /** + * Records duration between starting the WebAPK shell until the splashscreen is shown. + * @param durationMs duration in milliseconds + */ + public static void recordShellApkLaunchToSplashVisible(long durationMs) { + RecordHistogram.recordMediumTimesHistogram( + HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_VISIBLE, durationMs); + } + + /** + * Records duration between starting the WebAPK shell until the shell displays the + * splashscreen for new-style WebAPKs. + */ + public static void recordNewStyleShellApkLaunchToSplashVisible(long durationMs) { + RecordHistogram.recordMediumTimesHistogram( + HISTOGRAM_NEW_STYLE_LAUNCH_TO_SPLASHSCREEN_VISIBLE, durationMs); + } + + /** + * Records duration between starting of the WebAPK shell until the splashscreen is hidden. + * @param durationMs duration in milliseconds + */ + public static void recordShellApkLaunchToSplashHidden(long durationMs) { + RecordHistogram.recordMediumTimesHistogram( + HISTOGRAM_LAUNCH_TO_SPLASHSCREEN_HIDDEN, durationMs); + } + + /** Records whether a WebAPK has permission to display notifications. */ + public static void recordNotificationPermissionStatus(boolean permissionEnabled) { + RecordHistogram.recordBooleanHistogram( + "WebApk.Notification.Permission.Status", permissionEnabled); + } + + /** + * Records whether installing a WebAPK from Google Play succeeded. If not, records the reason + * that the install failed. + */ + public static void recordGooglePlayInstallResult(@GooglePlayInstallResult int result) { + RecordHistogram.recordEnumeratedHistogram("WebApk.Install.GooglePlayInstallResult", result, + GooglePlayInstallResult.NUM_ENTRIES); + } + + /** Records the error code if installing a WebAPK via Google Play fails. */ + public static void recordGooglePlayInstallErrorCode(int errorCode) { + // Don't use an enumerated histogram as there are > 30 potential error codes. In practice, + // a given client will always get the same error code. + RecordHistogram.recordSparseHistogram( + "WebApk.Install.GooglePlayErrorCode", Math.min(errorCode, 1000)); + } + + /** + * Records whether updating a WebAPK from Google Play succeeded. If not, records the reason + * that the update failed. + */ + public static void recordGooglePlayUpdateResult(@GooglePlayInstallResult int result) { + RecordHistogram.recordEnumeratedHistogram("WebApk.Update.GooglePlayUpdateResult", result, + GooglePlayInstallResult.NUM_ENTRIES); + } + + /** Records the duration of a WebAPK session (from launch/foreground to background). */ + public static void recordWebApkSessionDuration( + @WebApkDistributor int distributor, long duration) { + RecordHistogram.recordLongTimesHistogram( + "WebApk.Session.TotalDuration2." + getWebApkDistributorUmaSuffix(distributor), + duration); + } + + /** Records the current Shell APK version. */ + public static void recordShellApkVersion( + int shellApkVersion, @WebApkDistributor int distributor) { + RecordHistogram.recordSparseHistogram( + "WebApk.ShellApkVersion2." + getWebApkDistributorUmaSuffix(distributor), + shellApkVersion); + } + + private static String getWebApkDistributorUmaSuffix(@WebApkDistributor int distributor) { + switch (distributor) { + case WebApkDistributor.BROWSER: + return "Browser"; + case WebApkDistributor.DEVICE_POLICY: + return "DevicePolicy"; + default: + return "Other"; + } + } + + /** Records to UMA the count of old "WebAPK update request" files. */ + public static void recordNumberOfStaleWebApkUpdateRequestFiles(int count) { + RecordHistogram.recordCountHistogram("WebApk.Update.NumStaleUpdateRequestFiles", count); + } + + /** Records whether Chrome could bind to the WebAPK service. */ + public static void recordBindToWebApkServiceSucceeded(boolean bindSucceeded) { + RecordHistogram.recordBooleanHistogram("WebApk.WebApkService.BindSuccess", bindSucceeded); + } + + /** Records the network error code caught when a WebAPK is launched. */ + public static void recordNetworkErrorWhenLaunch(int errorCode) { + RecordHistogram.recordSparseHistogram("WebApk.Launch.NetworkError", -errorCode); + } + + /** + * Records whether a WebAPK navigation is within the WebAPK's scope. + * @param isChildTab Whether {@link Tab#getParentId()} is non-empty. + * @param isNavigationInScope + */ + public static void recordNavigation(boolean isNavigationInScope) { + RecordHistogram.recordBooleanHistogram("WebApk.Navigation.InScope", isNavigationInScope); + } + + /** Records number of unique origins for WebAPKs in WebappRegistry */ + public static void recordWebApksCount(int count) { + RecordHistogram.recordCount100Histogram("WebApk.WebappRegistry.NumberOfOrigins", count); + } + + /** + * Log necessary disk usage and cache size UMAs when WebAPK installation fails. + */ + public static void logSpaceUsageUMAWhenInstallationFails() { + new AsyncTask<Void>() { + long mAvailableSpaceInByte; + long mCacheSizeInByte; + @Override + protected Void doInBackground() { + mAvailableSpaceInByte = getAvailableSpaceAboveLowSpaceLimit(); + mCacheSizeInByte = getCacheDirSize(); + return null; + } + + @Override + protected void onPostExecute(Void result) { + logSpaceUsageUMAOnDataAvailable(mAvailableSpaceInByte, mCacheSizeInByte); + } + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + private static void logSpaceUsageUMAOnDataAvailable(long spaceSize, long cacheSize) { + RecordHistogram.recordSparseHistogram( + "WebApk.Install.AvailableSpace.Fail", roundByteToMb(spaceSize)); + + RecordHistogram.recordSparseHistogram("WebApk.Install.AvailableSpaceAfterFreeUpCache.Fail", + roundByteToMb(spaceSize + cacheSize)); + } + + private static int roundByteToMb(long bytes) { + int mbs = (int) (bytes / (long) ConversionUtils.BYTES_PER_MEGABYTE / 10L * 10L); + return Math.min(1000, Math.max(-1000, mbs)); + } + + private static long getDirectorySizeInByte(File dir) { + if (dir == null) return 0; + if (!dir.isDirectory()) return dir.length(); + + long sizeInByte = 0; + try { + File[] files = dir.listFiles(); + if (files == null) return 0; + for (File file : files) sizeInByte += getDirectorySizeInByte(file); + } catch (SecurityException e) { + return 0; + } + return sizeInByte; + } + + /** + * @return The available space that can be used to install WebAPK. Negative value means there is + * less free space available than the system's minimum by the given amount. + */ + public static long getAvailableSpaceAboveLowSpaceLimit() { + StatFs partitionStats = new StatFs(Environment.getDataDirectory().getAbsolutePath()); + long partitionAvailableBytes = partitionStats.getAvailableBytes(); + long partitionTotalBytes = partitionStats.getTotalBytes(); + long minimumFreeBytes = getLowSpaceLimitBytes(partitionTotalBytes); + + long webApkExtraSpaceBytes = WEBAPK_EXTRA_INSTALLATION_SPACE_BYTES; + return partitionAvailableBytes - minimumFreeBytes + webApkExtraSpaceBytes; + } + + /** + * @return Size of the cache directory. + */ + public static long getCacheDirSize() { + return getDirectorySizeInByte(ContextUtils.getApplicationContext().getCacheDir()); + } + + /** + * Mirror the system-derived calculation of reserved bytes and return that value. + */ + private static long getLowSpaceLimitBytes(long partitionTotalBytes) { + // Copied from android/os/storage/StorageManager.java + final int defaultThresholdPercentage = 10; + // Copied from android/os/storage/StorageManager.java + final long defaultThresholdMaxBytes = 500 * ConversionUtils.BYTES_PER_MEGABYTE; + // Copied from android/provider/Settings.java + final String sysStorageThresholdPercentage = "sys_storage_threshold_percentage"; + // Copied from android/provider/Settings.java + final String sysStorageThresholdMaxBytes = "sys_storage_threshold_max_bytes"; + + ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver(); + int minFreePercent = 0; + long minFreeBytes = 0; + + // Retrieve platform-appropriate values first + minFreePercent = Settings.Global.getInt( + resolver, sysStorageThresholdPercentage, defaultThresholdPercentage); + minFreeBytes = Settings.Global.getLong( + resolver, sysStorageThresholdMaxBytes, defaultThresholdMaxBytes); + + long minFreePercentInBytes = (partitionTotalBytes * minFreePercent) / 100; + + return Math.min(minFreeBytes, minFreePercentInBytes); + } + + private WebApkUmaRecorder() {} +}
diff --git a/chrome/browser/android/feed/v2/web_feed_bridge.cc b/chrome/browser/android/feed/v2/web_feed_bridge.cc index bbfd8652..ec6f737 100644 --- a/chrome/browser/android/feed/v2/web_feed_bridge.cc +++ b/chrome/browser/android/feed/v2/web_feed_bridge.cc
@@ -313,9 +313,4 @@ std::move(callback), &TaskTracker()); } -static jboolean JNI_WebFeedBridge_IsWebFeedSubscriber(JNIEnv*) { - WebFeedSubscriptions* subscriptions = GetSubscriptions(); - return subscriptions && subscriptions->IsWebFeedSubscriber(); -} - } // namespace feed
diff --git a/chrome/browser/android/metrics/android_session_durations_service.cc b/chrome/browser/android/metrics/android_session_durations_service.cc index 89d3cf9..cef5de8 100644 --- a/chrome/browser/android/metrics/android_session_durations_service.cc +++ b/chrome/browser/android/metrics/android_session_durations_service.cc
@@ -9,7 +9,6 @@ #include "chrome/browser/android/metrics/android_session_durations_service_factory.h" #include "chrome/browser/android/metrics/jni_headers/AndroidSessionDurationsServiceState_jni.h" #include "chrome/browser/profiles/profile_android.h" -#include "chrome/browser/profiles/profile_manager.h" namespace { class IncognitoSessionDurationsMetricsRecorder { @@ -155,10 +154,7 @@ void AndroidSessionDurationsService::RestoreIncognitoSession( base::Time session_start, base::TimeDelta last_reported_duration) { - // TODO(https://crbug.com/1226462): Change back to DCHECK after investigation - // of the crash. - CHECK(incognito_session_metrics_recorder_); - + DCHECK(incognito_session_metrics_recorder_); incognito_session_metrics_recorder_->RestoreSession(session_start, last_reported_duration); } @@ -197,11 +193,6 @@ AndroidSessionDurationsService* duration_service = AndroidSessionDurationsServiceFactory::GetForProfile(profile); - // TODO(https://crbug.com/1226462): Remove after investigation of the crash. - CHECK_EQ(profile, - ProfileManager::GetLastUsedProfile()->GetPrimaryOTRProfile(false)); - CHECK(duration_service); - base::Time session_start_time = base::Time::FromJavaTime( Java_AndroidSessionDurationsServiceState_getSessionStartTime( env, j_duration_service));
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index c0aba8fd..98dcad7 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -1244,18 +1244,14 @@ return; NSInteger tag = [sender tag]; + // The task manager can be shown without profile. + if (tag == IDC_TASK_MANAGER) { + chrome::OpenTaskManager(nullptr); + return; + } - // If there are no browser windows, and we are trying to open a browser - // for a locked profile or the system profile or the guest profile but - // guest mode is disabled, we have to show the User Manager instead as the - // locked profile needs authentication and the system profile cannot have a - // browser. - const PrefService* prefService = g_browser_process->local_state(); - bool is_last_profile_guest = - lastProfile->IsGuestSession() || lastProfile->IsEphemeralGuestProfile(); - if (IsProfileSignedOut(lastProfile) || lastProfile->IsSystemProfile() || - (is_last_profile_guest && prefService && - !prefService->GetBoolean(prefs::kBrowserGuestModeEnabled))) { + if (!lastProfile) { + // The profile is disallowed by policy (locked or guest mode disabled). ProfilePicker::Show(ProfilePicker::EntryPoint::kProfileLocked); return; } @@ -1339,9 +1335,6 @@ else chrome::OpenHelpWindow(lastProfile, chrome::HELP_SOURCE_MENU); break; - case IDC_TASK_MANAGER: - chrome::OpenTaskManager(NULL); - break; case IDC_OPTIONS: [self showPreferences:sender]; break; @@ -1580,6 +1573,13 @@ if (!profile) return nullptr; + DCHECK(!profile->IsSystemProfile()); + if (profile->IsGuestSession() && !profiles::IsGuestModeEnabled()) + return nullptr; + + if (IsProfileSignedOut(profile)) + return nullptr; // Profile is locked. + // When opening a Guest session or if incognito is forced. if (ProfileManager::IsOffTheRecordModeForced(profile)) return profile->GetPrimaryOTRProfile(/*create_if_needed=*/true); @@ -1587,15 +1587,6 @@ return profile; } -// Returns true if a browser window may be opened for the last active profile. -- (bool)canOpenNewBrowser { - Profile* profile = [self safeProfileForNewWindows:[self lastProfile]]; - - const PrefService* prefs = g_browser_process->local_state(); - return (!profile->IsGuestSession() && !profile->IsEphemeralGuestProfile()) || - prefs->GetBoolean(prefs::kBrowserGuestModeEnabled); -} - - (void)getUrl:(NSAppleEventDescriptor*)event withReply:(NSAppleEventDescriptor*)reply { NSString* urlStr = [[event paramDescriptorForKeyword:keyDirectObject] @@ -1644,34 +1635,23 @@ // Show the preferences window, or bring it to the front if it's already // visible. - (IBAction)showPreferences:(id)sender { - Profile* lastProfile = [self lastProfile]; - if (Browser* browser = ActivateBrowser(lastProfile)) { - // Show options tab in the active browser window. + Profile* profile = [self safeProfileForNewWindows:[self lastProfileIfLoaded]]; + DCHECK(profile); + // Re-use an existing browser, or create a new one. + if (Browser* browser = ActivateBrowser(profile)) chrome::ShowSettings(browser); - } else if ([self canOpenNewBrowser]) { - // No browser window, so create one for the options tab. - chrome::OpenOptionsWindow([self safeProfileForNewWindows:lastProfile]); - } else { - // No way to create a browser, default to the Profile Picker. On profile - // selection, it opens the profile on the settings page. - ProfilePicker::Show(ProfilePicker::EntryPoint::kUnableToCreateBrowser, - GURL(chrome::kChromeUISettingsURL)); - } + else + chrome::OpenOptionsWindow(profile); } - (IBAction)orderFrontStandardAboutPanel:(id)sender { - Profile* lastProfile = [self lastProfile]; - if (Browser* browser = ActivateBrowser(lastProfile)) { + Profile* profile = [self safeProfileForNewWindows:[self lastProfileIfLoaded]]; + DCHECK(profile); + // Re-use an existing browser, or create a new one. + if (Browser* browser = ActivateBrowser(profile)) chrome::ShowAboutChrome(browser); - } else if ([self canOpenNewBrowser]) { - // No browser window, so create one for the options tab. - chrome::OpenAboutWindow([self safeProfileForNewWindows:lastProfile]); - } else { - // No way to create a browser, default to the User Manager. On profile - // selection, it opens the profile on chrome help page. - ProfilePicker::Show(ProfilePicker::EntryPoint::kUnableToCreateBrowser, - GURL(chrome::kChromeUIHelpURL)); - } + else + chrome::OpenAboutWindow(profile); } - (IBAction)toggleConfirmToQuit:(id)sender { @@ -2005,6 +1985,11 @@ return; DCHECK(profile); profile = [controller safeProfileForNewWindows:profile]; + if (!profile) { + // The profile is disallowed by policy (locked or guest mode disabled). + ProfilePicker::Show(ProfilePicker::EntryPoint::kUnableToCreateBrowser); + return; + } Browser* browser = chrome::FindLastActiveWithProfile(profile); int startupIndex = TabStripModel::kNoTab; content::WebContents* startupContent = nullptr;
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm index 4686e3ff..022e450 100644 --- a/chrome/browser/app_controller_mac_browsertest.mm +++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -454,11 +454,10 @@ } IN_PROC_BROWSER_TEST_F(AppControllerProfilePickerBrowserTest, - AboutChromeForcesUserManager) { + AboutChromeGuestDisallowed) { AppController* ac = base::mac::ObjCCast<AppController>( [[NSApplication sharedApplication] delegate]); ASSERT_TRUE(ac); - // Create the guest profile, and set it as the last used profile so the // app controller can use it on init. CreateAndWaitForSystemProfile(); @@ -466,26 +465,18 @@ PrefService* local_state = g_browser_process->local_state(); local_state->SetString(prefs::kProfileLastUsed, guest_profile_path.BaseName().value()); - - // Prohibiting guest mode forces the user manager flow for About Chrome. + // Disallow guest by policy. local_state->SetBoolean(prefs::kBrowserGuestModeEnabled, false); - Profile* profile = [ac lastProfile]; ASSERT_TRUE(profile); EXPECT_EQ(guest_profile_path, profile->GetPath()); EXPECT_TRUE(profile->IsGuestSession()); - - // Tell the browser to open About Chrome. - EXPECT_EQ(1u, active_browser_list()->size()); - [ac orderFrontStandardAboutPanel:NSApp]; - - base::RunLoop().RunUntilIdle(); - - // No new browser is opened; the User Manager opens instead. - EXPECT_EQ(1u, active_browser_list()->size()); - EXPECT_TRUE(ProfilePicker::IsActive()); - - ProfilePicker::Hide(); + // "About Chrome" is not available in the menu. + base::scoped_nsobject<NSMenuItem> about_menu_item( + [[[[NSApp mainMenu] itemWithTag:IDC_CHROME_MENU] submenu] + itemWithTag:IDC_ABOUT], + base::scoped_policy::RETAIN); + EXPECT_FALSE([ac validateUserInterfaceItem:about_menu_item]); } // Test that for a regular last profile, a reopen event opens a browser. @@ -533,6 +524,37 @@ ProfilePicker::Hide(); } +// "About Chrome" does not unlock the profile (regression test for +// https://crbug.com/1226844). +IN_PROC_BROWSER_TEST_F(AppControllerProfilePickerBrowserTest, + AboutPanelDoesNotUnlockProfile) { + signin_util::ScopedForceSigninSetterForTesting signin_setter(true); + // The User Manager uses the system profile as its underlying profile. To + // minimize flakiness due to the scheduling/descheduling of tasks on the + // different threads, pre-initialize the guest profile before it is needed. + CreateAndWaitForSystemProfile(); + AppController* ac = base::mac::ObjCCastStrict<AppController>( + [[NSApplication sharedApplication] delegate]); + // Lock the active profile. + Profile* profile = [ac lastProfile]; + ProfileAttributesEntry* entry = + g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile->GetPath()); + ASSERT_NE(entry, nullptr); + entry->LockForceSigninProfile(true); + EXPECT_TRUE(entry->IsSigninRequired()); + EXPECT_EQ(1u, active_browser_list()->size()); + Browser* browser = active_browser_list()->get(0); + EXPECT_FALSE(browser->profile()->IsGuestSession()); + // "About Chrome" is not available in the menu. + base::scoped_nsobject<NSMenuItem> about_menu_item( + [[[[NSApp mainMenu] itemWithTag:IDC_CHROME_MENU] submenu] + itemWithTag:IDC_ABOUT], + base::scoped_policy::RETAIN); + EXPECT_FALSE([ac validateUserInterfaceItem:about_menu_item]); +} + // Test that for a guest last profile, a reopen event opens the ProfilePicker. IN_PROC_BROWSER_TEST_F(AppControllerProfilePickerBrowserTest, GuestProfileReopenWithNoWindows) {
diff --git a/chrome/browser/ash/arc/arc_util.cc b/chrome/browser/ash/arc/arc_util.cc index 0cfe3198..a0184c9 100644 --- a/chrome/browser/ash/arc/arc_util.cc +++ b/chrome/browser/ash/arc/arc_util.cc
@@ -577,12 +577,12 @@ std::move(callback))); } -ArcSupervisionTransition GetSupervisionTransition(const Profile* profile) { +ArcManagementTransition GetManagementTransition(const Profile* profile) { DCHECK(profile); DCHECK(profile->GetPrefs()); - const ArcSupervisionTransition supervision_transition = - static_cast<ArcSupervisionTransition>( + const ArcManagementTransition management_transition = + static_cast<ArcManagementTransition>( profile->GetPrefs()->GetInteger(prefs::kArcManagementTransition)); const bool is_child_to_regular_enabled = base::FeatureList::IsEnabled(kEnableChildToRegularTransitionFeature); @@ -591,23 +591,23 @@ const bool is_unmanaged_to_managed_enabled = base::FeatureList::IsEnabled(kEnableUnmanagedToManagedTransitionFeature); - switch (supervision_transition) { - case ArcSupervisionTransition::NO_TRANSITION: + switch (management_transition) { + case ArcManagementTransition::NO_TRANSITION: // Do nothing. break; - case ArcSupervisionTransition::CHILD_TO_REGULAR: + case ArcManagementTransition::CHILD_TO_REGULAR: if (!is_child_to_regular_enabled) - return ArcSupervisionTransition::NO_TRANSITION; + return ArcManagementTransition::NO_TRANSITION; break; - case ArcSupervisionTransition::REGULAR_TO_CHILD: + case ArcManagementTransition::REGULAR_TO_CHILD: if (!is_regular_to_child_enabled) - return ArcSupervisionTransition::NO_TRANSITION; + return ArcManagementTransition::NO_TRANSITION; break; - case ArcSupervisionTransition::UNMANAGED_TO_MANAGED: + case ArcManagementTransition::UNMANAGED_TO_MANAGED: if (!is_unmanaged_to_managed_enabled) - return ArcSupervisionTransition::NO_TRANSITION; + return ArcManagementTransition::NO_TRANSITION; } - return supervision_transition; + return management_transition; } bool IsPlayStoreAvailable() {
diff --git a/chrome/browser/ash/arc/arc_util.h b/chrome/browser/ash/arc/arc_util.h index b4a263bd..52e1c61 100644 --- a/chrome/browser/ash/arc/arc_util.h +++ b/chrome/browser/ash/arc/arc_util.h
@@ -10,7 +10,7 @@ #include "base/callback_forward.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" #include "storage/browser/file_system/file_system_url.h" // Most utility should be put in components/arc/arc_util.{h,cc}, rather than @@ -174,7 +174,7 @@ base::OnceClosure callback); // Returns the supervision transition status as stored in profile prefs. -ArcSupervisionTransition GetSupervisionTransition(const Profile* profile); +ArcManagementTransition GetManagementTransition(const Profile* profile); // Returns true if Play Store package is present and can be launched in this // session.
diff --git a/chrome/browser/ash/arc/arc_util_unittest.cc b/chrome/browser/ash/arc/arc_util_unittest.cc index f6b08ef1..c8c330a 100644 --- a/chrome/browser/ash/arc/arc_util_unittest.cc +++ b/chrome/browser/ash/arc/arc_util_unittest.cc
@@ -735,10 +735,10 @@ profile()->GetPrefs()->SetInteger( arc::prefs::kArcManagementTransition, - static_cast<int>(arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED)); + static_cast<int>(arc::ArcManagementTransition::UNMANAGED_TO_MANAGED)); - EXPECT_EQ(GetSupervisionTransition(profile()), - arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED); + EXPECT_EQ(GetManagementTransition(profile()), + arc::ArcManagementTransition::UNMANAGED_TO_MANAGED); } TEST_F(ChromeArcUtilTest, ArcUnmanagedToManagedTransition_FeatureOff) { @@ -748,10 +748,10 @@ profile()->GetPrefs()->SetInteger( arc::prefs::kArcManagementTransition, - static_cast<int>(arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED)); + static_cast<int>(arc::ArcManagementTransition::UNMANAGED_TO_MANAGED)); - EXPECT_EQ(GetSupervisionTransition(profile()), - arc::ArcSupervisionTransition::NO_TRANSITION); + EXPECT_EQ(GetManagementTransition(profile()), + arc::ArcManagementTransition::NO_TRANSITION); } class ArcOobeTest : public ChromeArcUtilTest {
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service.cc b/chrome/browser/ash/arc/auth/arc_auth_service.cc index 6dd3b1ae..830944e 100644 --- a/chrome/browser/ash/arc/auth/arc_auth_service.cc +++ b/chrome/browser/ash/arc/auth/arc_auth_service.cc
@@ -40,7 +40,7 @@ #include "components/arc/arc_service_manager.h" #include "components/arc/arc_util.h" #include "components/arc/session/arc_bridge_service.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" #include "components/prefs/pref_service.h" #include "components/signin/public/identity_manager/consent_level.h" #include "components/user_manager/user_manager.h" @@ -384,7 +384,7 @@ case mojom::ManagementChangeStatus::CLOUD_DPC_ALREADY_ENABLED: profile_->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(ArcManagementTransition::NO_TRANSITION)); // TODO(brunokim): notify potential observers. break; case mojom::ManagementChangeStatus::CLOUD_DPC_DISABLING_FAILED:
diff --git a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc index f353d2f..90baf07 100644 --- a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc +++ b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc
@@ -192,7 +192,9 @@ VLOG(1) << "Preparing files and start streaming from ARC virtual filesystem"; file_handler_->StartPreparingFiles( base::BindOnce(&NearbyShareSessionImpl::ShowNearbyShareBubbleInArcWindow, - weak_ptr_factory_.GetWeakPtr(), arc_window)); + weak_ptr_factory_.GetWeakPtr(), arc_window), + base::BindRepeating(&NearbyShareSessionImpl::OnProgressBarUpdate, + weak_ptr_factory_.GetWeakPtr())); } void NearbyShareSessionImpl::OnNearbyShareBubbleShown( @@ -269,4 +271,9 @@ std::move(session_finished_callback_).Run(task_id_); } +void NearbyShareSessionImpl::OnProgressBarUpdate(double value) { + // TODO(b/191705289): Add UI integration with views::ProgressBar. + VLOG(1) << "Called OnProgressBarUpdate with value: " << value; +} + } // namespace arc
diff --git a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.h b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.h index 1937d7da..c881f2f0 100644 --- a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.h +++ b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.h
@@ -75,6 +75,9 @@ // Called back once the session duration exceeds the maximum duration. void OnTimerFired(); + // Called when progress bar UI update is available. + void OnProgressBarUpdate(double value); + // Android activity's task ID int32_t task_id_;
diff --git a/chrome/browser/ash/arc/nearby_share/share_info_file_handler.cc b/chrome/browser/ash/arc/nearby_share/share_info_file_handler.cc index a24423d..dce418e 100644 --- a/chrome/browser/ash/arc/nearby_share/share_info_file_handler.cc +++ b/chrome/browser/ash/arc/nearby_share/share_info_file_handler.cc
@@ -135,11 +135,14 @@ } void ShareInfoFileHandler::StartPreparingFiles( - CompletedCallback completed_callback) { + CompletedCallback completed_callback, + ProgressBarUpdateCallback update_callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!completed_callback.is_null()); + DCHECK(!update_callback.is_null()); completed_callback_ = std::move(completed_callback); + update_callback_ = std::move(update_callback); file_sharing_started_ = true; if (!base::PathExists(file_config_.directory)) { @@ -307,12 +310,15 @@ num_bytes_read_ += base::checked_cast<uint64_t>(bytes_read); num_files_streamed_++; - // TODO(alanding): Update Chrome progress bar UI. const uint64_t expected_total_bytes = GetTotalSizeOfFiles(); const size_t expected_total_files = GetNumberOfFiles(); VLOG(1) << "Streamed " << num_bytes_read_ << " of " << expected_total_bytes << " bytes for " << num_files_streamed_ << " of " << expected_total_files << " files"; + if (!update_callback_.is_null()) { + update_callback_.Run(base::checked_cast<double>(num_bytes_read_) / + expected_total_bytes); + } if (num_files_streamed_ == expected_total_files && num_bytes_read_ >= expected_total_bytes) {
diff --git a/chrome/browser/ash/arc/nearby_share/share_info_file_handler.h b/chrome/browser/ash/arc/nearby_share/share_info_file_handler.h index 17ce55f..126b81d 100644 --- a/chrome/browser/ash/arc/nearby_share/share_info_file_handler.h +++ b/chrome/browser/ash/arc/nearby_share/share_info_file_handler.h
@@ -53,6 +53,9 @@ using CompletedCallback = base::OnceCallback<void(absl::optional<base::File::Error> result)>; + // |value| is a percentage from 0 to 1 in double format (e.g. 0.50 for 50%). + using ProgressBarUpdateCallback = base::RepeatingCallback<void(double value)>; + ShareInfoFileHandler(Profile* profile, mojom::ShareIntentInfo* share_info, base::FilePath directory); @@ -71,10 +74,13 @@ size_t GetNumberOfFiles() const { return file_config_.num_files; } // Start streaming virtual files to destination file descriptors in - // preparation for Nearby Share. + // preparation for Nearby Share. Callbacks are run on the UI thread. // |completed_callback| is called when file streaming is completed with // either error or success. - void StartPreparingFiles(CompletedCallback completed_callback); + // |update_callback| is for updating a progress bar view value if needed + // (e.g. views::ProgressBar::SetValue(double)). + void StartPreparingFiles(CompletedCallback completed_callback, + ProgressBarUpdateCallback update_callback); private: friend struct content::BrowserThread::DeleteOnThread< @@ -137,6 +143,7 @@ std::list<base::ScopedTempDir> scoped_temp_dirs_; FileShareConfig file_config_; CompletedCallback completed_callback_; + ProgressBarUpdateCallback update_callback_; // Updated by multiple stream adapters on UI thread. uint64_t num_bytes_read_ = 0;
diff --git a/chrome/browser/ash/arc/notification/arc_management_transition_notification.cc b/chrome/browser/ash/arc/notification/arc_management_transition_notification.cc index 95d246e..c0c2c68 100644 --- a/chrome/browser/ash/arc/notification/arc_management_transition_notification.cc +++ b/chrome/browser/ash/arc/notification/arc_management_transition_notification.cc
@@ -69,8 +69,8 @@ // Called in case transition state is changed. void OnTransitionChanged() { - DCHECK_EQ(ArcSupervisionTransition::NO_TRANSITION, - GetSupervisionTransition(profile_)); + DCHECK_EQ(ArcManagementTransition::NO_TRANSITION, + GetManagementTransition(profile_)); Dismiss(); } @@ -83,9 +83,8 @@ DISALLOW_COPY_AND_ASSIGN(NotificationDelegate); }; -const gfx::VectorIcon& GetNotificationIcon( - ArcSupervisionTransition transition) { - if (transition == ArcSupervisionTransition::UNMANAGED_TO_MANAGED) { +const gfx::VectorIcon& GetNotificationIcon(ArcManagementTransition transition) { + if (transition == ArcManagementTransition::UNMANAGED_TO_MANAGED) { return chromeos::kEnterpriseIcon; } else { return kNotificationFamilyLinkIcon; @@ -98,10 +97,10 @@ "arc_management_transition/notification"; void ShowManagementTransitionNotification(Profile* profile) { - const ArcSupervisionTransition transition = GetSupervisionTransition(profile); - DCHECK(transition == ArcSupervisionTransition::CHILD_TO_REGULAR || - transition == ArcSupervisionTransition::REGULAR_TO_CHILD || - transition == ArcSupervisionTransition::UNMANAGED_TO_MANAGED); + const ArcManagementTransition transition = GetManagementTransition(profile); + DCHECK(transition == ArcManagementTransition::CHILD_TO_REGULAR || + transition == ArcManagementTransition::REGULAR_TO_CHILD || + transition == ArcManagementTransition::UNMANAGED_TO_MANAGED); message_center::NotifierId notifier_id( message_center::NotifierType::SYSTEM_COMPONENT, kNotifierId);
diff --git a/chrome/browser/ash/arc/notification/arc_management_transition_notification_unittest.cc b/chrome/browser/ash/arc/notification/arc_management_transition_notification_unittest.cc index 9c289c8..38b328235 100644 --- a/chrome/browser/ash/arc/notification/arc_management_transition_notification_unittest.cc +++ b/chrome/browser/ash/arc/notification/arc_management_transition_notification_unittest.cc
@@ -20,7 +20,7 @@ #include "components/arc/arc_features.h" #include "components/arc/arc_prefs.h" #include "components/arc/metrics/arc_metrics_constants.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" #include "components/arc/test/fake_app_instance.h" #include "components/prefs/pref_service.h" #include "content/public/test/browser_task_environment.h" @@ -31,11 +31,11 @@ namespace { struct TransitionNotificationParams { - TransitionNotificationParams(ArcSupervisionTransition arc_transition, + TransitionNotificationParams(ArcManagementTransition arc_transition, const gfx::VectorIcon* notification_icon) : arc_transition(arc_transition), notification_icon(notification_icon) {} - ArcSupervisionTransition arc_transition; + ArcManagementTransition arc_transition; const gfx::VectorIcon* notification_icon; }; @@ -78,9 +78,7 @@ return GetParam().notification_icon; } - ArcSupervisionTransition arc_transition() { - return GetParam().arc_transition; - } + ArcManagementTransition arc_transition() { return GetParam().arc_transition; } private: std::unique_ptr<TestingProfile> profile_; @@ -96,14 +94,14 @@ All, ArcManagementTransitionNotificationTest, ::testing::Values( - TransitionNotificationParams(ArcSupervisionTransition::NO_TRANSITION, + TransitionNotificationParams(ArcManagementTransition::NO_TRANSITION, nullptr), - TransitionNotificationParams(ArcSupervisionTransition::CHILD_TO_REGULAR, + TransitionNotificationParams(ArcManagementTransition::CHILD_TO_REGULAR, &kNotificationFamilyLinkIcon), - TransitionNotificationParams(ArcSupervisionTransition::REGULAR_TO_CHILD, + TransitionNotificationParams(ArcManagementTransition::REGULAR_TO_CHILD, &kNotificationFamilyLinkIcon), TransitionNotificationParams( - ArcSupervisionTransition::UNMANAGED_TO_MANAGED, + ArcManagementTransition::UNMANAGED_TO_MANAGED, &chromeos::kEnterpriseIcon))); TEST_P(ArcManagementTransitionNotificationTest, BaseFlow) { @@ -126,7 +124,7 @@ // In case no management transition in progress notification is not // triggered. - if (arc_transition() == ArcSupervisionTransition::NO_TRANSITION) { + if (arc_transition() == ArcManagementTransition::NO_TRANSITION) { EXPECT_FALSE(display_service()->GetNotification( kManagementTransitionNotificationId)); // Last launch is set, indicating that launch attempt was not blocked. @@ -151,7 +149,7 @@ // Finishing transition automatically dismisses notification. profile()->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(ArcManagementTransition::NO_TRANSITION)); EXPECT_FALSE( display_service()->GetNotification(kManagementTransitionNotificationId));
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.cc b/chrome/browser/ash/arc/session/arc_session_manager.cc index 4d69550..286822f 100644 --- a/chrome/browser/ash/arc/session/arc_session_manager.cc +++ b/chrome/browser/ash/arc/session/arc_session_manager.cc
@@ -64,9 +64,9 @@ #include "components/arc/metrics/stability_metrics_manager.h" #include "components/arc/session/arc_data_remover.h" #include "components/arc/session/arc_instance_mode.h" +#include "components/arc/session/arc_management_transition.h" #include "components/arc/session/arc_session.h" #include "components/arc/session/arc_session_runner.h" -#include "components/arc/session/arc_supervision_transition.h" #include "components/exo/wm_helper_chromeos.h" #include "components/prefs/pref_service.h" #include "components/services/app_service/public/cpp/intent_util.h" @@ -872,8 +872,8 @@ ArcAndroidManagementChecker::StartClient(); // Request removing data if enabled for a regular->child transition. - if (GetSupervisionTransition(profile_) == - ArcSupervisionTransition::REGULAR_TO_CHILD && + if (GetManagementTransition(profile_) == + ArcManagementTransition::REGULAR_TO_CHILD && base::FeatureList::IsEnabled( kCleanArcDataOnRegularToChildTransitionFeature)) { LOG(WARNING) << "User transited from regular to child, deleting ARC data"; @@ -1213,7 +1213,7 @@ data_remover_->Schedule(); profile_->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(ArcManagementTransition::NO_TRANSITION)); // To support 1) case above, maybe start data removal. if (state_ == State::STOPPED) MaybeStartArcDataRemoval(); @@ -1474,7 +1474,7 @@ // which is eventually passed to ARC via ArcSession parameters. profile_->GetPrefs()->SetInteger( arc::prefs::kArcManagementTransition, - static_cast<int>(arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED)); + static_cast<int>(arc::ArcManagementTransition::UNMANAGED_TO_MANAGED)); // Restart ARC to perform managed re-provisioning. // kArcIsManaged and kArcSignedIn are not reset during the restart. @@ -1533,7 +1533,7 @@ demo_session->resources()->GetDemoAppsPath(); } - params.supervision_transition = GetSupervisionTransition(profile_); + params.management_transition = GetManagementTransition(profile_); params.locale = locale; // Empty |preferred_languages| is converted to empty array. params.preferred_languages = base::SplitString(
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc index 39464e84..d5e904b 100644 --- a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc +++ b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
@@ -788,7 +788,7 @@ // account. profile()->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::REGULAR_TO_CHILD)); + static_cast<int>(ArcManagementTransition::REGULAR_TO_CHILD)); base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( kCleanArcDataOnRegularToChildTransitionFeature); @@ -797,7 +797,7 @@ arc_session_manager()->Initialize(); EXPECT_TRUE( profile()->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)); - EXPECT_EQ(static_cast<int>(ArcSupervisionTransition::NO_TRANSITION), + EXPECT_EQ(static_cast<int>(ArcManagementTransition::NO_TRANSITION), profile()->GetPrefs()->GetInteger(prefs::kArcManagementTransition)); EXPECT_EQ(ArcSessionManager::State::REMOVING_DATA_DIR, arc_session_manager()->state()); @@ -810,7 +810,7 @@ // account, but the feature flag is disabled. profile()->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::REGULAR_TO_CHILD)); + static_cast<int>(ArcManagementTransition::REGULAR_TO_CHILD)); base::test::ScopedFeatureList feature_list; feature_list.InitAndDisableFeature( kCleanArcDataOnRegularToChildTransitionFeature); @@ -820,7 +820,7 @@ arc_session_manager()->RequestEnable(); EXPECT_FALSE( profile()->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)); - EXPECT_EQ(static_cast<int>(ArcSupervisionTransition::REGULAR_TO_CHILD), + EXPECT_EQ(static_cast<int>(ArcManagementTransition::REGULAR_TO_CHILD), profile()->GetPrefs()->GetInteger(prefs::kArcManagementTransition)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE, @@ -832,7 +832,7 @@ TEST_F(ArcSessionManagerTest, ClearArcTransitionOnShutdown) { profile()->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(ArcManagementTransition::NO_TRANSITION)); // Initialize ARC. arc_session_manager()->SetProfile(profile()); @@ -849,27 +849,27 @@ arc_session_manager()->OnProvisioningFinished( ArcProvisioningResult(std::move(result))); - EXPECT_EQ(static_cast<int>(ArcSupervisionTransition::NO_TRANSITION), + EXPECT_EQ(static_cast<int>(ArcManagementTransition::NO_TRANSITION), profile()->GetPrefs()->GetInteger(prefs::kArcManagementTransition)); // Child started graduation. profile()->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::CHILD_TO_REGULAR)); + static_cast<int>(ArcManagementTransition::CHILD_TO_REGULAR)); // Simulate ARC shutdown. const bool enable_requested = arc_session_manager()->enable_requested(); arc_session_manager()->RequestDisable(); if (enable_requested) arc_session_manager()->RequestArcDataRemoval(); - EXPECT_EQ(static_cast<int>(ArcSupervisionTransition::NO_TRANSITION), + EXPECT_EQ(static_cast<int>(ArcManagementTransition::NO_TRANSITION), profile()->GetPrefs()->GetInteger(prefs::kArcManagementTransition)); arc_session_manager()->Shutdown(); } TEST_F(ArcSessionManagerTest, ClearArcTransitionOnArcDataRemoval) { - EXPECT_EQ(ArcSupervisionTransition::NO_TRANSITION, - arc::GetSupervisionTransition(profile())); + EXPECT_EQ(ArcManagementTransition::NO_TRANSITION, + arc::GetManagementTransition(profile())); // Initialize ARC. arc_session_manager()->SetProfile(profile()); @@ -886,17 +886,17 @@ arc_session_manager()->OnProvisioningFinished( ArcProvisioningResult(std::move(result))); - EXPECT_EQ(ArcSupervisionTransition::NO_TRANSITION, - arc::GetSupervisionTransition(profile())); + EXPECT_EQ(ArcManagementTransition::NO_TRANSITION, + arc::GetManagementTransition(profile())); // Child started graduation. profile()->GetPrefs()->SetInteger( prefs::kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::CHILD_TO_REGULAR)); + static_cast<int>(ArcManagementTransition::CHILD_TO_REGULAR)); arc_session_manager()->RequestArcDataRemoval(); - EXPECT_EQ(ArcSupervisionTransition::NO_TRANSITION, - arc::GetSupervisionTransition(profile())); + EXPECT_EQ(ArcManagementTransition::NO_TRANSITION, + arc::GetManagementTransition(profile())); arc_session_manager()->Shutdown(); } @@ -2259,10 +2259,10 @@ // Verify ARC state and ARC transition value. EXPECT_EQ(profile()->GetPrefs()->GetBoolean(prefs::kArcEnabled), ShouldArcTransitionToManaged()); - EXPECT_EQ(arc::GetSupervisionTransition(profile()), + EXPECT_EQ(arc::GetManagementTransition(profile()), ShouldArcTransitionToManaged() - ? arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED - : arc::ArcSupervisionTransition::NO_TRANSITION); + ? arc::ArcManagementTransition::UNMANAGED_TO_MANAGED + : arc::ArcManagementTransition::NO_TRANSITION); } INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/ash/crosapi/image_writer_ash.cc b/chrome/browser/ash/crosapi/image_writer_ash.cc index 6f80edc..af0a3bfa 100644 --- a/chrome/browser/ash/crosapi/image_writer_ash.cc +++ b/chrome/browser/ash/crosapi/image_writer_ash.cc
@@ -14,6 +14,7 @@ #include "content/public/browser/browser_context.h" #include "extensions/browser/api/extensions_api_client.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" namespace crosapi { @@ -70,7 +71,50 @@ extensions::image_writer::OperationManager::Get(GetActiveUserBrowserContext()) ->DestroyPartitions( /*extension_id=*/remote_client_token.ToString(), storage_unit_id, - base::BindOnce(&ImageWriterAsh::OnDestroyPartitionsDone, + base::BindOnce(&ImageWriterAsh::OnOperationCompleted, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void ImageWriterAsh::WriteFromUrl( + const std::string& storage_unit_id, + const GURL& image_url, + const absl::optional<std::string>& image_hash, + mojo::PendingRemote<mojom::ImageWriterClient> remote_client, + WriteFromUrlCallback callback) { + mojo::Remote<mojom::ImageWriterClient> remote(std::move(remote_client)); + base::UnguessableToken remote_client_token = base::UnguessableToken::Create(); + remote.set_disconnect_handler( + base::BindOnce(&ImageWriterAsh::OnImageWriterClientDisconnected, + weak_ptr_factory_.GetWeakPtr(), remote_client_token)); + remote_image_writer_clients_.emplace(remote_client_token.ToString(), + std::move(remote)); + + extensions::image_writer::OperationManager::Get(GetActiveUserBrowserContext()) + ->StartWriteFromUrl( + /*extension_id=*/remote_client_token.ToString(), image_url, + image_hash ? image_hash.value() : "", storage_unit_id, + base::BindOnce(&ImageWriterAsh::OnOperationCompleted, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void ImageWriterAsh::WriteFromFile( + const std::string& storage_unit_id, + const base::FilePath& image_path, + mojo::PendingRemote<mojom::ImageWriterClient> remote_client, + WriteFromFileCallback callback) { + mojo::Remote<mojom::ImageWriterClient> remote(std::move(remote_client)); + base::UnguessableToken remote_client_token = base::UnguessableToken::Create(); + remote.set_disconnect_handler( + base::BindOnce(&ImageWriterAsh::OnImageWriterClientDisconnected, + weak_ptr_factory_.GetWeakPtr(), remote_client_token)); + remote_image_writer_clients_.emplace(remote_client_token.ToString(), + std::move(remote)); + + extensions::image_writer::OperationManager::Get(GetActiveUserBrowserContext()) + ->StartWriteFromFile( + /*extension_id=*/remote_client_token.ToString(), image_path, + storage_unit_id, + base::BindOnce(&ImageWriterAsh::OnOperationCompleted, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -114,8 +158,13 @@ const base::UnguessableToken& remote_client_token) { auto it = remote_image_writer_clients_.find(remote_client_token.ToString()); if (it != remote_image_writer_clients_.end()) { - // TODO(crbug.com/120885): Cancel the write operation if there is any - // pending. + // Cancel the write operation if there is any pending. + extensions::image_writer::OperationManager::Get( + GetActiveUserBrowserContext()) + ->CancelWrite(/*extension_id=*/remote_client_token.ToString(), + base::BindOnce(&ImageWriterAsh::OnCancelWriteDone, + weak_ptr_factory_.GetWeakPtr())); + remote_image_writer_clients_.erase(it); } } @@ -136,10 +185,15 @@ std::move(callback).Run(std::move(mojo_devices)); } -void ImageWriterAsh::OnDestroyPartitionsDone(DestroyPartitionsCallback callback, - bool success, - const std::string& error) { +void ImageWriterAsh::OnOperationCompleted(OperationCallback callback, + bool success, + const std::string& error) { std::move(callback).Run(success ? absl::nullopt : absl::make_optional(error)); } +void ImageWriterAsh::OnCancelWriteDone(bool success, const std::string& error) { + if (!success) + DLOG(WARNING) << "Failed to cancel write for remote client: " << error; +} + } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/image_writer_ash.h b/chrome/browser/ash/crosapi/image_writer_ash.h index 1b6372b..4dd2afa6 100644 --- a/chrome/browser/ash/crosapi/image_writer_ash.h +++ b/chrome/browser/ash/crosapi/image_writer_ash.h
@@ -22,6 +22,8 @@ #include "mojo/public/cpp/bindings/remote.h" #include "third_party/abseil-cpp/absl/types/optional.h" +class GURL; + namespace crosapi { // Implements crosapi image writer interface which performs operations on @@ -43,6 +45,16 @@ const std::string& storage_unit_id, mojo::PendingRemote<mojom::ImageWriterClient> remote_client, DestroyPartitionsCallback callback) override; + void WriteFromUrl(const std::string& storage_unit_id, + const GURL& image_url, + const absl::optional<std::string>& image_hash, + mojo::PendingRemote<mojom::ImageWriterClient> remote_client, + WriteFromUrlCallback callback) override; + void WriteFromFile( + const std::string& storage_unit_id, + const base::FilePath& image_path, + mojo::PendingRemote<mojom::ImageWriterClient> remote_client, + WriteFromFileCallback callback) override; // Dispatches OnWriteProgress event to the remote image writer client // identified by |client_token_string|. @@ -75,9 +87,16 @@ void OnDeviceListReady(ListRemovableStorageDevicesCallback callback, scoped_refptr<StorageDeviceList> device_list); - void OnDestroyPartitionsDone(DestroyPartitionsCallback callback, - bool success, - const std::string& error); + // Called after an operation has been handled by either posting it to + // perform on the removable disk, or returning with |error| due to sanity + // check failure. + using OperationCallback = + base::OnceCallback<void(const absl::optional<std::string>&)>; + void OnOperationCompleted(OperationCallback callback, + bool success, + const std ::string& error); + + void OnCancelWriteDone(bool success, const std::string& error); // This class supports any number of connections. This allows ImageWriter to // have multiple, potentially thread-affine, remotes.
diff --git a/chrome/browser/ash/login/chrome_restart_request.cc b/chrome/browser/ash/login/chrome_restart_request.cc index 0858020..4de6f9b 100644 --- a/chrome/browser/ash/login/chrome_restart_request.cc +++ b/chrome/browser/ash/login/chrome_restart_request.cc
@@ -146,6 +146,7 @@ ::switches::kV, ::switches::kVModule, ::switches::kVideoCaptureUseGpuMemoryBuffer, + ::switches::kEnableWebGLDeveloperExtensions, ::switches::kEnableWebGLDraftExtensions, ::switches::kDisableWebGLImageChromium, ::switches::kEnableWebGLImageChromium,
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc index de43840..8966a83 100644 --- a/chrome/browser/ash/login/existing_user_controller.cc +++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -20,7 +20,6 @@ #include "base/compiler_specific.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" -#include "base/metrics/histogram_macros.h" #include "base/scoped_observation.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -232,8 +231,8 @@ } void RecordPasswordChangeFlow(LoginPasswordChangeFlow flow) { - UMA_HISTOGRAM_ENUMERATION("Login.PasswordChangeFlow", flow, - LOGIN_PASSWORD_CHANGE_FLOW_COUNT); + base::UmaHistogramEnumeration("Login.PasswordChangeFlow", flow, + LOGIN_PASSWORD_CHANGE_FLOW_COUNT); } bool IsTestingMigrationUI() { @@ -946,9 +945,10 @@ login_performer_->set_delegate(nullptr); ignore_result(login_performer_.release()); - if (user_context.GetAuthFlow() == UserContext::AUTH_FLOW_OFFLINE) - UMA_HISTOGRAM_COUNTS_100("Login.OfflineSuccess.Attempts", - num_login_attempts_); + if (user_context.GetAuthFlow() == UserContext::AUTH_FLOW_OFFLINE) { + base::UmaHistogramCounts100("Login.OfflineSuccess.Attempts", + num_login_attempts_); + } const bool is_enterprise_managed = g_browser_process->platform_part() ->browser_policy_connector_chromeos() @@ -1509,7 +1509,7 @@ // being deprecated anyway. return; } - signin_ui->ShowSigninError(error, details, num_login_attempts_); + signin_ui->ShowSigninError(error, details); } void ExistingUserController::SendAccessibilityAlert(
diff --git a/chrome/browser/ash/login/existing_user_controller_browsertest.cc b/chrome/browser/ash/login/existing_user_controller_browsertest.cc index 6512d21..2904327 100644 --- a/chrome/browser/ash/login/existing_user_controller_browsertest.cc +++ b/chrome/browser/ash/login/existing_user_controller_browsertest.cc
@@ -274,7 +274,7 @@ void ExpectLoginFailure() { EXPECT_CALL(*mock_login_display_, SetUIEnabled(false)).Times(1); EXPECT_CALL(*mock_signin_ui_, - ShowSigninError(SigninError::kOwnerKeyLost, std::string(), 1)) + ShowSigninError(SigninError::kOwnerKeyLost, std::string())) .Times(1); EXPECT_CALL(*mock_login_display_, SetUIEnabled(true)).Times(1); } @@ -947,7 +947,7 @@ EXPECT_CALL( *mock_signin_ui_, ShowSigninError(SigninError::kGoogleAccountNotAllowed, - "Google accounts are not allowed on this device", 1)) + "Google accounts are not allowed on this device")) .Times(1); EXPECT_CALL(*mock_login_display_, SetUIEnabled(true)).Times(1); }
diff --git a/chrome/browser/ash/login/login_browsertest.cc b/chrome/browser/ash/login/login_browsertest.cc index 5077c2fb..8519d070 100644 --- a/chrome/browser/ash/login/login_browsertest.cc +++ b/chrome/browser/ash/login/login_browsertest.cc
@@ -143,10 +143,21 @@ FakeGaiaMixin::kFakeUserPassword, FakeGaiaMixin::kEmptyUserServices); OobeScreenWaiter(SignInFatalErrorView::kScreenId).Wait(); + EXPECT_TRUE(ash::LoginScreenTestApi::IsOobeDialogVisible()); test::ClickSignInFatalScreenActionButton(); OobeScreenWaiter(GaiaView::kScreenId).Wait(); } +IN_PROC_BROWSER_TEST_F(LoginOfflineTest, FatalScreenShown) { + EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible()); + chromeos::FakeUserDataAuthClient::Get()->set_cryptohome_error( + user_data_auth::CRYPTOHOME_ERROR_TPM_UPDATE_REQUIRED); + ash::LoginScreenTestApi::SubmitPassword(test_account_id_, "password", + /*check_if_submittable=*/false); + OobeScreenWaiter(SignInFatalErrorView::kScreenId).Wait(); + EXPECT_TRUE(ash::LoginScreenTestApi::IsOobeDialogVisible()); +} + class LoginOfflineManagedTest : public LoginManagerTest { public: LoginOfflineManagedTest() {
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager.cc index 445eb97..d9d6ad6 100644 --- a/chrome/browser/ash/login/saml/in_session_password_change_manager.cc +++ b/chrome/browser/ash/login/saml/in_session_password_change_manager.cc
@@ -27,6 +27,7 @@ #include "components/user_manager/user_manager.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" namespace chromeos {
diff --git a/chrome/browser/ash/login/screens/active_directory_login_screen.cc b/chrome/browser/ash/login/screens/active_directory_login_screen.cc index f4c445f3..36a039f 100644 --- a/chrome/browser/ash/login/screens/active_directory_login_screen.cc +++ b/chrome/browser/ash/login/screens/active_directory_login_screen.cc
@@ -167,8 +167,7 @@ view_->SetErrorState(username, static_cast<int>(ActiveDirectoryErrorState::NONE)); LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError( - GetSigninError(error), /*details=*/std::string(), - /*login_attempts=*/1); + GetSigninError(error), /*details=*/std::string()); } }
diff --git a/chrome/browser/ash/login/screens/locale_switch_screen.cc b/chrome/browser/ash/login/screens/locale_switch_screen.cc index eca532d..477920a 100644 --- a/chrome/browser/ash/login/screens/locale_switch_screen.cc +++ b/chrome/browser/ash/login/screens/locale_switch_screen.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/login/screens/locale_switch_screen.h" +#include "ash/constants/ash_features.h" #include "base/time/time.h" #include "chrome/browser/ash/base/locale_util.h" #include "chrome/browser/ash/profiles/profile_helper.h" @@ -23,10 +24,19 @@ namespace ash { namespace { -constexpr base::TimeDelta kLocaleWaitTimeout = base::TimeDelta::FromSeconds(5); +constexpr base::TimeDelta kWaitTimeout = base::TimeDelta::FromSeconds(5); +// Returns whether all information needed (locale and account capabilities) +// has been fetched. +bool IsAllInfoFetched(const AccountInfo& info) { + bool result = !info.locale.empty(); + if (features::IsMinorModeRestrictionEnabled()) + result &= info.capabilities.AreAllCapabilitiesKnown(); + return result; } +} // namespace + // static std::string LocaleSwitchScreen::GetResultString(Result result) { switch (result) { @@ -88,35 +98,32 @@ DCHECK(user->HasGaiaAccount()); - auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); - if (!identity_manager) { + identity_manager_ = IdentityManagerFactory::GetForProfile(profile); + if (!identity_manager_) { NOTREACHED(); exit_callback_.Run(Result::NOT_APPLICABLE); return; } CoreAccountId primary_account_id = - identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin); + identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin); + refresh_token_loaded_ = + identity_manager_->HasAccountWithRefreshToken(primary_account_id); - if (!identity_manager->HasAccountWithRefreshToken(primary_account_id)) { - exit_callback_.Run(Result::LOCALE_FETCH_FAILED); - return; - } - - if (identity_manager->GetErrorStateOfRefreshTokenForAccount( + if (identity_manager_->GetErrorStateOfRefreshTokenForAccount( primary_account_id) != GoogleServiceAuthError::AuthErrorNone()) { exit_callback_.Run(Result::LOCALE_FETCH_FAILED); return; } - identity_manager_observer_.Observe(identity_manager); + identity_manager_observer_.Observe(identity_manager_); gaia_id_ = user->GetAccountId().GetGaiaId(); const AccountInfo account_info = - identity_manager->FindExtendedAccountInfoByGaiaId(gaia_id_); - if (account_info.locale.empty()) { + identity_manager_->FindExtendedAccountInfoByGaiaId(gaia_id_); + if (!refresh_token_loaded_ || !IsAllInfoFetched(account_info)) { // Will continue from observer. - timeout_waiter_.Start(FROM_HERE, kLocaleWaitTimeout, + timeout_waiter_.Start(FROM_HERE, kWaitTimeout, base::BindOnce(&LocaleSwitchScreen::OnTimeout, weak_factory_.GetWeakPtr())); return; @@ -148,11 +155,21 @@ void LocaleSwitchScreen::OnExtendedAccountInfoUpdated( const AccountInfo& account_info) { - if (account_info.gaia != gaia_id_ || account_info.locale.empty()) + if (account_info.gaia != gaia_id_ || !refresh_token_loaded_ || + !IsAllInfoFetched(account_info)) { return; + } SwitchLocale(account_info.locale); } +void LocaleSwitchScreen::OnRefreshTokensLoaded() { + // Account information can only be guaranteed correct after refresh tokens + // are loaded. + refresh_token_loaded_ = true; + OnExtendedAccountInfoUpdated( + identity_manager_->FindExtendedAccountInfoByGaiaId(gaia_id_)); +} + void LocaleSwitchScreen::SwitchLocale(std::string locale) { ResetState(); @@ -189,11 +206,19 @@ } void LocaleSwitchScreen::OnTimeout() { - ResetState(); - // If it happens during the tests - something is wrong with the test - // configuration. Thus making it debug log. - DLOG(ERROR) << "Timeout of the locale fetch"; - exit_callback_.Run(Result::LOCALE_FETCH_TIMEOUT); + const AccountInfo account_info = + identity_manager_->FindExtendedAccountInfoByGaiaId(gaia_id_); + if (refresh_token_loaded_ && !account_info.locale.empty()) { + // We should switch locale if locale is fetched but it timed out while + // waiting for other account information (e.g. capabilities). + SwitchLocale(account_info.locale); + } else { + ResetState(); + // If it happens during the tests - something is wrong with the test + // configuration. Thus making it debug log. + DLOG(ERROR) << "Timeout of the locale fetch"; + exit_callback_.Run(Result::LOCALE_FETCH_TIMEOUT); + } } } // namespace ash
diff --git a/chrome/browser/ash/login/screens/locale_switch_screen.h b/chrome/browser/ash/login/screens/locale_switch_screen.h index f4ba39a..057e69a 100644 --- a/chrome/browser/ash/login/screens/locale_switch_screen.h +++ b/chrome/browser/ash/login/screens/locale_switch_screen.h
@@ -20,7 +20,8 @@ namespace ash { -// This screen handles OOBE locale switch for the post-login screens. +// This screen waits for account information (locale and account capabilities) +// to be fetched and handles OOBE locale switch for the post-login screens. class LocaleSwitchScreen : public BaseScreen, public signin::IdentityManager::Observer { public: @@ -47,6 +48,7 @@ const CoreAccountInfo& account_info, const GoogleServiceAuthError& error) override; void OnExtendedAccountInfoUpdated(const AccountInfo& info) override; + void OnRefreshTokensLoaded() override; private: // BaseScreen: @@ -65,12 +67,15 @@ std::string gaia_id_; ScreenExitCallback exit_callback_; + signin::IdentityManager* identity_manager_ = nullptr; base::ScopedObservation<signin::IdentityManager, signin::IdentityManager::Observer> identity_manager_observer_{this}; base::OneShotTimer timeout_waiter_; + bool refresh_token_loaded_ = false; + base::WeakPtrFactory<LocaleSwitchScreen> weak_factory_{this}; };
diff --git a/chrome/browser/ash/login/screens/management_transition_screen_browsertest.cc b/chrome/browser/ash/login/screens/management_transition_screen_browsertest.cc index 98475ee..68253da 100644 --- a/chrome/browser/ash/login/screens/management_transition_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/management_transition_screen_browsertest.cc
@@ -24,8 +24,8 @@ #include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "components/arc/arc_features.h" #include "components/arc/arc_prefs.h" +#include "components/arc/session/arc_management_transition.h" #include "components/arc/session/arc_session_runner.h" -#include "components/arc/session/arc_supervision_transition.h" #include "components/arc/test/fake_arc_session.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" @@ -154,7 +154,7 @@ ProfileManager::GetPrimaryUserProfile()->GetPrefs()->SetInteger( arc::prefs::kArcManagementTransition, - static_cast<int>(arc::ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(arc::ArcManagementTransition::NO_TRANSITION)); EXPECT_FALSE(ProfileManager::GetPrimaryUserProfile()->GetPrefs()->GetBoolean( arc::prefs::kArcDataRemoveRequested));
diff --git a/chrome/browser/ash/login/screens/offline_login_screen.cc b/chrome/browser/ash/login/screens/offline_login_screen.cc index fcc6053c..bad3684 100644 --- a/chrome/browser/ash/login/screens/offline_login_screen.cc +++ b/chrome/browser/ash/login/screens/offline_login_screen.cc
@@ -148,7 +148,7 @@ << AccountId::AccountTypeToString(account_id.GetAccountType()); LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError( SigninError::kOfflineFailedNetworkNotConnected, - /*details=*/std::string(), /*login_attempts=*/1); + /*details=*/std::string()); return; }
diff --git a/chrome/browser/ash/login/screens/parental_handoff_screen_browsertest.cc b/chrome/browser/ash/login/screens/parental_handoff_screen_browsertest.cc index 04c525fd..c98763c 100644 --- a/chrome/browser/ash/login/screens/parental_handoff_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/parental_handoff_screen_browsertest.cc
@@ -65,8 +65,6 @@ ParentalHandoffScreen* GetParentalHandoffScreen(); - void ExitSyncConsentScreen(); - void SkipToParentalHandoffScreen(); const absl::optional<ParentalHandoffScreen::Result>& result() const { @@ -133,29 +131,9 @@ ->GetScreen<ParentalHandoffScreen>(); } -void ParentalHandoffScreenBrowserTest::ExitSyncConsentScreen() { - test::OobeJS().CreateVisibilityWaiter(true, {"sync-consent"})->Wait(); - - const std::string button_name = features::IsSplitSettingsSyncEnabled() - ? "acceptButton" - : "nonSplitSettingsAcceptButton"; - test::OobeJS().ExpectEnabledPath({"sync-consent", button_name}); - test::OobeJS().CreateFocusWaiter({"sync-consent", button_name})->Wait(); - test::OobeJS().TapOnPath({"sync-consent", button_name}); - - OobeScreenExitWaiter waiter(SyncConsentScreenView::kScreenId); - waiter.Wait(); -} - void ParentalHandoffScreenBrowserTest::SkipToParentalHandoffScreen() { - WizardController* wizard = WizardController::default_controller(); - - // Wait for sync consent screen and exit from it. - OobeScreenWaiter sync_consent_waiter(SyncConsentScreenView ::kScreenId); - sync_consent_waiter.Wait(); - EXPECT_EQ(wizard->current_screen()->screen_id(), - SyncConsentScreenView::kScreenId); - ExitSyncConsentScreen(); + LoginDisplayHost::default_host()->StartWizard( + ParentalHandoffScreenView::kScreenId); } void ParentalHandoffScreenBrowserTest::HandleScreenExit( @@ -197,18 +175,7 @@ login_manager_mixin().LoginAsNewChildUser(); WizardControllerExitWaiter(UserCreationView::kScreenId).Wait(); - WizardControllerExitWaiter(LocaleSwitchView::kScreenId).Wait(); - base::RunLoop().RunUntilIdle(); - - ASSERT_EQ( - WizardController::default_controller()->current_screen()->screen_id(), - EduCoexistenceLoginScreen::kScreenId); - - // Current screen is EduCoexistenceLoginScreen. Close it. - GetEduCoexistenceLoginDialog()->Close(); - SkipToParentalHandoffScreen(); - OobeScreenWaiter parental_handoff_waiter( ParentalHandoffScreenView::kScreenId); parental_handoff_waiter.Wait();
diff --git a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc index 6e4acf8..7dc3d2e8 100644 --- a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc +++ b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
@@ -40,6 +40,7 @@ #include "components/prefs/pref_service.h" #include "components/signin/public/identity_manager/consent_level.h" #include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/identity_test_utils.h" #include "components/sync/base/pref_names.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_user_settings.h" @@ -64,6 +65,8 @@ "syncConsentOverviewDialog"}; const test::UIPath kSplitSettingsDialog = {kSyncConsent, "splitSettingsSyncConsentDialog"}; +const test::UIPath kReviewSettingsCheckBox = {kSyncConsent, + "reviewSettingsBox"}; const test::UIPath kNonSplitSettingsAcceptButton = { kSyncConsent, "nonSplitSettingsAcceptButton"}; const test::UIPath kNonSplitSettingsDeclineButton = { @@ -155,7 +158,7 @@ IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2, }; } else { - if (features::IsMinorModeRestrictionEnabled()) { + if (features::IsMinorModeRestrictionEnabled() && is_minor_user_) { expected_consent_ids_ = { IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE_WITH_DEVICE, IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE_2, @@ -207,6 +210,8 @@ void WaitForScreenShown() { OobeScreenWaiter(SyncConsentScreenView::kScreenId).Wait(); + // This is needed to refresh the screen based on minor mode signal. + GetSyncConsentScreen()->Show(/*wizard_context*/ nullptr); } void ReplaceExitCallback() { @@ -220,12 +225,20 @@ login_manager_mixin_.LoginAsNewRegularUser(); OobeScreenExitWaiter(GetFirstSigninScreen()).Wait(); // No need to explicitly show the screen as it is the first one after login. + SetIsMinorUser(is_minor_user_); + } + + void LoginToSyncConsentScreenWithUnknownCapability() { + login_manager_mixin_.LoginAsNewRegularUser(); + OobeScreenExitWaiter(GetFirstSigninScreen()).Wait(); + // No need to explicitly show the screen as it is the first one after login. } protected: absl::optional<SyncConsentScreen::Result> screen_result_; base::HistogramTester histogram_tester_; std::vector<int> expected_consent_ids_; + bool is_minor_user_ = false; static SyncConsentScreen* GetSyncConsentScreen() { return static_cast<SyncConsentScreen*>( @@ -260,6 +273,16 @@ std::move(screen_exit_callback_).Run(); } + void SetIsMinorUser(bool is_minor_user) { + Profile* profile = ProfileManager::GetPrimaryUserProfile(); + auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); + AccountInfo account_info = + identity_manager->FindExtendedAccountInfoByGaiaId(test::kTestGaiaId); + account_info.capabilities.set_can_offer_extended_chrome_sync_promos( + !is_minor_user); + signin::UpdateAccountInfoForAccount(identity_manager, account_info); + } + bool screen_exited_ = false; base::RepeatingClosure screen_exit_callback_; SyncConsentScreen::ScreenExitCallback original_callback_; @@ -382,6 +405,7 @@ EXPECT_EQ(g_browser_process->GetApplicationLocale(), "en-US"); SwitchLanguage(GetParam()); LoginToSyncConsentScreen(); + WaitForScreenShown(); SyncConsentScreen* screen = GetSyncConsentScreen(); ConsentRecordedWaiter consent_recorded_waiter; @@ -454,6 +478,7 @@ #endif IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest, MAYBE_DefaultFlow) { LoginToSyncConsentScreen(); + WaitForScreenShown(); // OS sync is disabled by default. Profile* profile = ProfileManager::GetPrimaryUserProfile(); @@ -744,6 +769,7 @@ public: SyncConsentMinorModeTest() { sync_feature_list_.InitAndEnableFeature(features::kMinorModeRestriction); + is_minor_user_ = true; } ~SyncConsentMinorModeTest() override = default; @@ -762,6 +788,7 @@ test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait(); test::OobeJS().ExpectVisiblePath(kOverviewDialog); test::OobeJS().ExpectVisiblePath(kNonSplitSettingsDeclineButton); + test::OobeJS().ExpectHiddenPath(kReviewSettingsCheckBox); // Expect all data types are disabled for minor users when initialized. Profile* profile = ProfileManager::GetPrimaryUserProfile(); @@ -812,6 +839,7 @@ test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait(); test::OobeJS().ExpectVisiblePath(kOverviewDialog); test::OobeJS().ExpectVisiblePath(kNonSplitSettingsAcceptButton); + test::OobeJS().ExpectHiddenPath(kReviewSettingsCheckBox); // Expect all data types are disabled for minor users when initialized. Profile* profile = ProfileManager::GetPrimaryUserProfile(); @@ -872,5 +900,16 @@ EXPECT_TRUE(settings->GetSelectedTypes().Empty()); } +IN_PROC_BROWSER_TEST_F(SyncConsentMinorModeTest, + AssumeMinorUserWhenUnknownCapability) { + LoginToSyncConsentScreenWithUnknownCapability(); + WaitForScreenShown(); + + test::OobeJS().CreateVisibilityWaiter(true, {kSyncConsent})->Wait(); + test::OobeJS().ExpectVisiblePath(kOverviewDialog); + test::OobeJS().ExpectVisiblePath(kNonSplitSettingsDeclineButton); + test::OobeJS().ExpectHiddenPath(kReviewSettingsCheckBox); +} + } // namespace } // namespace ash
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc index c394d0ad..4fc26ac 100644 --- a/chrome/browser/ash/login/screens/sync_consent_screen.cc +++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -23,6 +23,7 @@ #include "chrome/common/webui_url_constants.h" #include "components/consent_auditor/consent_auditor.h" #include "components/prefs/pref_service.h" +#include "components/signin/public/identity_manager/account_capabilities.h" #include "components/signin/public/identity_manager/consent_level.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" @@ -52,6 +53,20 @@ value); } +// Returns true if the user is in minor mode (e.g. under age of 18). The value +// is read from account capabilities. We assume user is in minor mode if +// capability value is unknown. +bool IsMinorMode(Profile* profile, const user_manager::User* user) { + if (!features::IsMinorModeRestrictionEnabled()) + return false; + auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); + std::string gaia_id = user->GetAccountId().GetGaiaId(); + const AccountInfo account_info = + identity_manager->FindExtendedAccountInfoByGaiaId(gaia_id); + return account_info.capabilities.can_offer_extended_chrome_sync_promos() != + AccountCapabilities::Tribool::kTrue; +} + } // namespace // static @@ -151,6 +166,7 @@ if (service) sync_service_observation_.Observe(service); } + PrepareScreenBasedOnCapability(); // Show the entire screen. // If SyncScreenBehavior is show, this should show the sync consent screen. // If SyncScreenBehavior is unknown, this should show the loading throbber. @@ -178,14 +194,7 @@ consent_description, consent_confirmation); profile_->GetPrefs()->SetBoolean(::prefs::kShowSyncSettingsOnSessionStart, review_sync); - - syncer::SyncService* sync_service = GetSyncService(profile_); - CHECK(sync_service); - syncer::SyncUserSettings* sync_settings = sync_service->GetUserSettings(); - if (opted_in != sync_settings->IsSyncEverythingEnabled()) { - syncer::UserSelectableTypeSet empty_set; - sync_settings->SetSelectedTypes(opted_in, empty_set); - } + SetSyncEverythingEnabled(opted_in); Finish(Result::NEXT); } @@ -246,11 +255,8 @@ } void SyncConsentScreen::MaybeEnableSyncForSkip() { - // Prior to SplitSettingsSync, sync is autostarted during SyncService - // creation, so sync is already in the right state. - if (!features::IsSplitSettingsSyncEnabled()) - return; - + // "sync everything" toggle is disabled during SyncService creation. We need + // to turn it on if sync service needs to be enabled. switch (behavior_) { case SyncScreenBehavior::kUnknown: case SyncScreenBehavior::kShow: @@ -264,7 +270,14 @@ case SyncScreenBehavior::kSkipAndEnableNonBrandedBuild: case SyncScreenBehavior::kSkipAndEnableEmphemeralUser: case SyncScreenBehavior::kSkipAndEnableScreenPolicy: - UpdateSyncSettings(/*enable_sync=*/true); + // Prior to SplitSettingsSync, sync is autostarted during SyncService + // with "sync everything" toggle off. We need to turn it on here. For + // SplitSettingsSync, we also need to update other sync-related flags. + if (features::IsSplitSettingsSyncEnabled()) { + UpdateSyncSettings(/*enable_sync=*/true); + } else { + SetSyncEverythingEnabled(/*enabled=*/true); + } return; } } @@ -330,6 +343,7 @@ return; if (behavior_ == SyncScreenBehavior::kShow) { + PrepareScreenBasedOnCapability(); view_->SetThrobberVisible(false /*visible*/); GetSyncService(profile_)->RemoveObserver(this); } else { @@ -380,6 +394,23 @@ return sync_service->IsEngineInitialized(); } +void SyncConsentScreen::PrepareScreenBasedOnCapability() { + bool is_minor_mode = IsMinorMode(profile_, user_); + // Turn on "sync everything" toggle for non-minor users; turn off all data + // types for minor users. + SetSyncEverythingEnabled(!is_minor_mode); + view_->SetIsMinorMode(is_minor_mode); +} + +void SyncConsentScreen::SetSyncEverythingEnabled(bool enabled) { + syncer::SyncService* sync_service = GetSyncService(profile_); + syncer::SyncUserSettings* sync_settings = sync_service->GetUserSettings(); + if (enabled != sync_settings->IsSyncEverythingEnabled()) { + syncer::UserSelectableTypeSet empty_set; + sync_settings->SetSelectedTypes(enabled, empty_set); + } +} + void SyncConsentScreen::SetProfileSyncDisabledByPolicyForTesting(bool value) { test_sync_disabled_by_policy_ = value; }
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.h b/chrome/browser/ash/login/screens/sync_consent_screen.h index c822b5c..7762c58 100644 --- a/chrome/browser/ash/login/screens/sync_consent_screen.h +++ b/chrome/browser/ash/login/screens/sync_consent_screen.h
@@ -148,6 +148,15 @@ // Returns true if profile sync has finished initialization. bool IsProfileSyncEngineInitialized() const; + // This function does two things based on account capability: turn on "sync + // everything" toggle for non-minor users; pass the minor mode signal to + // the front end, which controls whether nudge techniques could be used. + void PrepareScreenBasedOnCapability(); + + // Set "sync everything" toggle to be on or off. We also turn off all data + // types when the toggle is off. + void SetSyncEverythingEnabled(bool enabled); + // Controls screen appearance. // Spinner is shown until sync status has been decided. SyncScreenBehavior behavior_ = SyncScreenBehavior::kUnknown;
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc index 3dec0daf..aa66aab 100644 --- a/chrome/browser/ash/login/session/user_session_manager.cc +++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -1792,8 +1792,8 @@ return false; } else if (!user_manager->IsCurrentUserNew() && - arc::GetSupervisionTransition(profile) != - arc::ArcSupervisionTransition::NO_TRANSITION) { + arc::GetManagementTransition(profile) != + arc::ArcManagementTransition::NO_TRANSITION) { LoginDisplayHost::default_host() ->GetSigninUI() ->StartManagementTransition();
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc index 708e9a2..83ae7dd 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.cc +++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -447,10 +447,8 @@ } void LoginDisplayHostCommon::ShowSigninError(SigninError error, - const std::string& details, - int login_attempts) { - VLOG(1) << "Show error, error_id: " << static_cast<int>(error) - << ", attempts:" << login_attempts; + const std::string& details) { + VLOG(1) << "Show error, error_id: " << static_cast<int>(error); std::string error_text; switch (error) { @@ -479,13 +477,11 @@ } } - std::string help_link_text; - if (login_attempts > 1) - help_link_text = l10n_util::GetStringUTF8(IDS_LEARN_MORE); + std::string help_link_text = l10n_util::GetStringUTF8(IDS_LEARN_MORE); GetWizardController()->GetScreen<SignInFatalErrorScreen>()->SetCustomError( error_text, keyboard_hint, details, help_link_text); - GetWizardController()->AdvanceToScreen(SignInFatalErrorView::kScreenId); + StartWizard(SignInFatalErrorView::kScreenId); } void LoginDisplayHostCommon::OnBrowserAdded(Browser* browser) {
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.h b/chrome/browser/ash/login/ui/login_display_host_common.h index a431769..6dd5d13 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.h +++ b/chrome/browser/ash/login/ui/login_display_host_common.h
@@ -74,9 +74,7 @@ const UserContext& user_context, EncryptionMigrationMode migration_mode, base::OnceCallback<void(const UserContext&)> on_skip_migration) final; - void ShowSigninError(SigninError error, - const std::string& details, - int login_attempts) final; + void ShowSigninError(SigninError error, const std::string& details) final; // BrowserListObserver: void OnBrowserAdded(Browser* browser) override;
diff --git a/chrome/browser/ash/login/ui/mock_signin_ui.h b/chrome/browser/ash/login/ui/mock_signin_ui.h index f298acf..a364ef3 100644 --- a/chrome/browser/ash/login/ui/mock_signin_ui.h +++ b/chrome/browser/ash/login/ui/mock_signin_ui.h
@@ -37,7 +37,7 @@ (override)); MOCK_METHOD(void, ShowSigninError, - (SigninError, const std::string&, int), + (SigninError, const std::string&), (override)); MOCK_METHOD(void, StartBrowserDataMigration, (), (override)); };
diff --git a/chrome/browser/ash/login/ui/signin_ui.h b/chrome/browser/ash/login/ui/signin_ui.h index 8757deb..2a0d69d 100644 --- a/chrome/browser/ash/login/ui/signin_ui.h +++ b/chrome/browser/ash/login/ui/signin_ui.h
@@ -63,8 +63,7 @@ bool password_incorrect) = 0; virtual void ShowSigninError(SigninError error, - const std::string& details, - int login_attempts) = 0; + const std::string& details) = 0; // Show the browser data migration UI and start the migration. virtual void StartBrowserDataMigration() = 0;
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 319825d4..9b16ecb 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -753,7 +753,15 @@ void WizardController::OnSignInFatalErrorScreenExit() { OnScreenExit(SignInFatalErrorView::kScreenId, kDefaultExitReason); - AdvanceToSigninScreen(); + // It's possible to get on the SignInFatalError screen both from the user pods + // and from the Gaia sign-in screen. The screen exits when user presses + // "try again". Go to the previous screen if it is set. Otherwise go to the + // login screen with pods. + if (previous_screen_) { + SetCurrentScreen(previous_screen_); + return; + } + ShowLoginScreen(); } void WizardController::ShowLoginScreen() { @@ -1919,7 +1927,8 @@ screen_id == SignInFatalErrorView::kScreenId || screen_id == LocaleSwitchView::kScreenId || screen_id == OfflineLoginView::kScreenId || - screen_id == OsInstallScreenView::kScreenId) { + screen_id == OsInstallScreenView::kScreenId || + screen_id == ParentalHandoffScreenView::kScreenId) { SetCurrentScreen(GetScreen(screen_id)); } else { NOTREACHED();
diff --git a/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc b/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc index dd846b0d..a979a3b 100644 --- a/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc +++ b/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc
@@ -58,7 +58,7 @@ #include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.h" -#include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h" +#include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h" #include "chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h" #include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h" #include "chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h" @@ -282,7 +282,7 @@ std::make_unique<DeviceScheduledUpdateChecker>( ash::CrosSettings::Get(), chromeos::NetworkHandler::Get()->network_state_handler(), - std::make_unique<ScheduledTaskExecutor>( + std::make_unique<ScheduledTaskExecutorImpl>( update_checker_internal::kUpdateCheckTimerTag)); chromeos::BulkPrintersCalculatorFactory* calculator_factory =
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager.cc index 8802efb..1939141 100644 --- a/chrome/browser/ash/policy/dlp/dlp_content_manager.cc +++ b/chrome/browser/ash/policy/dlp/dlp_content_manager.cc
@@ -122,16 +122,8 @@ bool DlpContentManager::IsPrintingRestricted( content::WebContents* web_contents) const { - // If we're viewing the PDF in a MimeHandlerViewGuest, use its embedded - // WebContents. - auto* guest_view = - extensions::MimeHandlerViewGuest::FromWebContents(web_contents); - web_contents = - guest_view ? guest_view->embedder_web_contents() : web_contents; - RestrictionLevelAndUrl restriction_info = - GetConfidentialRestrictions(web_contents) - .GetRestrictionLevelAndUrl(DlpContentRestriction::kPrint); + GetPrintingRestrictionInfo(web_contents); const bool is_blocked = restriction_info.level == DlpRulesManager::Level::kBlock; DlpBooleanHistogram(dlp::kPrintingBlockedUMA, is_blocked); @@ -145,6 +137,14 @@ return is_blocked; } +bool DlpContentManager::ShouldWarnBeforePrinting( + content::WebContents* web_contents) const { + RestrictionLevelAndUrl restriction_info = + GetPrintingRestrictionInfo(web_contents); + // TODO(crbug.com/1227700): Add reporting and metrics for WARN + return restriction_info.level == DlpRulesManager::Level::kWarn; +} + bool DlpContentManager::IsScreenCaptureRestricted( const content::DesktopMediaID& media_id) const { RestrictionLevelAndUrl restriction_info = @@ -603,6 +603,19 @@ return kPrivacyScreenOffDelay; } +RestrictionLevelAndUrl DlpContentManager::GetPrintingRestrictionInfo( + content::WebContents* web_contents) const { + // If we're viewing the PDF in a MimeHandlerViewGuest, use its embedded + // WebContents. + auto* guest_view = + extensions::MimeHandlerViewGuest::FromWebContents(web_contents); + web_contents = + guest_view ? guest_view->embedder_web_contents() : web_contents; + + return GetConfidentialRestrictions(web_contents) + .GetRestrictionLevelAndUrl(DlpContentRestriction::kPrint); +} + // ScopedDlpContentManagerForTesting ScopedDlpContentManagerForTesting::ScopedDlpContentManagerForTesting( DlpContentManager* test_dlp_content_manager) {
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager.h b/chrome/browser/ash/policy/dlp/dlp_content_manager.h index 10e9282..2d25f0e 100644 --- a/chrome/browser/ash/policy/dlp/dlp_content_manager.h +++ b/chrome/browser/ash/policy/dlp/dlp_content_manager.h
@@ -65,6 +65,9 @@ // Returns whether printing should be restricted. bool IsPrintingRestricted(content::WebContents* web_contents) const; + // Returns whether the user should be warned before printing. + bool ShouldWarnBeforePrinting(content::WebContents* web_contents) const; + // Returns whether screen capture of the defined content should be restricted. virtual bool IsScreenCaptureRestricted( const content::DesktopMediaID& media_id) const; @@ -195,6 +198,11 @@ // Get the delay before switching privacy screen off. static base::TimeDelta GetPrivacyScreenOffDelayForTesting(); + // Returns which level and url of printing restriction is currently enforced + // for |web_contents|. + RestrictionLevelAndUrl GetPrintingRestrictionInfo( + content::WebContents* web_contents) const; + // Map from currently known confidential WebContents to the restrictions. base::flat_map<content::WebContents*, DlpContentRestrictionSet> confidential_web_contents_;
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_unittest.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_unittest.cc index 5467eee..af0f33f7 100644 --- a/chrome/browser/ash/policy/dlp/dlp_content_manager_unittest.cc +++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_unittest.cc
@@ -55,6 +55,8 @@ const DlpContentRestrictionSet kPrintingRestricted( DlpContentRestriction::kPrint, DlpRulesManager::Level::kBlock); +const DlpContentRestrictionSet kPrintingWarning(DlpContentRestriction::kPrint, + DlpRulesManager::Level::kWarn); class MockPrivacyScreenHelper : public ash::PrivacyScreenDlpHelper { public: @@ -416,4 +418,27 @@ GetDlpHistogramPrefix() + dlp::kPrintingBlockedUMA, false, 2); } +TEST_F(DlpContentManagerTest, PrintingWarning) { + LoginFakeUser(); + + std::unique_ptr<content::WebContents> web_contents = CreateWebContents(); + EXPECT_EQ(GetManager()->GetConfidentialRestrictions(web_contents.get()), + kEmptyRestrictionSet); + + EXPECT_FALSE(GetManager()->ShouldWarnBeforePrinting(web_contents.get())); + + SetupDlpRulesManager(); + + helper_.ChangeConfidentiality(web_contents.get(), kPrintingWarning); + EXPECT_EQ(GetManager()->GetConfidentialRestrictions(web_contents.get()), + kPrintingWarning); + EXPECT_TRUE(GetManager()->ShouldWarnBeforePrinting(web_contents.get())); + EXPECT_FALSE(GetManager()->IsPrintingRestricted(web_contents.get())); + + helper_.DestroyWebContents(web_contents.get()); + EXPECT_EQ(GetManager()->GetConfidentialRestrictions(web_contents.get()), + kEmptyRestrictionSet); + EXPECT_FALSE(GetManager()->ShouldWarnBeforePrinting(web_contents.get())); +} + } // namespace policy
diff --git a/chrome/browser/ash/settings/cros_settings_unittest.cc b/chrome/browser/ash/settings/cros_settings_unittest.cc index be22ad23..8a8cfc1 100644 --- a/chrome/browser/ash/settings/cros_settings_unittest.cc +++ b/chrome/browser/ash/settings/cros_settings_unittest.cc
@@ -172,8 +172,8 @@ StoreDevicePolicy(); - base::ListValue allowlist; - allowlist.AppendString(kOwner); + base::Value allowlist(base::Value::Type::LIST); + allowlist.Append(kOwner); ExpectPref(kAccountsPrefUsers, allowlist); // When a non-empty allowlist is set, allow_new_user defaults to false. ExpectPref(kAccountsPrefAllowNewUser, base::Value(false)); @@ -186,14 +186,14 @@ auto* oss = CreateOwnerSettingsService(kOwner); - base::ListValue original_list; - original_list.AppendString(kOwner); + base::Value original_list(base::Value::Type::LIST); + original_list.Append(kOwner); oss->Set(kAccountsPrefUsers, original_list); task_environment_.RunUntilIdle(); - base::ListValue modified_list; - modified_list.AppendString(kOwner); - modified_list.AppendString(kUser1); + base::Value modified_list(base::Value::Type::LIST); + modified_list.Append(kOwner); + modified_list.Append(kUser1); // Add some user to the allowlist. oss->AppendToList(kAccountsPrefUsers, base::Value(kUser1)); @@ -209,16 +209,16 @@ auto* oss = CreateOwnerSettingsService(kOwner); - base::ListValue original_list; - original_list.AppendString(kOwner); - original_list.AppendString(kUser1); - original_list.AppendString(kUser2); + base::Value original_list(base::Value::Type::LIST); + original_list.Append(kOwner); + original_list.Append(kUser1); + original_list.Append(kUser2); oss->Set(kAccountsPrefUsers, original_list); task_environment_.RunUntilIdle(); - base::ListValue modified_list; - modified_list.AppendString(kOwner); - modified_list.AppendString(kUser1); + base::Value modified_list(base::Value::Type::LIST); + modified_list.Append(kOwner); + modified_list.Append(kUser1); // Remove some user from the allowlist. oss->RemoveFromList(kAccountsPrefUsers, base::Value(kUser2)); @@ -241,7 +241,7 @@ device_policy_.payload().mutable_allow_new_users()->clear_allow_new_users(); StoreDevicePolicy(); - ExpectPref(kAccountsPrefUsers, base::ListValue()); + ExpectPref(kAccountsPrefUsers, base::Value(base::Value::Type::LIST)); // When an empty allowlist is set, allow_new_user defaults to true. ExpectPref(kAccountsPrefAllowNewUser, base::Value(true)); } @@ -255,7 +255,7 @@ StoreDevicePolicy(); // Expect the same - an empty allowlist and no new users allowed. - ExpectPref(kAccountsPrefUsers, base::ListValue()); + ExpectPref(kAccountsPrefUsers, base::Value(base::Value::Type::LIST)); ExpectPref(kAccountsPrefAllowNewUser, base::Value(false)); } @@ -268,8 +268,8 @@ StoreDevicePolicy(); // Expect the same - a non-empty allowlist and no new users allowed. - base::ListValue allowlist; - allowlist.AppendString(kOwner); + base::Value allowlist(base::Value::Type::LIST); + allowlist.Append(kOwner); ExpectPref(kAccountsPrefUsers, allowlist); ExpectPref(kAccountsPrefAllowNewUser, base::Value(false)); } @@ -282,7 +282,7 @@ StoreDevicePolicy(); // Expect the same - an empty allowlist and new users allowed. - ExpectPref(kAccountsPrefUsers, base::ListValue()); + ExpectPref(kAccountsPrefUsers, base::Value(base::Value::Type::LIST)); ExpectPref(kAccountsPrefAllowNewUser, base::Value(true)); } @@ -294,8 +294,8 @@ StoreDevicePolicy(); // Expect the same - a non-empty allowlist and new users allowed. - base::ListValue allowlist; - allowlist.AppendString(kOwner); + base::Value allowlist(base::Value::Type::LIST); + allowlist.Append(kOwner); ExpectPref(kAccountsPrefUsers, allowlist); ExpectPref(kAccountsPrefAllowNewUser, base::Value(true)); } @@ -303,11 +303,11 @@ TEST_F(CrosSettingsTest, FindEmailInList) { auto* oss = CreateOwnerSettingsService(kOwner); - base::ListValue list; - list.AppendString("user@example.com"); - list.AppendString("nodomain"); - list.AppendString("with.dots@gmail.com"); - list.AppendString("Upper@example.com"); + base::Value list(base::Value::Type::LIST); + list.Append("user@example.com"); + list.Append("nodomain"); + list.Append("with.dots@gmail.com"); + list.Append("Upper@example.com"); oss->Set(kAccountsPrefUsers, list); task_environment_.RunUntilIdle(); @@ -336,9 +336,9 @@ TEST_F(CrosSettingsTest, FindEmailInListWildcard) { auto* oss = CreateOwnerSettingsService(kOwner); - base::ListValue list; - list.AppendString("user@example.com"); - list.AppendString("*@example.com"); + base::Value list(base::Value::Type::LIST); + list.Append("user@example.com"); + list.Append("*@example.com"); oss->Set(kAccountsPrefUsers, list); task_environment_.RunUntilIdle(); @@ -371,7 +371,7 @@ StoreDevicePolicy(); ExpectPref(kAccountsPrefAllowNewUser, base::Value(false)); - ExpectPref(kAccountsPrefUsers, base::ListValue()); + ExpectPref(kAccountsPrefUsers, base::Value(base::Value::Type::LIST)); ExpectPref(kAccountsPrefFamilyLinkAccountsAllowed, base::Value(false)); EXPECT_FALSE(IsUserAllowed(kUser1, absl::nullopt)); @@ -395,8 +395,8 @@ StoreDevicePolicy(); - base::ListValue allowlist; - allowlist.AppendString(kOwner); + base::Value allowlist(base::Value::Type::LIST); + allowlist.Append(kOwner); ExpectPref(kAccountsPrefAllowNewUser, base::Value(false)); ExpectPref(kAccountsPrefUsers, allowlist); ExpectPref(kAccountsPrefFamilyLinkAccountsAllowed, base::Value(false)); @@ -420,8 +420,8 @@ StoreDevicePolicy(); - base::ListValue allowlist; - allowlist.AppendString(kOwner); + base::Value allowlist(base::Value::Type::LIST); + allowlist.Append(kOwner); ExpectPref(kAccountsPrefAllowNewUser, base::Value(false)); ExpectPref(kAccountsPrefUsers, allowlist); ExpectPref(kAccountsPrefFamilyLinkAccountsAllowed, base::Value(true));
diff --git a/chrome/browser/autofill/captured_sites_test_utils.cc b/chrome/browser/autofill/captured_sites_test_utils.cc index 27ed6dd..fccb4494 100644 --- a/chrome/browser/autofill/captured_sites_test_utils.cc +++ b/chrome/browser/autofill/captured_sites_test_utils.cc
@@ -556,6 +556,7 @@ "MAP *:443 127.0.0.1:%d," // Set to always exclude, allows cache_replayer overwrite "EXCLUDE clients1.google.com," + "EXCLUDE content-autofill.googleapis.com," "EXCLUDE localhost", kHostHttpPort, kHostHttpsPort)); command_line->AppendSwitchASCII(
diff --git a/chrome/browser/autofill/credit_card_accessory_controller_impl.cc b/chrome/browser/autofill/credit_card_accessory_controller_impl.cc index a5011d68..fd0f98b 100644 --- a/chrome/browser/autofill/credit_card_accessory_controller_impl.cc +++ b/chrome/browser/autofill/credit_card_accessory_controller_impl.cc
@@ -132,7 +132,7 @@ if (cached_server_cards_.empty() || !GetManager() ->credit_card_access_manager() - ->IsCardPresentInUnmaskedCache(card->server_id())) { + ->IsCardPresentInUnmaskedCache(*card)) { info_to_add.push_back(TranslateCard(card, allow_filling)); } }
diff --git a/chrome/browser/bluetooth/chrome_bluetooth_delegate.cc b/chrome/browser/bluetooth/chrome_bluetooth_delegate.cc index 3e73c0e..1175225 100644 --- a/chrome/browser/bluetooth/chrome_bluetooth_delegate.cc +++ b/chrome/browser/bluetooth/chrome_bluetooth_delegate.cc
@@ -9,7 +9,10 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/bluetooth/bluetooth_chooser_context_factory.h" +#include "chrome/browser/chooser_controller/title_util.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/bluetooth/chrome_bluetooth_chooser_controller.h" +#include "chrome/browser/ui/browser_dialogs.h" #include "components/permissions/contexts/bluetooth_chooser_context.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" @@ -25,9 +28,10 @@ #include "components/permissions/android/bluetooth_chooser_android.h" #include "components/permissions/android/bluetooth_scanning_prompt_android.h" #else -#include "chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h" -#include "chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.h" +#include "components/permissions/bluetooth_chooser_desktop.h" #include "components/permissions/bluetooth_scanning_prompt_controller.h" +#include "components/permissions/bluetooth_scanning_prompt_desktop.h" +#include "components/strings/grit/components_strings.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/extensions_browser_client.h" #endif // OS_ANDROID @@ -72,7 +76,12 @@ frame, event_handler); } - return std::make_unique<BluetoothChooserDesktop>(frame, event_handler); + auto controller = + std::make_unique<ChromeBluetoothChooserController>(frame, event_handler); + auto controller_weak = controller->GetWeakPtr(); + return std::make_unique<permissions::BluetoothChooserDesktop>( + std::move(controller), + base::BindOnce(chrome::ShowDeviceChooserDialog, frame)); #endif } @@ -91,7 +100,12 @@ return nullptr; } - return std::make_unique<BluetoothScanningPromptDesktop>(frame, event_handler); + return std::make_unique<permissions::BluetoothScanningPromptDesktop>( + frame, event_handler, + CreateExtensionAwareChooserTitle(frame, + IDS_BLUETOOTH_SCANNING_PROMPT_ORIGIN, + IDS_BLUETOOTH_SCANNING_PROMPT_ORIGIN), + base::BindOnce(chrome::ShowDeviceChooserDialog, frame)); #endif }
diff --git a/chrome/browser/chooser_controller/title_util.cc b/chrome/browser/chooser_controller/title_util.cc index 4f5fe3f..4b93e85 100644 --- a/chrome/browser/chooser_controller/title_util.cc +++ b/chrome/browser/chooser_controller/title_util.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/chooser_controller/title_util.h" #include "base/strings/utf_string_conversions.h" -#include "components/url_formatter/elide_url.h" +#include "components/permissions/chooser_title_util.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "extensions/buildflags/buildflags.h" @@ -17,15 +17,15 @@ #include "extensions/common/constants.h" #endif -std::u16string CreateChooserTitle(content::RenderFrameHost* render_frame_host, - int title_string_id_origin, - int title_string_id_extension) { +std::u16string CreateExtensionAwareChooserTitle( + content::RenderFrameHost* render_frame_host, + int title_string_id_origin, + int title_string_id_extension) { if (!render_frame_host) return u""; - url::Origin origin = render_frame_host->GetLastCommittedOrigin(); - #if BUILDFLAG(ENABLE_EXTENSIONS) + url::Origin origin = render_frame_host->GetLastCommittedOrigin(); if (origin.scheme() == extensions::kExtensionScheme) { content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(render_frame_host); @@ -44,8 +44,6 @@ } #endif - return l10n_util::GetStringFUTF16( - title_string_id_origin, - url_formatter::FormatOriginForSecurityDisplay( - origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC)); + return permissions::CreateChooserTitle(render_frame_host, + title_string_id_origin); }
diff --git a/chrome/browser/chooser_controller/title_util.h b/chrome/browser/chooser_controller/title_util.h index ca26848..81ef19d 100644 --- a/chrome/browser/chooser_controller/title_util.h +++ b/chrome/browser/chooser_controller/title_util.h
@@ -13,8 +13,9 @@ // Creates a title for a chooser. For extensions the extension name is used if // possible. In all other cases the origin is used. -std::u16string CreateChooserTitle(content::RenderFrameHost* render_frame_host, - int title_string_id_origin, - int title_string_id_extension); +std::u16string CreateExtensionAwareChooserTitle( + content::RenderFrameHost* render_frame_host, + int title_string_id_origin, + int title_string_id_extension); #endif // CHROME_BROWSER_CHOOSER_CONTROLLER_TITLE_UTIL_H_
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 9aac3826..3252746 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -4018,10 +4018,12 @@ prerender::NoStatePrefetchContents* no_state_prefetch_contents = prerender::ChromeNoStatePrefetchContentsDelegate::FromWebContents( handle->GetWebContents()); - if (!no_state_prefetch_contents && handle->IsInMainFrame()) { - throttles.push_back( - navigation_interception::InterceptNavigationDelegate::CreateThrottleFor( - handle, navigation_interception::SynchronyMode::kAsync)); + if (!no_state_prefetch_contents) { + MaybeAddThrottle( + navigation_interception::InterceptNavigationDelegate:: + MaybeCreateThrottleFor( + handle, navigation_interception::SynchronyMode::kAsync), + &throttles); } throttles.push_back(InterceptOMADownloadNavigationThrottle::Create(handle));
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 351fad0a..55171e7 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -2926,6 +2926,8 @@ "policy/scheduled_task_handler/os_and_policies_update_checker.h", "policy/scheduled_task_handler/scheduled_task_executor.cc", "policy/scheduled_task_handler/scheduled_task_executor.h", + "policy/scheduled_task_handler/scheduled_task_executor_impl.cc", + "policy/scheduled_task_handler/scheduled_task_executor_impl.h", "policy/scheduled_task_handler/scheduled_task_util.cc", "policy/scheduled_task_handler/scheduled_task_util.h", "policy/scheduled_task_handler/scoped_wake_lock.cc", @@ -4222,7 +4224,9 @@ "policy/reporting/install_event_log_util_unittest.cc", "policy/reporting/single_arc_app_install_event_log_unittest.cc", "policy/rsu/lookup_key_uploader_unittest.cc", - "policy/scheduled_task_handler/device_scheduled_update_checker_unittest.cc", + "policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc", + "policy/scheduled_task_handler/test/fake_scheduled_task_executor.cc", + "policy/scheduled_task_handler/test/fake_scheduled_task_executor.h", "policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc", "policy/server_backed_state/server_backed_state_keys_broker_unittest.cc", "policy/status_collector/activity_storage_unittest.cc",
diff --git a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc index 0ff2cd0..a1772ab 100644 --- a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc +++ b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc
@@ -13,17 +13,23 @@ #include "chrome/browser/apps/app_service/app_platform_metrics.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" +#include "chrome/browser/apps/app_service/launch_utils.h" #include "chrome/browser/chromeos/full_restore/arc_window_handler.h" #include "chrome/browser/chromeos/full_restore/arc_window_utils.h" #include "chrome/browser/chromeos/full_restore/full_restore_app_launch_handler.h" #include "chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.h" +#include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h" +#include "chrome/browser/ui/ash/shelf/shelf_spinner_controller.h" #include "chromeos/services/cros_healthd/public/cpp/service_connection.h" #include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h" #include "components/arc/arc_util.h" +#include "components/arc/metrics/arc_metrics_constants.h" #include "components/full_restore/app_launch_info.h" #include "components/full_restore/full_restore_read_handler.h" +#include "components/full_restore/full_restore_utils.h" #include "components/full_restore/restore_data.h" #include "components/services/app_service/public/cpp/types_util.h" #include "components/services/app_service/public/mojom/types.mojom.h" @@ -154,6 +160,18 @@ } StartCpuUsageCount(); + + if (!app_launch_timer_) { + app_launch_timer_ = std::make_unique<base::RepeatingTimer>(); + MaybeReStartTimer(kAppLaunchCheckingDelay); + } + + if (!stop_restore_timer_) { + stop_restore_timer_ = std::make_unique<base::OneShotTimer>(); + stop_restore_timer_->Start(FROM_HERE, kStopRestoreDelay, + base::BindOnce(&ArcAppLaunchHandler::StopRestore, + weak_ptr_factory_.GetWeakPtr())); + } } void ArcAppLaunchHandler::LaunchApp(const std::string& app_id) { @@ -259,8 +277,6 @@ return; } - auto* proxy = apps::AppServiceProxyFactory::GetForProfile(handler_->profile_); - DCHECK(proxy); auto* arc_handler = FullRestoreArcTaskHandler::GetForProfile(handler_->profile_); @@ -269,15 +285,11 @@ DCHECK(data_it.second->event_flag.has_value()); - apps::mojom::WindowInfoPtr window_info = - HandleArcWindowInfo(data_it.second->GetAppWindowInfo()); - // Set an ARC session id to find the restore window id based on the new // created ARC task id in FullRestoreReadHandler. int32_t arc_session_id = ::full_restore::FullRestoreReadHandler::GetInstance() ->GetArcSessionId(); - window_info->window_id = arc_session_id; ::full_restore::FullRestoreReadHandler::GetInstance() ->SetArcSessionIdForWindowId(arc_session_id, data_it.first); window_id_to_session_id_[data_it.first] = arc_session_id; @@ -285,8 +297,8 @@ bool launch_ghost_window = false; #if BUILDFLAG(ENABLE_WAYLAND_SERVER) - if (!window_info->bounds.is_null() && arc_handler && - arc_handler->window_handler()) { + if (window_handler_ && (data_it.second->bounds_in_root.has_value() || + data_it.second->current_bounds.has_value())) { handler_->RecordArcGhostWindowLaunch(/*is_arc_ghost_window=*/true); arc_handler->window_handler()->LaunchArcGhostWindow( app_id, arc_session_id, data_it.second.get()); @@ -299,15 +311,17 @@ if (launch_ghost_window) continue; - if (data_it.second->intent.has_value()) { - proxy->LaunchAppWithIntent(app_id, data_it.second->event_flag.value(), - std::move(data_it.second->intent.value()), - apps::mojom::LaunchSource::kFromFullRestore, - std::move(window_info)); - } else { - proxy->Launch(app_id, data_it.second->event_flag.value(), - apps::mojom::LaunchSource::kFromFullRestore, - std::move(window_info)); + ChromeShelfController* chrome_controller = + ChromeShelfController::instance(); + // chrome_controller may be null in tests. + if (chrome_controller) { + apps::mojom::WindowInfoPtr window_info = apps::mojom::WindowInfo::New(); + window_info->window_id = arc_session_id; + chrome_controller->GetShelfSpinnerController()->AddSpinnerToShelf( + app_id, std::make_unique<ArcShelfSpinnerItemController>( + app_id, data_it.second->event_flag.value(), + arc::UserInteractionType::APP_STARTED_FROM_FULL_RESTORE, + apps::MakeArcWindowInfo(std::move(window_info)))); } } }
diff --git a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h index 993e260..ea886220 100644 --- a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h +++ b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h
@@ -33,6 +33,7 @@ class ArcAppLaunchHandlerArcAppBrowserTest; class ArcWindowHandler; class FullRestoreAppLaunchHandler; +class FullRestoreAppLaunchHandlerArcAppBrowserTest; struct CpuTick { uint64_t idle_time = 0; @@ -42,6 +43,12 @@ } }; +// The restoration process might be blocked by some issues, e.g. the memory +// pressure, CPU rate, etc. However we don't want to have the restoration +// process taking too long to interact the normal usage. So if the restoration +// has finished in `kAppLaunchDelay` timeframe, we stop the restoration process. +constexpr base::TimeDelta kStopRestoreDelay = base::TimeDelta::FromMinutes(1); + // The ArcAppLaunchHandler class restores ARC apps during the system startup // phase. // @@ -92,6 +99,7 @@ private: friend ArcAppLaunchHandlerArcAppBrowserTest; + friend FullRestoreAppLaunchHandlerArcAppBrowserTest; // Reads the restore data, and add the ARC app windows to `windows_`, // `no_stack_windows_` and `app_ids_`.
diff --git a/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc index 30da607..27eb416 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc +++ b/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc
@@ -1013,9 +1013,21 @@ app_launch_handler_ = std::make_unique<FullRestoreAppLaunchHandler>(profile()); app_launch_handler_->SetShouldRestore(); + + arc_app_launch_handler_ = + FullRestoreArcTaskHandler::GetForProfile(profile()) + ->arc_app_launch_handler(); + content::RunAllTasksUntilIdle(); } + void ForceLaunchApp(const std::string& app_id, int32_t window_id) { + if (arc_app_launch_handler_) { + arc_app_launch_handler_->LaunchApp(app_id, window_id); + content::RunAllTasksUntilIdle(); + } + } + void VerifyGetArcAppLaunchInfo(const std::string& app_id, int32_t session_id, int32_t restore_window_id) { @@ -1144,6 +1156,9 @@ return &test_full_restore_info_observer_; } + protected: + ArcAppLaunchHandler* arc_app_launch_handler_ = nullptr; + private: arc::ArcSessionManager* arc_session_manager() { return arc::ArcSessionManager::Get(); @@ -1158,6 +1173,97 @@ TestFullRestoreInfoObserver test_full_restore_info_observer_; }; +// Test the not restored ARC window is not added to the hidden container. +IN_PROC_BROWSER_TEST_F(FullRestoreAppLaunchHandlerArcAppBrowserTest, + NotHideArcWindow) { + SetProfile(); + InstallTestApps(kTestAppPackage, false); + + const std::string app_id = GetTestApp1Id(kTestAppPackage); + int32_t session_id1 = + ::full_restore::FullRestoreSaveHandler::GetInstance()->GetArcSessionId(); + ::full_restore::FullRestoreInfo::GetInstance()->AddObserver( + test_full_restore_info_observer()); + + SaveAppLaunchInfo(app_id, session_id1); + + // Create the window for app1. The task id needs to match the |window_app_id| + // arg of CreateExoWindow. + int32_t kTaskId1 = 100; + views::Widget* widget = CreateExoWindow("org.chromium.arc.100"); + aura::Window* window = widget->GetNativeWindow(); + + VerifyObserver(window, /*launch_count=*/0, /*init_count=*/0); + VerifyWindowProperty(window, kTaskId1, /*restore_window_id=*/0, + /*hidden=*/false); + + // Simulate creating the task. + CreateTask(app_id, kTaskId1, session_id1); + + VerifyObserver(window, /*launch_count=*/1, /*init_count=*/0); + + SaveWindowInfo(window); + + WaitForAppLaunchInfoSaved(); + + Restore(); + widget->CloseNow(); + + app_host()->OnTaskDestroyed(kTaskId1); + + int32_t session_id2 = 1; + + // Create the window to simulate launching the ARC app. + int32_t kTaskId2 = 200; + widget = CreateExoWindow("org.chromium.arc.200"); + window = widget->GetNativeWindow(); + + // The task is not ready, so the window is currently in a hidden container. + EXPECT_EQ(ash::Shell::GetContainer(window->GetRootWindow(), + ash::kShellWindowId_UnparentedContainer), + window->parent()); + + VerifyObserver(window, /*launch_count=*/0, /*init_count=*/1); + VerifyWindowProperty(window, kTaskId2, + ::full_restore::kParentToHiddenContainer, + /*hidden=*/true); + + // Simulate creating the task for the ARC app window. + CreateTask(app_id, kTaskId2, session_id2); + + VerifyObserver(window, /*launch_count=*/0, /*init_count=*/1); + VerifyWindowProperty(window, kTaskId2, + ::full_restore::kParentToHiddenContainer, + /*hidden=*/false); + + // Destroy the task and close the window. + app_host()->OnTaskDestroyed(kTaskId2); + widget->CloseNow(); + + int32_t session_id3 = 2; + int32_t kTaskId3 = 300; + // Simulate creating the task before the window is created. + CreateTask(app_id, kTaskId3, session_id3); + + // Create the window to simulate launching the ARC app. + widget = CreateExoWindow("org.chromium.arc.300"); + window = widget->GetNativeWindow(); + + VerifyObserver(window, /*launch_count=*/0, /*init_count=*/0); + // The window should not be hidden. + VerifyWindowProperty(window, kTaskId3, + /*restore_window_id=*/0, + /*hidden=*/false); + + // Destroy the task and close the window. + app_host()->OnTaskDestroyed(kTaskId3); + widget->CloseNow(); + + ::full_restore::FullRestoreInfo::GetInstance()->RemoveObserver( + test_full_restore_info_observer()); + StopInstance(); +} + // Test restoration when the ARC window is created before OnTaskCreated is // called. IN_PROC_BROWSER_TEST_F(FullRestoreAppLaunchHandlerArcAppBrowserTest, @@ -1206,6 +1312,8 @@ ash::AutotestDesksApi().CreateNewDesk(); ash::AutotestDesksApi().CreateNewDesk(); + ForceLaunchApp(app_id, kTaskId1); + // Create the window to simulate the restoration for the app. The task id // needs to match the |window_app_id| arg of CreateExoWindow. int32_t kTaskId2 = 200; @@ -1503,6 +1611,9 @@ app_host()->OnTaskDestroyed(kTaskId1); app_host()->OnTaskDestroyed(kTaskId2); + ForceLaunchApp(app_id1, kTaskId1); + ForceLaunchApp(app_id2, kTaskId2); + int32_t session_id3 = ::full_restore::kArcSessionIdOffsetForRestoredLaunching + 1; int32_t session_id4 = @@ -1597,6 +1708,8 @@ arc_widget->CloseNow(); app_host()->OnTaskDestroyed(kPreRestoreTaskId); + ForceLaunchApp(kAppId, kPreRestoreTaskId); + // Recreate the window, simulating its restoration. Task id needs to match the // `kWindowAppId` arg of `CreateArcApp()`. arc_widget = CreateExoWindow(kRestoreWindowAppId); @@ -1708,14 +1821,6 @@ class ArcAppLaunchHandlerArcAppBrowserTest : public FullRestoreAppLaunchHandlerArcAppBrowserTest { protected: - void Restore() { - FullRestoreAppLaunchHandlerArcAppBrowserTest::Restore(); - - arc_app_launch_handler_ = - FullRestoreArcTaskHandler::GetForProfile(profile()) - ->arc_app_launch_handler(); - } - void UpdateApp(const std::string& app_id, apps::mojom::Readiness readiness) { apps::mojom::AppPtr app = apps::mojom::App::New(); app->app_id = app_id; @@ -1790,9 +1895,6 @@ } EXPECT_TRUE(found); } - - private: - ArcAppLaunchHandler* arc_app_launch_handler_ = nullptr; }; // Verify the saved windows in ArcAppLaunchHandler when apps are removed.
diff --git a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc b/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc index 18ece29e..0bdf76e 100644 --- a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc +++ b/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/device_identity/device_oauth2_token_service.h" #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h" #include "content/public/browser/browser_thread.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" namespace policy {
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.cc b/chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.cc index c625cb80..a7edc11d 100644 --- a/chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.cc +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.cc
@@ -18,6 +18,7 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h" +#include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_util.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/task_executor_with_retries.h" #include "chromeos/settings/cros_settings_names.h"
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.cc b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.cc index 1cbdf56..a9abea5 100644 --- a/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.cc +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.cc
@@ -4,251 +4,12 @@ #include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h" -#include "base/check.h" -#include "base/logging.h" -#include "base/memory/ptr_util.h" -#include "chromeos/settings/timezone_settings.h" -#include "third_party/icu/source/i18n/unicode/gregocal.h" - namespace policy { -namespace { -// Returns true iff a >= b. -bool IsCalGreaterThanEqual(const icu::Calendar& a, const icu::Calendar& b) { - UErrorCode status = U_ZERO_ERROR; - if (a.after(b, status)) { - DCHECK(U_SUCCESS(status)); - return true; - } - - if (a.equals(b, status)) { - DCHECK(U_SUCCESS(status)); - return true; - } - - return false; -} - -// Advances |time| based on the policy represented by -// |scheduled_task_data|. -// -// For daily policy - Advances |time| by 1 day. -// For weekly policy - Advances |time| by 1 week. -// For monthly policy - Advances |time| by 1 month. -// -// Returns true on success and false if it failed to set a valid time. -bool AdvanceTimeBasedOnPolicy( - const ScheduledTaskExecutor::ScheduledTaskData& scheduled_task_data, - icu::Calendar* time) { - UCalendarDateFields field = UCAL_MONTH; - switch (scheduled_task_data.frequency) { - case ScheduledTaskExecutor::Frequency::kDaily: - field = UCAL_DAY_OF_MONTH; - break; - case ScheduledTaskExecutor::Frequency::kWeekly: - field = UCAL_WEEK_OF_YEAR; - break; - case ScheduledTaskExecutor::Frequency::kMonthly: - break; - } - UErrorCode status = U_ZERO_ERROR; - time->add(field, 1, status); - return U_SUCCESS(status); -} - -// Sets |time| based on the policy represented by |scheduled_task_data|. -// Returns true on success and false if it failed to set a valid time. -bool SetTimeBasedOnPolicy( - const ScheduledTaskExecutor::ScheduledTaskData& scheduled_task_data, - icu::Calendar* time) { - // Set the daily fields first as they will be common across different policy - // types. - time->set(UCAL_HOUR_OF_DAY, scheduled_task_data.hour); - time->set(UCAL_MINUTE, scheduled_task_data.minute); - time->set(UCAL_SECOND, 0); - time->set(UCAL_MILLISECOND, 0); - - switch (scheduled_task_data.frequency) { - case ScheduledTaskExecutor::Frequency::kDaily: - return true; - - case ScheduledTaskExecutor::Frequency::kWeekly: - DCHECK(scheduled_task_data.day_of_week); - time->set(UCAL_DAY_OF_WEEK, scheduled_task_data.day_of_week.value()); - return true; - - case ScheduledTaskExecutor::Frequency::kMonthly: { - DCHECK(scheduled_task_data.day_of_month); - UErrorCode status = U_ZERO_ERROR; - // If policy's |day_of_month| is greater than the maximum days in |time|'s - // current month then it's set to the last day in the month. - int cur_max_days_in_month = - time->getActualMaximum(UCAL_DAY_OF_MONTH, status); - if (U_FAILURE(status)) { - LOG(ERROR) << "Failed to get max days in month"; - return false; - } - - time->set(UCAL_DAY_OF_MONTH, - std::min(scheduled_task_data.day_of_month.value(), - cur_max_days_in_month)); - return true; - } - } -} - -} // namespace - -namespace scheduled_task_internal { - -base::TimeDelta GetDiff(const icu::Calendar& a, const icu::Calendar& b) { - UErrorCode status = U_ZERO_ERROR; - UDate a_ms = a.getTime(status); - DCHECK(U_SUCCESS(status)); - UDate b_ms = b.getTime(status); - DCHECK(U_SUCCESS(status)); - DCHECK(a_ms >= b_ms); - return base::TimeDelta::FromMilliseconds(a_ms - b_ms); -} - -std::unique_ptr<icu::Calendar> ConvertUtcToTzIcuTime(base::Time cur_time, - const icu::TimeZone& tz) { - // Get ms from epoch for |cur_time| and use it to get the new time in |tz|. - UErrorCode status = U_ZERO_ERROR; - std::unique_ptr<icu::Calendar> cal_tz = - std::make_unique<icu::GregorianCalendar>(tz, status); - if (U_FAILURE(status)) { - LOG(ERROR) << "Couldn't create calendar"; - return nullptr; - } - // Erase current time from the calendar. - cal_tz->clear(); - time_t ms_from_epoch = cur_time.ToTimeT() * 1000; - cal_tz->setTime(ms_from_epoch, status); - if (U_FAILURE(status)) { - LOG(ERROR) << "Couldn't create calendar"; - return nullptr; - } - - return cal_tz; -} - -} // namespace scheduled_task_internal - ScheduledTaskExecutor::ScheduledTaskData::ScheduledTaskData() = default; ScheduledTaskExecutor::ScheduledTaskData::ScheduledTaskData( const ScheduledTaskData&) = default; ScheduledTaskExecutor::ScheduledTaskData::~ScheduledTaskData() = default; -ScheduledTaskExecutor::ScheduledTaskExecutor(const char* timer_tag) - : timer_tag_(timer_tag) {} - -ScheduledTaskExecutor::~ScheduledTaskExecutor() = default; - -void ScheduledTaskExecutor::Start( - ScheduledTaskData* scheduled_task_data, - chromeos::OnStartNativeTimerCallback result_cb, - TimerCallback timer_expired_cb) { - // Only one |ScheduledTaskTimer| can be outstanding - scheduled_task_timer_.reset(); - - DCHECK(scheduled_task_data); - - // For accuracy of the next scheduled task, capture current time as close to - // the start of this function as possible. - const base::TimeTicks cur_ticks = GetTicksSinceBoot(); - const base::Time cur_time = GetCurrentTime(); - - // If this is a retry then |cur_ticks| could be >= - // |next_scheduled_task_time_ticks| i.e. the next timer schedule has already - // passed, recalculate it. Else respect the calculated time. - if (cur_ticks >= scheduled_task_data->next_scheduled_task_time_ticks) { - // Calculate the next scheduled task time. In case there is an error while - // calculating, due to concurrent DST or Time Zone changes, then reschedule - // this function and try to schedule the task again. There should - // only be one outstanding task to start the timer. If there is a failure - // the wake lock is released and acquired again when this task runs. - base::TimeDelta delay = - CalculateNextScheduledTaskTimerDelay(cur_time, scheduled_task_data); - if (delay <= scheduled_task_internal::kInvalidDelay) { - LOG(ERROR) << "Failed to calculate next scheduled task time"; - std::move(result_cb).Run(false); - return; - } - scheduled_task_data->next_scheduled_task_time_ticks = cur_ticks + delay; - } - - scheduled_task_timer_ = std::make_unique<chromeos::NativeTimer>(timer_tag_); - scheduled_task_timer_->Start( - scheduled_task_data->next_scheduled_task_time_ticks, - std::move(timer_expired_cb), std::move(result_cb)); -} - -void ScheduledTaskExecutor::Reset() { - scheduled_task_timer_.reset(); -} - -base::TimeDelta ScheduledTaskExecutor::CalculateNextScheduledTaskTimerDelay( - base::Time cur_time, - ScheduledTaskData* scheduled_task_data) { - const auto cur_cal = - scheduled_task_internal::ConvertUtcToTzIcuTime(cur_time, GetTimeZone()); - if (!cur_cal) { - LOG(ERROR) << "Failed to get current ICU time"; - return scheduled_task_internal::kInvalidDelay; - } - - auto scheduled_task_time = base::WrapUnique(cur_cal->clone()); - DCHECK(scheduled_task_time); - - // Set scheduled task time based on the policy in |scheduled_task_data|. - if (!SetTimeBasedOnPolicy(*scheduled_task_data, scheduled_task_time.get())) { - LOG(ERROR) << "Failed to set time based on policy"; - return scheduled_task_internal::kInvalidDelay; - } - - // If the time has already passed it means that the scheduled task needs to be - // advanced based on the policy i.e. by a day, week or month. The equal to - // case happens when the timer_expired_cb runs and sets the next - // |scheduled_task_timer_|. In this case |scheduled_task_time| definitely - // needs to advance as per the policy. The |SetTimeBasedOnPolicy| is needed - // for the monthly frequency, it won't change the time after advancing for - // daily or weekly frequencies. For monthly, if the current time is Feb 28, - // 1970, 8PM and an update check needs to happen on 7PM every 31st, then - // setting time above and advancing time below gets us a time of Mar 28, 1970, - // 7PM. An extra call to |SetTimeBasedOnPolicy| is required to finally get Mar - // 31, 1970 7PM. - if (IsCalGreaterThanEqual(*cur_cal, *scheduled_task_time)) { - if (!AdvanceTimeBasedOnPolicy(*scheduled_task_data, - scheduled_task_time.get())) { - LOG(ERROR) << "Failed to advance time"; - return scheduled_task_internal::kInvalidDelay; - } - - if (!SetTimeBasedOnPolicy(*scheduled_task_data, - scheduled_task_time.get())) { - LOG(ERROR) << "Failed to set time based on policy"; - return scheduled_task_internal::kInvalidDelay; - } - } - DCHECK(!IsCalGreaterThanEqual(*cur_cal, *scheduled_task_time)); - - return scheduled_task_internal::GetDiff(*scheduled_task_time, *cur_cal); -} - -base::Time ScheduledTaskExecutor::GetCurrentTime() { - return base::Time::Now(); -} - -base::TimeTicks ScheduledTaskExecutor::GetTicksSinceBoot() { - struct timespec ts = {}; - int ret = clock_gettime(CLOCK_BOOTTIME, &ts); - DCHECK_EQ(ret, 0); - return base::TimeTicks() + base::TimeDelta::FromTimeSpec(ts); -} - -const icu::TimeZone& ScheduledTaskExecutor::GetTimeZone() { - return chromeos::system::TimezoneSettings::GetInstance()->GetTimezone(); -} } // namespace policy
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h index dec8312..5d56dc71 100644 --- a/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h
@@ -5,15 +5,11 @@ #ifndef CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_SCHEDULED_TASK_EXECUTOR_H_ #define CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_SCHEDULED_TASK_EXECUTOR_H_ -#include <memory> -#include <string> - #include "base/callback_forward.h" #include "base/time/time.h" #include "chromeos/dbus/power/native_timer.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/icu/source/i18n/unicode/calendar.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" namespace policy { @@ -56,59 +52,19 @@ base::TimeTicks next_scheduled_task_time_ticks; }; - explicit ScheduledTaskExecutor(const char* timer_tag); - ScheduledTaskExecutor(const ScheduledTaskExecutor&) = delete; - ScheduledTaskExecutor& operator=(const ScheduledTaskExecutor&) = delete; - virtual ~ScheduledTaskExecutor(); + virtual ~ScheduledTaskExecutor() = default; - // Starts the scheduled_task_timer_. Runs result_cb with false result if there + // Starts the native timer. Runs result_cb with false result if there // was an error while calculating the next_scheduled_task_time_ticks, // otherwise starts NativeTimer. - void Start(ScheduledTaskData* scheduled_task_data, - chromeos::OnStartNativeTimerCallback result_cb, - TimerCallback timer_expired_cb); + virtual void Start(ScheduledTaskData* scheduled_task_data, + chromeos::OnStartNativeTimerCallback result_cb, + TimerCallback timer_expired_cb) = 0; - // Resets the scheduled_task_timer_. - void Reset(); - - protected: - // Calculates the delay from |cur_time| at which |scheduled_task_timer_| - // should run next. Returns 0 delay if the calculation failed due to a - // concurrent DST or Time Zone change. - virtual base::TimeDelta CalculateNextScheduledTaskTimerDelay( - base::Time cur_time, - ScheduledTaskData* scheduled_task_data); - - private: - // Returns current time. - virtual base::Time GetCurrentTime(); - - // Returns time ticks from boot including time ticks spent during sleeping. - virtual base::TimeTicks GetTicksSinceBoot(); - - // Returns the current time zone. - virtual const icu::TimeZone& GetTimeZone(); - - // Tag associated with native timer on timer instantiation. - std::string timer_tag_; - - // Timer that is scheduled to execute the task. - std::unique_ptr<chromeos::NativeTimer> scheduled_task_timer_; + // Resets the native timer. + virtual void Reset() = 0; }; -namespace scheduled_task_internal { -// Used as canonical value for timer delay calculations. -constexpr base::TimeDelta kInvalidDelay = base::TimeDelta(); - -// Calculates the difference in milliseconds of |a| - |b|. Caller has to ensure -// |a| >= |b|. -base::TimeDelta GetDiff(const icu::Calendar& a, const icu::Calendar& b); - -// Converts |cur_time| to ICU time in the time zone |tz|. -std::unique_ptr<icu::Calendar> ConvertUtcToTzIcuTime(base::Time cur_time, - const icu::TimeZone& tz); -} // namespace scheduled_task_internal - } // namespace policy #endif // CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_SCHEDULED_TASK_EXECUTOR_H_
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.cc b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.cc new file mode 100644 index 0000000..cf7a269 --- /dev/null +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.cc
@@ -0,0 +1,249 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h" + +#include "base/check.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "chromeos/settings/timezone_settings.h" +#include "third_party/icu/source/i18n/unicode/gregocal.h" + +namespace policy { + +namespace { +// Returns true iff a >= b. +bool IsCalGreaterThanEqual(const icu::Calendar& a, const icu::Calendar& b) { + UErrorCode status = U_ZERO_ERROR; + if (a.after(b, status)) { + DCHECK(U_SUCCESS(status)); + return true; + } + + if (a.equals(b, status)) { + DCHECK(U_SUCCESS(status)); + return true; + } + + return false; +} + +// Advances |time| based on the policy represented by +// |scheduled_task_data|. +// +// For daily policy - Advances |time| by 1 day. +// For weekly policy - Advances |time| by 1 week. +// For monthly policy - Advances |time| by 1 month. +// +// Returns true on success and false if it failed to set a valid time. +bool AdvanceTimeBasedOnPolicy( + const ScheduledTaskExecutor::ScheduledTaskData& scheduled_task_data, + icu::Calendar* time) { + UCalendarDateFields field = UCAL_MONTH; + switch (scheduled_task_data.frequency) { + case ScheduledTaskExecutor::Frequency::kDaily: + field = UCAL_DAY_OF_MONTH; + break; + case ScheduledTaskExecutor::Frequency::kWeekly: + field = UCAL_WEEK_OF_YEAR; + break; + case ScheduledTaskExecutor::Frequency::kMonthly: + break; + } + UErrorCode status = U_ZERO_ERROR; + time->add(field, 1, status); + return U_SUCCESS(status); +} + +// Sets |time| based on the policy represented by |scheduled_task_data|. +// Returns true on success and false if it failed to set a valid time. +bool SetTimeBasedOnPolicy( + const ScheduledTaskExecutor::ScheduledTaskData& scheduled_task_data, + icu::Calendar* time) { + // Set the daily fields first as they will be common across different policy + // types. + time->set(UCAL_HOUR_OF_DAY, scheduled_task_data.hour); + time->set(UCAL_MINUTE, scheduled_task_data.minute); + time->set(UCAL_SECOND, 0); + time->set(UCAL_MILLISECOND, 0); + + switch (scheduled_task_data.frequency) { + case ScheduledTaskExecutor::Frequency::kDaily: + return true; + + case ScheduledTaskExecutor::Frequency::kWeekly: + DCHECK(scheduled_task_data.day_of_week); + time->set(UCAL_DAY_OF_WEEK, scheduled_task_data.day_of_week.value()); + return true; + + case ScheduledTaskExecutor::Frequency::kMonthly: { + DCHECK(scheduled_task_data.day_of_month); + UErrorCode status = U_ZERO_ERROR; + // If policy's |day_of_month| is greater than the maximum days in |time|'s + // current month then it's set to the last day in the month. + int cur_max_days_in_month = + time->getActualMaximum(UCAL_DAY_OF_MONTH, status); + if (U_FAILURE(status)) { + LOG(ERROR) << "Failed to get max days in month"; + return false; + } + + time->set(UCAL_DAY_OF_MONTH, + std::min(scheduled_task_data.day_of_month.value(), + cur_max_days_in_month)); + return true; + } + } +} + +} // namespace + +namespace scheduled_task_internal { + +base::TimeDelta GetDiff(const icu::Calendar& a, const icu::Calendar& b) { + UErrorCode status = U_ZERO_ERROR; + UDate a_ms = a.getTime(status); + DCHECK(U_SUCCESS(status)); + UDate b_ms = b.getTime(status); + DCHECK(U_SUCCESS(status)); + DCHECK(a_ms >= b_ms); + return base::TimeDelta::FromMilliseconds(a_ms - b_ms); +} + +std::unique_ptr<icu::Calendar> ConvertUtcToTzIcuTime(base::Time cur_time, + const icu::TimeZone& tz) { + // Get ms from epoch for |cur_time| and use it to get the new time in |tz|. + UErrorCode status = U_ZERO_ERROR; + std::unique_ptr<icu::Calendar> cal_tz = + std::make_unique<icu::GregorianCalendar>(tz, status); + if (U_FAILURE(status)) { + LOG(ERROR) << "Couldn't create calendar"; + return nullptr; + } + // Erase current time from the calendar. + cal_tz->clear(); + time_t ms_from_epoch = cur_time.ToTimeT() * 1000; + cal_tz->setTime(ms_from_epoch, status); + if (U_FAILURE(status)) { + LOG(ERROR) << "Couldn't create calendar"; + return nullptr; + } + + return cal_tz; +} + +} // namespace scheduled_task_internal + +ScheduledTaskExecutorImpl::ScheduledTaskExecutorImpl(const char* timer_tag) + : timer_tag_(timer_tag) {} + +ScheduledTaskExecutorImpl::~ScheduledTaskExecutorImpl() = default; + +void ScheduledTaskExecutorImpl::Start( + ScheduledTaskData* scheduled_task_data, + chromeos::OnStartNativeTimerCallback result_cb, + TimerCallback timer_expired_cb) { + // Only one |ScheduledTaskTimer| can be outstanding + scheduled_task_timer_.reset(); + + DCHECK(scheduled_task_data); + + // For accuracy of the next scheduled task, capture current time as close to + // the start of this function as possible. + const base::TimeTicks cur_ticks = GetTicksSinceBoot(); + const base::Time cur_time = GetCurrentTime(); + + // If this is a retry then |cur_ticks| could be >= + // |next_scheduled_task_time_ticks| i.e. the next timer schedule has already + // passed, recalculate it. Else respect the calculated time. + if (cur_ticks >= scheduled_task_data->next_scheduled_task_time_ticks) { + // Calculate the next scheduled task time. In case there is an error while + // calculating, due to concurrent DST or Time Zone changes, then reschedule + // this function and try to schedule the task again. There should + // only be one outstanding task to start the timer. If there is a failure + // the wake lock is released and acquired again when this task runs. + base::TimeDelta delay = + CalculateNextScheduledTaskTimerDelay(cur_time, scheduled_task_data); + if (delay <= scheduled_task_internal::kInvalidDelay) { + LOG(ERROR) << "Failed to calculate next scheduled task time"; + std::move(result_cb).Run(false); + return; + } + scheduled_task_data->next_scheduled_task_time_ticks = cur_ticks + delay; + } + + scheduled_task_timer_ = std::make_unique<chromeos::NativeTimer>(timer_tag_); + scheduled_task_timer_->Start( + scheduled_task_data->next_scheduled_task_time_ticks, + std::move(timer_expired_cb), std::move(result_cb)); +} + +void ScheduledTaskExecutorImpl::Reset() { + scheduled_task_timer_.reset(); +} + +base::TimeDelta ScheduledTaskExecutorImpl::CalculateNextScheduledTaskTimerDelay( + base::Time cur_time, + ScheduledTaskData* scheduled_task_data) { + const auto cur_cal = + scheduled_task_internal::ConvertUtcToTzIcuTime(cur_time, GetTimeZone()); + if (!cur_cal) { + LOG(ERROR) << "Failed to get current ICU time"; + return scheduled_task_internal::kInvalidDelay; + } + + auto scheduled_task_time = base::WrapUnique(cur_cal->clone()); + DCHECK(scheduled_task_time); + + // Set scheduled task time based on the policy in |scheduled_task_data|. + if (!SetTimeBasedOnPolicy(*scheduled_task_data, scheduled_task_time.get())) { + LOG(ERROR) << "Failed to set time based on policy"; + return scheduled_task_internal::kInvalidDelay; + } + + // If the time has already passed it means that the scheduled task needs to be + // advanced based on the policy i.e. by a day, week or month. The equal to + // case happens when the timer_expired_cb runs and sets the next + // |scheduled_task_timer_|. In this case |scheduled_task_time| definitely + // needs to advance as per the policy. The |SetTimeBasedOnPolicy| is needed + // for the monthly frequency, it won't change the time after advancing for + // daily or weekly frequencies. For monthly, if the current time is Feb 28, + // 1970, 8PM and an update check needs to happen on 7PM every 31st, then + // setting time above and advancing time below gets us a time of Mar 28, 1970, + // 7PM. An extra call to |SetTimeBasedOnPolicy| is required to finally get Mar + // 31, 1970 7PM. + if (IsCalGreaterThanEqual(*cur_cal, *scheduled_task_time)) { + if (!AdvanceTimeBasedOnPolicy(*scheduled_task_data, + scheduled_task_time.get())) { + LOG(ERROR) << "Failed to advance time"; + return scheduled_task_internal::kInvalidDelay; + } + + if (!SetTimeBasedOnPolicy(*scheduled_task_data, + scheduled_task_time.get())) { + LOG(ERROR) << "Failed to set time based on policy"; + return scheduled_task_internal::kInvalidDelay; + } + } + DCHECK(!IsCalGreaterThanEqual(*cur_cal, *scheduled_task_time)); + + return scheduled_task_internal::GetDiff(*scheduled_task_time, *cur_cal); +} + +base::Time ScheduledTaskExecutorImpl::GetCurrentTime() { + return base::Time::Now(); +} + +base::TimeTicks ScheduledTaskExecutorImpl::GetTicksSinceBoot() { + struct timespec ts = {}; + int ret = clock_gettime(CLOCK_BOOTTIME, &ts); + DCHECK_EQ(ret, 0); + return base::TimeTicks() + base::TimeDelta::FromTimeSpec(ts); +} + +const icu::TimeZone& ScheduledTaskExecutorImpl::GetTimeZone() { + return chromeos::system::TimezoneSettings::GetInstance()->GetTimezone(); +} + +} // namespace policy
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h new file mode 100644 index 0000000..1aac1189 --- /dev/null +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h
@@ -0,0 +1,78 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_SCHEDULED_TASK_EXECUTOR_IMPL_H_ +#define CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_SCHEDULED_TASK_EXECUTOR_IMPL_H_ + +#include <memory> +#include <string> + +#include "base/callback_forward.h" +#include "base/time/time.h" +#include "base/values.h" +#include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h" +#include "chromeos/dbus/power/native_timer.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/icu/source/i18n/unicode/calendar.h" + +namespace policy { + +// This class is used to start the native timer for a scheduled task. +class ScheduledTaskExecutorImpl : public ScheduledTaskExecutor { + public: + explicit ScheduledTaskExecutorImpl(const char* timer_tag); + ScheduledTaskExecutorImpl(const ScheduledTaskExecutorImpl&) = delete; + ScheduledTaskExecutorImpl& operator=(const ScheduledTaskExecutorImpl&) = + delete; + ~ScheduledTaskExecutorImpl() override; + + // ScheduledTaskExecutor: + void Start(ScheduledTaskData* scheduled_task_data, + chromeos::OnStartNativeTimerCallback result_cb, + TimerCallback timer_expired_cb) override; + + // ScheduledTaskExecutor: + void Reset() override; + + protected: + // Calculates the delay from |cur_time| at which |scheduled_task_timer_| + // should run next. Returns 0 delay if the calculation failed due to a + // concurrent DST or Time Zone change. + virtual base::TimeDelta CalculateNextScheduledTaskTimerDelay( + base::Time cur_time, + ScheduledTaskData* scheduled_task_data); + + private: + // Returns current time. + virtual base::Time GetCurrentTime(); + + // Returns time ticks from boot including time ticks spent during sleeping. + virtual base::TimeTicks GetTicksSinceBoot(); + + // Returns the current time zone. + virtual const icu::TimeZone& GetTimeZone(); + + // Tag associated with native timer on timer instantiation. + std::string timer_tag_; + + // Timer that is scheduled to execute the task. + std::unique_ptr<chromeos::NativeTimer> scheduled_task_timer_; +}; + +namespace scheduled_task_internal { +// Used as canonical value for timer delay calculations. +constexpr base::TimeDelta kInvalidDelay = base::TimeDelta(); + +// Calculates the difference in milliseconds of |a| - |b|. Caller has to ensure +// |a| >= |b|. +base::TimeDelta GetDiff(const icu::Calendar& a, const icu::Calendar& b); + +// Converts |cur_time| to ICU time in the time zone |tz|. +std::unique_ptr<icu::Calendar> ConvertUtcToTzIcuTime(base::Time cur_time, + const icu::TimeZone& tz); +} // namespace scheduled_task_internal + +} // namespace policy + +#endif // CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_SCHEDULED_TASK_EXECUTOR_IMPL_H_
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker_unittest.cc b/chrome/browser/chromeos/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc similarity index 95% rename from chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker_unittest.cc rename to chrome/browser/chromeos/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc index 5e8be1e..0b52dca 100644 --- a/chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker_unittest.cc +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
@@ -27,6 +27,7 @@ #include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_util.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/scoped_wake_lock.h" +#include "chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_update_engine_client.h" @@ -52,14 +53,9 @@ constexpr int kDaysInAWeek = 7; // Time zones that will be used in tests. -constexpr char kESTTimeZoneID[] = "America/New_York"; constexpr char kISTTimeZoneID[] = "Asia/Kolkata"; constexpr char kPSTTimeZoneID[] = "America/Los_Angeles"; -// The tag associated to register |update_check_timer_|. -constexpr char kUpdateCheckTimerTagForTest[] = - "DeviceScheduledUpdateCheckerForTest"; - constexpr char kTaskTimeFieldName[] = "update_check_time"; void DecodeJsonStringAndNormalize(const std::string& json_string, @@ -226,63 +222,6 @@ } // namespace -class ScheduledTaskExecutorForTest : public ScheduledTaskExecutor { - public: - ScheduledTaskExecutorForTest(const base::Clock* clock, - const base::TickClock* tick_clock) - : ScheduledTaskExecutor(kUpdateCheckTimerTagForTest), - clock_(clock), - tick_clock_(tick_clock) { - // Set time zone so that tests are deterministic across different - // environments. - time_zone_ = base::WrapUnique(icu::TimeZone::createTimeZone( - icu::UnicodeString::fromUTF8(kESTTimeZoneID))); - } - - ScheduledTaskExecutorForTest(const ScheduledTaskExecutorForTest&) = delete; - ScheduledTaskExecutorForTest& operator=(const ScheduledTaskExecutorForTest&) = - delete; - - ~ScheduledTaskExecutorForTest() override {} - - void SetTimeZone(std::unique_ptr<icu::TimeZone> time_zone) { - time_zone_ = std::move(time_zone); - } - - base::Time GetCurrentTime() override { return clock_->Now(); } - - const icu::TimeZone& GetTimeZone() override { return *time_zone_; } - - void SimulateCalculateNextUpdateCheckFailure(bool simulate) { - simulate_calculate_next_update_check_failure_ = simulate; - } - - base::TimeDelta CalculateNextScheduledTaskTimerDelay( - base::Time cur_time, - ScheduledTaskData* scheduled_task_data) override { - if (simulate_calculate_next_update_check_failure_) - return scheduled_task_internal::kInvalidDelay; - return ScheduledTaskExecutor::CalculateNextScheduledTaskTimerDelay( - cur_time, scheduled_task_data); - } - - private: - base::TimeTicks GetTicksSinceBoot() override { - return tick_clock_->NowTicks(); - } - // Clock to use to get current time. - const base::Clock* const clock_; - - // Clock to use to calculate time ticks. - const base::TickClock* const tick_clock_; - - // The current time zone. - std::unique_ptr<icu::TimeZone> time_zone_; - - // If set then |CalculateNextUpdateCheckTimerDelay| returns zero delay. - bool simulate_calculate_next_update_check_failure_ = false; -}; - class DeviceScheduledUpdateCheckerForTest : public DeviceScheduledUpdateChecker { public: @@ -350,7 +289,7 @@ std::make_unique<chromeos::NetworkStateTestHelper>( true /* use_default_devices_and_services */); - auto task_executor = std::make_unique<ScheduledTaskExecutorForTest>( + auto task_executor = std::make_unique<FakeScheduledTaskExecutor>( task_environment_.GetMockClock(), task_environment_.GetMockTickClock()); scheduled_task_executor_ = task_executor.get(); device_scheduled_update_checker_ = @@ -612,7 +551,7 @@ base::test::TaskEnvironment task_environment_; // Owned by |device_scheduled_update_checker_| - ScheduledTaskExecutorForTest* scheduled_task_executor_; + FakeScheduledTaskExecutor* scheduled_task_executor_; std::unique_ptr<DeviceScheduledUpdateCheckerForTest> device_scheduled_update_checker_; ash::ScopedTestingCrosSettings cros_settings_; @@ -801,7 +740,7 @@ TEST_F(DeviceScheduledUpdateCheckerTest, CheckRetryLogicEventualSuccess) { // This will simulate an error while calculating the next update check time // and will result in no update checks happening till its set. - scheduled_task_executor_->SimulateCalculateNextUpdateCheckFailure(true); + scheduled_task_executor_->SimulateCalculateNextScheduledTaskFailure(true); // Calculate time from one hour from now and set the update check policy to // happen daily at that time. @@ -827,7 +766,7 @@ // Reset failure mode and fast forward by the retry period. This time it // should succeed in setting an update check timer. No update checks should // happen yet but a check has just been scheduled. - scheduled_task_executor_->SimulateCalculateNextUpdateCheckFailure(false); + scheduled_task_executor_->SimulateCalculateNextScheduledTaskFailure(false); task_environment_.FastForwardBy( update_checker_internal::kStartUpdateCheckTimerRetryTime); EXPECT_TRUE(CheckStats(expected_update_checks, expected_update_check_requests, @@ -866,7 +805,7 @@ CheckRetryLogicCapWithCalculationFailure) { // This will simulate an error while calculating the next update check time // and will result in no update checks happening till its set. - scheduled_task_executor_->SimulateCalculateNextUpdateCheckFailure(true); + scheduled_task_executor_->SimulateCalculateNextScheduledTaskFailure(true); EXPECT_FALSE(CheckDailyUpdateCheck(1 /* hours_from_now */)); // Fast forward by max retries * retry period and check that no update has @@ -880,7 +819,7 @@ // At this point all state has been reset. Reset failure mode and check if // daily update checks happen. - scheduled_task_executor_->SimulateCalculateNextUpdateCheckFailure(false); + scheduled_task_executor_->SimulateCalculateNextScheduledTaskFailure(false); EXPECT_TRUE(CheckDailyUpdateCheck(1 /* hours_from_now */)); }
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.cc b/chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.cc new file mode 100644 index 0000000..185c4b0 --- /dev/null +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.cc
@@ -0,0 +1,67 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.h" + +#include <memory> +#include <string> +#include <utility> + +#include "base/memory/ptr_util.h" + +namespace policy { +namespace { +// Time zones that will be used in tests. +constexpr char kESTTimeZoneID[] = "America/New_York"; + +// The tag associated to register scheduled task timer. +constexpr char kScheduledTaskTimerTagForTest[] = + "DeviceScheduledTaskTimerForTest"; +} // namespace + +FakeScheduledTaskExecutor::FakeScheduledTaskExecutor( + const base::Clock* clock, + const base::TickClock* tick_clock) + : ScheduledTaskExecutorImpl(kScheduledTaskTimerTagForTest), + clock_(clock), + tick_clock_(tick_clock) { + // Set time zone so that tests are deterministic across different + // environments. + time_zone_ = base::WrapUnique(icu::TimeZone::createTimeZone( + icu::UnicodeString::fromUTF8(kESTTimeZoneID))); +} + +FakeScheduledTaskExecutor::~FakeScheduledTaskExecutor() {} + +void FakeScheduledTaskExecutor::SetTimeZone( + std::unique_ptr<icu::TimeZone> time_zone) { + time_zone_ = std::move(time_zone); +} + +base::Time FakeScheduledTaskExecutor::GetCurrentTime() { + return clock_->Now(); +} + +const icu::TimeZone& FakeScheduledTaskExecutor::GetTimeZone() { + return *time_zone_; +} + +void FakeScheduledTaskExecutor::SimulateCalculateNextScheduledTaskFailure( + bool simulate) { + simulate_calculate_next_update_check_failure_ = simulate; +} + +base::TimeDelta FakeScheduledTaskExecutor::CalculateNextScheduledTaskTimerDelay( + base::Time cur_time, + ScheduledTaskData* scheduled_task_data) { + if (simulate_calculate_next_update_check_failure_) + return scheduled_task_internal::kInvalidDelay; + return ScheduledTaskExecutorImpl::CalculateNextScheduledTaskTimerDelay( + cur_time, scheduled_task_data); +} + +base::TimeTicks FakeScheduledTaskExecutor::GetTicksSinceBoot() { + return tick_clock_->NowTicks(); +} +} // namespace policy
diff --git a/chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.h b/chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.h new file mode 100644 index 0000000..8d42fc4 --- /dev/null +++ b/chrome/browser/chromeos/policy/scheduled_task_handler/test/fake_scheduled_task_executor.h
@@ -0,0 +1,55 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_TEST_FAKE_SCHEDULED_TASK_EXECUTOR_H_ +#define CHROME_BROWSER_CHROMEOS_POLICY_SCHEDULED_TASK_HANDLER_TEST_FAKE_SCHEDULED_TASK_EXECUTOR_H_ + +#include "base/time/clock.h" +#include "base/time/tick_clock.h" +#include "base/time/time.h" +#include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h" +#include "third_party/icu/source/i18n/unicode/timezone.h" + +namespace policy { +// TODO(crbug/1227641): Make FakeScheduledTaskExecutor independendt of the +// implementation. +class FakeScheduledTaskExecutor : public ScheduledTaskExecutorImpl { + public: + FakeScheduledTaskExecutor(const base::Clock* clock, + const base::TickClock* tick_clock); + + FakeScheduledTaskExecutor(const FakeScheduledTaskExecutor&) = delete; + FakeScheduledTaskExecutor& operator=(const FakeScheduledTaskExecutor&) = + delete; + + ~FakeScheduledTaskExecutor() override; + + void SetTimeZone(std::unique_ptr<icu::TimeZone> time_zone); + + base::Time GetCurrentTime() override; + + const icu::TimeZone& GetTimeZone() override; + + void SimulateCalculateNextScheduledTaskFailure(bool simulate); + + base::TimeDelta CalculateNextScheduledTaskTimerDelay( + base::Time cur_time, + ScheduledTaskData* scheduled_task_data) override; + + private: + base::TimeTicks GetTicksSinceBoot() override; + // Clock to use to get current time. + const base::Clock* const clock_; + + // Clock to use to calculate time ticks. + const base::TickClock* const tick_clock_; + + // The current time zone. + std::unique_ptr<icu::TimeZone> time_zone_; + + // If set then |CalculateNextUpdateCheckTimerDelay| returns zero delay. + bool simulate_calculate_next_update_check_failure_ = false; +}; +} // namespace policy + +#endif
diff --git a/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.cc b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.cc index faf59f1..2edb32b 100644 --- a/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.cc +++ b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.cc
@@ -47,7 +47,7 @@ status_callback_for_testing_ = std::move(callback); } -bool DeviceCloudStateKeysUploader::IsClientRegistered() const { +bool DeviceCloudStateKeysUploader::IsClientRegisteredForTesting() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); CHECK(cloud_policy_client_);
diff --git a/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h index 7d08613d..8ceb0f46 100644 --- a/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h +++ b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h
@@ -54,10 +54,10 @@ // Returns cloud policy client registration state. This should be only used in // tests. - bool IsClientRegistered() const; + bool IsClientRegisteredForTesting() const; // Returns state keys to upload. This should be only used in tests. - const std::vector<std::string>& state_keys_to_upload() const { + const std::vector<std::string>& state_keys_to_upload_for_testing() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return state_keys_to_upload_;
diff --git a/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc index 1bbf119..e3c6646 100644 --- a/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc +++ b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc
@@ -140,7 +140,8 @@ run_loop_.Run(); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, job_type); - EXPECT_THAT(uploader_->state_keys_to_upload(), testing::ElementsAre("1")); + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), + testing::ElementsAre("1")); } // Expects to successfully upload state keys with unrealistically delayed DM @@ -157,17 +158,18 @@ // Expect state keys to be uploaded, but client not registered yet // (DM Token retrieval still pending). - EXPECT_THAT(uploader_->state_keys_to_upload(), testing::ElementsAre("1")); - EXPECT_FALSE(uploader_->IsClientRegistered()); + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), + testing::ElementsAre("1")); + EXPECT_FALSE(uploader_->IsClientRegisteredForTesting()); - // Set new state keys and fast-foward time so state keys update is triggered + // Set new state keys and fast-forward time so state keys update is triggered // during DM Token retrieval (which should be still pending). SetStateKeys(2); task_environment_.FastForwardBy( ServerBackedStateKeysBroker::GetPollIntervalForTesting()); - EXPECT_THAT(uploader_->state_keys_to_upload(), + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), testing::ElementsAre("1", "2")); - EXPECT_FALSE(uploader_->IsClientRegistered()); + EXPECT_FALSE(uploader_->IsClientRegisteredForTesting()); // Expect DM Token retrieval and registration to be completed // and a successful state keys upload (via policy fetch). @@ -178,7 +180,7 @@ service_.SendJobOKAsync(policy_response))); ExpectSuccess(true); run_loop_.Run(); - EXPECT_TRUE(uploader_->IsClientRegistered()); + EXPECT_TRUE(uploader_->IsClientRegisteredForTesting()); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, job_type); } @@ -198,7 +200,8 @@ run_loop_.Run(); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, job_type); - EXPECT_THAT(uploader_->state_keys_to_upload(), testing::ElementsAre("1")); + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), + testing::ElementsAre("1")); // Set new state keys and fast-forward time to trigger state keys update. ExpectSuccess(true); @@ -207,7 +210,7 @@ ServerBackedStateKeysBroker::GetPollIntervalForTesting()); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, job_type); - EXPECT_THAT(uploader_->state_keys_to_upload(), + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), testing::ElementsAre("1", "2")); // Set new state keys and fast-forward time to trigger state keys update. @@ -217,7 +220,7 @@ ServerBackedStateKeysBroker::GetPollIntervalForTesting()); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, job_type); - EXPECT_THAT(uploader_->state_keys_to_upload(), + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), testing::ElementsAre("1", "2", "3")); } @@ -227,8 +230,9 @@ InitUploader(/*dm_token=*/""); ExpectSuccess(false); run_loop_.Run(); - EXPECT_FALSE(uploader_->IsClientRegistered()); - EXPECT_THAT(uploader_->state_keys_to_upload(), testing::ElementsAre("1")); + EXPECT_FALSE(uploader_->IsClientRegisteredForTesting()); + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), + testing::ElementsAre("1")); } // Expect to fail when uploading state keys without initializing them first. @@ -236,8 +240,9 @@ InitUploader("test-dm-token"); ExpectSuccess(false); run_loop_.Run(); - EXPECT_FALSE(uploader_->IsClientRegistered()); - EXPECT_THAT(uploader_->state_keys_to_upload(), testing::IsEmpty()); + EXPECT_FALSE(uploader_->IsClientRegisteredForTesting()); + EXPECT_THAT(uploader_->state_keys_to_upload_for_testing(), + testing::IsEmpty()); } } // namespace policy
diff --git a/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerCoordinator.java b/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerCoordinator.java index b196636..e21c91e 100644 --- a/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerCoordinator.java +++ b/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerCoordinator.java
@@ -100,6 +100,10 @@ if (mLayoutInitialized) return; mRootView = (ContinuousSearchViewResourceFrameLayout) mViewStub.inflate(); + // Ensure the root view isn't shown until it is set by the property model. This avoids some + // animation jank when animations are off. + mRootView.setVisibility(View.INVISIBLE); + mSceneLayer = new ContinuousSearchSceneLayer( mResourceManager, mRootView, mRootView.getShadowHeight()); mLayoutManager.addSceneOverlay(mSceneLayer);
diff --git a/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediator.java b/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediator.java index 312abed..c497e0e 100644 --- a/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediator.java +++ b/chrome/browser/continuous_search/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediator.java
@@ -162,20 +162,35 @@ @Override public void onControlsOffsetChanged(int topOffset, int topControlsMinHeightOffset, int bottomOffset, int bottomControlsMinHeightOffset, boolean needsAnimate) { + updateState(); + } + + @Override + public void onTopControlsHeightChanged(int topControlsHeight, int topControlsMinHeight) { + // When animations are disabled {@link #onControlsOffsetChanged} isn't always called when + // navigating between pages as the topbar doesn't always move. + // TODO(crbug/1217105): updateState() should be calculated relative to the content offset + // rather than top offset to ensure this works properly regardless of whether this is + // animated. + updateState(); + } + + private void updateState() { + final int topControlsHeight = mBrowserControlsStateProvider.getTopControlsHeight(); + final int topControlsMinHeight = mBrowserControlsStateProvider.getTopControlsMinHeight(); + // Whether container height is part of top controls height. - boolean isIncludedInHeight = mBrowserControlsStateProvider.getTopControlsHeight() - > mDefaultTopContainerHeightSupplier.get() - + mBrowserControlsStateProvider.getTopControlsMinHeight(); + boolean isIncludedInHeight = + topControlsHeight > mDefaultTopContainerHeightSupplier.get() + topControlsMinHeight; + + final int topOffset = mBrowserControlsStateProvider.getTopControlOffset(); // Whether the part of top controls that is not included in min height visible. - boolean isNonMinHeightTopControlsVisible = topOffset - + mBrowserControlsStateProvider.getTopControlsHeight() - - mBrowserControlsStateProvider.getTopControlsMinHeight() - > 0; + boolean isNonMinHeightTopControlsVisible = + (topOffset + topControlsHeight - topControlsMinHeight) > 0; // Whether container is at least partly visible. boolean isUiVisible = isIncludedInHeight && isNonMinHeightTopControlsVisible; final boolean uiFullyVisible = isUiVisible && topOffset == 0; - int yOffset = topOffset + mBrowserControlsStateProvider.getTopControlsMinHeight() - + mDefaultTopContainerHeightSupplier.get(); + int yOffset = topOffset + topControlsMinHeight + mDefaultTopContainerHeightSupplier.get(); mModel.set(ContinuousSearchContainerProperties.VERTICAL_OFFSET, yOffset); // Show the composited view when the UI is at least partly visible and native
diff --git a/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java b/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java index 3ee9b37..a69c5954 100644 --- a/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java +++ b/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java
@@ -40,6 +40,7 @@ private int mCurrentTopControlsHeight; private int mCurrentTopControlsMinHeight; private int mCurrentExpectedHeight; + private int mCurrentTopOffset; private boolean mCanAnimateNative; private CallbackHelper mOnHidden; private static final int DEFAULT_MIN_HEIGHT = 40; @@ -75,7 +76,7 @@ @Override public int getTopControlOffset() { - return 0; + return mCurrentTopOffset; } @Override @@ -470,6 +471,7 @@ boolean expectedCompositedViewVisibility, int expectedAndroidViewVisibility) { mCurrentTopControlsHeight = topControlsHeight; mCurrentTopControlsMinHeight = minHeight; + mCurrentTopOffset = topOffset; mCanAnimateNative = canAnimate; mCurrentBrowserControlsObserver.onControlsOffsetChanged(topOffset, 0, 0, 0, true); assertModelVerticalOffset(expectedVerticalOffset);
diff --git a/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserver.java b/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserver.java index e4ec101..db855b164 100644 --- a/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserver.java +++ b/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserver.java
@@ -26,7 +26,7 @@ } @Override - public void onPageLoadStarted(Tab tab, GURL url) { + public void onUpdateUrl(Tab tab, GURL url) { ContinuousNavigationUserDataImpl continuousNavigationUserData = ContinuousNavigationUserDataImpl.getOrCreateForTab(tab); continuousNavigationUserData.updateCurrentUrl(url);
diff --git a/chrome/browser/continuous_search/internal/android/junit/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserverTest.java b/chrome/browser/continuous_search/internal/android/junit/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserverTest.java index 032e210..505e3b2b 100644 --- a/chrome/browser/continuous_search/internal/android/junit/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserverTest.java +++ b/chrome/browser/continuous_search/internal/android/junit/org/chromium/chrome/browser/continuous_search/ContinuousSearchTabObserverTest.java
@@ -107,7 +107,7 @@ public void testLoadNonSrpUrl() { InOrder inOrder = inOrder(mUserDataMock); - mObserver.onPageLoadStarted(mTabMock, mNonSrpUrl); + mObserver.onUpdateUrl(mTabMock, mNonSrpUrl); inOrder.verify(mUserDataMock).updateCurrentUrl(eq(mNonSrpUrl)); mObserver.onPageLoadFinished(mTabMock, mNonSrpUrl); @@ -121,7 +121,7 @@ public void testLoadSrpUrl() { InOrder inOrder = inOrder(mUserDataMock, mProducerMock); - mObserver.onPageLoadStarted(mTabMock, mSrpUrl); + mObserver.onUpdateUrl(mTabMock, mSrpUrl); inOrder.verify(mUserDataMock).updateCurrentUrl(eq(mSrpUrl)); mObserver.onPageLoadFinished(mTabMock, mSrpUrl); @@ -143,7 +143,7 @@ public void testLoadSrpUrlWithError() { InOrder inOrder = inOrder(mUserDataMock, mProducerMock); - mObserver.onPageLoadStarted(mTabMock, mSrpUrl); + mObserver.onUpdateUrl(mTabMock, mSrpUrl); inOrder.verify(mUserDataMock).updateCurrentUrl(eq(mSrpUrl)); mObserver.onPageLoadFinished(mTabMock, mSrpUrl); @@ -162,7 +162,7 @@ public void testCloseContents() { InOrder inOrder = inOrder(mUserDataMock, mProducerMock); - mObserver.onPageLoadStarted(mTabMock, mSrpUrl); + mObserver.onUpdateUrl(mTabMock, mSrpUrl); inOrder.verify(mUserDataMock).updateCurrentUrl(eq(mSrpUrl)); mObserver.onPageLoadFinished(mTabMock, mSrpUrl); @@ -181,7 +181,7 @@ public void testLoadSrpUrlThenCloseTab() { InOrder inOrder = inOrder(mUserDataMock, mProducerMock, mTabMock); - mObserver.onPageLoadStarted(mTabMock, mSrpUrl); + mObserver.onUpdateUrl(mTabMock, mSrpUrl); inOrder.verify(mUserDataMock).updateCurrentUrl(eq(mSrpUrl)); mObserver.onPageLoadFinished(mTabMock, mSrpUrl); @@ -222,7 +222,7 @@ final long nativePtr = 123L; doReturn(nativePtr).when(mSearchResultExtractorProducerJniMock).create(any()); - mObserver.onPageLoadStarted(mTabMock, mSrpUrl); + mObserver.onUpdateUrl(mTabMock, mSrpUrl); mObserver.onPageLoadFinished(mTabMock, mSrpUrl); Assert.assertEquals(1,
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_api.cc b/chrome/browser/extensions/api/content_settings/content_settings_api.cc index c92a834..c354df6 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_api.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_api.cc
@@ -204,9 +204,8 @@ return RespondNow(Error(secondary_error)); } - std::string setting_str; - EXTENSION_FUNCTION_VALIDATE( - params->details.setting->GetAsString(&setting_str)); + EXTENSION_FUNCTION_VALIDATE(params->details.setting->is_string()); + std::string setting_str = params->details.setting->GetString(); ContentSetting setting; EXTENSION_FUNCTION_VALIDATE( content_settings::ContentSettingFromString(setting_str, &setting));
diff --git a/chrome/browser/extensions/api/declarative_content/content_action.cc b/chrome/browser/extensions/api/declarative_content/content_action.cc index db763a3b..d3c3735 100644 --- a/chrome/browser/extensions/api/declarative_content/content_action.cc +++ b/chrome/browser/extensions/api/declarative_content/content_action.cc
@@ -176,9 +176,8 @@ static bool AppendJSStringsToCPPStrings(const base::ListValue& append_strings, std::vector<std::string>* append_to) { for (const auto& entry : append_strings.GetList()) { - std::string value; - if (entry.GetAsString(&value)) { - append_to->push_back(value); + if (entry.is_string()) { + append_to->push_back(entry.GetString()); } else { return false; }
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc index cdd5609..b0c888a 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -644,7 +644,11 @@ std::unique_ptr<base::Value> result( RunFunctionAndReturnResult(function, args)); EXPECT_TRUE(result.get()); - return result.get() && result->GetAsString(result_string); + if (result.get() && result->is_string()) { + *result_string = result->GetString(); + return true; + } + return false; } std::string DownloadItemIdAsArgList(const DownloadItem* download_item) {
diff --git a/chrome/browser/extensions/api/font_settings/font_settings_api.cc b/chrome/browser/extensions/api/font_settings/font_settings_api.cc index 4a2d6ca..d7262fd2 100644 --- a/chrome/browser/extensions/api/font_settings/font_settings_api.cc +++ b/chrome/browser/extensions/api/font_settings/font_settings_api.cc
@@ -153,12 +153,11 @@ pref_name); CHECK(pref); - std::string font_name; - if (!pref->GetValue()->GetAsString(&font_name)) { + if (!pref->GetValue()->is_string()) { NOTREACHED(); return; } - + std::string font_name = pref->GetValue()->GetString(); base::ListValue args; std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); dict->SetString(kFontIdKey, font_name); @@ -240,9 +239,8 @@ const PrefService::Preference* pref = prefs->FindPreference(pref_path); - std::string font_name; - EXTENSION_FUNCTION_VALIDATE( - pref && pref->GetValue()->GetAsString(&font_name)); + EXTENSION_FUNCTION_VALIDATE(pref && pref->GetValue()->is_string()); + std::string font_name = pref->GetValue()->GetString(); // Legacy code was using the localized font name for fontId. These values may // have been stored in prefs. For backward compatibility, we are converting
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc index c88800ec..d4fe8b7 100644 --- a/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -3331,10 +3331,9 @@ "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", browser())); - std::string url; - EXPECT_TRUE(value->GetAsString(&url)); + EXPECT_TRUE(value->is_string()); EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), - url); + value->GetString()); } IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, @@ -3352,10 +3351,9 @@ "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", browser())); - std::string url; - EXPECT_TRUE(value->GetAsString(&url)); + EXPECT_TRUE(value->is_string()); EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), - url); + value->GetString()); } IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, @@ -3378,10 +3376,9 @@ std::unique_ptr<base::Value> value( utils::RunFunctionAndReturnSingleResult(function.get(), args, browser())); - std::string url; - EXPECT_TRUE(value->GetAsString(&url)); + EXPECT_TRUE(value->is_string()); EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), - url); + value->GetString()); } class ClearAllCachedAuthTokensFunctionTest : public AsyncExtensionBrowserTest {
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.cc index a0ff08d..93b4d790 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.cc
@@ -6,6 +6,7 @@ #include "base/containers/contains.h" #include "base/no_destructor.h" +#include "chrome/browser/extensions/api/image_writer_private/error_messages.h" #include "chrome/common/extensions/api/image_writer_private.h" #include "chromeos/crosapi/mojom/image_writer.mojom.h" #include "chromeos/lacros/lacros_chrome_service_impl.h" @@ -20,6 +21,8 @@ namespace { +const char kUnsupportedAshVersion[] = "UNSUPPORTED_ASH_VERSION"; + image_writer_api::Stage FromMojo(crosapi::mojom::Stage mojo_stage) { switch (mojo_stage) { case crosapi::mojom::Stage::kConfirmation: @@ -51,8 +54,8 @@ content::BrowserContext* browser_context, const std::string& extension_id, extensions::image_writer::ImageWriterControllerLacros* controller) - : browser_context_(browser_context), - extension_id_(extension_id), + : extension_id_(extension_id), + browser_context_(browser_context), controller_(controller) {} ImageWriterClientLacros(const ImageWriterClientLacros&) = delete; @@ -109,8 +112,12 @@ // Note: |this| is deleted at this point. } - content::BrowserContext* const browser_context_; const std::string extension_id_; + // Both pointers of |browser_context_| and |controller_| are guaranteed + // to be valid for the lifetime of this class, as destruction of either + // BrowserContext or ImageWriterControllerLacros will result in synchronous + // destruction of this class. + content::BrowserContext* const browser_context_; extensions::image_writer::ImageWriterControllerLacros* const controller_; mojo::Receiver<crosapi::mojom::ImageWriterClient> receiver_{this}; @@ -141,15 +148,15 @@ void ImageWriterControllerLacros::DestroyPartitions( const std::string& extension_id, const std::string& storage_unit_id, - DestroyPartitionsCallback callback) { + WriteOperationCallback callback) { chromeos::LacrosService* service = chromeos::LacrosService::Get(); if (!service->IsAvailable<crosapi::mojom::ImageWriter>()) { - std::move(callback).Run("Unsupported ash version"); + std::move(callback).Run(kUnsupportedAshVersion); return; } if (base::Contains(pending_clients_, extension_id)) { - std::move(callback).Run("Operation already in progress"); + std::move(callback).Run(error::kOperationAlreadyInProgress); return; } @@ -161,6 +168,70 @@ pending_clients_.emplace(extension_id, std::move(pending_client)); } +void ImageWriterControllerLacros::WriteFromUrl( + const std::string& extension_id, + const std::string& storage_unit_id, + const GURL& image_url, + const absl::optional<std::string>& image_hash, + WriteOperationCallback callback) { + chromeos::LacrosService* service = chromeos::LacrosService::Get(); + if (!service->IsAvailable<crosapi::mojom::ImageWriter>() || + service->GetInterfaceVersion(crosapi::mojom::ImageWriter::Uuid_) < 1) { + std::move(callback).Run(kUnsupportedAshVersion); + return; + } + + if (base::Contains(pending_clients_, extension_id)) { + std::move(callback).Run(error::kOperationAlreadyInProgress); + return; + } + + auto pending_client = std::make_unique<ImageWriterClientLacros>( + browser_context_, extension_id, this); + service->GetRemote<crosapi::mojom::ImageWriter>()->WriteFromUrl( + storage_unit_id, image_url, image_hash, + pending_client->BindImageWriterClient(), std::move(callback)); + pending_clients_.emplace(extension_id, std::move(pending_client)); +} + +void ImageWriterControllerLacros::WriteFromFile( + const std::string& extension_id, + const std::string& storage_unit_id, + const base::FilePath& image_path, + WriteOperationCallback callback) { + chromeos::LacrosService* service = chromeos::LacrosService::Get(); + if (!service->IsAvailable<crosapi::mojom::ImageWriter>() || + service->GetInterfaceVersion(crosapi::mojom::ImageWriter::Uuid_) < 1) { + std::move(callback).Run(kUnsupportedAshVersion); + return; + } + + if (base::Contains(pending_clients_, extension_id)) { + std::move(callback).Run(error::kOperationAlreadyInProgress); + return; + } + + auto pending_client = std::make_unique<ImageWriterClientLacros>( + browser_context_, extension_id, this); + service->GetRemote<crosapi::mojom::ImageWriter>()->WriteFromFile( + storage_unit_id, image_path, pending_client->BindImageWriterClient(), + std::move(callback)); + pending_clients_.emplace(extension_id, std::move(pending_client)); +} + +void ImageWriterControllerLacros::CancelWrite(const std::string& extension_id, + WriteOperationCallback callback) { + if (!base::Contains(pending_clients_, extension_id)) { + std::move(callback).Run(error::kNoOperationInProgress); + return; + } + + // Deleting pending client will trigger its disconnect handler in ash, + // which will cancel its pending write operation if there is any. + DeletePendingClient(extension_id); + std::move(callback).Run(absl::nullopt); +} + void ImageWriterControllerLacros::OnPendingClientWriteCompleted( const std::string& extension_id) { DeletePendingClient(extension_id);
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.h b/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.h index 4ff014c..78d1a3b 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.h +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_controller_lacros.h
@@ -37,11 +37,22 @@ void ListRemovableStorageDevices( ListRemovableStorageDevicesCallback callback); - using DestroyPartitionsCallback = - crosapi::mojom::ImageWriter::DestroyPartitionsCallback; + using WriteOperationCallback = + base::OnceCallback<void(const absl::optional<std::string>&)>; void DestroyPartitions(const std::string& extension_id, const std::string& storage_unit_id, - DestroyPartitionsCallback callback); + WriteOperationCallback callback); + void WriteFromUrl(const std::string& extension_id, + const std::string& storage_unit_id, + const GURL& image_url, + const absl::optional<std::string>& image_hash, + WriteOperationCallback callback); + void WriteFromFile(const std::string& extension_id, + const std::string& storage_unit_id, + const base::FilePath& image_path, + WriteOperationCallback callback); + void CancelWrite(const std::string& extension_id, + WriteOperationCallback callback); void OnPendingClientWriteCompleted(const std::string& extension_id); void OnPendingClientWriteError(const std::string& extension_id);
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc index 4c00b65..21429a95 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
@@ -46,6 +46,15 @@ ImageWriterPrivateBaseFunction::~ImageWriterPrivateBaseFunction() = default; +#if BUILDFLAG(IS_CHROMEOS_LACROS) +void ImageWriterPrivateBaseFunction::OnComplete( + const absl::optional<std::string>& error) { + if (error) + Respond(Error(error.value())); + else + Respond(NoArguments()); +} +#else void ImageWriterPrivateBaseFunction::OnComplete(bool success, const std::string& error) { if (success) @@ -53,6 +62,7 @@ else Respond(Error(error)); } +#endif // BUILDFLAG(IS_CHROMOS_LACROS) ImageWriterPrivateWriteFromUrlFunction:: ImageWriterPrivateWriteFromUrlFunction() = default; @@ -62,7 +72,7 @@ ExtensionFunction::ResponseAction ImageWriterPrivateWriteFromUrlFunction::Run() { -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(OS_CHROMEOS) Profile* profile = Profile::FromBrowserContext(browser_context()); if (profile->GetPrefs()->GetBoolean(prefs::kExternalStorageDisabled) || profile->GetPrefs()->GetBoolean(prefs::kExternalStorageReadOnly)) { @@ -82,11 +92,20 @@ hash = *params->options->image_hash; } +#if BUILDFLAG(IS_CHROMEOS_LACROS) + image_writer::ImageWriterControllerLacros::Get(browser_context()) + ->WriteFromUrl( + extension_id(), params->storage_unit_id, url, + hash.empty() ? absl::nullopt : absl::make_optional(hash), + base::BindOnce(&ImageWriterPrivateWriteFromUrlFunction::OnComplete, + this)); +#else image_writer::OperationManager::Get(browser_context()) ->StartWriteFromUrl( extension_id(), url, hash, params->storage_unit_id, base::BindOnce(&ImageWriterPrivateWriteFromUrlFunction::OnComplete, this)); +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) return RespondLater(); } @@ -98,7 +117,7 @@ ExtensionFunction::ResponseAction ImageWriterPrivateWriteFromFileFunction::Run() { -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(OS_CHROMEOS) Profile* profile = Profile::FromBrowserContext(browser_context()); if (profile->GetPrefs()->GetBoolean(prefs::kExternalStorageDisabled) || profile->GetPrefs()->GetBoolean(prefs::kExternalStorageReadOnly)) { @@ -122,11 +141,19 @@ return RespondNow(Error(std::move(error))); } +#if BUILDFLAG(IS_CHROMEOS_LACROS) + image_writer::ImageWriterControllerLacros::Get(browser_context()) + ->WriteFromFile( + extension_id(), storage_unit_id, path, + base::BindOnce(&ImageWriterPrivateWriteFromFileFunction::OnComplete, + this)); +#else image_writer::OperationManager::Get(browser_context()) ->StartWriteFromFile( extension_id(), path, storage_unit_id, base::BindOnce(&ImageWriterPrivateWriteFromFileFunction::OnComplete, this)); +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) return RespondLater(); } @@ -137,11 +164,19 @@ ~ImageWriterPrivateCancelWriteFunction() = default; ExtensionFunction::ResponseAction ImageWriterPrivateCancelWriteFunction::Run() { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + image_writer::ImageWriterControllerLacros::Get(browser_context()) + ->CancelWrite( + extension_id(), + base::BindOnce(&ImageWriterPrivateCancelWriteFunction::OnComplete, + this)); +#else image_writer::OperationManager::Get(browser_context()) ->CancelWrite( extension_id(), base::BindOnce(&ImageWriterPrivateCancelWriteFunction::OnComplete, this)); +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) return RespondLater(); } @@ -169,9 +204,8 @@ image_writer::ImageWriterControllerLacros::Get(browser_context()) ->DestroyPartitions( extension_id(), params->storage_unit_id, - base::BindOnce(&ImageWriterPrivateDestroyPartitionsFunction:: - OnDestroyPartitionsDone, - this)); + base::BindOnce( + &ImageWriterPrivateDestroyPartitionsFunction::OnComplete, this)); #else image_writer::OperationManager::Get(browser_context()) ->DestroyPartitions( @@ -182,16 +216,6 @@ return RespondLater(); } -#if BUILDFLAG(IS_CHROMEOS_LACROS) -void ImageWriterPrivateDestroyPartitionsFunction::OnDestroyPartitionsDone( - const absl::optional<std::string>& error) { - if (error) - Respond(Error(error.value())); - else - Respond(NoArguments()); -} -#endif - ImageWriterPrivateListRemovableStorageDevicesFunction:: ImageWriterPrivateListRemovableStorageDevicesFunction() = default;
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h index cb14063..a428ac3b 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
@@ -18,7 +18,11 @@ public: ImageWriterPrivateBaseFunction(); +#if BUILDFLAG(IS_CHROMEOS_LACROS) + virtual void OnComplete(const absl::optional<std::string>& error); +#else virtual void OnComplete(bool success, const std::string& error); +#endif protected: ~ImageWriterPrivateBaseFunction() override; @@ -73,9 +77,6 @@ private: ~ImageWriterPrivateDestroyPartitionsFunction() override; ResponseAction Run() override; -#if BUILDFLAG(IS_CHROMEOS_LACROS) - void OnDestroyPartitionsDone(const absl::optional<std::string>& error); -#endif }; class ImageWriterPrivateListRemovableStorageDevicesFunction
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc index 702977c..3acfe06 100644 --- a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc +++ b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
@@ -111,12 +111,11 @@ } allowed_origins_.ClearPatterns(); for (const auto& entry : allowed_origins_list->GetList()) { - std::string pattern_string; - if (!entry.GetAsString(&pattern_string)) { + if (!entry.is_string()) { *error_message = "allowed_origins must be list of strings."; return false; } - + std::string pattern_string = entry.GetString(); URLPattern pattern(URLPattern::SCHEME_EXTENSION); URLPattern::ParseResult result = pattern.Parse(pattern_string); if (result != URLPattern::ParseResult::kSuccess) {
diff --git a/chrome/browser/extensions/api/notifications/notifications_apitest.cc b/chrome/browser/extensions/api/notifications/notifications_apitest.cc index 1fe35bd..ddb5220 100644 --- a/chrome/browser/extensions/api/notifications/notifications_apitest.cc +++ b/chrome/browser/extensions/api/notifications/notifications_apitest.cc
@@ -349,9 +349,8 @@ extensions::api_test_utils::NONE)); EXPECT_EQ(base::Value::Type::STRING, result->type()); - std::string permission_level; - EXPECT_TRUE(result->GetAsString(&permission_level)); - EXPECT_EQ("granted", permission_level); + EXPECT_TRUE(result->is_string()); + EXPECT_EQ("granted", result->GetString()); } // Get permission level for the extension whose notifications are disabled. @@ -372,9 +371,8 @@ extensions::api_test_utils::NONE)); EXPECT_EQ(base::Value::Type::STRING, result->type()); - std::string permission_level; - EXPECT_TRUE(result->GetAsString(&permission_level)); - EXPECT_EQ("denied", permission_level); + EXPECT_TRUE(result->is_string()); + EXPECT_EQ("denied", result->GetString()); } }
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc index da28295..7266a72 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -154,6 +154,11 @@ form.username_value = std::u16string(username); form.password_value = std::u16string(password); form.username_element = std::u16string(username_element); + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); return form; } @@ -173,6 +178,11 @@ form.app_display_name = std::string(app_display_name); form.affiliated_web_realm = std::string(affiliated_web_realm); form.password_value = std::u16string(password); + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); return form; }
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc index 1c743c2..2777d1f 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -166,6 +166,11 @@ form.url = GURL("http://abc1.com"); form.username_value = u"test@gmail.com"; form.password_value = u"test"; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = base::flat_map<password_manager::InsecureType, + password_manager::InsecurityMetadata>(); return form; }
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index cd8b63d..caaa722 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -1059,10 +1059,10 @@ pref_service->SetInteger(pref_name, static_cast<int>(double_value)); break; case base::Value::Type::STRING: { - std::string string_value; - if (!value->GetAsString(&string_value)) + if (!value->is_string()) return settings_private::SetPrefResult::PREF_TYPE_MISMATCH; + std::string string_value = value->GetString(); if (IsPrefTypeURL(pref_name)) { GURL fixed = url_formatter::FixupURL(string_value, std::string()); if (fixed.is_valid())
diff --git a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc index bd8c28b..75a7308 100644 --- a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc +++ b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
@@ -27,12 +27,11 @@ !it.IsAtEnd(); it.Advance()) { const base::Value& value = it.value(); - std::string guid_in_value; - if (!value.GetAsString(&guid_in_value)) { + if (!value.is_string()) { LOG(ERROR) << "Badly formatted dictionary"; continue; } - if (guid_in_value == guid) { + if (value.GetString() == guid) { return it.key(); } }
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc index 948cfd5..07e4431 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -584,8 +584,8 @@ function.get(), kEmptyArgs, browser())); ASSERT_TRUE(result); EXPECT_EQ(base::Value::Type::STRING, result->type()); - std::string webgl_status; - EXPECT_TRUE(result->GetAsString(&webgl_status)); + EXPECT_TRUE(result->is_string()); + std::string webgl_status = result->GetString(); EXPECT_STREQ(webgl_allowed ? kWebGLStatusAllowed : kWebGLStatusBlocked, webgl_status.c_str()); }
diff --git a/chrome/browser/extensions/background_header_browsertest.cc b/chrome/browser/extensions/background_header_browsertest.cc index 95b1352..e9602d5 100644 --- a/chrome/browser/extensions/background_header_browsertest.cc +++ b/chrome/browser/extensions/background_header_browsertest.cc
@@ -71,14 +71,14 @@ EXPECT_TRUE(message_queue.WaitForMessage(&json)); absl::optional<base::Value> value = base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS); - std::string result; if (!value) { ADD_FAILURE() << "Received invalid response: " << json; return std::string(); } - EXPECT_TRUE(value->GetAsString(&result)); + EXPECT_TRUE(value->is_string()); std::string trimmed_result; - base::TrimWhitespaceASCII(result, base::TRIM_ALL, &trimmed_result); + base::TrimWhitespaceASCII(value->GetString(), base::TRIM_ALL, + &trimmed_result); return trimmed_result; }
diff --git a/chrome/browser/extensions/background_xhr_browsertest.cc b/chrome/browser/extensions/background_xhr_browsertest.cc index 569313f..443868e 100644 --- a/chrome/browser/extensions/background_xhr_browsertest.cc +++ b/chrome/browser/extensions/background_xhr_browsertest.cc
@@ -133,10 +133,10 @@ EXPECT_TRUE(message_queue.WaitForMessage(&json)); absl::optional<base::Value> value = base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS); - std::string result; - EXPECT_TRUE(value->GetAsString(&result)); + EXPECT_TRUE(value->is_string()); std::string trimmed_result; - base::TrimWhitespaceASCII(result, base::TRIM_ALL, &trimmed_result); + base::TrimWhitespaceASCII(value->GetString(), base::TRIM_ALL, + &trimmed_result); return trimmed_result; }
diff --git a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc index 228ab2a..ec01c1f 100644 --- a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc +++ b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
@@ -104,9 +104,8 @@ EXPECT_TRUE(message_queue->WaitForMessage(&json)); absl::optional<base::Value> value = base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS); - std::string result; - EXPECT_TRUE(value->GetAsString(&result)); - return result; + EXPECT_TRUE(value->is_string()); + return value->GetString(); } } // namespace
diff --git a/chrome/browser/extensions/device_permissions_dialog_controller.cc b/chrome/browser/extensions/device_permissions_dialog_controller.cc index 571cc28..778ff1c 100644 --- a/chrome/browser/extensions/device_permissions_dialog_controller.cc +++ b/chrome/browser/extensions/device_permissions_dialog_controller.cc
@@ -13,7 +13,7 @@ DevicePermissionsDialogController::DevicePermissionsDialogController( content::RenderFrameHost* owner, scoped_refptr<extensions::DevicePermissionsPrompt::Prompt> prompt) - : ChooserController(CreateChooserTitle( + : ChooserController(CreateExtensionAwareChooserTitle( owner, prompt->multiple() ? IDS_DEVICE_PERMISSIONS_PROMPT_MULTIPLE_SELECTION : IDS_DEVICE_PERMISSIONS_PROMPT_SINGLE_SELECTION,
diff --git a/chrome/browser/extensions/extension_action_storage_manager.cc b/chrome/browser/extensions/extension_action_storage_manager.cc index 04528a1..676788b 100644 --- a/chrome/browser/extensions/extension_action_storage_manager.cc +++ b/chrome/browser/extensions/extension_action_storage_manager.cc
@@ -142,10 +142,9 @@ for (base::DictionaryValue::Iterator iter(*icon_value); !iter.IsAtEnd(); iter.Advance()) { int icon_size = 0; - std::string icon_string; if (base::StringToInt(iter.key(), &icon_size) && - iter.value().GetAsString(&icon_string) && - StringToSkBitmap(icon_string, &bitmap)) { + iter.value().is_string() && + StringToSkBitmap(iter.value().GetString(), &bitmap)) { CHECK(!bitmap.isNull()); float scale = static_cast<float>(icon_size) / ExtensionAction::ActionIconSize();
diff --git a/chrome/browser/extensions/extension_cookies_browsertest.cc b/chrome/browser/extensions/extension_cookies_browsertest.cc index c19b3aa..5587fede 100644 --- a/chrome/browser/extensions/extension_cookies_browsertest.cc +++ b/chrome/browser/extensions/extension_cookies_browsertest.cc
@@ -845,9 +845,8 @@ EXPECT_TRUE(queue.WaitForMessage(&json)); absl::optional<base::Value> value = base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS); - std::string result; - EXPECT_TRUE(value->GetAsString(&result)); - return result; + EXPECT_TRUE(value->is_string()); + return value->GetString(); }; TestExtensionDir extension_dir;
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc index d269da9..698932e 100644 --- a/chrome/browser/extensions/extension_management.cc +++ b/chrome/browser/extensions/extension_management.cc
@@ -466,19 +466,17 @@ } // Parse legacy preferences. - ExtensionId id; - if (allowed_list_pref) { for (const auto& entry : allowed_list_pref->GetList()) { - if (entry.GetAsString(&id) && crx_file::id_util::IdIsValid(id)) - AccessById(id)->installation_mode = INSTALLATION_ALLOWED; + if (entry.is_string() && crx_file::id_util::IdIsValid(entry.GetString())) + AccessById(entry.GetString())->installation_mode = INSTALLATION_ALLOWED; } } if (denied_list_pref) { for (const auto& entry : denied_list_pref->GetList()) { - if (entry.GetAsString(&id) && crx_file::id_util::IdIsValid(id)) - AccessById(id)->installation_mode = INSTALLATION_BLOCKED; + if (entry.is_string() && crx_file::id_util::IdIsValid(entry.GetString())) + AccessById(entry.GetString())->installation_mode = INSTALLATION_BLOCKED; } } @@ -487,8 +485,8 @@ if (install_sources_pref) { global_settings_->has_restricted_install_sources = true; for (const auto& entry : install_sources_pref->GetList()) { - std::string url_pattern; - if (entry.GetAsString(&url_pattern)) { + if (entry.is_string()) { + std::string url_pattern = entry.GetString(); URLPattern entry(URLPattern::SCHEME_ALL); if (entry.Parse(url_pattern) == URLPattern::ParseResult::kSuccess) { global_settings_->install_sources.AddPattern(entry);
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc index bae99ef9..5be749b6 100644 --- a/chrome/browser/extensions/external_provider_impl.cc +++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -277,7 +277,7 @@ bool has_external_version = false; if (extension->Get(kExternalVersion, &external_version_value)) { if (external_version_value->is_string()) { - external_version_value->GetAsString(&external_version); + external_version = external_version_value->GetString(); has_external_version = true; } else { install_stage_tracker->ReportFailure(
diff --git a/chrome/browser/extensions/install_signer.cc b/chrome/browser/extensions/install_signer.cc index be45a54..0d3dcc4 100644 --- a/chrome/browser/extensions/install_signer.cc +++ b/chrome/browser/extensions/install_signer.cc
@@ -145,11 +145,10 @@ if (!dictionary.GetList(key, &id_list)) return false; for (const auto& entry : id_list->GetList()) { - std::string id; - if (!entry.GetAsString(&id)) { + if (!entry.is_string()) { return false; } - ids->insert(id); + ids->insert(entry.GetString()); } return true; }
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc index 66011eb..5ab665f 100644 --- a/chrome/browser/extensions/policy_handlers.cc +++ b/chrome/browser/extensions/policy_handlers.cc
@@ -118,14 +118,14 @@ int index = -1; for (const auto& entry : policy_list_value->GetList()) { ++index; - std::string entry_string; - if (!entry.GetAsString(&entry_string)) { + if (!entry.is_string()) { if (errors) { errors->AddError(policy_name(), index, IDS_POLICY_TYPE_ERROR, base::Value::GetTypeName(base::Value::Type::STRING)); } continue; } + std::string entry_string = entry.GetString(); // Each string item of the list should be of one of the following forms: // * <extension_id> @@ -188,12 +188,12 @@ // Check that the list contains valid URLPattern strings only. int index = 0; for (const auto& entry : list_value->GetList()) { - std::string url_pattern_string; - if (!entry.GetAsString(&url_pattern_string)) { + if (!entry.is_string()) { errors->AddError(policy_name(), index, IDS_POLICY_TYPE_ERROR, base::Value::GetTypeName(base::Value::Type::STRING)); return false; } + std::string url_pattern_string = entry.GetString(); URLPattern pattern(URLPattern::SCHEME_ALL); if (pattern.Parse(url_pattern_string) !=
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java index 1563365e..c569ba4 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java
@@ -181,11 +181,6 @@ WebFeedBridgeJni.get().unfollowWebFeed(webFeedId, callback); } - /** Returns whether the user subscribes to at least one Web Feed. */ - public static boolean isWebFeedSubscriber() { - return WebFeedBridgeJni.get().isWebFeedSubscriber(); - } - /** This is deprecated, do not use. */ @Deprecated public static class FollowedIds { @@ -235,6 +230,5 @@ void getAllSubscriptions(Callback<Object[]> callback); void refreshSubscriptions(Callback<Boolean> callback); void getRecentVisitCountsToHost(GURL url, Callback<int[]> callback); - boolean isWebFeedSubscriber(); } }
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java index 0205eef..ca04b6a 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
@@ -41,6 +41,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.task.test.ShadowPostTask; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feed.webfeed.WebFeedSnackbarController.FeedLauncher; @@ -151,6 +152,7 @@ @Test @SmallTest + @DisabledTest(message = "https://crbug.com/1227610") public void meetsShowingRequirements_showsIntro() { setWebFeedIntroLastShownTimeMsPref(0); setWebFeedIntroWebFeedIdShownTimeMsPref(0); @@ -199,6 +201,7 @@ @Test @SmallTest + @DisabledTest(message = "https://crbug.com/1227610") public void tooShortDelay_doesNotShowIntro() { setWebFeedIntroLastShownTimeMsPref(0); setWebFeedIntroWebFeedIdShownTimeMsPref(0); @@ -264,6 +267,7 @@ @Test @SmallTest + @DisabledTest(message = "https://crbug.com/1227610") public void featureEngagementTrackerSaysDoNotShow_doesNotShowIntro() { setWebFeedIntroLastShownTimeMsPref(0); setWebFeedIntroWebFeedIdShownTimeMsPref(0);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index dc39ba4..9761086 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2772,6 +2772,14 @@ "expiry_milestone": 92 }, { + "name": "enable-webgl-developer-extensions", + "owners": [ "webgl-team@google.com" ], + // This flag is the only way for developers to use + // development-time WebGL extensions on Android and ChromeOS. It + // must not be removed. + "expiry_milestone": -1 + }, + { "name": "enable-webgl-draft-extensions", "owners": [ "webgl-team@google.com" ], // This flag is the only way for end users to test upcoming WebGL
diff --git a/chrome/browser/flag-never-expire-list.json b/chrome/browser/flag-never-expire-list.json index 4cb6164..8bb39e2 100644 --- a/chrome/browser/flag-never-expire-list.json +++ b/chrome/browser/flag-never-expire-list.json
@@ -57,6 +57,7 @@ "enable-virtual-keyboard", "enable-web-authentication-testing-api", "enable-web-payments-experimental-features", + "enable-webgl-developer-extensions", "enable-webgl-draft-extensions", "enable-zero-copy", "extensions-on-chrome-urls",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 137aba4..7bbe5762 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2768,10 +2768,15 @@ const char kWebOtpBackendUserConsent[] = "User Consent API"; const char kWebOtpBackendAuto[] = "Automatically select the backend"; +const char kWebglDeveloperExtensionsName[] = "WebGL Developer Extensions"; +const char kWebglDeveloperExtensionsDescription[] = + "Enabling this option allows web applications to access WebGL extensions " + "intended only for use during development time."; + const char kWebglDraftExtensionsName[] = "WebGL Draft Extensions"; const char kWebglDraftExtensionsDescription[] = "Enabling this option allows web applications to access the WebGL " - "Extensions that are still in draft status."; + "extensions that are still in draft status."; const char kWebPaymentsExperimentalFeaturesName[] = "Experimental Web Payments API features";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index b571564..2b0eb40f7 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1576,6 +1576,9 @@ extern const char kWebOtpBackendUserConsent[]; extern const char kWebOtpBackendAuto[]; +extern const char kWebglDeveloperExtensionsName[]; +extern const char kWebglDeveloperExtensionsDescription[]; + extern const char kWebglDraftExtensionsName[]; extern const char kWebglDraftExtensionsDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index ca6e5ff0..ea850bd 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -57,6 +57,7 @@ #include "device/fido/features.h" #include "media/base/media_switches.h" #include "services/device/public/cpp/device_features.h" +#include "third_party/blink/public/common/features.h" #include "ui/base/ui_base_features.h" using base::android::ConvertJavaStringToUTF8; @@ -92,6 +93,7 @@ &autofill_assistant::features::kAutofillAssistantProactiveHelp, &autofill_assistant::features:: kAutofillAssistantDisableProactiveHelpTiedToMSBB, + &blink::features::kPrerender2, &commerce::kCommerceMerchantViewer, &commerce::kCommercePriceTracking, &device::kWebAuthPhoneSupport,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 6b20a770..203bfaa 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -429,6 +429,7 @@ "PredictivePrefetchingAllowedOnAllConnectionTypes"; public static final String PREFETCH_NOTIFICATION_SCHEDULING_INTEGRATION = "PrefetchNotificationSchedulingIntegration"; + public static final String PRERENDER2 = "Prerender2"; public static final String PRIORITIZE_BOOTSTRAP_TASKS = "PrioritizeBootstrapTasks"; public static final String PRIVACY_SANDBOX_SETTINGS = "PrivacySandboxSettings"; public static final String PRIVACY_SANDBOX_SETTINGS_2 = "PrivacySandboxSettings2";
diff --git a/chrome/browser/lifetime/browser_shutdown.cc b/chrome/browser/lifetime/browser_shutdown.cc index a65c192..083ee5be 100644 --- a/chrome/browser/lifetime/browser_shutdown.cc +++ b/chrome/browser/lifetime/browser_shutdown.cc
@@ -77,6 +77,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/gpu_utils.h" +#include "content/public/common/child_process_host.h" #include "content/public/common/content_features.h" #include "content/public/common/profiling_utils.h" #endif
diff --git a/chrome/browser/media/webrtc/desktop_media_list.h b/chrome/browser/media/webrtc/desktop_media_list.h index d7b52b0..9663606 100644 --- a/chrome/browser/media/webrtc/desktop_media_list.h +++ b/chrome/browser/media/webrtc/desktop_media_list.h
@@ -47,9 +47,6 @@ using UpdateCallback = base::OnceClosure; - // TODO(crbug.com/1136942): Add support for this flow. - static constexpr bool kConfirmationOnlyDialogSupported = false; - virtual ~DesktopMediaList() {} // Sets time interval between updates. By default list of sources and their
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.cc b/chrome/browser/optimization_guide/prediction/prediction_manager.cc index 3c0f8ca..79e3f75 100644 --- a/chrome/browser/optimization_guide/prediction/prediction_manager.cc +++ b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
@@ -47,6 +47,7 @@ #include "content/public/browser/network_service_instance.h" #include "content/public/browser/web_contents.h" #include "mojo/public/cpp/bindings/remote.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" namespace {
diff --git a/chrome/browser/page_load_metrics/observers/session_restore_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/session_restore_page_load_metrics_observer_unittest.cc index e8530e1..232572b3 100644 --- a/chrome/browser/page_load_metrics/observers/session_restore_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/session_restore_page_load_metrics_observer_unittest.cc
@@ -34,6 +34,7 @@ #include "content/public/test/navigation_simulator.h" #include "content/public/test/web_contents_tester.h" #include "services/metrics/public/cpp/ukm_builders.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "ui/base/page_transition_types.h" #include "url/gurl.h"
diff --git a/chrome/browser/password_check/android/password_check_manager_unittest.cc b/chrome/browser/password_check/android/password_check_manager_unittest.cc index 4f876e5..cc4b9b56 100644 --- a/chrome/browser/password_check/android/password_check_manager_unittest.cc +++ b/chrome/browser/password_check/android/password_check_manager_unittest.cc
@@ -143,6 +143,11 @@ form.username_value = std::u16string(username); form.password_value = std::u16string(password); form.username_element = std::u16string(username_element); + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = base::flat_map<password_manager::InsecureType, + password_manager::InsecurityMetadata>(); return form; } @@ -159,6 +164,11 @@ form.username_value = std::u16string(username); form.app_display_name = std::string(app_display_name); form.affiliated_web_realm = std::string(affiliated_web_realm); + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = base::flat_map<password_manager::InsecureType, + password_manager::InsecurityMetadata>(); return form; } @@ -265,9 +275,8 @@ TEST_F(PasswordCheckManagerTest, OnCompromisedCredentialsChanged) { // This is called on multiple events: once for saved passwords retrieval, - // once for compromised credentials retrieval and once when the saved password - // is added. - EXPECT_CALL(mock_observer(), OnCompromisedCredentialsChanged(0)).Times(3); + // and once when the saved password is added. + EXPECT_CALL(mock_observer(), OnCompromisedCredentialsChanged(0)).Times(2); InitializeManager(); store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1)); RunUntilIdle();
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc index 9bd26a6..6903c821 100644 --- a/chrome/browser/password_manager/password_store_factory.cc +++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -28,7 +28,6 @@ #include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" -#include "components/prefs/pref_service.h" #include "components/sync/driver/sync_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/network_service_instance.h" @@ -97,13 +96,6 @@ std::unique_ptr<password_manager::LoginDatabase> login_db( password_manager::CreateLoginDatabaseForProfileStorage( profile->GetPath())); -#if defined(OS_MAC) - PrefService* local_state = g_browser_process->local_state(); - DCHECK(local_state); - login_db->InitPasswordRecoveryUtil( - std::make_unique<password_manager::PasswordRecoveryUtilMac>( - local_state, base::ThreadTaskRunnerHandle::Get())); -#endif scoped_refptr<PasswordStore> ps; #if defined(OS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_ANDROID) || \
diff --git a/chrome/browser/plugins/plugin_installer.cc b/chrome/browser/plugins/plugin_installer.cc index 4f0cdcf..5f0a30f 100644 --- a/chrome/browser/plugins/plugin_installer.cc +++ b/chrome/browser/plugins/plugin_installer.cc
@@ -46,7 +46,7 @@ content::WebContents* web_contents) { web_contents->OpenURL(content::OpenURLParams( plugin_url, - content::Referrer(web_contents->GetURL(), + content::Referrer(web_contents->GetLastCommittedURL(), network::mojom::ReferrerPolicy::kDefault), WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false));
diff --git a/chrome/browser/plugins/plugin_observer.cc b/chrome/browser/plugins/plugin_observer.cc index 50b3b0d4..79fdf861 100644 --- a/chrome/browser/plugins/plugin_observer.cc +++ b/chrome/browser/plugins/plugin_observer.cc
@@ -205,7 +205,7 @@ } content::Referrer referrer = content::Referrer::SanitizeForRequest( - url, content::Referrer(web_contents()->GetURL(), + url, content::Referrer(web_contents()->GetLastCommittedURL(), network::mojom::ReferrerPolicy::kDefault)); #if BUILDFLAG(ENABLE_PLUGINS)
diff --git a/chrome/browser/policy/browser_signin_policy_handler.cc b/chrome/browser/policy/browser_signin_policy_handler.cc index 9dd43b5..278070f 100644 --- a/chrome/browser/policy/browser_signin_policy_handler.cc +++ b/chrome/browser/policy/browser_signin_policy_handler.cc
@@ -19,10 +19,11 @@ namespace policy { BrowserSigninPolicyHandler::BrowserSigninPolicyHandler(Schema chrome_schema) - : SchemaValidatingPolicyHandler( - key::kBrowserSignin, - chrome_schema.GetKnownProperty(key::kBrowserSignin), - SCHEMA_ALLOW_UNKNOWN) {} + : IntRangePolicyHandler(key::kBrowserSignin, + prefs::kForceBrowserSignin, + static_cast<int>(BrowserSigninMode::kDisabled), + static_cast<int>(BrowserSigninMode::kForced), + false /* clamp */) {} BrowserSigninPolicyHandler::~BrowserSigninPolicyHandler() {} @@ -40,47 +41,36 @@ #endif const base::Value* value = policies.GetValue(policy_name()); - if (value && value->is_int()) { - // TODO(pastarmovj): Replace this with a int range handler once the - // deprecating handler can handle it. - if (static_cast<int>(BrowserSigninMode::kDisabled) > value->GetInt() || - static_cast<int>(BrowserSigninMode::kForced) < value->GetInt()) { - SYSLOG(ERROR) << "Unexpected value for BrowserSigninMode: " - << value->GetInt(); - NOTREACHED(); - return; - } - switch (static_cast<BrowserSigninMode>(value->GetInt())) { - case BrowserSigninMode::kForced: + switch (static_cast<BrowserSigninMode>(value->GetInt())) { + case BrowserSigninMode::kForced: #if !defined(OS_LINUX) && !defined(OS_CHROMEOS) - prefs->SetValue(prefs::kForceBrowserSignin, base::Value(true)); + prefs->SetValue(prefs::kForceBrowserSignin, base::Value(true)); #endif - FALLTHROUGH; - case BrowserSigninMode::kEnabled: - prefs->SetValue( + FALLTHROUGH; + case BrowserSigninMode::kEnabled: + prefs->SetValue( #if defined(OS_ANDROID) - // The new kSigninAllowedOnNextStartup pref is only used on Desktop. - // Keep the old kSigninAllowed pref for Android until the policy is - // fully deprecated in M71 and can be removed. - prefs::kSigninAllowed, + // The new kSigninAllowedOnNextStartup pref is only used on Desktop. + // Keep the old kSigninAllowed pref for Android until the policy is + // fully deprecated in M71 and can be removed. + prefs::kSigninAllowed, #else - prefs::kSigninAllowedOnNextStartup, + prefs::kSigninAllowedOnNextStartup, #endif - base::Value(true)); - break; - case BrowserSigninMode::kDisabled: - prefs->SetValue( + base::Value(true)); + break; + case BrowserSigninMode::kDisabled: + prefs->SetValue( #if defined(OS_ANDROID) - // The new kSigninAllowedOnNextStartup pref is only used on Desktop. - // Keep the old kSigninAllowed pref for Android until the policy is - // fully deprecated in M71 and can be removed. - prefs::kSigninAllowed, + // The new kSigninAllowedOnNextStartup pref is only used on Desktop. + // Keep the old kSigninAllowed pref for Android until the policy is + // fully deprecated in M71 and can be removed. + prefs::kSigninAllowed, #else - prefs::kSigninAllowedOnNextStartup, + prefs::kSigninAllowedOnNextStartup, #endif - base::Value(false)); - break; - } + base::Value(false)); + break; } }
diff --git a/chrome/browser/policy/browser_signin_policy_handler.h b/chrome/browser/policy/browser_signin_policy_handler.h index 5677967..c223502 100644 --- a/chrome/browser/policy/browser_signin_policy_handler.h +++ b/chrome/browser/policy/browser_signin_policy_handler.h
@@ -21,7 +21,7 @@ // ConfigurationPolicyHandler for the BrowserSignin policy. This handles all // non-iOS platforms. The iOS equivalent handler is at // ios/chrome/browser/policy/browser_signin_policy_handler.h -class BrowserSigninPolicyHandler : public SchemaValidatingPolicyHandler { +class BrowserSigninPolicyHandler : public IntRangePolicyHandler { public: explicit BrowserSigninPolicyHandler(Schema chrome_schema); ~BrowserSigninPolicyHandler() override;
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 0a92105..f7e6a83d 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -616,6 +616,11 @@ const char kHintsFetcherTopHostBlocklistMinimumEngagementScore[] = "optimization_guide.hintsfetcher.top_host_blacklist_min_engagement_score"; +// Deprecated 07/2021. +#if defined(OS_MAC) +const char kPasswordRecovery[] = "password_manager.password_recovery"; +#endif + // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { @@ -780,6 +785,10 @@ registry->RegisterDoublePref( kHintsFetcherTopHostBlocklistMinimumEngagementScore, 0, PrefRegistry::LOSSY_PREF); + +#if defined(OS_MAC) + registry->RegisterTimePref(kPasswordRecovery, base::Time()); +#endif } } // namespace @@ -1452,8 +1461,8 @@ profile_prefs->ClearPref(kDataReductionProxyLastConfigRetrievalTime); profile_prefs->ClearPref(kDataReductionProxyConfig); - // Added 02/2021 #if defined(OS_ANDROID) + // Added 02/2021 feed::MigrateObsoleteProfilePrefsFeb_2021(profile_prefs); #endif // defined(OS_ANDROID) syncer::ClearObsoletePassphrasePromptPrefs(profile_prefs); @@ -1544,6 +1553,16 @@ profile_prefs->ClearPref(kHintsFetcherTopHostBlocklistMinimumEngagementScore); profile_prefs->ClearPref(kTimeHintsFetcherTopHostBlocklistLastInitialized); +#if defined(OS_ANDROID) + // Added 06/2021 + feed::MigrateObsoleteProfilePrefsJune_2021(profile_prefs); +#endif // defined(OS_ANDROID) + + // Added 07/2021 +#if defined(OS_MAC) + profile_prefs->ClearPref(kPasswordRecovery); +#endif + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS }
diff --git a/chrome/browser/profiles/profile_attributes_storage.h b/chrome/browser/profiles/profile_attributes_storage.h index 05055bf..9c4233e 100644 --- a/chrome/browser/profiles/profile_attributes_storage.h +++ b/chrome/browser/profiles/profile_attributes_storage.h
@@ -21,7 +21,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_init_params.h" -#include "chrome/browser/profiles/profile_info_cache_observer.h" +#include "chrome/browser/profiles/profile_attributes_storage_observer.h" namespace base { class SequencedTaskRunner; @@ -44,7 +44,7 @@ class ProfileAttributesStorage : public base::SupportsWeakPtr<ProfileAttributesStorage> { public: - using Observer = ProfileInfoCacheObserver; + using Observer = ProfileAttributesStorageObserver; explicit ProfileAttributesStorage(PrefService* prefs, const base::FilePath& user_data_dir);
diff --git a/chrome/browser/profiles/profile_info_cache_observer.h b/chrome/browser/profiles/profile_attributes_storage_observer.h similarity index 73% rename from chrome/browser/profiles/profile_info_cache_observer.h rename to chrome/browser/profiles/profile_attributes_storage_observer.h index 7b633ab2..6390c9a 100644 --- a/chrome/browser/profiles/profile_info_cache_observer.h +++ b/chrome/browser/profiles/profile_attributes_storage_observer.h
@@ -2,24 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_PROFILES_PROFILE_INFO_CACHE_OBSERVER_H_ -#define CHROME_BROWSER_PROFILES_PROFILE_INFO_CACHE_OBSERVER_H_ +#ifndef CHROME_BROWSER_PROFILES_PROFILE_ATTRIBUTES_STORAGE_OBSERVER_H_ +#define CHROME_BROWSER_PROFILES_PROFILE_ATTRIBUTES_STORAGE_OBSERVER_H_ #include <string> -#include "ui/gfx/image/image.h" - namespace base { class FilePath; } // This class provides an Observer interface to watch for changes to the -// ProfileInfoCache. -class ProfileInfoCacheObserver { +// ProfileAttributesStorage. +class ProfileAttributesStorageObserver { public: - ProfileInfoCacheObserver(const ProfileInfoCacheObserver&) = delete; - ProfileInfoCacheObserver& operator=(const ProfileInfoCacheObserver&) = delete; - virtual ~ProfileInfoCacheObserver() = default; + ProfileAttributesStorageObserver(const ProfileAttributesStorageObserver&) = + delete; + ProfileAttributesStorageObserver& operator=( + const ProfileAttributesStorageObserver&) = delete; + virtual ~ProfileAttributesStorageObserver() = default; // Notifies observers that a new profile at `profile_path` was added to cache. // It is guaranteed to be the first observer method that can observe a new @@ -43,15 +43,14 @@ const base::FilePath& profile_path) {} virtual void OnProfileSupervisedUserIdChanged( const base::FilePath& profile_path) {} - virtual void OnProfileIsOmittedChanged( - const base::FilePath& profile_path) {} + virtual void OnProfileIsOmittedChanged(const base::FilePath& profile_path) {} virtual void OnProfileThemeColorsChanged(const base::FilePath& profile_path) { } virtual void OnProfileHostedDomainChanged( const base::FilePath& profile_path) {} protected: - ProfileInfoCacheObserver() = default; + ProfileAttributesStorageObserver() = default; }; -#endif // CHROME_BROWSER_PROFILES_PROFILE_INFO_CACHE_OBSERVER_H_ +#endif // CHROME_BROWSER_PROFILES_PROFILE_ATTRIBUTES_STORAGE_OBSERVER_H_
diff --git a/chrome/browser/profiles/profile_info_cache_unittest.h b/chrome/browser/profiles/profile_info_cache_unittest.h index 730431c..275c4832 100644 --- a/chrome/browser/profiles/profile_info_cache_unittest.h +++ b/chrome/browser/profiles/profile_info_cache_unittest.h
@@ -8,20 +8,17 @@ #include <set> #include "chrome/browser/profiles/profile_attributes_storage.h" -#include "chrome/browser/profiles/profile_info_cache_observer.h" #include "chrome/test/base/testing_profile_manager.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" -class ProfileInfoCache; - namespace base { class FilePath; } // Class used to test that ProfileInfoCache does not try to access any // unexpected profile names. -class ProfileNameVerifierObserver : public ProfileInfoCacheObserver { +class ProfileNameVerifierObserver : public ProfileAttributesStorage::Observer { public: explicit ProfileNameVerifierObserver( TestingProfileManager* testing_profile_manager); @@ -30,7 +27,7 @@ delete; ~ProfileNameVerifierObserver() override; - // ProfileInfoCacheObserver overrides: + // ProfileAttributesStorage::Observer overrides: void OnProfileAdded(const base::FilePath& profile_path) override; void OnProfileWillBeRemoved(const base::FilePath& profile_path) override; void OnProfileWasRemoved(const base::FilePath& profile_path,
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 360018a..1c51cce 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -149,7 +149,7 @@ #include "chrome/browser/browser_process_platform_part_chromeos.h" #include "components/arc/arc_features.h" #include "components/arc/arc_prefs.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" #include "components/user_manager/user_type.h" @@ -1199,19 +1199,19 @@ const bool arc_signed_in = profile->GetPrefs()->GetBoolean(arc::prefs::kArcSignedIn); - arc::ArcSupervisionTransition transition; + arc::ArcManagementTransition transition; if (!arc_signed_in) { // No transition is necessary if user never enabled ARC. - transition = arc::ArcSupervisionTransition::NO_TRANSITION; + transition = arc::ArcManagementTransition::NO_TRANSITION; } else if (profile_is_child != user_is_child) { transition = user_is_child - ? arc::ArcSupervisionTransition::REGULAR_TO_CHILD - : arc::ArcSupervisionTransition::CHILD_TO_REGULAR; + ? arc::ArcManagementTransition::REGULAR_TO_CHILD + : arc::ArcManagementTransition::CHILD_TO_REGULAR; } else if (profile_is_managed && !arc_is_managed) { - transition = arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED; + transition = arc::ArcManagementTransition::UNMANAGED_TO_MANAGED; } else { // User state has not changed. - transition = arc::ArcSupervisionTransition::NO_TRANSITION; + transition = arc::ArcManagementTransition::NO_TRANSITION; } profile->GetPrefs()->SetInteger(arc::prefs::kArcManagementTransition,
diff --git a/chrome/browser/profiles/profile_manager_observer.h b/chrome/browser/profiles/profile_manager_observer.h index 21cdba1..d3b50e9 100644 --- a/chrome/browser/profiles/profile_manager_observer.h +++ b/chrome/browser/profiles/profile_manager_observer.h
@@ -15,10 +15,10 @@ // and registered with the ProfileManager. This is only called for normal // (on-the-record) profiles as the ProfileManager doesn't own the OTR profile. // For OTR profile creation, see - // ProfileObserver::OnOffTheRecordProfileCreated(). Unlike - // ProfileInfoCacheObserver::OnProfileAdded(), which is only called when a new - // user is first created, this is called once on every run of Chrome, provided - // that the Profile is in use. + // ProfileObserver::OnOffTheRecordProfileCreated(). + // Unlike ProfileAttributesStorage::Observer::OnProfileAdded(), which is only + // called when a new user is first created, this is called once on every run + // of Chrome, provided that the Profile is in use. virtual void OnProfileAdded(Profile* profile) {} // Called when the user deletes a profile and all associated data should be
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc index e697030..b973faa 100644 --- a/chrome/browser/profiles/profile_manager_unittest.cc +++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -71,7 +71,7 @@ #include "chrome/browser/ui/ash/wallpaper_controller_client_impl.h" #include "components/arc/arc_features.h" #include "components/arc/arc_prefs.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user_manager.h" #include "components/user_manager/user_names.h" @@ -963,7 +963,7 @@ EXPECT_EQ( profile->GetPrefs()->GetInteger(arc::prefs::kArcManagementTransition), - static_cast<int>(arc::ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(arc::ArcManagementTransition::NO_TRANSITION)); EXPECT_EQ(profile->GetPrefs()->GetString(prefs::kSupervisedUserId), supervised_users::kChildAccountSUID); } @@ -976,7 +976,7 @@ EXPECT_EQ( profile->GetPrefs()->GetInteger(arc::prefs::kArcManagementTransition), - static_cast<int>(arc::ArcSupervisionTransition::REGULAR_TO_CHILD)); + static_cast<int>(arc::ArcManagementTransition::REGULAR_TO_CHILD)); EXPECT_EQ(profile->GetPrefs()->GetString(prefs::kSupervisedUserId), supervised_users::kChildAccountSUID); } @@ -989,7 +989,7 @@ EXPECT_EQ( profile->GetPrefs()->GetInteger(arc::prefs::kArcManagementTransition), - static_cast<int>(arc::ArcSupervisionTransition::CHILD_TO_REGULAR)); + static_cast<int>(arc::ArcManagementTransition::CHILD_TO_REGULAR)); EXPECT_TRUE(profile->GetPrefs()->GetString(prefs::kSupervisedUserId).empty()); } @@ -1005,7 +1005,7 @@ EXPECT_EQ( profile->GetPrefs()->GetInteger(arc::prefs::kArcManagementTransition), - static_cast<int>(arc::ArcSupervisionTransition::UNMANAGED_TO_MANAGED)); + static_cast<int>(arc::ArcManagementTransition::UNMANAGED_TO_MANAGED)); } TEST_F(ProfileManagerTest, InitProfileForManagedUserOnFirstSignIn) { @@ -1020,7 +1020,7 @@ EXPECT_EQ( profile->GetPrefs()->GetInteger(arc::prefs::kArcManagementTransition), - static_cast<int>(arc::ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(arc::ArcManagementTransition::NO_TRANSITION)); } TEST_F(ProfileManagerTest, @@ -1032,7 +1032,7 @@ EXPECT_EQ( profile->GetPrefs()->GetInteger(arc::prefs::kArcManagementTransition), - static_cast<int>(arc::ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(arc::ArcManagementTransition::NO_TRANSITION)); EXPECT_TRUE(profile->GetPrefs()->GetString(prefs::kSupervisedUserId).empty()); }
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html index 2630a52..b8a6165 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html
@@ -6,11 +6,11 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="assistant-get-more"> <template>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html index b755fd1..d0c2e8f 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html
@@ -8,13 +8,13 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> -<link rel="import" href="/components/oobe_content_dialog.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_content_dialog.html"> <dom-module id="assistant-loading"> <template>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html index cd6067fb..468b0f9 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html
@@ -6,12 +6,12 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="assistant-related-info"> <template>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html index 938c211..cc920d7 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html
@@ -6,12 +6,12 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="assistant-third-party"> <template>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html index a23af26..da18cf2 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html
@@ -7,7 +7,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_next_button.html">
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html index ef2b0f0..a2a97fa 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html
@@ -8,13 +8,13 @@ <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/cr_elements/cr_lottie/cr_lottie.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="assistant-voice-match"> <template>
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index d4589cc..76b58ad7 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -194,12 +194,12 @@ js_library("oobe_welcome") { deps = [ "components:fake_oobe", - "components:oobe_modal_dialog", "components:oobe_select", "components/behaviors:login_screen_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_modal_dialog", ] externs_list = [ "$externs_path/tts.js" ] } @@ -213,7 +213,7 @@ "components/buttons:oobe_back_button", "components/buttons:oobe_next_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", "//ui/webui/resources/cr_elements/cr_input:cr_input", "//ui/webui/resources/js:load_time_data", ] @@ -224,7 +224,7 @@ "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_next_button", "components/buttons:oobe_text_button", - "components/oobe_dialog:oobe_dialog", + "components/dialogs:oobe_dialog", "//ui/webui/resources/cr_components/chromeos/multidevice_setup:mojo_api", "//ui/webui/resources/cr_components/chromeos/multidevice_setup:multidevice_setup", "//ui/webui/resources/js:cr", @@ -237,7 +237,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie", ] } @@ -245,14 +245,14 @@ js_library("arc_terms_of_service") { deps = [ ":web_view_helper", - "components:oobe_modal_dialog", "components:oobe_select", "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_back_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "components/oobe_loading_dialog:oobe_loading_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_loading_dialog", + "components/dialogs:oobe_modal_dialog", ] } @@ -261,7 +261,7 @@ "components/behaviors:login_screen_behavior", "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -271,7 +271,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_next_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -280,7 +280,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", "//ui/webui/resources/cr_elements/cr_fingerprint:cr_fingerprint_progress_arc", "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie", ] @@ -296,8 +296,8 @@ "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_back_button", "components/buttons:oobe_text_button", - "components/oobe_content_dialog:oobe_content_dialog", - "components/oobe_dialog:oobe_dialog", + "components/dialogs:oobe_content_dialog", + "components/dialogs:oobe_dialog", "//ui/webui/resources/js:cr", ] } @@ -315,7 +315,7 @@ "components/buttons:oobe_back_button", "components/buttons:oobe_next_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -326,8 +326,8 @@ "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_back_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "components/oobe_loading_dialog:oobe_loading_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_loading_dialog", ] } @@ -338,7 +338,7 @@ "components/buttons:oobe_back_button", "components/buttons:oobe_icon_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -355,7 +355,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -365,17 +365,17 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } js_library("oobe_reset") { deps = [ - "components:oobe_modal_dialog", "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_modal_dialog", ] } @@ -384,7 +384,7 @@ "components/behaviors:login_screen_behavior", "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", - "components/oobe_dialog:oobe_dialog", + "components/dialogs:oobe_dialog", ] } @@ -394,7 +394,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -405,8 +405,8 @@ "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_back_button", "components/buttons:oobe_next_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "components/oobe_loading_dialog:oobe_loading_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_loading_dialog", ] } @@ -416,7 +416,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_next_button", - "components/oobe_dialog:oobe_dialog", + "components/dialogs:oobe_dialog", ] } @@ -430,7 +430,7 @@ "components/buttons:oobe_back_button", "components/buttons:oobe_next_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", "//ui/webui/resources/cr_components/chromeos/quick_unlock:setup_pin_keyboard", ] } @@ -443,33 +443,33 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "components/oobe_loading_dialog:oobe_loading_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_loading_dialog", ] } js_library("user_creation") { deps = [ - "components:oobe_modal_dialog", "components/behaviors:login_screen_behavior", "components/behaviors:multi_step_behavior", "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_back_button", "components/buttons:oobe_next_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_modal_dialog", ] } js_library("saml_confirm_password") { deps = [ ":login_ui_tools", - "components:oobe_modal_dialog", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_next_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "components/oobe_loading_dialog:oobe_loading_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_loading_dialog", + "components/dialogs:oobe_modal_dialog", ] } @@ -482,7 +482,7 @@ "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_back_button", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -492,7 +492,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -502,7 +502,7 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/dialogs:oobe_adaptive_dialog", ] } @@ -511,8 +511,8 @@ "components/behaviors:oobe_dialog_host_behavior", "components/behaviors:oobe_i18n_behavior", "components/buttons:oobe_text_button", - "components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "components/oobe_loading_dialog:oobe_loading_dialog", + "components/dialogs:oobe_adaptive_dialog", + "components/dialogs:oobe_loading_dialog", ] }
diff --git a/chrome/browser/resources/chromeos/login/app_downloading.html b/chrome/browser/resources/chromeos/login/app_downloading.html index 7e82a48..976e36e 100644 --- a/chrome/browser/resources/chromeos/login/app_downloading.html +++ b/chrome/browser/resources/chromeos/login/app_downloading.html
@@ -7,13 +7,13 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/cr_elements/cr_lottie/cr_lottie.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="app-downloading-element">
diff --git a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html index f050821..0c8721b 100644 --- a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html +++ b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
@@ -10,7 +10,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -19,7 +18,9 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <link rel="stylesheet" href="chrome://resources/css/overlay.css">
diff --git a/chrome/browser/resources/chromeos/login/checking_downloading_update.html b/chrome/browser/resources/chromeos/login/checking_downloading_update.html index bea47b5e..5ee81b97 100644 --- a/chrome/browser/resources/chromeos/login/checking_downloading_update.html +++ b/chrome/browser/resources/chromeos/login/checking_downloading_update.html
@@ -8,12 +8,12 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <!-- UI for checking and downloading updates as part of the update process.
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn index 01c4612..303afc3f 100644 --- a/chrome/browser/resources/chromeos/login/components/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -11,9 +11,8 @@ deps = [ ":closure_compile_local", "buttons:closure_compile", - "oobe_adaptive_dialog:closure_compile", + "dialogs:closure_compile", "oobe_carousel:closure_compile", - "oobe_content_dialog:closure_compile", "behaviors:closure_compile", "oobe_slide:closure_compile", "progress_list_item:closure_compile", @@ -29,7 +28,6 @@ ":html-echo", ":network_select_login", ":oobe_i18n_dropdown", - ":oobe_modal_dialog", ":oobe_select", ":oobe_types", ] @@ -106,13 +104,6 @@ ] } -js_library("oobe_modal_dialog") { - deps = [ - "behaviors:oobe_i18n_behavior", - "buttons:oobe_text_button", - ] -} - js_library("oobe_select") { }
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn b/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn new file mode 100644 index 0000000..746ddfd3 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn
@@ -0,0 +1,76 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//third_party/closure_compiler/compile_js.gni") + +js_type_check("closure_compile") { + uses_legacy_modules = true + deps = [ + ":oobe_adaptive_dialog", + ":oobe_adaptive_dialog_old", + ":oobe_content_dialog", + ":oobe_content_dialog_old", + ":oobe_dialog", + ":oobe_loading_dialog", + ":oobe_modal_dialog", + ] +} + +js_library("oobe_adaptive_dialog") { + deps = [ "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render" ] + externs_list = [ "$externs_path/pending.js" ] +} + +js_library("oobe_adaptive_dialog_old") { + deps = [ + ":oobe_dialog", + "../behaviors:oobe_focus_behavior", + "../behaviors:oobe_i18n_behavior", + "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", + ] + externs_list = [ "$externs_path/pending.js" ] +} + +js_library("oobe_content_dialog") { + deps = [ + "../behaviors:oobe_focus_behavior", + "../behaviors:oobe_scrollable_behavior", + "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", + ] +} + +js_library("oobe_content_dialog_old") { + deps = [ + ":oobe_dialog", + "../behaviors:oobe_focus_behavior", + "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", + ] +} + +js_library("oobe_dialog") { + deps = [ + "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", + "../behaviors:oobe_i18n_behavior", + "../behaviors:oobe_scrollable_behavior", + ] + externs_list = [ "$externs_path/pending.js" ] +} + +js_library("oobe_loading_dialog") { + deps = [ + ":oobe_content_dialog", + "../behaviors:oobe_dialog_host_behavior", + "../behaviors:oobe_i18n_behavior", + "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie", + ] +} + +js_library("oobe_modal_dialog") { + deps = [ + "//ui/webui/resources/js:cr", + "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog", + "../behaviors:oobe_i18n_behavior", + "../buttons:oobe_text_button", + ] +}
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/README.md b/chrome/browser/resources/chromeos/login/components/dialogs/README.md new file mode 100644 index 0000000..a60d988 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/components/dialogs/README.md
@@ -0,0 +1,51 @@ +# OOBE Dialogs + +## oobe-adaptive-dialog + +### Overview + +`oobe-adaptive-dialog` implements standard dialog which is used in OOBE screens. +This folder contains two different implementations of it. *old implementation is +just a fallback to old oobe-dialog which was used before. + +### Usage + +Both implementations have similar set of slots: + +icon, title, progress (for progress bar), subtitle, content, back-navigation and +bottom-buttons. + +back-navigation is usually used for holding back button, bottom-buttons for the +rest buttons. + +It is intended to use `oobe-adaptive-dialog` along with style sheets: +`<style include="oobe-dialog-host-styles"></style>`, and add `OobeDialogHostBehavior`. + +Fonts and other styling for title, subtitle and regular text is applied +separately outside of the `oobe-adaptive-dialog` implementation. + +## oobe-content-dialog + +### Overview + +`oobe-content-dialog` implements dialog for content placing only. It has one +mode for landscape and portrait orientation. This folder contains two different +implementations of it. Old implementation is just a fallback to old oobe-dialog +which was used before. + +### Usage + +Both implementations have similar set of slots: +`content`, `back-navigation` and `bottom-buttons`. + +back-navigation is usually used for holding back button, bottom-buttons for the +rest buttons. + +It is intended to use `oobe-content-dialog` along with style sheets: +`<style include="oobe-dialog-host-styles"></style>`, and add `OobeDialogHostBehavior`. + +Most of the uses of `oobe-content-dialog` are hosting `webview` which usually +has its own title, subtitle and icon. +If there is an intention to show content without buttons it is possible to leave +button slots empty - dialog still would have proper internal sizing and place +the content properly. An example of such use is showing `throbber-notice`.
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog_old.html similarity index 95% rename from chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog_old.html index 0fb7ee76..d69192a 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.html +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog_old.html
@@ -11,7 +11,7 @@ <link rel="import" href="/components/behaviors/oobe_focus_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_dialog/oobe_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_dialog.html"> <!-- oobe-dialog wrap which is used to unify usage of oobe-adaptive-dialog during
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog_old.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog_old.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.html similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.html
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog_old.html similarity index 95% rename from chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog_old.html index 1d175de1..9d92559 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.html +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog_old.html
@@ -10,7 +10,7 @@ <link rel="import" href="/components/behaviors/oobe_focus_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_dialog/oobe_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_dialog.html"> <!-- oobe-dialog wrap which is used to unify usage of oobe-content-dialog during
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog_old.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog_old.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_dialog.html similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_dialog.html
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_dialog.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_dialog.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html similarity index 93% rename from chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html index 9ed94f1..88a0cfb 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.html +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html
@@ -8,12 +8,12 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://resources/cr_elements/cr_lottie/cr_lottie.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> -<link rel="import" href="/components/oobe_content_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_content_dialog.html"> <dom-module id="oobe-loading-dialog"> <template>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/oobe_loading_dialog.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_modal_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html similarity index 98% rename from chrome/browser/resources/chromeos/login/components/oobe_modal_dialog.html rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html index c8b12f1..939cb088 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_modal_dialog.html +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html
@@ -79,4 +79,5 @@ </div> </cr-dialog> </template> + <script src="oobe_modal_dialog.js"></script> </dom-module>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_modal_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.js similarity index 100% rename from chrome/browser/resources/chromeos/login/components/oobe_modal_dialog.js rename to chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.js
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn deleted file mode 100644 index ecd9aff5..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/BUILD.gn +++ /dev/null
@@ -1,28 +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("//third_party/closure_compiler/compile_js.gni") - -js_type_check("closure_compile") { - uses_legacy_modules = true - deps = [ - ":oobe_adaptive_dialog", - ":oobe_adaptive_dialog_old", - ] -} - -js_library("oobe_adaptive_dialog") { - deps = [ "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render" ] - externs_list = [ "$externs_path/pending.js" ] -} - -js_library("oobe_adaptive_dialog_old") { - deps = [ - "../oobe_dialog:oobe_dialog", - "../behaviors:oobe_focus_behavior", - "../behaviors:oobe_i18n_behavior", - "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", - ] - externs_list = [ "$externs_path/pending.js" ] -}
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/README.md b/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/README.md deleted file mode 100644 index dd889c2a..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_adaptive_dialog/README.md +++ /dev/null
@@ -1,23 +0,0 @@ -# oobe-adaptive-dialog - -## Overview - -`oobe-adaptive-dialog` implements standard dialog which is used in OOBE screens. -This folder contains two different implementations of it. *old implementation is -just a fallback to old oobe-dialog which was used before. - -## Usage - -Both implementations have similar set of slots: - -icon, title, progress (for progress bar), subtitle, content, back-navigation and -bottom-buttons. - -back-navigation is usually used for holding back button, bottom-buttons for the -rest buttons. - -It is intended to use `oobe-adaptive-dialog` along with style sheets: -`<style include="oobe-dialog-host-styles"></style>`, and add `OobeDialogHostBehavior`. - -Fonts and other styling for title, subtitle and regular text is applied -separately outside of the `oobe-adaptive-dialog` implementation.
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/BUILD.gn deleted file mode 100644 index 78ee50fe..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/BUILD.gn +++ /dev/null
@@ -1,29 +0,0 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/closure_compiler/compile_js.gni") - -js_type_check("closure_compile") { - uses_legacy_modules = true - deps = [ - ":oobe_content_dialog", - ":oobe_content_dialog_old", - ] -} - -js_library("oobe_content_dialog") { - deps = [ - "../behaviors:oobe_focus_behavior", - "../behaviors:oobe_scrollable_behavior", - "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", - ] -} - -js_library("oobe_content_dialog_old") { - deps = [ - "../oobe_dialog:oobe_dialog", - "../behaviors:oobe_focus_behavior", - "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", - ] -}
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/README.md b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/README.md deleted file mode 100644 index 598fb84..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/README.md +++ /dev/null
@@ -1,25 +0,0 @@ -# oobe-content-dialog - -## Overview - -`oobe-content-dialog` implements dialog for content placing only. It has one -mode for landscape and portrait orientation. This folder contains two different -implementations of it. Old implementation is just a fallback to old oobe-dialog -which was used before. - -## Usage - -Both implementations have similar set of slots: -`content`, `back-navigation` and `bottom-buttons`. - -back-navigation is usually used for holding back button, bottom-buttons for the -rest buttons. - -It is intended to use `oobe-content-dialog` along with style sheets: -`<style include="oobe-dialog-host-styles"></style>`, and add `OobeDialogHostBehavior`. - -Most of the uses of `oobe-content-dialog` are hosting `webview` which usually -has its own title, subtitle and icon. -If there is an intention to show content without buttons it is possible to leave -button slots empty - dialog still would have proper internal sizing and place -the content properly. An example of such use is showing `throbber-notice`.
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn deleted file mode 100644 index 7269d0a9..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn +++ /dev/null
@@ -1,18 +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("//third_party/closure_compiler/compile_js.gni") - -js_type_check("closure_compile") { - deps = [ ":oobe_dialog" ] -} - -js_library("oobe_dialog") { - deps = [ - "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", - "../behaviors:oobe_i18n_behavior", - "../behaviors:oobe_scrollable_behavior", - ] - externs_list = [ "$externs_path/pending.js" ] -}
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn deleted file mode 100644 index e6d92a79..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_loading_dialog/BUILD.gn +++ /dev/null
@@ -1,23 +0,0 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/closure_compiler/compile_js.gni") - -# TODO(crbug.com/118596): Reenable this on ChromeOS. This is temporarily -# removed, as it does not build, to have the 'all' target compile so it can be -# added to buildbots. -if (!is_chromeos) { - js_type_check("closure_compile") { - deps = [ ":oobe_loading_dialog" ] - } -} - -js_library("oobe_loading_dialog") { - deps = [ - "../oobe_content_dialog:oobe_content_dialog", - "../behaviors:oobe_dialog_host_behavior", - "../behaviors:oobe_i18n_behavior", - "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie", - ] -}
diff --git a/chrome/browser/resources/chromeos/login/device_disabled.html b/chrome/browser/resources/chromeos/login/device_disabled.html index fe11d034..53ba5451 100644 --- a/chrome/browser/resources/chromeos/login/device_disabled.html +++ b/chrome/browser/resources/chromeos/login/device_disabled.html
@@ -6,13 +6,13 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="device-disabled-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/enterprise_enrollment.html b/chrome/browser/resources/chromeos/login/enterprise_enrollment.html index a4552f4..be8a692 100644 --- a/chrome/browser/resources/chromeos/login/enterprise_enrollment.html +++ b/chrome/browser/resources/chromeos/login/enterprise_enrollment.html
@@ -10,7 +10,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="/components/oobe_icons.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> @@ -19,7 +18,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <dom-module id="enterprise-enrollment-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/family_link_notice.html b/chrome/browser/resources/chromeos/login/family_link_notice.html index c004c58..8290d829 100644 --- a/chrome/browser/resources/chromeos/login/family_link_notice.html +++ b/chrome/browser/resources/chromeos/login/family_link_notice.html
@@ -11,13 +11,13 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> <link rel="import" href="/components/oobe_icons.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="family-link-notice-element">
diff --git a/chrome/browser/resources/chromeos/login/fingerprint_setup.html b/chrome/browser/resources/chromeos/login/fingerprint_setup.html index 3b0eaa5..757e2ec 100644 --- a/chrome/browser/resources/chromeos/login/fingerprint_setup.html +++ b/chrome/browser/resources/chromeos/login/fingerprint_setup.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html"> <link rel="import" href="chrome://resources/cr_elements/cr_lottie/cr_lottie.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -18,6 +17,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="fingerprint-setup-element">
diff --git a/chrome/browser/resources/chromeos/login/gaia_dialog.html b/chrome/browser/resources/chromeos/login/gaia_dialog.html index 7412781..fd03ef0 100644 --- a/chrome/browser/resources/chromeos/login/gaia_dialog.html +++ b/chrome/browser/resources/chromeos/login/gaia_dialog.html
@@ -6,14 +6,14 @@ <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> -<link rel="import" href="/components/oobe_content_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_back_button.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_dialog/oobe_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_content_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_dialog.html"> <!-- Element which handles Gaia webview. Including action buttons, back button
diff --git a/chrome/browser/resources/chromeos/login/gesture_navigation.html b/chrome/browser/resources/chromeos/login/gesture_navigation.html index 1c2ee987..8cc9ad35 100644 --- a/chrome/browser/resources/chromeos/login/gesture_navigation.html +++ b/chrome/browser/resources/chromeos/login/gesture_navigation.html
@@ -8,7 +8,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> @@ -17,6 +16,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="gesture-navigation-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/managed_terms_of_service.html b/chrome/browser/resources/chromeos/login/managed_terms_of_service.html index 18778eb..6a1a6a6 100644 --- a/chrome/browser/resources/chromeos/login/managed_terms_of_service.html +++ b/chrome/browser/resources/chromeos/login/managed_terms_of_service.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -19,7 +18,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <link rel="import" href="/components/throbber_notice/throbber_notice.html"> <dom-module id="managed-terms-of-service-element">
diff --git a/chrome/browser/resources/chromeos/login/marketing_opt_in.html b/chrome/browser/resources/chromeos/login/marketing_opt_in.html index f4dc038..cd01b9a 100644 --- a/chrome/browser/resources/chromeos/login/marketing_opt_in.html +++ b/chrome/browser/resources/chromeos/login/marketing_opt_in.html
@@ -8,7 +8,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> <link rel="import" href="chrome://resources/cr_elements/cr_lottie/cr_lottie.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -18,6 +17,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="marketing-opt-in-element">
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.html b/chrome/browser/resources/chromeos/login/offline_ad_login.html index a75419b4..a999c09 100644 --- a/chrome/browser/resources/chromeos/login/offline_ad_login.html +++ b/chrome/browser/resources/chromeos/login/offline_ad_login.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -19,6 +18,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <!-- Offline UI for the AD Domain joining and User authentication.
diff --git a/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html b/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html index f367394..cbb177a1 100644 --- a/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html +++ b/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/html/action_link.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -15,6 +14,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="oobe-adb-sideloading-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp b/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp index f4c29f9..4d6f2ab 100644 --- a/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp +++ b/chrome/browser/resources/chromeos/login/oobe_components_resources.grdp
@@ -30,10 +30,12 @@ <include name="IDR_OOBE_COMPONENTS_HD_IRON_ICON_JS" file="components/hd_iron_icon.js" type="chrome_html" /> <include name="IDR_OOBE_COMPONENTS_DIALOG_HOST_STYLES_HTML" file="components/common_styles/oobe_dialog_host_styles.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_HTML" file="components/oobe_dialog/oobe_dialog.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_JS" file="components/oobe_dialog/oobe_dialog.js" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_HTML" file="components/oobe_loading_dialog/oobe_loading_dialog.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_JS" file="components/oobe_loading_dialog/oobe_loading_dialog.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_HTML" file="components/dialogs/oobe_dialog.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_DIALOG_JS" file="components/dialogs/oobe_dialog.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_HTML" file="components/dialogs/oobe_loading_dialog.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_JS" file="components/dialogs/oobe_loading_dialog.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_MODAL_DIALOG_HTML" file="components/dialogs/oobe_modal_dialog.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_MODAL_DIALOG_JS" file="components/dialogs/oobe_modal_dialog.js" type="chrome_html" /> <include name="IDR_OOBE_COMPONENTS_OOBE_CAROUSEL_HTML" file="components/oobe_carousel/oobe_carousel.html" type="chrome_html" /> <include name="IDR_OOBE_COMPONENTS_OOBE_CAROUSEL_JS" file="components/oobe_carousel/oobe_carousel.js" type="chrome_html" />
diff --git a/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html b/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html index 5f3a918..e6cd365 100644 --- a/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html +++ b/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html
@@ -7,12 +7,12 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="kiosk-enable-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_reset.html b/chrome/browser/resources/chromeos/login/oobe_reset.html index e7cb54a0..81983a3 100644 --- a/chrome/browser/resources/chromeos/login/oobe_reset.html +++ b/chrome/browser/resources/chromeos/login/oobe_reset.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -17,6 +16,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <dom-module id="oobe-reset-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_resources.grd b/chrome/browser/resources/chromeos/login/oobe_resources.grd index 57bbf207..e5e633a 100644 --- a/chrome/browser/resources/chromeos/login/oobe_resources.grd +++ b/chrome/browser/resources/chromeos/login/oobe_resources.grd
@@ -39,14 +39,14 @@ <!-- Resources that are dynamically chosen to be served in runtime --> <!-- New layout (oobe_adaptive_dialog and oobe_content_dialog) corresponds OOBE redesign which has happened in November 2020 --> - <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_HTML" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_JS" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog.js" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_HTML" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_JS" file="components/oobe_adaptive_dialog/oobe_adaptive_dialog_old.js" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_HTML" file="components/oobe_content_dialog/oobe_content_dialog.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_JS" file="components/oobe_content_dialog/oobe_content_dialog.js" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_HTML" file="components/oobe_content_dialog/oobe_content_dialog_old.html" type="chrome_html" /> - <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_JS" file="components/oobe_content_dialog/oobe_content_dialog_old.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_HTML" file="components/dialogs/oobe_adaptive_dialog.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_JS" file="components/dialogs/oobe_adaptive_dialog.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_HTML" file="components/dialogs/oobe_adaptive_dialog_old.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_ADAPTIVE_DIALOG_OLD_JS" file="components/dialogs/oobe_adaptive_dialog_old.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_HTML" file="components/dialogs/oobe_content_dialog.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_JS" file="components/dialogs/oobe_content_dialog.js" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_HTML" file="components/dialogs/oobe_content_dialog_old.html" type="chrome_html" /> + <include name="IDR_OOBE_COMPONENTS_OOBE_CONTENT_DIALOG_OLD_JS" file="components/dialogs/oobe_content_dialog_old.js" type="chrome_html" /> <!-- OOBE CSS Vars --> <include name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_OLD_CSS_HTML" file="components/oobe_vars/oobe_custom_vars_old_css.html" type="chrome_html" />
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_autolaunch.html b/chrome/browser/resources/chromeos/login/oobe_screen_autolaunch.html index 3b46c9c..090882e 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screen_autolaunch.html +++ b/chrome/browser/resources/chromeos/login/oobe_screen_autolaunch.html
@@ -2,7 +2,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -10,6 +9,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="autolaunch-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.html b/chrome/browser/resources/chromeos/login/oobe_update.html index 0a41c21..fb600849 100644 --- a/chrome/browser/resources/chromeos/login/oobe_update.html +++ b/chrome/browser/resources/chromeos/login/oobe_update.html
@@ -8,7 +8,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -19,7 +18,8 @@ <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> <link rel="import" href="/components/oobe_carousel/oobe_carousel.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <link rel="import" href="/components/oobe_slide/oobe_slide.html"> <dom-module id="oobe-update-element">
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome.html b/chrome/browser/resources/chromeos/login/oobe_welcome.html index d135721..2e03191f 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome.html +++ b/chrome/browser/resources/chromeos/login/oobe_welcome.html
@@ -10,13 +10,14 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <iron-iconset-svg name="oobe-welcome-32" size="32"> <svg>
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html index e07730b..5383a7d 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html
@@ -13,7 +13,8 @@ <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_dialog/oobe_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <link rel="import" href="/components/oobe_vars/oobe_shared_vars_css.html"> <!--
diff --git a/chrome/browser/resources/chromeos/login/parental_handoff.html b/chrome/browser/resources/chromeos/login/parental_handoff.html index c384e57..8682b6fe 100644 --- a/chrome/browser/resources/chromeos/login/parental_handoff.html +++ b/chrome/browser/resources/chromeos/login/parental_handoff.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -17,6 +16,7 @@ <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="parental-handoff-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/pin_setup.html b/chrome/browser/resources/chromeos/login/pin_setup.html index 4636c7237..e6e2676 100644 --- a/chrome/browser/resources/chromeos/login/pin_setup.html +++ b/chrome/browser/resources/chromeos/login/pin_setup.html
@@ -11,7 +11,6 @@ <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -21,6 +20,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="pin-setup-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/recommend_apps.html b/chrome/browser/resources/chromeos/login/recommend_apps.html index 8c66360..7e58a25 100644 --- a/chrome/browser/resources/chromeos/login/recommend_apps.html +++ b/chrome/browser/resources/chromeos/login/recommend_apps.html
@@ -6,13 +6,13 @@ <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <link rel="import" href="/components/throbber_notice/throbber_notice.html"> <dom-module id="recommend-apps-element">
diff --git a/chrome/browser/resources/chromeos/login/saml_confirm_password.html b/chrome/browser/resources/chromeos/login/saml_confirm_password.html index 6d17bcf..fadb8df 100644 --- a/chrome/browser/resources/chromeos/login/saml_confirm_password.html +++ b/chrome/browser/resources/chromeos/login/saml_confirm_password.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -18,7 +17,9 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <!-- SAML password confirmation UI for the Gaia flow.
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.html b/chrome/browser/resources/chromeos/login/screen_error_message.html index 309efbf1..537ef31 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.html +++ b/chrome/browser/resources/chromeos/login/screen_error_message.html
@@ -6,12 +6,12 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/buttons/oobe_back_button.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="error-message-element">
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html index 08b056f..da652945 100644 --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
@@ -8,7 +8,6 @@ <link rel="import" href="chrome://resources/html/action_link.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -17,7 +16,8 @@ <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <link rel="import" href="/components/throbber_notice/throbber_notice.html"> <dom-module id="gaia-signin-element">
diff --git a/chrome/browser/resources/chromeos/login/screen_signin_fatal_error.html b/chrome/browser/resources/chromeos/login/screen_signin_fatal_error.html index 98bc936..bf91086 100644 --- a/chrome/browser/resources/chromeos/login/screen_signin_fatal_error.html +++ b/chrome/browser/resources/chromeos/login/screen_signin_fatal_error.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/html/action_link.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -15,6 +14,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="signin-fatal-error-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screen_tpm_error.html b/chrome/browser/resources/chromeos/login/screen_tpm_error.html index d330749..12b4b37 100644 --- a/chrome/browser/resources/chromeos/login/screen_tpm_error.html +++ b/chrome/browser/resources/chromeos/login/screen_tpm_error.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -17,6 +16,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="tpm-error-message-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html b/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html index 522d85f..e7267ed 100644 --- a/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html +++ b/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html
@@ -6,7 +6,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -14,6 +13,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="wrong-hwid-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_install.html b/chrome/browser/resources/chromeos/login/screens/common/os_install.html index 1426202..d5aed0f 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/os_install.html +++ b/chrome/browser/resources/chromeos/login/screens/common/os_install.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -15,6 +14,7 @@ <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="os-install-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn index 26749a4..32de0c07 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
@@ -30,7 +30,7 @@ "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_next_button", "../../components/buttons:oobe_text_button", - "../../components/oobe_dialog:oobe_dialog", + "../../components/dialogs:oobe_dialog", ] } @@ -41,7 +41,7 @@ "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_text_button", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", ] } @@ -53,8 +53,8 @@ "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_next_button", "../../components/buttons:oobe_text_button", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "../../components/oobe_loading_dialog:oobe_loading_dialog", + "../../components/dialogs:oobe_adaptive_dialog", + "../../components/dialogs:oobe_loading_dialog", ] } @@ -62,7 +62,7 @@ deps = [ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", - "../../components/oobe_loading_dialog:oobe_loading_dialog", + "../../components/dialogs:oobe_loading_dialog", ] } @@ -73,7 +73,7 @@ "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_back_button", "../../components/buttons:oobe_next_button", - "../../components/oobe_content_dialog:oobe_content_dialog", + "../../components/dialogs:oobe_content_dialog", "//ui/webui/resources/cr_elements/cr_input:cr_input", ] } @@ -84,18 +84,18 @@ "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_text_button", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", ] } js_library("update_required_card") { deps = [ - "../../components:oobe_modal_dialog", "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_text_button", - "../../components/oobe_dialog:oobe_dialog", + "../../components/dialogs:oobe_dialog", + "../../components/dialogs:oobe_modal_dialog", ] }
diff --git a/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.html b/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.html index 48fd10a..1255082a 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.html +++ b/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.html
@@ -8,7 +8,6 @@ <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -18,7 +17,9 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <!--
diff --git a/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.html b/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.html index 8ff0bd8..892f96e9 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.html +++ b/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -17,6 +16,7 @@ <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="encryption-migration-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.html b/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.html index e614cf5..1151913d 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.html +++ b/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -16,7 +15,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <!-- Password changed UI for the Gaia flow.
diff --git a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html index 0e96e1cb..8b9f8ba 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html +++ b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html
@@ -4,9 +4,9 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <dom-module id="lacros-data-migration-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/login/management_transition.html b/chrome/browser/resources/chromeos/login/screens/login/management_transition.html index 53026ff..ad744f3 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/management_transition.html +++ b/chrome/browser/resources/chromeos/login/screens/login/management_transition.html
@@ -4,12 +4,12 @@ <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="management-transition-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/login/offline_login.html b/chrome/browser/resources/chromeos/login/screens/login/offline_login.html index f970f1e..ae17072 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/offline_login.html +++ b/chrome/browser/resources/chromeos/login/screens/login/offline_login.html
@@ -9,13 +9,13 @@ <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> -<link rel="import" href="/components/oobe_content_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_back_button.html"> <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_content_dialog.html"> <!-- Offline UI for the Login flow.
diff --git a/chrome/browser/resources/chromeos/login/screens/login/update_required_card.html b/chrome/browser/resources/chromeos/login/screens/login/update_required_card.html index 4408b67..6b97ed9 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/update_required_card.html +++ b/chrome/browser/resources/chromeos/login/screens/login/update_required_card.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/html/parse_html_subset.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -16,6 +15,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <!-- Update required card that informs user that current chromeos version does not
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn index d03ce56..7d966ca9 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
@@ -31,7 +31,7 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/oobe_loading_dialog:oobe_loading_dialog", + "../../components/dialogs:oobe_loading_dialog", ] } @@ -42,7 +42,7 @@ "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_back_button", "../../components/buttons:oobe_text_button", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", ] } @@ -54,7 +54,7 @@ "../../components/behaviors:oobe_i18n_behavior", "../../components/buttons:oobe_back_button", "../../components/buttons:oobe_text_button", - "../../components/oobe_dialog:oobe_dialog", + "../../components/dialogs:oobe_dialog", ] } @@ -63,29 +63,29 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", - "../../components/oobe_loading_dialog:oobe_loading_dialog", + "../../components/dialogs:oobe_adaptive_dialog", + "../../components/dialogs:oobe_loading_dialog", ] } js_library("hid_detection") { deps = [ - "../../components:oobe_modal_dialog", "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", + "../../components/dialogs:oobe_modal_dialog", ] } js_library("oobe_eula") { deps = [ "../..:web_view_helper", - "../../components:oobe_modal_dialog", "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", + "../../components/dialogs:oobe_modal_dialog", ] } @@ -94,7 +94,7 @@ "../../components:network_select_login", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", ] } @@ -103,6 +103,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "../../components/dialogs:oobe_adaptive_dialog", ] }
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.html b/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.html index ee418009..c1973a5 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.html
@@ -4,9 +4,9 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <dom-module id="auto-enrollment-check-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.html b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.html index 0ba0d7b..9fa0312 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.html
@@ -4,7 +4,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -13,6 +12,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="demo-preferences-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.html b/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.html index 96b0ddc..3e96431 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.html
@@ -2,7 +2,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -12,6 +11,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <link rel="import" href="/components/progress_list_item/progress_list_item.html"> <dom-module id="demo-setup-element">
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.html b/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.html index 0952b489..9d94f961 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.html
@@ -9,7 +9,6 @@ <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -17,7 +16,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <dom-module id="oobe-debugging-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.html b/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.html index 54778a5..0cc0ba8 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.html
@@ -4,13 +4,14 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <iron-iconset-svg name="oobe-hid-detection-20" size="20"> <svg>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_eula.html b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_eula.html index fa6d8ba..1ec4505 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_eula.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_eula.html
@@ -10,7 +10,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -19,6 +18,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <dom-module id="oobe-eula-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html index 3dadcce..aeb80a8 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html
@@ -4,7 +4,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> @@ -12,6 +11,7 @@ <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="oobe-network-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html index ec3d4e8..d91bfb4 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html
@@ -10,7 +10,6 @@ <link rel="import" href="chrome://oobe/custom_elements.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -18,6 +17,7 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="packaged-license-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/security_token_pin.html b/chrome/browser/resources/chromeos/login/security_token_pin.html index dbd912c..a1c0b1e 100644 --- a/chrome/browser/resources/chromeos/login/security_token_pin.html +++ b/chrome/browser/resources/chromeos/login/security_token_pin.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> <link rel="import" href="/components/behaviors/oobe_i18n_behavior.html"> @@ -15,6 +14,7 @@ <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> <dom-module id="security-token-pin"> <template>
diff --git a/chrome/browser/resources/chromeos/login/structure/components_common.html b/chrome/browser/resources/chromeos/login/structure/components_common.html index a137bb7..cbf33f8 100644 --- a/chrome/browser/resources/chromeos/login/structure/components_common.html +++ b/chrome/browser/resources/chromeos/login/structure/components_common.html
@@ -8,7 +8,6 @@ <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/hd_iron_icon.html"> -<include src="../components/oobe_modal_dialog.html"> <include src="../components/html-echo.html"> <include src="../notification_card.html"> <include src="../gaia_dialog.html">
diff --git a/chrome/browser/resources/chromeos/login/structure/components_common.js b/chrome/browser/resources/chromeos/login/structure/components_common.js index 62cf9c8..02e0a5f 100644 --- a/chrome/browser/resources/chromeos/login/structure/components_common.js +++ b/chrome/browser/resources/chromeos/login/structure/components_common.js
@@ -10,7 +10,6 @@ // This inclusion is types-only. No actual code to execute. // <include src="../components/oobe_types.js"> -// <include src="../components/oobe_modal_dialog.js"> // <include src="../components/html-echo.js"> // <include src="../notification_card.js"> // <include src="../gaia_dialog.js">
diff --git a/chrome/browser/resources/chromeos/login/sync_consent.html b/chrome/browser/resources/chromeos/login/sync_consent.html index 134d3fd..29c7c6d 100644 --- a/chrome/browser/resources/chromeos/login/sync_consent.html +++ b/chrome/browser/resources/chromeos/login/sync_consent.html
@@ -11,7 +11,6 @@ </if> <link rel="import" href="/components/hd_iron_icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> <link rel="import" href="/components/behaviors/oobe_dialog_host_behavior.html"> @@ -19,7 +18,8 @@ <link rel="import" href="/components/buttons/oobe_text_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="/components/oobe_loading_dialog/oobe_loading_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_loading_dialog.html"> <dom-module id="sync-consent-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/sync_consent.js b/chrome/browser/resources/chromeos/login/sync_consent.js index fb330f5..f23cd83 100644 --- a/chrome/browser/resources/chromeos/login/sync_consent.js +++ b/chrome/browser/resources/chromeos/login/sync_consent.js
@@ -57,10 +57,14 @@ */ optInButtonTextKey_: { type: String, + computed: 'getOptInButtonTextKey_(isMinorMode_)', } }, - EXTERNAL_API: ['setThrobberVisible'], + EXTERNAL_API: [ + 'setThrobberVisible', + 'setIsMinorMode', + ], /** Initial UI State for screen */ getOobeUIInitialState() { @@ -74,11 +78,6 @@ onBeforeShow(data) { this.setIsChildAccount(data['isChildAccount']); this.splitSettingsSyncEnabled_ = data['splitSettingsSyncEnabled']; - this.isMinorMode_ = data['isMinorMode']; - this.optInButtonTextKey_ = this.isMinorMode_ ? - 'syncConsentTurnOnSync' : - 'syncConsentAcceptAndContinue'; - this.setUIStep(this.defaultUIStep()); }, /** @@ -130,6 +129,15 @@ }, /** + * Set the minor mode flag, which controls whether we could use nudge + * techinuque on the UI. + * @param {boolean} isMinorMode + */ + setIsMinorMode(isMinorMode) { + this.isMinorMode_ = isMinorMode; + }, + + /** * Returns split settings sync version or regular version depending on if * split settings sync is enabled. * @private @@ -224,5 +232,14 @@ assert(consentDescription); return consentDescription; }, + + /** + * @param {boolean} isMinorMode + * @return {string} The text key of the accept button. + */ + getOptInButtonTextKey_(isMinorMode) { + return isMinorMode ? 'syncConsentTurnOnSync' : + 'syncConsentAcceptAndContinue'; + }, }); })();
diff --git a/chrome/browser/resources/chromeos/login/user_creation.html b/chrome/browser/resources/chromeos/login/user_creation.html index 9a363c7..077bc86 100644 --- a/chrome/browser/resources/chromeos/login/user_creation.html +++ b/chrome/browser/resources/chromeos/login/user_creation.html
@@ -10,7 +10,6 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="/components/hd_iron_icon.html"> -<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_icons.html"> <link rel="import" href="/components/behaviors/login_screen_behavior.html"> <link rel="import" href="/components/behaviors/multi_step_behavior.html"> @@ -20,6 +19,8 @@ <link rel="import" href="/components/buttons/oobe_next_button.html"> <link rel="import" href="/components/common_styles/common_styles.html"> <link rel="import" href="/components/common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="/components/dialogs/oobe_adaptive_dialog.html"> +<link rel="import" href="/components/dialogs/oobe_modal_dialog.html"> <dom-module id="user-creation-element">
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js index e502692..e849edd 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js
@@ -105,12 +105,16 @@ }, /** - * @param {string} id The input method ID. + * @param {string|undefined} id The input method ID. * @param {!LanguageHelper} languageHelper The LanguageHelper object. * @return {string} The display name of the input method. * @private */ getInputMethodDisplayName_(id, languageHelper) { + if (id === undefined) { + return ''; + } + if (id === ACCESSIBILITY_COMMON_IME_ID) { return ''; }
diff --git a/chrome/browser/resources/signin/profile_picker/BUILD.gn b/chrome/browser/resources/signin/profile_picker/BUILD.gn index 9cf0e72d..fc545fa 100644 --- a/chrome/browser/resources/signin/profile_picker/BUILD.gn +++ b/chrome/browser/resources/signin/profile_picker/BUILD.gn
@@ -83,7 +83,7 @@ out_manifest = "$target_gen_dir/$preprocess_manifest" in_files = [ "profile_picker.js", - "navigation_behavior.js", + "navigation_mixin.js", "policy_helper.js", "icons.js", "lazy_load.js", @@ -144,7 +144,7 @@ deps = [ ":ensure_lazy_loaded", ":lazy_load", - ":navigation_behavior", + ":navigation_mixin", ":policy_helper", ":profile_card", ":profile_card_menu", @@ -159,7 +159,7 @@ deps = [ ":ensure_lazy_loaded", ":manage_profiles_browser_proxy", - ":navigation_behavior", + ":navigation_mixin", ":profile_picker_app", ] } @@ -179,7 +179,7 @@ js_library("profile_picker_main_view") { deps = [ ":manage_profiles_browser_proxy", - ":navigation_behavior", + ":navigation_mixin", ":profile_card", "//third_party/polymer/v3_0/components-chromium/iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -191,7 +191,7 @@ externs_list = [ "$externs_path/metrics_private.js" ] } -js_library("navigation_behavior") { +js_library("navigation_mixin") { deps = [ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/js:assert.m", @@ -202,7 +202,7 @@ js_library("profile_picker_app") { deps = [ ":ensure_lazy_loaded", - ":navigation_behavior", + ":navigation_mixin", ":profile_picker_main_view", ":profile_switch", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
diff --git a/chrome/browser/resources/signin/profile_picker/navigation_behavior.js b/chrome/browser/resources/signin/profile_picker/navigation_mixin.js similarity index 83% rename from chrome/browser/resources/signin/profile_picker/navigation_behavior.js rename to chrome/browser/resources/signin/profile_picker/navigation_mixin.js index dfde8de..a3c338b 100644 --- a/chrome/browser/resources/signin/profile_picker/navigation_behavior.js +++ b/chrome/browser/resources/signin/profile_picker/navigation_mixin.js
@@ -3,6 +3,7 @@ // found in the LICENSE file. import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js'; +import {dedupingMixin} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {isBrowserSigninAllowed, isForceSigninEnabled, isSignInProfileCreationSupported} from './policy_helper.js'; @@ -182,27 +183,42 @@ notifyObservers(); } -/** @polymerBehavior */ -export const NavigationBehavior = { - /** @override */ - attached() { - assert(!routeObservers.has(this)); - routeObservers.add(this); - - // history state was set when page loaded, so when the element first - // attaches, call the route-change handler to initialize first. - this.onRouteChange(history.state.route, history.state.step); - }, - - /** @override */ - detached: function() { - assert(routeObservers.delete(this)); - }, - +/** + * @polymer + * @mixinFunction + */ +export const NavigationMixin = dedupingMixin(superClass => { /** - * Elements can override onRouteChange to handle route changes. - * @param {Routes} route - * @param {string} step + * @polymer + * @mixinClass */ - onRouteChange: function(route, step) {}, -}; + class NavigationMixin extends superClass { + /** @override */ + connectedCallback() { + super.connectedCallback(); + + assert(!routeObservers.has(this)); + routeObservers.add(this); + + // history state was set when page loaded, so when the element first + // attaches, call the route-change handler to initialize first. + this.onRouteChange(history.state.route, history.state.step); + } + + /** @override */ + disconnectedCallback() { + super.disconnectedCallback(); + + assert(routeObservers.delete(this)); + } + + /** + * Elements can override onRouteChange to handle route changes. + * @param {Routes} route + * @param {string} step + */ + onRouteChange(route, step) {} + } + + return NavigationMixin; +});
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/BUILD.gn b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/BUILD.gn index d8645c6e..b0b7b00 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/BUILD.gn +++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/BUILD.gn
@@ -17,7 +17,7 @@ js_library("profile_type_choice") { deps = [ "..:manage_profiles_browser_proxy", - "..:navigation_behavior", + "..:navigation_mixin", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/cr_elements/cr_button:cr_button.m", "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m", @@ -28,7 +28,7 @@ js_library("local_profile_customization") { deps = [ "..:manage_profiles_browser_proxy", - "..:navigation_behavior", + "..:navigation_mixin", "..:policy_helper", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/cr_components/customize_themes",
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js index f20b5b7b..6fde23b0 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js +++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.js
@@ -22,7 +22,7 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AutogeneratedThemeColorInfo, ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl, UserThemeChoice} from '../manage_profiles_browser_proxy.js'; -import {navigateTo, navigateToPreviousRoute, ProfileCreationSteps, Routes} from '../navigation_behavior.js'; +import {navigateTo, navigateToPreviousRoute, ProfileCreationSteps, Routes} from '../navigation_mixin.js'; import {isProfileCreationAllowed} from '../policy_helper.js'; /**
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js index 8b4b59e..17b5dc81 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js +++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.js
@@ -15,7 +15,7 @@ import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AutogeneratedThemeColorInfo, ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl} from '../manage_profiles_browser_proxy.js'; -import {navigateToPreviousRoute, navigateToStep, ProfileCreationSteps, recordPageVisited, Routes} from '../navigation_behavior.js'; +import {navigateToPreviousRoute, navigateToStep, ProfileCreationSteps, recordPageVisited, Routes} from '../navigation_mixin.js'; /** * @constructor
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker.js b/chrome/browser/resources/signin/profile_picker/profile_picker.js index 21874429..a587009 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_picker.js +++ b/chrome/browser/resources/signin/profile_picker/profile_picker.js
@@ -4,7 +4,7 @@ export {ensureLazyLoaded} from './ensure_lazy_loaded.js'; export {AutogeneratedThemeColorInfo, ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl, ProfileState} from './manage_profiles_browser_proxy.js'; -export {navigateTo, navigateToStep, NavigationBehavior, ProfileCreationSteps, Routes} from './navigation_behavior.js'; +export {navigateTo, navigateToStep, NavigationMixin, ProfileCreationSteps, Routes} from './navigation_mixin.js'; export {ProfileCardMenuElement, Statistics, StatisticsResult} from './profile_card_menu.js'; export {ProfilePickerAppElement} from './profile_picker_app.js'; export {ProfilePickerMainViewElement} from './profile_picker_main_view.js';
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker_app.js b/chrome/browser/resources/signin/profile_picker/profile_picker_app.js index 15f324fb..e616a4f 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_picker_app.js +++ b/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
@@ -15,7 +15,7 @@ import {ensureLazyLoaded} from './ensure_lazy_loaded.js'; import {AutogeneratedThemeColorInfo, ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl} from './manage_profiles_browser_proxy.js'; -import {navigateTo, NavigationBehavior, ProfileCreationSteps, Routes} from './navigation_behavior.js'; +import {navigateTo, NavigationMixin, ProfileCreationSteps, Routes} from './navigation_mixin.js'; import {isForceSigninEnabled, isProfileCreationAllowed} from './policy_helper.js'; /** @@ -24,7 +24,7 @@ * @implements {I18nBehaviorInterface} */ const ProfilePickerAppElementBase = - mixinBehaviors([I18nBehavior, NavigationBehavior], PolymerElement); + mixinBehaviors([I18nBehavior], NavigationMixin(PolymerElement)); /** @polymer */ export class ProfilePickerAppElement extends ProfilePickerAppElementBase {
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js index ce36bbc..a2fe0f37 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js +++ b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
@@ -18,7 +18,7 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl, ProfileState} from './manage_profiles_browser_proxy.js'; -import {navigateTo, NavigationBehavior, Routes} from './navigation_behavior.js'; +import {navigateTo, NavigationMixin, Routes} from './navigation_mixin.js'; import {isAskOnStartupAllowed, isGuestModeEnabled, isProfileCreationAllowed} from './policy_helper.js'; /** @@ -27,7 +27,7 @@ * @implements {WebUIListenerBehaviorInterface} */ const ProfilePickerMainViewElementBase = - mixinBehaviors([WebUIListenerBehavior, NavigationBehavior], PolymerElement); + mixinBehaviors([WebUIListenerBehavior], NavigationMixin(PolymerElement)); /** @polymer */ export class ProfilePickerMainViewElement extends
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc index e8a1f92f..374f246 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
@@ -655,6 +655,10 @@ *content_analysis_request_.mutable_client_metadata() = std::move(metadata); } +void BinaryUploadService::Request::set_content_type(const std::string& type) { + content_analysis_request_.mutable_request_data()->set_content_type(type); +} + enterprise_connectors::AnalysisConnector BinaryUploadService::Request::analysis_connector() { return content_analysis_request_.analysis_connector();
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h index 7ec8674..533282c 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
@@ -176,6 +176,7 @@ void set_digest(const std::string& digest); void clear_dlp_scan_request(); void set_client_metadata(enterprise_connectors::ClientMetadata metadata); + void set_content_type(const std::string& type); // Methods for accessing the ContentAnalysisRequest. enterprise_connectors::AnalysisConnector analysis_connector();
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request.cc b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request.cc index 4ebd478..7568132d 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request.cc
@@ -181,6 +181,7 @@ DataCallback callback, std::pair<BinaryUploadService::Result, Data> result_and_data) { set_digest(result_and_data.second.hash); + set_content_type(result_and_data.second.mime_type); if (result_and_data.first != BinaryUploadService::Result::SUCCESS) { CacheResultAndData(result_and_data.first,
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc index 7e7e58b..5311765b 100644 --- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc +++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
@@ -251,6 +251,9 @@ if (item_->GetTabUrl().is_valid()) request->set_tab_url(item_->GetTabUrl()); + if (!item_->GetMimeType().empty()) + request->set_content_type(item_->GetMimeType()); + for (const std::string& tag : analysis_settings_.tags) request->add_tag(tag);
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc index 42034422..8caf8d27 100644 --- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
@@ -342,6 +342,11 @@ .request_data() .url(), download_url_.spec()); + EXPECT_EQ(download_protection_service_.GetFakeBinaryUploadService() + ->last_request() + .request_data() + .content_type(), + "application/octet-stream"); } { @@ -1002,6 +1007,11 @@ .digest(), // Hex-encoding of 'hash' "76E00EB33811F5778A5EE557512C30D9341D4FEB07646BCE3E4DB13F9428573C"); + EXPECT_EQ(download_protection_service_.GetFakeBinaryUploadService() + ->last_request() + .request_data() + .content_type(), + "application/octet-stream"); } } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h index c2292ef..7b29ab0 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h
@@ -179,6 +179,7 @@ static void SanitizeReferrerChain(ReferrerChain* referrer_chain); explicit SafeBrowsingNavigationObserverManager(PrefService* pref_service); + ~SafeBrowsingNavigationObserverManager() override; // Adds |nav_event| to |navigation_event_list_|. Object pointed to by // |nav_event| will be no longer accessible after this function. @@ -293,8 +294,6 @@ typedef std::unordered_map<std::string, std::vector<ResolvedIPAddress>> HostToIpMap; - ~SafeBrowsingNavigationObserverManager() override; - NavigationEventList* navigation_event_list() { return &navigation_event_list_; }
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc index c0a57c8e..ecf6a6d8 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
@@ -7,43 +7,46 @@ #include <memory> #include "base/test/metrics/histogram_tester.h" -#include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h" -#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager_factory.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/test/base/browser_with_test_window_test.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/sessions/content/session_tab_helper.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/browser/web_contents.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/test_utils.h" +#include "content/public/test/web_contents_tester.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/window_open_disposition.h" namespace safe_browsing { -class SBNavigationObserverTest : public BrowserWithTestWindowTest { +class SBNavigationObserverTest : public ChromeRenderViewHostTestHarness { public: SBNavigationObserverTest() {} void SetUp() override { - BrowserWithTestWindowTest::SetUp(); - AddTab(browser(), GURL("http://foo/0")); - Profile* profile = Profile::FromBrowserContext( - browser()->tab_strip_model()->GetWebContentsAt(0)->GetBrowserContext()); + ChromeRenderViewHostTestHarness::SetUp(); + NavigateAndCommit(GURL("http://foo/0")); + + HostContentSettingsMap::RegisterProfilePrefs(pref_service_.registry()); + settings_map_ = base::MakeRefCounted<HostContentSettingsMap>( + &pref_service_, false /* is_off_the_record */, + false /* store_last_modified */, false /* restore_session*/); + navigation_observer_manager_ = - SafeBrowsingNavigationObserverManagerFactory::GetForBrowserContext( - profile); - navigation_observer_ = new SafeBrowsingNavigationObserver( - browser()->tab_strip_model()->GetWebContentsAt(0), - HostContentSettingsMapFactory::GetForProfile(profile), - navigation_observer_manager_); + std::make_unique<SafeBrowsingNavigationObserverManager>(&pref_service_); + + navigation_observer_ = + new SafeBrowsingNavigationObserver(web_contents(), settings_map_.get(), + navigation_observer_manager_.get()); } void TearDown() override { delete navigation_observer_; - BrowserWithTestWindowTest::TearDown(); + settings_map_->ShutdownOnUIThread(); + ChromeRenderViewHostTestHarness::TearDown(); } void VerifyNavigationEvent( const GURL& expected_source_url, @@ -110,7 +113,10 @@ } protected: - SafeBrowsingNavigationObserverManager* navigation_observer_manager_; + sync_preferences::TestingPrefServiceSyncable pref_service_; + scoped_refptr<HostContentSettingsMap> settings_map_; + std::unique_ptr<SafeBrowsingNavigationObserverManager> + navigation_observer_manager_; SafeBrowsingNavigationObserver* navigation_observer_; private: @@ -165,13 +171,8 @@ TEST_F(SBNavigationObserverTest, BasicNavigationAndCommit) { // Navigation in current tab. - auto* web_contents = browser()->tab_strip_model()->GetWebContentsAt(0); - browser()->OpenURL( - content::OpenURLParams(GURL("http://foo/1"), content::Referrer(), - WindowOpenDisposition::CURRENT_TAB, - ui::PAGE_TRANSITION_AUTO_BOOKMARK, false)); - CommitPendingLoad(&web_contents->GetController()); - SessionID tab_id = sessions::SessionTabHelper::IdForTab(web_contents); + NavigateAndCommit(GURL("http://foo/1"), ui::PAGE_TRANSITION_AUTO_BOOKMARK); + SessionID tab_id = sessions::SessionTabHelper::IdForTab(web_contents()); auto* nav_list = navigation_event_list(); ASSERT_EQ(1U, nav_list->NavigationEventsSize()); VerifyNavigationEvent(GURL(), // source_url @@ -188,11 +189,9 @@ TEST_F(SBNavigationObserverTest, ServerRedirect) { auto navigation = content::NavigationSimulator::CreateRendererInitiated( - GURL("http://foo/3"), - browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()); + GURL("http://foo/3"), web_contents()->GetMainFrame()); auto* nav_list = navigation_event_list(); - SessionID tab_id = sessions::SessionTabHelper::IdForTab( - browser()->tab_strip_model()->GetWebContentsAt(0)); + SessionID tab_id = sessions::SessionTabHelper::IdForTab(web_contents()); navigation->Start(); ASSERT_EQ(1U, nav_list->PendingNavigationEventsSize()); @@ -261,10 +260,8 @@ base::Time::FromDoubleT(now.ToDoubleT() + 60.0 * 60.0); // Invalid GURL url_0("http://foo/0"); GURL url_1("http://foo/1"); - content::MockNavigationHandle handle_0( - url_0, browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame()); - content::MockNavigationHandle handle_1( - url_1, browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame()); + content::MockNavigationHandle handle_0(url_0, web_contents()->GetMainFrame()); + content::MockNavigationHandle handle_1(url_1, web_contents()->GetMainFrame()); navigation_event_list()->RecordNavigationEvent( CreateNavigationEventUniquePtr(url_0, in_an_hour)); navigation_event_list()->RecordNavigationEvent( @@ -305,17 +302,16 @@ base::Time::FromDoubleT(now.ToDoubleT() - 60.0 * 3); // Stale base::Time in_an_hour = base::Time::FromDoubleT(now.ToDoubleT() + 60.0 * 60.0); // Invalid - AddTab(browser(), GURL("http://foo/1")); - AddTab(browser(), GURL("http://foo/2")); - content::WebContents* content0 = - browser()->tab_strip_model()->GetWebContentsAt(0); - content::WebContents* content1 = - browser()->tab_strip_model()->GetWebContentsAt(1); - content::WebContents* content2 = - browser()->tab_strip_model()->GetWebContentsAt(2); + content::WebContents* content0 = web_contents(); + auto content1 = CreateTestWebContents(); + content::WebContentsTester::For(content1.get()) + ->NavigateAndCommit(GURL("http://foo/1")); + auto content2 = CreateTestWebContents(); + content::WebContentsTester::For(content2.get()) + ->NavigateAndCommit(GURL("http://foo/2")); user_gesture_map()->insert(std::make_pair(content0, now)); - user_gesture_map()->insert(std::make_pair(content1, three_minutes_ago)); - user_gesture_map()->insert(std::make_pair(content2, in_an_hour)); + user_gesture_map()->insert(std::make_pair(content1.get(), three_minutes_ago)); + user_gesture_map()->insert(std::make_pair(content2.get(), in_an_hour)); ASSERT_EQ(3U, user_gesture_map()->size()); // Cleans up user_gesture_map() @@ -398,8 +394,7 @@ user_gesture_map()->clear(); ASSERT_EQ(0U, user_gesture_map()->size()); - content::WebContents* web_content = - browser()->tab_strip_model()->GetWebContentsAt(0); + content::WebContents* web_content = web_contents(); // Simulate content setting change via page info UI. navigation_observer_->OnContentSettingChanged( @@ -590,12 +585,9 @@ base::Time one_minute_ago = base::Time::FromDoubleT(now.ToDoubleT() - 60.0); base::Time two_minute_ago = base::Time::FromDoubleT(now.ToDoubleT() - 120.0); GURL url("http://foo/0"); - content::MockNavigationHandle handle_0( - url, browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame()); - content::MockNavigationHandle handle_1( - url, browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame()); - content::MockNavigationHandle handle_2( - url, browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame()); + content::MockNavigationHandle handle_0(url, web_contents()->GetMainFrame()); + content::MockNavigationHandle handle_1(url, web_contents()->GetMainFrame()); + content::MockNavigationHandle handle_2(url, web_contents()->GetMainFrame()); navigation_event_list()->RecordPendingNavigationEvent( &handle_0, CreateNavigationEventUniquePtr(url, one_minute_ago)); navigation_event_list()->RecordPendingNavigationEvent(
diff --git a/chrome/browser/sharing/sms/sms_remote_fetcher.cc b/chrome/browser/sharing/sms/sms_remote_fetcher.cc index 583e524..101dfbb 100644 --- a/chrome/browser/sharing/sms/sms_remote_fetcher.cc +++ b/chrome/browser/sharing/sms/sms_remote_fetcher.cc
@@ -5,10 +5,13 @@ #include "chrome/browser/sharing/sms/sms_remote_fetcher.h" #include "base/check.h" +#include "base/metrics/histogram_functions.h" #include "build/build_config.h" #include "chrome/browser/sharing/sharing_service_factory.h" #include "chrome/browser/sharing/sms/sms_flags.h" +#include "chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h" #include "chrome/browser/sharing/sms/sms_remote_fetcher_ui_controller.h" +#include "content/public/browser/sms_fetcher.h" #include "content/public/browser/web_contents.h" #include "url/gurl.h" #include "url/origin.h" @@ -22,20 +25,19 @@ absl::optional<std::string>, absl::optional<content::SmsFetchFailureType>)> callback) { - // TODO(crbug.com/1015645): We should have a new failure type when the feature - // is disabled or no device is available. if (!base::FeatureList::IsEnabled(kWebOTPCrossDevice)) { - std::move(callback).Run(absl::nullopt, absl::nullopt, absl::nullopt); - // kWebOTPCrossDevice will be disabled for a large number of users. There's - // no need to call any cancel callback in such case. + std::move(callback).Run(absl::nullopt, absl::nullopt, + content::SmsFetchFailureType::kCrossDeviceFailure); + + RecordWebOTPCrossDeviceFailure(WebOTPCrossDeviceFailure::kFeatureDisabled); return base::NullCallback(); } - // TODO(crbug.com/1015645): We should have a new failure type when sharing - // service is unavailable. e.g. API is called from an incognito window. if (!SharingServiceFactory::GetForBrowserContext( web_contents->GetBrowserContext())) { - std::move(callback).Run(absl::nullopt, absl::nullopt, absl::nullopt); + std::move(callback).Run(absl::nullopt, absl::nullopt, + content::SmsFetchFailureType::kCrossDeviceFailure); + RecordWebOTPCrossDeviceFailure(WebOTPCrossDeviceFailure::kNoSharingService); return base::NullCallback(); } @@ -48,7 +50,10 @@ SmsRemoteFetcherUiController::GetOrCreateFromWebContents(web_contents); return ui_controller->FetchRemoteSms(origin_list, std::move(callback)); #else - std::move(callback).Run(absl::nullopt, absl::nullopt, absl::nullopt); + std::move(callback).Run(absl::nullopt, absl::nullopt, + content::SmsFetchFailureType::kCrossDeviceFailure); + RecordWebOTPCrossDeviceFailure( + WebOTPCrossDeviceFailure::kAndroidToAndroidNotSupported); return base::NullCallback(); #endif }
diff --git a/chrome/browser/sharing/sms/sms_remote_fetcher_metrics.cc b/chrome/browser/sharing/sms/sms_remote_fetcher_metrics.cc new file mode 100644 index 0000000..b6dfa1b --- /dev/null +++ b/chrome/browser/sharing/sms/sms_remote_fetcher_metrics.cc
@@ -0,0 +1,12 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h" + +#include "base/metrics/histogram_functions.h" + +void RecordWebOTPCrossDeviceFailure(WebOTPCrossDeviceFailure failure) { + base::UmaHistogramEnumeration("Blink.Sms.Receive.CrossDeviceFailure", + failure); +}
diff --git a/chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h b/chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h new file mode 100644 index 0000000..ba66cd6 --- /dev/null +++ b/chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SHARING_SMS_SMS_REMOTE_FETCHER_METRICS_H_ +#define CHROME_BROWSER_SHARING_SMS_SMS_REMOTE_FETCHER_METRICS_H_ + +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class WebOTPCrossDeviceFailure { + kNoFailure = 0, + kFeatureDisabled = 1, + kNoRemoteDevice = 2, + kNoSharingService = 3, + kSharingMessageFailure = 4, + kAPIFailureOnAndroid = 5, + kAndroidToAndroidNotSupported = 6, + kMaxValue = kAndroidToAndroidNotSupported, +}; + +// Records why using WebOTP API on desktop failed on the sharing path. +void RecordWebOTPCrossDeviceFailure(WebOTPCrossDeviceFailure failure); + +#endif // CHROME_BROWSER_SHARING_SMS_SMS_REMOTE_FETCHER_METRICS_H_
diff --git a/chrome/browser/sharing/sms/sms_remote_fetcher_ui_controller.cc b/chrome/browser/sharing/sms/sms_remote_fetcher_ui_controller.cc index b4df3368..32491f0e 100644 --- a/chrome/browser/sharing/sms/sms_remote_fetcher_ui_controller.cc +++ b/chrome/browser/sharing/sms/sms_remote_fetcher_ui_controller.cc
@@ -12,6 +12,7 @@ #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/sharing/sharing_constants.h" #include "chrome/browser/sharing/sharing_dialog.h" +#include "chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h" #include "chrome/browser/shell_integration.h" #include "chrome/browser/ui/browser.h" #include "chrome/grit/generated_resources.h" @@ -85,9 +86,10 @@ SharingSendMessageResult result, std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) { if (result != SharingSendMessageResult::kSuccessful) { - // TODO(crbug.com/1015645): We should have a new category for remote - // failures. - std::move(callback).Run(absl::nullopt, absl::nullopt, absl::nullopt); + std::move(callback).Run(absl::nullopt, absl::nullopt, + content::SmsFetchFailureType::kCrossDeviceFailure); + RecordWebOTPCrossDeviceFailure( + WebOTPCrossDeviceFailure::kSharingMessageFailure); return; } @@ -97,6 +99,8 @@ std::move(callback).Run(absl::nullopt, absl::nullopt, static_cast<content::SmsFetchFailureType>( response->sms_fetch_response().failure_type())); + RecordWebOTPCrossDeviceFailure( + WebOTPCrossDeviceFailure::kAPIFailureOnAndroid); return; } auto origin_strings = response->sms_fetch_response().origins(); @@ -107,6 +111,7 @@ std::move(callback).Run(std::move(origin_list), response->sms_fetch_response().one_time_code(), absl::nullopt); + RecordWebOTPCrossDeviceFailure(WebOTPCrossDeviceFailure::kNoFailure); } base::OnceClosure SmsRemoteFetcherUiController::FetchRemoteSms( @@ -118,10 +123,9 @@ /*value_max=*/20); if (devices.empty()) { - // No devices available to call. - // TODO(crbug.com/1015645): We should have a new category for remote - // failures. - std::move(callback).Run(absl::nullopt, absl::nullopt, absl::nullopt); + std::move(callback).Run(absl::nullopt, absl::nullopt, + content::SmsFetchFailureType::kCrossDeviceFailure); + RecordWebOTPCrossDeviceFailure(WebOTPCrossDeviceFailure::kNoRemoteDevice); return base::NullCallback(); }
diff --git a/chrome/browser/sharing/sms/sms_remote_fetcher_unittest.cc b/chrome/browser/sharing/sms/sms_remote_fetcher_unittest.cc index ac1dac9..0b635a9 100644 --- a/chrome/browser/sharing/sms/sms_remote_fetcher_unittest.cc +++ b/chrome/browser/sharing/sms/sms_remote_fetcher_unittest.cc
@@ -6,6 +6,7 @@ #include "base/run_loop.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/sharing/fake_device_info.h" @@ -14,6 +15,7 @@ #include "chrome/browser/sharing/sharing_service.h" #include "chrome/browser/sharing/sharing_service_factory.h" #include "chrome/browser/sharing/sms/sms_flags.h" +#include "chrome/browser/sharing/sms/sms_remote_fetcher_metrics.h" #include "chrome/test/base/testing_profile.h" #include "components/sync_device_info/device_info.h" #include "content/public/browser/sms_fetcher.h" @@ -48,12 +50,8 @@ } TEST(SmsRemoteFetcherTest, NoDevicesAvailable) { - // This needs to be done before any tasks running on other threads check if a - // feature is enabled. - base::test::ScopedFeatureList flags; - flags.InitAndEnableFeature(kWebOTPCrossDevice); - content::BrowserTaskEnvironment task_environment; + base::HistogramTester histogram_tester; TestingProfile profile; content::WebContents::CreateParams create_params(&profile, nullptr); auto web_contents = content::WebContents::Create(create_params); @@ -73,19 +71,20 @@ absl::optional<std::string> result, absl::optional<content::SmsFetchFailureType> failure_type) { ASSERT_FALSE(result); + ASSERT_EQ(failure_type, + content::SmsFetchFailureType::kCrossDeviceFailure); loop.Quit(); })); loop.Run(); + histogram_tester.ExpectUniqueSample( + "Blink.Sms.Receive.CrossDeviceFailure", + static_cast<int>(WebOTPCrossDeviceFailure::kNoRemoteDevice), 1); } TEST(SmsRemoteFetcherTest, OneDevice) { - // This needs to be done before any tasks running on other threads check if a - // feature is enabled. - base::test::ScopedFeatureList flags; - flags.InitAndEnableFeature(kWebOTPCrossDevice); - content::BrowserTaskEnvironment task_environment; + base::HistogramTester histogram_tester; TestingProfile profile; content::WebContents::CreateParams create_params(&profile, nullptr); auto web_contents = content::WebContents::Create(create_params); @@ -124,14 +123,12 @@ })); loop.Run(); + histogram_tester.ExpectUniqueSample( + "Blink.Sms.Receive.CrossDeviceFailure", + static_cast<int>(WebOTPCrossDeviceFailure::kNoFailure), 1); } TEST(SmsRemoteFetcherTest, OneDeviceTimesOut) { - // This needs to be done before any tasks running on other threads check if a - // feature is enabled. - base::test::ScopedFeatureList flags; - flags.InitAndEnableFeature(kWebOTPCrossDevice); - content::BrowserTaskEnvironment task_environment; TestingProfile profile; content::WebContents::CreateParams create_params(&profile, nullptr); @@ -171,11 +168,6 @@ } TEST(SmsRemoteFetcherTest, RequestCancelled) { - // This needs to be done before any tasks running on other threads check if a - // feature is enabled. - base::test::ScopedFeatureList flags; - flags.InitAndEnableFeature(kWebOTPCrossDevice); - content::BrowserTaskEnvironment task_environment; TestingProfile profile; content::WebContents::CreateParams create_params(&profile, nullptr); @@ -217,3 +209,155 @@ loop.Run(); } + +TEST(SmsRemoteFetcherTest, FeatureDisabled) { + // This needs to be done before any tasks running on other threads check if a + // feature is enabled. + base::test::ScopedFeatureList flags; + flags.InitAndDisableFeature(kWebOTPCrossDevice); + + content::BrowserTaskEnvironment task_environment; + base::HistogramTester histogram_tester; + TestingProfile profile; + content::WebContents::CreateParams create_params(&profile, nullptr); + auto web_contents = content::WebContents::Create(create_params); + + base::RunLoop loop; + + FetchRemoteSms( + web_contents.get(), std::vector<url::Origin>{GetOriginForURL("a.com")}, + BindLambdaForTesting( + [&loop](absl::optional<std::vector<url::Origin>>, + absl::optional<std::string> result, + absl::optional<content::SmsFetchFailureType> failure_type) { + ASSERT_EQ(failure_type, + content::SmsFetchFailureType::kCrossDeviceFailure); + loop.Quit(); + })); + + loop.Run(); + histogram_tester.ExpectUniqueSample( + "Blink.Sms.Receive.CrossDeviceFailure", + static_cast<int>(WebOTPCrossDeviceFailure::kFeatureDisabled), 1); +} + +TEST(SmsRemoteFetcherTest, NoSharingService) { + content::BrowserTaskEnvironment task_environment; + base::HistogramTester histogram_tester; + TestingProfile profile; + content::WebContents::CreateParams create_params(&profile, nullptr); + auto web_contents = content::WebContents::Create(create_params); + + base::RunLoop loop; + + FetchRemoteSms( + web_contents.get(), std::vector<url::Origin>{GetOriginForURL("a.com")}, + BindLambdaForTesting( + [&loop](absl::optional<std::vector<url::Origin>>, + absl::optional<std::string> result, + absl::optional<content::SmsFetchFailureType> failure_type) { + ASSERT_EQ(failure_type, + content::SmsFetchFailureType::kCrossDeviceFailure); + loop.Quit(); + })); + + loop.Run(); + histogram_tester.ExpectUniqueSample( + "Blink.Sms.Receive.CrossDeviceFailure", + WebOTPCrossDeviceFailure::kNoSharingService, 1); +} + +TEST(SmsRemoteFetcherTest, SendSharingMessageFailure) { + content::BrowserTaskEnvironment task_environment; + base::HistogramTester histogram_tester; + TestingProfile profile; + content::WebContents::CreateParams create_params(&profile, nullptr); + auto web_contents = content::WebContents::Create(create_params); + + MockSharingService* service = CreateSharingService(&profile); + + std::vector<std::unique_ptr<syncer::DeviceInfo>> devices; + + devices.push_back(CreateFakeDeviceInfo("guid", "name")); + + EXPECT_CALL(*service, GetDeviceCandidates(_)) + .WillOnce(Return(ByMove(std::move(devices)))); + base::RunLoop loop; + + EXPECT_CALL(*service, SendMessageToDevice(_, _, _, _)) + .WillOnce(Invoke([&](const syncer::DeviceInfo& device_info, + base::TimeDelta response_timeout, + chrome_browser_sharing::SharingMessage message, + SharingMessageSender::ResponseCallback callback) { + std::move(callback).Run(SharingSendMessageResult::kAckTimeout, + std::make_unique<ResponseMessage>()); + return base::DoNothing(); + })); + + FetchRemoteSms( + web_contents.get(), std::vector<url::Origin>{GetOriginForURL("a.com")}, + BindLambdaForTesting( + [&loop](absl::optional<std::vector<url::Origin>>, + absl::optional<std::string> result, + absl::optional<content::SmsFetchFailureType> failure_type) { + ASSERT_FALSE(result); + ASSERT_EQ(failure_type, + content::SmsFetchFailureType::kCrossDeviceFailure); + loop.Quit(); + })); + + loop.Run(); + histogram_tester.ExpectUniqueSample( + "Blink.Sms.Receive.CrossDeviceFailure", + WebOTPCrossDeviceFailure::kSharingMessageFailure, 1); +} + +TEST(SmsRemoteFetcherTest, UserDecline) { + content::BrowserTaskEnvironment task_environment; + base::HistogramTester histogram_tester; + TestingProfile profile; + content::WebContents::CreateParams create_params(&profile, nullptr); + auto web_contents = content::WebContents::Create(create_params); + + MockSharingService* service = CreateSharingService(&profile); + + std::vector<std::unique_ptr<syncer::DeviceInfo>> devices; + + devices.push_back(CreateFakeDeviceInfo("guid", "name")); + + EXPECT_CALL(*service, GetDeviceCandidates(_)) + .WillOnce(Return(ByMove(std::move(devices)))); + base::RunLoop loop; + + EXPECT_CALL(*service, SendMessageToDevice(_, _, _, _)) + .WillOnce(Invoke([&](const syncer::DeviceInfo& device_info, + base::TimeDelta response_timeout, + chrome_browser_sharing::SharingMessage message, + SharingMessageSender::ResponseCallback callback) { + auto response = std::make_unique<ResponseMessage>(); + response->mutable_sms_fetch_response()->set_one_time_code("ABC"); + response->mutable_sms_fetch_response()->set_failure_type( + static_cast<chrome_browser_sharing::SmsFetchResponse::FailureType>( + content::SmsFetchFailureType::kPromptCancelled)); + std::move(callback).Run(SharingSendMessageResult::kSuccessful, + std::move(response)); + return base::DoNothing(); + })); + + FetchRemoteSms( + web_contents.get(), std::vector<url::Origin>{GetOriginForURL("a.com")}, + BindLambdaForTesting( + [&loop](absl::optional<std::vector<url::Origin>>, + absl::optional<std::string> result, + absl::optional<content::SmsFetchFailureType> failure_type) { + ASSERT_FALSE(result); + ASSERT_EQ(failure_type, + content::SmsFetchFailureType::kPromptCancelled); + loop.Quit(); + })); + + loop.Run(); + histogram_tester.ExpectUniqueSample( + "Blink.Sms.Receive.CrossDeviceFailure", + WebOTPCrossDeviceFailure::kAPIFailureOnAndroid, 1); +}
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc index 5fac1a9..4c5d8fc 100644 --- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc +++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
@@ -21,11 +21,13 @@ #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" #include "extensions/buildflags/buildflags.h" #include "google_apis/gaia/gaia_auth_util.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" #include "net/base/net_errors.h" #include "services/network/public/mojom/early_hints.mojom.h" #include "services/network/public/mojom/fetch_api.mojom-shared.h" #include "services/network/public/mojom/url_loader.mojom.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/network/public/mojom/url_response_head.mojom.h" #if defined(OS_ANDROID)
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h index 2410564..0600231f 100644 --- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h +++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h
@@ -14,7 +14,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" -#include "services/network/public/mojom/url_loader_factory.mojom-forward.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" #include <memory> #include <set>
diff --git a/chrome/browser/signin/signin_features.cc b/chrome/browser/signin/signin_features.cc index 6f68cad4..f31e4ae 100644 --- a/chrome/browser/signin/signin_features.cc +++ b/chrome/browser/signin/signin_features.cc
@@ -6,7 +6,7 @@ #if BUILDFLAG(ENABLE_DICE_SUPPORT) const base::Feature kDiceWebSigninInterceptionFeature{ - "DiceWebSigninInterception", base::FEATURE_DISABLED_BY_DEFAULT}; + "DiceWebSigninInterception", base::FEATURE_ENABLED_BY_DEFAULT}; #endif // ENABLE_DICE_SUPPORT // Enables the client-side processing of the HTTP response header
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc index fa5a236b..199306c 100644 --- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -1113,6 +1113,8 @@ const GURL recoverability_url = GetTrustedVaultRecoverabilityURL( *embedded_test_server(), kTestRecoveryMethodPublicKey); + base::HistogramTester histogram_tester; + // Mimic the key being available upon startup but recoverability degraded. const std::vector<uint8_t> trusted_vault_key = GetSecurityDomainsServer()->RotateTrustedVaultKey( @@ -1179,6 +1181,10 @@ EXPECT_FALSE(GetAvatarSyncErrorType(GetProfile(0)).has_value()); #endif // !BUILDFLAG(IS_CHROMEOS_ASH) + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/true, /*expected_bucket_count=*/1); + // TODO(crbug.com/1201659): Verify the recovery method hint added to the fake // server. } @@ -1357,6 +1363,7 @@ ShouldReportDegradedTrustedVaultRecoverability) { const std::vector<uint8_t> kTestRecoveryMethodPublicKey = syncer::SecureBoxKeyPair::GenerateRandom()->public_key().ExportToBytes(); + base::HistogramTester histogram_tester; // Mimic the key being available upon startup but recoverability degraded. const std::vector<uint8_t> trusted_vault_key = @@ -1407,6 +1414,10 @@ // The error should have disappeared. EXPECT_FALSE(GetAvatarSyncErrorType(GetProfile(0)).has_value()); + + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/true, /*expected_bucket_count=*/1); } #endif // !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/tab/web_contents_state.cc b/chrome/browser/tab/web_contents_state.cc index fac7503..03e6838 100644 --- a/chrome/browser/tab/web_contents_state.cc +++ b/chrome/browser/tab/web_contents_state.cc
@@ -28,6 +28,7 @@ #include "content/public/browser/restore_type.h" #include "content/public/browser/web_contents.h" #include "content/public/common/referrer.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" using base::android::ConvertUTF16ToJavaString; using base::android::ConvertUTF8ToJavaString;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 73e6c9d9..ba29510 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -857,10 +857,6 @@ "blocked_content/framebust_block_tab_helper.h", "blocked_content/popunder_preventer.cc", "blocked_content/popunder_preventer.h", - "bluetooth/bluetooth_chooser_desktop.cc", - "bluetooth/bluetooth_chooser_desktop.h", - "bluetooth/bluetooth_scanning_prompt_desktop.cc", - "bluetooth/bluetooth_scanning_prompt_desktop.h", "bluetooth/chrome_bluetooth_chooser_controller.cc", "bluetooth/chrome_bluetooth_chooser_controller.h", "bluetooth/chrome_extension_bluetooth_chooser.cc", @@ -1128,8 +1124,6 @@ "passwords/bubble_controllers/post_save_compromised_bubble_controller.h", "passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.cc", "passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h", - "passwords/bubble_controllers/save_update_bubble_controller.cc", - "passwords/bubble_controllers/save_update_bubble_controller.h", "passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc", "passwords/bubble_controllers/save_update_with_account_store_bubble_controller.h", "passwords/bubble_controllers/sign_in_promo_bubble_controller.cc", @@ -3795,8 +3789,6 @@ "views/desktop_capture/desktop_media_source_view.h", "views/desktop_capture/desktop_media_tab_list.cc", "views/desktop_capture/desktop_media_tab_list.h", - "views/desktop_capture/get_current_browsing_context_media_dialog.cc", - "views/desktop_capture/get_current_browsing_context_media_dialog.h", "views/device_chooser_content_view.cc", "views/device_chooser_content_view.h", "views/devtools_process_observer.cc", @@ -4152,8 +4144,6 @@ "views/passwords/password_items_view.h", "views/passwords/password_save_unsynced_credentials_locally_view.cc", "views/passwords/password_save_unsynced_credentials_locally_view.h", - "views/passwords/password_save_update_view.cc", - "views/passwords/password_save_update_view.h", "views/passwords/password_save_update_with_account_store_view.cc", "views/passwords/password_save_update_with_account_store_view.h", "views/passwords/post_save_compromised_bubble_view.cc", @@ -4349,6 +4339,8 @@ "views/tabs/tab_strip_layout_helper.cc", "views/tabs/tab_strip_layout_helper.h", "views/tabs/tab_strip_layout_types.h", + "views/tabs/tab_strip_scroll_container.cc", + "views/tabs/tab_strip_scroll_container.h", "views/tabs/tab_style_views.cc", "views/tabs/tab_style_views.h", "views/tabs/tab_width_constraints.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 0f4c8cb8..c8682bc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">ቋንቋዎች</translation> <translation id="4183868528246477015">በGoogle Lens ይፈልጉ <ph name="BEGIN_NEW" />አዲስ<ph name="END_NEW" /></translation> <translation id="4195643157523330669">በአዲስ ትር ክፈት</translation> +<translation id="4196597275619698563">ካርድ ፍጠር</translation> <translation id="4198423547019359126">ምንም የማውረጃ አካባቢዎች የሉም</translation> <translation id="4209895695669353772">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን ስምረትን ማብራት ለማግኘት</translation> <translation id="4225895483398857530">የመሣሪያ አሞሌ አቋራጭ</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">ፍለጋዎችን እና ዩአርኤልዎችን በራስ-አጠናቅቅ</translation> <translation id="7707922173985738739">የተንቀሳቃሽ ስልክ ውሂብ</translation> <translation id="7725024127233776428">እርስዎ ዕልባት ያደረጉባቸው ገጾች እዚህ ላይ ብቅ ይላሉ</translation> +<translation id="7731260005404856143">በመለያ ሲገቡ <ph name="BEGIN_LINK1" />ሌሎች የእንቅስቃሴ ዓይነቶች<ph name="END_LINK1" /> በGoogle መለያዎ ውስጥ ሊቀመጡ ይችላሉ። በማንኛውም ጊዜ ሊሰርዟቸው ይችላሉ።</translation> <translation id="7757787379047923882">ከ<ph name="DEVICE_NAME" /> የተጋራ ጽሑፍ</translation> <translation id="7761849928583394409">ቀን እና ሰዓት ይምረጡ</translation> <translation id="7762668264895820836">ኤስዲ ካርድ <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">የእርስዎን ከመስመር ውጭ ፋይሎች ይመልከቱ</translation> <translation id="8856607253650333758">መግለጫዎችን ያግኙ</translation> <translation id="8873817150012960745">ለመጀመር እዚህ መታ ያድርጉ</translation> +<translation id="8881973373982641723">በፍለጋ ሳጥኑ ውስጥ ጨምሮ ታሪክን ያጸዳል።</translation> <translation id="889338405075704026">ወደ የChrome ቅንብሮች ይሂዱ</translation> <translation id="8898822736010347272">አዲስ ስጋቶችን ለማግኘት እንዲያግዝ እና በድር ላይ ያለ ሁሉንም ሰው ለመጠበቅ የጎበኟቸው የአንዳንድ ገጾች ዩአርኤሎችን፣ የተወሰነ የስርዓት መረጃን እና አንዳንድ የገጽ ይዘትን ወደ Google ይልካል።</translation> <translation id="8909135823018751308">አጋራ…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">ጥሪዎችን ማድረግ አይቻልም</translation> <translation id="9212845824145208577">ከዚህ በታች ዝቅ ማለት አይቻልም። ገጹ ላይ ዝቅ ብለው ለመጀመር ይሞክሩ።</translation> <translation id="9219103736887031265">ምስሎች</translation> +<translation id="923957533152125119">በመለያ ሲገቡ <ph name="BEGIN_LINK1" />የፍለጋ ታሪክ<ph name="END_LINK1" /> እና <ph name="BEGIN_LINK2" />ሌሎች የእንቅስቃሴ ዓይነቶች<ph name="END_LINK2" /> በGoogle መለያዎ ውስጥ ሊቀመጡ ይችላሉ። በማንኛውም ጊዜ ሊሰርዟቸው ይችላሉ።</translation> <translation id="926205370408745186">የChrome እንቅስቃሴዎን ከዲጂታል ብቁ መሆን ያስወግዱ</translation> <translation id="927968626442779827">በGoogle Chrome ላይ ቀላል ሁነታን ይጠቀሙ</translation> <translation id="932327136139879170">መነሻ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 2e9524b3..a007833 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">اللغات</translation> <translation id="4183868528246477015">البحث باستخدام "عدسة Google" <ph name="BEGIN_NEW" />جديد<ph name="END_NEW" /></translation> <translation id="4195643157523330669">الفتح في علامة تبويب جديدة</translation> +<translation id="4196597275619698563">إنشاء بطاقة</translation> <translation id="4198423547019359126">ما من مواقع تنزيل متاحة</translation> <translation id="4209895695669353772">للحصول على محتوى مُخصَّص اقترحته Google، يُرجى تفعيل المزامنة.</translation> <translation id="4225895483398857530">اختصارات شريط الأدوات</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">الإكمال التلقائي لعناوين URL وعمليات البحث</translation> <translation id="7707922173985738739">استخدام بيانات الجوّال</translation> <translation id="7725024127233776428">يتم عرض الصفحات التي يتم وضع إشارة عليها هنا.</translation> +<translation id="7731260005404856143">قد يتم حفظ <ph name="BEGIN_LINK1" />بيانات الأنشطة الأخرى<ph name="END_LINK1" /> في حسابك على Google عند تسجيل الدخول إليه. ويمكنك حذف هذه البيانات متى شئت.</translation> <translation id="7757787379047923882">تمت مشاركة النص من <ph name="DEVICE_NAME" />.</translation> <translation id="7761849928583394409">اختيار التاريخ والوقت</translation> <translation id="7762668264895820836">بطاقة SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">الاطّلاع على ملفاتك بلا إنترنت</translation> <translation id="8856607253650333758">عرض أوصاف الصور</translation> <translation id="8873817150012960745">انقر هنا للبدء.</translation> +<translation id="8881973373982641723">محو السجلّ، بما في ذلك السجلّ الخاص بمربّع البحث</translation> <translation id="889338405075704026">الانتقال إلى إعدادات Chrome</translation> <translation id="8898822736010347272">إرسال عناوين URL الخاصّة ببعض الصفحات التي تزورها، وعدد محدود من معلومات النظام، وبعض أنواع محتوى الصفحات إلى Google، وذلك للمساعدة على اكتشاف التهديدات الجديدة وتوفير الحماية لجميع المستخدمين على الويب</translation> <translation id="8909135823018751308">مشاركة…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">لا يمكن إجراء المكالمات</translation> <translation id="9212845824145208577">لا يمكن السحب أدنى من ذلك. يمكنك بدء سحب نافذة لقطة الشاشة من موضع أدنى في الصفحة.</translation> <translation id="9219103736887031265">الصور</translation> +<translation id="923957533152125119">قد يتم حفظ <ph name="BEGIN_LINK1" />سجلّ البحث<ph name="END_LINK1" /> و<ph name="BEGIN_LINK2" />بيانات الأنشطة الأخرى<ph name="END_LINK2" /> في حسابك على Google عند تسجيل الدخول إليه. ويمكنك حذف هذه البيانات متى شئت.</translation> <translation id="926205370408745186">إزالة نشاط Chrome من الرفاهية الرقمية</translation> <translation id="927968626442779827">استخدِم "الوضع البسيط" على Google Chrome.</translation> <translation id="932327136139879170">الصفحة الرئيسية</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index db0dd1a..4a0369a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Dillər</translation> <translation id="4183868528246477015">Google Linza ilə axtarın <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Yeni tabda açın</translation> +<translation id="4196597275619698563">Kart yaradın</translation> <translation id="4198423547019359126">Əlçatan endirmə məkanı yoxdur</translation> <translation id="4209895695669353772">Google tərəfindən təklif olunan fərdiləşdirilmiş kontenti əldə etmək üçün sinxronizasiyanı aktiv edin</translation> <translation id="4225895483398857530">Alətlər paneli qısayolu</translation> @@ -1044,6 +1045,7 @@ <translation id="7704317875155739195">Axtarış və linkləri avtomatik tamamlayın</translation> <translation id="7707922173985738739">Mobil data istifadə edin</translation> <translation id="7725024127233776428">Seçdiyiniz səhifələr burada görünəcək</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Digər fəaliyyət formaları<ph name="END_LINK1" /> daxil olduğunuz zaman Google Hesabınızda saxlanıla bilər. Onları istənilən vaxt silə bilərsiniz.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> cihazından paylaşılan mətn</translation> <translation id="7761849928583394409">Tarix və vaxt seçin</translation> <translation id="7762668264895820836">SD Kart <ph name="SD_CARD_NUMBER" /></translation> @@ -1234,6 +1236,7 @@ <translation id="8854223127042600341">Oflayn fayllarınıza baxın</translation> <translation id="8856607253650333758">Təsvirləri əldə edin</translation> <translation id="8873817150012960745">Başlamaq üçün bura toxunun</translation> +<translation id="8881973373982641723">Axtarış bölməsindəki daxil olmaqla, tarixçəni silir.</translation> <translation id="889338405075704026">Chrome ayarlarına keçin</translation> <translation id="8898822736010347272">Yeni təhlükələri aşkarlamaq və vebdə hər kəsi qorumağa yardım etmək üçün daxil olduğunuz bəzi səhifələrin URL'lərini, məhdud sistem məlumatlarını və bəzi səhifə məzmunlarını Google'a göndərin.</translation> <translation id="8909135823018751308">Paylaşın...</translation> @@ -1287,6 +1290,7 @@ <translation id="9209888181064652401">Zəng etmək mümkün deyil</translation> <translation id="9212845824145208577">Aşağıya keçmək olmur. Səhifənin aşağısından başlamağı sınayın.</translation> <translation id="9219103736887031265">Şəkillər</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Axtarış tarixçəsi<ph name="END_LINK1" /> və <ph name="BEGIN_LINK2" />digər fəaliyyət formaları<ph name="END_LINK2" /> daxil olduğunuz zaman Google Hesabınızda saxlanıla bilər. Onları istənilən vaxt silə bilərsiniz.</translation> <translation id="926205370408745186">Digital Sağlamlıqdan Chrome fəaliyyətini silin</translation> <translation id="927968626442779827">Google Chrome'da Lite rejimindən istifadə edin</translation> <translation id="932327136139879170">Ev</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index ba18a69..b2d6bac8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Мовы</translation> <translation id="4183868528246477015">Пошук праз Google Аб'ектыў <ph name="BEGIN_NEW" />Новае<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Адкрыць у новай укладцы</translation> +<translation id="4196597275619698563">Стварыць картку</translation> <translation id="4198423547019359126">Няма месца для спампоўкі</translation> <translation id="4209895695669353772">Каб атрымліваць прапановы персаналізаванага змесціва ад Google, уключыце сінхранізацыю</translation> <translation id="4225895483398857530">Кнопка-ярлык на панэлі інструментаў</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Аўтаматычна дапісваць пошукавыя запыты і URL-адрасы</translation> <translation id="7707922173985738739">Выкарыстоўваць мабільную перадачу даных</translation> <translation id="7725024127233776428">Тут будуць паказвацца старонкі, якія вы дадалі ў закладкі</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Іншыя дзеянні<ph name="END_LINK1" /> могуць захоўвацца ва Уліковым запісе Google, у які вы ўвайшлі. Гэтыя даныя можна ў любы час выдаліць.</translation> <translation id="7757787379047923882">Тэкст абагулены з прылады "<ph name="DEVICE_NAME" />"</translation> <translation id="7761849928583394409">Выберыце дату і час</translation> <translation id="7762668264895820836">SD-карта <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Праглядзіце файлы, даступныя па-за сеткай</translation> <translation id="8856607253650333758">Атрымліваць апісанні</translation> <translation id="8873817150012960745">Каб пачаць, націсніце тут</translation> +<translation id="8881973373982641723">Будзе выдалена гісторыя, у тым ліку даныя, якія ўводзіліся ў полі пошуку.</translation> <translation id="889338405075704026">Перайсці ў налады Chrome</translation> <translation id="8898822736010347272">Адпраўляе URL-адрасы некаторых наведаных вамі старонак, пэўную сістэмную інфармацыю і фрагменты змесціва старонак у сэрвісы Google, каб дапамагаць выяўляць новыя кіберпагрозы і абараняць усіх у інтэрнэце.</translation> <translation id="8909135823018751308">Абагуліць…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Нельга рабіць выклікі</translation> <translation id="9212845824145208577">Не ўдаецца перамясціцца ніжэй. Паспрабуйце пачаць з месца, якое б знаходзілася ніжэй на старонцы.</translation> <translation id="9219103736887031265">Відарысы</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Гісторыя пошуку<ph name="END_LINK1" /> і <ph name="BEGIN_LINK2" />іншыя дзеянні<ph name="END_LINK2" /> могуць захоўвацца ва Уліковым запісе Google, у які вы ўвайшлі. Гэтыя даныя можна ў любы час выдаліць.</translation> <translation id="926205370408745186">Выдаліць дзеянні ў Chrome са службы лічбавага камфорту</translation> <translation id="927968626442779827">Выкарыстоўвайце Google Chrome, уключыўшы спрошчаны рэжым</translation> <translation id="932327136139879170">Галоўная старонка</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index c4a87b1..9b673e38 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Езици</translation> <translation id="4183868528246477015">Търсене с Google Обектив <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Отваряне в нов раздел</translation> +<translation id="4196597275619698563">Създаване на карта</translation> <translation id="4198423547019359126">Няма местоположения за изтегляне</translation> <translation id="4209895695669353772">Включете синхронизирането, за да получавате персонализирано съдържание, предлагано от Google</translation> <translation id="4225895483398857530">Пряк път в лентата с инструменти</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Автоматично довършване на заявки за търсене и URL адреси</translation> <translation id="7707922173985738739">Използване на мобилни данни</translation> <translation id="7725024127233776428">Запазените от вас отметки към страници се показват тук</translation> +<translation id="7731260005404856143">Възможно е <ph name="BEGIN_LINK1" />други видове активност<ph name="END_LINK1" /> да се запазват в профила ви в Google, когато сте влезли в него. Можете да изтриете съответните данни по всяко време.</translation> <translation id="7757787379047923882">Текст, споделен от <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Избиране на дата и час</translation> <translation id="7762668264895820836">SD карта <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Преглед на офлайн файловете ви</translation> <translation id="8856607253650333758">Получаване на описания</translation> <translation id="8873817150012960745">Докоснете тук, за да започнете</translation> +<translation id="8881973373982641723">Изчиства историята, включително в полето за търсене.</translation> <translation id="889338405075704026">Към настройките за Chrome</translation> <translation id="8898822736010347272">Изпраща до Google URL адресите на някои от посетените от вас страници, ограничена системна информация и част от съдържанието на страниците, за да помага за откриването на нови заплахи и да защитава всички потребители на мрежата.</translation> <translation id="8909135823018751308">Споделяне…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Не могат да се извършват обаждания</translation> <translation id="9212845824145208577">Придвижването по-надолу не е възможно. Започнете от по-долна част на страницата.</translation> <translation id="9219103736887031265">Изображения</translation> +<translation id="923957533152125119">Възможно е <ph name="BEGIN_LINK1" />историята на търсенията<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />други видове активност<ph name="END_LINK2" /> да се запазват в профила ви в Google, когато сте влезли в него. Можете да изтриете съответните данни по всяко време.</translation> <translation id="926205370408745186">Премахване на активността ви в Chrome от „Дигитално благополучие“</translation> <translation id="927968626442779827">Използване на олекотения режим в Google Chrome</translation> <translation id="932327136139879170">Начална страница</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 38b47a5..c842153 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -488,7 +488,7 @@ <translation id="4181841719683918333">Jezici</translation> <translation id="4183868528246477015">Pretraživanje uz Google Objektiv <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Otvori u novoj kartici</translation> -<translation id="4196597275619698563">Izradi karticu</translation> +<translation id="4196597275619698563">Kreiraj karticu</translation> <translation id="4198423547019359126">Nema dostupnih lokacija za preuzimanje</translation> <translation id="4209895695669353772">Uključite sinhronizaciju da dobijete prilagođeni sadržaj koji predlaže Google</translation> <translation id="4225895483398857530">Prečica za alatnu traku</translation> @@ -1047,7 +1047,7 @@ <translation id="7704317875155739195">Automatsko dovršavanje pretraživanja i URL-ova</translation> <translation id="7707922173985738739">Koristi prijenos podataka na mobilnoj mreži</translation> <translation id="7725024127233776428">Stranice koje označite će se pojaviti ovdje</translation> -<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Ostali oblici aktivnosti<ph name="END_LINK1" /> mogu se spremati na vaš Google račun kad ste prijavljeni. Možete ih izbrisati kad god želite.</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Ostali oblici aktivnosti<ph name="END_LINK1" /> se mogu pohranjivati na vaš Google račun kada ste prijavljeni. Možete ih izbrisati bilo kada.</translation> <translation id="7757787379047923882">Tekst je podijeljen s uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Odaberite datum i vrijeme</translation> <translation id="7762668264895820836">SD kartica <ph name="SD_CARD_NUMBER" /></translation> @@ -1238,7 +1238,7 @@ <translation id="8854223127042600341">Pregledajte fajlove van mreže</translation> <translation id="8856607253650333758">Preuzmi opise</translation> <translation id="8873817150012960745">Dodirnite ovdje da započnete</translation> -<translation id="8881973373982641723">Briše povijest, uključujući u okviru za pretraživanje.</translation> +<translation id="8881973373982641723">Briše historiju, uključujući onu u okviru za pretraživanje.</translation> <translation id="889338405075704026">Idi u postavke Chromea</translation> <translation id="8898822736010347272">Šalje Googleu URL-ove nekih stranica koje posjetite, ograničene informacije sistema i sadržaj nekih stranica radi lakšeg otkrivanja novih prijetnji te zaštite svakoga na webu.</translation> <translation id="8909135823018751308">Dijeljenje…</translation> @@ -1292,7 +1292,7 @@ <translation id="9209888181064652401">Upućivanje poziva nije moguće</translation> <translation id="9212845824145208577">Nije moguće pomjeriti niže. Pokušajte započeti na nižem mjestu na stranici.</translation> <translation id="9219103736887031265">Slike</translation> -<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Povijest pretraživanja<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />drugi oblici aktivnosti<ph name="END_LINK2" /> mogu se spremati na vaš Google račun kad ste prijavljeni. Možete ih izbrisati kad god želite.</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Historija pretraživanja<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />ostali oblici aktivnosti<ph name="END_LINK2" /> se mogu pohranjivati na vaš Google račun kada ste prijavljeni. Možete ih izbrisati bilo kada.</translation> <translation id="926205370408745186">Uklonite aktivnosti Chromea iz Digitalnog blagostanja</translation> <translation id="927968626442779827">Koristite Jednostavni način rada na Google Chromeu</translation> <translation id="932327136139879170">Dom</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index cbd43dac..2968bf9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Idiomes</translation> <translation id="4183868528246477015">Cerca amb Google Lens <ph name="BEGIN_NEW" />Novetat<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Obre en una pestanya nova</translation> +<translation id="4196597275619698563">Crea una targeta</translation> <translation id="4198423547019359126">No hi ha cap ubicació de baixada disponible</translation> <translation id="4209895695669353772">Perquè Google et suggereixi contingut personalitzat, activa la sincronització</translation> <translation id="4225895483398857530">Drecera de la barra d'eines</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Completa automàticament les cerques i els URL</translation> <translation id="7707922173985738739">Utilitza dades mòbils</translation> <translation id="7725024127233776428">Les pàgines que afegeixis a les adreces d'interès es mostraran aquí</translation> +<translation id="7731260005404856143">És possible que es desin <ph name="BEGIN_LINK1" />altres tipus d'activitats<ph name="END_LINK1" /> al teu Compte de Google quan tinguis la sessió iniciada. Els pots suprimir en qualsevol moment.</translation> <translation id="7757787379047923882">Text compartit des del dispositiu <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Tria la data i l'hora</translation> <translation id="7762668264895820836">Targeta SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Consulta els fitxers sense connexió</translation> <translation id="8856607253650333758">Obtén les descripcions</translation> <translation id="8873817150012960745">Toca aquí per començar</translation> +<translation id="8881973373982641723">Esborra l'historial, inclòs el del quadre de cerca.</translation> <translation id="889338405075704026">Ves a la configuració de Chrome</translation> <translation id="8898822736010347272">Envia a Google els URL d'algunes pàgines que visites, informació limitada del sistema i part del contingut de les pàgines per ajudar a detectar amenaces noves i protegir tothom al web.</translation> <translation id="8909135823018751308">Comparteix...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">No es poden fer trucades</translation> <translation id="9212845824145208577">No es pot baixar més. Prova de començar des de més avall a la pàgina.</translation> <translation id="9219103736887031265">Imatges</translation> +<translation id="923957533152125119">És possible que l'<ph name="BEGIN_LINK1" />historial de cerques<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />altres tipus d'activitats<ph name="END_LINK2" /> es desin al teu Compte de Google quan tinguis la sessió iniciada. Els pots suprimir en qualsevol moment.</translation> <translation id="926205370408745186">Suprimeix l'activitat de Chrome de l'aplicació Benestar digital</translation> <translation id="927968626442779827">Utilitza el mode bàsic a Google Chrome</translation> <translation id="932327136139879170">Inici</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 752ec2f4..a61cd24 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Jazyky</translation> <translation id="4183868528246477015">Hledat pomocí Google Lens <ph name="BEGIN_NEW" />Nové<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Otevřít na nové kartě</translation> +<translation id="4196597275619698563">Vytvořit kartu</translation> <translation id="4198423547019359126">Nejsou k dispozici žádná umístění stažených souborů</translation> <translation id="4209895695669353772">Chcete-li od Googlu získat personalizované návrhy obsahu, zapněte synchronizaci</translation> <translation id="4225895483398857530">Zkratka lišty</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Automaticky doplňovat vyhledávací dotazy a adresy URL</translation> <translation id="7707922173985738739">Používat mobilní data</translation> <translation id="7725024127233776428">Zde se zobrazují stránky přidané do záložek</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Další typy aktivity<ph name="END_LINK1" /> se mohou ukládat do vašeho účtu Google, když jste přihlášeni. Můžete je kdykoliv smazat.</translation> <translation id="7757787379047923882">Text sdílený ze zařízení <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Vybrat datum a čas</translation> <translation id="7762668264895820836">SD karta <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Zobrazte si soubory offline</translation> <translation id="8856607253650333758">Zobrazovat popisy</translation> <translation id="8873817150012960745">Začnete klepnutím sem</translation> +<translation id="8881973373982641723">Vymaže historii, včetně vyhledávacího pole.</translation> <translation id="889338405075704026">Přejít do nastavení Chromu</translation> <translation id="8898822736010347272">Odesílá adresy URL některých navštívených stránek, omezené informace o systému a část obsahu stránek do Googlu a pomáhá tak objevovat nové hrozby a chránit všechny uživatele internetu.</translation> <translation id="8909135823018751308">Sdílet…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nelze uskutečňovat hovory</translation> <translation id="9212845824145208577">Níže už přejít nelze. Zkuste začít níže na stránce.</translation> <translation id="9219103736887031265">Obrázky</translation> +<translation id="923957533152125119">Když jste přihlášeni, mohou se <ph name="BEGIN_LINK1" />historie vyhledávání<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />další typy aktivity<ph name="END_LINK2" /> ukládat do vašeho účtu Google. Můžete je kdykoliv smazat.</translation> <translation id="926205370408745186">Odstranit vaši aktivitu v Chromu z digitální rovnováhy</translation> <translation id="927968626442779827">Používejte v prohlížeči Google Chrome zjednodušený režim</translation> <translation id="932327136139879170">Domovská stránka</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 1852651a7..f815ab2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Sprog</translation> <translation id="4183868528246477015">Søg med Google Lens <ph name="BEGIN_NEW" />Nyhed<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Åbn på ny fane</translation> +<translation id="4196597275619698563">Opret kort</translation> <translation id="4198423547019359126">Der er ingen tilgængelige downloadplaceringer</translation> <translation id="4209895695669353772">Aktivér synkronisering for at hente brugertilpasset indhold, som er foreslået af Google</translation> <translation id="4225895483398857530">Genvej til værktøjslinje</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autofuldfør søgninger og webadresser</translation> <translation id="7707922173985738739">Brug mobildata</translation> <translation id="7725024127233776428">De sider, du føjer et bogmærke til, vises her</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Andre former for aktivitet<ph name="END_LINK1" /> gemmes muligvis på din Google-konto, når du er logget ind. Du kan til enhver tid slette dem.</translation> <translation id="7757787379047923882">Tekst, der deles fra <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Vælg dato og tidspunkt</translation> <translation id="7762668264895820836">SD-kort <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Se dine offlinefiler</translation> <translation id="8856607253650333758">Få beskrivelser</translation> <translation id="8873817150012960745">Tryk her for at komme i gang</translation> +<translation id="8881973373982641723">Rydder historikken, herunder fra søgefeltet.</translation> <translation id="889338405075704026">Gå til Chrome-indstillinger</translation> <translation id="8898822736010347272">Sender webadresser på visse sider, du besøger, begrænsede systemoplysninger og indhold fra visse sider til Google med henblik på at opdage nye trusler og beskytte brugerne på nettet.</translation> <translation id="8909135823018751308">Del…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Det er ikke muligt at foretage opkald</translation> <translation id="9212845824145208577">Du kan ikke komme længere ned. Prøv at starte længere nede på siden.</translation> <translation id="9219103736887031265">Billeder</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Søgehistorik<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />andre former for aktivitet<ph name="END_LINK2" /> gemmes muligvis på din Google-konto, når du er logget ind. Du kan til enhver tid slette dem.</translation> <translation id="926205370408745186">Fjern din Chrome-aktivitet fra Digital balance</translation> <translation id="927968626442779827">Brug Lite-tilstand i Google Chrome</translation> <translation id="932327136139879170">Start</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index 386e7ed..fbdc28a0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Sprachen</translation> <translation id="4183868528246477015">Mit Google Lens suchen <ph name="BEGIN_NEW" />Neu<ph name="END_NEW" /></translation> <translation id="4195643157523330669">In neuem Tab öffnen</translation> +<translation id="4196597275619698563">Karte erstellen</translation> <translation id="4198423547019359126">Keine verfügbaren Speicherorte für Downloads</translation> <translation id="4209895695669353772">Aktivieren Sie die Synchronisierung, um personalisierte, von Google vorgeschlagene Inhalte zu erhalten</translation> <translation id="4225895483398857530">Tastenkürzel in Symbolleiste</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Suchanfragen und URLs automatisch vervollständigen</translation> <translation id="7707922173985738739">Mobile Daten verwenden</translation> <translation id="7725024127233776428">Seiten, die Sie als Lesezeichen speichern, werden hier angezeigt.</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Andere Arten von Aktivitäten<ph name="END_LINK1" /> können in Ihrem Google-Konto gespeichert werden, wenn Sie angemeldet sind. Diese Daten lassen sich jederzeit löschen.</translation> <translation id="7757787379047923882">Text geteilt von <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Datum & Zeit auswählen</translation> <translation id="7762668264895820836">SD-Karte <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Offlinedateien ansehen</translation> <translation id="8856607253650333758">Beschreibungen erhalten</translation> <translation id="8873817150012960745">Zum Starten hier tippen</translation> +<translation id="8881973373982641723">Löscht den Verlauf, auch im Suchfeld.</translation> <translation id="889338405075704026">Zu den Chrome-Einstellungen</translation> <translation id="8898822736010347272">URLs einiger von Ihnen besuchter Seiten, eingeschränkte Systemdaten und manche Seiteninhalte werden an Google gesendet, um die Erkennung neuer Bedrohungen zu verbessern und Nutzer im Internet zu schützen.</translation> <translation id="8909135823018751308">Teilen...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Anrufe nicht möglich</translation> <translation id="9212845824145208577">Screenshot kann nicht nach unten erweitert werden. Beginnen Sie weiter unten auf der Seite.</translation> <translation id="9219103736887031265">Bilder</translation> +<translation id="923957533152125119">Der <ph name="BEGIN_LINK1" />Suchverlauf<ph name="END_LINK1" /> und <ph name="BEGIN_LINK2" />andere Arten von Aktivitäten<ph name="END_LINK2" /> können in Ihrem Google-Konto gespeichert werden, wenn Sie angemeldet sind. Diese Daten lassen sich jederzeit löschen.</translation> <translation id="926205370408745186">Chrome-Aktivitäten aus Digital Wellbeing entfernen</translation> <translation id="927968626442779827">Verwenden Sie den Lite-Modus in Google Chrome</translation> <translation id="932327136139879170">Startseite</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index c3626a2f..1b96c3d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Γλώσσες</translation> <translation id="4183868528246477015">Αναζήτηση με Google Lens <ph name="BEGIN_NEW" />Νέο<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Άνοιγμα σε νέα καρτέλα</translation> +<translation id="4196597275619698563">Δημιουργία κάρτας</translation> <translation id="4198423547019359126">Δεν υπάρχουν διαθέσιμες τοποθεσίες λήψης</translation> <translation id="4209895695669353772">Για λήψη εξατομικευμένου περιεχομένου που προτείνεται από την Google, ενεργοποιήστε τον συγχρονισμό</translation> <translation id="4225895483398857530">Συντόμευση γραμμής εργαλείων</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Αυτόματη συμπλήρωση αναζητήσεων και URL</translation> <translation id="7707922173985738739">Χρήση δεδομένων κινητής τηλεφωνίας</translation> <translation id="7725024127233776428">Εδώ εμφανίζονται οι σελίδες στις οποίες προσθέτετε σελιδοδείκτη</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Άλλες μορφές δραστηριότητας<ph name="END_LINK1" /> ενδέχεται να αποθηκεύονται στον Λογαριασμό σας Google όταν είστε συνδεδεμένοι. Μπορείτε να διαγράψετε αυτά τα δεδομένα ανά πάσα στιγμή.</translation> <translation id="7757787379047923882">Το κείμενο κοινοποιήθηκε από τη συσκευή <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Επιλογή ημερομηνίας και ώρας</translation> <translation id="7762668264895820836">Κάρτα SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Δείτε τα αρχεία εκτός σύνδεσης</translation> <translation id="8856607253650333758">Λήψη περιγραφών</translation> <translation id="8873817150012960745">Πατήστε εδώ για να ξεκινήσετε</translation> +<translation id="8881973373982641723">Διαγράφει το ιστορικό, συμπεριλαμβανομένου του πλαισίου αναζήτησης.</translation> <translation id="889338405075704026">Μεταβείτε στις ρυθμίσεις του Chrome</translation> <translation id="8898822736010347272">Στέλνει URL από ορισμένες σελίδες που επισκέπτεστε, περιορισμένες πληροφορίες συστήματος και ορισμένο περιεχόμενο σελίδας στην Google, για να συμβάλλει στην ανακάλυψη νέων απειλών και την προστασία όλων των χρηστών στον ιστό.</translation> <translation id="8909135823018751308">Κοινοποίηση…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Δεν είναι δυνατή η πραγματοποίηση κλήσεων</translation> <translation id="9212845824145208577">Δεν είναι δυνατή η μετάβαση χαμηλότερα. Δοκιμάστε να ξεκινήσετε από ακόμη πιο χαμηλά στη σελίδα.</translation> <translation id="9219103736887031265">Εικόνες</translation> +<translation id="923957533152125119">Το <ph name="BEGIN_LINK1" />ιστορικό αναζήτησης<ph name="END_LINK1" /> και <ph name="BEGIN_LINK2" />άλλες μορφές δραστηριότητας<ph name="END_LINK2" /> ενδέχεται να αποθηκεύονται στον Λογαριασμό σας Google όταν είστε συνδεδεμένοι. Μπορείτε να διαγράψετε αυτά τα δεδομένα ανά πάσα στιγμή.</translation> <translation id="926205370408745186">Κατάργηση της δραστηριότητάς σας στο Chrome από το Digital Wellbeing</translation> <translation id="927968626442779827">Χρησιμοποιήστε τη λειτουργία Lite στο Google Chrome.</translation> <translation id="932327136139879170">Αρχική σελίδα</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 05fa255..29ad6938 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Languages</translation> <translation id="4183868528246477015">Search with Google Lens <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Open in new tab</translation> +<translation id="4196597275619698563">Create card</translation> <translation id="4198423547019359126">No available download locations</translation> <translation id="4209895695669353772">To get personalised content suggested by Google, turn on sync</translation> <translation id="4225895483398857530">Toolbar shortcut</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Auto-complete searches and URLs</translation> <translation id="7707922173985738739">Use mobile data</translation> <translation id="7725024127233776428">Pages that you bookmark appear here</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Other forms of activity<ph name="END_LINK1" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.</translation> <translation id="7757787379047923882">Text shared from <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Select date and time</translation> <translation id="7762668264895820836">SD Card <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">See your offline files</translation> <translation id="8856607253650333758">Get descriptions</translation> <translation id="8873817150012960745">Tap here to start</translation> +<translation id="8881973373982641723">Clears history, including in the search box.</translation> <translation id="889338405075704026">Go to Chrome settings</translation> <translation id="8898822736010347272">Sends URLs of some pages that you visit, limited system information and some page content to Google, to help discover new threats and protect everyone on the web.</translation> <translation id="8909135823018751308">Share…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Can't make calls</translation> <translation id="9212845824145208577">Can\u2019t go lower. Try starting from further down the page.</translation> <translation id="9219103736887031265">Images</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Search history<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />other forms of activity<ph name="END_LINK2" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.</translation> <translation id="926205370408745186">Remove your Chrome activity from Digital Wellbeing</translation> <translation id="927968626442779827">Use lite mode on Google Chrome</translation> <translation id="932327136139879170">Home</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index bad799a..b0835e3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Idiomas</translation> <translation id="4183868528246477015">Buscar con Google Lens <ph name="BEGIN_NEW" />Nuevo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> +<translation id="4196597275619698563">Crear tarjeta</translation> <translation id="4198423547019359126">No hay ubicaciones de descarga disponibles</translation> <translation id="4209895695669353772">Para obtener contenido personalizado y sugerido por Google, activa la sincronización</translation> <translation id="4225895483398857530">Acceso directo a la barra de herramientas</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autocompletar búsquedas y URL</translation> <translation id="7707922173985738739">Usa los datos móviles.</translation> <translation id="7725024127233776428">Las páginas que agregues a favoritos aparecerán aquí</translation> +<translation id="7731260005404856143">Es posible que se guarden <ph name="BEGIN_LINK1" />otras formas de actividad<ph name="END_LINK1" /> en tu Cuenta de Google cuando accedes. Puedes borrar esa información en cualquier momento.</translation> <translation id="7757787379047923882">Texto compartido de <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Elegir fecha y hora</translation> <translation id="7762668264895820836">Tarjeta SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Ver tus archivos sin conexión</translation> <translation id="8856607253650333758">Obtener descripciones</translation> <translation id="8873817150012960745">Presiona aquí para comenzar</translation> +<translation id="8881973373982641723">Borra el historial, incluido el del cuadro de búsqueda.</translation> <translation id="889338405075704026">Ir a la configuración de Chrome</translation> <translation id="8898822736010347272">Envía a Google las URL de algunas páginas que visitas, información limitada del sistema y parte del contenido de las páginas para ayudar a detectar nuevas amenazas y proteger a todos los usuarios en la Web.</translation> <translation id="8909135823018751308">Compartir…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">No se pueden realizar llamadas</translation> <translation id="9212845824145208577">No se puede ir más abajo. Intenta tomar la captura desde más abajo en la página.</translation> <translation id="9219103736887031265">Imágenes</translation> +<translation id="923957533152125119">Es posible que el <ph name="BEGIN_LINK1" />historial de búsqueda<ph name="END_LINK1" /> y <ph name="BEGIN_LINK2" />otras formas de actividad<ph name="END_LINK2" /> se guarden en tu Cuenta de Google cuando accedes. Puedes borrar esa información en cualquier momento.</translation> <translation id="926205370408745186">Quita tu actividad en Chrome de Bienestar digital</translation> <translation id="927968626442779827">Usa el modo lite en Google Chrome</translation> <translation id="932327136139879170">Página principal</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index b1874ed..23bcfd6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Idiomas</translation> <translation id="4183868528246477015">Buscar con Google Lens <ph name="BEGIN_NEW" />Nuevo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> +<translation id="4196597275619698563">Crear tarjeta</translation> <translation id="4198423547019359126">No hay ubicaciones de descarga disponibles</translation> <translation id="4209895695669353772">Para obtener contenido personalizado sugerido por Google, activa la sincronización</translation> <translation id="4225895483398857530">Acceso directo en la barra de herramientas</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autocompletar búsquedas y URLs</translation> <translation id="7707922173985738739">Se utilizarán datos móviles</translation> <translation id="7725024127233776428">Las páginas que añadas a marcadores aparecerán aquí</translation> +<translation id="7731260005404856143">Es posible que <ph name="BEGIN_LINK1" />otras formas de actividad<ph name="END_LINK1" /> se guarden en tu cuenta de Google si has iniciado sesión. Puedes eliminarlas en cualquier momento.</translation> <translation id="7757787379047923882">Texto compartido desde <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Elegir fecha y hora</translation> <translation id="7762668264895820836">Tarjeta SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Ver tus archivos sin conexión</translation> <translation id="8856607253650333758">Obtener descripciones</translation> <translation id="8873817150012960745">Toca aquí para empezar</translation> +<translation id="8881973373982641723">Borra el historial, incluido el del cuadro de búsqueda.</translation> <translation id="889338405075704026">Ir a configuración de Chrome</translation> <translation id="8898822736010347272">Envía a Google las URL de las páginas que visitas, información limitada del sistema y contenido de las páginas para ayudar a descubrir nuevas amenazas y proteger a los usuarios de la Web.</translation> <translation id="8909135823018751308">Compartir…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">No se pueden hacer llamadas</translation> <translation id="9212845824145208577">No se puede ir más abajo. Intenta empezar desde más abajo de la página.</translation> <translation id="9219103736887031265">Imágenes</translation> +<translation id="923957533152125119">Es posible que <ph name="BEGIN_LINK1" />el historial de búsqueda<ph name="END_LINK1" /> y <ph name="BEGIN_LINK2" />otras formas de actividad<ph name="END_LINK2" /> se guarden en tu cuenta de Google si has iniciado sesión. Puedes eliminarlos en cualquier momento.</translation> <translation id="926205370408745186">Eliminar tu actividad de Chrome de Bienestar digital</translation> <translation id="927968626442779827">Usa el modo básico en Google Chrome</translation> <translation id="932327136139879170">Página principal</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index e4db7b6c..43674a8b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -263,7 +263,7 @@ <translation id="2707726405694321444">Freskatu orria</translation> <translation id="271033894570825754">Berria</translation> <translation id="2718352093833049315">Wifi bidez soilik</translation> -<translation id="2718846868787000099">Edukia hobetsitako hizkuntzetan erakusteko, bisitatzen dituzun webguneek zure hobespenak ikus ditzakete</translation> +<translation id="2718846868787000099">Edukia hizkuntza hobetsietan erakusteko, bisitatzen dituzun webguneek zure hobespenak ikus ditzakete</translation> <translation id="2723001399770238859">audioa</translation> <translation id="2728754400939377704">Ordenatu webgunearen arabera</translation> <translation id="2739256783402597439">2G</translation> @@ -488,6 +488,7 @@ <translation id="4181841719683918333">Hizkuntzak</translation> <translation id="4183868528246477015">Bilatu Google Lens-ekin <ph name="BEGIN_NEW" />Berria<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Ireki fitxa berri batean</translation> +<translation id="4196597275619698563">Sortu txartel bat</translation> <translation id="4198423547019359126">Ez dago deskarga-kokapenik eskuragarri</translation> <translation id="4209895695669353772">Google-k iradokitzen duen eduki pertsonalizatua jasotzeko, aktibatu sinkronizazioa</translation> <translation id="4225895483398857530">Tresna-barrako lasterbidea</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Bete automatikoki bilaketak eta URLak</translation> <translation id="7707922173985738739">Erabili datu-konexioa</translation> <translation id="7725024127233776428">Hemen agertuko dira laster-marka egin diezun orriak</translation> +<translation id="7731260005404856143">Litekeena da <ph name="BEGIN_LINK1" />beste jarduera batzuk<ph name="END_LINK1" /> Google-ko kontuan gordetzea saioa hasita daukazun bitartean. Nahi duzunean ezaba ditzakezu.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> gailutik partekatutako testua</translation> <translation id="7761849928583394409">Aukeratu data eta ordua</translation> <translation id="7762668264895820836"><ph name="SD_CARD_NUMBER" />. SD txartela</translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Ikusi konexiorik gabeko fitxategiak</translation> <translation id="8856607253650333758">Lortu deskribapenak</translation> <translation id="8873817150012960745">Hasteko, sakatu hau</translation> +<translation id="8881973373982641723">Historia garbitzen du, bilaketa-koadroa barne.</translation> <translation id="889338405075704026">Joan Chrome-ren ezarpenetara</translation> <translation id="8898822736010347272">Erabiltzen dituzun orri batzuen URLak, sistemari buruzko informazio mugatua eta orrietako eduki batzuk bidaltzen dizkio Google-ri mehatxuak aurkitzeko eta sarearen erabiltzaile guztiak babesteko.</translation> <translation id="8909135823018751308">Partekatu…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Ezin da deirik egin</translation> <translation id="9212845824145208577">Ezin zara gehiago jaitsi. Hasi beherago orrian.</translation> <translation id="9219103736887031265">Irudiak</translation> +<translation id="923957533152125119">Litekeena da <ph name="BEGIN_LINK1" />bilaketa-historia<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />beste jarduera batzuk<ph name="END_LINK2" /> Google-ko kontuan gordetzea saioa hasita daukazun bitartean. Nahi duzunean ezaba ditzakezu.</translation> <translation id="926205370408745186">Kendu Chrome-ko jarduerak Ongizate digitala programatik</translation> <translation id="927968626442779827">Erabili oinarrizko modua Google Chrome-n</translation> <translation id="932327136139879170">Hasiera</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index b222bb44..53ed837 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">زبانها</translation> <translation id="4183868528246477015">جستجو با «لنز Google» <ph name="BEGIN_NEW" />جدید<ph name="END_NEW" /></translation> <translation id="4195643157523330669">باز کردن در برگهٔ جدید</translation> +<translation id="4196597275619698563">ایجاد کارت</translation> <translation id="4198423547019359126">مکانی برای بارگیری دردسترس نیست</translation> <translation id="4209895695669353772">برای اینکه Google محتوای شخصیشده به شما پیشنهاد دهد، همگامسازی را روشن کنید</translation> <translation id="4225895483398857530">میانبر نوار ابزار</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">تکمیل خودکار جستجوها و نشانیهای وب</translation> <translation id="7707922173985738739">استفاده از داده تلفن همراه</translation> <translation id="7725024127233776428">صفحاتی را که نشانکگذاری میکنید، در اینجا نشان داده میشوند</translation> +<translation id="7731260005404856143">وقتی به سیستم وارد شده باشید، ممکن است <ph name="BEGIN_LINK1" />دیگر انواع فعالیت<ph name="END_LINK1" /> در «حساب Google» شما ذخیره شوند. هروقت بخواهید میتوانید آنها را حذف کنید.</translation> <translation id="7757787379047923882">نوشتار همرسانیشده از <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">انتخاب تاریخ و زمان</translation> <translation id="7762668264895820836">کارت SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">مشاهده فایلهای آفلاین</translation> <translation id="8856607253650333758">دریافت توضیحات</translation> <translation id="8873817150012960745">برای شروع، اینجا ضربه بزنید</translation> +<translation id="8881973373982641723">سابقهها، ازجمله سابقه موجود در چارگوش جستجو پاک میشود.</translation> <translation id="889338405075704026">به تنظیمات Chrome بروید</translation> <translation id="8898822736010347272">نشانیهای وب بعضی از صفحههایی که بازدید میکنید، اطلاعات محدودی از سیستم، و برخی از محتوای صفحه را به Google ارسال میکند تا به کشف تهدیدهای جدید و محافظت از همه افراد در وب کمک کند.</translation> <translation id="8909135823018751308">اشتراکگذاری...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">برقراری تماس ممکن نیست</translation> <translation id="9212845824145208577">نمیتوان پایینتر رفت. از بخش پایینتری در صفحه شروع کنید.</translation> <translation id="9219103736887031265">تصاویر</translation> +<translation id="923957533152125119">وقتی به سیستم وارد شده باشید، ممکن است <ph name="BEGIN_LINK1" />سابقه جستجو<ph name="END_LINK1" /> و <ph name="BEGIN_LINK2" />دیگر انواع فعالیت<ph name="END_LINK2" /> در «حساب Google» شما ذخیره شوند. هروقت بخواهید میتوانید آنها را حذف کنید.</translation> <translation id="926205370408745186">فعالیت Chrome شما از «آسایش دیجیتالی» برداشته شود</translation> <translation id="927968626442779827">استفاده از «حالت ساده» در Google Chrome</translation> <translation id="932327136139879170">منزل</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index ddf6b88a..0a00c49 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Kielet</translation> <translation id="4183868528246477015">Hae Google Lensillä <ph name="BEGIN_NEW" />Uusi<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Avaa uudelle välilehdelle</translation> +<translation id="4196597275619698563">Luo kortti</translation> <translation id="4198423547019359126">Tallennussijainteja ei ole saatavilla</translation> <translation id="4209895695669353772">Ota synkronointi käyttöön, niin näet Googlen suosittelemaa yksilöllistä sisältöä</translation> <translation id="4225895483398857530">Työkalupalkin pikakuvake</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Täydennä automaattisesti hakuja ja URL-osoitteita</translation> <translation id="7707922173985738739">Käytä mobiilidataa</translation> <translation id="7725024127233776428">Kirjanmerkeiksi lisätyt sivut näkyvät tässä</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Muita toimintoja<ph name="END_LINK1" /> voidaan tallentaa Google-tilillesi, kun olet kirjautuneena sisään. Voit poistaa ne milloin tahansa.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> jakoi tekstin</translation> <translation id="7761849928583394409">Valitse päivä ja aika</translation> <translation id="7762668264895820836">SD-kortti <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Katso offline-tiedostojasi</translation> <translation id="8856607253650333758">Muodosta kuvaukset</translation> <translation id="8873817150012960745">Aloita napauttamalla tätä</translation> +<translation id="8881973373982641723">Tyhjentää historian esim. hakukentästä.</translation> <translation id="889338405075704026">Siirry Chrome-asetuksiin</translation> <translation id="8898822736010347272">Lähettää Googlelle joidenkin vierailemiesi sivujen URL-osoitteita, rajallisia järjestelmätietoja ja osia sivujen sisällöstä auttaakseen löytämään uusia uhkia ja suojaamaan kaikkia verkon käyttäjiä.</translation> <translation id="8909135823018751308">Jaa…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Puheluiden soittaminen ei onnistu</translation> <translation id="9212845824145208577">Alemmas ei pääse. Kokeile aloittaa alempaa sivulta.</translation> <translation id="9219103736887031265">Kuvat</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Hakuhistoriaa<ph name="END_LINK1" /> ja <ph name="BEGIN_LINK2" />muita toimintoja<ph name="END_LINK2" /> voidaan tallentaa Google-tilillesi, kun olet kirjautuneena sisään. Voit poistaa ne milloin tahansa.</translation> <translation id="926205370408745186">Poista Chrome-toimintasi Digitaalisesta hyvinvoinnista</translation> <translation id="927968626442779827">Käytä Yksinkertaistettua tilaa Google Chromessa</translation> <translation id="932327136139879170">Etusivu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 7fd548eb..326d7ee 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Mga Wika</translation> <translation id="4183868528246477015">Hanapin gamit ang Google Lens <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Buksan sa bagong tab</translation> +<translation id="4196597275619698563">Gumawa ng card</translation> <translation id="4198423547019359126">Walang available na lokasyon ng pag-download</translation> <translation id="4209895695669353772">Para makakuha ng naka-personalize na content na iminumungkahi ng Google, i-on ang pag-sync</translation> <translation id="4225895483398857530">Shortcut ng toolbar</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Awtomatikong kumpletuhin ang mga paghahanap at URL</translation> <translation id="7707922173985738739">Gumamit ng mobile data</translation> <translation id="7725024127233776428">Lalabas dito ang mga page na iyong.na-bookmark</translation> +<translation id="7731260005404856143">Posibleng ma-save sa iyong Google Account ang <ph name="BEGIN_LINK1" />iba pang anyo ng aktibidad<ph name="END_LINK1" /> kapag naka-sign in ka. Puwede mong i-delete ang mga ito anumang oras.</translation> <translation id="7757787379047923882">Ibinahagi ang text mula sa <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Pumili ng petsa at oras</translation> <translation id="7762668264895820836">SD card <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Tingnan ang iyong mga offline na file</translation> <translation id="8856607253650333758">Makakuha ng mga paglalarawan</translation> <translation id="8873817150012960745">Mag-tap dito para magsimula</translation> +<translation id="8881973373982641723">Kini-clear ang history, kasama ang nasa box para sa paghahanap.</translation> <translation id="889338405075704026">Pumunta sa mga setting ng Chrome</translation> <translation id="8898822736010347272">Nagpapadala ng mga URL ng ilang page na binibisita mo, limitadong impormasyon ng system, at ilang content ng page sa Google, para makatulong na tumuklas ng mga bagong banta at protektahan ang lahat ng nasa web.</translation> <translation id="8909135823018751308">Ibahagi…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Hindi makatawag</translation> <translation id="9212845824145208577">Hindi na maibababa pa. Subukang magsimula sa mas mababang bahagi ng page.</translation> <translation id="9219103736887031265">Mga Larawan</translation> +<translation id="923957533152125119">Posibleng ma-save sa iyong Google Account ang <ph name="BEGIN_LINK1" />history ng paghahanap<ph name="END_LINK1" /> at <ph name="BEGIN_LINK2" />iba pang anyo ng aktibidad<ph name="END_LINK2" /> kapag naka-sign in ka. Puwede mong i-delete ang mga ito anumang oras.</translation> <translation id="926205370408745186">Alisin sa Digital Wellness ang iyong aktibidad sa Chrome</translation> <translation id="927968626442779827">Gamitin ang Lite mode sa Google Chrome</translation> <translation id="932327136139879170">Home</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index d4ac117..447d9499 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Langues</translation> <translation id="4183868528246477015"><ph name="BEGIN_NEW" />Nouv.<ph name="END_NEW" /> Rech. avec Lentille Google</translation> <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation> +<translation id="4196597275619698563">Créer une carte</translation> <translation id="4198423547019359126">Aucun dossier de téléchargement n'est disponible</translation> <translation id="4209895695669353772">Pour obtenir du contenu personnalisé suggéré par Google, activez la synchronisation</translation> <translation id="4225895483398857530">Raccourci de la barre d'outils</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Saisie semi-automatique des recherches et des URL</translation> <translation id="7707922173985738739">Utiliser les données mobiles</translation> <translation id="7725024127233776428">Les pages que vous ajoutez aux favoris s'affichent ici</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />D'autres formes d'activités<ph name="END_LINK1" /> peuvent être enregistrées dans votre compte Google lorsque vous êtes connecté. Vous pouvez les supprimer en tout temps.</translation> <translation id="7757787379047923882">Texte partagé à partir de <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Sélectionner une date et une heure</translation> <translation id="7762668264895820836">Carte SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Afficher vos fichiers hors ligne</translation> <translation id="8856607253650333758">Obtenir les descriptions</translation> <translation id="8873817150012960745">Touchez ici pour commencer</translation> +<translation id="8881973373982641723">Efface l'historique, y compris le contenu du champ de recherche.</translation> <translation id="889338405075704026">Aller aux paramètres de Chrome</translation> <translation id="8898822736010347272">Envoie à Google des URL de certaines pages que vous visitez, certaines données système et des échantillons de contenu des pages afin d'aider à découvrir de nouvelles menaces et de protéger tous les internautes.</translation> <translation id="8909135823018751308">Partager...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Impossible de faire des appels</translation> <translation id="9212845824145208577">Impossible d'aller plus bas. Essayez de commencer plus bas sur la page.</translation> <translation id="9219103736887031265">Images</translation> +<translation id="923957533152125119">L'<ph name="BEGIN_LINK1" />historique de recherche<ph name="END_LINK1" /> et d'<ph name="BEGIN_LINK2" />autres formes d'activités<ph name="END_LINK2" /> peuvent être enregistrés dans votre compte Google lorsque vous êtes connecté. Vous pouvez les supprimer en tout temps.</translation> <translation id="926205370408745186">Supprimer votre activité Chrome de Bien-être numérique</translation> <translation id="927968626442779827">Utilisez le mode simplifié dans Google Chrome</translation> <translation id="932327136139879170">Accueil</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 5e12874..5b7a179 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">भाषाएं</translation> <translation id="4183868528246477015">Google Lens से खोजें <ph name="BEGIN_NEW" />नया<ph name="END_NEW" /></translation> <translation id="4195643157523330669">नए टैब में खोलें</translation> +<translation id="4196597275619698563">कार्ड बनाएं</translation> <translation id="4198423547019359126">डाउनलोड करने की कोई जगह उपलब्ध नहीं है</translation> <translation id="4209895695669353772">Google की ओर से सुझाई गई मनमुताबिक सामग्री पाने के लिए, 'सिंक करें' को चालू करें</translation> <translation id="4225895483398857530">Toolbar का शॉर्टकट</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">खोजों और यूआरएल को अपने आप पूरा करें</translation> <translation id="7707922173985738739">मोबाइल डेटा का उपयोग करें</translation> <translation id="7725024127233776428">आप जो पेज बुकमार्क करते हैं वे यहां दिखाई देंगे</translation> +<translation id="7731260005404856143">जब आप साइन इन होंगे, तब हो सकता है कि <ph name="BEGIN_LINK1" />अन्य तरह की गतिविधि<ph name="END_LINK1" /> आपके Google खाते में सेव हो जाए. आप किसी भी समय इन्हें मिटा सकते हैं.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> से टेक्स्ट शेयर किया गया</translation> <translation id="7761849928583394409">तारीख और समय चुनें</translation> <translation id="7762668264895820836">SD कार्ड <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">ऑफ़लाइन सेव की गई अपनी फ़ाइलें देखें</translation> <translation id="8856607253650333758">जानकारी पाएं</translation> <translation id="8873817150012960745">शुरू करने के लिए, यहां टैप करें</translation> +<translation id="8881973373982641723">ब्राउज़िंग इतिहास मिटाता है और इसमें खोज बॉक्स का ब्राउज़िंग इतिहास भी शामिल है.</translation> <translation id="889338405075704026">Chrome की सेटिंग में जाएं</translation> <translation id="8898822736010347272">आप जिन पेजों पर जाते हैं उनमें से कुछ के यूआरएल, सिस्टम की सीमित जानकारी, और पेज की कुछ सामग्री को यह Google को भेजता है. ऐसा इसलिए जिससे कि नए खतरों को खोजा जा सके और वेब पर सभी सुरक्षित रहें.</translation> <translation id="8909135823018751308">शेयर करें…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">कॉल नहीं कर पा रहे</translation> <translation id="9212845824145208577">इससे नीचे नहीं जा सकते. पेज पर नीचे से शुरुआत करके देखें.</translation> <translation id="9219103736887031265">Images</translation> +<translation id="923957533152125119">जब आप साइन इन होंगे, तब हो सकता है कि <ph name="BEGIN_LINK1" />खोज इतिहास<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />अन्य तरह की गतिविधि<ph name="END_LINK2" /> आपके Google खाते में सेव हो जाए. आप किसी भी समय इन्हें मिटा सकते हैं.</translation> <translation id="926205370408745186">'डिजिटल वेलबीइंग' से अपनी Chrome गतिविधि हटाएं</translation> <translation id="927968626442779827">Google Chrome पर लाइट मोड का इस्तेमाल करें</translation> <translation id="932327136139879170">होम बटन</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index acac7310..b19be462 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Nyelvek</translation> <translation id="4183868528246477015">Keresés a Google Lensszel <ph name="BEGIN_NEW" />Új<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Megnyitás új lapon</translation> +<translation id="4196597275619698563">Kártya létrehozása</translation> <translation id="4198423547019359126">Nem áll rendelkezésre letöltési hely</translation> <translation id="4209895695669353772">A Google által javasolt, személyre szabott tartalmak fogadásához kapcsolja be a szinkronizálást</translation> <translation id="4225895483398857530">Eszköztár gyorsparancs</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Keresések és URL-címek automatikus kiegészítése</translation> <translation id="7707922173985738739">Mobiladat-kapcsolat használata</translation> <translation id="7725024127233776428">Itt jelennek meg a könyvjelzőként mentett oldalak</translation> +<translation id="7731260005404856143">Amikor be van jelentkezve, a <ph name="BEGIN_LINK1" />további tevékenységtípusokat<ph name="END_LINK1" /> a rendszer elmentheti a Google-fiókjába. Ön bármikor törölheti őket.</translation> <translation id="7757787379047923882">Szöveg megosztva a következő eszközről: <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Dátum és időpont kiválasztása</translation> <translation id="7762668264895820836">SD-kártya (<ph name="SD_CARD_NUMBER" />)</translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Offline fájlok megtekintése</translation> <translation id="8856607253650333758">Leírások lekérése</translation> <translation id="8873817150012960745">Koppintson ide az indításhoz</translation> +<translation id="8881973373982641723">Törli az előzményeket, köztük a keresőmező előzményeit is.</translation> <translation id="889338405075704026">Ugrás a Chrome beállításaira</translation> <translation id="8898822736010347272">Egyes felkeresett oldalak URL-jeit, korlátozott rendszer-információkat és bizonyos oldaltartalmakat küld el a Google-nak, hogy könnyebben felfedezhetők legyenek az internetezőkre leselkedő új veszélyek, és meg lehessen védeni a felhasználókat.</translation> <translation id="8909135823018751308">Megosztás...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nem lehet hívást indítani</translation> <translation id="9212845824145208577">Nem lehet lejjebb menni. Próbálkozzon a lap lentebbi részével való kezdéssel.</translation> <translation id="9219103736887031265">Képek</translation> +<translation id="923957533152125119">Amikor be van jelentkezve, a <ph name="BEGIN_LINK1" />keresési előzményeket<ph name="END_LINK1" /> és <ph name="BEGIN_LINK2" />más tevékenységtípusokat<ph name="END_LINK2" /> a rendszer elmentheti a Google-fiókjába. Ön bármikor törölheti őket.</translation> <translation id="926205370408745186">Chrome-beli tevékenység eltávolítása a digitális jóllét funkcióból</translation> <translation id="927968626442779827">Használja az Egyszerűsített módot a Google Chrome-ban</translation> <translation id="932327136139879170">Főoldal</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index b243866..c5d681d8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Լեզուներ</translation> <translation id="4183868528246477015">Որոնել Տեսապակու միջոցով <ph name="BEGIN_NEW" />Նոր<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Բացել նոր ներդիրով</translation> +<translation id="4196597275619698563">Ստեղծել քարտ</translation> <translation id="4198423547019359126">Ներբեռնումների պանակներ չկան</translation> <translation id="4209895695669353772">Google-ից անհատականացված բովանդակություն ստանալու համար միացրեք համաժամացումը</translation> <translation id="4225895483398857530">Գործիքագոտու դյուրանցում</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Ավտոմատ լրացնել որոնման հարցումները և URL-ները</translation> <translation id="7707922173985738739">Օգտագործել բջջային ինտերնետ</translation> <translation id="7725024127233776428">Ձեր էջանշած էջերը կցուցադրվեն այստեղ</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Այլ գործողություններ<ph name="END_LINK1" /> կարող են պահվել ձեր Google հաշվում, երբ դուք մուտք եք գործում։ Այդ տվյալները կարող եք ցանկացած ժամանակ ջնջել։</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> սարքից ուղարկված հաղորդագրություն</translation> <translation id="7761849928583394409">Ընտրեք ամսաթիվը և ժամը</translation> <translation id="7762668264895820836">SD քարտ <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Դիտեք անցանց ֆայլերը</translation> <translation id="8856607253650333758">Ստանալ նկարագրություններ</translation> <translation id="8873817150012960745">Սկսելու համար հպեք այստեղ</translation> +<translation id="8881973373982641723">Մաքրում է պատմությունը, այդ թվում որոնման դաշտում։</translation> <translation id="889338405075704026">Անցնել Chrome-ի կարգավորումներ</translation> <translation id="8898822736010347272">Ուղարկում է Google-ին ձեր այցելած որոշ էջերի URL-ներն ու դրանց բովանդակությունը և համակարգի մասին որոշակի տեղեկություններ, որոնք օգնում են հայտնաբերել համացանցում օգտատերերին սպառնացող նոր վտանգներ։</translation> <translation id="8909135823018751308">Կիսվել…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Չի հաջողվում զանգել</translation> <translation id="9212845824145208577">Հնարավոր չէ ավելի ներքևից նշել։ Փորձեք նշել էջի ներքևից։</translation> <translation id="9219103736887031265">Պատկերներ</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Որոնումների պատմությունը<ph name="END_LINK1" /> և <ph name="BEGIN_LINK2" />այլ գործողություններ<ph name="END_LINK2" /> կարող են պահվել ձեր Google հաշվում, երբ դուք մուտք եք գործում։ Այդ տվյալները կարող եք ցանկացած ժամանակ ջնջել։</translation> <translation id="926205370408745186">Հեռացրեք Chrome-ի պատմությունը Թվային բարեկեցությունից</translation> <translation id="927968626442779827">Փորձեք Lite ռեժիմը Google Chrome-ում</translation> <translation id="932327136139879170">Գլխավոր էջ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 52bd0a6..6f3fdca 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Bahasa</translation> <translation id="4183868528246477015">Telusuri dgn Google Lens <ph name="BEGIN_NEW" />Baru<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Buka di tab baru</translation> +<translation id="4196597275619698563">Buat kartu</translation> <translation id="4198423547019359126">Tidak tersedia lokasi download</translation> <translation id="4209895695669353772">Untuk mendapatkan konten hasil personalisasi yang disarankan oleh Google, aktifkan sinkronisasi</translation> <translation id="4225895483398857530">Pintasan toolbar</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Lengkapi otomatis penelusuran dan URL</translation> <translation id="7707922173985738739">Gunakan data seluler</translation> <translation id="7725024127233776428">Halaman yang Anda bookmark muncul di sini</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Bentuk aktivitas lainnya<ph name="END_LINK1" /> dapat disimpan di Akun Google Anda saat login. Anda dapat menghapusnya kapan saja.</translation> <translation id="7757787379047923882">Teks dibagikan dari <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Pilih tanggal & waktu</translation> <translation id="7762668264895820836">Kartu SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Lihat file offline Anda</translation> <translation id="8856607253650333758">Dapatkan deskripsi</translation> <translation id="8873817150012960745">Ketuk di sini untuk memulai</translation> +<translation id="8881973373982641723">Menghapus histori, termasuk di kotak penelusuran.</translation> <translation id="889338405075704026">Buka setelan Chrome</translation> <translation id="8898822736010347272">Kirim URL beberapa halaman yang Anda kunjungi, informasi sistem terbatas, dan beberapa konten halaman ke Google untuk membantu menemukan ancaman baru dan melindungi semua orang di web.</translation> <translation id="8909135823018751308">Bagikan...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Tidak dapat menelepon</translation> <translation id="9212845824145208577">Tidak dapat lebih rendah lagi. Coba mulai dari bagian yang lebih bawah pada halaman.</translation> <translation id="9219103736887031265">Gambar</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Histori penelusuran<ph name="END_LINK1" /> dan <ph name="BEGIN_LINK2" />bentuk aktivitas lainnya<ph name="END_LINK2" /> dapat disimpan di Akun Google Anda saat login. Anda dapat menghapusnya kapan saja.</translation> <translation id="926205370408745186">Hapus aktivitas Chrome Anda dari Kesehatan Digital</translation> <translation id="927968626442779827">Gunakan Mode Ringan di Google Chrome</translation> <translation id="932327136139879170">Beranda</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index 5951dfc8..ec50266 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Lingue</translation> <translation id="4183868528246477015">Cerca con Google Lens <ph name="BEGIN_NEW" />Novità<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Apri in un'altra scheda</translation> +<translation id="4196597275619698563">Crea scheda</translation> <translation id="4198423547019359126">Nessun percorso di download disponibile</translation> <translation id="4209895695669353772">Per ricevere contenuti suggeriti appositamente per te da Google, attiva la sincronizzazione</translation> <translation id="4225895483398857530">Scorciatoia per la barra degli strumenti</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Completamento automatico di ricerche e URL</translation> <translation id="7707922173985738739">Verranno utilizzati i dati mobili</translation> <translation id="7725024127233776428">Le pagine aggiunte ai preferiti saranno mostrate qui</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Altri tipi di attività<ph name="END_LINK1" /> potrebbero essere salvati nel tuo Account Google se hai eseguito l'accesso. Puoi eliminare queste informazioni in qualsiasi momento.</translation> <translation id="7757787379047923882">Testo condiviso da <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Scegli data e ora</translation> <translation id="7762668264895820836">Scheda SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Vedi i tuoi file offline</translation> <translation id="8856607253650333758">Recupera descrizioni</translation> <translation id="8873817150012960745">Tocca qui per iniziare</translation> +<translation id="8881973373982641723">Viene cancellata la cronologia, anche nella casella di ricerca.</translation> <translation id="889338405075704026">Apri le impostazioni di Chrome</translation> <translation id="8898822736010347272">Invia a Google gli URL di alcune pagine visitate, informazioni limitate sul sistema e alcuni contenuti delle pagine per contribuire a scoprire le nuove minacce e proteggere tutti gli utenti del Web.</translation> <translation id="8909135823018751308">Condividi…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Impossibile effettuare chiamate</translation> <translation id="9212845824145208577">Non puoi scorrere più in basso di così. Prova a partire da un punto più in basso nella pagina.</translation> <translation id="9219103736887031265">Immagini</translation> +<translation id="923957533152125119">La <ph name="BEGIN_LINK1" />cronologia delle ricerche<ph name="END_LINK1" /> e <ph name="BEGIN_LINK2" />altri tipi di attività<ph name="END_LINK2" /> potrebbero essere salvati nel tuo Account Google se hai eseguito l'accesso. Puoi eliminare queste informazioni in qualsiasi momento.</translation> <translation id="926205370408745186">Rimuovi la tua attività di Chrome da Benessere digitale</translation> <translation id="927968626442779827">Usa la modalità Lite su Google Chrome</translation> <translation id="932327136139879170">Home page</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index a3fb84d..002b2d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">שפות</translation> <translation id="4183868528246477015">חיפוש בעזרת Google Lens <ph name="BEGIN_NEW" />חדש<ph name="END_NEW" /></translation> <translation id="4195643157523330669">פתיחה בכרטיסייה חדשה</translation> +<translation id="4196597275619698563">ליצירת כרטיס</translation> <translation id="4198423547019359126">אין מיקומים זמינים להורדה</translation> <translation id="4209895695669353772">כדי לקבל מ-Google הצעות לתוכן מותאם אישית, יש להפעיל את הסנכרון</translation> <translation id="4225895483398857530">קיצור דרך בסרגל הכלים</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">השלמה אוטומטית של חיפושים וכתובות אתרים</translation> <translation id="7707922173985738739">שימוש בחבילת הגלישה</translation> <translation id="7725024127233776428">הדפים שהוספת לסימניות מופיעים כאן</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />סוגי פעילות אחרים<ph name="END_LINK1" /> עשויים להישמר בחשבון Google לאחר הכניסה. ניתן למחוק אותם בכל שלב.</translation> <translation id="7757787379047923882">הטקסט שותף דרך <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">בחירת תאריך ושעה</translation> <translation id="7762668264895820836">כרטיס SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">הצגת הקבצים שזמינים ללא חיבור לאינטרנט.</translation> <translation id="8856607253650333758">ליצירת תיאורים</translation> <translation id="8873817150012960745">כדי להתחיל, יש להקיש כאן</translation> +<translation id="8881973373982641723">יתבצע ניקוי של ההיסטוריה, כולל זו שבתיבת החיפוש.</translation> <translation id="889338405075704026">כניסה להגדרות Chrome</translation> <translation id="8898822736010347272">שולח ל-Google כתובות URL של חלק מהדפים שאליהם נכנסת, פרטים מוגבלים לגבי המערכת וחלק מתוכן הדפים. פעולה זו עוזרת לזהות איומים חדשים ולהגן על כל המשתמשים באינטרנט.</translation> <translation id="8909135823018751308">שיתוף…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">לא ניתן לבצע שיחות</translation> <translation id="9212845824145208577">אי אפשר לזוז למטה יותר. יש לנסות להתחיל מחלק נמוך יותר בדף.</translation> <translation id="9219103736887031265">תמונות</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />היסטוריית החיפושים<ph name="END_LINK1" /> ו<ph name="BEGIN_LINK2" />סוגי פעילות אחרים<ph name="END_LINK2" /> עשויים להישמר בחשבון Google לאחר הכניסה. ניתן למחוק אותם בכל שלב.</translation> <translation id="926205370408745186">הסרת הפעילות שלך ב-Chrome מ'שימוש חכם בדיגיטל'.</translation> <translation id="927968626442779827">כדאי להשתמש במצב הטעינה המהירה ב-Google Chrome</translation> <translation id="932327136139879170">בית</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index f8e3b5c..9c65ce20 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">言語</translation> <translation id="4183868528246477015">Google レンズで検索<ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="4195643157523330669">新しいタブで開く</translation> +<translation id="4196597275619698563">カードを作成</translation> <translation id="4198423547019359126">ダウンロードの保存先はありません</translation> <translation id="4209895695669353772">ユーザーに合わせた Google からのおすすめコンテンツを表示するには、同期を有効にします</translation> <translation id="4225895483398857530">ツールバー ショートカット</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">検索語句や URL をオートコンプリートする</translation> <translation id="7707922173985738739">モバイルデータを使用します</translation> <translation id="7725024127233776428">ブックマークしたページがここに表示されます</translation> +<translation id="7731260005404856143">ログイン中は Google アカウントに<ph name="BEGIN_LINK1" />その他のアクティビティ<ph name="END_LINK1" />が保存される可能性があります。保存されたデータはいつでも削除できます。</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> からテキストが共有されました</translation> <translation id="7761849928583394409">日付と時間を選択</translation> <translation id="7762668264895820836">SD カード <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">オフライン ファイルを表示</translation> <translation id="8856607253650333758">説明文を取得</translation> <translation id="8873817150012960745">始めるにはここをタップ</translation> +<translation id="8881973373982641723">検索ボックスなどの履歴を削除します。</translation> <translation id="889338405075704026">Chrome 設定に移動</translation> <translation id="8898822736010347272">新たな脅威の発見と、すべてのウェブユーザーの保護に役立てるため、アクセスした一部のページの URL、限定的なシステム情報、一部のページ コンテンツを Google に送信します。</translation> <translation id="8909135823018751308">共有...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">通話ができません</translation> <translation id="9212845824145208577">下に移動できません。ページの下のほうから始めてみてください。</translation> <translation id="9219103736887031265">画像</translation> +<translation id="923957533152125119">ログイン中は Google アカウントに<ph name="BEGIN_LINK1" />検索履歴<ph name="END_LINK1" />や<ph name="BEGIN_LINK2" />その他のアクティビティ<ph name="END_LINK2" />が保存される可能性があります。保存されたデータはいつでも削除できます。</translation> <translation id="926205370408745186">Chrome のアクティビティを Digital Wellbeing から削除</translation> <translation id="927968626442779827">Google Chrome のライトモードをご活用ください</translation> <translation id="932327136139879170">ホーム</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index a4ffcfe..c001efc0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">ენები</translation> <translation id="4183868528246477015">ძიება Google Lens-ით <ph name="BEGIN_NEW" />სიახლე<ph name="END_NEW" /></translation> <translation id="4195643157523330669">ახალ ჩანართში გახსნა</translation> +<translation id="4196597275619698563">ბარათის შექმნა</translation> <translation id="4198423547019359126">ჩამოსატვირთი მდებარეობები მიუწვდომელია</translation> <translation id="4209895695669353772">Google-ის მიერ შემოთავაზებულ, პერსონალიზებულ კონტენტზე წვდომისთვის ჩართეთ სინქრონიზაცია</translation> <translation id="4225895483398857530">ხელსაწყოთა ზოლის მალსახმობი</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">ძიებებისა და URL-ების ავტომატური დასრულება</translation> <translation id="7707922173985738739">მობილური ინტერნეტის გამოყენება</translation> <translation id="7725024127233776428">აქ გამოჩნდება თქვენ მიერ სანიშნით მონიშნული გვერდები</translation> +<translation id="7731260005404856143">თქვენს Google ანგარიშში შეიძლება შეინახოს <ph name="BEGIN_LINK1" />სხვა ტიპის აქტივობა<ph name="END_LINK1" />, როცა შესული იქნებით სისტემაში. მისი წაშლა ნებისმიერ დროს შეგიძლიათ.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />-დან გაზიარებული ტექსტი</translation> <translation id="7761849928583394409">თაირიღისა და დროის არჩევა</translation> <translation id="7762668264895820836">SD ბარათი <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">ხაზგარეშე ფაილების ნახვა</translation> <translation id="8856607253650333758">აღწერილობების მიღება</translation> <translation id="8873817150012960745">დასაწყებად შეეხეთ აქ</translation> +<translation id="8881973373982641723">გაასუფთავებს ისტორიას, მათ შორის, საძიებო ველში.</translation> <translation id="889338405075704026">Chrome-ის პარამეტრებზე გადასვლა</translation> <translation id="8898822736010347272">Google-ს გაუგზავნის თქვენ მიერ მონახულებული ზოგიერთი გვერდის URL-ებს, სისტემის შეზღუდულ ინფორმაციასა და გვერდების გარკვეულ კონტენტს ვების ყველა მომხმარებლისთვის ახალი საფრთხეების აღმოსაჩენად და დასაბლოკად.</translation> <translation id="8909135823018751308">გაზიარება…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">დარეკვა ვერ ხერხდება</translation> <translation id="9212845824145208577">უფრო ქვემოთ ჩასვლა ვერ მოხერხდება. ცადეთ გვერდის უფრო ქვემოდან დაწყება.</translation> <translation id="9219103736887031265">გამოსახულებები</translation> +<translation id="923957533152125119">თქვენს Google ანგარიშში შეიძლება შეინახოს <ph name="BEGIN_LINK1" />ძიების ისტორია<ph name="END_LINK1" /> და <ph name="BEGIN_LINK2" />სხვა ტიპის აქტივობა<ph name="END_LINK2" />, როცა შესული იქნებით სისტემაში. მისი წაშლა ნებისმიერ დროს შეგიძლიათ.</translation> <translation id="926205370408745186">ციფრული კომფორტიდან Chrome-ში თქვენი აქტივობის ამოშლა</translation> <translation id="927968626442779827">გამოიყენეთ Lite რეჟიმი Google Chrome-ში</translation> <translation id="932327136139879170">საწყისი გვერდი</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 46581df5..9de0d7b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Тілдер</translation> <translation id="4183868528246477015">Google Lens арқылы іздеу <ph name="BEGIN_NEW" />Жаңа<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Жаңа қойындыда ашу</translation> +<translation id="4196597275619698563">Карта жасау</translation> <translation id="4198423547019359126">Жүктеп алуға пайдалануға болатын орындар жоқ</translation> <translation id="4209895695669353772">Google ұсынатын жекелендірілген мазмұнды алу үшін синхрондау функциясын қосыңыз</translation> <translation id="4225895483398857530">Құралдар тақтасы таңбашасы</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Іздеулер мен URL мекенжайларын автотолтыру</translation> <translation id="7707922173985738739">Мобильдік деректерді пайдалану</translation> <translation id="7725024127233776428">Бетбелгі қойылған беттер осы жерде көрсетіледі</translation> +<translation id="7731260005404856143">Google есептік жазбасына кірген кезде, <ph name="BEGIN_LINK1" />басқа әрекет түрлері<ph name="END_LINK1" /> оған сақталуы мүмкін. Оларды кез келген уақытта жоя аласыз.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> бөліскен мәтін</translation> <translation id="7761849928583394409">Күні мен уақытын таңдау</translation> <translation id="7762668264895820836"><ph name="SD_CARD_NUMBER" />-ші SD картасы</translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Офлайн файлдарды көру</translation> <translation id="8856607253650333758">Сипаттамалар алу</translation> <translation id="8873817150012960745">Бастау үшін осы жерді басыңыз.</translation> +<translation id="8881973373982641723">Тарих және іздеу өрісіндегі дерек өшіріледі.</translation> <translation id="889338405075704026">Chrome параметрлеріне өту</translation> <translation id="8898822736010347272">Жаңа қауіптерді анықтап, интернетте барлығын қорғауға көмектесу үшін кірген кейбір беттердің URL мекенжайларын, шектеулі жүйе ақпаратын және кейбір беттердің мазмұнын Google-ға жібереді.</translation> <translation id="8909135823018751308">Бөлісу…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Қоңырау шалу мүмкін емес</translation> <translation id="9212845824145208577">Бұдан төмен түспейді. Беттің төменгі жағынан бастап көріңіз.</translation> <translation id="9219103736887031265">Кескіндер</translation> +<translation id="923957533152125119">Google есептік жазбасына кірген кезде, <ph name="BEGIN_LINK1" />Іздеу тарихы<ph name="END_LINK1" /> мен <ph name="BEGIN_LINK2" />басқа әрекет түрлері<ph name="END_LINK2" /> оған сақталуы мүмкін. Оларды кез келген уақытта жоя аласыз.</translation> <translation id="926205370408745186">Digital Wellbeing функциясынан Chrome браузерін пайдалану деректерін өшіру</translation> <translation id="927968626442779827">Google Chrome браузерінде Lite режимін пайдаланыңыз.</translation> <translation id="932327136139879170">Негізгі бет</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index fa387424..b5d84353 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">ភាសា</translation> <translation id="4183868528246477015">ស្វែងរកដោយប្រើ Google Lens <ph name="BEGIN_NEW" />ថ្មី<ph name="END_NEW" /></translation> <translation id="4195643157523330669">បើកនៅក្នុងផ្ទាំងថ្មី</translation> +<translation id="4196597275619698563">បង្កើតកាត</translation> <translation id="4198423547019359126">មិនមានទីតាំងសម្រាប់ការទាញយកទេ</translation> <translation id="4209895695669353772">ដើម្បីទទួលបានខ្លឹមសារស្របតាមបុគ្គលដែលណែនាំដោយ Google សូមបើកសមកាលកម្ម</translation> <translation id="4225895483398857530">ផ្លូវកាត់របារឧបករណ៍</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">បំពេញការស្វែងរក និង URL ដោយស្វ័យប្រវត្តិ</translation> <translation id="7707922173985738739">ប្រើទិន្នន័យទូរសព្ទចល័ត</translation> <translation id="7725024127233776428">ទំព័រដែលអ្នកចំណាំបង្ហាញនៅទីនេះ</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />ទម្រង់ផ្សេងទៀតនៃសកម្មភាព<ph name="END_LINK1" />អាចត្រូវបានរក្សាទុកនៅក្នុងគណនី Google របស់អ្នក នៅពេលអ្នកចូលគណនី។ អ្នកអាចលុបវាបានគ្រប់ពេល។</translation> <translation id="7757787379047923882">អត្ថបទដែលបានចែករំលែកពី <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">ជ្រើសរើសកាលបរិច្ឆេទ និងម៉ោង</translation> <translation id="7762668264895820836">កាត SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">មើលឯកសារពេលគ្មានអ៊ីនធឺណិតរបស់អ្នក</translation> <translation id="8856607253650333758">យកការពណ៌នា</translation> <translation id="8873817150012960745">ចុចត្រង់នេះ ដើម្បីចាប់ផ្ដើម</translation> +<translation id="8881973373982641723">សម្អាតប្រវត្តិ រួមទាំងប្រវត្តិនៅក្នុងប្រអប់ស្វែងរក។</translation> <translation id="889338405075704026">ចូលទៅកាន់ការកំណត់ Chrome</translation> <translation id="8898822736010347272">បញ្ជូន URL នៃគេហទំព័រមួយចំនួនដែលអ្នកចូលមើល ព័ត៌មានប្រព័ន្ធមួយចំនួន និងខ្លឹមសារទំព័រមួយចំនួនទៅ Google ដើម្បីជួយស្វែងរកការគំរាមកំហែងថ្មី និងការពារអ្នកគ្រប់គ្នានៅលើអ៊ីនធឺណិត។</translation> <translation id="8909135823018751308">ចែករំលែក…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">មិនអាចហៅទូរសព្ទបានទេ</translation> <translation id="9212845824145208577">មិនអាចរំកិលទៅក្រោមជាងនេះទៀតបានទេ។ សូមសាកល្បងចាប់ផ្ដើមពីផ្នែកខាងក្រោមជាងនេះនៅលើទំព័រ។</translation> <translation id="9219103736887031265">រូបភាព</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />ប្រវត្តិស្វែងរក<ph name="END_LINK1" /> និង<ph name="BEGIN_LINK2" />ទម្រង់ផ្សេងទៀតនៃសកម្មភាព<ph name="END_LINK2" />អាចត្រូវបានរក្សាទុកនៅក្នុងគណនី Google របស់អ្នក នៅពេលអ្នកចូលគណនី។ អ្នកអាចលុបវាបានគ្រប់ពេល។</translation> <translation id="926205370408745186">លុបសកម្មភាព Chrome របស់អ្នកពីសុខុមាលភាពឌីជីថល</translation> <translation id="927968626442779827">ប្រើមុខងារស្រាលនៅលើ Google Chrome</translation> <translation id="932327136139879170">ទំព័រដើម</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 566ede0..5eac870 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">언어</translation> <translation id="4183868528246477015">Google 렌즈로 검색 <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="4195643157523330669">새 탭에서 열기</translation> +<translation id="4196597275619698563">카드 만들기</translation> <translation id="4198423547019359126">사용할 수 있는 다운로드 위치가 없음</translation> <translation id="4209895695669353772">Google에서 추천하는 맞춤 콘텐츠를 보려면 동기화를 사용 설정하세요.</translation> <translation id="4225895483398857530">툴바 바로가기</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">검색어 및 URL 자동 완성</translation> <translation id="7707922173985738739">모바일 데이터 사용</translation> <translation id="7725024127233776428">북마크한 페이지가 여기에 표시됩니다.</translation> +<translation id="7731260005404856143">로그인할 경우 <ph name="BEGIN_LINK1" />다른 활동 형식<ph name="END_LINK1" />이 Google 계정에 저장될 수 있습니다. 이러한 데이터는 언제든지 삭제 가능합니다.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />에서 공유된 텍스트</translation> <translation id="7761849928583394409">날짜 및 시간 선택</translation> <translation id="7762668264895820836">SD 카드 <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">오프라인 파일 보기</translation> <translation id="8856607253650333758">설명 보기</translation> <translation id="8873817150012960745">여기를 탭하여 시작</translation> +<translation id="8881973373982641723">검색창에 입력한 내용을 비롯한 기록 삭제</translation> <translation id="889338405075704026">Chrome 설정으로 이동</translation> <translation id="8898822736010347272">모든 웹 사용자에게 영향을 주는 새로운 위협을 발견하고 사용자를 보호하는 데 도움을 주기 위해 방문한 일부 페이지의 URL, 제한된 시스템 정보, 일부 페이지 콘텐츠를 Google로 전송합니다.</translation> <translation id="8909135823018751308">공유…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">전화를 걸 수 없음</translation> <translation id="9212845824145208577">더 이상 아래로 내려갈 수 없습니다. 페이지 더 아래쪽에서 시작해 보세요.</translation> <translation id="9219103736887031265">이미지</translation> +<translation id="923957533152125119">로그인할 경우 <ph name="BEGIN_LINK1" />검색 기록<ph name="END_LINK1" /> 및 <ph name="BEGIN_LINK2" />다른 활동 형식<ph name="END_LINK2" />이 Google 계정에 저장될 수 있습니다. 이러한 데이터는 언제든지 삭제 가능합니다.</translation> <translation id="926205370408745186">디지털 웰빙에서 Chrome 활동 삭제</translation> <translation id="927968626442779827">Chrome에서 라이트 모드를 사용하세요.</translation> <translation id="932327136139879170">홈</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 941878a..834b0e8b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Тилдер</translation> <translation id="4183868528246477015">Google Lens менен издөө <ph name="BEGIN_NEW" />Жаңы<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Жаңы өтмөктө ачуу</translation> +<translation id="4196597275619698563">Карта түзүү</translation> <translation id="4198423547019359126">Жүктөп алуу үчүн жеткиликтүү орун жок</translation> <translation id="4209895695669353772">Google тарабынан сунушталган мазмунду алуу үчүн шайкештирүүнү күйгүзүңүз</translation> <translation id="4225895483398857530">Куралдар тилкесинин ыкчам баскычы</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Издөө сурамдарын жана URL'дерди автоматтык түрдө толтуруу</translation> <translation id="7707922173985738739">Мобилдик Интернетти колдонуу</translation> <translation id="7725024127233776428">Сиз кыстарма катары сактаган барактар ушул жерде көрүнөт</translation> +<translation id="7731260005404856143">Аккаунтуңузга кирип турсаңыз, <ph name="BEGIN_LINK1" />башка аракеттер<ph name="END_LINK1" /> Google аккаунтуңузга сакталышы мүмкүн. Аларды каалаган учурда өчүрө аласыз.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> түзмөгүнөн көчүрүлгөн текст</translation> <translation id="7761849928583394409">Күн жана убакыт тандоо</translation> <translation id="7762668264895820836"><ph name="SD_CARD_NUMBER" />-SD-карта</translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Оффлайн файлдарын көрүү</translation> <translation id="8856607253650333758">Сүрөттөмөлөрдү алуу</translation> <translation id="8873817150012960745">Баштоо үчүн бул жерди таптаңыз</translation> +<translation id="8881973373982641723">Издөө таржымалы, анын ичинде издөө кутучасындагы таржымал тазаланат.</translation> <translation id="889338405075704026">Chrome жөндөөлөрүнө өтүү</translation> <translation id="8898822736010347272">Сиз баш баккан айрым барактардын URL даректерин, чектелген тутум маалыматын жана айрым барактардын мазмунун бардык колдонуучулар үчүн мүмкүн болгон коркунучтарды аныктап, бөгөттөө үчүн Google'га жөнөтөт.</translation> <translation id="8909135823018751308">Бөлүшүү…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Чалуу аткарылбай жатат</translation> <translation id="9212845824145208577">Ылдыйраак өтүү мүмкүн эмес. Барактын ылдый жагынан баштап көрүңүз.</translation> <translation id="9219103736887031265">Сүрөттөр</translation> +<translation id="923957533152125119">Аккаунтуңузга кирип турсаңыз, <ph name="BEGIN_LINK1" />издөө таржымалы<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />башка аракеттер<ph name="END_LINK2" /> Google аккаунтуңузга сакталышы мүмкүн. Аларды каалаган учурда өчүрө аласыз.</translation> <translation id="926205370408745186">Chrome'ду колдонуу дайын-даректериңизди Санариптик бакубаттык кызматынан алып салыңыз</translation> <translation id="927968626442779827">Google Chrome'до Жөнөкөй режимди колдонуңуз</translation> <translation id="932327136139879170">Башкы</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index a480db8..13bfa494 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">ພາສາ</translation> <translation id="4183868528246477015">ຊອກຫາດ້ວຍ Google Lens <ph name="BEGIN_NEW" />ໃໝ່<ph name="END_NEW" /></translation> <translation id="4195643157523330669">ເປີດຢູ່ໃນແຖບໃໝ່</translation> +<translation id="4196597275619698563">ສ້າງບັດ</translation> <translation id="4198423547019359126">ບໍ່ມີບ່ອນບັນທຶກການດາວໂຫຼດທີ່ສາມາດໃຊ້ໄດ້</translation> <translation id="4209895695669353772">ເພື່ອຮັບເນື້ອຫາແບບເປັນສ່ວນຕົວທີ່ແນະນຳໂດຍ Google, ກະລຸນາເປີດການຊິ້ງຂໍ້ມູນກ່ອນ</translation> <translation id="4225895483398857530">ທາງລັດແຖບເຄື່ອງມື</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">ຕື່ມການຊອກຫາ ແລະ URL ໂດຍອັດຕະໂນມັດ</translation> <translation id="7707922173985738739">ໃຊ້ຂໍ້ມູນມືຖື</translation> <translation id="7725024127233776428">ໜ້າທີ່ທ່ານບຸກມາກໄວ້ປາກົດຢູ່ບ່ອນນີ້</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />ການເຄື່ອນໄຫວຮູບແບບອື່ນ<ph name="END_LINK1" /> ອາດຖືກບັນທຶກໄວ້ໃນບັນຊີ Google ຂອງທ່ານເມື່ອທ່ານເຂົ້າສູ່ລະບົບ. ທ່ານສາມາດລຶບພວກມັນຕອນໃດກໍໄດ້.</translation> <translation id="7757787379047923882">ຂໍ້ຄວາມທີ່ແບ່ງປັນຈາກ <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">ເລືອກວັນ ແລະ ເວລາ</translation> <translation id="7762668264895820836">SD ກາດ <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">ເບິ່ງໄຟລ໌ອອບລາຍຂອງທ່ານ</translation> <translation id="8856607253650333758">ຮັບຄຳອະທິບາຍ</translation> <translation id="8873817150012960745">ແຕະບ່ອນນີ້ເພື່ອເລີ່ມຕົ້ນ</translation> +<translation id="8881973373982641723">ລຶບລ້າງປະຫວັດ, ຮວມທັງໃນກ່ອງຊອກຫາ.</translation> <translation id="889338405075704026">ໄປທີ່ການຕັ້ງຄ່າ Chrome</translation> <translation id="8898822736010347272">ສົ່ງ URL ຂອງບາງໜ້າທີ່ທ່ານເຂົ້າເບິ່ງ, ຂໍ້ມູນລະບົບທີ່ຈຳກັດ ແລະ ບາງເນື້ອຫາໃນໜ້າໃຫ້ Google ເພື່ອຊ່ວຍຄົ້ນພົບອັນຕະລາຍໃໝ່ ແລະ ປົກປ້ອງທຸກຄົນໃນເວັບ.</translation> <translation id="8909135823018751308">ແຊຣ໌...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">ບໍ່ສາມາດໂທອອກໄດ້</translation> <translation id="9212845824145208577">ບໍ່ສາມາດລົງໄປຕ່ຳກວ່ານີ້ໄດ້. ໃຫ້ລອງເລີ່ມຈາກທາງລຸ່ມຂອງໜ້າ.</translation> <translation id="9219103736887031265">ຮູບ</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />ປະຫວັດການຊອກຫາ<ph name="END_LINK1" /> ແລະ <ph name="BEGIN_LINK2" />ການເຄື່ອນໄຫວຮູບແບບອື່ນໆ<ph name="END_LINK2" /> ອາດຖືກບັນທຶກໄວ້ໃນບັນຊີ Google ຂອງທ່ານເມື່ອທ່ານເຂົ້າສູ່ລະບົບ. ທ່ານສາມາດລຶບພວກມັນຕອນໃດກໍໄດ້.</translation> <translation id="926205370408745186">ລຶບການເຄື່ອນໄຫວໃນ Chrome ຂອງທ່ານອອກຈາກ Digital Wellbeing</translation> <translation id="927968626442779827">ໃຊ້ໂໝດ Lite ໃນ Google Chrome</translation> <translation id="932327136139879170">ບ້ານ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 8d1b4cf..93d59de 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Kalbos</translation> <translation id="4183868528246477015">Ieškoti su „Google Lens“ <ph name="BEGIN_NEW" />Nauja<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Atidaryti naujame skirtuke</translation> +<translation id="4196597275619698563">Sukurti kortelę</translation> <translation id="4198423547019359126">Nėra pasiekiamų atsisiuntimo vietų</translation> <translation id="4209895695669353772">Jei norite gauti „Google“ siūlomo suasmeninto turinio, įjunkite sinchronizavimą</translation> <translation id="4225895483398857530">Įrankių juostos spartusis klavišas</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Automatiškai užbaigti paieškas ir URL</translation> <translation id="7707922173985738739">Naudoti mobiliojo ryšio duomenis</translation> <translation id="7725024127233776428">Pažymėti puslapiai rodomi čia</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Kitos veiklos formos<ph name="END_LINK1" /> gali būti išsaugotos jūsų „Google“ paskyroje, kai esate prisijungę. Galite bet kada jas ištrinti.</translation> <translation id="7757787379047923882">Tekstas bendrinamas iš „<ph name="DEVICE_NAME" />“</translation> <translation id="7761849928583394409">Pasirinkti datą ir laiką</translation> <translation id="7762668264895820836">SD kortelė Nr. <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Žr. neprisijungus pasiekiamus failus</translation> <translation id="8856607253650333758">Gauti aprašus</translation> <translation id="8873817150012960745">Palieskite čia, kad pradėtumėte</translation> +<translation id="8881973373982641723">Išvaloma istorija, įskaitant paieškos laukelį.</translation> <translation id="889338405075704026">Eiti į „Chrome“ nustatymus</translation> <translation id="8898822736010347272">„Google“ siunčiami kai kurių lankomų puslapių URL, ribota sistemos informacija ir kai kurių puslapių turinys, kad būtų galima aptikti naujas grėsmes ir apsaugoti visus žiniatinklio naudotojus.</translation> <translation id="8909135823018751308">Bendrinti…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nepavyksta skambinti</translation> <translation id="9212845824145208577">Negalima eiti žemiau. Pabandykite pradėti toliau žemiau esančiame puslapyje.</translation> <translation id="9219103736887031265">Vaizdai</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Paieškos istorija<ph name="END_LINK1" /> ir <ph name="BEGIN_LINK2" />kitos veiklos formos<ph name="END_LINK2" /> gali būti išsaugotos jūsų „Google“ paskyroje, kai esate prisijungę. Galite bet kada jas ištrinti.</translation> <translation id="926205370408745186">„Chrome“ veiklos pašalinimas iš Skaitmeninės gerovės</translation> <translation id="927968626442779827">Naudokite supaprastintą režimą naršyklėje „Google Chrome“</translation> <translation id="932327136139879170">Kontaktinė namų informacija</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index 8768878..2b6d7941 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Valodas</translation> <translation id="4183868528246477015">Meklēšana ar Google Lens <ph name="BEGIN_NEW" />Jauns<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Atvērt jaunā cilnē</translation> +<translation id="4196597275619698563">Izveidot kartīti</translation> <translation id="4198423547019359126">Nav pieejamu lejupielādes atrašanās vietu.</translation> <translation id="4209895695669353772">Lai saņemtu Google ieteikto personalizēto saturu, ieslēdziet sinhronizāciju.</translation> <translation id="4225895483398857530">Rīkjoslas īsinājumtaustiņš</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Automātiski pabeigt meklēšanas vaicājumus un vietrāžus URL</translation> <translation id="7707922173985738739">Izmantot mobilos datus</translation> <translation id="7725024127233776428">Šeit tiek rādītas ar grāmatzīmēm atzīmētās lapas</translation> +<translation id="7731260005404856143">Kad esat pierakstījies, jūsu Google kontā var saglabāt <ph name="BEGIN_LINK1" />arī cita veida darbības<ph name="END_LINK1" />. Jebkurā brīdī varat tās dzēst.</translation> <translation id="7757787379047923882">Kopīgots teksts no ierīces <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Datuma un laika izvēle</translation> <translation id="7762668264895820836">SD karte <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Skatīt bezsaistes failus</translation> <translation id="8856607253650333758">Iegūt aprakstus</translation> <translation id="8873817150012960745">Lai sāktu, pieskarieties šeit</translation> +<translation id="8881973373982641723">Tiek notīrīta vēsture, tostarp arī meklēšanas lodziņā.</translation> <translation id="889338405075704026">Pāriet uz Chrome iestatījumiem</translation> <translation id="8898822736010347272">Tiek nosūtīti dažu apmeklēto lapu vietrāži URL, ierobežota sistēmas informācija un noteiktu lapu saturs Google serveriem, lai palīdzētu atklāt jaunus apdraudējumus un aizsargāt visus tīmekļa lietotājus.</translation> <translation id="8909135823018751308">Kopīgot...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nevar zvanīt</translation> <translation id="9212845824145208577">Zemāku ekrāna daļu nevar ietvert. Mēģiniet iegūt ekrānuzņēmumu no zemākas vietas lapā.</translation> <translation id="9219103736887031265">Attēli</translation> +<translation id="923957533152125119">Kad esat pierakstījies, jūsu Google kontā var saglabāt <ph name="BEGIN_LINK1" />meklēšanas vēsturi<ph name="END_LINK1" /> un <ph name="BEGIN_LINK2" />cita veida darbības<ph name="END_LINK2" />. Jebkurā brīdī varat tās dzēst.</translation> <translation id="926205370408745186">Chrome darbību noņemšana no Digitālās labjutības</translation> <translation id="927968626442779827">Izmantojiet Google Chrome vienkāršoto režīmu.</translation> <translation id="932327136139879170">Sākums</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index a16181a..96047dc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Јазици</translation> <translation id="4183868528246477015">Пребарувајте со Google Lens <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Отвори во нова картичка</translation> +<translation id="4196597275619698563">Создај картичка</translation> <translation id="4198423547019359126">Нема достапни локации за преземање</translation> <translation id="4209895695669353772">За да добивате персонализирани содржини предложени од Google, вклучете ја синхронизацијата</translation> <translation id="4225895483398857530">Кратенка за алатникот</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Автоматски довршувај ги пребарувањата и URL-адресите</translation> <translation id="7707922173985738739">Ќе користи мобилен интернет</translation> <translation id="7725024127233776428">Страниците што ќе ги обележите се појавуваат тука</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Други форми на активност<ph name="END_LINK1" /> може да се зачувуваат во вашата сметка на Google кога сте најавени. Може да ги избришете во секое време.</translation> <translation id="7757787379047923882">Текстот е споделен од <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Изберете датум и време</translation> <translation id="7762668264895820836">SD-картичка <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Погледнете ги вашите офлајн датотеки</translation> <translation id="8856607253650333758">Добивај описи</translation> <translation id="8873817150012960745">Допрете тука за да започнете</translation> +<translation id="8881973373982641723">Ја брише историјата, вклучително и во полето за пребарување.</translation> <translation id="889338405075704026">Одете во „Поставки за Chrome“</translation> <translation id="8898822736010347272">Испраќа URL-адреси до Google од некои страници што ги посетувате, како и ограничени податоци за системот и некои содржини од страниците за да помогне да се откријат нови закани и да се заштитат сите на интернет.</translation> <translation id="8909135823018751308">Сподели…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Не може да се упатуваат повици</translation> <translation id="9212845824145208577">Не може да одите пониско. Почнете од подолу на страницата.</translation> <translation id="9219103736887031265">Слики</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Историјата на пребарување<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />други форми на активност<ph name="END_LINK2" /> може да се зачувуваат во вашата сметка на Google кога сте најавени. Може да ги избришете во секое време.</translation> <translation id="926205370408745186">Отстранете ја вашата активност на Chrome од „Дигитална благосостојба“</translation> <translation id="927968626442779827">Користете „Лесен режим“ на Google Chrome</translation> <translation id="932327136139879170">Дома</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 933fd92..96e3df1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Bahasa</translation> <translation id="4183868528246477015">Cari dengan Google Lens <ph name="BEGIN_NEW" />Baharu<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Buka dalam tab baharu</translation> +<translation id="4196597275619698563">Buat kad</translation> <translation id="4198423547019359126">Tiada lokasi muat turun tersedia</translation> <translation id="4209895695669353772">Hidupkan penyegerakan untuk mendapatkan kandungan diperibadikan yang dicadangkan oleh Google</translation> <translation id="4225895483398857530">Pintasan bar alat</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autolengkap carian dan URL</translation> <translation id="7707922173985738739">Gunakan data mudah alih</translation> <translation id="7725024127233776428">Halaman yang anda tandai halaman dipaparkan di sini</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Bentuk aktiviti lain<ph name="END_LINK1" /> mungkin disimpan dalam Akaun Google anda semasa anda dilog masuk. Anda boleh memadamkan data tersebut pada bila-bila masa.</translation> <translation id="7757787379047923882">Teks dikongsi daripada <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Pilih tarikh & masa</translation> <translation id="7762668264895820836">Kad SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Lihat fail luar talian anda</translation> <translation id="8856607253650333758">Dapatkan perihalan</translation> <translation id="8873817150012960745">Ketik di sini untuk bermula</translation> +<translation id="8881973373982641723">Kosongkan sejarah, termasuk item dalam kotak carian.</translation> <translation id="889338405075704026">Pergi ke tetapan Chrome</translation> <translation id="8898822736010347272">Menghantar URL sesetengah halaman yang anda lawati, maklumat sistem yang terhad dan sebahagian kandungan halaman kepada Google untuk menemukan ancaman baharu dan melindungi semua pengguna web.</translation> <translation id="8909135823018751308">Kongsi…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Tidak dapat membuat panggilan</translation> <translation id="9212845824145208577">Tidak dapat pergi lebih rendah. Cuba bermula dari bahagian bawah halaman.</translation> <translation id="9219103736887031265">Imej</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Sejarah carian<ph name="END_LINK1" /> dan <ph name="BEGIN_LINK2" />bentuk aktiviti lain<ph name="END_LINK2" /> mungkin disimpan dalam Akaun Google anda semasa anda dilog masuk. Anda boleh memadamkan data tersebut pada bila-bila masa.</translation> <translation id="926205370408745186">Alih keluar aktiviti Chrome anda daripada Kesejahteraan Digital</translation> <translation id="927968626442779827">Gunakan mod Ringkas pada Google Chrome</translation> <translation id="932327136139879170">Laman Utama</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 1d1317a0..2c5f02a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">ဘာသာစကားများ</translation> <translation id="4183868528246477015">Google Lens <ph name="BEGIN_NEW" />အသစ်<ph name="END_NEW" /> ဖြင့်ရှာခြင်း</translation> <translation id="4195643157523330669">တဘ်အသစ်တွင် ဖွင့်ရန်</translation> +<translation id="4196597275619698563">ကတ်ပြုလုပ်ရန်</translation> <translation id="4198423547019359126">ဒေါင်းလုဒ်တည်နေရာ မရှိပါ</translation> <translation id="4209895695669353772">Google က အကြံပြုထားသည့် ပုဂ္ဂိုလ်ရေးသီးသန့် အကြောင်းအရာများကို ရယူရန် စင့်ခ်လုပ်ခြင်းကို ဖွင့်ပါ</translation> <translation id="4225895483398857530">ကိရိယာဘား ဖြတ်လမ်းလင့်ခ်</translation> @@ -1045,6 +1046,7 @@ <translation id="7704317875155739195">ရှာဖွေမှုများနှင့် URL များကို အလိုအလျောက်ဖြည့်ခြင်း</translation> <translation id="7707922173985738739">မိုဘိုင်းဒေတာကို သုံးရန်</translation> <translation id="7725024127233776428">သင်သိမ်းဆည်းထားသည့် လိပ်စာ၏ စာမျက်နှာများကို ဤနေရာတွင် တွေ့ရပါမည်</translation> +<translation id="7731260005404856143">သင်လက်မှတ်ထိုးဝင်သောအခါ <ph name="BEGIN_LINK1" />အခြားပုံစံဖြင့် လုပ်ဆောင်ချက်<ph name="END_LINK1" /> ကို သင်၏ Google Account တွင် သိမ်းထားနိုင်သည်။ ၎င်းတို့ကို အချိန်မရွေး ဖျက်နိုင်သည်။</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> မှ မျှဝေထားသော စာသား</translation> <translation id="7761849928583394409">ရက်စွဲနှင့် အချိန်ရွေးရန်</translation> <translation id="7762668264895820836">SD ကတ် <ph name="SD_CARD_NUMBER" /></translation> @@ -1235,6 +1237,7 @@ <translation id="8854223127042600341">သင်၏အော့ဖ်လိုင်း ဖိုင်များ ကြည့်ရန်</translation> <translation id="8856607253650333758">ရှင်းလင်းချက်များ ရယူရန်</translation> <translation id="8873817150012960745">စတင်ရန် ဤနေရာကိုတို့ပါ</translation> +<translation id="8881973373982641723">ရှာဖွေစာလုံးဖြည့်ကွက်လပ် အပါအဝင် မှတ်တမ်းကို ရှင်းပေးသည်။</translation> <translation id="889338405075704026">Chrome ဆက်တင်များသို့ သွားရန်</translation> <translation id="8898822736010347272">အန္တရာယ်အသစ်များ ရှာဖွေရာ၌ အထောက်အကူဖြစ်စေရန်နှင့် ဝဘ်ပေါ်ရှိလူတိုင်းကို ကာကွယ်ရန် သင်ဝင်ကြည့်သည့် အချို့ဝဘ်ဆိုက်များ၏ URL များ၊ ကန့်သတ်ထားသည့် စနစ်အချက်အလက်များနှင့် အချို့သော ဝဘ်ဆိုက်ပါအကြောင်းအရာတို့ကို Google သို့ ပို့သည်။</translation> <translation id="8909135823018751308">ၐေမျှရန်...</translation> @@ -1288,6 +1291,7 @@ <translation id="9209888181064652401">ဖုန်းခေါ်၍ မရပါ</translation> <translation id="9212845824145208577">အောက်သို့ထပ်နှိမ့်၍ မရပါ။ စာမျက်နှာ၏ အောက်ဘက်ခပ်ဝေးဝေးမှ စကြည့်ပါ။</translation> <translation id="9219103736887031265">ပုံများ</translation> +<translation id="923957533152125119">သင်လက်မှတ်ထိုးဝင်သောအခါ <ph name="BEGIN_LINK1" />ရှာဖွေမှတ်တမ်း<ph name="END_LINK1" /> နှင့် <ph name="BEGIN_LINK2" />အခြားပုံစံဖြင့် လုပ်ဆောင်ချက်<ph name="END_LINK2" /> တို့ကို သင်၏ Google Account တွင် သိမ်းထားနိုင်သည်။ ၎င်းတို့ကို အချိန်မရွေး ဖျက်နိုင်သည်။</translation> <translation id="926205370408745186">'ဒစ်ဂျစ်တယ် အာရောဂျံ' မှနေ၍ သင်၏ Chrome လုပ်ဆောင်ချက်ကို ဖယ်ရှားခြင်း</translation> <translation id="927968626442779827">Google Chrome တွင် အပေါ့စားမုဒ် သုံးရန်</translation> <translation id="932327136139879170">ပင်မ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index fa759ab..68efff3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">भाषाहरू</translation> <translation id="4183868528246477015">Google Lens प्रयोग गरी खोज्नुहोस् <ph name="BEGIN_NEW" />नयाँ<ph name="END_NEW" /></translation> <translation id="4195643157523330669">नयाँ ट्याबमा खोल्नुहोस्</translation> +<translation id="4196597275619698563">कार्ड बनाउनुहोस्</translation> <translation id="4198423547019359126">डाउनलोडसम्बन्धी कुनै पनि स्थानहरू उपलब्ध छैनन्</translation> <translation id="4209895695669353772">Google ले सिफारिस गरेको वैयक्तीकृत सामग्री प्राप्त गर्न सिंक गर्ने सुविधा सक्रिय गर्नुहोस्</translation> <translation id="4225895483398857530">टुलबारको सर्टकट</translation> @@ -1045,6 +1046,7 @@ <translation id="7704317875155739195">खोज तथा URL हरू स्वतः पूर्ण गर्नुहोस्</translation> <translation id="7707922173985738739">मोबाइल डेटा प्रयोग गर्नुहोस्</translation> <translation id="7725024127233776428">तपाईंले पुस्तक चिन्ह लगाउनुभएका पृष्ठहरू यहाँ देखिन्छन्</translation> +<translation id="7731260005404856143">तपाईंले आफ्नो Google खातामा साइन इन गर्नुभएका बेला सो खातामा <ph name="BEGIN_LINK1" />अन्य किसिमका क्रियाकलाप<ph name="END_LINK1" /> सेभ गरिन सक्छ। तपाईं जुनसुकै बेला ती क्रियाकलाप मेटाउन सक्नुहुन्छ।</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ले आदान प्रदान गरेको पाठ</translation> <translation id="7761849928583394409">मिति र समय रोज्नुहोस्</translation> <translation id="7762668264895820836">SD कार्ड <ph name="SD_CARD_NUMBER" /></translation> @@ -1235,6 +1237,7 @@ <translation id="8854223127042600341">आफ्ना अफलाइन फाइलहरू हेर्नुहोस्</translation> <translation id="8856607253650333758">विवरणहरू प्राप्त गर्नुहोस्</translation> <translation id="8873817150012960745">सुरु गर्न यहाँ ट्याप गर्नुहोस्</translation> +<translation id="8881973373982641723">यसले खोज बाकसको इतिहासलगायतका ब्राउजिङ इतिहास मेटाउँछ।</translation> <translation id="889338405075704026">Chrome को सेटिङमा जानुहोस्</translation> <translation id="8898822736010347272">नयाँ खतराहरू पत्ता लगाउन र वेब प्रयोग गर्ने सम्पूर्ण प्रयोगकर्ताहरूलाई सुरक्षित राख्न Google लाई तपाईंले हेर्ने केही पृष्ठका URL, प्रणालीसम्बन्धी निश्चित जानकारी र पृष्ठका केही सामग्रीहरू पठाउँछ।</translation> <translation id="8909135823018751308">साझा गर्नुहोस्...</translation> @@ -1288,6 +1291,7 @@ <translation id="9209888181064652401">कल गर्न सकिएन</translation> <translation id="9212845824145208577">योभन्दा तल जान मिल्दैन। यो पेजको अझै तल्लो भागबाट ड्रयाग गरी हेर्नुहोस्।</translation> <translation id="9219103736887031265">फोटो</translation> +<translation id="923957533152125119">तपाईंले आफ्नो Google खातामा साइन इन गर्नुभएका बेला सो खातामा <ph name="BEGIN_LINK1" />खोजको इतिहास<ph name="END_LINK1" /> र <ph name="BEGIN_LINK2" />अन्य किसिमका क्रियाकलाप<ph name="END_LINK2" /> सेभ गरिन सक्छ। तपाईं जुनसुकै बेला तिनलाई मेटाउन सक्नुहुन्छ।</translation> <translation id="926205370408745186">आफूले Chrome मा गरेका क्रियाकलाप डिजिटल वेलबिइङबाट हटाउनुहोस्</translation> <translation id="927968626442779827">Google Chrome को लाइट मोड प्रयोग गर्नुहोस्</translation> <translation id="932327136139879170">गृहपृष्ठ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 03364dc7..10b6269d 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
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Språk</translation> <translation id="4183868528246477015">Søk med Google Lens <ph name="BEGIN_NEW" />Nyhet<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Åpne i ny fane</translation> +<translation id="4196597275619698563">Opprett et kort</translation> <translation id="4198423547019359126">Ingen tilgjengelige nedlastingssteder</translation> <translation id="4209895695669353772">For å få forslag om personlig tilpasset innhold fra Google, slå på synkronisering</translation> <translation id="4225895483398857530">Verktøylinje-snarvei</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autofullfør søk og nettadresser</translation> <translation id="7707922173985738739">Bruk mobildata</translation> <translation id="7725024127233776428">Sider du setter som bokmerker, vises her</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Andre typer aktivitet<ph name="END_LINK1" /> kan bli lagret i Google-kontoen din når du er pålogget. Du kan når som helst slette dem.</translation> <translation id="7757787379047923882">Tekst delt fra <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Velg dato og klokkeslett</translation> <translation id="7762668264895820836">SD-kort <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Se filene dine uten nett</translation> <translation id="8856607253650333758">Få beskrivelser</translation> <translation id="8873817150012960745">Trykk her for å begynne</translation> +<translation id="8881973373982641723">Tømmer loggen, inkludert loggen i søkefeltet.</translation> <translation id="889338405075704026">Gå til Chrome-innstillingene</translation> <translation id="8898822736010347272">Sender nettadresser for noen av sidene du besøker, begrenset systeminformasjon og noe sideinnhold til Google for å bidra til å oppdage nye trusler og beskytte alle på nettet.</translation> <translation id="8909135823018751308">Del</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Kan ikke ringe</translation> <translation id="9212845824145208577">Kan ikke gå lavere. Prøv å starte fra lenger ned på siden.</translation> <translation id="9219103736887031265">Bilder</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Søkeloggen<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />andre typer aktivitet<ph name="END_LINK2" /> kan bli lagret i Google-kontoen din når du er pålogget. Du kan når som helst slette dem.</translation> <translation id="926205370408745186">Fjerne Chrome-aktiviteten din fra Digital balanse</translation> <translation id="927968626442779827">Bruk forenklet modus i Google Chrome</translation> <translation id="932327136139879170">Gå til startsiden</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 842c1290..80a6a52 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Języki</translation> <translation id="4183868528246477015">Szukaj z Obiektywem Google <ph name="BEGIN_NEW" />Nowość<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Otwórz w nowej karcie</translation> +<translation id="4196597275619698563">Utwórz kartę</translation> <translation id="4198423547019359126">Brak dostępnych miejsc zapisu pobieranych plików</translation> <translation id="4209895695669353772">Aby uzyskać dostęp do spersonalizowanej treści proponowanej przez Google, włącz synchronizację</translation> <translation id="4225895483398857530">Skrót na pasku narzędzi</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autouzupełniaj wyszukiwania i adresy URL</translation> <translation id="7707922173985738739">Użycie mobilnej transmisji danych</translation> <translation id="7725024127233776428">Tutaj pojawią się strony, które dodasz do zakładek</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Inne formy aktywności<ph name="END_LINK1" /> mogą być zapisywane na Twoim koncie Google, gdy się zalogujesz. Te wpisy możesz w każdej chwili usunąć.</translation> <translation id="7757787379047923882">Tekst udostępniony z urządzenia <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Wybierz datę i godzinę</translation> <translation id="7762668264895820836">Karta SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Zobacz pliki offline</translation> <translation id="8856607253650333758">Pobieraj opisy obrazów</translation> <translation id="8873817150012960745">Kliknij tutaj, by rozpocząć</translation> +<translation id="8881973373982641723">Usuwa historię, również z pola wyszukiwania.</translation> <translation id="889338405075704026">Otwórz ustawienia Chrome</translation> <translation id="8898822736010347272">Wysyła do Google adresy URL niektórych odwiedzanych przez Ciebie stron, niektóre informacje o systemie i niektóre treści ze stron, by pomóc w wykrywaniu nowych zagrożeń i chronić wszystkich użytkowników internetu.</translation> <translation id="8909135823018751308">Udostępnij…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nie można wykonywać połączeń</translation> <translation id="9212845824145208577">Nie można przejść niżej. Zacznij w dolnej części strony.</translation> <translation id="9219103736887031265">Grafika</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Historia wyszukiwania<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />inne formy aktywności<ph name="END_LINK2" /> mogą być zapisywane na Twoim koncie Google, gdy się zalogujesz. Te wpisy możesz w każdej chwili usunąć.</translation> <translation id="926205370408745186">Usuwa Twoją aktywność w Chrome z Cyfrowej równowagi</translation> <translation id="927968626442779827">Użyj wersji uproszczonej w Google Chrome</translation> <translation id="932327136139879170">Strona główna</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index ed41ab4..ba940506 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Idiomas</translation> <translation id="4183868528246477015">Pesquisar com Google Lens <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Abrir em uma nova guia</translation> +<translation id="4196597275619698563">Criar card</translation> <translation id="4198423547019359126">Não há locais de download disponíveis</translation> <translation id="4209895695669353772">Para receber conteúdo personalizado sugerido pelo Google, ative a sincronização</translation> <translation id="4225895483398857530">Atalho da barra de ferramentas</translation> @@ -1047,6 +1048,7 @@ <translation id="7704317875155739195">Preencher automaticamente pesquisas e URLs</translation> <translation id="7707922173985738739">Usar dados móveis</translation> <translation id="7725024127233776428">As páginas favoritas são exibidas aqui</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Outras formas de atividade<ph name="END_LINK1" /> poderão ser salvas na sua Conta do Google quando ela estiver conectada. Você pode excluir esses dados a qualquer momento.</translation> <translation id="7757787379047923882">Texto compartilhado por <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Escolher data e hora</translation> <translation id="7762668264895820836">Cartão SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1237,6 +1239,7 @@ <translation id="8854223127042600341">Ver seus arquivos off-line</translation> <translation id="8856607253650333758">Ver descrições</translation> <translation id="8873817150012960745">Toque aqui para começar</translation> +<translation id="8881973373982641723">Limpa o histórico, inclusive da caixa de pesquisa.</translation> <translation id="889338405075704026">Acesse as configurações do Chrome</translation> <translation id="8898822736010347272">Envia ao Google URLs de algumas páginas que você visita, informações do sistema limitadas e parte do conteúdo das páginas para ajudar a descobrir novas ameaças e proteger todos os usuários na Web.</translation> <translation id="8909135823018751308">Compartilhar...</translation> @@ -1290,6 +1293,7 @@ <translation id="9209888181064652401">Não é possível fazer chamadas</translation> <translation id="9212845824145208577">Não é possível descer mais. Tente começar a arrastar mais abaixo na página.</translation> <translation id="9219103736887031265">Imagens</translation> +<translation id="923957533152125119">O <ph name="BEGIN_LINK1" />histórico de pesquisa<ph name="END_LINK1" /> e <ph name="BEGIN_LINK2" />outras formas de atividade<ph name="END_LINK2" /> poderão ficar armazenados na sua Conta do Google quando ela estiver conectada. Você pode excluir esses dados a qualquer momento.</translation> <translation id="926205370408745186">Remover sua atividade do Chorme do Bem-estar digital</translation> <translation id="927968626442779827">Use o Modo Lite no Google Chrome</translation> <translation id="932327136139879170">Início</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index aa78f234..d2d2673f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Idiomas</translation> <translation id="4183868528246477015">Pesquisar com Google Lens <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Abrir num novo separador</translation> +<translation id="4196597275619698563">Criar cartão</translation> <translation id="4198423547019359126">Não existem localizações de transferência disponíveis.</translation> <translation id="4209895695669353772">Para obter conteúdo personalizado sugerido pelo Google, ative a sincronização.</translation> <translation id="4225895483398857530">Atalho da barra de ferramentas</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Pesquisas de preenchimento automático e URLs</translation> <translation id="7707922173985738739">Utilizar dados móveis</translation> <translation id="7725024127233776428">As páginas que adiciona aos marcadores aparecem aqui.</translation> +<translation id="7731260005404856143">Podem ser guardadas <ph name="BEGIN_LINK1" />outras formas de atividade<ph name="END_LINK1" /> na sua Conta Google quando tem sessão iniciada. Pode eliminá-las em qualquer altura.</translation> <translation id="7757787379047923882">Texto partilhado a partir do dispositivo <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Escolher data e hora</translation> <translation id="7762668264895820836">Cartão SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Veja os seus ficheiros offline</translation> <translation id="8856607253650333758">Obter descrições</translation> <translation id="8873817150012960745">Toque aqui para começar.</translation> +<translation id="8881973373982641723">Limpa o histórico, incluindo na caixa de pesquisa.</translation> <translation id="889338405075704026">Aceder às definições do Chrome</translation> <translation id="8898822736010347272">Envia URLs de algumas páginas que visita, informações limitadas do sistema e algum conteúdo das páginas para a Google para ajudar a detetar novas ameaças e a proteger todos os utilizadores na Web.</translation> <translation id="8909135823018751308">Partilhar…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Não é possível efetuar chamadas</translation> <translation id="9212845824145208577">Não é possível descer mais. Tente começar mais abaixo na página.</translation> <translation id="9219103736887031265">Imagens</translation> +<translation id="923957533152125119">O <ph name="BEGIN_LINK1" />histórico de pesquisas<ph name="END_LINK1" /> e <ph name="BEGIN_LINK2" />outras formas de atividade<ph name="END_LINK2" /> podem ser guardados na sua Conta Google quando tem sessão iniciada. Pode eliminá-los em qualquer altura.</translation> <translation id="926205370408745186">Remova a atividade do Chrome do Bem-estar digital</translation> <translation id="927968626442779827">Utilize o Modo Lite no Google Chrome.</translation> <translation id="932327136139879170">Página inicial</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 00ce47e..f286711a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Limbi</translation> <translation id="4183868528246477015">Caută folosind Google Lens <ph name="BEGIN_NEW" />Nou<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Deschide în filă nouă</translation> +<translation id="4196597275619698563">Creează un card</translation> <translation id="4198423547019359126">Nu există locații de descărcare disponibile</translation> <translation id="4209895695669353772">Pentru a obține sugestii de conținut personalizat de la Google, activează sincronizarea</translation> <translation id="4225895483398857530">Comanda rapidă spre bara de instrumente</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Completează automat căutările și adresele URL</translation> <translation id="7707922173985738739">va folosi datele mobile;</translation> <translation id="7725024127233776428">Paginile pe care le marchezi apar aici</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Alte tipuri de activități<ph name="END_LINK1" /> pot fi salvate în Contul Google dacă te-ai conectat. Le poți șterge oricând.</translation> <translation id="7757787379047923882">Text trimis de pe <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Alege data și ora</translation> <translation id="7762668264895820836">Cardul SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Vezi fișierele offline</translation> <translation id="8856607253650333758">Generează descrieri</translation> <translation id="8873817150012960745">Atinge aici pentru a începe</translation> +<translation id="8881973373982641723">Șterge istoricul, inclusiv din caseta de căutare.</translation> <translation id="889338405075704026">Accesează setările Chrome</translation> <translation id="8898822736010347272">Trimite la Google adrese URL ale unor pagini pe care le accesezi, informații despre sistem limitate și o parte din conținutul paginii pentru a identifica amenințările noi și a proteja toți utilizatorii de pe web.</translation> <translation id="8909135823018751308">Trimite…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nu pot apela</translation> <translation id="9212845824145208577">Nu se poate selecta mai jos. Începe selecția în pagină de mai jos.</translation> <translation id="9219103736887031265">Imagini</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Istoricul căutărilor<ph name="END_LINK1" /> și <ph name="BEGIN_LINK2" />alte tipuri de activități<ph name="END_LINK2" /> pot fi salvate în Contul Google dacă te-ai conectat. Le poți șterge oricând.</translation> <translation id="926205370408745186">Elimină activitatea în Chrome din Bunăstarea digitală</translation> <translation id="927968626442779827">Folosește modul Lite în Google Chrome</translation> <translation id="932327136139879170">Pagina de pornire</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 934d8a52..e4cd6cd2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Языки</translation> <translation id="4183868528246477015">Найти через Google Объектив <ph name="BEGIN_NEW" />Новинка<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Открыть в новой вкладке</translation> +<translation id="4196597275619698563">Создать карту</translation> <translation id="4198423547019359126">Нет доступных мест для скачивания</translation> <translation id="4209895695669353772">Чтобы мы могли рекомендовать вам интересный контент, включите синхронизацию.</translation> <translation id="4225895483398857530">Кнопка на панели инструментов</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Заполнять поисковые запросы и URL автоматически</translation> <translation id="7707922173985738739">Использовать мобильный Интернет</translation> <translation id="7725024127233776428">Здесь будут страницы, которые вы добавляете в закладки.</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Другие действия<ph name="END_LINK1" /> могут сохраняться в аккаунте Google, если вы в него вошли. Их можно удалить в любой момент.</translation> <translation id="7757787379047923882">Текст с устройства <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Выбрать дату и время</translation> <translation id="7762668264895820836">SD-карта <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Посмотреть скачанные файлы</translation> <translation id="8856607253650333758">Генерировать описания</translation> <translation id="8873817150012960745">Нажмите здесь, чтобы начать</translation> +<translation id="8881973373982641723">История будет удалена, в том числе в окне поиска</translation> <translation id="889338405075704026">Открыть настройки Chrome</translation> <translation id="8898822736010347272">Отправлять в Google URL и контент некоторых посещенных страниц, а также определенную информацию о системе (это помогает обнаруживать новые угрозы и защищать всех пользователей Интернета)</translation> <translation id="8909135823018751308">Поделиться...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Звонки недоступны</translation> <translation id="9212845824145208577">Не удается прокрутить дальше вниз. Начните делать скриншот ниже на этой странице.</translation> <translation id="9219103736887031265">Картинки</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />История поиска<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />другие действия<ph name="END_LINK2" /> могут сохраняться в аккаунте Google, если вы в него вошли. Их можно удалить в любой момент.</translation> <translation id="926205370408745186">Удалить данные о действиях в Chrome из сервиса "Цифровое благополучие"</translation> <translation id="927968626442779827">Попробуйте упрощенный режим в Google Chrome.</translation> <translation id="932327136139879170">Главная страница</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index c6cd2de..34ed131a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Jazyky</translation> <translation id="4183868528246477015">Hľadať cez Google Lens <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Otvoriť na novej karte</translation> +<translation id="4196597275619698563">Vytvoriť kartu</translation> <translation id="4198423547019359126">Nie sú k dispozícii žiadne umiestnenia stiahnutých súborov</translation> <translation id="4209895695669353772">Ak chcete získavať prispôsobený obsah navrhnutý Googlom, zapnite synchronizáciu</translation> <translation id="4225895483398857530">Skratka panela s nástrojmi</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Automaticky dopĺňať vyhľadávania a webové adresy</translation> <translation id="7707922173985738739">Používať mobilné dáta</translation> <translation id="7725024127233776428">Tu sa zobrazia vaše stránky uložené ako záložky</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Iné formy aktivity<ph name="END_LINK1" /> sa môžu ukladať do vášho účtu Google, keď sa doň prihlásite. Tieto položky môžete kedykoľvek odstrániť.</translation> <translation id="7757787379047923882">Text zdieľaný zo zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Vybrať dátum a čas</translation> <translation id="7762668264895820836">SD karta <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Zobraziť offline súbory</translation> <translation id="8856607253650333758">Získať popisy</translation> <translation id="8873817150012960745">Začnite klepnutím tu</translation> +<translation id="8881973373982641723">Vymaže históriu (aj vo vyhľadávacom poli).</translation> <translation id="889338405075704026">Prejsť do nastavení Chromu</translation> <translation id="8898822736010347272">Odosiela webové adresy niektorých navštívených stránok, obmedzené informácie o systéme a určitý obsah stránok, aby pomáhalo objavovať nové hrozby a chrániť všetkých na internete.</translation> <translation id="8909135823018751308">Zdieľať…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Nedá sa volať</translation> <translation id="9212845824145208577">Nižšie to už nejde. Skúste začať nižšie na stránke.</translation> <translation id="9219103736887031265">Obrázky</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />História vyhľadávania<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />ďalšie formy aktivity<ph name="END_LINK2" /> sa môžu ukladať do vášho účtu Google, keď sa doň prihlásite. Tieto položky môžete kedykoľvek odstrániť.</translation> <translation id="926205370408745186">Odstránenie aktivity v Chrome z digitálnej rovnováhy</translation> <translation id="927968626442779827">Používanie zjednodušeného režimu v prehliadači Google Chrome</translation> <translation id="932327136139879170">Domov</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index e851931..c428eb5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Jeziki</translation> <translation id="4183868528246477015">Iskanje z Google Lens <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Odpri v novem zavihku</translation> +<translation id="4196597275619698563">Ustvari kartico</translation> <translation id="4198423547019359126">Ni razpoložljivih mest za prenos</translation> <translation id="4209895695669353772">Če želite prejemati prilagojeno vsebino, ki jo predlaga Google, vklopite sinhronizacijo</translation> <translation id="4225895483398857530">Bližnjica do orodne vrstice</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Samodejno dokončanje iskanj in URL-jev</translation> <translation id="7707922173985738739">Uporaba prenosa podatkov v mobilnem omrežju</translation> <translation id="7725024127233776428">Strani, ki jih dodate med zaznamke, so prikazane tukaj</translation> +<translation id="7731260005404856143">Ko ste prijavljeni, se v računu Google morda shranjujejo <ph name="BEGIN_LINK1" />druge oblike dejavnosti<ph name="END_LINK1" />. Kadar koli jih lahko izbrišete.</translation> <translation id="7757787379047923882">Besedilo v skupni rabi iz naprave <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Izberi datum in uro</translation> <translation id="7762668264895820836">Kartica SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Ogled datotek, ki so na voljo brez povezave</translation> <translation id="8856607253650333758">Pridobivanje opisov</translation> <translation id="8873817150012960745">Dotaknite se tu, če želite začeti.</translation> +<translation id="8881973373982641723">Izbriše zgodovino, vključno s tisto v iskalnem polju.</translation> <translation id="889338405075704026">Odprite nastavitve Chroma</translation> <translation id="8898822736010347272">Pošilja URL-je nekaterih strani, ki jih obiščete, omejene podatke o sistemu in nekatere vsebine strani Googlu zaradi pomoči pri odkrivanju novih groženj in zaščiti vseh uporabnikov v spletu.</translation> <translation id="8909135823018751308">Skupna raba …</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Ni mogoče klicati</translation> <translation id="9212845824145208577">Nižje se ni mogoče pomakniti. Poskusite začeti nižje na strani.</translation> <translation id="9219103736887031265">Slike</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Zgodovina iskanja<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />druge oblike dejavnosti<ph name="END_LINK2" /> se morda shranjujejo v računu Google, ko ste prijavljeni. Kadar koli jih lahko izbrišete.</translation> <translation id="926205370408745186">Odstranitev dejavnosti v Chromu iz Digitalne dobrobiti</translation> <translation id="927968626442779827">Uporabite lahki način v Google Chromu</translation> <translation id="932327136139879170">Domov</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index c65b4b9..76e100fa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Jezici</translation> <translation id="4183868528246477015">Traži uz Google objektiv <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Otvori na novoj kartici</translation> +<translation id="4196597275619698563">Napravi karticu</translation> <translation id="4198423547019359126">Nema dostupnih lokacija za preuzimanja</translation> <translation id="4209895695669353772">Da biste dobijali personalizovani sadržaj koji predlaže Google, uključite sinhronizaciju</translation> <translation id="4225895483398857530">Prečica za traku s alatkama</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Automatski dovršavaj pretrage i URL-ove</translation> <translation id="7707922173985738739">Koristi mobilne podatke</translation> <translation id="7725024127233776428">Stranice koje obeležite se prikazuju ovde</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Drugi oblici aktivnosti<ph name="END_LINK1" /> mogu da se sačuvaju na Google nalogu kada ste prijavljeni. Možete da ih izbrišete u bilo kom trenutku.</translation> <translation id="7757787379047923882">Tekst deljen sa uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Izaberite datum i vreme</translation> <translation id="7762668264895820836">SD kartica <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Pogledajte oflajn datoteke</translation> <translation id="8856607253650333758">Preuzimaj opise</translation> <translation id="8873817150012960745">Dodirnite ovde da biste započeli</translation> +<translation id="8881973373982641723">Briše istoriju, uključujući istoriju u okviru za pretragu.</translation> <translation id="889338405075704026">Idite u podešavanja Chrome-a</translation> <translation id="8898822736010347272">Šalje Google-u URL-ove nekih stranica koje posećujete, ograničene informacije o sistemu i određeni sadržaj stranica da bi se otkrile nove pretnje i zaštitili svi širom veba.</translation> <translation id="8909135823018751308">Deli...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Upućivanje poziva nije uspelo</translation> <translation id="9212845824145208577">Ne možete da odete niže. Probajte da počnete sa manje visine na stranici.</translation> <translation id="9219103736887031265">Slike</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Istorija pretrage<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />drugi oblici aktivnosti<ph name="END_LINK2" /> mogu da budu sačuvani na Google nalogu kada ste prijavljeni. Možete da ih izbrišete u bilo kom trenutku.</translation> <translation id="926205370408745186">Uklonite Chrome aktivnosti iz Digitalnog blagostanja</translation> <translation id="927968626442779827">Koristite Lite režim u Google Chrome-u</translation> <translation id="932327136139879170">Početna</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index c119529..8f1dd65 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Језици</translation> <translation id="4183868528246477015">Тражи уз Google објектив <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Отвори на новој картици</translation> +<translation id="4196597275619698563">Направи картицу</translation> <translation id="4198423547019359126">Нема доступних локација за преузимања</translation> <translation id="4209895695669353772">Да бисте добијали персонализовани садржај који предлаже Google, укључите синхронизацију</translation> <translation id="4225895483398857530">Пречица за траку с алаткама</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Аутоматски довршавај претраге и URL-ове</translation> <translation id="7707922173985738739">Користи мобилне податке</translation> <translation id="7725024127233776428">Странице које обележите се приказују овде</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Други облици активности<ph name="END_LINK1" /> могу да се сачувају на Google налогу када сте пријављени. Можете да их избришете у било ком тренутку.</translation> <translation id="7757787379047923882">Текст дељен са уређаја <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Изаберите датум и време</translation> <translation id="7762668264895820836">SD картица <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Погледајте офлајн датотеке</translation> <translation id="8856607253650333758">Преузимај описе</translation> <translation id="8873817150012960745">Додирните овде да бисте започели</translation> +<translation id="8881973373982641723">Брише историју, укључујући историју у оквиру за претрагу.</translation> <translation id="889338405075704026">Идите у подешавања Chrome-а</translation> <translation id="8898822736010347272">Шаље Google-у URL-ове неких страница које посећујете, ограничене информације о систему и одређени садржај страница да би се откриле нове претње и заштитили сви широм веба.</translation> <translation id="8909135823018751308">Дели...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Упућивање позива није успело</translation> <translation id="9212845824145208577">Не можете да одете ниже. Пробајте да почнете са мање висине на страници.</translation> <translation id="9219103736887031265">Слике</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Историја претраге<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />други облици активности<ph name="END_LINK2" /> могу да буду сачувани на Google налогу када сте пријављени. Можете да их избришете у било ком тренутку.</translation> <translation id="926205370408745186">Уклоните Chrome активности из Дигиталног благостања</translation> <translation id="927968626442779827">Користите Lite режим у Google Chrome-у</translation> <translation id="932327136139879170">Почетна</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 610b226f..0b2572b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Språk</translation> <translation id="4183868528246477015">Sök med Google Lens <ph name="BEGIN_NEW" />Nyhet<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Öppna i ny flik</translation> +<translation id="4196597275619698563">Skapa kort</translation> <translation id="4198423547019359126">Det fins inga tillgängliga nedladdningsplatser</translation> <translation id="4209895695669353772">Aktivera synkronisering om du vill få förslag på anpassat innehåll från Google</translation> <translation id="4225895483398857530">Genväg i verktygsfältet</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Autoslutför sökningar och webbadresser</translation> <translation id="7707922173985738739">Mobildata används</translation> <translation id="7725024127233776428">Sidor som infogats som bokmärke visas här</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Annan aktivitet<ph name="END_LINK1" /> kan sparas i Google-kontot när du är inloggad. Du kan när som helst radera informationen.</translation> <translation id="7757787379047923882">Texten delades från <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Välj datum och tid</translation> <translation id="7762668264895820836">SD-kort <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Se dina offlinefiler</translation> <translation id="8856607253650333758">Få beskrivningar</translation> <translation id="8873817150012960745">Börja genom att trycka här</translation> +<translation id="8881973373982641723">Rensar historiken, inklusive från sökrutan.</translation> <translation id="889338405075704026">Öppna Chrome-inställningarna</translation> <translation id="8898822736010347272">Skickar webbadresser till vissa sidor som du besöker, vissa systemuppgifter och visst sidinnehåll till Google för att upptäcka och blockera nya hot och skydda alla användare på internet.</translation> <translation id="8909135823018751308">Dela …</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Det går inte att ringa</translation> <translation id="9212845824145208577">Markeringen kan inte utökas mer i riktning nedåt. Testa att börja någonstans längre ned på sidan.</translation> <translation id="9219103736887031265">Bilder</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Sökhistorik<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />annan aktivitet<ph name="END_LINK2" /> kan sparas i Google-kontot när du är inloggad. Du kan när som helst radera informationen.</translation> <translation id="926205370408745186">Ta bort din aktivitet i Chrome från Digitalt välmående</translation> <translation id="927968626442779827">Använd begränsat läge i Google Chrome</translation> <translation id="932327136139879170">Startsida</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index f673e2c..0d120bb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Lugha</translation> <translation id="4183868528246477015">Tafuta na Lenzi ya Google <ph name="BEGIN_NEW" />Mpya<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Fungua katika kichupo kipya</translation> +<translation id="4196597275619698563">Weka kadi</translation> <translation id="4198423547019359126">Hakuna maeneno ya upakuaji</translation> <translation id="4209895695669353772">Washa kipengele cha usawazishaji ili Google ikupendekezee maudhui yanayokufaa</translation> <translation id="4225895483398857530">Njia ya mkato ya upau wa vidhibiti</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Jaza kiotomatiki URL na hoja za utafutaji</translation> <translation id="7707922173985738739">Tumia data ya mtandao wa simu</translation> <translation id="7725024127233776428">Kurasa unazoalamisha zitaonekana hapa</translation> +<translation id="7731260005404856143">Huenda <ph name="BEGIN_LINK1" />aina nyingine za shughuli<ph name="END_LINK1" /> zikahifadhiwa kwenye Akaunti yako ya Google ukiwa umeingia katika akaunti. Unaweza kuzifuta wakati wowote.</translation> <translation id="7757787379047923882">Maandishi yameshirikiwa kutoka <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Chagua tarehe na saa</translation> <translation id="7762668264895820836">Kadi ya SD ya <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Angalia faili zako za nje ya mtandao</translation> <translation id="8856607253650333758">Pata maelezo</translation> <translation id="8873817150012960745">Gusa hapa ili uanze</translation> +<translation id="8881973373982641723">Hufuta historia, ikiwa ni pamoja na iliyo kwenye kisanduku cha kutafutia.</translation> <translation id="889338405075704026">Nenda kwenye mipangilio ya Chrome</translation> <translation id="8898822736010347272">Hutuma URL za baadhi ya kurasa unazotembelea, maelezo machache ya mfumo na baadhi ya maudhui ya kurasa kwa Google, ili kusaidia kugundua na kuzuia vitisho vipya na kulinda kila mtu kwenye wavuti.</translation> <translation id="8909135823018751308">Shiriki...</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Imeshindwa kupiga simu</translation> <translation id="9212845824145208577">Huwezi kwenda chini zaidi ya hapo. Jaribu kuanzia sehemu ya chini zaidi ya ukurasa.</translation> <translation id="9219103736887031265">Picha</translation> +<translation id="923957533152125119">Huenda <ph name="BEGIN_LINK1" />historia ya mambo uliyotafuta<ph name="END_LINK1" /> na <ph name="BEGIN_LINK2" />aina nyingine za shughuli<ph name="END_LINK2" /> zikahifadhiwa kwenye Akaunti yako ya Google ukiwa umeingia katika akaunti. Unaweza kuzifuta wakati wowote.</translation> <translation id="926205370408745186">Ondoa shughuli zako za Chrome kwenye mpango wa Nidhamu Dijitali</translation> <translation id="927968626442779827">Tumia Hali Nyepesi kwenye Google Chrome</translation> <translation id="932327136139879170">Mwanzo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 70a886e..49ed28a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">ภาษา</translation> <translation id="4183868528246477015">ค้นหาด้วย Google Lens <ph name="BEGIN_NEW" />ใหม่<ph name="END_NEW" /></translation> <translation id="4195643157523330669">เปิดในแท็บใหม่</translation> +<translation id="4196597275619698563">สร้างการ์ด</translation> <translation id="4198423547019359126">ไม่มีตำแหน่งการดาวน์โหลดที่ใช้ได้</translation> <translation id="4209895695669353772">เปิดการซิงค์เพื่อรับคำแนะนำเนื้อหาที่ปรับเปลี่ยนในแบบของคุณจาก Google</translation> <translation id="4225895483398857530">ทางลัดแถบเครื่องมือ</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">เติมข้อความค้นหาและ URL อัตโนมัติ</translation> <translation id="7707922173985738739">ใช้เน็ตมือถือ</translation> <translation id="7725024127233776428">หน้าที่คุณบุ๊กมาร์กไว้จะปรากฏที่นี่</translation> +<translation id="7731260005404856143">ระบบอาจบันทึก<ph name="BEGIN_LINK1" />กิจกรรมรูปแบบอื่น<ph name="END_LINK1" />ในบัญชี Google เมื่อคุณลงชื่อเข้าใช้ คุณลบกิจกรรมดังกล่าวได้ทุกเมื่อ</translation> <translation id="7757787379047923882">ข้อความที่แชร์จาก <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">เลือกวันที่และเวลา</translation> <translation id="7762668264895820836">การ์ด SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">ดูไฟล์ออฟไลน์</translation> <translation id="8856607253650333758">รับคำอธิบาย</translation> <translation id="8873817150012960745">แตะที่นี่เพื่อเริ่มต้นใช้งาน</translation> +<translation id="8881973373982641723">ล้างประวัติการเข้าชม รวมถึงสิ่งที่อยู่ในช่องค้นหา</translation> <translation id="889338405075704026">ไปที่การตั้งค่า Chrome</translation> <translation id="8898822736010347272">ส่ง URL ของหน้าบางหน้าที่คุณเข้าชม ข้อมูลระบบที่จำกัด และเนื้อหาบางส่วนของหน้าไปให้ Google เพื่อช่วยตรวจหาภัยคุกคามใหม่ๆ และปกป้องทุกคนที่ใช้อินเทอร์เน็ต</translation> <translation id="8909135823018751308">แชร์…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">โทรออกไม่ได้</translation> <translation id="9212845824145208577">ต่ำลงไปกว่านี้ไม่ได้ ลองเริ่มลากจากด้านล่างของหน้า</translation> <translation id="9219103736887031265">ภาพ</translation> +<translation id="923957533152125119">ระบบอาจบันทึก<ph name="BEGIN_LINK1" />ประวัติการค้นหา<ph name="END_LINK1" />และ<ph name="BEGIN_LINK2" />กิจกรรมรูปแบบอื่น<ph name="END_LINK2" />ในบัญชี Google เมื่อคุณลงชื่อเข้าใช้ คุณลบกิจกรรมดังกล่าวได้ทุกเมื่อ</translation> <translation id="926205370408745186">นำกิจกรรม Chrome ออกจากไลฟ์สไตล์ดิจิทัล</translation> <translation id="927968626442779827">ใช้โหมด Lite ใน Google Chrome</translation> <translation id="932327136139879170">หน้าแรก</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 6f7d76e..c1dba33 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Diller</translation> <translation id="4183868528246477015">Google Lens ile ara <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Yeni sekmede aç</translation> +<translation id="4196597275619698563">Kart oluştur</translation> <translation id="4198423547019359126">Kullanılabilir indirme yeri yok</translation> <translation id="4209895695669353772">Google tarafından önerilen kişiselleştirilmiş içeriği almak için senkronizasyonu açın</translation> <translation id="4225895483398857530">Araç çubuğu kısayolu</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Aramaları ve URL'leri otomatik tamamla</translation> <translation id="7707922173985738739">Mobil veri kullanın</translation> <translation id="7725024127233776428">Yer işareti koyduğunuz sayfalar burada görünür</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Diğer etkinlik biçimleri<ph name="END_LINK1" />, oturum açtığınızda Google Hesabınıza kaydedilebilir. Bunları istediğiniz zaman silebilirsiniz.</translation> <translation id="7757787379047923882">Metin, <ph name="DEVICE_NAME" /> cihazından paylaşıldı</translation> <translation id="7761849928583394409">Tarih ve saat seçin</translation> <translation id="7762668264895820836">SD Kart <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Çevrimdışı dosyalarınızı görün</translation> <translation id="8856607253650333758">Açıklama al</translation> <translation id="8873817150012960745">Başlamak için buraya dokunun</translation> +<translation id="8881973373982641723">Arama kutusunun geçmişini temizler.</translation> <translation id="889338405075704026">Chrome ayarlarına git</translation> <translation id="8898822736010347272">Yeni tehditleri keşfetmeye ve web'deki herkesi korumaya yardımcı olmak için, ziyaret ettiğiniz bazı sayfaların URL'lerini, sınırlı sistem bilgilerini ve bazı sayfa içeriklerini Google'a gönderir.</translation> <translation id="8909135823018751308">Paylaş…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Arama yapılamıyor</translation> <translation id="9212845824145208577">Daha aşağı inilemiyor. Sayfanın daha aşağısından başlamayı deneyin.</translation> <translation id="9219103736887031265">Resimler</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Arama geçmişi<ph name="END_LINK1" /> ve <ph name="BEGIN_LINK2" />diğer etkinlik biçimleri<ph name="END_LINK2" />, oturum açtığınızda Google Hesabınıza kaydedilebilir. Bunları istediğiniz zaman silebilirsiniz.</translation> <translation id="926205370408745186">Chrome etkinliğinizi Dijital Denge'den kaldırma</translation> <translation id="927968626442779827">Google Chrome'da Basit modu kullanın</translation> <translation id="932327136139879170">Ana Sayfa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 7c84b032..729edc6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Мови</translation> <translation id="4183868528246477015">Пошук з Об'єктивом <ph name="BEGIN_NEW" />Новинка<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Відкрити в новій вкладці</translation> +<translation id="4196597275619698563">Створити картку</translation> <translation id="4198423547019359126">Немає доступних місць для завантаження</translation> <translation id="4209895695669353772">Щоб отримувати персоналізовані пропозиції від Google, увімкніть синхронізацію</translation> <translation id="4225895483398857530">Кнопка на панелі інструментів</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Увімкнути автозавершення пошукових запитів і URL-адрес</translation> <translation id="7707922173985738739">Використовувати мобільне передавання даних</translation> <translation id="7725024127233776428">Сторінки, для яких ви робите закладки, з'являються тут</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Дані про інші дії<ph name="END_LINK1" /> можуть зберігатися в обліковому записі Google, коли ви входите в нього. Їх можна будь-коли видалити.</translation> <translation id="7757787379047923882">Текст, надісланий із пристрою <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Вибрати дату й час</translation> <translation id="7762668264895820836">Карта SD <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Переглянути офлайн-файли</translation> <translation id="8856607253650333758">Показувати описи</translation> <translation id="8873817150012960745">Натисніть тут, щоб почати</translation> +<translation id="8881973373982641723">Буде очищено історію, зокрема в полі пошуку.</translation> <translation id="889338405075704026">Перейти в налаштування Chrome</translation> <translation id="8898822736010347272">Надсилає в Google URL-адреси відвіданих сторінок, обмежену системну інформацію та вміст деяких сторінок, щоб виявляти нові загрози та захищати всіх користувачів в Інтернеті.</translation> <translation id="8909135823018751308">Надіслати…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Неможливо здійснювати виклики</translation> <translation id="9212845824145208577">Не вдається прокрутити далі вниз. Спробуйте почати нижче на сторінці.</translation> <translation id="9219103736887031265">Зображення</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Історія пошуку<ph name="END_LINK1" /> та <ph name="BEGIN_LINK2" />дані про інші дії<ph name="END_LINK2" /> можуть зберігатися в обліковому записі Google, коли ви входите в нього. Їх можна будь-коли видалити.</translation> <translation id="926205370408745186">Видалити активність у Chrome із Цифрового добробуту</translation> <translation id="927968626442779827">Користуйтеся спрощеним режимом у Google Chrome</translation> <translation id="932327136139879170">Домашня сторінка</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index ecddfa90..cb713041 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">語言</translation> <translation id="4183868528246477015">使用「Google 智能鏡頭」的搜尋功能<ph name="BEGIN_NEW" />新功能<ph name="END_NEW" /></translation> <translation id="4195643157523330669">在新分頁中開啟</translation> +<translation id="4196597275619698563">建立資訊卡</translation> <translation id="4198423547019359126">沒有可用的下載位置</translation> <translation id="4209895695669353772">如要接收 Google 建議的個人化內容,請開啟同步處理功能</translation> <translation id="4225895483398857530">工具列捷徑</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">自動完成搜尋和網址</translation> <translation id="7707922173985738739">使用流動數據</translation> <translation id="7725024127233776428">加入書籤的網頁會在這裡顯示</translation> +<translation id="7731260005404856143">在您登入後,<ph name="BEGIN_LINK1" />其他形式的活動<ph name="END_LINK1" />可能會儲存至您的 Google 帳戶。您隨時可刪除這些資料。</translation> <translation id="7757787379047923882">透過 <ph name="DEVICE_NAME" /> 分享的文字</translation> <translation id="7761849928583394409">選擇日期和時間</translation> <translation id="7762668264895820836">SD 卡 <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">查看離線檔案</translation> <translation id="8856607253650333758">取得說明</translation> <translation id="8873817150012960745">輕按此處即可開始搜尋</translation> +<translation id="8881973373982641723">清除記錄 (包括搜尋框中的記錄)。</translation> <translation id="889338405075704026">前往 Chrome 設定</translation> <translation id="8898822736010347272">向 Google 傳送部分您瀏覽網頁的網址、特定的系統資料及部分網頁內容,以協助探索新威脅,並保護所有網絡使用者。</translation> <translation id="8909135823018751308">共用…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">無法撥打電話</translation> <translation id="9212845824145208577">無法再往下移動。請嘗試從下一頁開始。</translation> <translation id="9219103736887031265">圖片</translation> +<translation id="923957533152125119">在您登入後,<ph name="BEGIN_LINK1" />搜尋記錄<ph name="END_LINK1" />和<ph name="BEGIN_LINK2" />其他形式的活動<ph name="END_LINK2" />可能會儲存至您的 Google 帳戶。您隨時可刪除這些資料。</translation> <translation id="926205370408745186">從「健康數碼生活」中移除您的 Chrome 活動記錄</translation> <translation id="927968626442779827">使用 Google Chrome 的「精簡模式」</translation> <translation id="932327136139879170">首頁</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 323566d..de373ec3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">語言</translation> <translation id="4183868528246477015">使用 Google 智慧鏡頭的搜尋功能 <ph name="BEGIN_NEW" />新功能<ph name="END_NEW" /></translation> <translation id="4195643157523330669">在新分頁中開啟</translation> +<translation id="4196597275619698563">建立卡片</translation> <translation id="4198423547019359126">沒有可用的下載位置</translation> <translation id="4209895695669353772">如要取得個人化的 Google 推薦內容,請開啟同步處理功能</translation> <translation id="4225895483398857530">工具列捷徑</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">自動完成搜尋字詞與網址</translation> <translation id="7707922173985738739">使用行動數據</translation> <translation id="7725024127233776428">加入書籤的頁面會顯示在這裡</translation> +<translation id="7731260005404856143">在你登入後,<ph name="BEGIN_LINK1" />其他形式的活動<ph name="END_LINK1" />可能會儲存至你的 Google 帳戶。你隨時可以刪除這些資料。</translation> <translation id="7757787379047923882">透過「<ph name="DEVICE_NAME" />」分享的文字</translation> <translation id="7761849928583394409">選擇日期和時間</translation> <translation id="7762668264895820836">SD 卡 <ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">請查看離線檔案</translation> <translation id="8856607253650333758">取得說明</translation> <translation id="8873817150012960745">輕觸此處即可開始搜尋</translation> +<translation id="8881973373982641723">清除歷史記錄,包含搜尋框記錄。</translation> <translation id="889338405075704026">前往 Chrome 設定</translation> <translation id="8898822736010347272">將部分已造訪網頁的網址、特定的系統資訊和部分網頁內容傳送至 Google,以協助發現新威脅並保障所有網路使用者的安全。</translation> <translation id="8909135823018751308">分享…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">無法撥打電話</translation> <translation id="9212845824145208577">無法再向下捲動。請嘗試從下一頁開始。</translation> <translation id="9219103736887031265">圖片</translation> +<translation id="923957533152125119">在你登入後,<ph name="BEGIN_LINK1" />搜尋記錄<ph name="END_LINK1" />和<ph name="BEGIN_LINK2" />其他形式的活動<ph name="END_LINK2" />可能會儲存至你的 Google 帳戶。你隨時可以刪除這些資料。</translation> <translation id="926205370408745186">將你的 Chrome 活動記錄從數位健康中移除</translation> <translation id="927968626442779827">使用 Google Chrome 精簡模式</translation> <translation id="932327136139879170">首頁</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index c04a712..822b0cc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -488,6 +488,7 @@ <translation id="4181841719683918333">Izilimi</translation> <translation id="4183868528246477015">Sesha ngelensi yeGoogle<ph name="BEGIN_NEW" />Okusha<ph name="END_NEW" /></translation> <translation id="4195643157523330669">Vula kuthebhu entsha</translation> +<translation id="4196597275619698563">Dala ikhadi</translation> <translation id="4198423547019359126">Azikho izindawo ezitholakalayo zokulanda</translation> <translation id="4209895695669353772">Ukuze uthole okuqukethwe okwenziwe kwaba ngokwakho i-Google, vula ukuvumelanisa</translation> <translation id="4225895483398857530">Isinqamuleli sebha yamathuluzi</translation> @@ -1046,6 +1047,7 @@ <translation id="7704317875155739195">Qedela ngokuzenzakalela usesho nama-URL</translation> <translation id="7707922173985738739">Sebenzisa idatha yeselula</translation> <translation id="7725024127233776428">Amakhasi owafaka ibhukhimakhi avela lapha</translation> +<translation id="7731260005404856143"><ph name="BEGIN_LINK1" />Ezinye izinhlobo zomsebenzi<ph name="END_LINK1" /> zingase zilondolozwe ku-akhawunti yakho ye-Google lapho ungene ngemvume. Ungazisula noma kunini.</translation> <translation id="7757787379047923882">Umbhalo wabiwe kusuka ku-<ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Khetha idethi nesikhathi</translation> <translation id="7762668264895820836">Ikhadi le-SD elingu-<ph name="SD_CARD_NUMBER" /></translation> @@ -1236,6 +1238,7 @@ <translation id="8854223127042600341">Bona amafayela akho angaxhunyiwe kwi-intanethi</translation> <translation id="8856607253650333758">Thola izincazelo</translation> <translation id="8873817150012960745">Thepha lapha ukuze uqale</translation> +<translation id="8881973373982641723">Kusula umlando, okufaka phakathi ibhokisi losesho.</translation> <translation id="889338405075704026">Iya kuzilungiselelo ze-Chrome</translation> <translation id="8898822736010347272">Thumela ama-URL wamanye amakhasi owavakashelayo, ulwazi lwesistimu olulinganiselwe, nokunye okuqukethe kwekhasi ku-Google, ukusiza ukuthola izingozi ezintsha nokuvikela wonke umuntu kuwebhu.</translation> <translation id="8909135823018751308">Yabelana…</translation> @@ -1289,6 +1292,7 @@ <translation id="9209888181064652401">Ayikwazi ukwenza amakholi</translation> <translation id="9212845824145208577">Ayikwazi ukuya phansi. Zama ukuqala phansi kakhulu ekhasini.</translation> <translation id="9219103736887031265">Izithombe</translation> +<translation id="923957533152125119"><ph name="BEGIN_LINK1" />Umlando wosesho<ph name="END_LINK1" /> kanye <ph name="BEGIN_LINK2" />nezinye izindlela zomsebenzi<ph name="END_LINK2" /> kungase kulondolozwe ku-akhawunti yakho ye-Google lapho ungene ngemvume. Ungazisula noma kunini.</translation> <translation id="926205370408745186">Susa umsebenzi wakho we-Chrome kusukela ku-Digital Wellbeing</translation> <translation id="927968626442779827">Sebenzisa Imodi elula ku-Google Chrome</translation> <translation id="932327136139879170">Ikhaya</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index c37829e5..a41e088 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -1858,8 +1858,10 @@ void onStartSurfaceStateChanged(boolean shouldBeVisible, boolean isShowingStartSurface) { super.onStartSurfaceStateChanged(shouldBeVisible, isShowingStartSurface); - // Update visibilities of toolbar layout, progress bar and shadow. - setVisibility(shouldBeVisible ? VISIBLE : GONE); + // Update visibilities of toolbar layout, progress bar and shadow. When |shouldBeVisible| is + // false, set INVISIBLE instead of Gone here because of re-inflation issue. See + // https://crbug.com/1226970 for more information. + setVisibility(shouldBeVisible ? VISIBLE : INVISIBLE); forceHideProgressBar(); setForceHideShadow(!shouldBeVisible); // Url bar should be focusable. This will be set in UrlBar#onDraw but there's a delay which
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc index 9c28cfc..51331127 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -317,13 +317,12 @@ return false; } - // In case supervision transition is in progress ARC++ is not available. - const ArcSupervisionTransition supervision_transition = - GetSupervisionTransition(profile); - if (supervision_transition != ArcSupervisionTransition::NO_TRANSITION) { - VLOG(1) << "Attempt to launch " << app_id - << " while supervision transition " << supervision_transition - << " is in progress."; + // In case management transition is in progress ARC++ is not available. + const ArcManagementTransition management_transition = + GetManagementTransition(profile); + if (management_transition != ArcManagementTransition::NO_TRANSITION) { + VLOG(1) << "Attempt to launch " << app_id << " while management transition " + << management_transition << " is in progress."; arc::ShowManagementTransitionNotification(profile); return false; }
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.cc index df3a501..b1d4e0f 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.cc
@@ -6,7 +6,6 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" -#include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/arc/pip/arc_pip_bridge.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" @@ -15,10 +14,7 @@ #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h" #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/base/window_state_type.h" -#include "components/arc/arc_util.h" #include "components/favicon/content/content_favicon_driver.h" -#include "components/full_restore/app_launch_info.h" -#include "components/full_restore/full_restore_utils.h" #include "components/services/app_service/public/mojom/types.mojom.h" #include "extensions/browser/app_window/app_window.h" #include "extensions/browser/app_window/app_window_registry.h" @@ -32,10 +28,6 @@ AppServiceAppWindowShelfController* controller) : AppWindowShelfItemController(shelf_id), controller_(controller) { DCHECK(controller_); - - Profile* profile = controller_->owner()->profile(); - if (arc::IsArcAllowedForProfile(profile)) - arc_prefs_observer_.Observe(ArcAppListPrefs::Get(profile)); } AppServiceAppWindowShelfItemController:: @@ -169,45 +161,6 @@ } } -void AppServiceAppWindowShelfItemController::OnAppStatesChanged( - const std::string& arc_app_id, - const ArcAppListPrefs::AppInfo& app_info) { - if (app_id() != arc_app_id || app_info.suspended || !app_info.ready) - return; - - apps::AppServiceProxyChromeOs* proxy = - apps::AppServiceProxyFactory::GetForProfile( - controller_->owner()->profile()); - DCHECK(proxy); - - for (const ui::BaseWindow* window : windows()) { - auto session_id = arc::GetWindowSessionId(window->GetNativeWindow()); - if (!session_id.has_value()) - continue; - - auto app_launch_info = - ::full_restore::GetArcAppLaunchInfo(arc_app_id, session_id.value()); - if (!app_launch_info) - continue; - - DCHECK(app_launch_info->event_flag.has_value()); - - auto window_info = apps::mojom::WindowInfo::New(); - window_info->window_id = session_id.value(); - - if (app_launch_info->intent.has_value()) { - proxy->LaunchAppWithIntent( - arc_app_id, app_launch_info->event_flag.value(), - std::move(app_launch_info->intent.value()), - apps::mojom::LaunchSource::kFromFullRestore, std::move(window_info)); - } else { - proxy->Launch(arc_app_id, app_launch_info->event_flag.value(), - apps::mojom::LaunchSource::kFromFullRestore, - std::move(window_info)); - } - } -} - void AppServiceAppWindowShelfItemController::AddTaskId(int task_id) { task_ids_.insert(task_id); }
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.h b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.h index 65cce1e..8084724 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.h +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_item_controller.h
@@ -7,16 +7,13 @@ #include <set> -#include "base/scoped_observation.h" -#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/ash/shelf/app_window_shelf_item_controller.h" class AppServiceAppWindowShelfController; // Shelf item delegate for extension app windows. class AppServiceAppWindowShelfItemController - : public AppWindowShelfItemController, - public ArcAppListPrefs::Observer { + : public AppWindowShelfItemController { public: explicit AppServiceAppWindowShelfItemController( const ash::ShelfID& shelf_id, @@ -42,10 +39,6 @@ // aura::WindowObserver overrides: void OnWindowTitleChanged(aura::Window* window) override; - // ArcAppListPrefs::Observer: - void OnAppStatesChanged(const std::string& app_id, - const ArcAppListPrefs::AppInfo& app_info) override; - void AddTaskId(int task_id); void RemoveTaskId(int task_id); bool HasAnyTasks() const; @@ -61,9 +54,6 @@ AppServiceAppWindowShelfController* controller_ = nullptr; - base::ScopedObservation<ArcAppListPrefs, ArcAppListPrefs::Observer> - arc_prefs_observer_{this}; - std::set<int> task_ids_; std::set<int> session_ids_; };
diff --git a/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.cc b/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.cc index dd6dbd4..e42316a 100644 --- a/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.cc +++ b/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.cc
@@ -81,6 +81,12 @@ if (!app_info.ready) return; + // If this item is created by full restore, we don't need to launch the app, + // because the full restore component will launch the app when the app is + // ready. + if (IsCreatedByFullRestore()) + return; + // Close() destroys this object, so start launching the app first. arc::LaunchApp(observed_profile_, arc_app_id, event_flags_, user_interaction_type_, std::move(window_info_)); @@ -92,9 +98,26 @@ Close(); } +void ArcShelfSpinnerItemController::OnAppConnectionReady() { + // If this item is created by full restore, start a 1 minute timer to close + // this item when timeout. + if (IsCreatedByFullRestore() && !close_timer_) { + close_timer_ = std::make_unique<base::OneShotTimer>(); + close_timer_->Start(FROM_HERE, chromeos::full_restore::kStopRestoreDelay, + base::BindOnce(&ArcShelfSpinnerItemController::Close, + weak_ptr_factory_.GetWeakPtr())); + } +} + void ArcShelfSpinnerItemController::OnArcPlayStoreEnabledChanged(bool enabled) { if (enabled) return; // If ARC was disabled, remove the deferred launch request. Close(); } + +bool ArcShelfSpinnerItemController::IsCreatedByFullRestore() { + return window_info_ && + window_info_->window_id > + full_restore::kArcSessionIdOffsetForRestoredLaunching; +}
diff --git a/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.h b/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.h index e1a3efc..eb7881b 100644 --- a/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.h +++ b/chrome/browser/ui/ash/shelf/arc_shelf_spinner_item_controller.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" +#include "base/timer/timer.h" #include "chrome/browser/ash/arc/session/arc_session_manager_observer.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" @@ -46,11 +47,16 @@ void OnAppStatesChanged(const std::string& app_id, const ArcAppListPrefs::AppInfo& app_info) override; void OnAppRemoved(const std::string& removed_app_id) override; + void OnAppConnectionReady() override; // arc::ArcSessionManagerObserver: void OnArcPlayStoreEnabledChanged(bool enabled) override; private: + // Returns true if this item is created by full restore. Otherwise, returns + // false. + bool IsCreatedByFullRestore(); + // The flags of the event that caused the ARC app to be activated. These will // be propagated to the launch event once the app is actually launched. const int event_flags_; @@ -63,6 +69,11 @@ // Unowned Profile* observed_profile_ = nullptr; + // A one shot timer to close this item. + std::unique_ptr<base::OneShotTimer> close_timer_; + + base::WeakPtrFactory<ArcShelfSpinnerItemController> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(ArcShelfSpinnerItemController); };
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 40cd89fe..32fad841 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -71,6 +71,7 @@ #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/ssl_status.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/rect.h"
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h b/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h deleted file mode 100644 index bb6e72c..0000000 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_DESKTOP_H_ -#define CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_DESKTOP_H_ - -#include "base/callback.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "content/public/browser/bluetooth_chooser.h" - -namespace content { -class RenderFrameHost; -} // namespace content - -namespace permissions { -class BluetoothChooserController; -} // namespace permissions - -// Represents a Bluetooth chooser to ask the user to select a Bluetooth -// device from a list of options. This implementation is for desktop. -// BluetoothChooserAndroid implements the mobile part. -class BluetoothChooserDesktop : public content::BluetoothChooser { - public: - BluetoothChooserDesktop( - content::RenderFrameHost* frame, - const content::BluetoothChooser::EventHandler& event_handler); - ~BluetoothChooserDesktop() override; - - // BluetoothChooser: - void SetAdapterPresence(AdapterPresence presence) override; - void ShowDiscoveryState(DiscoveryState state) override; - void AddOrUpdateDevice(const std::string& device_id, - bool should_update_name, - const std::u16string& device_name, - bool is_gatt_connected, - bool is_paired, - int signal_strength_level) override; - - private: - // DeviceChooserContentView owns the controller. - base::WeakPtr<permissions::BluetoothChooserController> - bluetooth_chooser_controller_; - - // Closes the displayed UI if it is still open. Used to ensure the bubble - // closes if this controller is torn down. - base::OnceClosure close_closure_; - - DISALLOW_COPY_AND_ASSIGN(BluetoothChooserDesktop); -}; - -#endif // CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_DESKTOP_H_
diff --git a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.h b/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.h deleted file mode 100644 index 803a788..0000000 --- a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_SCANNING_PROMPT_DESKTOP_H_ -#define CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_SCANNING_PROMPT_DESKTOP_H_ - -#include "base/callback.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "content/public/browser/bluetooth_scanning_prompt.h" - -namespace content { -class RenderFrameHost; -} // namespace content - -namespace permissions { -class BluetoothScanningPromptController; -} // namespace permissions - -// Represents a Bluetooth scanning prompt to ask the user permission to -// allow a site to receive Bluetooth advertisement packets from Bluetooth -// devices. This implementation is for desktop. -class BluetoothScanningPromptDesktop : public content::BluetoothScanningPrompt { - public: - explicit BluetoothScanningPromptDesktop( - content::RenderFrameHost* frame, - const content::BluetoothScanningPrompt::EventHandler& event_handler); - ~BluetoothScanningPromptDesktop() override; - - // content::BluetoothScanningPrompt: - void AddOrUpdateDevice(const std::string& device_id, - bool should_update_name, - const std::u16string& device_name) override; - - private: - // DeviceChooserContentView owns the controller. - base::WeakPtr<permissions::BluetoothScanningPromptController> - bluetooth_scanning_prompt_controller_; - - // Closes the displayed UI, if there is one. This is used to ensure the UI - // closes if this controller is destroyed. - base::OnceClosure close_closure_; - - DISALLOW_COPY_AND_ASSIGN(BluetoothScanningPromptDesktop); -}; - -#endif // CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_SCANNING_PROMPT_DESKTOP_H_
diff --git a/chrome/browser/ui/bluetooth/chrome_bluetooth_chooser_controller.cc b/chrome/browser/ui/bluetooth/chrome_bluetooth_chooser_controller.cc index 6545fa8..61b1eb8 100644 --- a/chrome/browser/ui/bluetooth/chrome_bluetooth_chooser_controller.cc +++ b/chrome/browser/ui/bluetooth/chrome_bluetooth_chooser_controller.cc
@@ -56,7 +56,7 @@ : permissions::BluetoothChooserController( owner, event_handler, - CreateChooserTitle( + CreateExtensionAwareChooserTitle( owner, IDS_BLUETOOTH_DEVICE_CHOOSER_PROMPT_ORIGIN, IDS_BLUETOOTH_DEVICE_CHOOSER_PROMPT_EXTENSION_NAME)) {
diff --git a/chrome/browser/ui/font_access/font_access_chooser_controller.cc b/chrome/browser/ui/font_access/font_access_chooser_controller.cc index cde8c2a..07d2f1b 100644 --- a/chrome/browser/ui/font_access/font_access_chooser_controller.cc +++ b/chrome/browser/ui/font_access/font_access_chooser_controller.cc
@@ -6,8 +6,8 @@ #include "base/containers/contains.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/chooser_controller/title_util.h" #include "chrome/grit/generated_resources.h" +#include "components/permissions/chooser_title_util.h" #include "content/public/browser/font_access_chooser.h" #include "content/public/browser/font_access_context.h" #include "content/public/browser/render_frame_host.h" @@ -28,11 +28,9 @@ content::RenderFrameHost* frame, const std::vector<std::string>& selection, content::FontAccessChooser::Callback callback) - : ChooserController( - CreateChooserTitle(frame, - IDS_FONT_ACCESS_CHOOSER_PROMPT_ORIGIN, - // Extensions are not supported. This is stub text. - IDS_FONT_ACCESS_CHOOSER_PROMPT_ORIGIN)), + : ChooserController(permissions::CreateChooserTitle( + frame, + IDS_FONT_ACCESS_CHOOSER_PROMPT_ORIGIN)), callback_(std::move(callback)) { DCHECK(frame);
diff --git a/chrome/browser/ui/hid/hid_chooser_controller.cc b/chrome/browser/ui/hid/hid_chooser_controller.cc index 96526bf..3c2f34ab 100644 --- a/chrome/browser/ui/hid/hid_chooser_controller.cc +++ b/chrome/browser/ui/hid/hid_chooser_controller.cc
@@ -44,10 +44,10 @@ content::RenderFrameHost* render_frame_host, std::vector<blink::mojom::HidDeviceFilterPtr> filters, content::HidChooser::Callback callback) - : ChooserController( - CreateChooserTitle(render_frame_host, - IDS_HID_CHOOSER_PROMPT_ORIGIN, - IDS_HID_CHOOSER_PROMPT_EXTENSION_NAME)), + : ChooserController(CreateExtensionAwareChooserTitle( + render_frame_host, + IDS_HID_CHOOSER_PROMPT_ORIGIN, + IDS_HID_CHOOSER_PROMPT_EXTENSION_NAME)), filters_(std::move(filters)), callback_(std::move(callback)), origin_(content::WebContents::FromRenderFrameHost(render_frame_host)
diff --git a/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc index 357be14..7eb12715 100644 --- a/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc +++ b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc
@@ -12,8 +12,10 @@ #include "components/content_settings/core/common/content_settings_types.h" #include "components/permissions/permission_manager.h" #include "components/prefs/pref_service.h" +#include "components/strings/grit/components_strings.h" #include "content/public/browser/web_contents.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" +#include "ui/base/l10n/l10n_util.h" #include "url/gurl.h" #if !defined(OS_ANDROID) @@ -60,17 +62,18 @@ case ContentSettingsType::NOTIFICATIONS: case ContentSettingsType::IDLE_DETECTION: { if (profile_->IsOffTheRecord()) { - // TODO(crbug.com/1225563): Replace with actual strings. - return u"Not allowed in Incognito"; + return l10n_util::GetStringUTF16( + IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_IN_INCOGNITO); } break; } // Media only supports CONTENT_SETTING_ALLOW for secure origins. + // TODO(crbug.com/1227679): This string can probably be removed. case ContentSettingsType::MEDIASTREAM_MIC: case ContentSettingsType::MEDIASTREAM_CAMERA: { if (!network::IsUrlPotentiallyTrustworthy(site_url_)) { - // TODO(crbug.com/1225563): Replace with actual strings. - return u"Not allowed on non-secure connections"; + return l10n_util::GetStringUTF16( + IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_INSECURE); } break; }
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc deleted file mode 100644 index 21d126a..0000000 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc +++ /dev/null
@@ -1,300 +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 "chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.h" - -#include "base/feature_list.h" -#include "base/metrics/field_trial_params.h" -#include "base/time/default_clock.h" -#include "chrome/browser/password_manager/password_store_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" -#include "chrome/browser/ui/passwords/passwords_model_delegate.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/grit/theme_resources.h" -#include "components/password_manager/core/browser/password_bubble_experiment.h" -#include "components/password_manager/core/browser/password_form_metrics_recorder.h" -#include "components/password_manager/core/browser/password_manager_features_util.h" -#include "components/password_manager/core/browser/password_manager_metrics_util.h" -#include "components/password_manager/core/browser/password_store.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/password_manager/core/common/password_manager_pref_names.h" -#include "components/prefs/pref_service.h" -#include "components/sync/driver/sync_service.h" -#include "content/public/browser/web_contents.h" -#include "ui/base/l10n/l10n_util.h" - -namespace { - -namespace metrics_util = password_manager::metrics_util; -using Store = password_manager::PasswordForm::Store; - -password_manager::metrics_util::UIDisplayDisposition ComputeDisplayDisposition( - PasswordBubbleControllerBase::DisplayReason display_reason, - password_manager::ui::State state) { - if (display_reason == - PasswordBubbleControllerBase::DisplayReason::kUserAction) { - switch (state) { - case password_manager::ui::PENDING_PASSWORD_STATE: - return metrics_util::MANUAL_WITH_PASSWORD_PENDING; - case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: - return metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE; - default: - NOTREACHED(); - return metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE; - } - } else { - switch (state) { - case password_manager::ui::PENDING_PASSWORD_STATE: - return metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; - case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: - return metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE; - default: - NOTREACHED(); - return metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; - } - } -} - -void CleanStatisticsForSite(Profile* profile, const url::Origin& origin) { - DCHECK(profile); - password_manager::PasswordStore* password_store = - PasswordStoreFactory::GetForProfile(profile, - ServiceAccessType::IMPLICIT_ACCESS) - .get(); - password_store->RemoveSiteStats(origin.GetURL()); -} - -std::vector<password_manager::PasswordForm> DeepCopyForms( - const std::vector<std::unique_ptr<password_manager::PasswordForm>>& forms) { - std::vector<password_manager::PasswordForm> result; - result.reserve(forms.size()); - std::transform( - forms.begin(), forms.end(), std::back_inserter(result), - [](const std::unique_ptr<password_manager::PasswordForm>& form) { - return *form; - }); - return result; -} - -bool IsSyncUser(Profile* profile) { - const syncer::SyncService* sync_service = - SyncServiceFactory::GetForProfile(profile); - return password_bubble_experiment::IsSmartLockUser(sync_service); -} - -} // namespace - -SaveUpdateBubbleController::SaveUpdateBubbleController( - base::WeakPtr<PasswordsModelDelegate> delegate, - PasswordBubbleControllerBase::DisplayReason display_reason) - : PasswordBubbleControllerBase( - delegate, - ComputeDisplayDisposition(display_reason, delegate->GetState())), - display_disposition_( - ComputeDisplayDisposition(display_reason, delegate->GetState())), - password_revealing_requires_reauth_(false), - enable_editing_(false), - dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION), - clock_(base::DefaultClock::GetInstance()) { - // If kEnablePasswordsAccountStorage is enabled, then - // SaveUpdateWithAccountStoreBubbleController should be used instead of this - // class. - DCHECK(!base::FeatureList::IsEnabled( - password_manager::features::kEnablePasswordsAccountStorage)); - - state_ = delegate_->GetState(); - DCHECK(state_ == password_manager::ui::PENDING_PASSWORD_STATE || - state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); - origin_ = delegate_->GetOrigin(); - pending_password_ = delegate_->GetPendingPassword(); - local_credentials_ = DeepCopyForms(delegate_->GetCurrentForms()); - if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { - interaction_stats_.origin_domain = origin_.GetURL(); - interaction_stats_.username_value = pending_password_.username_value; - const password_manager::InteractionsStats* stats = - delegate_->GetCurrentInteractionStats(); - if (stats) { - DCHECK_EQ(interaction_stats_.username_value, stats->username_value); - DCHECK_EQ(interaction_stats_.origin_domain, stats->origin_domain); - interaction_stats_.dismissal_count = stats->dismissal_count; - } - } - - if (are_passwords_revealed_when_bubble_is_opened_) { - delegate_->OnPasswordsRevealed(); - } - // The condition for the password reauth: - // If the bubble opened after reauth -> no more reauth necessary. - // If the bubble opened after successful submission -> no reauth because it's - // a temporary state and we should not complicate that UX flow. - // If a password was autofilled -> require reauth to view it. - // If the bubble opened manually and not a manual fallback -> require reauth. - // The manual fallback is a temporary state and it's better for the sake of - // convenience for the user not to break the UX with the reauth prompt. - password_revealing_requires_reauth_ = - !are_passwords_revealed_when_bubble_is_opened_ && - display_reason == - PasswordBubbleControllerBase::DisplayReason::kUserAction && - (pending_password_.form_has_autofilled_value || - !delegate_->BubbleIsManualFallbackForSaving()); - enable_editing_ = delegate_->GetCredentialSource() != - password_manager::metrics_util::CredentialSourceType:: - kCredentialManagementAPI; -} - -SaveUpdateBubbleController::~SaveUpdateBubbleController() { - if (!interaction_reported_) - OnBubbleClosing(); -} - -void SaveUpdateBubbleController::OnSaveClicked() { - DCHECK(state_ == password_manager::ui::PENDING_PASSWORD_STATE || - state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); - dismissal_reason_ = metrics_util::CLICKED_ACCEPT; - if (delegate_) { - CleanStatisticsForSite(GetProfile(), origin_); - delegate_->SavePassword(pending_password_.username_value, - pending_password_.password_value); - } -} - -void SaveUpdateBubbleController::OnNopeUpdateClicked() { - DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, state_); - dismissal_reason_ = metrics_util::CLICKED_CANCEL; - if (delegate_) - delegate_->OnNopeUpdateClicked(); -} - -void SaveUpdateBubbleController::OnNeverForThisSiteClicked() { - DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); - dismissal_reason_ = metrics_util::CLICKED_NEVER; - if (delegate_) { - CleanStatisticsForSite(GetProfile(), origin_); - delegate_->NeverSavePassword(); - } -} - -void SaveUpdateBubbleController::OnCredentialEdited( - std::u16string new_username, - std::u16string new_password) { - DCHECK(state_ == password_manager::ui::PENDING_PASSWORD_STATE || - state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); - pending_password_.username_value = std::move(new_username); - pending_password_.password_value = std::move(new_password); -} - -bool SaveUpdateBubbleController::IsCurrentStateUpdate() const { - DCHECK(state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || - state_ == password_manager::ui::PENDING_PASSWORD_STATE); - return std::any_of(local_credentials_.begin(), local_credentials_.end(), - [this](const password_manager::PasswordForm& form) { - return form.username_value == - pending_password_.username_value; - }); -} - -bool SaveUpdateBubbleController::ShouldShowFooter() const { - return (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || - state_ == password_manager::ui::PENDING_PASSWORD_STATE) && - IsSyncUser(GetProfile()); -} - -bool SaveUpdateBubbleController::ReplaceToShowPromotionIfNeeded() { - Profile* profile = GetProfile(); - if (!profile) - return false; - PrefService* prefs = profile->GetPrefs(); - const syncer::SyncService* sync_service = - SyncServiceFactory::GetForProfile(profile); - // Signin promotion. - if (password_bubble_experiment::ShouldShowChromeSignInPasswordPromo( - prefs, sync_service)) { - ReportInteractions(); - state_ = password_manager::ui::CHROME_SIGN_IN_PROMO_STATE; - int show_count = prefs->GetInteger( - password_manager::prefs::kNumberSignInPasswordPromoShown); - show_count++; - prefs->SetInteger(password_manager::prefs::kNumberSignInPasswordPromoShown, - show_count); - return true; - } - return false; -} - -bool SaveUpdateBubbleController::RevealPasswords() { - bool reveal_immediately = !password_revealing_requires_reauth_ || - (delegate_ && delegate_->AuthenticateUser()); - if (reveal_immediately) - delegate_->OnPasswordsRevealed(); - return reveal_immediately; -} - -std::u16string SaveUpdateBubbleController::GetTitle() const { - if (state_ == password_manager::ui::CHROME_SIGN_IN_PROMO_STATE) - return l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SYNC_PROMO_TITLE); - - PasswordTitleType type = IsCurrentStateUpdate() - ? PasswordTitleType::UPDATE_PASSWORD - : (pending_password_.federation_origin.opaque() - ? PasswordTitleType::SAVE_PASSWORD - : PasswordTitleType::SAVE_ACCOUNT); - return GetSavePasswordDialogTitleText(GetWebContents()->GetVisibleURL(), - origin_, type); -} - -void SaveUpdateBubbleController::ReportInteractions() { - if (state_ == password_manager::ui::CHROME_SIGN_IN_PROMO_STATE) - return; - DCHECK(state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || - state_ == password_manager::ui::PENDING_PASSWORD_STATE); - if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { - // Update the statistics for the save password bubble. - Profile* profile = GetProfile(); - if (profile) { - if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION && - display_disposition_ == - metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) { - if (interaction_stats_.dismissal_count < - std::numeric_limits<decltype( - interaction_stats_.dismissal_count)>::max()) - interaction_stats_.dismissal_count++; - interaction_stats_.update_time = clock_->Now(); - password_manager::PasswordStore* password_store = - PasswordStoreFactory::GetForProfile( - profile, ServiceAccessType::IMPLICIT_ACCESS) - .get(); - password_store->AddSiteStats(interaction_stats_); - } - } - } - - // Log UMA histograms. - if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { - metrics_util::LogUpdateUIDismissalReason(dismissal_reason_); - } else if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { - absl::optional<metrics_util::PasswordAccountStorageUserState> user_state = - absl::nullopt; - Profile* profile = GetProfile(); - if (profile) { - user_state = password_manager::features_util:: - ComputePasswordAccountStorageUserState( - profile->GetPrefs(), SyncServiceFactory::GetForProfile(profile)); - } - metrics_util::LogSaveUIDismissalReason(dismissal_reason_, user_state); - } - - // Update the delegate so that it can send votes to the server. - // Send a notification if there was no interaction with the bubble. - bool no_interaction = - dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION; - if (no_interaction && delegate_) { - delegate_->OnNoInteraction(); - } - - // Record UKM statistics on dismissal reason. - if (metrics_recorder_) - metrics_recorder_->RecordUIDismissalReason(dismissal_reason_); -}
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.h b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.h deleted file mode 100644 index a4da15b..0000000 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.h +++ /dev/null
@@ -1,117 +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 CHROME_BROWSER_UI_PASSWORDS_BUBBLE_CONTROLLERS_SAVE_UPDATE_BUBBLE_CONTROLLER_H_ -#define CHROME_BROWSER_UI_PASSWORDS_BUBBLE_CONTROLLERS_SAVE_UPDATE_BUBBLE_CONTROLLER_H_ - -#include "base/memory/weak_ptr.h" -#include "chrome/browser/ui/passwords/bubble_controllers/password_bubble_controller_base.h" -#include "components/password_manager/core/browser/manage_passwords_referrer.h" -#include "components/password_manager/core/browser/password_form.h" -#include "components/password_manager/core/browser/statistics_table.h" -#include "components/password_manager/core/common/password_manager_ui.h" - -class PasswordsModelDelegate; -namespace base { -class Clock; -} - -// This controller provides data and actions for the PasswordSaveUpdateView. -class SaveUpdateBubbleController : public PasswordBubbleControllerBase { - public: - explicit SaveUpdateBubbleController( - base::WeakPtr<PasswordsModelDelegate> delegate, - DisplayReason display_reason); - ~SaveUpdateBubbleController() override; - - // Called by the view code when the save/update button is clicked by the user. - void OnSaveClicked(); - - // Called by the view code when the "Nope" button in clicked by the user in - // update bubble. - void OnNopeUpdateClicked(); - - // Called by the view code when the "Never for this site." button in clicked - // by the user. - void OnNeverForThisSiteClicked(); - - // Called by the view code when username or password is corrected using - // the username correction or password selection features in PendingView. - void OnCredentialEdited(std::u16string new_username, - std::u16string new_password); - - // The password bubble can switch its state between "save" and "update" - // depending on the user input. |state_| only captures the correct state on - // creation. This method returns true iff the current state is "update". - bool IsCurrentStateUpdate() const; - - // Returns true iff the bubble is supposed to show the footer about syncing - // to Google account. - bool ShouldShowFooter() const; - - // Returns true and updates the internal state iff the Save bubble should - // switch to show a promotion after the password was saved. Otherwise, - // returns false and leaves the current state. - bool ReplaceToShowPromotionIfNeeded(); - - // Returns true if passwords revealing is not locked or re-authentication is - // not available on the given platform. Otherwise, the method schedules - // re-authentication and bubble reopen (the current bubble will be destroyed), - // and returns false immediately. New bubble will reveal the passwords if the - // re-authentication is successful. - bool RevealPasswords(); - - // PasswordBubbleControllerBase methods: - std::u16string GetTitle() const override; - - password_manager::ui::State state() const { return state_; } - - const password_manager::PasswordForm& pending_password() const { - return pending_password_; - } - - bool are_passwords_revealed_when_bubble_is_opened() const { - return are_passwords_revealed_when_bubble_is_opened_; - } - - bool enable_editing() const { return enable_editing_; } - -#if defined(UNIT_TEST) - void set_clock(base::Clock* clock) { clock_ = clock; } - - void allow_passwords_revealing() { - password_revealing_requires_reauth_ = false; - } - - bool password_revealing_requires_reauth() const { - return password_revealing_requires_reauth_; - } -#endif - - private: - // PasswordBubbleControllerBase methods: - void ReportInteractions() override; - - // Origin of the page from where this bubble was triggered. - url::Origin origin_; - password_manager::ui::State state_; - password_manager::PasswordForm pending_password_; - std::vector<password_manager::PasswordForm> local_credentials_; - password_manager::InteractionsStats interaction_stats_; - password_manager::metrics_util::UIDisplayDisposition display_disposition_; - - // True iff password revealing should require re-auth for privacy reasons. - bool password_revealing_requires_reauth_; - - // True iff username/password editing should be enabled. - bool enable_editing_; - - // Dismissal reason for a password bubble. - password_manager::metrics_util::UIDismissalReason dismissal_reason_; - - // Used to retrieve the current time, in base::Time units. - base::Clock* clock_; -}; - -#endif // CHROME_BROWSER_UI_PASSWORDS_BUBBLE_CONTROLLERS_SAVE_UPDATE_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc deleted file mode 100644 index 127bddb..0000000 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc +++ /dev/null
@@ -1,667 +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 "chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.h" - -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/bind.h" -#include "base/metrics/histogram_samples.h" -#include "base/run_loop.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/simple_test_clock.h" -#include "build/build_config.h" -#include "build/chromeos_buildflags.h" -#include "chrome/browser/password_manager/password_store_factory.h" -#include "chrome/browser/signin/chrome_signin_client_factory.h" -#include "chrome/browser/signin/test_signin_client_builder.h" -#include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/passwords_model_delegate_mock.h" -#include "chrome/test/base/testing_profile.h" -#include "components/password_manager/core/browser/mock_password_store.h" -#include "components/password_manager/core/browser/password_form_metrics_recorder.h" -#include "components/password_manager/core/browser/password_manager_metrics_util.h" -#include "components/password_manager/core/browser/password_manager_test_utils.h" -#include "components/password_manager/core/browser/statistics_table.h" -#include "components/password_manager/core/common/credential_manager_types.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/password_manager/core/common/password_manager_pref_names.h" -#include "components/password_manager/core/common/password_manager_ui.h" -#include "components/prefs/pref_service.h" -#include "components/signin/public/identity_manager/account_info.h" -#include "components/ukm/test_ukm_recorder.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/browser_task_environment.h" -#include "content/public/test/test_renderer_host.h" -#include "content/public/test/web_contents_tester.h" -#include "services/metrics/public/cpp/ukm_recorder.h" -#include "services/metrics/public/cpp/ukm_source.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using ::testing::_; -using ::testing::Return; -using ::testing::ReturnRef; - -namespace { - -constexpr ukm::SourceId kTestSourceId = 0x1234; - -constexpr char kSiteOrigin[] = "http://example.com/login"; -constexpr char16_t kUsername[] = u"Admin"; -constexpr char16_t kUsernameExisting[] = u"User"; -constexpr char16_t kUsernameNew[] = u"User585"; -constexpr char16_t kPassword[] = u"AdminPass"; -constexpr char16_t kPasswordEdited[] = u"asDfjkl;"; -constexpr char kUIDismissalReasonGeneralMetric[] = - "PasswordManager.UIDismissalReason"; -constexpr char kUIDismissalReasonSaveMetric[] = - "PasswordManager.SaveUIDismissalReason"; -constexpr char kUIDismissalReasonUpdateMetric[] = - "PasswordManager.UpdateUIDismissalReason"; - -} // namespace - -class SaveUpdateBubbleControllerTest : public ::testing::Test { - public: - SaveUpdateBubbleControllerTest() { - // If kEnablePasswordsAccountStorage is enabled, then - // SaveUpdateWithAccountStoreBubbleController is used instead of this class. - feature_list_.InitAndDisableFeature( - password_manager::features::kEnablePasswordsAccountStorage); - } - ~SaveUpdateBubbleControllerTest() override = default; - - void SetUp() override { - TestingProfile::Builder profile_builder; - profile_builder.AddTestingFactory( - ChromeSigninClientFactory::GetInstance(), - base::BindRepeating(&signin::BuildTestSigninClient)); - profile_builder.AddTestingFactory(SyncServiceFactory::GetInstance(), - SyncServiceFactory::GetDefaultFactory()); - profile_ = profile_builder.Build(); - - test_web_contents_ = content::WebContentsTester::CreateTestWebContents( - profile_.get(), nullptr); - mock_delegate_ = - std::make_unique<testing::NiceMock<PasswordsModelDelegateMock>>(); - ON_CALL(*mock_delegate_, GetPasswordFormMetricsRecorder()) - .WillByDefault(Return(nullptr)); - PasswordStoreFactory::GetInstance()->SetTestingFactoryAndUse( - profile(), - base::BindRepeating( - &password_manager::BuildPasswordStore< - content::BrowserContext, - testing::StrictMock<password_manager::MockPasswordStore>>)); - pending_password_.url = GURL(kSiteOrigin); - pending_password_.signon_realm = kSiteOrigin; - pending_password_.username_value = kUsername; - pending_password_.password_value = kPassword; - } - - void TearDown() override { - // Reset the delegate first. It can happen if the user closes the tab. - mock_delegate_.reset(); - controller_.reset(); - } - - PrefService* prefs() { return profile_->GetPrefs(); } - - TestingProfile* profile() { return profile_.get(); } - - password_manager::MockPasswordStore* GetStore() { - return static_cast<password_manager::MockPasswordStore*>( - PasswordStoreFactory::GetInstance() - ->GetForProfile(profile(), ServiceAccessType::EXPLICIT_ACCESS) - .get()); - } - - PasswordsModelDelegateMock* delegate() { return mock_delegate_.get(); } - - SaveUpdateBubbleController* controller() { return controller_.get(); } - - password_manager::PasswordForm& pending_password() { - return pending_password_; - } - const password_manager::PasswordForm& pending_password() const { - return pending_password_; - } - - void SetUpWithState(password_manager::ui::State state, - PasswordBubbleControllerBase::DisplayReason reason); - void PretendPasswordWaiting( - PasswordBubbleControllerBase::DisplayReason reason = - PasswordBubbleControllerBase::DisplayReason::kAutomatic); - void PretendUpdatePasswordWaiting(); - - void DestroyModelAndVerifyControllerExpectations(); - void DestroyModelExpectReason( - password_manager::metrics_util::UIDismissalReason dismissal_reason); - - static password_manager::InteractionsStats GetTestStats(); - std::vector<std::unique_ptr<password_manager::PasswordForm>> GetCurrentForms() - const; - - private: - base::test::ScopedFeatureList feature_list_; - content::BrowserTaskEnvironment task_environment_; - content::RenderViewHostTestEnabler rvh_enabler_; - std::unique_ptr<TestingProfile> profile_; - std::unique_ptr<content::WebContents> test_web_contents_; - std::unique_ptr<SaveUpdateBubbleController> controller_; - std::unique_ptr<PasswordsModelDelegateMock> mock_delegate_; - password_manager::PasswordForm pending_password_; -}; - -void SaveUpdateBubbleControllerTest::SetUpWithState( - password_manager::ui::State state, - PasswordBubbleControllerBase::DisplayReason reason) { - url::Origin origin = url::Origin::Create(GURL(kSiteOrigin)); - EXPECT_CALL(*delegate(), GetOrigin()).WillOnce(Return(origin)); - EXPECT_CALL(*delegate(), GetState()).WillRepeatedly(Return(state)); - EXPECT_CALL(*delegate(), GetWebContents()) - .WillRepeatedly(Return(test_web_contents_.get())); - controller_ = std::make_unique<SaveUpdateBubbleController>( - mock_delegate_->AsWeakPtr(), reason); - ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(delegate())); - EXPECT_CALL(*delegate(), GetWebContents()) - .WillRepeatedly(Return(test_web_contents_.get())); -} - -void SaveUpdateBubbleControllerTest::PretendPasswordWaiting( - PasswordBubbleControllerBase::DisplayReason reason) { - EXPECT_CALL(*delegate(), GetPendingPassword()) - .WillOnce(ReturnRef(pending_password())); - password_manager::InteractionsStats stats = GetTestStats(); - EXPECT_CALL(*delegate(), GetCurrentInteractionStats()) - .WillOnce(Return(&stats)); - std::vector<std::unique_ptr<password_manager::PasswordForm>> forms = - GetCurrentForms(); - EXPECT_CALL(*delegate(), GetCurrentForms()).WillOnce(ReturnRef(forms)); - SetUpWithState(password_manager::ui::PENDING_PASSWORD_STATE, reason); -} - -void SaveUpdateBubbleControllerTest::PretendUpdatePasswordWaiting() { - EXPECT_CALL(*delegate(), GetPendingPassword()) - .WillOnce(ReturnRef(pending_password())); - std::vector<std::unique_ptr<password_manager::PasswordForm>> forms = - GetCurrentForms(); - auto current_form = - std::make_unique<password_manager::PasswordForm>(pending_password()); - current_form->password_value = u"old_password"; - forms.push_back(std::move(current_form)); - EXPECT_CALL(*delegate(), GetCurrentForms()).WillOnce(ReturnRef(forms)); - SetUpWithState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, - PasswordBubbleControllerBase::DisplayReason::kAutomatic); -} - -void SaveUpdateBubbleControllerTest:: - DestroyModelAndVerifyControllerExpectations() { - EXPECT_CALL(*delegate(), OnBubbleHidden()); - controller_->OnBubbleClosing(); - ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(delegate())); - controller_.reset(); -} - -void SaveUpdateBubbleControllerTest::DestroyModelExpectReason( - password_manager::metrics_util::UIDismissalReason dismissal_reason) { - base::HistogramTester histogram_tester; - password_manager::ui::State state = controller_->state(); - std::string histogram(kUIDismissalReasonGeneralMetric); - if (state == password_manager::ui::PENDING_PASSWORD_STATE) - histogram = kUIDismissalReasonSaveMetric; - else if (state == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) - histogram = kUIDismissalReasonUpdateMetric; - DestroyModelAndVerifyControllerExpectations(); - histogram_tester.ExpectUniqueSample(histogram, dismissal_reason, 1); -} - -// static -password_manager::InteractionsStats -SaveUpdateBubbleControllerTest::GetTestStats() { - password_manager::InteractionsStats result; - result.origin_domain = GURL(kSiteOrigin).GetOrigin(); - result.username_value = kUsername; - result.dismissal_count = 5; - result.update_time = base::Time::FromTimeT(1); - return result; -} - -std::vector<std::unique_ptr<password_manager::PasswordForm>> -SaveUpdateBubbleControllerTest::GetCurrentForms() const { - password_manager::PasswordForm form(pending_password()); - form.username_value = kUsernameExisting; - form.password_value = u"123456"; - - password_manager::PasswordForm preferred_form(pending_password()); - preferred_form.username_value = u"preferred_username"; - preferred_form.password_value = u"654321"; - - std::vector<std::unique_ptr<password_manager::PasswordForm>> forms; - forms.push_back(std::make_unique<password_manager::PasswordForm>(form)); - forms.push_back( - std::make_unique<password_manager::PasswordForm>(preferred_form)); - return forms; -} - -// Tests that the controller reads the value of -// ArePasswordsRevealedWhenBubbleIsOpened() before invoking OnBubbleShown() -// since the latter resets the value returned by the former. (crbug.com/1049085) -TEST_F(SaveUpdateBubbleControllerTest, - ArePasswordsRevealedWhenBubbleIsOpenedBeforeOnBubbleShown) { - { - testing::InSequence s; - EXPECT_CALL(*delegate(), ArePasswordsRevealedWhenBubbleIsOpened()); - EXPECT_CALL(*delegate(), OnBubbleShown()); - } - PretendPasswordWaiting(); -} - -TEST_F(SaveUpdateBubbleControllerTest, CloseWithoutInteraction) { - PretendPasswordWaiting(); - - EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, - controller()->state()); - base::SimpleTestClock clock; - base::Time now = base::Time::Now(); - clock.SetNow(now); - controller()->set_clock(&clock); - password_manager::InteractionsStats stats = GetTestStats(); - stats.dismissal_count++; - stats.update_time = now; - EXPECT_CALL(*GetStore(), AddSiteStatsImpl(stats)); - EXPECT_CALL(*delegate(), OnNoInteraction()); - EXPECT_CALL(*delegate(), SavePassword(_, _)).Times(0); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - DestroyModelExpectReason( - password_manager::metrics_util::NO_DIRECT_INTERACTION); -} - -TEST_F(SaveUpdateBubbleControllerTest, ClickSave) { - PretendPasswordWaiting(); - - EXPECT_TRUE(controller()->enable_editing()); - EXPECT_FALSE(controller()->IsCurrentStateUpdate()); - - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), OnPasswordsRevealed()).Times(0); - EXPECT_CALL(*delegate(), SavePassword(pending_password().username_value, - pending_password().password_value)); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - EXPECT_CALL(*delegate(), OnNopeUpdateClicked()).Times(0); - controller()->OnSaveClicked(); - DestroyModelExpectReason(password_manager::metrics_util::CLICKED_ACCEPT); -} - -TEST_F(SaveUpdateBubbleControllerTest, ClickSaveInUpdateState) { - PretendUpdatePasswordWaiting(); - - // Edit username, now it's a new credential. - controller()->OnCredentialEdited(kUsernameNew, kPasswordEdited); - EXPECT_FALSE(controller()->IsCurrentStateUpdate()); - - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(std::u16string(kUsernameNew), - std::u16string(kPasswordEdited))); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - EXPECT_CALL(*delegate(), OnNopeUpdateClicked()).Times(0); - controller()->OnSaveClicked(); - DestroyModelExpectReason(password_manager::metrics_util::CLICKED_ACCEPT); -} - -TEST_F(SaveUpdateBubbleControllerTest, ClickNever) { - PretendPasswordWaiting(); - - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(_, _)).Times(0); - EXPECT_CALL(*delegate(), NeverSavePassword()); - controller()->OnNeverForThisSiteClicked(); - EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, - controller()->state()); - DestroyModelExpectReason(password_manager::metrics_util::CLICKED_NEVER); -} - -TEST_F(SaveUpdateBubbleControllerTest, ClickUpdate) { - PretendUpdatePasswordWaiting(); - - EXPECT_TRUE(controller()->enable_editing()); - EXPECT_TRUE(controller()->IsCurrentStateUpdate()); - - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), OnPasswordsRevealed()).Times(0); - EXPECT_CALL(*delegate(), SavePassword(pending_password().username_value, - pending_password().password_value)); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - EXPECT_CALL(*delegate(), OnNopeUpdateClicked()).Times(0); - controller()->OnSaveClicked(); - DestroyModelExpectReason(password_manager::metrics_util::CLICKED_ACCEPT); -} - -TEST_F(SaveUpdateBubbleControllerTest, ClickUpdateInSaveState) { - PretendPasswordWaiting(); - - // Edit username, now it's an existing credential. - controller()->OnCredentialEdited(kUsernameExisting, kPasswordEdited); - EXPECT_TRUE(controller()->IsCurrentStateUpdate()); - - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(std::u16string(kUsernameExisting), - std::u16string(kPasswordEdited))); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - EXPECT_CALL(*delegate(), OnNopeUpdateClicked()).Times(0); - controller()->OnSaveClicked(); - DestroyModelExpectReason(password_manager::metrics_util::CLICKED_ACCEPT); -} - -TEST_F(SaveUpdateBubbleControllerTest, GetInitialUsername_MatchedUsername) { - PretendUpdatePasswordWaiting(); - EXPECT_EQ(kUsername, controller()->pending_password().username_value); -} - -TEST_F(SaveUpdateBubbleControllerTest, EditCredential) { - PretendPasswordWaiting(); - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - - const std::u16string kExpectedUsername = u"new_username"; - const std::u16string kExpectedPassword = u"new_password"; - - controller()->OnCredentialEdited(kExpectedUsername, kExpectedPassword); - EXPECT_EQ(kExpectedUsername, controller()->pending_password().username_value); - EXPECT_EQ(kExpectedPassword, controller()->pending_password().password_value); - EXPECT_CALL(*delegate(), SavePassword(kExpectedUsername, kExpectedPassword)); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - controller()->OnSaveClicked(); - DestroyModelAndVerifyControllerExpectations(); -} - -TEST_F(SaveUpdateBubbleControllerTest, SuppressSignInPromo) { - prefs()->SetBoolean(password_manager::prefs::kSignInPasswordPromoRevive, - true); - prefs()->SetBoolean(password_manager::prefs::kWasSignInPasswordPromoClicked, - true); - PretendPasswordWaiting(); - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(pending_password().username_value, - pending_password().password_value)); - controller()->OnSaveClicked(); - - EXPECT_FALSE(controller()->ReplaceToShowPromotionIfNeeded()); - DestroyModelAndVerifyControllerExpectations(); -} - -TEST_F(SaveUpdateBubbleControllerTest, SignInPromoOK) { - PretendPasswordWaiting(); - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(pending_password().username_value, - pending_password().password_value)); - controller()->OnSaveClicked(); - -#if BUILDFLAG(IS_CHROMEOS_ASH) - EXPECT_FALSE(controller()->ReplaceToShowPromotionIfNeeded()); -#else - EXPECT_TRUE(controller()->ReplaceToShowPromotionIfNeeded()); -#endif -} - -#if !BUILDFLAG(IS_CHROMEOS_ASH) -TEST_F(SaveUpdateBubbleControllerTest, SignInPromoCancel) { - base::HistogramTester histogram_tester; - PretendPasswordWaiting(); - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(pending_password().username_value, - pending_password().password_value)); - controller()->OnSaveClicked(); - - EXPECT_TRUE(controller()->ReplaceToShowPromotionIfNeeded()); - DestroyModelAndVerifyControllerExpectations(); - histogram_tester.ExpectUniqueSample( - kUIDismissalReasonSaveMetric, - password_manager::metrics_util::CLICKED_ACCEPT, 1); -} - -TEST_F(SaveUpdateBubbleControllerTest, SignInPromoDismiss) { - base::HistogramTester histogram_tester; - PretendPasswordWaiting(); - EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(pending_password().username_value, - pending_password().password_value)); - controller()->OnSaveClicked(); - - EXPECT_TRUE(controller()->ReplaceToShowPromotionIfNeeded()); - DestroyModelAndVerifyControllerExpectations(); - histogram_tester.ExpectUniqueSample( - kUIDismissalReasonSaveMetric, - password_manager::metrics_util::CLICKED_ACCEPT, 1); - EXPECT_FALSE(prefs()->GetBoolean( - password_manager::prefs::kWasSignInPasswordPromoClicked)); -} -#endif // !BUILDFLAG(IS_CHROMEOS_ASH) - -// Verify that URL keyed metrics are properly recorded. -TEST_F(SaveUpdateBubbleControllerTest, RecordUKMs) { - using BubbleDismissalReason = - password_manager::PasswordFormMetricsRecorder::BubbleDismissalReason; - using BubbleTrigger = - password_manager::PasswordFormMetricsRecorder::BubbleTrigger; - using password_manager::metrics_util::CredentialSourceType; - using UkmEntry = ukm::builders::PasswordForm; - - // |credential_management_api| defines whether credentials originate from the - // credential management API. - for (const bool credential_management_api : {false, true}) { - // |update| defines whether this is an update or a save bubble. - for (const bool update : {false, true}) { - for (const auto interaction : - {BubbleDismissalReason::kAccepted, BubbleDismissalReason::kDeclined, - BubbleDismissalReason::kIgnored}) { - SCOPED_TRACE(testing::Message() - << "update = " << update - << ", interaction = " << static_cast<int64_t>(interaction) - << ", credential management api =" - << credential_management_api); - ukm::TestAutoSetUkmRecorder test_ukm_recorder; - { - // Setup metrics recorder - auto recorder = base::MakeRefCounted< - password_manager::PasswordFormMetricsRecorder>( - true /*is_main_frame_secure*/, kTestSourceId, - /*pref_service=*/nullptr); - - // Exercise bubble. - ON_CALL(*delegate(), GetPasswordFormMetricsRecorder()) - .WillByDefault(Return(recorder.get())); - ON_CALL(*delegate(), GetCredentialSource()) - .WillByDefault( - Return(credential_management_api - ? CredentialSourceType::kCredentialManagementAPI - : CredentialSourceType::kPasswordManager)); - - if (update) - PretendUpdatePasswordWaiting(); - else - PretendPasswordWaiting(); - - if (interaction == BubbleDismissalReason::kAccepted) { - EXPECT_CALL(*GetStore(), - RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), - SavePassword(pending_password().username_value, - pending_password().password_value)); - controller()->OnSaveClicked(); - } else if (interaction == BubbleDismissalReason::kDeclined && - update) { - EXPECT_CALL(*delegate(), SavePassword(_, _)).Times(0); - controller()->OnNopeUpdateClicked(); - } else if (interaction == BubbleDismissalReason::kDeclined && - !update) { - EXPECT_CALL(*GetStore(), - RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); - EXPECT_CALL(*delegate(), SavePassword(_, _)).Times(0); - EXPECT_CALL(*delegate(), NeverSavePassword()); - controller()->OnNeverForThisSiteClicked(); - } else if (interaction == BubbleDismissalReason::kIgnored && update) { - EXPECT_CALL(*delegate(), SavePassword(_, _)).Times(0); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - } else if (interaction == BubbleDismissalReason::kIgnored && - !update) { - EXPECT_CALL(*GetStore(), AddSiteStatsImpl(testing::_)); - EXPECT_CALL(*delegate(), OnNoInteraction()); - EXPECT_CALL(*delegate(), SavePassword(_, _)).Times(0); - EXPECT_CALL(*delegate(), NeverSavePassword()).Times(0); - } else { - NOTREACHED(); - } - DestroyModelAndVerifyControllerExpectations(); - } - - ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(delegate())); - // Flush async calls on password store. - base::RunLoop().RunUntilIdle(); - ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(GetStore())); - - // Verify metrics. - const auto& entries = - test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName); - EXPECT_EQ(1u, entries.size()); - for (const auto* entry : entries) { - EXPECT_EQ(kTestSourceId, entry->source_id); - test_ukm_recorder.ExpectEntryMetric( - entry, - update ? UkmEntry::kUpdating_Prompt_ShownName - : UkmEntry::kSaving_Prompt_ShownName, - 1); - test_ukm_recorder.ExpectEntryMetric( - entry, - update ? UkmEntry::kUpdating_Prompt_TriggerName - : UkmEntry::kSaving_Prompt_TriggerName, - static_cast<int64_t>( - credential_management_api - ? BubbleTrigger::kCredentialManagementAPIAutomatic - : BubbleTrigger::kPasswordManagerSuggestionAutomatic)); - test_ukm_recorder.ExpectEntryMetric( - entry, - update ? UkmEntry::kUpdating_Prompt_InteractionName - : UkmEntry::kSaving_Prompt_InteractionName, - static_cast<int64_t>(interaction)); - } - } - } - } -} - -class SaveUpdateBubbleControllerPasswordRevealingTest - : public SaveUpdateBubbleControllerTest, - public testing::WithParamInterface< - std::tuple<bool /*is manual fallback*/, - bool /*form has autofilled value*/, - bool /*does os support user authentication*/, - PasswordBubbleControllerBase::DisplayReason>> {}; - -TEST_P(SaveUpdateBubbleControllerPasswordRevealingTest, - EyeIcon_ReauthForPasswordsRevealing) { - bool is_manual_fallback_for_saving = std::get<0>(GetParam()); - bool form_has_autofilled_value = std::get<1>(GetParam()); - bool does_os_support_user_auth = std::get<2>(GetParam()); - PasswordBubbleControllerBase::DisplayReason display_reason = - std::get<3>(GetParam()); - - // That state is impossible. - if (is_manual_fallback_for_saving && - (display_reason == - PasswordBubbleControllerBase::DisplayReason::kAutomatic)) - SUCCEED(); - - SCOPED_TRACE( - testing::Message() - << "is_manual_fallback_for_saving = " << is_manual_fallback_for_saving - << " form_has_autofilled_value = " << form_has_autofilled_value - << " display_reason = " - << (display_reason == - PasswordBubbleControllerBase::DisplayReason::kAutomatic - ? "AUTOMATIC" - : "USER_ACTION")); - - pending_password().form_has_autofilled_value = form_has_autofilled_value; - EXPECT_CALL(*delegate(), ArePasswordsRevealedWhenBubbleIsOpened()) - .WillOnce(Return(false)); - EXPECT_CALL(*delegate(), BubbleIsManualFallbackForSaving()) - .WillRepeatedly(Return(is_manual_fallback_for_saving)); - - PretendPasswordWaiting(display_reason); - bool reauth_expected = false; - if (display_reason == - PasswordBubbleControllerBase::DisplayReason::kUserAction) { - reauth_expected = - form_has_autofilled_value || !is_manual_fallback_for_saving; - } - EXPECT_EQ(reauth_expected, - controller()->password_revealing_requires_reauth()); - - if (reauth_expected) { - EXPECT_CALL(*delegate(), AuthenticateUser()) - .WillOnce(Return(!does_os_support_user_auth)); - EXPECT_EQ(controller()->RevealPasswords(), !does_os_support_user_auth); - } else { - EXPECT_CALL(*delegate(), AuthenticateUser()).Times(0); - EXPECT_TRUE(controller()->RevealPasswords()); - } -} - -INSTANTIATE_TEST_SUITE_P( - SaveUpdateBubbleController, - SaveUpdateBubbleControllerPasswordRevealingTest, - testing::Combine( - testing::Bool(), - testing::Bool(), - testing::Bool(), - testing::Values( - PasswordBubbleControllerBase::DisplayReason::kAutomatic, - PasswordBubbleControllerBase::DisplayReason::kUserAction))); - -TEST_F(SaveUpdateBubbleControllerTest, EyeIcon_BubbleReopenedAfterAuth) { - // Checks re-authentication is not needed if the bubble is opened right after - // successful authentication. - pending_password().form_has_autofilled_value = true; - // After successful authentication this value is set to true. - EXPECT_CALL(*delegate(), ArePasswordsRevealedWhenBubbleIsOpened()) - .WillOnce(Return(true)); - PretendPasswordWaiting( - PasswordBubbleControllerBase::DisplayReason::kUserAction); - - EXPECT_FALSE(controller()->password_revealing_requires_reauth()); - EXPECT_TRUE(controller()->RevealPasswords()); -} - -TEST_F(SaveUpdateBubbleControllerTest, PasswordsRevealedReported) { - PretendPasswordWaiting(); - - EXPECT_CALL(*delegate(), OnPasswordsRevealed()); - EXPECT_TRUE(controller()->RevealPasswords()); -} - -TEST_F(SaveUpdateBubbleControllerTest, PasswordsRevealedReportedAfterReauth) { - // The bubble is opened after reauthentication and the passwords are revealed. - pending_password().form_has_autofilled_value = true; - // After successful authentication this value is set to true. - EXPECT_CALL(*delegate(), ArePasswordsRevealedWhenBubbleIsOpened()) - .WillOnce(Return(true)); - EXPECT_CALL(*delegate(), OnPasswordsRevealed()); - PretendPasswordWaiting( - PasswordBubbleControllerBase::DisplayReason::kUserAction); -} - -TEST_F(SaveUpdateBubbleControllerTest, DisableEditing) { - EXPECT_CALL(*delegate(), BubbleIsManualFallbackForSaving()) - .WillRepeatedly(Return(false)); - EXPECT_CALL(*delegate(), GetCredentialSource()) - .WillOnce(Return(password_manager::metrics_util::CredentialSourceType:: - kCredentialManagementAPI)); - PretendPasswordWaiting(); - EXPECT_FALSE(controller()->enable_editing()); -}
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.h b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.h index d79831d..ff2f471 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.h +++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.h
@@ -23,6 +23,7 @@ // This controller provides data and actions for the // PasswordSaveUpdateWithAccountStoreView. +// TODO(crbug.com/1108738): Rename to SaveUpdateBubbleController. class SaveUpdateWithAccountStoreBubbleController : public PasswordBubbleControllerBase { public:
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller_unittest.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller_unittest.cc index 3deebaf..3d09d6a 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller_unittest.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller_unittest.cc
@@ -17,6 +17,8 @@ #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" #include "chrome/browser/password_manager/password_store_factory.h" +#include "chrome/browser/signin/chrome_signin_client_factory.h" +#include "chrome/browser/signin/test_signin_client_builder.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/passwords/passwords_model_delegate_mock.h" #include "chrome/test/base/testing_profile.h" @@ -80,8 +82,18 @@ ~SaveUpdateWithAccountStoreBubbleControllerTest() override = default; void SetUp() override { - test_web_contents_ = - content::WebContentsTester::CreateTestWebContents(&profile_, nullptr); + TestingProfile::Builder profile_builder; + profile_builder.AddTestingFactory( + ChromeSigninClientFactory::GetInstance(), + base::BindRepeating(&signin::BuildTestSigninClient)); + profile_builder.AddTestingFactory( + SyncServiceFactory::GetInstance(), + base::BindRepeating(&BuildTestSyncService)); + profile_ = profile_builder.Build(); + + test_web_contents_ = content::WebContentsTester::CreateTestWebContents( + profile_.get(), nullptr); + mock_delegate_ = std::make_unique<testing::NiceMock<PasswordsModelDelegateMock>>(); ON_CALL(*mock_delegate_, GetPasswordFeatureManager()) @@ -94,8 +106,6 @@ &password_manager::BuildPasswordStore< content::BrowserContext, testing::StrictMock<password_manager::MockPasswordStore>>)); - SyncServiceFactory::GetInstance()->SetTestingFactory( - profile(), base::BindRepeating(&BuildTestSyncService)); pending_password_.url = GURL(kSiteOrigin); pending_password_.signon_realm = kSiteOrigin; pending_password_.username_value = kUsername; @@ -108,7 +118,9 @@ controller_.reset(); } - TestingProfile* profile() { return &profile_; } + PrefService* prefs() { return profile_->GetPrefs(); } + + TestingProfile* profile() { return profile_.get(); } password_manager::MockPasswordStore* GetStore() { return static_cast<password_manager::MockPasswordStore*>( @@ -153,7 +165,7 @@ base::test::ScopedFeatureList feature_list_; content::BrowserTaskEnvironment task_environment_; content::RenderViewHostTestEnabler rvh_enabler_; - TestingProfile profile_; + std::unique_ptr<TestingProfile> profile_; std::unique_ptr<content::WebContents> test_web_contents_; std::unique_ptr<SaveUpdateWithAccountStoreBubbleController> controller_; testing::NiceMock<password_manager::MockPasswordFeatureManager>
diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc index 51c61e14..8efc2a0 100644 --- a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc +++ b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
@@ -24,6 +24,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "mojo/public/cpp/bindings/remote.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" using content::NavigationController; using content::NavigationEntry;
diff --git a/chrome/browser/ui/serial/serial_chooser_controller.cc b/chrome/browser/ui/serial/serial_chooser_controller.cc index f88ecce4..bba01de 100644 --- a/chrome/browser/ui/serial/serial_chooser_controller.cc +++ b/chrome/browser/ui/serial/serial_chooser_controller.cc
@@ -26,10 +26,10 @@ content::RenderFrameHost* render_frame_host, std::vector<blink::mojom::SerialPortFilterPtr> filters, content::SerialChooser::Callback callback) - : ChooserController( - CreateChooserTitle(render_frame_host, - IDS_SERIAL_PORT_CHOOSER_PROMPT_ORIGIN, - IDS_SERIAL_PORT_CHOOSER_PROMPT_EXTENSION_NAME)), + : ChooserController(CreateExtensionAwareChooserTitle( + render_frame_host, + IDS_SERIAL_PORT_CHOOSER_PROMPT_ORIGIN, + IDS_SERIAL_PORT_CHOOSER_PROMPT_EXTENSION_NAME)), filters_(std::move(filters)), callback_(std::move(callback)), frame_tree_node_id_(render_frame_host->GetFrameTreeNodeId()) {
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index 64c83a7..4bb14bc6 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -128,12 +128,8 @@ #endif void UrlsToTabs(const std::vector<GURL>& urls, StartupTabs* tabs) { - for (const GURL& url : urls) { - StartupTab tab; - tab.is_pinned = false; - tab.url = url; - tabs->push_back(tab); - } + for (const GURL& url : urls) + tabs->push_back(StartupTab(url, false)); } std::vector<GURL> TabsToUrls(const StartupTabs& tabs) {
diff --git a/chrome/browser/ui/startup/startup_tab.cc b/chrome/browser/ui/startup/startup_tab.cc index 499e194c..bb1d5919 100644 --- a/chrome/browser/ui/startup/startup_tab.cc +++ b/chrome/browser/ui/startup/startup_tab.cc
@@ -4,12 +4,7 @@ #include "chrome/browser/ui/startup/startup_tab.h" -StartupTab::StartupTab() - : is_pinned(true) { -} - StartupTab::StartupTab(const GURL& url, bool is_pinned) : url(url), is_pinned(is_pinned) {} -StartupTab::~StartupTab() { -} +StartupTab::~StartupTab() = default;
diff --git a/chrome/browser/ui/startup/startup_tab.h b/chrome/browser/ui/startup/startup_tab.h index d94de11..930177f 100644 --- a/chrome/browser/ui/startup/startup_tab.h +++ b/chrome/browser/ui/startup/startup_tab.h
@@ -11,7 +11,6 @@ // Represents tab data at startup. struct StartupTab { - StartupTab(); StartupTab(const GURL& url, bool is_pinned); ~StartupTab();
diff --git a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc index 6723d4eb..a35867d 100644 --- a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc +++ b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc
@@ -28,8 +28,11 @@ virtual ~TabSharingInfoBarDelegateButton() = default; virtual void Click(infobars::InfoBar* infobar) = 0; virtual std::u16string GetLabel() const = 0; + virtual ui::ImageModel GetImage() const { return ui::ImageModel(); } }; +namespace { + // Represents a button which, when clicked, changes the shared tab to be // the current tab (the one associated with this infobar.) class ShareTabInsteadButton : public TabSharingInfoBarDelegateButton { @@ -56,7 +59,7 @@ // class is for the captured tab to activate the capturing tab, and vice versa. class SwitchToTabButton : public TabSharingInfoBarDelegateButton { public: - SwitchToTabButton(content::GlobalRenderFrameHostId focus_target, + SwitchToTabButton(const TabSharingInfoBarDelegate::FocusTarget& focus_target, bool focus_target_is_captured) : focus_target_(focus_target), focus_target_is_captured_(focus_target_is_captured) {} @@ -64,7 +67,7 @@ void Click(infobars::InfoBar* infobar) override { content::RenderFrameHost* const rfh = - content::RenderFrameHost::FromID(focus_target_); + content::RenderFrameHost::FromID(focus_target_.id); if (!rfh) { return; } @@ -81,8 +84,9 @@ } std::u16string GetLabel() const override { + // TODO(crbug.com/1224363): Hard-code this text into the button. content::RenderFrameHost* const rfh = - content::RenderFrameHost::FromID(focus_target_); + content::RenderFrameHost::FromID(focus_target_.id); if (!rfh) { return GetDefaultLabel(); } @@ -93,6 +97,8 @@ url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS)); } + ui::ImageModel GetImage() const override { return focus_target_.icon; } + private: std::u16string GetDefaultLabel() const { return l10n_util::GetStringUTF16( @@ -101,10 +107,12 @@ : IDS_TAB_SHARING_INFOBAR_SWITCH_TO_CAPTURER_BUTTON); } - const content::GlobalRenderFrameHostId focus_target_; + const TabSharingInfoBarDelegate::FocusTarget focus_target_; const bool focus_target_is_captured_; }; +} // namespace + // static infobars::InfoBar* TabSharingInfoBarDelegate::Create( infobars::ContentInfoBarManager* infobar_manager, @@ -112,7 +120,7 @@ const std::u16string& app_name, bool shared_tab, bool can_share, - absl::optional<content::GlobalRenderFrameHostId> focus_target, + absl::optional<FocusTarget> focus_target, TabSharingUI* ui) { DCHECK(infobar_manager); return infobar_manager->AddInfoBar(CreateConfirmInfoBar(base::WrapUnique( @@ -125,7 +133,7 @@ std::u16string app_name, bool shared_tab, bool can_share, - absl::optional<content::GlobalRenderFrameHostId> focus_target, + absl::optional<FocusTarget> focus_target, TabSharingUI* ui) : shared_tab_name_(std::move(shared_tab_name)), app_name_(std::move(app_name)), @@ -180,6 +188,15 @@ } } +ui::ImageModel TabSharingInfoBarDelegate::GetButtonImage( + InfoBarButton button) const { + if (button == BUTTON_CANCEL) { + DCHECK(secondary_button_); + return secondary_button_->GetImage(); + } + return ui::ImageModel(); +} + int TabSharingInfoBarDelegate::GetButtons() const { return secondary_button_ ? BUTTON_OK | BUTTON_CANCEL : BUTTON_OK; }
diff --git a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.h b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.h index af3c390..18d4a72 100644 --- a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.h +++ b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.h
@@ -34,11 +34,18 @@ // "Sharing a tab to |app_name_| [Stop] [Share this tab instead]" class TabSharingInfoBarDelegate : public ConfirmInfoBarDelegate { public: + // Represents a target to which focus could be switched and its favicon. + struct FocusTarget { + content::GlobalRenderFrameHostId id; + ui::ImageModel icon; + }; + // Creates a tab sharing infobar, which has 1-2 buttons. // // The primary button is for stopping the capture. It is always present. // // If |focus_target| has a value, the secondary button switches focus. + // The image on the secondary button is derived from |focus_target|. // Else, if |can_share|, the secondary button changes the capture target // to be the tab associated with |this| object. // Otherwise, there is no secondary button. @@ -48,19 +55,18 @@ const std::u16string& app_name, bool shared_tab, bool can_share, - absl::optional<content::GlobalRenderFrameHostId> focus_target, + absl::optional<FocusTarget> focus_target, TabSharingUI* ui); ~TabSharingInfoBarDelegate() override; private: - TabSharingInfoBarDelegate( - std::u16string shared_tab_name, - std::u16string app_name, - bool shared_tab, - bool can_share, - absl::optional<content::GlobalRenderFrameHostId> focus_target, - TabSharingUI* ui); + TabSharingInfoBarDelegate(std::u16string shared_tab_name, + std::u16string app_name, + bool shared_tab, + bool can_share, + absl::optional<FocusTarget> focus_target, + TabSharingUI* ui); // ConfirmInfoBarDelegate: bool EqualsDelegate(InfoBarDelegate* delegate) const override; @@ -68,6 +74,7 @@ infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; std::u16string GetMessageText() const override; std::u16string GetButtonLabel(InfoBarButton button) const override; + ui::ImageModel GetButtonImage(InfoBarButton button) const override; int GetButtons() const override; bool Accept() override; bool Cancel() override;
diff --git a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate_unittest.cc b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate_unittest.cc index f8cdc05f..868b19b 100644 --- a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate_unittest.cc +++ b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/ui/tab_sharing/tab_sharing_ui.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/browser_with_test_window_test.h" @@ -15,10 +16,14 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/favicon_size.h" +#include "ui/gfx/image/image_unittest_util.h" #include "ui/gfx/vector_icon_types.h" namespace { +using FocusTarget = TabSharingInfoBarDelegate::FocusTarget; + const std::u16string kSharedTabName = u"example.com"; const std::u16string kAppName = u"sharing.com"; @@ -47,8 +52,7 @@ bool shared_tab, bool can_share, int tab_index = 0, - absl::optional<content::GlobalRenderFrameHostId> focus_target = - absl::nullopt) { + absl::optional<FocusTarget> focus_target = absl::nullopt) { return TabSharingInfoBarDelegate::Create( infobars::ContentInfoBarManager::FromWebContents( browser()->tab_strip_model()->GetWebContentsAt(tab_index)), @@ -62,8 +66,7 @@ bool shared_tab, bool can_share, int tab_index = 0, - absl::optional<content::GlobalRenderFrameHostId> focus_target = - absl::nullopt) { + absl::optional<FocusTarget> focus_target = absl::nullopt) { infobars::InfoBar* infobar = CreateInfobar(shared_tab_name, app_name, shared_tab, can_share, tab_index, focus_target); @@ -120,8 +123,15 @@ TEST_F(TabSharingInfoBarDelegateTest, InfobarOnCapturingTab) { AddTab(browser(), GURL("about:blank")); // Captured; index = 0. AddTab(browser(), GURL("about:blank")); // Capturing; index = 1. + + const ui::ImageModel favicon = ui::ImageModel::FromImage( + gfx::Image::CreateFrom1xBitmap(favicon::GenerateMonogramFavicon( + GURL("https://example.com"), gfx::kFaviconSize, gfx::kFaviconSize))); + ConfirmInfoBarDelegate* delegate = - CreateDelegate(std::u16string(), kAppName, true, true, 1, GetGlobalId(0)); + CreateDelegate(std::u16string(), kAppName, true, true, 1, + FocusTarget{GetGlobalId(0), favicon}); + EXPECT_STREQ(delegate->GetVectorIcon().name, vector_icons::kScreenShareIcon.name); EXPECT_EQ(delegate->GetMessageText(), @@ -133,6 +143,8 @@ l10n_util::GetStringUTF16(IDS_TAB_SHARING_INFOBAR_STOP_BUTTON)); EXPECT_EQ(delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL), GetExpectedSwitchToMessageForTargetTab(1)); + EXPECT_EQ(delegate->GetButtonImage(ConfirmInfoBarDelegate::BUTTON_CANCEL), + favicon); EXPECT_FALSE(delegate->IsCloseable()); } @@ -141,8 +153,15 @@ TEST_F(TabSharingInfoBarDelegateTest, InfobarOnCapturedTab) { AddTab(browser(), GURL("about:blank")); // Captured; index = 0. AddTab(browser(), GURL("about:blank")); // Capturing; index = 1. + + const ui::ImageModel favicon = ui::ImageModel::FromImage( + gfx::Image::CreateFrom1xBitmap(favicon::GenerateMonogramFavicon( + GURL("https://example.com"), gfx::kFaviconSize, gfx::kFaviconSize))); + ConfirmInfoBarDelegate* delegate = - CreateDelegate(std::u16string(), kAppName, true, true, 0, GetGlobalId(1)); + CreateDelegate(std::u16string(), kAppName, true, true, 0, + FocusTarget{GetGlobalId(1), favicon}); + EXPECT_STREQ(delegate->GetVectorIcon().name, vector_icons::kScreenShareIcon.name); EXPECT_EQ(delegate->GetMessageText(), @@ -154,6 +173,8 @@ l10n_util::GetStringUTF16(IDS_TAB_SHARING_INFOBAR_STOP_BUTTON)); EXPECT_EQ(delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL), GetExpectedSwitchToMessageForTargetTab(0)); + EXPECT_EQ(delegate->GetButtonImage(ConfirmInfoBarDelegate::BUTTON_CANCEL), + favicon); EXPECT_FALSE(delegate->IsCloseable()); }
diff --git a/chrome/browser/ui/tabs/pinned_tab_codec.cc b/chrome/browser/ui/tabs/pinned_tab_codec.cc index 04a3dfc..3b836c32 100644 --- a/chrome/browser/ui/tabs/pinned_tab_codec.cc +++ b/chrome/browser/ui/tabs/pinned_tab_codec.cc
@@ -22,60 +22,42 @@ using content::NavigationEntry; +namespace { + // Key used in dictionaries for the url. -static const char kURL[] = "url"; +const char kURL[] = "url"; -// Returns true if |browser| has any pinned tabs. -static bool HasPinnedTabs(Browser* browser) { +// Returns a Value representing the supplied StartupTab. +base::Value EncodeTab(const GURL& url) { + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetStringPath(kURL, url.spec()); + return dict; +} + +// Encodes all the pinned tabs from |browser| into |serialized_tabs|. +void EncodePinnedTabs(Browser* browser, base::Value* serialized_tabs) { + DCHECK(serialized_tabs->is_list()); + TabStripModel* tab_model = browser->tab_strip_model(); - for (int i = 0; i < tab_model->count(); ++i) { - if (tab_model->IsTabPinned(i)) - return true; + for (int i = 0; i < tab_model->count() && tab_model->IsTabPinned(i); ++i) { + content::WebContents* web_contents = tab_model->GetWebContentsAt(i); + NavigationEntry* entry = + web_contents->GetController().GetLastCommittedEntry(); + if (entry) + serialized_tabs->Append(EncodeTab(entry->GetURL())); } - return false; -} - -// Adds a DictionaryValue to |values| representing |tab|. -static void EncodeTab(const StartupTab& tab, base::ListValue* values) { - std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue); - value->SetString(kURL, tab.url.spec()); - values->Append(std::move(value)); -} - -// Adds a base::DictionaryValue to |values| representing the pinned tab at the -// specified index. -static void EncodePinnedTab(TabStripModel* model, - int index, - base::ListValue* values) { - std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); - - content::WebContents* web_contents = model->GetWebContentsAt(index); - NavigationEntry* entry = - web_contents->GetController().GetLastCommittedEntry(); - if (entry) { - value->SetString(kURL, entry->GetURL().spec()); - values->Append(std::move(value)); - } -} - -// Invokes EncodePinnedTab for each pinned tab in browser. -static void EncodePinnedTabs(Browser* browser, base::ListValue* values) { - TabStripModel* tab_model = browser->tab_strip_model(); - for (int i = 0; i < tab_model->count() && tab_model->IsTabPinned(i); ++i) - EncodePinnedTab(tab_model, i, values); } // Decodes the previously written values in |value| to |tab|, returning true // on success. -static bool DecodeTab(const base::DictionaryValue& value, StartupTab* tab) { - std::string url_string; - if (!value.GetString(kURL, &url_string)) - return false; - tab->url = GURL(url_string); - - return true; +absl::optional<StartupTab> DecodeTab(const base::Value& value) { + const std::string* const url_string = value.FindStringPath(kURL); + return url_string ? absl::make_optional(StartupTab(GURL(*url_string), true)) + : absl::nullopt; } +} // namespace + // static void PinnedTabCodec::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { @@ -88,10 +70,9 @@ if (!prefs) return; - base::ListValue values; + base::Value values(base::Value::Type::LIST); for (auto* browser : *BrowserList::GetInstance()) { - if (browser->is_type_normal() && browser->profile() == profile && - HasPinnedTabs(browser)) { + if (browser->is_type_normal() && browser->profile() == profile) { EncodePinnedTabs(browser, &values); } } @@ -106,17 +87,17 @@ return; ListPrefUpdate update(prefs, prefs::kPinnedTabs); - base::ListValue* values = update.Get(); - values->Clear(); - for (auto i = tabs.begin(); i != tabs.end(); ++i) - EncodeTab(*i, values); + base::Value* values = update.Get(); + values->ClearList(); + for (const auto& tab : tabs) + values->Append(EncodeTab(tab.url)); } // static StartupTabs PinnedTabCodec::ReadPinnedTabs(Profile* profile) { PrefService* prefs = profile->GetPrefs(); if (!prefs) - return StartupTabs(); + return {}; return ReadPinnedTabs(prefs->GetList(prefs::kPinnedTabs)); } @@ -124,17 +105,16 @@ StartupTabs PinnedTabCodec::ReadPinnedTabs(const base::Value* value) { StartupTabs results; - const base::ListValue* tabs_list = NULL; - if (!value->GetAsList(&tabs_list)) + if (!value->is_list()) return results; - for (size_t i = 0, max = tabs_list->GetSize(); i < max; ++i) { - const base::DictionaryValue* tab_values = NULL; - if (tabs_list->GetDictionary(i, &tab_values)) { - StartupTab tab; - if (DecodeTab(*tab_values, &tab)) - results.push_back(tab); - } + for (const auto& serialized_tab : value->GetList()) { + if (!serialized_tab.is_dict()) + continue; + absl::optional<StartupTab> tab = DecodeTab(serialized_tab); + if (tab.has_value()) + results.push_back(tab.value()); } + return results; }
diff --git a/chrome/browser/ui/tabs/pinned_tab_codec_unittest.cc b/chrome/browser/ui/tabs/pinned_tab_codec_unittest.cc index 3212c99c..24ab0f7 100644 --- a/chrome/browser/ui/tabs/pinned_tab_codec_unittest.cc +++ b/chrome/browser/ui/tabs/pinned_tab_codec_unittest.cc
@@ -15,7 +15,7 @@ #include "chrome/test/base/testing_profile.h" #include "testing/gtest/include/gtest/gtest.h" -typedef BrowserWithTestWindowTest PinnedTabCodecTest; +using PinnedTabCodecTest = BrowserWithTestWindowTest; // Make sure nothing is restored when the browser has no pinned tabs. TEST_F(PinnedTabCodecTest, NoPinnedTabs) {
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc index 34b7cd85..c1ff14e7 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/desktop_capture/desktop_media_source_view.h" -#include "chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/constrained_window/constrained_window_views.h" @@ -675,10 +674,5 @@ // static std::unique_ptr<DesktopMediaPicker> DesktopMediaPicker::Create( const content::MediaStreamRequest* request) { - if (request && DesktopMediaList::kConfirmationOnlyDialogSupported && - request->video_type == - blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB) { - return std::make_unique<GetCurrentBrowsingContextMediaDialog>(); - } return std::make_unique<DesktopMediaPickerViews>(); }
diff --git a/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.cc b/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.cc deleted file mode 100644 index 8841a1957..0000000 --- a/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.cc +++ /dev/null
@@ -1,203 +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 "chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.h" - -#include "base/command_line.h" -#include "chrome/browser/media/webrtc/desktop_media_picker_manager.h" -#include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/views/chrome_layout_provider.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/grit/generated_resources.h" -#include "components/constrained_window/constrained_window_views.h" -#include "components/web_modal/web_contents_modal_dialog_manager.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/browser/web_contents_delegate.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/models/dialog_model.h" -#include "ui/views/controls/button/checkbox.h" -#include "ui/views/controls/textfield/textfield.h" -#include "ui/views/layout/box_layout.h" - -namespace { -constexpr int kCheckboxId = 1; - -class GetCurrentBrowsingContextMediaDialogDelegate - : public ui::DialogModelDelegate { - public: - GetCurrentBrowsingContextMediaDialogDelegate( - const DesktopMediaPicker::Params& params, - GetCurrentBrowsingContextMediaDialog* parent) - : render_process_id_( - params.web_contents->GetMainFrame()->GetProcess()->GetID()), - render_frame_id_(params.web_contents->GetMainFrame()->GetRoutingID()), - parent_(parent) { - DCHECK(parent_); - } - - // Callback functions for when the permission is granted. - void OnAccept() { - // |id| is non-null if and only if it refers to a native screen/window. - content::DesktopMediaID source(content::DesktopMediaID::TYPE_WEB_CONTENTS, - /*id=*/content::DesktopMediaID::kNullId, - content::WebContentsMediaCaptureId( - render_process_id_, render_frame_id_)); - - source.audio_share = - dialog_model()->HasField(kCheckboxId) && - dialog_model()->GetCheckboxByUniqueId(kCheckboxId)->is_checked(); - - // Gets the tab to be shared, which is the current tab in this - // case. - content::WebContents* const tab = content::WebContents::FromRenderFrameHost( - content::RenderFrameHost::FromID(render_process_id_, render_frame_id_)); - // Activates the current tab and browser as confirmation that this is the - // tab being shared as the user might tab away between the time "share" was - // pressed and the actual share starts. - tab->GetDelegate()->ActivateContents(tab); - Browser* browser = chrome::FindBrowserWithWebContents(tab); - if (browser && browser->window()) { - browser->window()->Activate(); - } - - if (parent_) { - parent_->NotifyDialogResult(source); - parent_ = nullptr; - } - } - - // Callback functions for when the permission is rejected or if the - // dialog/window is closed by the user. - void OnClose() { - if (parent_) { - parent_->NotifyDialogResult(content::DesktopMediaID()); - parent_ = nullptr; - } - } - - private: - // The pair of values (render_process_id_, render_frame_id_) together define - // the browsing context which is to be shared. - const int render_process_id_; - const int render_frame_id_; - - GetCurrentBrowsingContextMediaDialog* parent_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(GetCurrentBrowsingContextMediaDialogDelegate); -}; -} // namespace - -GetCurrentBrowsingContextMediaDialog::GetCurrentBrowsingContextMediaDialog() - : auto_accept_tab_capture_for_testing_( - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kThisTabCaptureAutoAccept)), - auto_reject_tab_capture_for_testing_( - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kThisTabCaptureAutoReject)) { - DCHECK(!auto_accept_tab_capture_for_testing_ || - !auto_reject_tab_capture_for_testing_); -} - -GetCurrentBrowsingContextMediaDialog::~GetCurrentBrowsingContextMediaDialog() = - default; - -void GetCurrentBrowsingContextMediaDialog::NotifyDialogResult( - const content::DesktopMediaID& source) { - DesktopMediaPickerManager::Get()->OnHideDialog(); - - if (callback_) { - std::move(callback_).Run(source); - } -} - -void GetCurrentBrowsingContextMediaDialog::Show( - const DesktopMediaPicker::Params& params, - std::vector<std::unique_ptr<DesktopMediaList>> source_lists, - DoneCallback done_callback) { - DCHECK(params.web_contents); - - DesktopMediaPickerManager::Get()->OnShowDialog(); - callback_ = std::move(done_callback); - std::unique_ptr<views::DialogDelegate> unique_delegate = - CreateDialogHost(params); - - constrained_window::ShowWebModalDialogViews(unique_delegate.release(), - params.web_contents); - - chrome::RecordDialogCreation( - chrome::DialogIdentifier::CURRENT_BROWSING_CONTEXT_CONFIRMATION_BOX); - - MaybeAutomateUserInput(); -} - -std::unique_ptr<views::DialogDelegate> -GetCurrentBrowsingContextMediaDialog::CreateDialogHost( - const DesktopMediaPicker::Params& params) { - auto unique_model_delegate = - std::make_unique<GetCurrentBrowsingContextMediaDialogDelegate>(params, - this); - GetCurrentBrowsingContextMediaDialogDelegate* model_delegate = - unique_model_delegate.get(); - - ui::DialogModel::Builder dialog_builder(std::move(unique_model_delegate)); - // TODO(crbug.com/1136942): Reconcile design-doc and implementation wrt - // the body text; display frame's URL. - dialog_builder - .AddBodyText(ui::DialogModelLabel(l10n_util::GetStringFUTF16( - IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TEXT_REQUESTED_BY_APP, - params.target_name))) - .AddCancelButton( - base::BindOnce(&GetCurrentBrowsingContextMediaDialogDelegate::OnClose, - base::Unretained(model_delegate))) - .AddOkButton( - base::BindOnce( - &GetCurrentBrowsingContextMediaDialogDelegate::OnAccept, - base::Unretained(model_delegate)), - l10n_util::GetStringUTF16( - IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_SHARE_BUTTON)) - .SetCloseCallback( - base::BindOnce(&GetCurrentBrowsingContextMediaDialogDelegate::OnClose, - base::Unretained(model_delegate))) - .SetTitle(l10n_util::GetStringUTF16( - IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TITLE)); - - if (params.request_audio) { - dialog_builder.AddCheckbox( - kCheckboxId, - ui::DialogModelLabel(l10n_util::GetStringUTF16( - IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_AUDIO_SHARE)), - ui::DialogModelCheckbox::Params().SetIsChecked( - params.approve_audio_by_default)); - } - - auto dialog_host = views::BubbleDialogModelHost::CreateModal( - dialog_builder.Build(), params.modality); - dialog_host->SetDefaultButton(ui::DIALOG_BUTTON_CANCEL); - dialog_host->SetOwnedByWidget(true); - dialog_model_host_for_testing_ = dialog_host.get(); - return dialog_host; -} - -void GetCurrentBrowsingContextMediaDialog::MaybeAutomateUserInput() { - if (!auto_accept_tab_capture_for_testing_ && - !auto_reject_tab_capture_for_testing_) { - return; - } - - // dialog_model_host_for_testing_ outlives the callback here because its - // ownership is passed to the widget, when the widget is created, and this - // widget cannot get destroyed in a test without going through this callback. - content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce( - [](views::BubbleDialogModelHost* dialog_host, bool accept) { - accept ? dialog_host->Accept() : dialog_host->Cancel(); - }, - base::Unretained(dialog_model_host_for_testing_), - auto_accept_tab_capture_for_testing_)); -} \ No newline at end of file
diff --git a/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.h b/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.h deleted file mode 100644 index 983e3d43..0000000 --- a/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.h +++ /dev/null
@@ -1,54 +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 CHROME_BROWSER_UI_VIEWS_DESKTOP_CAPTURE_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_H_ -#define CHROME_BROWSER_UI_VIEWS_DESKTOP_CAPTURE_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_H_ - -#include "base/macros.h" -#include "build/build_config.h" -#include "chrome/browser/media/webrtc/desktop_media_picker.h" -#include "chrome/browser/ui/views/desktop_capture/desktop_media_list_controller.h" -#include "ui/base/models/dialog_model.h" -#include "ui/base/models/dialog_model_field.h" -#include "ui/views/bubble/bubble_dialog_model_host.h" -#include "ui/views/window/dialog_delegate.h" - -class GetCurrentBrowsingContextMediaDialog : public DesktopMediaPicker { - public: - GetCurrentBrowsingContextMediaDialog(); - ~GetCurrentBrowsingContextMediaDialog() override; - - void NotifyDialogResult(const content::DesktopMediaID& source); - - // DesktopMediaPicker: - void Show(const DesktopMediaPicker::Params& params, - std::vector<std::unique_ptr<DesktopMediaList>> source_lists, - DoneCallback done_callback) override; - - views::BubbleDialogModelHost* GetHostForTesting() { - return dialog_model_host_for_testing_; - } - - private: - // Used to create the dialog using ui::DialogModel. - std::unique_ptr<views::DialogDelegate> CreateDialogHost( - const DesktopMediaPicker::Params& params); - - // This method is used as a callback to support automatically accepting or - // rejecting tab-capture through getCurrentBrowserContextMedia in tests. - // It acts as though the user had accepted/rejected the capture-request. - void MaybeAutomateUserInput(); - - // These flags are used for testing and make an automatic selection - // without the user's input. - const bool auto_accept_tab_capture_for_testing_; - const bool auto_reject_tab_capture_for_testing_; - - DoneCallback callback_; - views::BubbleDialogModelHost* dialog_model_host_for_testing_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(GetCurrentBrowsingContextMediaDialog); -}; - -#endif // CHROME_BROWSER_UI_VIEWS_DESKTOP_CAPTURE_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_H_
diff --git a/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog_unittest.cc b/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog_unittest.cc deleted file mode 100644 index eca32e2..0000000 --- a/chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog_unittest.cc +++ /dev/null
@@ -1,311 +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 "chrome/browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog.h" - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/run_loop.h" -#include "base/strings/utf_string_conversions.h" -#include "base/task/post_task.h" -#include "build/build_config.h" -#include "build/chromeos_buildflags.h" -#include "chrome/browser/media/webrtc/desktop_media_picker_manager.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/test/base/browser_with_test_window_test.h" -#include "components/web_modal/test_web_contents_modal_dialog_host.h" -#include "components/web_modal/test_web_contents_modal_dialog_manager_delegate.h" -#include "components/web_modal/web_contents_modal_dialog_manager.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/render_process_host.h" -#include "ipc/ipc_message.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/ui_base_switches.h" -#include "ui/views/controls/button/checkbox.h" -#include "ui/web_dialogs/web_dialog_web_contents_delegate.h" - -// All tests are flaky on Win10: https://crbug.com/1181150 -#if !defined(OS_WIN) -namespace { -#if defined(OS_MAC) -constexpr ui::KeyboardCode kDefaultKey = ui::VKEY_SPACE; -#else -constexpr ui::KeyboardCode kDefaultKey = ui::VKEY_RETURN; -#endif -} // namespace -#endif - -enum AutoAction { kNone, kAutoAccept, kAutoReject }; - -namespace views { - -class MockDialogObserver : public DesktopMediaPickerManager::DialogObserver { - public: - MOCK_METHOD(void, OnDialogOpened, (), (override)); - MOCK_METHOD(void, OnDialogClosed, (), (override)); -}; - -class MockWebContentsDelegate : public content::WebContentsDelegate {}; - -class GetCurrentBrowsingContextMediaDialogTest - : public BrowserWithTestWindowTest { - public: - void CustomSetUp(bool request_audio, - bool approve_audio_by_default, - bool is_closed_called = true, - AutoAction auto_action = kNone) { -#if defined(OS_MAC) - // These tests create actual child Widgets, which normally have a closure - // animation on Mac; inhibit it here to avoid the tests flakily hanging. - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kDisableModalAnimations); -#endif - DesktopMediaPickerManager::Get()->AddObserver(&mock_dialog_observer_); - AddTab(browser(), GURL(url::kAboutBlankURL)); - - web_contents_ = - browser()->tab_strip_model()->DetachWebContentsAtForInsertion(0); - web_contents_->SetDelegate(&web_delegate_); - - // Creates the parent widget which is needed for creating child widgets. - auto dialog_delegate = std::make_unique<views::DialogDelegateView>(); - dialog_delegate->SetModalType(ui::MODAL_TYPE_WINDOW); - parent_widget_ = views::DialogDelegate::CreateDialogWidget( - dialog_delegate.release(), GetContext(), nullptr); - - // Creates and sets the dialog host. - dialog_host_ = std::make_unique<web_modal::TestWebContentsModalDialogHost>( - parent_widget_->GetNativeView()); - dialog_host_->set_max_dialog_size(gfx::Size(500, 500)); - manager_delegate_.set_web_contents_modal_dialog_host(dialog_host_.get()); - - // Sets delegate for web_contents_. - web_modal::WebContentsModalDialogManager::CreateForWebContents( - web_contents_.get()); - auto* manager = web_modal::WebContentsModalDialogManager::FromWebContents( - web_contents_.get()); - manager->SetDelegate(&manager_delegate_); - - DesktopMediaPicker::Params dialog_params; - // Sets the parameters for the confirmation dialog. - dialog_params.web_contents = web_contents_.get(); - dialog_params.context = GetContext(); - dialog_params.parent = parent_widget_->GetNativeWindow(); - dialog_params.app_name = u"OriginApp"; - dialog_params.target_name = u"TargetApp"; - dialog_params.request_audio = request_audio; - dialog_params.approve_audio_by_default = approve_audio_by_default; - - EXPECT_CALL(mock_dialog_observer_, OnDialogOpened()).Times(1); - EXPECT_CALL(mock_dialog_observer_, OnDialogClosed()) - .Times(is_closed_called ? 1 : 0); - - if (auto_action == kAutoAccept) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kThisTabCaptureAutoAccept); - } - if (auto_action == kAutoReject) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kThisTabCaptureAutoReject); - } - - dialog_ = std::make_unique<GetCurrentBrowsingContextMediaDialog>(); - dialog_->Show( - dialog_params, {}, - base::BindOnce(&GetCurrentBrowsingContextMediaDialogTest::OnDialogDone, - base::Unretained(this))); - render_process_id_ = web_contents_->GetMainFrame()->GetProcess()->GetID(); - render_frame_id_ = web_contents_->GetMainFrame()->GetRoutingID(); - } - - void TearDown() override { - DesktopMediaPickerManager::Get()->RemoveObserver(&mock_dialog_observer_); - parent_widget_->CloseWithReason(Widget::ClosedReason::kUnspecified); - web_contents_.reset(); - BrowserWithTestWindowTest::TearDown(); - } - - absl::optional<content::DesktopMediaID> WaitForDialogDone() { - run_loop_.Run(); - return dialog_id_; - } - - void DoubleTapShareButton() { - ui::GestureEventDetails details(ui::ET_GESTURE_TAP); - details.set_tap_count(2); - ui::GestureEvent double_tap(/*x=*/10, /*y=*/10, /*flags=*/0, - base::TimeTicks(), details); - dialog_->GetHostForTesting()->GetOkButton()->OnGestureEvent(&double_tap); - } - - void SimulateKeyPress(ui::KeyboardCode key) { - ui::KeyEvent event(ui::ET_KEY_PRESSED, key, ui::EF_NONE); - dialog_->GetHostForTesting()->GetWidget()->OnKeyEvent(&event); - } - - void OnDialogDone(content::DesktopMediaID dialog_id) { - dialog_id_ = dialog_id; - run_loop_.Quit(); - } - - protected: - absl::optional<content::DesktopMediaID> dialog_id_; - int render_process_id_ = MSG_ROUTING_NONE; - int render_frame_id_ = MSG_ROUTING_NONE; - std::unique_ptr<content::WebContents> web_contents_; - // dialog_ is responsible for creating the confirmation dialog and is - // used to access the host for testing. - std::unique_ptr<GetCurrentBrowsingContextMediaDialog> dialog_; - MockDialogObserver mock_dialog_observer_; - MockWebContentsDelegate web_delegate_; - std::unique_ptr<web_modal::TestWebContentsModalDialogHost> dialog_host_; - web_modal::TestWebContentsModalDialogManagerDelegate manager_delegate_; - Widget* parent_widget_; - base::RunLoop run_loop_; -}; - -// All tests are flaky on Win10: https://crbug.com/1181150 -#if !defined(OS_WIN) -TEST_F(GetCurrentBrowsingContextMediaDialogTest, CancelButtonAlwaysEnabled) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true, - /*is_closed_called=*/false); - EXPECT_TRUE(dialog_->GetHostForTesting()->IsDialogButtonEnabled( - ui::DIALOG_BUTTON_CANCEL)); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, ShareButtonAlwaysEnabled) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true, - /*is_closed_called=*/false); - EXPECT_TRUE(dialog_->GetHostForTesting()->IsDialogButtonEnabled( - ui::DIALOG_BUTTON_OK)); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, DefaultAudioSelection) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - kResultId.audio_share = true; - dialog_->GetHostForTesting()->AcceptDialog(); - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, - DoneCallbackCalledWhenWindowClosed) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true); - dialog_->GetHostForTesting()->Close(); - EXPECT_EQ(content::DesktopMediaID(), WaitForDialogDone()); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, - DoneCallbackCalledWhenWindowClosedWithoutCheckboxTicked) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/false); - dialog_->GetHostForTesting()->Close(); - EXPECT_EQ(content::DesktopMediaID(), WaitForDialogDone()); -} - -// Verifies that audio share information is recorded if the checkbox -// is checked. -TEST_F(GetCurrentBrowsingContextMediaDialogTest, - DoneCallbackCalledWithAudioShare) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - kResultId.audio_share = true; - dialog_->GetHostForTesting()->AcceptDialog(); - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -// Verifies that audio share information is recorded if there is no checkbox. -TEST_F(GetCurrentBrowsingContextMediaDialogTest, - DoneCallbackCalledWithNoAudioShare) { - CustomSetUp(/*request_audio=*/false, /*approve_audio_by_default=*/true); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - dialog_->GetHostForTesting()->AcceptDialog(); - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -// Verifies that audio share information is recorded if the checkbox -// is not checked. -TEST_F(GetCurrentBrowsingContextMediaDialogTest, - DoneCallbackCalledWithAudioShareFalse) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/false); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - dialog_->GetHostForTesting()->AcceptDialog(); - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -#if !BUILDFLAG(IS_CHROMEOS_ASH) -TEST_F(GetCurrentBrowsingContextMediaDialogTest, PressingDefaultButtonCancels) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true); - SimulateKeyPress(kDefaultKey); - EXPECT_EQ(content::DesktopMediaID(), WaitForDialogDone()); -} -#endif - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, ShareButtonAccepts) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - kResultId.audio_share = true; - dialog_->GetHostForTesting()->GetOkButton()->OnKeyPressed( - ui::KeyEvent(ui::ET_KEY_PRESSED, kDefaultKey, 0)); - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, DoubleTapOnShare) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - kResultId.audio_share = true; - DoubleTapShareButton(); - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, AutoAcceptTabCapture) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true, - /*is_closed_called=*/true, /*auto_action=*/kAutoAccept); - content::DesktopMediaID kResultId( - content::DesktopMediaID::TYPE_WEB_CONTENTS, 0, - content::WebContentsMediaCaptureId(render_process_id_, render_frame_id_)); - kResultId.audio_share = true; - EXPECT_EQ(kResultId, WaitForDialogDone()); -} - -TEST_F(GetCurrentBrowsingContextMediaDialogTest, AutoRejectTabCapture) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true, - /*is_closed_called=*/true, /*auto_action=*/kAutoReject); - EXPECT_EQ(content::DesktopMediaID(), WaitForDialogDone()); -} - -// Validates that the cancel button is initially focused and enabled. -TEST_F(GetCurrentBrowsingContextMediaDialogTest, InitiallyFocusesCancel) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true, - /*is_closed_called=*/false); - EXPECT_EQ(dialog_->GetHostForTesting()->GetCancelButton(), - dialog_->GetHostForTesting()->GetInitiallyFocusedView()); -} - -// Validate that the title of the confirmation box shows the correct text. -TEST_F(GetCurrentBrowsingContextMediaDialogTest, - ConfirmationBoxShowsCorrectTitle) { - CustomSetUp(/*request_audio=*/true, /*approve_audio_by_default=*/true, - /*is_closed_called=*/false); - EXPECT_EQ(dialog_->GetHostForTesting()->GetWindowTitle(), - l10n_util::GetStringUTF16( - IDS_GET_CURRENT_BROWSING_CONTEXT_MEDIA_DIALOG_TITLE)); -} -#endif - -} // namespace views
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.cc b/chrome/browser/ui/views/frame/tab_strip_region_view.cc index f342997..a621be042 100644 --- a/chrome/browser/ui/views/frame/tab_strip_region_view.cc +++ b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
@@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" -#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/ui_features.h" @@ -16,6 +15,7 @@ #include "chrome/browser/ui/views/tabs/tab_search_button.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" #include "chrome/browser/ui/views/tabs/tab_strip_controller.h" +#include "chrome/browser/ui/views/tabs/tab_strip_scroll_container.h" #include "chrome/browser/ui/views/tabs/tab_style_views.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/views/user_education/tip_marquee_view.h" @@ -24,11 +24,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/views/animation/ink_drop.h" #include "ui/views/controls/button/image_button.h" -#include "ui/views/controls/button/image_button_factory.h" -#include "ui/views/controls/highlight_path_generator.h" -#include "ui/views/controls/scroll_view.h" #include "ui/views/layout/flex_layout.h" #include "ui/views/layout/flex_layout_types.h" #include "ui/views/style/typography.h" @@ -36,39 +32,6 @@ namespace { -// Define a custom FlexRule for |tabstrip_scroll_container_|. Equivalent to -// using a (kScaleToMinimum, kPreferred) flex specification on the tabstrip -// itself, bypassing the ScrollView. -// TODO(1132488): Make ScrollView take on TabStrip's preferred size instead. -gfx::Size TabScrollContainerFlexRule(const views::View* tab_strip, - const views::View* view, - const views::SizeBounds& size_bounds) { - const gfx::Size preferred_size = tab_strip->GetPreferredSize(); - return gfx::Size(size_bounds.width().min_of(preferred_size.width()), - preferred_size.height()); -} - -std::unique_ptr<views::ImageButton> CreateScrollButton( - views::Button::PressedCallback callback) { - // TODO(tbergquist): These have a lot in common with the NTB and the tab - // search buttons. Could probably extract a base class. - auto scroll_button = - std::make_unique<views::ImageButton>(std::move(callback)); - scroll_button->SetImageVerticalAlignment( - views::ImageButton::VerticalAlignment::ALIGN_MIDDLE); - scroll_button->SetImageHorizontalAlignment( - views::ImageButton::HorizontalAlignment::ALIGN_CENTER); - scroll_button->SetHasInkDropActionOnClick(true); - views::InkDrop::Get(scroll_button.get()) - ->SetMode(views::InkDropHost::InkDropMode::ON); - scroll_button->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); - scroll_button->SetPreferredSize(gfx::Size(28, 28)); - views::HighlightPathGenerator::Install( - scroll_button.get(), - std::make_unique<views::CircleHighlightPathGenerator>(gfx::Insets())); - return scroll_button; -} - class FrameGrabHandle : public views::View { public: METADATA_HEADER(FrameGrabHandle); @@ -83,77 +46,6 @@ BEGIN_METADATA(FrameGrabHandle, views::View) END_METADATA -// A customized overflow indicator that fades the tabs into the frame -// background. -class TabStripContainerOverflowIndicator : public views::View { - public: - METADATA_HEADER(TabStripContainerOverflowIndicator); - TabStripContainerOverflowIndicator(TabStrip* tab_strip, - views::OverflowIndicatorAlignment side) - : tab_strip_(tab_strip), side_(side) { - DCHECK(side_ == views::OverflowIndicatorAlignment::kLeft || - side_ == views::OverflowIndicatorAlignment::kRight); - } - - // Making this smaller than the margin provided by the leftmost/rightmost - // tab's tail (TabStyle::kTabOverlap / 2) makes the transition in and out of - // the scroll state smoother. - static constexpr int kOpaqueWidth = 8; - // The width of the full opacity part of the shadow. - static constexpr int kShadowSpread = 1; - // The width of the soft edge of the shadow. - static constexpr int kShadowBlur = 3; - static constexpr int kTotalWidth = kOpaqueWidth + kShadowSpread + kShadowBlur; - - // views::View overrides: - void OnPaint(gfx::Canvas* canvas) override { - // TODO(tbergquist): Handle themes with titlebar background images. - // TODO(tbergquist): Handle dark themes where GG800 doesn't contrast well. - SkColor frame_color = tab_strip_->controller()->GetFrameColor( - BrowserFrameActiveState::kUseCurrent); - SkColor shadow_color = gfx::kGoogleGrey800; - - // Mirror how the indicator is painted for the right vs left sides. - SkPoint points[2]; - if (side_ == views::OverflowIndicatorAlignment::kLeft) { - points[0].iset(GetContentsBounds().origin().x(), GetContentsBounds().y()); - points[1].iset(GetContentsBounds().right(), GetContentsBounds().y()); - } else { - points[0].iset(GetContentsBounds().right(), GetContentsBounds().y()); - points[1].iset(GetContentsBounds().origin().x(), GetContentsBounds().y()); - } - - SkColor colors[5]; - SkScalar color_positions[5]; - // Paint an opaque region on the outside. - colors[0] = frame_color; - colors[1] = frame_color; - color_positions[0] = 0; - color_positions[1] = static_cast<float>(kOpaqueWidth) / kTotalWidth; - - // Paint a shadow-like gradient on the inside. - colors[2] = SkColorSetA(shadow_color, 0x4D); - colors[3] = SkColorSetA(shadow_color, 0x4D); - colors[4] = SkColorSetA(shadow_color, SK_AlphaTRANSPARENT); - color_positions[2] = static_cast<float>(kOpaqueWidth) / kTotalWidth; - color_positions[3] = - static_cast<float>(kOpaqueWidth + kShadowSpread) / kTotalWidth; - color_positions[4] = 1; - - cc::PaintFlags flags; - flags.setShader(cc::PaintShader::MakeLinearGradient( - points, colors, color_positions, 5, SkTileMode::kClamp)); - canvas->DrawRect(GetContentsBounds(), flags); - } - - private: - TabStrip* tab_strip_; - views::OverflowIndicatorAlignment side_; -}; - -BEGIN_METADATA(TabStripContainerOverflowIndicator, views::View) -END_METADATA - } // namespace TabStripRegionView::TabStripRegionView(std::unique_ptr<TabStrip> tab_strip) { @@ -164,44 +56,18 @@ layout_manager_->SetOrientation(views::LayoutOrientation::kHorizontal); tab_strip_ = tab_strip.get(); - tab_strip->SetAvailableWidthCallback(base::BindRepeating( - &TabStripRegionView::GetTabStripAvailableWidth, base::Unretained(this))); if (base::FeatureList::IsEnabled(features::kScrollableTabStrip)) { - // TODO(https://crbug.com/1132488): ScrollView doesn't propagate changes to - // the TabStrip's preferred size; observe that manually. - tab_strip->View::AddObserver(this); + tab_strip_container_ = AddChildView( + std::make_unique<TabStripScrollContainer>(std::move(tab_strip))); + // Allow the |tab_strip_container_| to grow into the free space available in + // the TabStripRegionView. + const views::FlexSpecification tab_strip_container_flex_spec = + views::FlexSpecification(views::LayoutOrientation::kHorizontal, + views::MinimumFlexSizeRule::kScaleToMinimum, + views::MaximumFlexSizeRule::kPreferred); + tab_strip_container_->SetProperty(views::kFlexBehaviorKey, + tab_strip_container_flex_spec); - views::ScrollView* tab_strip_scroll_container = - AddChildView(std::make_unique<views::ScrollView>( - views::ScrollView::ScrollWithLayers::kEnabled)); - tab_strip_scroll_container->SetBackgroundColor(absl::nullopt); - tab_strip_scroll_container->SetHorizontalScrollBarMode( - views::ScrollView::ScrollBarMode::kHiddenButEnabled); - tab_strip_scroll_container->SetTreatAllScrollEventsAsHorizontal(true); - tab_strip_container_ = tab_strip_scroll_container; - tab_strip_scroll_container->SetContents(std::move(tab_strip)); - - tab_strip_scroll_container->SetDrawOverflowIndicator(true); - left_overflow_indicator_ = - tab_strip_scroll_container->SetCustomOverflowIndicator( - views::OverflowIndicatorAlignment::kLeft, - std::make_unique<TabStripContainerOverflowIndicator>( - tab_strip_, views::OverflowIndicatorAlignment::kLeft), - TabStripContainerOverflowIndicator::kTotalWidth, false); - right_overflow_indicator_ = - tab_strip_scroll_container->SetCustomOverflowIndicator( - views::OverflowIndicatorAlignment::kRight, - std::make_unique<TabStripContainerOverflowIndicator>( - tab_strip_, views::OverflowIndicatorAlignment::kRight), - TabStripContainerOverflowIndicator::kTotalWidth, false); - - // This base::Unretained is safe because the callback is called by the - // layout manager, which is cleaned up before view children like - // |tab_strip_scroll_container| (which owns |tab_strip_|). - tab_strip_scroll_container->SetProperty( - views::kFlexBehaviorKey, - views::FlexSpecification(base::BindRepeating( - &TabScrollContainerFlexRule, base::Unretained(tab_strip_)))); } else { tab_strip_container_ = AddChildView(std::move(tab_strip)); @@ -215,20 +81,6 @@ tab_strip_container_flex_spec); } - if (base::FeatureList::IsEnabled(features::kScrollableTabStripButtons)) { - leading_scroll_button_ = AddChildView(CreateScrollButton( - base::BindRepeating(&TabStripRegionView::ScrollTowardsLeadingTab, - base::Unretained(this)))); - trailing_scroll_button_ = AddChildView(CreateScrollButton( - base::BindRepeating(&TabStripRegionView::ScrollTowardsTrailingTab, - base::Unretained(this)))); - - // The space in dips between the scroll buttons and the NTB. - constexpr int kScrollButtonsTrailingMargin = 8; - trailing_scroll_button_->SetProperty( - views::kMarginsKey, gfx::Insets(0, 0, 0, kScrollButtonsTrailingMargin)); - } - new_tab_button_ = AddChildView(std::make_unique<NewTabButton>( tab_strip_, base::BindRepeating(&TabStrip::NewTabButtonPressed, base::Unretained(tab_strip_)))); @@ -324,23 +176,7 @@ new_tab_button_->FrameColorsChanged(); if (tab_search_button_) tab_search_button_->FrameColorsChanged(); - if (base::FeatureList::IsEnabled(features::kScrollableTabStripButtons)) { - const SkColor background_color = tab_strip_->GetTabBackgroundColor( - TabActive::kInactive, BrowserFrameActiveState::kUseCurrent); - SkColor foreground_color = tab_strip_->GetTabForegroundColor( - TabActive::kInactive, background_color); - views::SetImageFromVectorIconWithColor(leading_scroll_button_, - kScrollingTabstripLeadingIcon, - foreground_color); - views::SetImageFromVectorIconWithColor(trailing_scroll_button_, - kScrollingTabstripTrailingIcon, - foreground_color); - } tab_strip_->FrameColorsChanged(); - if (base::FeatureList::IsEnabled(features::kScrollableTabStrip)) { - left_overflow_indicator_->SchedulePaint(); - right_overflow_indicator_->SchedulePaint(); - } SchedulePaint(); } @@ -373,70 +209,6 @@ node_data->role = ax::mojom::Role::kTabList; } -void TabStripRegionView::OnViewPreferredSizeChanged(View* view) { - DCHECK_EQ(view, tab_strip_); - - if (base::FeatureList::IsEnabled(features::kScrollableTabStripButtons)) - UpdateScrollButtonVisibility(); - - // The |tab_strip_|'s preferred size changing can change our own preferred - // size; however, with scrolling enabled, the ScrollView does not propagate - // ChildPreferredSizeChanged up the view hierarchy, instead assuming that its - // own preferred size is independent of its childrens'. - // TODO(https://crbug.com/1132488): Make ScrollView not be like that. - PreferredSizeChanged(); -} - -int TabStripRegionView::GetTabStripAvailableWidth() const { - // The tab strip can occupy the space not currently taken by its fixed-width - // sibling views. First ask for the available size of the container. - views::SizeBound width_bound = GetAvailableSize(tab_strip_container_).width(); - - // Because we can't return a null value, and we can't return zero, for cases - // where we have never been laid out we will return something arbitrary (the - // width of the region view is as good a choice as any, as it's strictly - // larger than the tabstrip should be able to display). - int tabstrip_available_width = width_bound.min_of(width()); - - // The scroll buttons should never prevent the tabstrip from being entirely - // visible (i.e. non-scrollable). In that sense, their layout space is always - // available for the tabstrip's use. - if (base::FeatureList::IsEnabled(features::kScrollableTabStripButtons) && - leading_scroll_button_->GetVisible()) { - const int scroll_buttons_span = - new_tab_button_->x() - leading_scroll_button_->x(); - // The NTB must immediately follow the scroll buttons for this approach - // to make sense. If these DCHECKS fail, we will need to revisit this - // assumption. - DCHECK_GT(scroll_buttons_span, 0); - DCHECK_EQ(GetIndexOf(trailing_scroll_button_) + 1, - GetIndexOf(new_tab_button_)); - tabstrip_available_width += scroll_buttons_span; - } - - return tabstrip_available_width; -} - -void TabStripRegionView::ScrollTowardsLeadingTab() { - views::ScrollView* scroll_view_container = - static_cast<views::ScrollView*>(tab_strip_container_); - gfx::Rect visible_content = scroll_view_container->GetVisibleRect(); - gfx::Rect scroll(visible_content.x() - visible_content.width(), - visible_content.y(), visible_content.width(), - visible_content.height()); - scroll_view_container->contents()->ScrollRectToVisible(scroll); -} - -void TabStripRegionView::ScrollTowardsTrailingTab() { - views::ScrollView* scroll_view_container = - static_cast<views::ScrollView*>(tab_strip_container_); - gfx::Rect visible_content = scroll_view_container->GetVisibleRect(); - gfx::Rect scroll(visible_content.x() + visible_content.width(), - visible_content.y(), visible_content.width(), - visible_content.height()); - scroll_view_container->contents()->ScrollRectToVisible(scroll); -} - void TabStripRegionView::UpdateNewTabButtonBorder() { const int extra_vertical_space = GetLayoutConstant(TAB_HEIGHT) - GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP) - @@ -459,16 +231,5 @@ gfx::Insets(extra_vertical_space / 2, 0, 0, kHorizontalInset))); } -void TabStripRegionView::UpdateScrollButtonVisibility() { - DCHECK(base::FeatureList::IsEnabled(features::kScrollableTabStripButtons)); - // Make the scroll buttons visible only if the tabstrip can be scrolled. - bool is_scrollable = - tab_strip_->GetMinimumSize().width() > GetTabStripAvailableWidth(); - - leading_scroll_button_->SetVisible(is_scrollable); - trailing_scroll_button_->SetVisible(is_scrollable); -} - BEGIN_METADATA(TabStripRegionView, views::AccessiblePaneView) -ADD_READONLY_PROPERTY_METADATA(int, TabStripAvailableWidth) END_METADATA
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.h b/chrome/browser/ui/views/frame/tab_strip_region_view.h index 75513d3..eb908af 100644 --- a/chrome/browser/ui/views/frame/tab_strip_region_view.h +++ b/chrome/browser/ui/views/frame/tab_strip_region_view.h
@@ -19,9 +19,9 @@ class TabStrip; class TipMarqueeView; -// Container for the tabstrip, new tab button, and reserved grab handle space. -class TabStripRegionView final : public views::AccessiblePaneView, - views::ViewObserver { +// Container for the tabstrip and the other views sharing space with it - +// with the exception of the caption buttons. +class TabStripRegionView final : public views::AccessiblePaneView { public: METADATA_HEADER(TabStripRegionView); explicit TabStripRegionView(std::unique_ptr<TabStrip> tab_strip); @@ -59,42 +59,19 @@ void GetAccessibleNodeData(ui::AXNodeData* node_data) override; views::View* GetDefaultFocusableChild() override; - // views::ViewObserver: - void OnViewPreferredSizeChanged(View* view) override; - views::FlexLayout* layout_manager_for_testing() { return layout_manager_; } - // TODO(958173): Override OnBoundsChanged to cancel tabstrip animations. - private: - int GetTabStripAvailableWidth() const; - - // Scrolls the tabstrip towards the first tab in the tabstrip. - void ScrollTowardsLeadingTab(); - - // Scrolls the tabstrip towards the last tab in the tabstrip. - void ScrollTowardsTrailingTab(); - // Updates the border padding for |new_tab_button_|. This should be called // whenever any input of the computation of the border's sizing changes. void UpdateNewTabButtonBorder(); - // Changes the visibility of the scroll buttons, so they're hidden if they - // aren't needed to control tabstrip scrolling. - void UpdateScrollButtonVisibility(); - views::FlexLayout* layout_manager_ = nullptr; views::View* tab_strip_container_; views::View* reserved_grab_handle_space_; TabStrip* tab_strip_; NewTabButton* new_tab_button_ = nullptr; TabSearchButton* tab_search_button_ = nullptr; - views::ImageButton* leading_scroll_button_; - views::ImageButton* trailing_scroll_button_; - // The views, owned by |scroll_container_|, that indicate that there are more - // tabs overflowing to the left or right. - views::View* left_overflow_indicator_; - views::View* right_overflow_indicator_; TipMarqueeView* tip_marquee_view_ = nullptr; const base::CallbackListSubscription subscription_ =
diff --git a/chrome/browser/ui/views/infobars/confirm_infobar.cc b/chrome/browser/ui/views/infobars/confirm_infobar.cc index 774adcec..9854298 100644 --- a/chrome/browser/ui/views/infobars/confirm_infobar.cc +++ b/chrome/browser/ui/views/infobars/confirm_infobar.cc
@@ -35,7 +35,6 @@ gfx::Insets(ChromeLayoutProvider::Get()->GetDistanceMetric( DISTANCE_TOAST_CONTROL_VERTICAL), 0)); - button->SizeToPreferredSize(); return button; }; @@ -56,6 +55,9 @@ &ConfirmInfoBar::CancelButtonPressed); if (buttons == ConfirmInfoBarDelegate::BUTTON_CANCEL) cancel_button_->SetProminent(true); + cancel_button_->SetImageModel( + views::Button::STATE_NORMAL, + delegate_ptr->GetButtonImage(ConfirmInfoBarDelegate::BUTTON_CANCEL)); } link_ = CreateLink(delegate_ptr->GetLinkText()); @@ -70,6 +72,14 @@ void ConfirmInfoBar::Layout() { InfoBarView::Layout(); + if (ok_button_) { + ok_button_->SizeToPreferredSize(); + } + + if (cancel_button_) { + cancel_button_->SizeToPreferredSize(); + } + int x = GetStartX(); Views views; views.push_back(label_);
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view.cc index 487cc84..0262d30 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view.cc
@@ -210,6 +210,7 @@ content::WebContents* web_contents, const GURL& url, PageInfoClosingCallback closing_callback) { + DCHECK(web_contents); gfx::NativeView parent_view = platform_util::GetViewForWindow(parent_window); if (PageInfo::IsFileOrInternalPage(url) || @@ -256,17 +257,18 @@ const gfx::Rect& anchor_rect, gfx::NativeView parent_window, Profile* profile, - content::WebContents* web_contents, + content::WebContents* associated_web_contents, const GURL& url, PageInfoClosingCallback closing_callback) : PageInfoBubbleViewBase(anchor_view, anchor_rect, parent_window, PageInfoBubbleViewBase::BUBBLE_PAGE_INFO, - web_contents), + associated_web_contents), profile_(profile), closing_callback_(std::move(closing_callback)) { DCHECK(closing_callback_); + DCHECK(web_contents()); if (auto* sentiment_service = TrustSafetySentimentServiceFactory::GetForProfile(profile_)) { @@ -342,7 +344,7 @@ ui_delegate_ = std::make_unique<ChromePageInfoUiDelegate>(profile, url); presenter_ = std::make_unique<PageInfo>( - std::make_unique<ChromePageInfoDelegate>(web_contents), web_contents, + std::make_unique<ChromePageInfoDelegate>(web_contents()), web_contents(), url); presenter_->InitializeUiState(this); } @@ -848,6 +850,7 @@ gfx::Rect anchor_rect = configuration.anchor_view ? gfx::Rect() : GetPageInfoAnchorRect(browser); gfx::NativeWindow parent_window = browser->window()->GetNativeWindow(); + DCHECK(web_contents); views::BubbleDialogDelegateView* bubble = PageInfoBubbleView::CreatePageInfoBubble( configuration.anchor_view, anchor_rect, parent_window,
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc index 4b51157..3a8d925ea 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc
@@ -92,5 +92,9 @@ GetWidget()->Close(); } +void PageInfoBubbleViewBase::WebContentsDestroyed() { + GetWidget()->Close(); +} + BEGIN_METADATA(PageInfoBubbleViewBase, views::BubbleDialogDelegateView) END_METADATA
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.h b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.h index 1db476c..fed4698 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.h +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.h
@@ -67,6 +67,7 @@ void OnVisibilityChanged(content::Visibility visibility) override; void DidStartNavigation(content::NavigationHandle* handle) override; void DidChangeVisibleSecurityState() override; + void WebContentsDestroyed() override; DISALLOW_COPY_AND_ASSIGN(PageInfoBubbleViewBase); };
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc index ef16078..6198eda 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
@@ -283,6 +283,22 @@ PageInfoBubbleView::GetShownBubbleType()); } +IN_PROC_BROWSER_TEST_P(PageInfoBubbleViewBrowserTest, + StopShowingBubbleWhenWebContentsDestroyed) { + // Open a new tab so the whole browser does not close once we close + // the tab via WebContents::Close() below. + AddTabAtIndex(0, GURL("data:text/html,<p>puppies!</p>"), + ui::PAGE_TRANSITION_TYPED); + OpenPageInfoBubble(browser()); + EXPECT_EQ(PageInfoBubbleView::BUBBLE_PAGE_INFO, + PageInfoBubbleView::GetShownBubbleType()); + + browser()->tab_strip_model()->GetActiveWebContents()->Close(); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(PageInfoBubbleView::BUBBLE_NONE, + PageInfoBubbleView::GetShownBubbleType()); +} + IN_PROC_BROWSER_TEST_P(PageInfoBubbleViewBrowserTest, ChromeURL) { ui_test_utils::NavigateToURL(browser(), GURL("chrome://settings")); OpenPageInfoBubble(browser());
diff --git a/chrome/browser/ui/views/page_info/page_info_main_view.cc b/chrome/browser/ui/views/page_info/page_info_main_view.cc index 14a7c7d..956ef201 100644 --- a/chrome/browser/ui/views/page_info/page_info_main_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_main_view.cc
@@ -276,7 +276,6 @@ // base::Unretained(navigation_handler_) is safe because navigation_handler_ // is the bubble view which is the owner of this view and therefore will // always exist when this view exists. - // TODO(crbug.com/1225563): Replace with actual strings. connection_button_ = security_container_view_->AddChildView( std::make_unique<PageInfoHoverButton>( base::BindRepeating(&PageInfoNavigationHandler::OpenSecurityPage, @@ -284,8 +283,8 @@ PageInfoViewFactory::GetConnectionSecureIcon(), 0, std::u16string(), PageInfoViewFactory:: VIEW_ID_PAGE_INFO_LINK_OR_BUTTON_SECURITY_INFORMATION, - u"Open security subpage", std::u16string(), - PageInfoViewFactory::GetOpenSubpageIcon()) + l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_SUBPAGE_BUTTON), + std::u16string(), PageInfoViewFactory::GetOpenSubpageIcon()) .release()); connection_button_->SetTitleText(security_description->summary); } else {
diff --git a/chrome/browser/ui/views/page_info/page_info_new_bubble_view.cc b/chrome/browser/ui/views/page_info/page_info_new_bubble_view.cc index 139143ca..adb4e12 100644 --- a/chrome/browser/ui/views/page_info/page_info_new_bubble_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_new_bubble_view.cc
@@ -19,16 +19,17 @@ const gfx::Rect& anchor_rect, gfx::NativeView parent_window, Profile* profile, - content::WebContents* web_contents, + content::WebContents* associated_web_contents, const GURL& url, PageInfoClosingCallback closing_callback) : PageInfoBubbleViewBase(anchor_view, anchor_rect, parent_window, PageInfoBubbleViewBase::BUBBLE_PAGE_INFO, - web_contents), + associated_web_contents), closing_callback_(std::move(closing_callback)) { DCHECK(closing_callback_); + DCHECK(web_contents()); SetShowTitle(false); SetShowCloseButton(false); @@ -45,7 +46,7 @@ set_margins(gfx::Insets(top_margin, 0, bottom_margin, 0)); ui_delegate_ = std::make_unique<ChromePageInfoUiDelegate>(profile, url); presenter_ = std::make_unique<PageInfo>( - std::make_unique<ChromePageInfoDelegate>(web_contents), web_contents, + std::make_unique<ChromePageInfoDelegate>(web_contents()), web_contents(), url); view_factory_ = std::make_unique<PageInfoViewFactory>( presenter_.get(), ui_delegate_.get(), this);
diff --git a/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc b/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc index d12cf07..beced3c 100644 --- a/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc
@@ -98,7 +98,7 @@ toggle_button_->SetProperty(views::kMarginsKey, gfx::Insets(margin, 0)); AddChildView(PageInfoViewFactory::CreateSeparator()); - // TODO(crbug.com/1225563): Replace with actual strings. + // TODO(crbug.com/1225563): Consider to use permission specific text. AddChildView(std::make_unique<PageInfoHoverButton>( base::BindRepeating( [](PageInfoPermissionContentView* view) { @@ -107,8 +107,9 @@ this), PageInfoViewFactory::GetSiteSettingsIcon(), IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON, std::u16string(), 0, - u"Open permission settings", std::u16string(), - PageInfoViewFactory::GetLaunchIcon())); + l10n_util::GetStringUTF16( + IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON_TOOLTIP), + std::u16string(), PageInfoViewFactory::GetLaunchIcon())); presenter_->InitializeUiState(this); }
diff --git a/chrome/browser/ui/views/page_info/page_info_view_factory.cc b/chrome/browser/ui/views/page_info/page_info_view_factory.cc index 61d00d3..05d8089 100644 --- a/chrome/browser/ui/views/page_info/page_info_view_factory.cc +++ b/chrome/browser/ui/views/page_info/page_info_view_factory.cc
@@ -159,8 +159,6 @@ back_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK)); back_button->SetProperty(views::kInternalPaddingKey, back_button->GetInsets()); - // TODO(crbug.com/1225563): Replace with actual strings. - back_button->SetTooltipText(u"Back to main page"); header->AddChildView(std::move(back_button)); auto* label_wrapper = header->AddChildView(CreateLabelWrapper());
diff --git a/chrome/browser/ui/views/page_info/permission_toggle_row_view.cc b/chrome/browser/ui/views/page_info/permission_toggle_row_view.cc index 343a332..5ac922b 100644 --- a/chrome/browser/ui/views/page_info/permission_toggle_row_view.cc +++ b/chrome/browser/ui/views/page_info/permission_toggle_row_view.cc
@@ -92,10 +92,10 @@ row_view_->GetFirstLineHeight()}); toggle_button->SetProperty(views::kMarginsKey, gfx::Insets(0, icon_label_spacing)); - // TODO(crbug.com/1225563): Replace with actual strings. - toggle_button->SetAccessibleName( - u"Select state for " + - PageInfoUI::PermissionTypeToUIString(permission_.type) + u" permission."); + toggle_button->SetAccessibleName(l10n_util::GetStringFUTF16( + IDS_PAGE_INFO_SELECTOR_TOOLTIP, + PageInfoUI::PermissionTypeToUIString(permission_.type))); + toggle_button_ = row_view_->AddControl(std::move(toggle_button)); const int icon_size = GetLayoutConstant(PAGE_INFO_ICON_SIZE); @@ -109,6 +109,8 @@ }, base::Unretained(this)), vector_icons::kSubmenuArrowIcon); + subpage_button->SetTooltipText(l10n_util::GetStringUTF16( + IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_BUTTON_TOOLTIP)); views::InstallCircleHighlightPathGenerator(subpage_button.get()); subpage_button->SetMinimumImageSize({icon_size, icon_size}); row_view_->AddControl(std::move(subpage_button));
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_icon_views.cc b/chrome/browser/ui/views/passwords/manage_passwords_icon_views.cc index 4a2a61f..91ee8ca 100644 --- a/chrome/browser/ui/views/passwords/manage_passwords_icon_views.cc +++ b/chrome/browser/ui/views/passwords/manage_passwords_icon_views.cc
@@ -84,7 +84,6 @@ case password_manager::ui::CONFIRMATION_STATE: case password_manager::ui::CREDENTIAL_REQUEST_STATE: case password_manager::ui::AUTO_SIGNIN_STATE: - case password_manager::ui::CHROME_SIGN_IN_PROMO_STATE: case password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE: case password_manager::ui::MANAGE_STATE: case password_manager::ui::PASSWORD_UPDATED_SAFE_STATE:
diff --git a/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc b/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc index c4834c3..2c15d9a 100644 --- a/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc +++ b/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc
@@ -20,17 +20,10 @@ using base::StartsWith; -// Test params: -// - bool : whether to enable account storage feature or not. class PasswordBubbleBrowserTest - : public SupportsTestDialog<ManagePasswordsTest>, - public testing::WithParamInterface<bool> { + : public SupportsTestDialog<ManagePasswordsTest> { public: - PasswordBubbleBrowserTest() { - scoped_feature_list_.InitWithFeatureState( - password_manager::features::kEnablePasswordsAccountStorage, GetParam()); - } - + PasswordBubbleBrowserTest() = default; ~PasswordBubbleBrowserTest() override = default; void ShowUi(const std::string& name) override { @@ -44,8 +37,7 @@ base::CompareCase::SENSITIVE)) { // Set test form to be account-stored. Otherwise, there is no indicator. test_form()->in_store = - GetParam() ? password_manager::PasswordForm::Store::kAccountStore - : password_manager::PasswordForm::Store::kProfileStore; + password_manager::PasswordForm::Store::kAccountStore; SetupManagingPasswords(); ExecuteManagePasswordsCommand(); } else if (StartsWith(name, "AutoSignin", base::CompareCase::SENSITIVE)) { @@ -72,49 +64,41 @@ return; } } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; -INSTANTIATE_TEST_SUITE_P(All, PasswordBubbleBrowserTest, ::testing::Bool()); - -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_PendingPasswordBubble) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_AutomaticPasswordBubble) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_ManagePasswordBubble) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, InvokeUi_AutoSignin) { +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_AutoSignin) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, InvokeUi_SafeState) { +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_SafeState) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, InvokeUi_MoreToFixState) { +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_MoreToFixState) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, InvokeUi_MoveToAccountStoreBubble) { - if (!GetParam()) { - return; // No moving bubble available without the flag. - } ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_P(PasswordBubbleBrowserTest, AlertAccessibleEvent) { +IN_PROC_BROWSER_TEST_F(PasswordBubbleBrowserTest, AlertAccessibleEvent) { views::test::AXEventCounter counter(views::AXEventManager::Get()); EXPECT_EQ(0, counter.GetCount(ax::mojom::Event::kAlert)); ShowUi("ManagePasswordBubble");
diff --git a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc index 0cfbdfa38..edc35b2e 100644 --- a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc +++ b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
@@ -22,7 +22,6 @@ #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/passwords/manage_passwords_icon_views.h" #include "chrome/browser/ui/views/passwords/password_auto_sign_in_view.h" -#include "chrome/browser/ui/views/passwords/password_save_update_view.h" #include "chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/test/base/interactive_test_utils.h" @@ -55,19 +54,9 @@ } views::View* GetUsernameTextfield(const PasswordBubbleViewBase* bubble) { - // Depending on the state of kEnablePasswordsAccountStorage, |bubble| is - // either a PasswordSaveUpdateView or a - // PasswordSaveUpdateWithAccountStoreView. - if (base::FeatureList::IsEnabled( - password_manager::features::kEnablePasswordsAccountStorage)) { - const PasswordSaveUpdateWithAccountStoreView* save_bubble = - static_cast<const PasswordSaveUpdateWithAccountStoreView*>(bubble); - return save_bubble->GetUsernameTextfieldForTest(); - } else { - const PasswordSaveUpdateView* save_bubble = - static_cast<const PasswordSaveUpdateView*>(bubble); - return save_bubble->GetUsernameTextfieldForTest(); - } + const PasswordSaveUpdateWithAccountStoreView* save_bubble = + static_cast<const PasswordSaveUpdateWithAccountStoreView*>(bubble); + return save_bubble->GetUsernameTextfieldForTest(); } } // namespace
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc index 11665de..bba9945 100644 --- a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc +++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/ui/views/passwords/password_generation_confirmation_view.h" #include "chrome/browser/ui/views/passwords/password_items_view.h" #include "chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.h" -#include "chrome/browser/ui/views/passwords/password_save_update_view.h" #include "chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h" #include "chrome/browser/ui/views/passwords/post_save_compromised_bubble_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" @@ -83,23 +82,14 @@ } else if (model_state == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || model_state == password_manager::ui::PENDING_PASSWORD_STATE) { - if (base::FeatureList::IsEnabled( - password_manager::features::kEnablePasswordsAccountStorage)) { - view = new PasswordSaveUpdateWithAccountStoreView( - web_contents, anchor_view, reason, promo_controller); - } else { - view = new PasswordSaveUpdateView(web_contents, anchor_view, reason); - } + view = new PasswordSaveUpdateWithAccountStoreView(web_contents, anchor_view, + reason, promo_controller); } else if (model_state == password_manager::ui:: WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE) { - DCHECK(base::FeatureList::IsEnabled( - password_manager::features::kEnablePasswordsAccountStorage)); view = new PasswordSaveUnsyncedCredentialsLocallyView(web_contents, anchor_view); } else if (model_state == password_manager::ui::CAN_MOVE_PASSWORD_TO_ACCOUNT_STATE) { - DCHECK(base::FeatureList::IsEnabled( - password_manager::features::kEnablePasswordsAccountStorage)); view = new MoveToAccountStoreBubbleView(web_contents, anchor_view); } else if (model_state == password_manager::ui::PASSWORD_UPDATED_SAFE_STATE || model_state ==
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc deleted file mode 100644 index bd9319d..0000000 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ /dev/null
@@ -1,498 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/passwords/password_save_update_view.h" - -#include <algorithm> -#include <memory> -#include <utility> -#include <vector> - -#include "base/containers/cxx20_erase.h" -#include "base/feature_list.h" -#include "base/strings/utf_string_conversions.h" -#include "build/build_config.h" -#include "build/chromeos_buildflags.h" -#include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" -#include "chrome/browser/ui/passwords/password_dialog_prompts.h" -#include "chrome/browser/ui/passwords/passwords_model_delegate.h" -#include "chrome/browser/ui/views/chrome_layout_provider.h" -#include "chrome/browser/ui/views/chrome_typography.h" -#include "chrome/browser/ui/views/passwords/credentials_item_view.h" -#include "chrome/browser/ui/views/passwords/password_items_view.h" -#include "chrome/browser/ui/views/passwords/password_sign_in_promo_view.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/grit/theme_resources.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/signin/public/base/signin_buildflags.h" -#include "content/public/browser/storage_partition.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/models/combobox_model.h" -#include "ui/base/models/combobox_model_observer.h" -#include "ui/base/models/image_model.h" -#include "ui/base/models/simple_combobox_model.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/gfx/color_utils.h" -#include "ui/gfx/vector_icon_utils.h" -#include "ui/views/bubble/bubble_frame_view.h" -#include "ui/views/controls/button/image_button.h" -#include "ui/views/controls/button/image_button_factory.h" -#include "ui/views/controls/button/md_text_button.h" -#include "ui/views/controls/editable_combobox/editable_combobox.h" -#include "ui/views/controls/textfield/textfield.h" -#include "ui/views/layout/fill_layout.h" -#include "ui/views/layout/grid_layout.h" -#include "ui/views/layout/layout_provider.h" -#include "ui/views/view.h" - -namespace { - -enum PasswordSaveUpdateViewColumnSetType { - // | | (LEADING, FILL) | | (FILL, FILL) | | - // Used for the username/password line of the bubble, for the pending view. - DOUBLE_VIEW_COLUMN_SET_USERNAME, - DOUBLE_VIEW_COLUMN_SET_PASSWORD, - - // | | (LEADING, FILL) | | (FILL, FILL) | | (TRAILING, FILL) | | - // Used for the password line of the bubble, for the pending view. - // Views are label, password and the eye icon. - TRIPLE_VIEW_COLUMN_SET, -}; - -// Construct an appropriate ColumnSet for the given |type|, and add it -// to |layout|. -void BuildColumnSet(views::GridLayout* layout, - PasswordSaveUpdateViewColumnSetType type) { - views::ColumnSet* column_set = layout->AddColumnSet(type); - const int column_divider = ChromeLayoutProvider::Get()->GetDistanceMetric( - views::DISTANCE_RELATED_CONTROL_HORIZONTAL); - using ColumnSize = views::GridLayout::ColumnSize; - switch (type) { - case DOUBLE_VIEW_COLUMN_SET_USERNAME: - case DOUBLE_VIEW_COLUMN_SET_PASSWORD: - column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, - views::GridLayout::kFixedSize, - ColumnSize::kUsePreferred, 0, 0); - column_set->AddPaddingColumn(views::GridLayout::kFixedSize, - column_divider); - column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, - 1.0, ColumnSize::kUsePreferred, 0, 0); - break; - case TRIPLE_VIEW_COLUMN_SET: - column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, - views::GridLayout::kFixedSize, - ColumnSize::kUsePreferred, 0, 0); - column_set->AddPaddingColumn(views::GridLayout::kFixedSize, - column_divider); - column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, - 1.0, ColumnSize::kUsePreferred, 0, 0); - column_set->AddPaddingColumn(views::GridLayout::kFixedSize, - column_divider); - column_set->AddColumn( - views::GridLayout::TRAILING, views::GridLayout::FILL, - views::GridLayout::kFixedSize, ColumnSize::kUsePreferred, 0, 0); - break; - } -} - -// Builds a credential row, adds the given elements to the layout. -// |password_view_button| is an optional field. If it is a nullptr, a -// DOUBLE_VIEW_COLUMN_SET_PASSWORD will be used for password row instead of -// TRIPLE_VIEW_COLUMN_SET. -void BuildCredentialRows( - views::GridLayout* layout, - std::unique_ptr<views::View> username_field, - std::unique_ptr<views::View> password_field, - std::unique_ptr<views::ToggleImageButton> password_view_button) { - // Username row. - BuildColumnSet(layout, DOUBLE_VIEW_COLUMN_SET_USERNAME); - layout->StartRow(views::GridLayout::kFixedSize, - DOUBLE_VIEW_COLUMN_SET_USERNAME); - std::unique_ptr<views::Label> username_label(new views::Label( - l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_USERNAME_LABEL), - views::style::CONTEXT_LABEL, views::style::STYLE_PRIMARY)); - username_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - std::unique_ptr<views::Label> password_label(new views::Label( - l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_PASSWORD_LABEL), - views::style::CONTEXT_LABEL, views::style::STYLE_PRIMARY)); - password_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - int labels_width = std::max(username_label->GetPreferredSize().width(), - password_label->GetPreferredSize().width()); - int fields_height = std::max(username_field->GetPreferredSize().height(), - password_field->GetPreferredSize().height()); - - layout->AddView(std::move(username_label), 1, 1, views::GridLayout::LEADING, - views::GridLayout::FILL, labels_width, 0); - layout->AddView(std::move(username_field), 1, 1, views::GridLayout::FILL, - views::GridLayout::FILL, 0, fields_height); - - layout->AddPaddingRow(views::GridLayout::kFixedSize, - ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_CONTROL_LIST_VERTICAL)); - - // Password row. - PasswordSaveUpdateViewColumnSetType type = - password_view_button ? TRIPLE_VIEW_COLUMN_SET - : DOUBLE_VIEW_COLUMN_SET_PASSWORD; - BuildColumnSet(layout, type); - layout->StartRow(views::GridLayout::kFixedSize, type); - layout->AddView(std::move(password_label), 1, 1, views::GridLayout::LEADING, - views::GridLayout::FILL, labels_width, 0); - layout->AddView(std::move(password_field), 1, 1, views::GridLayout::FILL, - views::GridLayout::FILL, 0, fields_height); - // The eye icon is also added to the layout if it was passed. - if (password_view_button) { - layout->AddView(std::move(password_view_button)); - } -} - -// Create a vector which contains only the values in |items| and no elements. -std::vector<std::u16string> ToValues( - const password_manager::ValueElementVector& items) { - std::vector<std::u16string> passwords; - passwords.reserve(items.size()); - for (auto& pair : items) - passwords.push_back(pair.first); - return passwords; -} - -std::unique_ptr<views::ToggleImageButton> CreatePasswordViewButton( - views::Button::PressedCallback callback, - bool are_passwords_revealed) { - auto button = std::make_unique<views::ToggleImageButton>(std::move(callback)); - button->SetInstallFocusRingOnFocus(true); - button->SetRequestFocusOnPress(true); - button->SetTooltipText( - l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_SHOW_PASSWORD)); - button->SetToggledTooltipText( - l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_HIDE_PASSWORD)); - button->SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER); - button->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); - button->SetToggled(are_passwords_revealed); - return button; -} - -// Creates an EditableCombobox from |PasswordForm.all_possible_usernames| or -// even just |PasswordForm.username_value|. -std::unique_ptr<views::EditableCombobox> CreateUsernameEditableCombobox( - const password_manager::PasswordForm& form) { - std::vector<std::u16string> usernames = {form.username_value}; - for (const password_manager::ValueElementPair& other_possible_username_pair : - form.all_possible_usernames) { - if (other_possible_username_pair.first != form.username_value) - usernames.push_back(other_possible_username_pair.first); - } - base::EraseIf(usernames, [](const std::u16string& username) { - return username.empty(); - }); - bool display_arrow = !usernames.empty(); - auto combobox = std::make_unique<views::EditableCombobox>( - std::make_unique<ui::SimpleComboboxModel>( - std::vector<ui::SimpleComboboxModel::Item>(usernames.begin(), - usernames.end())), - /*filter_on_edit=*/false, /*show_on_empty=*/true, - views::EditableCombobox::Type::kRegular, views::style::CONTEXT_BUTTON, - views::style::STYLE_PRIMARY, display_arrow); - combobox->SetText(form.username_value); - combobox->SetAccessibleName( - l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_USERNAME_LABEL)); - // In case of long username, ensure that the beginning of value is visible. - combobox->SelectRange(gfx::Range(0)); - return combobox; -} - -// Creates an EditableCombobox from |PasswordForm.all_possible_passwords| or -// even just |PasswordForm.password_value|. -std::unique_ptr<views::EditableCombobox> CreatePasswordEditableCombobox( - const password_manager::PasswordForm& form, - bool are_passwords_revealed) { - DCHECK(!form.IsFederatedCredential()); - std::vector<std::u16string> passwords = - form.all_possible_passwords.empty() - ? std::vector<std::u16string>(/*n=*/1, form.password_value) - : ToValues(form.all_possible_passwords); - base::EraseIf(passwords, [](const std::u16string& password) { - return password.empty(); - }); - bool display_arrow = !passwords.empty(); - auto combobox = std::make_unique<views::EditableCombobox>( - std::make_unique<ui::SimpleComboboxModel>( - std::vector<ui::SimpleComboboxModel::Item>(passwords.begin(), - passwords.end())), - /*filter_on_edit=*/false, /*show_on_empty=*/true, - views::EditableCombobox::Type::kPassword, views::style::CONTEXT_BUTTON, - STYLE_PRIMARY_MONOSPACED, display_arrow); - combobox->SetText(form.password_value); - combobox->RevealPasswords(are_passwords_revealed); - combobox->SetAccessibleName( - l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_PASSWORD_LABEL)); - return combobox; -} - -} // namespace - -PasswordSaveUpdateView::PasswordSaveUpdateView( - content::WebContents* web_contents, - views::View* anchor_view, - DisplayReason reason) - : PasswordBubbleViewBase(web_contents, - anchor_view, - /*auto_dismissable=*/false), - controller_( - PasswordsModelDelegateFromWebContents(web_contents), - reason == AUTOMATIC - ? PasswordBubbleControllerBase::DisplayReason::kAutomatic - : PasswordBubbleControllerBase::DisplayReason::kUserAction), - is_update_bubble_(controller_.state() == - password_manager::ui::PENDING_PASSWORD_UPDATE_STATE), - are_passwords_revealed_( - controller_.are_passwords_revealed_when_bubble_is_opened()) { - // If kEnablePasswordsAccountStorage is enabled, then - // PasswordSaveUpdateWithAccountStoreView should be used instead of this - // class. - DCHECK(!base::FeatureList::IsEnabled( - password_manager::features::kEnablePasswordsAccountStorage)); - - DCHECK(controller_.state() == password_manager::ui::PENDING_PASSWORD_STATE || - controller_.state() == - password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); - const password_manager::PasswordForm& password_form = - controller_.pending_password(); - if (password_form.IsFederatedCredential()) { - // The credential to be saved doesn't contain password but just the identity - // provider (e.g. "Sign in with Google"). Thus, the layout is different. - SetLayoutManager(std::make_unique<views::FillLayout>()); - const auto titles = GetCredentialLabelsForAccountChooser(password_form); - AddChildView(std::make_unique<CredentialsItemView>( - views::Button::PressedCallback(), titles.first, - titles.second, &password_form, - controller_.GetProfile() - ->GetDefaultStoragePartition() - ->GetURLLoaderFactoryForBrowserProcess() - .get())) - ->SetEnabled(false); - } else { - std::unique_ptr<views::EditableCombobox> username_dropdown = - CreateUsernameEditableCombobox(password_form); - username_dropdown->SetCallback(base::BindRepeating( - &PasswordSaveUpdateView::OnContentChanged, base::Unretained(this))); - std::unique_ptr<views::EditableCombobox> password_dropdown = - CreatePasswordEditableCombobox(password_form, are_passwords_revealed_); - password_dropdown->SetCallback(base::BindRepeating( - &PasswordSaveUpdateView::OnContentChanged, base::Unretained(this))); - - std::unique_ptr<views::ToggleImageButton> password_view_button = - CreatePasswordViewButton( - base::BindRepeating( - &PasswordSaveUpdateView::TogglePasswordVisibility, - base::Unretained(this)), - are_passwords_revealed_); - - views::GridLayout* layout = - SetLayoutManager(std::make_unique<views::GridLayout>()); - - username_dropdown_ = username_dropdown.get(); - password_dropdown_ = password_dropdown.get(); - password_view_button_ = password_view_button.get(); - BuildCredentialRows(layout, std::move(username_dropdown), - std::move(password_dropdown), - std::move(password_view_button)); - } - - SetShowIcon(false); - SetFootnoteView(CreateFooterView()); - SetCancelCallback(base::BindOnce(&PasswordSaveUpdateView::OnDialogCancelled, - base::Unretained(this))); - UpdateBubbleUIElements(); -} - -views::View* PasswordSaveUpdateView::GetUsernameTextfieldForTest() const { - return username_dropdown_->GetTextfieldForTest(); -} - -PasswordSaveUpdateView::~PasswordSaveUpdateView() = default; - -PasswordBubbleControllerBase* PasswordSaveUpdateView::GetController() { - return &controller_; -} - -const PasswordBubbleControllerBase* PasswordSaveUpdateView::GetController() - const { - return &controller_; -} - -bool PasswordSaveUpdateView::Accept() { - UpdateUsernameAndPasswordInModel(); - controller_.OnSaveClicked(); - if (controller_.ReplaceToShowPromotionIfNeeded()) { - ReplaceWithPromo(); - return false; // Keep open. - } - return true; -} - -views::View* PasswordSaveUpdateView::GetInitiallyFocusedView() { - if (username_dropdown_ && username_dropdown_->GetText().empty()) - return username_dropdown_; - View* initial_view = PasswordBubbleViewBase::GetInitiallyFocusedView(); - // |initial_view| will normally be the 'Save' button, but in case it's not - // focusable, we return nullptr so the Widget doesn't give focus to the next - // focusable View, which would be |username_dropdown_|, and which would bring - // up the menu without a user interaction. We only allow initial focus on - // |username_dropdown_| above, when the text is empty. - return (initial_view && initial_view->IsFocusable()) ? initial_view : nullptr; -} - -bool PasswordSaveUpdateView::IsDialogButtonEnabled( - ui::DialogButton button) const { - return button != ui::DIALOG_BUTTON_OK || - controller_.pending_password().IsFederatedCredential() || - !controller_.pending_password().password_value.empty(); -} - -ui::ImageModel PasswordSaveUpdateView::GetWindowIcon() { - return ui::ImageModel(); -} - -void PasswordSaveUpdateView::AddedToWidget() { - static_cast<views::Label*>(GetBubbleFrameView()->title()) - ->SetAllowCharacterBreak(true); - if (base::FeatureList::IsEnabled( - password_manager::features:: - kUseNewHeaderForLegacySavePasswordBubble)) { - SetBubbleHeader(IDR_SAVE_PASSWORD, IDR_SAVE_PASSWORD_DARK); - } else { - SetBubbleHeader(IDR_SAVE_PASSWORD_MULTI_DEVICE, - IDR_SAVE_PASSWORD_MULTI_DEVICE_DARK); - } -} - -void PasswordSaveUpdateView::OnThemeChanged() { - PasswordBubbleViewBase::OnThemeChanged(); - if (password_view_button_) { - auto* theme = GetNativeTheme(); - const SkColor icon_color = - theme->GetSystemColor(ui::NativeTheme::kColorId_DefaultIconColor); - const SkColor disabled_icon_color = - theme->GetSystemColor(ui::NativeTheme::kColorId_DisabledIconColor); - views::SetImageFromVectorIconWithColor(password_view_button_, kEyeIcon, - GetDefaultSizeOfVectorIcon(kEyeIcon), - icon_color); - views::SetToggledImageFromVectorIconWithColor( - password_view_button_, kEyeCrossedIcon, - GetDefaultSizeOfVectorIcon(kEyeCrossedIcon), icon_color, - disabled_icon_color); - } -} - -void PasswordSaveUpdateView::TogglePasswordVisibility() { - if (!are_passwords_revealed_ && !controller_.RevealPasswords()) - return; - - are_passwords_revealed_ = !are_passwords_revealed_; - password_view_button_->SetToggled(are_passwords_revealed_); - DCHECK(password_dropdown_); - password_dropdown_->RevealPasswords(are_passwords_revealed_); -} - -void PasswordSaveUpdateView::UpdateUsernameAndPasswordInModel() { - if (!username_dropdown_ && !password_dropdown_) - return; - std::u16string new_username = controller_.pending_password().username_value; - std::u16string new_password = controller_.pending_password().password_value; - if (username_dropdown_) { - new_username = username_dropdown_->GetText(); - base::TrimString(new_username, u" ", &new_username); - } - if (password_dropdown_) - new_password = password_dropdown_->GetText(); - controller_.OnCredentialEdited(std::move(new_username), - std::move(new_password)); -} - -void PasswordSaveUpdateView::ReplaceWithPromo() { -#if BUILDFLAG(ENABLE_DICE_SUPPORT) // PasswordSignInPromoView requires DICE - RemoveAllChildViews(true); - username_dropdown_ = nullptr; - password_dropdown_ = nullptr; - password_view_button_ = nullptr; - SetLayoutManager(std::make_unique<views::FillLayout>()); - set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType( - views::DialogContentType::kText, views::DialogContentType::kText)); - if (controller_.state() == password_manager::ui::CHROME_SIGN_IN_PROMO_STATE) { - sign_in_promo_ = new PasswordSignInPromoView(controller_.GetWebContents()); - AddChildView(sign_in_promo_); - } else { - NOTREACHED(); - } - set_close_on_deactivate(true); - GetWidget()->UpdateWindowIcon(); - SetTitle(controller_.GetTitle()); - UpdateBubbleUIElements(); - DialogModelChanged(); - - SizeToContents(); -#else - NOTREACHED(); -#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) -} - -void PasswordSaveUpdateView::UpdateBubbleUIElements() { - if (sign_in_promo_) { - SetButtons(ui::DIALOG_BUTTON_NONE); - return; - } - SetButtons((ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)); - SetButtonLabel( - ui::DIALOG_BUTTON_OK, - l10n_util::GetStringUTF16(controller_.IsCurrentStateUpdate() - ? IDS_PASSWORD_MANAGER_UPDATE_BUTTON - : IDS_PASSWORD_MANAGER_SAVE_BUTTON)); - SetButtonLabel( - ui::DIALOG_BUTTON_CANCEL, - l10n_util::GetStringUTF16( - is_update_bubble_ ? IDS_PASSWORD_MANAGER_CANCEL_BUTTON - : IDS_PASSWORD_MANAGER_BUBBLE_BLOCKLIST_BUTTON)); - - SetTitle(controller_.GetTitle()); -} - -std::unique_ptr<views::View> PasswordSaveUpdateView::CreateFooterView() { - if (!controller_.ShouldShowFooter()) - return nullptr; - auto label = std::make_unique<views::Label>( - l10n_util::GetStringUTF16(IDS_SAVE_PASSWORD_FOOTER), - ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL, - views::style::STYLE_SECONDARY); - label->SetMultiLine(true); - label->SetHorizontalAlignment(gfx::ALIGN_LEFT); - return label; -} - -void PasswordSaveUpdateView::OnDialogCancelled() { - UpdateUsernameAndPasswordInModel(); - if (is_update_bubble_) - controller_.OnNopeUpdateClicked(); - else - controller_.OnNeverForThisSiteClicked(); -} - -void PasswordSaveUpdateView::OnContentChanged() { - bool is_update_state_before = controller_.IsCurrentStateUpdate(); - bool is_ok_button_enabled_before = - IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK); - UpdateUsernameAndPasswordInModel(); - // Maybe the buttons should be updated. - if (is_update_state_before != controller_.IsCurrentStateUpdate() || - is_ok_button_enabled_before != - IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)) { - UpdateBubbleUIElements(); - DialogModelChanged(); - // TODO(ellyjones): This should not be necessary; DialogModelChanged() - // implies a re-layout of the dialog. - GetWidget()->GetRootView()->Layout(); - } -}
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.h b/chrome/browser/ui/views/passwords/password_save_update_view.h deleted file mode 100644 index 8110234..0000000 --- a/chrome/browser/ui/views/passwords/password_save_update_view.h +++ /dev/null
@@ -1,77 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_SAVE_UPDATE_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_SAVE_UPDATE_VIEW_H_ - -#include "chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.h" -#include "chrome/browser/ui/views/passwords/password_bubble_view_base.h" -#include "ui/views/view.h" - -namespace views { -class EditableCombobox; -class ToggleImageButton; -} // namespace views - -class PasswordSignInPromoView; - -// A view offering the user the ability to save or update credentials (depending -// on |is_update_bubble|). Contains a username and password field, along with a -// "Save"/"Update" button and a "Never"/"Nope" button. -class PasswordSaveUpdateView : public PasswordBubbleViewBase { - public: - PasswordSaveUpdateView(content::WebContents* web_contents, - views::View* anchor_view, - DisplayReason reason); - - views::View* GetUsernameTextfieldForTest() const; - - private: - ~PasswordSaveUpdateView() override; - - // PasswordBubbleViewBase - PasswordBubbleControllerBase* GetController() override; - const PasswordBubbleControllerBase* GetController() const override; - - // PasswordBubbleViewBase: - views::View* GetInitiallyFocusedView() override; - bool IsDialogButtonEnabled(ui::DialogButton button) const override; - ui::ImageModel GetWindowIcon() override; - bool Accept() override; - - // View: - void AddedToWidget() override; - void OnThemeChanged() override; - - void TogglePasswordVisibility(); - void UpdateUsernameAndPasswordInModel(); - void ReplaceWithPromo(); - void UpdateBubbleUIElements(); - std::unique_ptr<views::View> CreateFooterView(); - void OnDialogCancelled(); - - // Used for both the username and password editable comboboxes. - void OnContentChanged(); - - SaveUpdateBubbleController controller_; - - // True iff it is an update password bubble on creation. False iff it is a - // save bubble. - const bool is_update_bubble_; - - // Different promo dialogs that helps the user get access to credentials - // across devices. One of these are non-null when the promotion dialog is - // active. - PasswordSignInPromoView* sign_in_promo_ = nullptr; - - views::EditableCombobox* username_dropdown_ = nullptr; - views::ToggleImageButton* password_view_button_ = nullptr; - - // The view for the password value. - views::EditableCombobox* password_dropdown_ = nullptr; - - bool are_passwords_revealed_; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_SAVE_UPDATE_VIEW_H_
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h index eefb64ec..e4d60d6d 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h +++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h
@@ -27,6 +27,7 @@ // a username and password field, and in case of a saving a destination picker. // In addition, it contains a "Save"/"Update" button and a "Never"/"Nope" // button. +// TODO(crbug.com/1108738): Rename to PasswordSaveUpdateView. class PasswordSaveUpdateWithAccountStoreView : public PasswordBubbleViewBase, public views::WidgetObserver,
diff --git a/chrome/browser/ui/views/passwords/password_sign_in_promo_view.h b/chrome/browser/ui/views/passwords/password_sign_in_promo_view.h index 749cff6..0f3a945 100644 --- a/chrome/browser/ui/views/passwords/password_sign_in_promo_view.h +++ b/chrome/browser/ui/views/passwords/password_sign_in_promo_view.h
@@ -18,6 +18,7 @@ // A view that can show up after saving a password without being signed in to // offer signing users in so they can access their credentials across devices. +// TODO(crbug.com/1108738): This class is unused; delete it. class PasswordSignInPromoView : public views::View { public: METADATA_HEADER(PasswordSignInPromoView);
diff --git a/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.cc index fd72786..3f95efb 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.cc
@@ -145,14 +145,13 @@ if (contents()) contents()->SetDelegate(nullptr); - // Abort unfinished signed-in profile creation. + // Record unfinished signed-in profile creation. if (!is_finished_) { - // TODO(crbug.com/1196290): Schedule the profile for deletion here, it's not + // TODO(crbug.com/1227699): Schedule the profile for deletion here, it's not // needed any more. This triggers a crash if the browser is shutting down // completely. Figure a way how to delete the profile only if that does not // compete with a shutdown. - // Log profile creation flow abortion. if (IsSigningIn()) { ProfileMetrics::LogProfileAddSignInFlowOutcome( ProfileMetrics::ProfileAddSignInFlowOutcome::kAbortedBeforeSignIn); @@ -173,12 +172,12 @@ // Listen for sign-in getting completed. identity_manager_observation_.Observe( - IdentityManagerFactory::GetForProfile(profile())); + IdentityManagerFactory::GetForProfile(profile_)); ProfileAttributesEntry* entry = g_browser_process->profile_manager() ->GetProfileAttributesStorage() - .GetProfileAttributesWithPath(profile()->GetPath()); + .GetProfileAttributesWithPath(profile_->GetPath()); if (!entry) { NOTREACHED(); return; @@ -195,7 +194,7 @@ // Apply the default theme to get consistent colors for toolbars (this matters // for linux where the 'system' theme is used for new profiles). - auto* theme_service = ThemeServiceFactory::GetForProfile(profile()); + auto* theme_service = ThemeServiceFactory::GetForProfile(profile_); theme_service->UseDefaultTheme(); // Make sure the web contents used for sign-in has proper background to match @@ -212,8 +211,22 @@ } void ProfilePickerSignInFlowController::Cancel() { - // Finished here, avoid aborting the flow in the destructor later on. + if (is_finished_) + return; + is_finished_ = true; + + // TODO(crbug.com/1227699): Consider moving this into the destructor so that + // unfinished (and unaborted) flows also get the profile deleted right away. + g_browser_process->profile_manager()->ScheduleProfileForDeletion( + profile_->GetPath(), base::DoNothing()); +} + +void ProfilePickerSignInFlowController::ReloadSignInPage() { + if (contents() && IsSigningIn()) { + contents()->GetController().Reload(content::ReloadType::BYPASSING_CACHE, + true); + } } void ProfilePickerSignInFlowController::SetProfileColor(SkColor color) { @@ -236,7 +249,7 @@ const ui::ThemeProvider* ProfilePickerSignInFlowController::GetThemeProvider() const { - return &ThemeService::GetThemeProviderForProfile(profile()); + return &ThemeService::GetThemeProviderForProfile(profile_); } std::string ProfilePickerSignInFlowController::GetUserDomain() const { @@ -356,12 +369,12 @@ // DiceTurnSyncOnHelper deletes itself once done. new DiceTurnSyncOnHelper( - profile(), signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, + profile_, signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO, signin_metrics::Reason::kSigninPrimaryAccount, account_info.account_id, DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT, std::make_unique<ProfilePickerTurnSyncOnDelegate>( - weak_ptr_factory_.GetWeakPtr(), profile()), + weak_ptr_factory_.GetWeakPtr(), profile_), std::move(sync_consent_completed_closure)); } @@ -386,7 +399,7 @@ void ProfilePickerSignInFlowController::OnProfileNameAvailable() { // Stop listening to further changes. DCHECK(identity_manager_observation_.IsObservingSource( - IdentityManagerFactory::GetForProfile(profile()))); + IdentityManagerFactory::GetForProfile(profile_))); identity_manager_observation_.Reset(); if (on_profile_name_available_) @@ -447,14 +460,14 @@ ProfileAttributesEntry* entry = g_browser_process->profile_manager() ->GetProfileAttributesStorage() - .GetProfileAttributesWithPath(profile()->GetPath()); + .GetProfileAttributesWithPath(profile_->GetPath()); if (!entry) { NOTREACHED(); return; } entry->SetIsOmitted(false); - if (!profile()->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) { + if (!profile_->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) { // Unmark this profile ephemeral so that it isn't deleted upon next startup. // Profiles should never be made non-ephemeral if ephemeral mode is forced // by policy. @@ -469,13 +482,13 @@ // consent), apply a new color to the profile (otherwise, a more complicated // logic gets triggered in ShowCustomizationBubble()). if (!enterprise_sync_consent_needed && - !ProfileCustomizationBubbleSyncController::CanThemeSyncStart(profile())) { - auto* theme_service = ThemeServiceFactory::GetForProfile(profile()); + !ProfileCustomizationBubbleSyncController::CanThemeSyncStart(profile_)) { + auto* theme_service = ThemeServiceFactory::GetForProfile(profile_); theme_service->BuildAutogeneratedThemeFromColor(profile_color_); } // Skip the FRE for this profile as it's replaced by profile creation flow. - profile()->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, true); + profile_->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, true); // TODO(crbug.com/1126913): Change the callback of // profiles::OpenBrowserWindowForProfile() to be a OnceCallback as it is only @@ -489,7 +502,7 @@ // extensions because we only open browser // window if the Profile is not locked. // Hence there is no extension blocked. - profile(), Profile::CREATE_STATUS_INITIALIZED); + profile_, Profile::CREATE_STATUS_INITIALIZED); } void ProfilePickerSignInFlowController::FinishAndOpenBrowserForSAML() {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.h b/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.h index f99803b..933d01b4 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.h +++ b/chrome/browser/ui/views/profiles/profile_picker_sign_in_flow_controller.h
@@ -59,6 +59,11 @@ // must take care of logging the outcome of the flow on its own. void Cancel(); + // Reloads the sign-in page if applicable. + void ReloadSignInPage(); + + // TODO(crbug.com/1227029): Make private as an implementation detail of the + // DICe flow. content::WebContents* contents() const { return contents_.get(); } // Updates the profile color provided in the constructor. @@ -75,8 +80,6 @@ // if the user is not signed-in. std::string GetUserDomain() const; - Profile* profile() const { return profile_; } - // Getter of the path of profile which is displayed on the profile switch // screen. Returns an empty path if no such screen has been displayed. base::FilePath switch_profile_path() const { return switch_profile_path_; }
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc index 90cb31a3..d29ebd9d 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -409,9 +409,8 @@ } void ProfilePickerView::CreateToolbarBackButton() { - // The sign-in profile is needed to obtain the ThemeProvider which is needed - // by ToolbarButton on construction. - DCHECK(sign_in_->profile()); + // ThemeProvider is needed by ToolbarButton on construction. + DCHECK(GetThemeProvider()); auto back_button = std::make_unique<SimpleBackButton>(base::BindRepeating( &ProfilePickerView::BackButtonPressed, base::Unretained(this))); toolbar_->AddChildView(std::move(back_button)); @@ -609,8 +608,7 @@ void ProfilePickerView::CancelSignIn() { DCHECK(sign_in_); - g_browser_process->profile_manager()->ScheduleProfileForDeletion( - sign_in_->profile()->GetPath(), base::DoNothing()); + sign_in_->Cancel(); switch (entry_point_) { case ProfilePicker::EntryPoint::kOnStartup: @@ -630,9 +628,7 @@ return; } case ProfilePicker::EntryPoint::kProfileMenuAddNewProfile: { - // Finished here, avoid aborting the flow in the destructor (which is - // called as a result of Clear()). - sign_in_->Cancel(); + // This results in destroying `this` incl. `sign_in_`. Clear(); return; } @@ -745,8 +741,7 @@ case IDC_RELOAD_CLEARING_CACHE: { // Sign-in may fail due to connectivity issues, allow reloading. if (GetSigningIn()) { - sign_in_->contents()->GetController().Reload( - content::ReloadType::BYPASSING_CACHE, true); + sign_in_->ReloadSignInPage(); } break; } @@ -794,8 +789,7 @@ } void ProfilePickerView::UpdateToolbarColor() { - // The sign-in profile is needed to obtain the ThemeProvider. - DCHECK(sign_in_->profile()); + DCHECK(GetThemeProvider()); SkColor background_color = GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR); toolbar_->SetBackground(views::CreateSolidBackground(background_color));
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index 521e6aa8..38471b7 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -1344,6 +1344,7 @@ /*is_consented_primary_account=*/true); Profile* profile_being_created = StartSigninFlow(); + base::FilePath profile_path = profile_being_created->GetPath(); // Simulate a successful Gaia sign-in. SignIn(profile_being_created, "joe.consumer@gmail.com", "Joe"); @@ -1373,12 +1374,10 @@ // Check expectations when the profile creation flow is done. WaitForPickerClosed(); - // Profile creation shouldn't be finished. + // Profile should be already deleted. ProfileAttributesEntry* entry = - storage.GetProfileAttributesWithPath(profile_being_created->GetPath()); - EXPECT_NE(entry, nullptr); - EXPECT_TRUE(entry->IsEphemeral()); - EXPECT_TRUE(entry->IsOmitted()); + storage.GetProfileAttributesWithPath(profile_path); + EXPECT_EQ(entry, nullptr); } IN_PROC_BROWSER_TEST_F(ProfilePickerIntegratedEnterpriseCreationFlowBrowserTest,
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc index eef975a..ee66677 100644 --- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc +++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
@@ -10,6 +10,7 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" @@ -21,6 +22,8 @@ #include "components/infobars/content/content_infobar_manager.h" #include "components/infobars/core/infobar.h" #include "components/url_formatter/elide_url.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" @@ -35,6 +38,7 @@ namespace { using content::GlobalRenderFrameHostId; +using content::RenderFrameHost; using content::WebContents; #if !BUILDFLAG(IS_CHROMEOS_ASH) @@ -116,6 +120,15 @@ return main_frame ? main_frame->GetGlobalId() : GlobalRenderFrameHostId(); } +uint32_t GetHash(const ui::ImageModel& image) { + const SkBitmap* const bitmap = image.GetImage().ToSkBitmap(); + if (!bitmap) { + return 0; + } + return base::FastHash(base::make_span( + static_cast<uint8_t*>(bitmap->getPixels()), bitmap->computeByteSize())); +} + } // namespace // static @@ -132,10 +145,9 @@ : capturer_(capturer), shared_tab_media_id_(media_id), app_name_(std::move(app_name)) { - shared_tab_ = - WebContents::FromRenderFrameHost(content::RenderFrameHost::FromID( - media_id.web_contents_id.render_process_id, - media_id.web_contents_id.main_render_frame_id)); + shared_tab_ = WebContents::FromRenderFrameHost( + RenderFrameHost::FromID(media_id.web_contents_id.render_process_id, + media_id.web_contents_id.main_render_frame_id)); Observe(shared_tab_); shared_tab_name_ = GetTabName(shared_tab_); profile_ = ProfileManager::GetLastUsedProfileAllowedByPolicy(); @@ -155,11 +167,13 @@ gfx::NativeViewId TabSharingUIViews::OnStarted( base::OnceClosure stop_callback, content::MediaStreamUI::SourceCallback source_callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); source_callback_ = std::move(source_callback); stop_callback_ = std::move(stop_callback); CreateInfobarsForAllTabs(); SetContentsBorderVisible(shared_tab_, true); CreateTabCaptureIndicator(); + FaviconPeriodicUpdate(++share_session_seq_num_); return 0; } @@ -176,7 +190,7 @@ shared_tab_ = shared_tab; shared_tab_name_ = GetTabName(shared_tab_); - content::RenderFrameHost* main_frame = shared_tab->GetMainFrame(); + RenderFrameHost* main_frame = shared_tab->GetMainFrame(); DCHECK(main_frame); RemoveInfobarsForAllTabs(); source_callback_.Run(content::DesktopMediaID( @@ -187,12 +201,14 @@ } void TabSharingUIViews::StopSharing() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!stop_callback_.is_null()) std::move(stop_callback_).Run(); RemoveInfobarsForAllTabs(); SetContentsBorderVisible(shared_tab_, false); tab_capture_indicator_ui_.reset(); shared_tab_ = nullptr; + ++share_session_seq_num_; // Invalidates previously scheduled tasks. } void TabSharingUIViews::OnBrowserAdded(Browser* browser) { @@ -308,11 +324,13 @@ // Capturer -> switch-to-captured. // Captured -> switch-to-capturer. // Otherwise -> no switch-to button. - absl::optional<GlobalRenderFrameHostId> focus_target; + absl::optional<TabSharingInfoBarDelegate::FocusTarget> focus_target; if (is_capturing_tab && !is_captured_tab) { - focus_target = absl::make_optional(GetGlobalId(shared_tab_)); + focus_target = {GetGlobalId(shared_tab_), TabFavicon(shared_tab_)}; + captured_favicon_hash_ = GetHash(focus_target->icon); } else if (!is_capturing_tab && is_captured_tab) { - focus_target = absl::make_optional(capturer_); + focus_target = {capturer_, TabFavicon(capturer_)}; + capturer_favicon_hash_ = GetHash(focus_target->icon); } infobars_[contents] = TabSharingInfoBarDelegate::Create( @@ -348,3 +366,78 @@ /*label=*/std::string(), /*screen_capture_ids=*/{}, content::MediaStreamUI::StateChangeCallback()); } + +void TabSharingUIViews::FaviconPeriodicUpdate(size_t share_session_seq_num) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (share_session_seq_num != share_session_seq_num_) { + return; + } + + RefreshFavicons(); + + content::GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, + base::BindOnce(&TabSharingUIViews::FaviconPeriodicUpdate, + weak_factory_.GetWeakPtr(), share_session_seq_num), + base::TimeDelta::FromMilliseconds(500)); +} + +void TabSharingUIViews::RefreshFavicons() { + if (!shared_tab_) { + return; + } + + WebContents* const capturer = + WebContents::FromRenderFrameHost(RenderFrameHost::FromID(capturer_)); + if (!capturer) { + return; + } + + // If the capturer's favicon has changed, update the captured tab's button. + MaybeUpdateFavicon(capturer, &capturer_favicon_hash_, shared_tab_); + + // If the captured tab's favicon has changed, update the capturer's button. + MaybeUpdateFavicon(shared_tab_, &captured_favicon_hash_, capturer); +} + +void TabSharingUIViews::MaybeUpdateFavicon( + WebContents* focus_target, + absl::optional<uint32_t>* current_hash, + WebContents* infobar_owner) { + const ui::ImageModel favicon = TabFavicon(focus_target); + const uint32_t hash = GetHash(favicon); + if (*current_hash != hash) { + *current_hash = hash; + // TODO(crbug.com/1224363): Update favicons without recreating infobars. + // To do so cleanly requires that |infobars_| map to |ConfirmInfoBar|. + CreateInfobarForWebContents(infobar_owner); + } +} + +ui::ImageModel TabSharingUIViews::TabFavicon(WebContents* web_contents) const { + if (!web_contents) { + return ui::ImageModel::FromImage(favicon::GetDefaultFavicon()); + } + + auto it = favicon_overrides_for_testing_.find(web_contents); + if (it != favicon_overrides_for_testing_.end()) { + return it->second; + } + + const gfx::Image favicon = favicon::TabFaviconFromWebContents(web_contents); + return ui::ImageModel::FromImage( + favicon.IsEmpty() ? favicon::GetDefaultFavicon() : favicon); +} + +ui::ImageModel TabSharingUIViews::TabFavicon( + GlobalRenderFrameHostId rfh_id) const { + return TabFavicon(content::WebContents::FromRenderFrameHost( + content::RenderFrameHost::FromID(rfh_id))); +} + +void TabSharingUIViews::SetTabFaviconForTesting( + content::WebContents* web_contents, + const ui::ImageModel& favicon) { + favicon_overrides_for_testing_[web_contents] = favicon; +}
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h index 6378b70..cbc73ee 100644 --- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h +++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h
@@ -11,6 +11,7 @@ #include "base/callback.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" #include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/ui/tab_sharing/tab_sharing_ui.h" @@ -19,6 +20,7 @@ #include "components/infobars/core/infobar_manager.h" #include "content/public/browser/desktop_media_id.h" #include "content/public/browser/web_contents_observer.h" +#include "ui/base/models/image_model.h" namespace content { class WebContents; @@ -76,14 +78,37 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; void WebContentsDestroyed() override; + // DidUpdateFaviconURL() is not overridden. We wait until + // FaviconPeriodicUpdate() before updating the favicon. A captured tab can + // toggle its favicon back and forth at an arbitrary rate, but we implicitly + // rate-limit our response. private: + friend class TabSharingUIViewsBrowserTest; + void CreateInfobarsForAllTabs(); void CreateInfobarForWebContents(content::WebContents* contents); void RemoveInfobarsForAllTabs(); void CreateTabCaptureIndicator(); + // Periodically checks for changes that would require the infobar to be + // recreated, such as a favicon change. + // Consult |share_session_seq_num_| for |share_session_seq_num|'s meaning. + void FaviconPeriodicUpdate(size_t share_session_seq_num); + + void RefreshFavicons(); + + void MaybeUpdateFavicon(content::WebContents* focus_target, + absl::optional<uint32_t>* current_hash, + content::WebContents* infobar_owner); + + ui::ImageModel TabFavicon(content::WebContents* web_contents) const; + ui::ImageModel TabFavicon(content::GlobalRenderFrameHostId rfh_id) const; + + void SetTabFaviconForTesting(content::WebContents* web_contents, + const ui::ImageModel& favicon); + std::map<content::WebContents*, infobars::InfoBar*> infobars_; const content::GlobalRenderFrameHostId capturer_; content::DesktopMediaID shared_tab_media_id_; @@ -93,8 +118,24 @@ Profile* profile_; std::unique_ptr<content::MediaStreamUI> tab_capture_indicator_ui_; + // FaviconPeriodicUpdate() runs on a delayed task which re-posts itself. + // The first task is associated with |share_session_seq_num_|, then all + // repetitions of the task are associated with that value. + // When |share_session_seq_num_| is incremented, all previously scheduled + // tasks are invalidated, thereby ensuring that no more than one "live" + // FaviconPeriodicUpdate() task can exist at any given moment. + size_t share_session_seq_num_ = 0; + content::MediaStreamUI::SourceCallback source_callback_; base::OnceClosure stop_callback_; + + absl::optional<uint32_t> capturer_favicon_hash_; + absl::optional<uint32_t> captured_favicon_hash_; + + std::map<content::WebContents*, ui::ImageModel> + favicon_overrides_for_testing_; + + base::WeakPtrFactory<TabSharingUIViews> weak_factory_{this}; }; #endif // CHROME_BROWSER_UI_VIEWS_TAB_SHARING_TAB_SHARING_UI_VIEWS_H_
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc index b887d20..19c5a11d 100644 --- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc +++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
@@ -4,7 +4,11 @@ #include "chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h" +#include <map> +#include <string> + #include "build/chromeos_buildflags.h" +#include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -25,10 +29,14 @@ #include "content/public/test/browser_test.h" #include "testing/gmock/include/gmock/gmock.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/favicon_size.h" +#include "ui/gfx/image/image_unittest_util.h" #include "ui/views/widget/widget.h" namespace { +using ::testing::Not; + content::WebContents* GetWebContents(Browser* browser, int tab) { return browser->tab_strip_model()->GetWebContentsAt(tab); } @@ -64,6 +72,12 @@ ->GetButtonLabel(ConfirmInfoBarDelegate::InfoBarButton::BUTTON_CANCEL); } +ui::ImageModel GetSecondaryButtonImage(Browser* browser, int tab) { + DCHECK(HasSecondaryButton(browser, tab)); // Test error otherwise. + return GetDelegate(browser, tab) + ->GetButtonImage(ConfirmInfoBarDelegate::InfoBarButton::BUTTON_CANCEL); +} + std::u16string GetExpectedSwitchToMessage(Browser* browser, int tab) { content::RenderFrameHost* const rfh = GetWebContents(browser, tab)->GetMainFrame(); @@ -101,12 +115,19 @@ constexpr int kNullTabIndex = -1; const std::u16string kShareThisTabInsteadMessage = u"Share this tab instead"; + } // namespace class TabSharingUIViewsBrowserTest : public InProcessBrowserTest { public: TabSharingUIViewsBrowserTest() {} + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + DCHECK_EQ(browser()->tab_strip_model()->count(), 1); + CreateUniqueFaviconFor(browser()->tab_strip_model()->GetWebContentsAt(0)); + } + void CreateUiAndStartSharing(Browser* browser, int capturing_tab, int captured_tab) { @@ -116,6 +137,14 @@ tab_sharing_ui_ = TabSharingUI::Create( GetGlobalId(browser, capturing_tab), GetDesktopMediaID(browser, captured_tab), u"example-sharing.com"); + + for (int i = 0; i < browser->tab_strip_model()->count(); ++i) { + content::WebContents* const web_contents = + browser->tab_strip_model()->GetWebContentsAt(i); + tab_sharing_ui_views()->SetTabFaviconForTesting( + web_contents, favicons_.find(web_contents)->second); + } + tab_sharing_ui_->OnStarted( base::OnceClosure(), base::BindRepeating(&TabSharingUIViewsBrowserTest::OnStartSharing, @@ -162,30 +191,79 @@ capture_indicator->IsBeingMirrored(GetWebContents(browser, i))); if (i == capturing_tab && i == captured_tab) { + // Self-capture. EXPECT_FALSE(HasSecondaryButton(browser, i)); } else if (i == capturing_tab) { + // Capturing-tab's infobar. ASSERT_TRUE(HasSecondaryButton(browser, i)); EXPECT_EQ(GetSecondaryButtonLabel(browser, i), GetExpectedSwitchToMessage(browser, captured_tab)); + EXPECT_EQ(GetSecondaryButtonImage(browser, i), + GetFaviconAssociatedWith(browser, captured_tab)); } else if (i == captured_tab) { + // Captured-tab's infobar. ASSERT_TRUE(HasSecondaryButton(browser, i)); EXPECT_EQ(GetSecondaryButtonLabel(browser, i), GetExpectedSwitchToMessage(browser, capturing_tab)); + EXPECT_EQ(GetSecondaryButtonImage(browser, i), + GetFaviconAssociatedWith(browser, capturing_tab)); } else if (infobar_manager->infobar_count() > 0) { + // Any other infobar. ASSERT_TRUE(HasSecondaryButton(browser, i)); EXPECT_EQ(GetSecondaryButtonLabel(browser, i), kShareThisTabInsteadMessage); + EXPECT_EQ(GetSecondaryButtonImage(browser, i), ui::ImageModel()); } } } - void AddTabs(Browser* browser, int tab_count = 1) { + void AddTabs(Browser* browser, int tab_count) { for (int i = 0; i < tab_count; ++i) { - AddTabAtIndexToBrowser(browser, 0, GURL(chrome::kChromeUINewTabURL), + const int next_index = browser->tab_strip_model()->count(); + AddTabAtIndexToBrowser(browser, next_index, + GURL(chrome::kChromeUINewTabURL), ui::PAGE_TRANSITION_LINK, true); + CreateUniqueFaviconFor( + browser->tab_strip_model()->GetWebContentsAt(next_index)); } } + void CreateUniqueFaviconFor(content::WebContents* web_contents) { + // The URL produces here is only intended to produce a unique favicon. + // Note that GenerateMonogramFavicon() uses the first letter in the domain + // given to it for the monogram, meaning these URLs are all going to + // produce distinct favicons. + DCHECK_LE(next_unique_char_, 'z'); + const ui::ImageModel favicon = ui::ImageModel::FromImage( + gfx::Image::CreateFrom1xBitmap(favicon::GenerateMonogramFavicon( + GURL("https://" + std::string(1, next_unique_char_++) + ".com"), + gfx::kFaviconSize, gfx::kFaviconSize))); + + for (const auto& it : favicons_) { + ASSERT_NE(favicon, it.second); + } + + favicons_[web_contents] = favicon; + } + + ui::ImageModel GetFaviconAssociatedWith(Browser* browser, int tab) { + content::WebContents* const web_contents = + browser->tab_strip_model()->GetWebContentsAt(tab); + return favicons_.find(web_contents)->second; + } + + void UpdateTabFavicon(Browser* browser, int tab) { + CreateUniqueFaviconFor(browser->tab_strip_model()->GetWebContentsAt(tab)); + + content::WebContents* const web_contents = + browser->tab_strip_model()->GetWebContentsAt(tab); + tab_sharing_ui_views()->SetTabFaviconForTesting( + web_contents, favicons_.find(web_contents)->second); + + // Simulate waiting until the next periodic update. + tab_sharing_ui_views()->FaviconPeriodicUpdate(1); + } + TabSharingUIViews* tab_sharing_ui_views() { return static_cast<TabSharingUIViews*>(tab_sharing_ui_.get()); } @@ -199,6 +277,9 @@ } std::unique_ptr<TabSharingUI> tab_sharing_ui_; + + std::map<content::WebContents*, ui::ImageModel> favicons_; + char next_unique_char_ = 'a'; // Derive https://x.com from x. }; IN_PROC_BROWSER_TEST_F(TabSharingUIViewsBrowserTest, StartSharing) { @@ -233,6 +314,56 @@ VerifyUi(browser(), /*capturing_tab=*/0, /*captured_tab=*/2); } +IN_PROC_BROWSER_TEST_F(TabSharingUIViewsBrowserTest, + ChangeCapturingTabFavicon) { + constexpr int kCapturingTab = 0; + constexpr int kCapturedTab = 1; + + // Set up a screen-capture session. + AddTabs(browser(), 2); + ASSERT_EQ(browser()->tab_strip_model()->count(), 3); + CreateUiAndStartSharing(browser(), /*capturing_tab=*/0, /*captured_tab=*/1); + VerifyUi(browser(), kCapturingTab, kCapturedTab); // Sanity. + + // Simulate changing the tab favicon to a unique new favicon, then waiting + // until the change is picked up by the next periodic update. + UpdateTabFavicon(browser(), kCapturingTab); + VerifyUi(browser(), kCapturingTab, kCapturedTab); +} + +IN_PROC_BROWSER_TEST_F(TabSharingUIViewsBrowserTest, ChangeCapturedTabFavicon) { + constexpr int kCapturingTab = 0; + constexpr int kCapturedTab = 1; + + // Set up a screen-capture session. + AddTabs(browser(), 2); + ASSERT_EQ(browser()->tab_strip_model()->count(), 3); + CreateUiAndStartSharing(browser(), /*capturing_tab=*/0, /*captured_tab=*/1); + VerifyUi(browser(), kCapturingTab, kCapturedTab); // Sanity. + + // Simulate changing the tab favicon to a unique new favicon, then waiting + // until the change is picked up by the next periodic update. + UpdateTabFavicon(browser(), kCapturedTab); + VerifyUi(browser(), kCapturingTab, kCapturedTab); +} + +IN_PROC_BROWSER_TEST_F(TabSharingUIViewsBrowserTest, ChangeOtherTabFavicon) { + constexpr int kCapturingTab = 0; + constexpr int kCapturedTab = 1; + constexpr int kOtherTab = 2; + + // Set up a screen-capture session. + AddTabs(browser(), 2); + ASSERT_EQ(browser()->tab_strip_model()->count(), 3); + CreateUiAndStartSharing(browser(), /*capturing_tab=*/0, /*captured_tab=*/1); + VerifyUi(browser(), kCapturingTab, kCapturedTab); // Sanity. + + // Simulate changing the tab favicon to a unique new favicon, then waiting + // until the change is picked up by the next periodic update. + UpdateTabFavicon(browser(), kOtherTab); + VerifyUi(browser(), kCapturingTab, kCapturedTab); +} + IN_PROC_BROWSER_TEST_F(TabSharingUIViewsBrowserTest, StopSharing) { AddTabs(browser(), 2); ASSERT_EQ(browser()->tab_strip_model()->count(), 3); @@ -277,8 +408,12 @@ // Start sharing a tab in an incognito browser. Browser* incognito_browser = CreateIncognitoBrowser(); + DCHECK_EQ(incognito_browser->tab_strip_model()->count(), 1); + CreateUniqueFaviconFor( + incognito_browser->tab_strip_model()->GetWebContentsAt(0)); + AddTabs(incognito_browser, 3); - ASSERT_EQ(browser()->tab_strip_model()->count(), 3); + ASSERT_EQ(incognito_browser->tab_strip_model()->count(), 4); CreateUiAndStartSharing(incognito_browser, /*capturing_tab=*/0, /*captured_tab=*/1); VerifyUi(incognito_browser, /*capturing_tab=*/0, /*captured_tab=*/1); @@ -353,17 +488,23 @@ InfobarLabelUpdatedOnNavigation) { AddTabs(browser(), 1); ASSERT_EQ(browser()->tab_strip_model()->count(), 2); - CreateUiAndStartSharing(browser(), /*capturing_tab=*/1, /*captured_tab=*/0); - ASSERT_THAT(base::UTF16ToUTF8(GetInfobarMessageText(browser(), 1)), + + constexpr int kCapturingTab = 0; + constexpr int kCapturedTab = 1; + + CreateUiAndStartSharing(browser(), kCapturingTab, kCapturedTab); + ASSERT_THAT(base::UTF16ToUTF8(GetInfobarMessageText(browser(), 0)), ::testing::HasSubstr(chrome::kChromeUINewTabHost)); ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL)); - EXPECT_THAT(base::UTF16ToUTF8(GetInfobarMessageText(browser(), 1)), - ::testing::HasSubstr(chrome::kChromeUIVersionHost)); + EXPECT_THAT( + base::UTF16ToUTF8(GetInfobarMessageText(browser(), kCapturingTab)), + ::testing::HasSubstr(chrome::kChromeUIVersionHost)); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); - EXPECT_THAT(base::UTF16ToUTF8(GetInfobarMessageText(browser(), 1)), - ::testing::HasSubstr("about:blank")); + EXPECT_THAT( + base::UTF16ToUTF8(GetInfobarMessageText(browser(), kCapturingTab)), + ::testing::HasSubstr("about:blank")); } class MultipleTabSharingUIViewsBrowserTest : public InProcessBrowserTest {
diff --git a/chrome/browser/ui/views/tabs/overflow_view.cc b/chrome/browser/ui/views/tabs/overflow_view.cc index af180b83..38ee2ef9 100644 --- a/chrome/browser/ui/views/tabs/overflow_view.cc +++ b/chrome/browser/ui/views/tabs/overflow_view.cc
@@ -128,7 +128,7 @@ // but only if the overflow view would be shown. const gfx::Size required_size = GetSizeFromFlexRule(child, available).value_or(child->GetMinimumSize()); - const gfx::Size overflow_size = + const gfx::Size indicator_size = GetSizeFromFlexRule(indicator_view_, views::SizeBounds()) .value_or(indicator_view_->GetPreferredSize()); switch (orientation_) { @@ -138,7 +138,7 @@ return available; } return views::SizeBounds( - std::max(0, available.width().value() - overflow_size.width()), + std::max(0, available.width().value() - indicator_size.width()), available.height()); case views::LayoutOrientation::kVertical: if (!available.height().is_bounded() || @@ -147,7 +147,7 @@ } return views::SizeBounds( available.width(), - std::max(0, available.height().value() - overflow_size.height())); + std::max(0, available.height().value() - indicator_size.height())); } }
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 31df31f4..8aec4b2 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -3582,7 +3582,9 @@ } int TabStrip::GetAvailableWidthForTabStrip() const { - return available_width_callback_ ? available_width_callback_.Run() : width(); + return available_width_callback_ + ? available_width_callback_.Run() + : parent()->GetAvailableSize(this).width().value(); } void TabStrip::StartResizeLayoutAnimation() {
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc new file mode 100644 index 0000000..337d6887 --- /dev/null +++ b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc
@@ -0,0 +1,255 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/tabs/tab_strip_scroll_container.h" + +#include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/ui/views/tabs/tab_strip.h" +#include "chrome/browser/ui/views/tabs/tab_strip_controller.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/gfx/canvas.h" +#include "ui/views/animation/ink_drop.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/image_button_factory.h" +#include "ui/views/controls/highlight_path_generator.h" +#include "ui/views/controls/scroll_view.h" +#include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/flex_layout.h" +#include "ui/views/layout/flex_layout_types.h" + +namespace { +// Define a custom FlexRule for |scroll_view_|. Equivalent to using a +// (kScaleToMinimum, kPreferred) flex specification on the tabstrip itself, +// bypassing the ScrollView. +// TODO(1132488): Make ScrollView take on TabStrip's preferred size instead. +gfx::Size TabScrollContainerFlexRule(const views::View* tab_strip, + const views::View* view, + const views::SizeBounds& size_bounds) { + const gfx::Size preferred_size = tab_strip->GetPreferredSize(); + const int minimum_width = tab_strip->GetMinimumSize().width(); + const int width = std::max( + minimum_width, size_bounds.width().min_of(preferred_size.width())); + return gfx::Size(width, preferred_size.height()); +} + +std::unique_ptr<views::ImageButton> CreateScrollButton( + views::Button::PressedCallback callback) { + // TODO(tbergquist): These have a lot in common with the NTB and the tab + // search buttons. Could probably extract a base class. + auto scroll_button = + std::make_unique<views::ImageButton>(std::move(callback)); + scroll_button->SetImageVerticalAlignment( + views::ImageButton::VerticalAlignment::ALIGN_MIDDLE); + scroll_button->SetImageHorizontalAlignment( + views::ImageButton::HorizontalAlignment::ALIGN_CENTER); + scroll_button->SetHasInkDropActionOnClick(true); + views::InkDrop::Get(scroll_button.get()) + ->SetMode(views::InkDropHost::InkDropMode::ON); + scroll_button->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); + scroll_button->SetPreferredSize(gfx::Size(28, 28)); + views::HighlightPathGenerator::Install( + scroll_button.get(), + std::make_unique<views::CircleHighlightPathGenerator>(gfx::Insets())); + + const views::FlexSpecification button_flex_spec = + views::FlexSpecification(views::LayoutOrientation::kHorizontal, + views::MinimumFlexSizeRule::kScaleToMinimum, + views::MaximumFlexSizeRule::kPreferred); + scroll_button->SetProperty(views::kFlexBehaviorKey, button_flex_spec); + return scroll_button; +} + +// A customized overflow indicator that paints a shadow-like gradient over the +// tabstrip. +class TabStripContainerOverflowIndicator : public views::View { + public: + METADATA_HEADER(TabStripContainerOverflowIndicator); + TabStripContainerOverflowIndicator(TabStrip* tab_strip, + views::OverflowIndicatorAlignment side) + : tab_strip_(tab_strip), side_(side) { + DCHECK(side_ == views::OverflowIndicatorAlignment::kLeft || + side_ == views::OverflowIndicatorAlignment::kRight); + } + + // Making this smaller than the margin provided by the leftmost/rightmost + // tab's tail (TabStyle::kTabOverlap / 2) makes the transition in and out of + // the scroll state smoother. + static constexpr int kOpaqueWidth = 8; + // The width of the full opacity part of the shadow. + static constexpr int kShadowSpread = 1; + // The width of the soft edge of the shadow. + static constexpr int kShadowBlur = 3; + static constexpr int kTotalWidth = kOpaqueWidth + kShadowSpread + kShadowBlur; + + // views::View overrides: + void OnPaint(gfx::Canvas* canvas) override { + // TODO(tbergquist): Handle themes with titlebar background images. + // TODO(tbergquist): Handle dark themes where GG800 doesn't contrast well. + SkColor frame_color = tab_strip_->controller()->GetFrameColor( + BrowserFrameActiveState::kUseCurrent); + SkColor shadow_color = gfx::kGoogleGrey800; + + // Mirror how the indicator is painted for the right vs left sides. + SkPoint points[2]; + if (side_ == views::OverflowIndicatorAlignment::kLeft) { + points[0].iset(GetContentsBounds().origin().x(), GetContentsBounds().y()); + points[1].iset(GetContentsBounds().right(), GetContentsBounds().y()); + } else { + points[0].iset(GetContentsBounds().right(), GetContentsBounds().y()); + points[1].iset(GetContentsBounds().origin().x(), GetContentsBounds().y()); + } + + SkColor colors[5]; + SkScalar color_positions[5]; + // Paint an opaque region on the outside. + colors[0] = frame_color; + colors[1] = frame_color; + color_positions[0] = 0; + color_positions[1] = static_cast<float>(kOpaqueWidth) / kTotalWidth; + + // Paint a shadow-like gradient on the inside. + colors[2] = SkColorSetA(shadow_color, 0x4D); + colors[3] = SkColorSetA(shadow_color, 0x4D); + colors[4] = SkColorSetA(shadow_color, SK_AlphaTRANSPARENT); + color_positions[2] = static_cast<float>(kOpaqueWidth) / kTotalWidth; + color_positions[3] = + static_cast<float>(kOpaqueWidth + kShadowSpread) / kTotalWidth; + color_positions[4] = 1; + + cc::PaintFlags flags; + flags.setShader(cc::PaintShader::MakeLinearGradient( + points, colors, color_positions, 5, SkTileMode::kClamp)); + canvas->DrawRect(GetContentsBounds(), flags); + } + + private: + TabStrip* tab_strip_; + views::OverflowIndicatorAlignment side_; +}; + +BEGIN_METADATA(TabStripContainerOverflowIndicator, views::View) +END_METADATA + +} // namespace + +TabStripScrollContainer::TabStripScrollContainer( + std::unique_ptr<TabStrip> tab_strip) + : tab_strip_(tab_strip.get()) { + SetLayoutManager(std::make_unique<views::FillLayout>()) + ->SetMinimumSizeEnabled(true); + + // TODO(https://crbug.com/1132488): ScrollView doesn't propagate changes to + // the TabStrip's preferred size; observe that manually. + tab_strip->View::AddObserver(this); + tab_strip->SetAvailableWidthCallback( + base::BindRepeating(&TabStripScrollContainer::GetTabStripAvailableWidth, + base::Unretained(this))); + + std::unique_ptr<views::ScrollView> scroll_view = + std::make_unique<views::ScrollView>( + views::ScrollView::ScrollWithLayers::kEnabled); + scroll_view_ = scroll_view.get(); + scroll_view->SetBackgroundColor(absl::nullopt); + scroll_view->SetHorizontalScrollBarMode( + views::ScrollView::ScrollBarMode::kHiddenButEnabled); + scroll_view->SetTreatAllScrollEventsAsHorizontal(true); + scroll_view->SetContents(std::move(tab_strip)); + + scroll_view->SetDrawOverflowIndicator(true); + left_overflow_indicator_ = scroll_view->SetCustomOverflowIndicator( + views::OverflowIndicatorAlignment::kLeft, + std::make_unique<TabStripContainerOverflowIndicator>( + tab_strip_, views::OverflowIndicatorAlignment::kLeft), + TabStripContainerOverflowIndicator::kTotalWidth, false); + right_overflow_indicator_ = scroll_view->SetCustomOverflowIndicator( + views::OverflowIndicatorAlignment::kRight, + std::make_unique<TabStripContainerOverflowIndicator>( + tab_strip_, views::OverflowIndicatorAlignment::kRight), + TabStripContainerOverflowIndicator::kTotalWidth, false); + + // This base::Unretained is safe because the callback is called by the + // layout manager, which is cleaned up before view children like + // |scroll_view| (which owns |tab_strip_|). + scroll_view->SetProperty( + views::kFlexBehaviorKey, + views::FlexSpecification(base::BindRepeating( + &TabScrollContainerFlexRule, base::Unretained(tab_strip_)))); + + std::unique_ptr<views::View> scroll_button_container = + std::make_unique<views::View>(); + views::FlexLayout* scroll_button_layout = + scroll_button_container->SetLayoutManager( + std::make_unique<views::FlexLayout>()); + scroll_button_layout->SetOrientation(views::LayoutOrientation::kHorizontal); + leading_scroll_button_ = + scroll_button_container->AddChildView(CreateScrollButton( + base::BindRepeating(&TabStripScrollContainer::ScrollTowardsLeadingTab, + base::Unretained(this)))); + trailing_scroll_button_ = scroll_button_container->AddChildView( + CreateScrollButton(base::BindRepeating( + &TabStripScrollContainer::ScrollTowardsTrailingTab, + base::Unretained(this)))); + + // The space in dips between the scroll buttons and the NTB. + constexpr int kScrollButtonsTrailingMargin = 8; + trailing_scroll_button_->SetProperty( + views::kMarginsKey, gfx::Insets(0, 0, 0, kScrollButtonsTrailingMargin)); + + // The default layout orientation (kHorizontal) and cross axis alignment + // (kStretch) work for our use case. + overflow_view_ = AddChildView(std::make_unique<OverflowView>( + std::move(scroll_view), std::move(scroll_button_container))); +} + +TabStripScrollContainer::~TabStripScrollContainer() = default; + +void TabStripScrollContainer::OnViewPreferredSizeChanged(views::View* view) { + DCHECK_EQ(tab_strip_, view); + + PreferredSizeChanged(); +} + +int TabStripScrollContainer::GetTabStripAvailableWidth() const { + return overflow_view_->GetAvailableSize(scroll_view_).width().value(); +} + +void TabStripScrollContainer::ScrollTowardsLeadingTab() { + gfx::Rect visible_content = scroll_view_->GetVisibleRect(); + gfx::Rect scroll(visible_content.x() - visible_content.width(), + visible_content.y(), visible_content.width(), + visible_content.height()); + scroll_view_->contents()->ScrollRectToVisible(scroll); +} + +void TabStripScrollContainer::ScrollTowardsTrailingTab() { + gfx::Rect visible_content = scroll_view_->GetVisibleRect(); + gfx::Rect scroll(visible_content.x() + visible_content.width(), + visible_content.y(), visible_content.width(), + visible_content.height()); + scroll_view_->contents()->ScrollRectToVisible(scroll); +} + +void TabStripScrollContainer::FrameColorsChanged() { + const SkColor background_color = tab_strip_->GetTabBackgroundColor( + TabActive::kInactive, BrowserFrameActiveState::kUseCurrent); + SkColor foreground_color = + tab_strip_->GetTabForegroundColor(TabActive::kInactive, background_color); + views::SetImageFromVectorIconWithColor( + leading_scroll_button_, kScrollingTabstripLeadingIcon, foreground_color); + views::SetImageFromVectorIconWithColor(trailing_scroll_button_, + kScrollingTabstripTrailingIcon, + foreground_color); + left_overflow_indicator_->SchedulePaint(); + right_overflow_indicator_->SchedulePaint(); +} + +void TabStripScrollContainer::OnThemeChanged() { + View::OnThemeChanged(); + FrameColorsChanged(); +} + +BEGIN_METADATA(TabStripScrollContainer, views::View) +ADD_READONLY_PROPERTY_METADATA(int, TabStripAvailableWidth) +END_METADATA
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h new file mode 100644 index 0000000..bf873ee --- /dev/null +++ b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h
@@ -0,0 +1,65 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_SCROLL_CONTAINER_H_ +#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_SCROLL_CONTAINER_H_ + +#include "chrome/browser/ui/views/tabs/overflow_view.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/views/view.h" +#include "ui/views/view_observer.h" + +namespace views { +class ImageButton; +} + +class TabStrip; + +// Allows the TabStrip to be scrolled back and forth when there are more tabs +// than can be displayed at one time. When the TabStrip is scrollable, displays +// buttons that control the scrolling. +class TabStripScrollContainer : public views::View, views::ViewObserver { + public: + METADATA_HEADER(TabStripScrollContainer); + explicit TabStripScrollContainer(std::unique_ptr<TabStrip> tab_strip); + TabStripScrollContainer(const TabStripScrollContainer&) = delete; + TabStripScrollContainer& operator=(const TabStripScrollContainer&) = delete; + ~TabStripScrollContainer() override; + + // views::ViewObserver: + void OnViewPreferredSizeChanged(View* view) override; + + private: + int GetTabStripAvailableWidth() const; + + // Scrolls the tabstrip towards the first tab in the tabstrip. + void ScrollTowardsLeadingTab(); + + // Scrolls the tabstrip towards the last tab in the tabstrip. + void ScrollTowardsTrailingTab(); + + void FrameColorsChanged(); + + // views::View + void OnThemeChanged() override; + + // Manages the visibility of the scroll buttons based on whether |tab_strip_| + // is currently overflowing. + OverflowView* overflow_view_; + + // Actually scrolls |tab_strip_|. + views::ScrollView* scroll_view_; + TabStrip* tab_strip_; + + // The buttons that allow users to manually scroll |tab_strip_|. + views::ImageButton* leading_scroll_button_; + views::ImageButton* trailing_scroll_button_; + + // The views, owned by |scroll_view_|, that indicate that there are more + // tabs overflowing to the left or right. + views::View* left_overflow_indicator_; + views::View* right_overflow_indicator_; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_SCROLL_CONTAINER_H_
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc index dd9abce..baeb174 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc
@@ -85,6 +85,8 @@ std::make_unique<WindowControlsOverlayToggleButton>(browser_view_)); views::SetHitTestComponent(window_controls_overlay_toggle_button_, static_cast<int>(HTCLIENT)); + ConfigureWebAppToolbarButton(window_controls_overlay_toggle_button_, + toolbar_button_provider_); } if (app_controller->HasTitlebarContentSettings()) { @@ -168,10 +170,7 @@ if (web_app_origin_text_) web_app_origin_text_->SetTextColor(foreground_color_); if (window_controls_overlay_toggle_button_) { - window_controls_overlay_toggle_button_->SetImageModel( - views::Button::STATE_NORMAL, - ui::ImageModel::FromVectorIcon(kOverflowChevronIcon, - foreground_color_)); + window_controls_overlay_toggle_button_->SetColor(foreground_color_); } if (content_settings_container_)
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.cc index 2358f0c..fddc6f7 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.cc
@@ -6,6 +6,7 @@ #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/web_applications/app_browser_controller.h" #include "chrome/grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" @@ -14,25 +15,39 @@ : ToolbarButton( base::BindRepeating(&WindowControlsOverlayToggleButton::ButtonPressed, base::Unretained(this))), - browser_view_(browser_view) { - SetTooltipText(browser_view_->IsWindowControlsOverlayEnabled() - ? l10n_util::GetStringUTF16( - IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP) - : l10n_util::GetStringUTF16( - IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP)); - SetImageModel(views::Button::STATE_NORMAL, - ui::ImageModel::FromVectorIcon(kOverflowChevronIcon, - gfx::kPlaceholderColor)); -} + browser_view_(browser_view) {} WindowControlsOverlayToggleButton::~WindowControlsOverlayToggleButton() = default; void WindowControlsOverlayToggleButton::ButtonPressed(const ui::Event& event) { browser_view_->ToggleWindowControlsOverlayEnabled(); - SetTooltipText(browser_view_->IsWindowControlsOverlayEnabled() + UpdateIcon(); +} + +void WindowControlsOverlayToggleButton::SetColor(SkColor icon_color) { + icon_color_ = icon_color; + UpdateIcon(); +} + +void WindowControlsOverlayToggleButton::UpdateIcon() { + // Use app_controller's IsWindowControlsOverlayEnabled rather than + // browser_view's to avoid this returning false at startup due to the CCT + // displaying momentarily. + bool enabled = browser_view_->browser() + ->app_controller() + ->IsWindowControlsOverlayEnabled(); + + SetImageModel( + views::Button::STATE_NORMAL, + enabled + ? ui::ImageModel::FromVectorIcon(kKeyboardArrowDownIcon, icon_color_) + : ui::ImageModel::FromVectorIcon(kKeyboardArrowUpIcon, icon_color_)); + + SetTooltipText(enabled ? l10n_util::GetStringUTF16( IDS_WEB_APP_DISABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP) : l10n_util::GetStringUTF16( IDS_WEB_APP_ENABLE_WINDOW_CONTROLS_OVERLAY_TOOLTIP)); + ToolbarButton::UpdateIcon(); }
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.h b/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.h index a673ce9..0de8ba0 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.h +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/window_controls_overlay_toggle_button.h
@@ -21,10 +21,15 @@ ~WindowControlsOverlayToggleButton() override; void ButtonPressed(const ui::Event& event); + void SetColor(SkColor color); + + // ToolbarButton: + void UpdateIcon() override; private: // The containing browser view. BrowserView* browser_view_; + SkColor icon_color_ = gfx::kPlaceholderColor; }; #endif // CHROME_BROWSER_UI_VIEWS_WEB_APPS_FRAME_TOOLBAR_WINDOW_CONTROLS_OVERLAY_TOGGLE_BUTTON_H_
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index 8e159f7..c2b5236 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -537,8 +537,7 @@ params.SetString("frameUrl", public_saml_url_fetcher_->GetRedirectUrl()); } else { LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError( - SigninError::kFailedToFetchSamlRedirect, /*details=*/std::string(), - /*login_attempts=*/1); + SigninError::kFailedToFetchSamlRedirect, /*details=*/std::string()); return; } } @@ -827,7 +826,7 @@ *extension_provided_client_cert_usage_observer_, pending_user_context_.get(), &error)) { LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError( - error, /*details=*/std::string(), /*login_attempts=*/1); + error, /*details=*/std::string()); pending_user_context_.reset(); return; } @@ -848,8 +847,7 @@ void GaiaScreenHandler::OnCookieWaitTimeout() { LoadAuthExtension(true /* force */); LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError( - SigninError::kCookieWaitTimeout, /*details=*/std::string(), - /*login_attempts=*/1); + SigninError::kCookieWaitTimeout, /*details=*/std::string()); } void GaiaScreenHandler::HandleCompleteLogin(const std::string& gaia_id, @@ -1048,7 +1046,7 @@ *extension_provided_client_cert_usage_observer_, &user_context, &error)) { LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError( - error, /*details=*/std::string(), /*login_attempts=*/1); + error, /*details=*/std::string()); return; }
diff --git a/chrome/browser/ui/webui/chromeos/login/management_transition_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/management_transition_screen_handler.cc index 5532825..0c1ba028 100644 --- a/chrome/browser/ui/webui/chromeos/login/management_transition_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/management_transition_screen_handler.cc
@@ -112,7 +112,7 @@ base::DictionaryValue data; data.SetInteger("arcTransition", - static_cast<int>(arc::GetSupervisionTransition(profile))); + static_cast<int>(arc::GetManagementTransition(profile))); data.SetString( "managementEntity", chrome::GetAccountManagerIdentity(profile).value_or(std::string()));
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 3f97734..697cd9d2 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -194,14 +194,16 @@ constexpr char kHDIronIconHTML[] = "components/hd_iron_icon.html"; constexpr char kHDIronIconJS[] = "components/hd_iron_icon.js"; constexpr char kOobeAdaptiveDialogHTML[] = - "components/oobe_adaptive_dialog.html"; -constexpr char kOobeAdaptvieDialogJS[] = "components/oobe_adaptive_dialog.js"; -constexpr char kOobeContentDialogHTML[] = "components/oobe_content_dialog.html"; -constexpr char kOobeContentDialogJS[] = "components/oobe_content_dialog.js"; -constexpr char kOobeDialogHTML[] = "components/oobe_dialog/oobe_dialog.html"; -constexpr char kOobeDialogJS[] = "components/oobe_dialog/oobe_dialog.js"; -constexpr char kOobeLoadingDialogHTML[] = "components/oobe_loading_dialog/oobe_loading_dialog.html"; -constexpr char kOobeLoadingDialogJS[] = "components/oobe_loading_dialog/oobe_loading_dialog.js"; + "components/dialogs/oobe_adaptive_dialog.html"; +constexpr char kOobeAdaptvieDialogJS[] = "components/dialogs/oobe_adaptive_dialog.js"; +constexpr char kOobeContentDialogHTML[] = "components/dialogs/oobe_content_dialog.html"; +constexpr char kOobeContentDialogJS[] = "components/dialogs/oobe_content_dialog.js"; +constexpr char kOobeDialogHTML[] = "components/dialogs/oobe_dialog.html"; +constexpr char kOobeDialogJS[] = "components/dialogs/oobe_dialog.js"; +constexpr char kOobeLoadingDialogHTML[] = "components/dialogs/oobe_loading_dialog.html"; +constexpr char kOobeLoadingDialogJS[] = "components/dialogs/oobe_loading_dialog.js"; +constexpr char kOobeModalDialogHTML[] = "components/dialogs/oobe_modal_dialog.html"; +constexpr char kOobeModalDialogJS[] = "components/dialogs/oobe_modal_dialog.js"; constexpr char kOobeCarouselHTML[] = "components/oobe_carousel/oobe_carousel.html"; constexpr char kOobeCarouselJS[] = "components/oobe_carousel/oobe_carousel.js"; constexpr char kOobeSlideHTML[] = "components/oobe_slide/oobe_slide.html"; @@ -774,6 +776,10 @@ IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_HTML); source->AddResourcePath(kOobeLoadingDialogJS, IDR_OOBE_COMPONENTS_OOBE_LOADING_DIALOG_JS); + source->AddResourcePath(kOobeModalDialogHTML, + IDR_OOBE_COMPONENTS_OOBE_MODAL_DIALOG_HTML); + source->AddResourcePath(kOobeModalDialogJS, + IDR_OOBE_COMPONENTS_OOBE_MODAL_DIALOG_JS); if (features::IsNewOobeLayoutEnabled()) { if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) {
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc index d2f2b5d..d5f7f1d 100644 --- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
@@ -168,10 +168,6 @@ data.SetBoolean("isChildAccount", user_manager->IsLoggedInAsChildUser()); data.SetBoolean("splitSettingsSyncEnabled", chromeos::features::IsSplitSettingsSyncEnabled()); - // TODO(https://crbug.com/1222010): read actual minor mode signal from account - // capability. - data.SetBoolean("isMinorMode", - chromeos::features::IsMinorModeRestrictionEnabled()); ShowScreenWithData(kScreenId, &data); } @@ -181,6 +177,10 @@ CallJS("login.SyncConsentScreen.setThrobberVisible", visible); } +void SyncConsentScreenHandler::SetIsMinorMode(bool value) { + CallJS("login.SyncConsentScreen.setIsMinorMode", value); +} + void SyncConsentScreenHandler::Initialize() {} void SyncConsentScreenHandler::RegisterMessages() {
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h index ae973b5d..b6d6a9b 100644 --- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
@@ -36,6 +36,10 @@ // Controls if the loading throbber is visible. This is used when // SyncScreenBehavior is unknown. virtual void SetThrobberVisible(bool visible) = 0; + + // Set the minor mode flag, which controls whether we could use nudge + // techinuque on the UI. + virtual void SetIsMinorMode(bool value) = 0; }; // The sole implementation of the SyncConsentScreenView, using WebUI. @@ -60,6 +64,7 @@ void Show() override; void Hide() override; void SetThrobberVisible(bool visible) override; + void SetIsMinorMode(bool value) override; private: // BaseScreenHandler:
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc index c8694f5..d87a38e 100644 --- a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
@@ -172,6 +172,12 @@ "test" + base::NumberToString(test_credential_counter_++)); form.password_value = u"password"; form.username_element = u"username_element"; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = + base::flat_map<password_manager::InsecureType, + password_manager::InsecurityMetadata>(); store_->AddLogin(form); base::RunLoop().RunUntilIdle();
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 4279e343..142dd48 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -518,35 +518,38 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetDefault) { // Test the JS -> C++ -> JS callback path for getting and setting defaults. - base::ListValue get_args; - get_args.AppendString(kCallbackId); - get_args.AppendString(kNotifications); - handler()->HandleGetDefaultValueForContentType(&get_args); + base::Value get_args(base::Value::Type::LIST); + get_args.Append(kCallbackId); + get_args.Append(kNotifications); + handler()->HandleGetDefaultValueForContentType( + &base::Value::AsListValue(get_args)); ValidateDefault(CONTENT_SETTING_ASK, site_settings::SiteSettingSource::kDefault, 1U); // Set the default to 'Blocked'. - base::ListValue set_args; - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - handler()->HandleSetDefaultValueForContentType(&set_args); + handler()->HandleSetDefaultValueForContentType( + &base::Value::AsListValue(set_args)); EXPECT_EQ(2U, web_ui()->call_data().size()); // Verify that the default has been set to 'Blocked'. - handler()->HandleGetDefaultValueForContentType(&get_args); + handler()->HandleGetDefaultValueForContentType( + &base::Value::AsListValue(get_args)); ValidateDefault(CONTENT_SETTING_BLOCK, site_settings::SiteSettingSource::kDefault, 3U); } // Flaky on CrOS and Linux. https://crbug.com/930481 TEST_F(SiteSettingsHandlerTest, GetAllSites) { - base::ListValue get_all_sites_args; - get_all_sites_args.AppendString(kCallbackId); + base::Value get_all_sites_args(base::Value::Type::LIST); + get_all_sites_args.Append(kCallbackId); // Test all sites is empty when there are no preferences. - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); EXPECT_EQ(1U, web_ui()->call_data().size()); { @@ -568,7 +571,7 @@ url1, url1, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_BLOCK); map->SetContentSettingDefaultScope( url2, url2, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_ALLOW); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); @@ -596,7 +599,7 @@ const GURL url3("https://example2.net"); map->SetContentSettingDefaultScope( url3, url3, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_BLOCK); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); @@ -636,7 +639,7 @@ CONTENT_SETTING_BLOCK, auto_blocker->GetEmbargoResult(url4, ContentSettingsType::NOTIFICATIONS) .content_setting); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); @@ -650,7 +653,7 @@ // Check |url4| disappears from the list when its embargo expires. clock.Advance(base::TimeDelta::FromDays(8)); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); @@ -680,7 +683,7 @@ auto_blocker->GetEmbargoResult(url3, ContentSettingsType::NOTIFICATIONS) .content_setting); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); EXPECT_EQ("cr.webUIResponse", data.function_name()); @@ -709,7 +712,7 @@ auto_blocker->GetEmbargoResult(url5, ContentSettingsType::NOTIFICATIONS) .content_setting); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); EXPECT_EQ("cr.webUIResponse", data.function_name()); @@ -740,8 +743,8 @@ std::string kPreference = SiteSettingSourceToString(site_settings::SiteSettingSource::kPreference); - base::ListValue get_recent_permissions_args; - get_recent_permissions_args.AppendString(kCallbackId); + base::Value get_recent_permissions_args(base::Value::Type::LIST); + get_recent_permissions_args.Append(kCallbackId); get_recent_permissions_args.Append(3); // Configure prefs and auto blocker with a controllable clock. @@ -756,7 +759,8 @@ clock.Advance(base::TimeDelta::FromHours(1)); // Test recent permissions is empty when there are no preferences. - handler()->HandleGetRecentSitePermissions(&get_recent_permissions_args); + handler()->HandleGetRecentSitePermissions( + &base::Value::AsListValue(get_recent_permissions_args)); EXPECT_EQ(1U, web_ui()->call_data().size()); { @@ -792,7 +796,8 @@ incognito_auto_blocker->RecordDismissAndEmbargo( url1, ContentSettingsType::NOTIFICATIONS, false); - handler()->HandleGetRecentSitePermissions(&get_recent_permissions_args); + handler()->HandleGetRecentSitePermissions( + &base::Value::AsListValue(get_recent_permissions_args)); { const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); EXPECT_EQ("cr.webUIResponse", data.function_name()); @@ -963,20 +968,22 @@ CreateIncognitoProfile(); { - base::ListValue set_args; - set_args.AppendString(kOriginToBlock); // Primary pattern. - set_args.AppendString(std::string()); // Secondary pattern. - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(kOriginToBlock); // Primary pattern. + set_args.Append(std::string()); // Secondary pattern. + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_args.AppendBoolean(true); // Incognito. + set_args.Append(true); // Incognito. - handler()->HandleSetCategoryPermissionForPattern(&set_args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(set_args)); - base::ListValue get_exception_list_args; - get_exception_list_args.AppendString(kCallbackId); - get_exception_list_args.AppendString(kNotifications); - handler()->HandleGetExceptionList(&get_exception_list_args); + base::Value get_exception_list_args(base::Value::Type::LIST); + get_exception_list_args.Append(kCallbackId); + get_exception_list_args.Append(kNotifications); + handler()->HandleGetExceptionList( + &base::Value::AsListValue(get_exception_list_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); const base::ListValue* exceptions; @@ -991,20 +998,22 @@ } { - base::ListValue set_args; - set_args.AppendString(kOriginToBlock); // Primary pattern. - set_args.AppendString(std::string()); // Secondary pattern. - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(kOriginToBlock); // Primary pattern. + set_args.Append(std::string()); // Secondary pattern. + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_args.AppendBoolean(false); // Incognito. + set_args.Append(false); // Incognito. - handler()->HandleSetCategoryPermissionForPattern(&set_args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(set_args)); - base::ListValue get_exception_list_args; - get_exception_list_args.AppendString(kCallbackId); - get_exception_list_args.AppendString(kNotifications); - handler()->HandleGetExceptionList(&get_exception_list_args); + base::Value get_exception_list_args(base::Value::Type::LIST); + get_exception_list_args.Append(kCallbackId); + get_exception_list_args.Append(kNotifications); + handler()->HandleGetExceptionList( + &base::Value::AsListValue(get_exception_list_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); const base::ListValue* exceptions; @@ -1031,15 +1040,16 @@ // Add and test 1 blocked origin { - base::ListValue set_args; - set_args.AppendString(kOriginToBlock); // Primary pattern. - set_args.AppendString(std::string()); // Secondary pattern. - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(kOriginToBlock); // Primary pattern. + set_args.Append(std::string()); // Secondary pattern. + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_args.AppendBoolean(false); // Incognito. + set_args.Append(false); // Incognito. - handler()->HandleSetCategoryPermissionForPattern(&set_args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(set_args)); ASSERT_EQ(1U, web_ui()->call_data().size()); } @@ -1073,12 +1083,13 @@ { // Reset blocked origin. - base::ListValue reset_args; - reset_args.AppendString(kOriginToBlock); - reset_args.AppendString(std::string()); - reset_args.AppendString(kNotifications); - reset_args.AppendBoolean(false); // Incognito. - handler()->HandleResetCategoryPermissionForPattern(&reset_args); + base::Value reset_args(base::Value::Type::LIST); + reset_args.Append(kOriginToBlock); + reset_args.Append(std::string()); + reset_args.Append(kNotifications); + reset_args.Append(false); // Incognito. + handler()->HandleResetCategoryPermissionForPattern( + &base::Value::AsListValue(reset_args)); // Check there is 1 blocked origin. base::ListValue exceptions; @@ -1091,12 +1102,13 @@ { // Reset embargoed origin. - base::ListValue reset_args; - reset_args.AppendString(kOriginToEmbargo); - reset_args.AppendString(std::string()); - reset_args.AppendString(kNotifications); - reset_args.AppendBoolean(false); // Incognito. - handler()->HandleResetCategoryPermissionForPattern(&reset_args); + base::Value reset_args(base::Value::Type::LIST); + reset_args.Append(kOriginToEmbargo); + reset_args.Append(std::string()); + reset_args.Append(kNotifications); + reset_args.Append(false); // Incognito. + handler()->HandleResetCategoryPermissionForPattern( + &base::Value::AsListValue(reset_args)); // Check that there are no blocked or embargoed origins. base::ListValue exceptions; @@ -1114,25 +1126,27 @@ EXPECT_FALSE(url.is_valid()); EXPECT_TRUE(url.is_empty()); - base::ListValue set_args; - set_args.AppendString(kInvalidOrigin); // Primary pattern. - set_args.AppendString(std::string()); // Secondary pattern. - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(kInvalidOrigin); // Primary pattern. + set_args.Append(std::string()); // Secondary pattern. + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_args.AppendBoolean(false); // Incognito. + set_args.Append(false); // Incognito. - handler()->HandleSetCategoryPermissionForPattern(&set_args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(set_args)); ASSERT_EQ(1U, web_ui()->call_data().size()); // Reset blocked origin. - base::ListValue reset_args; - reset_args.AppendString(kInvalidOrigin); - reset_args.AppendString(std::string()); - reset_args.AppendString(kNotifications); - reset_args.AppendBoolean(false); // Incognito. + base::Value reset_args(base::Value::Type::LIST); + reset_args.Append(kInvalidOrigin); + reset_args.Append(std::string()); + reset_args.Append(kNotifications); + reset_args.Append(false); // Incognito. // Check that this method is not crashing for an invalid origin. - handler()->HandleResetCategoryPermissionForPattern(&reset_args); + handler()->HandleResetCategoryPermissionForPattern( + &base::Value::AsListValue(reset_args)); } TEST_F(SiteSettingsHandlerTest, Origins) { @@ -1141,15 +1155,16 @@ { // Test the JS -> C++ -> JS callback path for configuring origins, by // setting Google.com to blocked. - base::ListValue set_args; - set_args.AppendString(google); // Primary pattern. - set_args.AppendString(std::string()); // Secondary pattern. - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(google); // Primary pattern. + set_args.Append(std::string()); // Secondary pattern. + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_args.AppendBoolean(false); // Incognito. + set_args.Append(false); // Incognito. base::HistogramTester histograms; - handler()->HandleSetCategoryPermissionForPattern(&set_args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(set_args)); EXPECT_EQ(1U, web_ui()->call_data().size()); histograms.ExpectTotalCount(uma_base, 1); histograms.ExpectTotalCount(uma_base + ".Allowed", 0); @@ -1158,22 +1173,24 @@ histograms.ExpectTotalCount(uma_base + ".SessionOnly", 0); } - base::ListValue get_exception_list_args; - get_exception_list_args.AppendString(kCallbackId); - get_exception_list_args.AppendString(kNotifications); - handler()->HandleGetExceptionList(&get_exception_list_args); + base::Value get_exception_list_args(base::Value::Type::LIST); + get_exception_list_args.Append(kCallbackId); + get_exception_list_args.Append(kNotifications); + handler()->HandleGetExceptionList( + &base::Value::AsListValue(get_exception_list_args)); ValidateOrigin(google, "", google, CONTENT_SETTING_BLOCK, site_settings::SiteSettingSource::kPreference, 2U); { // Reset things back to how they were. - base::ListValue reset_args; - reset_args.AppendString(google); - reset_args.AppendString(std::string()); - reset_args.AppendString(kNotifications); - reset_args.AppendBoolean(false); // Incognito. + base::Value reset_args(base::Value::Type::LIST); + reset_args.Append(google); + reset_args.Append(std::string()); + reset_args.Append(kNotifications); + reset_args.Append(false); // Incognito. base::HistogramTester histograms; - handler()->HandleResetCategoryPermissionForPattern(&reset_args); + handler()->HandleResetCategoryPermissionForPattern( + &base::Value::AsListValue(reset_args)); EXPECT_EQ(3U, web_ui()->call_data().size()); histograms.ExpectTotalCount(uma_base, 1); histograms.ExpectTotalCount(uma_base + ".Allowed", 0); @@ -1182,7 +1199,8 @@ } // Verify the reset was successful. - handler()->HandleGetExceptionList(&get_exception_list_args); + handler()->HandleGetExceptionList( + &base::Value::AsListValue(get_exception_list_args)); ValidateNoOrigin(4U); } @@ -1198,27 +1216,27 @@ origin_queried_waiter.QuitClosure()); { - base::ListValue set_notification_origin_args; - set_notification_origin_args.AppendString(google); - set_notification_origin_args.AppendString(""); - set_notification_origin_args.AppendString(kNotifications); - set_notification_origin_args.AppendString( + base::Value set_notification_origin_args(base::Value::Type::LIST); + set_notification_origin_args.Append(google); + set_notification_origin_args.Append(""); + set_notification_origin_args.Append(kNotifications); + set_notification_origin_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW)); - set_notification_origin_args.AppendBoolean(false /* incognito */); + set_notification_origin_args.Append(false /* incognito */); handler()->HandleSetCategoryPermissionForPattern( - &set_notification_origin_args); + &base::Value::AsListValue(set_notification_origin_args)); } { - base::ListValue set_notification_origin_args; - set_notification_origin_args.AppendString(google); - set_notification_origin_args.AppendString(""); - set_notification_origin_args.AppendString(kNotifications); - set_notification_origin_args.AppendString( + base::Value set_notification_origin_args(base::Value::Type::LIST); + set_notification_origin_args.Append(google); + set_notification_origin_args.Append(""); + set_notification_origin_args.Append(kNotifications); + set_notification_origin_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_notification_origin_args.AppendBoolean(false /* incognito */); + set_notification_origin_args.Append(false /* incognito */); handler()->HandleSetCategoryPermissionForPattern( - &set_notification_origin_args); + &base::Value::AsListValue(set_notification_origin_args)); } origin_queried_waiter.Run(); @@ -1254,59 +1272,65 @@ ContentSettingSourceSetter source_setter(profile(), ContentSettingsType::NOTIFICATIONS); - base::ListValue get_origin_permissions_args; - get_origin_permissions_args.AppendString(kCallbackId); - get_origin_permissions_args.AppendString(google); - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value get_origin_permissions_args(base::Value::Type::LIST); + get_origin_permissions_args.Append(kCallbackId); + get_origin_permissions_args.Append(google); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); get_origin_permissions_args.Append(std::move(category_list)); // Test Chrome built-in defaults are marked as default. - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_ASK, site_settings::SiteSettingSource::kDefault, 1U); - base::ListValue default_value_args; - default_value_args.AppendString(kNotifications); - default_value_args.AppendString( + base::Value default_value_args(base::Value::Type::LIST); + default_value_args.Append(kNotifications); + default_value_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - handler()->HandleSetDefaultValueForContentType(&default_value_args); + handler()->HandleSetDefaultValueForContentType( + &base::Value::AsListValue(default_value_args)); // A user-set global default should also show up as default. - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_BLOCK, site_settings::SiteSettingSource::kDefault, 3U); - base::ListValue set_notification_pattern_args; - set_notification_pattern_args.AppendString("[*.]google.com"); - set_notification_pattern_args.AppendString(""); - set_notification_pattern_args.AppendString(kNotifications); - set_notification_pattern_args.AppendString( + base::Value set_notification_pattern_args(base::Value::Type::LIST); + set_notification_pattern_args.Append("[*.]google.com"); + set_notification_pattern_args.Append(""); + set_notification_pattern_args.Append(kNotifications); + set_notification_pattern_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW)); - set_notification_pattern_args.AppendBoolean(false); + set_notification_pattern_args.Append(false); handler()->HandleSetCategoryPermissionForPattern( - &set_notification_pattern_args); + &base::Value::AsListValue(set_notification_pattern_args)); // A user-set pattern should not show up as default. - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_ALLOW, site_settings::SiteSettingSource::kPreference, 5U); - base::ListValue set_notification_origin_args; - set_notification_origin_args.AppendString(google); - set_notification_origin_args.AppendString(""); - set_notification_origin_args.AppendString(kNotifications); - set_notification_origin_args.AppendString( + base::Value set_notification_origin_args(base::Value::Type::LIST); + set_notification_origin_args.Append(google); + set_notification_origin_args.Append(""); + set_notification_origin_args.Append(kNotifications); + set_notification_origin_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - set_notification_origin_args.AppendBoolean(false); + set_notification_origin_args.Append(false); handler()->HandleSetCategoryPermissionForPattern( - &set_notification_origin_args); + &base::Value::AsListValue(set_notification_origin_args)); // A user-set per-origin permission should not show up as default. - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_BLOCK, site_settings::SiteSettingSource::kPreference, 7U); // Enterprise-policy set defaults should not show up as default. source_setter.SetPolicyDefault(CONTENT_SETTING_ALLOW); - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_ALLOW, site_settings::SiteSettingSource::kPolicy, 8U); } @@ -1315,40 +1339,40 @@ const std::string origin_with_port("https://www.example.com:443"); // The display name won't show the port if it's default for that scheme. const std::string origin("www.example.com"); - base::ListValue get_args; - get_args.AppendString(kCallbackId); - get_args.AppendString(origin_with_port); + base::Value get_args(base::Value::Type::LIST); + get_args.Append(kCallbackId); + get_args.Append(origin_with_port); { - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); get_args.Append(std::move(category_list)); } - handler()->HandleGetOriginPermissions(&get_args); + handler()->HandleGetOriginPermissions(&base::Value::AsListValue(get_args)); ValidateOrigin(origin_with_port, origin_with_port, origin, CONTENT_SETTING_ASK, site_settings::SiteSettingSource::kDefault, 1U); // Block notifications. - base::ListValue set_args; - set_args.AppendString(origin_with_port); - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(origin_with_port); + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - handler()->HandleSetOriginPermissions(&set_args); + handler()->HandleSetOriginPermissions(&base::Value::AsListValue(set_args)); EXPECT_EQ(2U, web_ui()->call_data().size()); // Reset things back to how they were. - base::ListValue reset_args; - reset_args.AppendString(origin_with_port); - reset_args.AppendString(std::move(kNotifications)); - reset_args.AppendString( + base::Value reset_args(base::Value::Type::LIST); + reset_args.Append(origin_with_port); + reset_args.Append(std::move(kNotifications)); + reset_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_DEFAULT)); - handler()->HandleSetOriginPermissions(&reset_args); + handler()->HandleSetOriginPermissions(&base::Value::AsListValue(reset_args)); EXPECT_EQ(3U, web_ui()->call_data().size()); // Verify the reset was successful. - handler()->HandleGetOriginPermissions(&get_args); + handler()->HandleGetOriginPermissions(&base::Value::AsListValue(get_args)); ValidateOrigin(origin_with_port, origin_with_port, origin, CONTENT_SETTING_ASK, site_settings::SiteSettingSource::kDefault, 4U); @@ -1357,15 +1381,15 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetForInvalidURLs) { const std::string origin("arbitrary string"); EXPECT_FALSE(GURL(origin).is_valid()); - base::ListValue get_args; - get_args.AppendString(kCallbackId); - get_args.AppendString(origin); + base::Value get_args(base::Value::Type::LIST); + get_args.Append(kCallbackId); + get_args.Append(origin); { - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); get_args.Append(std::move(category_list)); } - handler()->HandleGetOriginPermissions(&get_args); + handler()->HandleGetOriginPermissions(&base::Value::AsListValue(get_args)); // Verify that it'll return CONTENT_SETTING_BLOCK as |origin| is not a secure // context, a requirement for notifications. Note that the display string // will be blank since it's an invalid URL. @@ -1373,19 +1397,19 @@ site_settings::SiteSettingSource::kInsecureOrigin, 1U); // Make sure setting a permission on an invalid origin doesn't crash. - base::ListValue set_args; - set_args.AppendString(origin); + base::Value set_args(base::Value::Type::LIST); + set_args.Append(origin); { - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); set_args.Append(std::move(category_list)); } - set_args.AppendString( + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW)); - handler()->HandleSetOriginPermissions(&set_args); + handler()->HandleSetOriginPermissions(&base::Value::AsListValue(set_args)); // Also make sure the content setting for |origin| wasn't actually changed. - handler()->HandleGetOriginPermissions(&get_args); + handler()->HandleGetOriginPermissions(&base::Value::AsListValue(get_args)); ValidateOrigin(origin, origin, "", CONTENT_SETTING_BLOCK, site_settings::SiteSettingSource::kInsecureOrigin, 2U); } @@ -1411,16 +1435,17 @@ CHECK(exception->GetString(site_settings::kSetting, &type)); CHECK(exception->GetBoolean(site_settings::kIncognito, &incognito)); - base::ListValue args; - args.AppendString(primary_pattern); - args.AppendString(secondary_pattern); - args.AppendString(kNotifications); // Chosen arbitrarily. - args.AppendString(type); - args.AppendBoolean(incognito); + base::Value args(base::Value::Type::LIST); + args.Append(primary_pattern); + args.Append(secondary_pattern); + args.Append(kNotifications); // Chosen arbitrarily. + args.Append(type); + args.Append(incognito); // We don't need to check the results. This is just to make sure it doesn't // crash on the input. - handler()->HandleSetCategoryPermissionForPattern(&args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(args)); scoped_refptr<const extensions::Extension> extension; extension = extensions::ExtensionBuilder() @@ -1446,7 +1471,8 @@ CHECK(dictionary->GetBoolean(site_settings::kIncognito, &incognito)); // Again, don't need to check the results. - handler()->HandleSetCategoryPermissionForPattern(&args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(args)); } TEST_F(SiteSettingsHandlerTest, ExtensionDisplayName) { @@ -1464,15 +1490,16 @@ .Build(); extension_registry->AddEnabled(extension); - base::ListValue get_origin_permissions_args; - get_origin_permissions_args.AppendString(kCallbackId); - get_origin_permissions_args.AppendString(test_extension_url); + base::Value get_origin_permissions_args(base::Value::Type::LIST); + get_origin_permissions_args.Append(kCallbackId); + get_origin_permissions_args.Append(test_extension_url); { - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); get_origin_permissions_args.Append(std::move(category_list)); } - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); ValidateOrigin(test_extension_url, test_extension_url, kExtensionName, CONTENT_SETTING_ASK, site_settings::SiteSettingSource::kDefault, 1U); @@ -1481,11 +1508,11 @@ TEST_F(SiteSettingsHandlerTest, PatternsAndContentType) { unsigned counter = 1; for (const auto& test_case : kPatternsAndContentTypeTestCases) { - base::ListValue args; - args.AppendString(kCallbackId); - args.AppendString(test_case.arguments.pattern); - args.AppendString(test_case.arguments.content_type); - handler()->HandleIsPatternValidForType(&args); + base::Value args(base::Value::Type::LIST); + args.Append(kCallbackId); + args.Append(test_case.arguments.pattern); + args.Append(test_case.arguments.content_type); + handler()->HandleIsPatternValidForType(&base::Value::AsListValue(args)); ValidatePattern(test_case.expected.validity, counter, test_case.expected.reason); ++counter; @@ -1493,8 +1520,8 @@ } TEST_F(SiteSettingsHandlerTest, Incognito) { - base::ListValue args; - handler()->HandleUpdateIncognitoStatus(&args); + base::Value args(base::Value::Type::LIST); + handler()->HandleUpdateIncognitoStatus(&base::Value::AsListValue(args)); ValidateIncognitoExists(false, 1U); CreateIncognitoProfile(); @@ -1513,12 +1540,12 @@ host_zoom_map->SetZoomLevelForHost(host, zoom_level); ValidateZoom(host, "122%", 1U); - base::ListValue args; - handler()->HandleFetchZoomLevels(&args); + base::Value args(base::Value::Type::LIST); + handler()->HandleFetchZoomLevels(&base::Value::AsListValue(args)); ValidateZoom(host, "122%", 2U); - args.AppendString("http://www.google.com"); - handler()->HandleRemoveZoomLevel(&args); + args.Append("http://www.google.com"); + handler()->HandleRemoveZoomLevel(&base::Value::AsListValue(args)); ValidateZoom("", "", 3U); double default_level = host_zoom_map->GetDefaultZoomLevel(); @@ -1660,12 +1687,12 @@ } // Block notifications. - base::ListValue set_args; - set_args.AppendString(origin_anchor_string); - set_args.AppendString(kNotifications); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(origin_anchor_string); + set_args.Append(kNotifications); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); - handler()->HandleSetOriginPermissions(&set_args); + handler()->HandleSetOriginPermissions(&base::Value::AsListValue(set_args)); // Make sure all tabs belonging to the same origin as |origin_anchor| have an // infobar shown. @@ -1714,14 +1741,14 @@ NavigateAndCommit(origin_query_controller, example_without_www); // Reset all permissions. - base::ListValue reset_args; - reset_args.AppendString(origin_anchor_string); - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value reset_args(base::Value::Type::LIST); + reset_args.Append(origin_anchor_string); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); reset_args.Append(std::move(category_list)); - reset_args.AppendString( + reset_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_DEFAULT)); - handler()->HandleSetOriginPermissions(&reset_args); + handler()->HandleSetOriginPermissions(&base::Value::AsListValue(reset_args)); // Check the same tabs (plus the tab navigated to |origin_path|) still have // infobars showing. @@ -1757,15 +1784,16 @@ TEST_F(SiteSettingsHandlerTest, SessionOnlyException) { const std::string google_with_port("https://www.google.com:443"); const std::string uma_base("WebsiteSettings.Menu.PermissionChanged"); - base::ListValue set_args; - set_args.AppendString(google_with_port); // Primary pattern. - set_args.AppendString(std::string()); // Secondary pattern. - set_args.AppendString(kCookies); - set_args.AppendString( + base::Value set_args(base::Value::Type::LIST); + set_args.Append(google_with_port); // Primary pattern. + set_args.Append(std::string()); // Secondary pattern. + set_args.Append(kCookies); + set_args.Append( content_settings::ContentSettingToString(CONTENT_SETTING_SESSION_ONLY)); - set_args.AppendBoolean(false); // Incognito. + set_args.Append(false); // Incognito. base::HistogramTester histograms; - handler()->HandleSetCategoryPermissionForPattern(&set_args); + handler()->HandleSetCategoryPermissionForPattern( + &base::Value::AsListValue(set_args)); EXPECT_EQ(kNumberContentSettingListeners, web_ui()->call_data().size()); histograms.ExpectTotalCount(uma_base, 1); @@ -1773,8 +1801,8 @@ } TEST_F(SiteSettingsHandlerTest, BlockAutoplay_SendOnRequest) { - base::ListValue args; - handler()->HandleFetchBlockAutoplayStatus(&args); + base::Value args(base::Value::Type::LIST); + handler()->HandleFetchBlockAutoplayStatus(&base::Value::AsListValue(args)); // Check that we are checked and enabled. ValidateBlockAutoplay(true, true); @@ -1811,10 +1839,10 @@ TEST_F(SiteSettingsHandlerTest, BlockAutoplay_Update) { EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled)); - base::ListValue data; - data.AppendBoolean(false); + base::Value data(base::Value::Type::LIST); + data.Append(false); - handler()->HandleSetBlockAutoplayEnabled(&data); + handler()->HandleSetBlockAutoplayEnabled(&base::Value::AsListValue(data)); EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled)); } @@ -1852,10 +1880,10 @@ // GetAllSites() only returns website exceptions. { - base::ListValue get_all_sites_args; - get_all_sites_args.AppendString(kCallbackId); + base::Value get_all_sites_args(base::Value::Type::LIST); + get_all_sites_args.Append(kCallbackId); - handler()->HandleGetAllSites(&get_all_sites_args); + handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); base::Value::ConstListView site_groups = data.arg3()->GetList(); @@ -1872,11 +1900,12 @@ // GetExceptionList() only returns website exceptions. { - base::ListValue get_exception_list_args; - get_exception_list_args.AppendString(kCallbackId); - get_exception_list_args.AppendString(kNotifications); + base::Value get_exception_list_args(base::Value::Type::LIST); + get_exception_list_args.Append(kCallbackId); + get_exception_list_args.Append(kNotifications); - handler()->HandleGetExceptionList(&get_exception_list_args); + handler()->HandleGetExceptionList( + &base::Value::AsListValue(get_exception_list_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); base::Value::ConstListView exception_list = data.arg3()->GetList(); @@ -1887,11 +1916,12 @@ // GetRecentSitePermissions() only returns website exceptions. { - base::ListValue get_recent_permissions_args; - get_recent_permissions_args.AppendString(kCallbackId); + base::Value get_recent_permissions_args(base::Value::Type::LIST); + get_recent_permissions_args.Append(kCallbackId); get_recent_permissions_args.Append(3); - handler()->HandleGetRecentSitePermissions(&get_recent_permissions_args); + handler()->HandleGetRecentSitePermissions( + &base::Value::AsListValue(get_recent_permissions_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); base::Value::ConstListView recent_permission_list = data.arg3()->GetList(); @@ -1920,14 +1950,15 @@ allowlist->RegisterAutoGrantedPermission(origin, content_settings_type); for (const url::Origin& origin : kWebUIOrigins) { - base::ListValue get_origin_permissions_args; - get_origin_permissions_args.AppendString(kCallbackId); - get_origin_permissions_args.AppendString(origin.GetURL().spec()); - auto category_list = std::make_unique<base::ListValue>(); - category_list->AppendString(kNotifications); + base::Value get_origin_permissions_args(base::Value::Type::LIST); + get_origin_permissions_args.Append(kCallbackId); + get_origin_permissions_args.Append(origin.GetURL().spec()); + base::Value category_list(base::Value::Type::LIST); + category_list.Append(kNotifications); get_origin_permissions_args.Append(std::move(category_list)); - handler()->HandleGetOriginPermissions(&get_origin_permissions_args); + handler()->HandleGetOriginPermissions( + &base::Value::AsListValue(get_origin_permissions_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); const base::Value::ConstListView exception_list = data.arg3()->GetList(); EXPECT_EQ(1UL, exception_list.size()); @@ -2072,11 +2103,11 @@ // and return the exception list received by the WebUI. void ValidateChooserExceptionList(const std::string& chooser_type, size_t expected_total_calls) { - base::ListValue args; - args.AppendString(kCallbackId); - args.AppendString(chooser_type); + base::Value args(base::Value::Type::LIST); + args.Append(kCallbackId); + args.Append(chooser_type); - handler()->HandleGetChooserExceptionList(&args); + handler()->HandleGetChooserExceptionList(&base::Value::AsListValue(args)); EXPECT_EQ(web_ui()->call_data().size(), expected_total_calls); @@ -2227,19 +2258,19 @@ // User granted USB permissions for devices also containing policy permissions // should be able to be reset without removing the chooser exception object // from the list. - base::ListValue args; - args.AppendString(kUsbChooserGroupName); - args.AppendString("https://unused.com"); - args.AppendString(kGoogleOriginStr); - args.Append(base::Value::ToUniquePtrValue( - UsbChooserContext::DeviceInfoToValue(*persistent_device_info_))); + base::Value args(base::Value::Type::LIST); + args.Append(kUsbChooserGroupName); + args.Append("https://unused.com"); + args.Append(kGoogleOriginStr); + args.Append(UsbChooserContext::DeviceInfoToValue(*persistent_device_info_)); EXPECT_CALL(observer_, OnObjectPermissionChanged(absl::optional<ContentSettingsType>( ContentSettingsType::USB_GUARD), ContentSettingsType::USB_CHOOSER_DATA)); EXPECT_CALL(observer_, OnPermissionRevoked(kGoogleOrigin)); - handler()->HandleResetChooserExceptionForSite(&args); + handler()->HandleResetChooserExceptionForSite( + &base::Value::AsListValue(args)); auto* chooser_context = UsbChooserContextFactory::GetForProfile(profile()); chooser_context->FlushScheduledSaveSettingsCalls(); @@ -2262,12 +2293,11 @@ // User granted USB permissions that are also granted by policy should not // be able to be reset. - args.Clear(); - args.AppendString(kUsbChooserGroupName); - args.AppendString("https://unused.com"); - args.AppendString(kChromiumOriginStr); - args.Append(base::Value::ToUniquePtrValue( - UsbChooserContext::DeviceInfoToValue(*persistent_device_info_))); + args.ClearList(); + args.Append(kUsbChooserGroupName); + args.Append("https://unused.com"); + args.Append(kChromiumOriginStr); + args.Append(UsbChooserContext::DeviceInfoToValue(*persistent_device_info_)); { const base::Value& exceptions = @@ -2288,7 +2318,8 @@ ContentSettingsType::USB_GUARD), ContentSettingsType::USB_CHOOSER_DATA)); EXPECT_CALL(observer_, OnPermissionRevoked(kChromiumOrigin)); - handler()->HandleResetChooserExceptionForSite(&args); + handler()->HandleResetChooserExceptionForSite( + &base::Value::AsListValue(args)); chooser_context->FlushScheduledSaveSettingsCalls(); // The HandleResetChooserExceptionForSite() method should have also caused the @@ -2315,12 +2346,11 @@ // User granted USB permissions that are not covered by policy should be able // to be reset and the chooser exception entry should be removed from the list // when the exception only has one site exception granted to it.. - args.Clear(); - args.AppendString(kUsbChooserGroupName); - args.AppendString("https://unused.com"); - args.AppendString(kAndroidOriginStr); - args.Append(base::Value::ToUniquePtrValue( - UsbChooserContext::DeviceInfoToValue(*user_granted_device_info_))); + args.ClearList(); + args.Append(kUsbChooserGroupName); + args.Append("https://unused.com"); + args.Append(kAndroidOriginStr); + args.Append(UsbChooserContext::DeviceInfoToValue(*user_granted_device_info_)); { const base::Value& exceptions = @@ -2335,7 +2365,8 @@ ContentSettingsType::USB_GUARD), ContentSettingsType::USB_CHOOSER_DATA)); EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin)); - handler()->HandleResetChooserExceptionForSite(&args); + handler()->HandleResetChooserExceptionForSite( + &base::Value::AsListValue(args)); chooser_context->FlushScheduledSaveSettingsCalls(); // The HandleResetChooserExceptionForSite() method should have also caused the @@ -2365,9 +2396,10 @@ ASSERT_TRUE(site_group->GetString("etldPlus1", &etld_plus1_string)); ASSERT_EQ("example.com", etld_plus1_string); - base::ListValue args; - args.AppendString("example.com"); - handler()->HandleClearEtldPlus1DataAndCookies(&args); + base::Value args(base::Value::Type::LIST); + args.Append("example.com"); + handler()->HandleClearEtldPlus1DataAndCookies( + &base::Value::AsListValue(args)); EXPECT_EQ(11, handler()->cookies_tree_model_->GetRoot()->GetTotalNodeCount()); storage_and_cookie_list = GetOnStorageFetchedSentListValue(); @@ -2376,10 +2408,11 @@ ASSERT_TRUE(site_group->GetString("etldPlus1", &etld_plus1_string)); ASSERT_EQ("google.com", etld_plus1_string); - args.Clear(); - args.AppendString("google.com"); + args.ClearList(); + args.Append("google.com"); - handler()->HandleClearEtldPlus1DataAndCookies(&args); + handler()->HandleClearEtldPlus1DataAndCookies( + &base::Value::AsListValue(args)); EXPECT_EQ(4, handler()->cookies_tree_model_->GetRoot()->GetTotalNodeCount()); @@ -2389,10 +2422,11 @@ ASSERT_TRUE(site_group->GetString("etldPlus1", &etld_plus1_string)); ASSERT_EQ("google.com.au", etld_plus1_string); - args.Clear(); - args.AppendString("google.com.au"); + args.ClearList(); + args.Append("google.com.au"); - handler()->HandleClearEtldPlus1DataAndCookies(&args); + handler()->HandleClearEtldPlus1DataAndCookies( + &base::Value::AsListValue(args)); EXPECT_EQ(1, handler()->cookies_tree_model_->GetRoot()->GetTotalNodeCount()); @@ -2425,9 +2459,10 @@ web_ui()->ClearTrackedCalls(); // Validate get method works. - base::ListValue get_args; - get_args.AppendString(kCallbackId); - handler()->HandleGetCookieSettingDescription(&get_args); + base::Value get_args(base::Value::Type::LIST); + get_args.Append(kCallbackId); + handler()->HandleGetCookieSettingDescription( + &base::Value::AsListValue(get_args)); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); EXPECT_EQ("cr.webUIResponse", data.function_name()); @@ -2496,10 +2531,10 @@ TEST_F(SiteSettingsHandlerTest, HandleGetFormattedBytes) { const double size = 120000000000; - base::ListValue get_args; - get_args.AppendString(kCallbackId); + base::Value get_args(base::Value::Type::LIST); + get_args.Append(kCallbackId); get_args.Append(size); - handler()->HandleGetFormattedBytes(&get_args); + handler()->HandleGetFormattedBytes(&base::Value::AsListValue(get_args)); // Validate that this method can handle large data. const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
diff --git a/chrome/browser/usb/usb_chooser_controller.cc b/chrome/browser/usb/usb_chooser_controller.cc index 7513c01..70b9936 100644 --- a/chrome/browser/usb/usb_chooser_controller.cc +++ b/chrome/browser/usb/usb_chooser_controller.cc
@@ -90,10 +90,10 @@ RenderFrameHost* render_frame_host, std::vector<device::mojom::UsbDeviceFilterPtr> device_filters, blink::mojom::WebUsbService::GetPermissionCallback callback) - : ChooserController( - CreateChooserTitle(render_frame_host, - IDS_USB_DEVICE_CHOOSER_PROMPT_ORIGIN, - IDS_USB_DEVICE_CHOOSER_PROMPT_EXTENSION_NAME)), + : ChooserController(CreateExtensionAwareChooserTitle( + render_frame_host, + IDS_USB_DEVICE_CHOOSER_PROMPT_ORIGIN, + IDS_USB_DEVICE_CHOOSER_PROMPT_EXTENSION_NAME)), filters_(std::move(device_filters)), callback_(std::move(callback)), requesting_frame_(render_frame_host) {
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 9ee3b6a..6b3aef5 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -341,11 +341,11 @@ std::unique_ptr<APIPermission> permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("tcp-connect:*.example.com:80"); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("tcp-connect:*.example.com:80"); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } // Union with an empty set. @@ -386,10 +386,10 @@ permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("tcp-connect:*.example.com:80"); - value->AppendString("udp-send-to::8899"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("tcp-connect:*.example.com:80"); + value.Append("udp-send-to::8899"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } apis2.insert(std::move(permission)); @@ -399,12 +399,12 @@ permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("tcp-connect:*.example.com:80"); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - value->AppendString("udp-send-to::8899"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("tcp-connect:*.example.com:80"); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + value.Append("udp-send-to::8899"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } // Insert a new permission socket permisssion which will replace the old one. expected_apis.insert(std::move(permission)); @@ -465,11 +465,11 @@ std::unique_ptr<APIPermission> permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("tcp-connect:*.example.com:80"); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("tcp-connect:*.example.com:80"); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } apis1.insert(std::move(permission)); @@ -502,21 +502,21 @@ apis2.insert(APIPermissionID::kClipboardWrite); permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - value->AppendString("udp-send-to::8899"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + value.Append("udp-send-to::8899"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } apis2.insert(std::move(permission)); expected_apis.insert(APIPermissionID::kTab); permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } expected_apis.insert(std::move(permission)); @@ -576,11 +576,11 @@ std::unique_ptr<APIPermission> permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("tcp-connect:*.example.com:80"); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("tcp-connect:*.example.com:80"); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } apis1.insert(std::move(permission)); @@ -602,20 +602,20 @@ apis2.insert(APIPermissionID::kClipboardWrite); permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("tcp-connect:*.example.com:80"); - value->AppendString("udp-send-to::8899"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("tcp-connect:*.example.com:80"); + value.Append("udp-send-to::8899"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } apis2.insert(std::move(permission)); expected_apis.insert(APIPermissionID::kBackground); permission = permission_info->CreateAPIPermission(); { - std::unique_ptr<base::ListValue> value(new base::ListValue()); - value->AppendString("udp-bind::8080"); - value->AppendString("udp-send-to::8888"); - ASSERT_TRUE(permission->FromValue(value.get(), nullptr, nullptr)); + base::Value value(base::Value::Type::LIST); + value.Append("udp-bind::8080"); + value.Append("udp-send-to::8888"); + ASSERT_TRUE(permission->FromValue(&value, nullptr, nullptr)); } expected_apis.insert(std::move(permission));
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc index 337b625..d897dd98 100644 --- a/chrome/installer/util/shell_util.cc +++ b/chrome/installer/util/shell_util.cc
@@ -1662,7 +1662,7 @@ ShellUtil::ShortcutProperties::ShortcutProperties( const ShortcutProperties& other) = default; -ShellUtil::ShortcutProperties::~ShortcutProperties() {} +ShellUtil::ShortcutProperties::~ShortcutProperties() = default; ShellUtil::ApplicationInfo::ApplicationInfo() = default;
diff --git a/chrome/installer/util/shell_util.h b/chrome/installer/util/shell_util.h index e78976b9..5a7bb0a3 100644 --- a/chrome/installer/util/shell_util.h +++ b/chrome/installer/util/shell_util.h
@@ -24,7 +24,6 @@ #include "base/check.h" #include "base/containers/flat_map.h" #include "base/files/file_path.h" -#include "base/macros.h" #include "base/memory/ref_counted.h" #include "chrome/installer/util/work_item_list.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -361,6 +360,9 @@ // Registry value name for the OpenWithProgids entry for file associations. static const wchar_t* kRegOpenWithProgids; + ShellUtil(const ShellUtil&) = delete; + ShellUtil& operator=(const ShellUtil&) = delete; + // Returns true if |chrome_exe| is registered in HKLM with |suffix|. // Note: This only checks one deterministic key in HKLM for |chrome_exe| and // doesn't otherwise validate a full Chrome install in HKLM. @@ -846,9 +848,6 @@ HKEY root, const std::vector<std::unique_ptr<RegistryEntry>>& entries, bool best_effort_no_rollback = false); - - private: - DISALLOW_COPY_AND_ASSIGN(ShellUtil); }; #endif // CHROME_INSTALLER_UTIL_SHELL_UTIL_H_
diff --git a/chrome/installer/util/shell_util_unittest.cc b/chrome/installer/util/shell_util_unittest.cc index 3627841..c905716 100644 --- a/chrome/installer/util/shell_util_unittest.cc +++ b/chrome/installer/util/shell_util_unittest.cc
@@ -1066,7 +1066,9 @@ class ShellUtilRegistryTest : public testing::Test { public: - ShellUtilRegistryTest() {} + ShellUtilRegistryTest() = default; + ShellUtilRegistryTest(const ShellUtilRegistryTest&) = delete; + ShellUtilRegistryTest& operator=(const ShellUtilRegistryTest&) = delete; protected: void SetUp() override { @@ -1103,8 +1105,6 @@ registry_util::RegistryOverrideManager registry_overrides_; base::ScopedTempDir temp_dir_; base::FilePath chrome_exe_; - - DISALLOW_COPY_AND_ASSIGN(ShellUtilRegistryTest); }; TEST_F(ShellUtilRegistryTest, AddFileAssociations) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index c5b2a5b7..812402c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5657,7 +5657,6 @@ "../browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller_unittest.cc", "../browser/ui/passwords/bubble_controllers/post_save_compromised_bubble_controller_unittest.cc", "../browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller_unittest.cc", - "../browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc", "../browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller_unittest.cc", "../browser/ui/passwords/bubble_controllers/sign_in_promo_bubble_controller_unittest.cc", "../browser/ui/passwords/credential_leak_dialog_controller_impl_unittest.cc", @@ -7247,7 +7246,6 @@ "../browser/ui/views/confirm_bubble_views_unittest.cc", "../browser/ui/views/content_setting_bubble_contents_unittest.cc", "../browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc", - "../browser/ui/views/desktop_capture/get_current_browsing_context_media_dialog_unittest.cc", "../browser/ui/views/device_chooser_content_view_unittest.cc", "../browser/ui/views/download/download_in_progress_dialog_view_unittest.cc", "../browser/ui/views/download/download_shelf_view_unittest.cc",
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc index a3285683..16f40e6 100644 --- a/chrome/test/base/testing_browser_process.cc +++ b/chrome/test/base/testing_browser_process.cc
@@ -40,6 +40,7 @@ #include "extensions/buildflags/buildflags.h" #include "media/media_buildflags.h" #include "printing/buildflags/buildflags.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/test/test_network_connection_tracker.h" #include "services/network/test/test_network_quality_tracker.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/test/data/navigation_interception/navigation_from_prerender.html b/chrome/test/data/navigation_interception/navigation_from_prerender.html new file mode 100644 index 0000000..227f9f4b --- /dev/null +++ b/chrome/test/data/navigation_interception/navigation_from_prerender.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> +<!-- + +Copyright (c) 2021 The Chromium Authors. All rights reserved. +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. + +--> +<head> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <style> + </style> + <script type="speculationrules"> + { + "prerender":[ + { + "source": "list", + "urls": ["hello.html"] + } + ] + } + </script> +</head> +<body> + <div> + This page triggers a prerender of hello.html. Click to reload is so that we + get a user gesture. + </div> + <a id='link' href='navigation_from_prerender.html?clicked'>Click to Reload</a> +</body> +</html>
diff --git a/chrome/test/data/webui/signin/profile_picker_main_view_test.js b/chrome/test/data/webui/signin/profile_picker_main_view_test.js index 72a7ef5..2e77ae42 100644 --- a/chrome/test/data/webui/signin/profile_picker_main_view_test.js +++ b/chrome/test/data/webui/signin/profile_picker_main_view_test.js
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ManageProfilesBrowserProxyImpl, NavigationBehavior, ProfileState, Routes} from 'chrome://profile-picker/profile_picker.js'; +import {ManageProfilesBrowserProxyImpl, NavigationMixin, ProfileState, Routes} from 'chrome://profile-picker/profile_picker.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js'; -import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals, assertTrue} from '../chai_assert.js'; import {flushTasks, waitBeforeNextRender} from '../test_util.m.js'; @@ -21,29 +21,34 @@ let navigationElement; suiteSetup(function() { - Polymer({ - is: 'navigation-element', + class NavigationElement extends NavigationMixin + (PolymerElement) { + static get is() { + return 'navigation-element'; + } - behaviors: [NavigationBehavior], - - ready: function() { + /** @override */ + ready() { + super.ready(); this.reset(); - }, + } /** * @param {Routes} route * @param {string} step */ - onRouteChange: function(route, step) { + onRouteChange(route, step) { this.changeCalled = true; this.route = route; - }, + } - reset: function() { + reset() { this.changeCalled = false; this.route = ''; } - }); + } + + customElements.define(NavigationElement.is, NavigationElement); }); function resetTest() {
diff --git a/chromeos/components/camera_app_ui/resources.h b/chromeos/components/camera_app_ui/resources.h index b5f1e11..f06bc73 100644 --- a/chromeos/components/camera_app_ui/resources.h +++ b/chromeos/components/camera_app_ui/resources.h
@@ -48,6 +48,8 @@ IDS_ERROR_MSG_TAKE_PORTRAIT_BOKEH_PHOTO_FAILED}, {"error_msg_video_too_short", IDS_ERROR_MSG_VIDEO_TOO_SHORT}, {"expert_custom_video_parameters", IDS_EXPERT_CUSTOM_VIDEO_PARAMETERS}, + {"expert_enable_document_mode_on_all_cameras", + IDS_EXPERT_ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS}, {"expert_enable_expert_mode", IDS_EXPERT_ENABLE_EXPERT_MODE}, {"expert_multistream_recording", IDS_EXPERT_MULTISTREAM_RECORDING}, {"expert_mode_button", IDS_EXPERT_MODE_BUTTON},
diff --git a/chromeos/components/camera_app_ui/resources/css/css.gni b/chromeos/components/camera_app_ui/resources/css/css.gni index 554e589d..e89a114 100644 --- a/chromeos/components/camera_app_ui/resources/css/css.gni +++ b/chromeos/components/camera_app_ui/resources/css/css.gni
@@ -9,4 +9,5 @@ "ptz_panel.css", "ptz_toast.css", "ripple.css", + "scanner.css", ]
diff --git a/chromeos/components/camera_app_ui/resources/css/scanner.css b/chromeos/components/camera_app_ui/resources/css/scanner.css new file mode 100644 index 0000000..96b28948 --- /dev/null +++ b/chromeos/components/camera_app_ui/resources/css/scanner.css
@@ -0,0 +1,8 @@ +/* Copyright 2021 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +body:not(.platform-support-scan-document) #expert-enable-document-mode-on-all-cameras-item { + display: none; +} +
diff --git a/chromeos/components/camera_app_ui/resources/js/device/camera3_device_info.js b/chromeos/components/camera_app_ui/resources/js/device/camera3_device_info.js index 3a8f0587..cc57d9e 100644 --- a/chromeos/components/camera_app_ui/resources/js/device/camera3_device_info.js +++ b/chromeos/components/camera_app_ui/resources/js/device/camera3_device_info.js
@@ -25,9 +25,11 @@ * resolutions and maximal capture fps of the video device. * @param {!FpsRangeList} fpsRanges Supported fps ranges of the video device. * @param {boolean} supportPTZ Is supported PTZ controls. + * @param {boolean} supportDocumentScan Is supported document scanning. */ constructor( - deviceInfo, facing, photoResols, videoResolFpses, fpsRanges, supportPTZ) { + deviceInfo, facing, photoResols, videoResolFpses, fpsRanges, supportPTZ, + supportDocumentScan) { /** * @const {string} * @public @@ -70,6 +72,12 @@ */ this.supportPTZ = supportPTZ; + /** + * @const {boolean} + * @public + */ + this.supportDocumentScan = supportDocumentScan; + videoResolFpses.filter(({maxFps}) => maxFps >= 24) .forEach(({width, height, maxFps}) => { const r = new Resolution(width, height); @@ -104,9 +112,10 @@ const filteredVideoConfigs = videoConfigs.filter(videoConfigFilter); const supportedFpsRanges = await deviceOperator.getSupportedFpsRanges(deviceId); + const supportDocumentScan = false; return new Camera3DeviceInfo( deviceInfo, facing, photoResolution, filteredVideoConfigs, - supportedFpsRanges, supportPTZ); + supportedFpsRanges, supportPTZ, supportDocumentScan); } }
diff --git a/chromeos/components/camera_app_ui/resources/js/i18n_string.js b/chromeos/components/camera_app_ui/resources/js/i18n_string.js index 87002081..95dba12 100644 --- a/chromeos/components/camera_app_ui/resources/js/i18n_string.js +++ b/chromeos/components/camera_app_ui/resources/js/i18n_string.js
@@ -39,6 +39,8 @@ 'error_msg_take_portrait_bokeh_photo_failed', ERROR_MSG_VIDEO_TOO_SHORT: 'error_msg_video_too_short', EXPERT_CUSTOM_VIDEO_PARAMETERS: 'expert_custom_video_parameters', + EXPERT_ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS: + 'expert_enable_document_mode_on_all_cameras', EXPERT_ENABLE_EXPERT_MODE: 'expert_enable_expert_mode', EXPERT_MODE_BUTTON: 'expert_mode_button', EXPERT_PREVIEW_METADATA: 'expert_preview_metadata',
diff --git a/chromeos/components/camera_app_ui/resources/js/state.js b/chromeos/components/camera_app_ui/resources/js/state.js index 4fad394..2bc4e581 100644 --- a/chromeos/components/camera_app_ui/resources/js/state.js +++ b/chromeos/components/camera_app_ui/resources/js/state.js
@@ -17,6 +17,7 @@ CAMERA_CONFIGURING: 'camera-configuring', CAMERA_SWITCHING: 'camera-switching', CUSTOM_VIDEO_PARAMETERS: 'custom-video-parameters', + ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS: 'enable-document-mode-on-all-cameras', ENABLE_MULTISTREAM_RECORDING: 'enable-multistream-recording', ENABLE_PTZ: 'enable-ptz', EXPERT: 'expert', @@ -40,6 +41,7 @@ MULTI_CAMERA: 'multi-camera', MULTI_FPS: 'multi-fps', NO_RESOLUTION_SETTINGS: 'no-resolution-settings', + PLATFORM_SUPPORT_SCAN_DOCUMENT: 'platform-support-scan-document', PLAYING_RESULT_VIDEO: 'playing-result-video', PRINT_PERFORMANCE_LOGS: 'print-performance-logs', // Starts/Ends when start/stop event of MediaRecorder is triggered. @@ -55,6 +57,7 @@ SCAN_BARCODE: 'scan-barcode', SHOULD_HANDLE_INTENT_RESULT: 'should-handle-intent-result', SHOW_METADATA: 'show-metadata', + SHOW_SCAN_DOCUMENT_OPTIONS: 'show-scan-document-options', SCREEN_OFF_AUTO: 'screen-off-auto', STREAMING: 'streaming', SUSPEND: 'suspend',
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera.js b/chromeos/components/camera_app_ui/resources/js/views/camera.js index 2a118d2..0d944db1 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/camera.js +++ b/chromeos/components/camera_app_ui/resources/js/views/camera.js
@@ -378,6 +378,7 @@ }); this.initVideoEncoderOptions_(); + await this.initScannerMode_(); } /** @@ -437,6 +438,17 @@ } /** + * @private + */ + async initScannerMode_() { + const helper = await ChromeHelper.getInstance(); + state.set( + state.State.PLATFORM_SUPPORT_SCAN_DOCUMENT, + await helper.isDocumentModeSupported()); + } + + + /** * @param {function(): *} listener * @private */
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings.grd b/chromeos/components/camera_app_ui/resources/strings/camera_strings.grd index fd2a739f..022bef7 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings.grd +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings.grd
@@ -317,6 +317,9 @@ <message desc="Label for expert mode option: Multi-stream video recording." name="IDS_EXPERT_MULTISTREAM_RECORDING"> Multistream video recording </message> + <message desc="Label for expert mode option: enable document mode on all cameras." name="IDS_EXPERT_ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS"> + Enable document mode on all cameras + </message> <message desc="Label for expert mode option: enable expert mode." name="IDS_EXPERT_ENABLE_EXPERT_MODE"> Enable expert mode </message>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb index efd1a3e7..1d0f78cb 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">ፎቶ</translation> <translation id="4649291346448517080">ፋይሉን ማስቀመጥ አልተሳካም</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">ባለ-ብዙ ዥረት ቪዲዮ ቀረፃ</translation> <translation id="5057360777601936059">የእርስዎ ካሜራ በአሁኑ ጊዜ አይገኝም። ካሜራው በትክክል ተገናኝቶ ከሆነ እባክዎ ይፈትሹ።</translation> <translation id="5152121255775685072">ወደ ማዕከለ-ሥዕላት ሂድ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb index f4a5eb51..a41ee75 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">صورة</translation> <translation id="4649291346448517080">تعذّر حفظ الملف</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">البث المتعدّد لتسجيل الفيديو</translation> <translation id="5057360777601936059">الكاميرا غير مُتاحة حاليًا. يُرجى التحقُّق من اتصال الكاميرا بشكلٍ صحيح.</translation> <translation id="5152121255775685072">الانتقال إلى المعرض</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb index e8c5a278..f23065d 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -55,6 +55,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Faylı yadda saxlamaq mümkün deyil</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Çox-yayımlı video çəkilişi</translation> <translation id="5057360777601936059">Kamera hazırda əlçatan deyil. Kameranın düzgün qoşulub-qoşulmadığını yoxlayın.</translation> <translation id="5152121255775685072">Qalereyaya daxil olun</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb index 89984ad..e84c4b1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Фота</translation> <translation id="4649291346448517080">Не ўдалося захаваць файл</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Відэазапіс некалькіх плыней</translation> <translation id="5057360777601936059">Камера недаступная. Праверце правільнасць яе падключэння.</translation> <translation id="5152121255775685072">Перайсці ў галерэю</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb index 9615474c..f16c82a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Снимка</translation> <translation id="4649291346448517080">Файлът не може да бъде запазен</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Записва се видеоклип за много потоци</translation> <translation id="5057360777601936059">Понастоящем няма достъп до камерата ви. Моля, проверете дали камерата е свързана правилно.</translation> <translation id="5152121255775685072">Към галерията</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb index 96b78ca..2ccd794 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -57,7 +57,7 @@ <translation id="4628948037717959914">Fotografija</translation> <translation id="4649291346448517080">Nije moguće sačuvati fajl</translation> <translation id="4890010094662541459">3 x 3</translation> -<translation id="491895758387112773">Emitiraj videosnimku na više kanala</translation> +<translation id="491895758387112773">Snimanje videozapisa s više prijenosa</translation> <translation id="5057360777601936059">Kamera je trenutno nedostupna. Provjerite je li kamera pravilno povezana.</translation> <translation id="5152121255775685072">Idi u galeriju</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb index d71986b..03a9351b 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">No es pot desar el fitxer</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Grava vídeos de diversos canals</translation> <translation id="5057360777601936059">La càmera no està disponible en aquest moment. Comprova que estigui ben connectada.</translation> <translation id="5152121255775685072">Ves a la galeria</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb index ac0e699..90b3964 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotka</translation> <translation id="4649291346448517080">Soubor se nepodařilo uložit</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">Nahrávání videa z více streamů</translation> <translation id="5057360777601936059">Fotoaparát momentálně není dostupný. Zkontrolujte, zda je fotoaparát správně připojen.</translation> <translation id="5152121255775685072">Přejít do galerie</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb index 68893fda..3594bc8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Billede</translation> <translation id="4649291346448517080">Filen kan ikke gemmes</translation> <translation id="4890010094662541459">3x3</translation> +<translation id="491895758387112773">Videooptagelse med flere streams</translation> <translation id="5057360777601936059">Dit kamera er ikke tilgængeligt lige nu. Tjek, om kameraet er tilsluttet korrekt.</translation> <translation id="5152121255775685072">Gå til galleri</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb index 345a2e55..8b8e1c8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Datei konnte nicht gespeichert werden</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Multistream-Videoaufzeichnung</translation> <translation id="5057360777601936059">Ihre Kamera ist zurzeit nicht verfügbar. Bitte überprüfen Sie, ob die Kamera richtig verbunden ist.</translation> <translation id="5152121255775685072">Zur Galerie</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb index 9c389310..fe744a8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Φωτογραφία</translation> <translation id="4649291346448517080">Δεν είναι δυνατή η αποθήκευση του αρχείου</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Εγγραφή βίντεο πολλαπλής ροής</translation> <translation id="5057360777601936059">Η κάμερά σας δεν είναι διαθέσιμη προς το παρόν. Ελέγξτε εάν η κάμερα έχει συνδεθεί σωστά.</translation> <translation id="5152121255775685072">Μετάβαση στο gallery</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb index 58eafc9..7179e01 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Photo</translation> <translation id="4649291346448517080">Unable to save the file</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Multistream video recording</translation> <translation id="5057360777601936059">Your camera is currently unavailable. Please check if the camera is properly connected.</translation> <translation id="5152121255775685072">Go to gallery</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb index 44a3b18..cae97682 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">No se puede guardar el archivo</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">Crear transmisión múltiple de grabación de video</translation> <translation id="5057360777601936059">La cámara no está disponible en este momento. Asegúrate de que esté conectada de forma correcta.</translation> <translation id="5152121255775685072">Ir a la galería</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb index 43e9a59..8ab4e94f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">No se puede guardar el archivo</translation> <translation id="4890010094662541459">3x3</translation> +<translation id="491895758387112773">Grabación de varias emisiones de vídeo</translation> <translation id="5057360777601936059">Tu cámara no está disponible en este momento. Comprueba si está conectada correctamente.</translation> <translation id="5152121255775685072">Ir a la galería</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb index b34d01d..193a31f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Argazkia</translation> <translation id="4649291346448517080">Ezin da gorde fitxategia</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">Bideo anitzeko grabaketa</translation> <translation id="5057360777601936059">Kamera ez dago erabilgarri une honetan. Egiaztatu kamera ongi konektatuta dagoela.</translation> <translation id="5152121255775685072">Joan galeriara</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb index 30c57d8..86be7b62 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">عکس</translation> <translation id="4649291346448517080">فایل ذخیره نشد</translation> <translation id="4890010094662541459">۳ × ۳</translation> +<translation id="491895758387112773">ضبط ویدیوی چندجریانی</translation> <translation id="5057360777601936059">درحالحاضر دوربینتان دردسترس نیست. مطمئن شوید دوربین درست وصل شده باشد.</translation> <translation id="5152121255775685072">رفتن به گالری</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb index 90836ccec..403c1c53 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Kuva</translation> <translation id="4649291346448517080">Tiedoston tallennus epäonnistui.</translation> <translation id="4890010094662541459">3x3</translation> +<translation id="491895758387112773">Striimaa videotallenne useaan paikkaan</translation> <translation id="5057360777601936059">Kamerasi ei ole käytettävissä tällä hetkellä. Tarkista, onko kamera yhdistetty oikein.</translation> <translation id="5152121255775685072">Siirry galleriaan</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb index b8c8415..fde4fba 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Larawan</translation> <translation id="4649291346448517080">Hindi ma-save ang file</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Pag-record ng multistream video</translation> <translation id="5057360777601936059">Kasalukuyang hindi available ang iyong camera. Pakitingnan kung maayos na nakakonekta ang camera.</translation> <translation id="5152121255775685072">Pumunta sa gallery</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb index 5e884e32..5b74a801 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Photo</translation> <translation id="4649291346448517080">Impossible d'enregistrer le fichier</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Enregistrement vidéo à flux multiples</translation> <translation id="5057360777601936059">Votre appareil photo n'est pas accessible pour le moment. Veuillez vérifier si l'appareil photo est connecté correctement.</translation> <translation id="5152121255775685072">Accéder à la galerie</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS.png.sha1 b/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS.png.sha1 new file mode 100644 index 0000000..e853a9a5 --- /dev/null +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_ENABLE_DOCUMENT_MODE_ON_ALL_CAMERAS.png.sha1
@@ -0,0 +1 @@ +0218bb55e008e76d30375e7e5c825e9c47d16db0 \ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb index b6b0c69..46c9a87 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">फ़ोटो</translation> <translation id="4649291346448517080">फ़ाइल सेव नहीं की जा सकी</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">मल्टीस्ट्रीम वीडियो रिकॉर्डिंग</translation> <translation id="5057360777601936059">फ़िलहाल आपका कैमरा उपलब्ध नहीं है. कृपया देखें कि कैमरा ठीक तरह से कनेक्ट है या नहीं.</translation> <translation id="5152121255775685072">गैलरी में जाएं</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb index 187635db..3532348 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fénykép</translation> <translation id="4649291346448517080">Nem sikerült menteni a fájlt</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">Multi-stream videó rögzítése</translation> <translation id="5057360777601936059">A kamera jelenleg nem használható. Ellenőrizze, hogy a kamera megfelelően van-e csatlakoztatva.</translation> <translation id="5152121255775685072">Ugrás a galériába</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb index 567928079..4a69610 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Լուսանկար</translation> <translation id="4649291346448517080">Չհաջողվեց պահել ֆայլը</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Բազմահոսքային տեսագրում</translation> <translation id="5057360777601936059">Ձեր տեսախցիկն այս պահին հասանելի չէ: Ստուգեք՝ արդյոք տեսախցիկը ճիշտ է միացված:</translation> <translation id="5152121255775685072">Անցնել ցուցասրահ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb index 6d14620f..50db188 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Tidak dapat menyimpan file</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Multi-streaming perekaman video</translation> <translation id="5057360777601936059">Kamera tidak tersedia untuk saat ini. Periksa apakah kamera terhubung dengan benar.</translation> <translation id="5152121255775685072">Buka galeri</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb index ba519ef..adb924c 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Impossibile salvare il file</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Registrazione video multistream</translation> <translation id="5057360777601936059">La tua fotocamera non è attualmente disponibile. Controlla se la fotocamera è collegata correttamente.</translation> <translation id="5152121255775685072">Vai alla galleria</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb index 8474d8ae..e5b0c3d1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">תמונה</translation> <translation id="4649291346448517080">לא ניתן לשמור את הקובץ</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">הקלטת סרטון במולטי-סטרימינג</translation> <translation id="5057360777601936059">המצלמה אינה זמינה כרגע. יש לבדוק אם המצלמה מחוברת כראוי.</translation> <translation id="5152121255775685072">למעבר אל הגלריה</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb index b48a5e3..50349ac 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">写真</translation> <translation id="4649291346448517080">ファイルを保存できません</translation> <translation id="4890010094662541459">3x3</translation> +<translation id="491895758387112773">マルチストリーム動画の録画</translation> <translation id="5057360777601936059">カメラを使用できません。 カメラが正しく接続されているかご確認ください。</translation> <translation id="5152121255775685072">ギャラリーに移動</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb index c2e39a3..1655c0fc 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">ფოტო</translation> <translation id="4649291346448517080">ფაილის შენახვა ვერ მოხერხდა</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">მრავალნაკადოვანი ვიდეოჩაწერა</translation> <translation id="5057360777601936059">თქვენი კამერა ამჟამად მიუწვდომელია. შეამოწმეთ, რომ კამერა სწორად არის დაკავშირებული.</translation> <translation id="5152121255775685072">გალერეაზე გადასვლა</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb index b3d68bd1..36bd176f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Фотосурет</translation> <translation id="4649291346448517080">Файл сақталмады.</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Көп ағынды бейне жазу</translation> <translation id="5057360777601936059">Камераңыз әзірге қолжетімді емес. Камераның дұрыс жалғанғанын тексеріңіз.</translation> <translation id="5152121255775685072">Галереяға өту</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb index 382697d..7d73ad9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">រូបថត</translation> <translation id="4649291346448517080">មិនអាចរក្សាទុកឯកសារបានទេ</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">ផ្សាយការថតវីដេអូទៅបណ្ដាញច្រើន</translation> <translation id="5057360777601936059">កាមេរ៉ារបស់អ្នកមិនអាចប្រើបានទេនៅពេលនេះ។ សូមពិនិត្យមើលថាតើកាមេរ៉ាត្រូវបានភ្ជាប់ត្រឹមត្រូវឬអត់។</translation> <translation id="5152121255775685072">ចូលទៅកាន់សាលរូបភាព</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb index 5f00fd9..ae89098 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">사진</translation> <translation id="4649291346448517080">파일을 저장할 수 없습니다.</translation> <translation id="4890010094662541459">3x3</translation> +<translation id="491895758387112773">멀티스트림 동영상 녹화</translation> <translation id="5057360777601936059">현재 카메라를 사용할 수 없습니다. 카메라가 제대로 연결되어 있는지 확인하세요.</translation> <translation id="5152121255775685072">갤러리로 이동</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb index aecbe978..396e419 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Сүрөт</translation> <translation id="4649291346448517080">Файл сакталбай жатат</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Бир нече агымдагы видеону жаздыруу</translation> <translation id="5057360777601936059">Камераңыз учурда жеткиликсиз. Камера туура туташканын текшериңиз.</translation> <translation id="5152121255775685072">Галереяга өтүү</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb index 1111fbd..a14696a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">ຮູບຖ່າຍ</translation> <translation id="4649291346448517080">ບໍ່ສາມາດບັນທຶກໄຟລ໌ໄດ້</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">ການບັນທຶກວິດີໂອແບບຫຼາຍສະຕຣີມ</translation> <translation id="5057360777601936059">ກ້ອງຖ່າຍຮູບຂອງທ່ານບໍ່ສາມາດໃຊ້ໄດ້ໃນຂະນະນີ້. ກະລຸນາກວດເບິ່ງວ່າໄດ້ເຊື່ອມຕໍ່ກ້ອງຖ່າຍຮູບຢ່າງຖືກຕ້ອງຫຼືບໍ່.</translation> <translation id="5152121255775685072">ໄປທີ່ຄັງຮູບພາບ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb index bb13c788..17f4ce7 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Nuotrauka</translation> <translation id="4649291346448517080">Nepavyko išsaugoti failo</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Vaizdo įrašo įrašymą išskaidyti į kelis srautus</translation> <translation id="5057360777601936059">Fotoaparatas šiuo metu nepasiekiamas. Patikrinkite, ar fotoaparatas tinkamai prijungtas.</translation> <translation id="5152121255775685072">Eiti į galeriją</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb index e934df1..75b99d4 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotoattēls</translation> <translation id="4649291346448517080">Nevar saglabāt failu</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Straumēt video ierakstu vairākos kanālos</translation> <translation id="5057360777601936059">Kamera šobrīd nav pieejama. Lūdzu, pārbaudiet, vai kamera ir pareizi pievienota.</translation> <translation id="5152121255775685072">Pāriet uz galeriju</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb index cf5faed..c837b587b 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Фотографија</translation> <translation id="4649291346448517080">Не може да се зачува датотеката</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Видеоснимање за мултипреноси</translation> <translation id="5057360777601936059">Камерата е недостапна во моментов. Проверете дали камерата е правилно поврзана.</translation> <translation id="5152121255775685072">Оди во галеријата</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb index 2c21c40e..151cd2770 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Tidak dapat menyimpan fail</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Rakaman video berbilang strim</translation> <translation id="5057360777601936059">Kamera anda tidak tersedia pada masa ini. Sila periksa sama ada kamera telah disambungkan dengan betul.</translation> <translation id="5152121255775685072">Pergi ke galeri</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb index 1576af1..35a31fd 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">ဓာတ်ပုံ</translation> <translation id="4649291346448517080">ဖိုင်ကို သိမ်း၍မရပါ</translation> <translation id="4890010094662541459">၃ x ၃</translation> +<translation id="491895758387112773">ဗီဒီယိုရိုက်ကူးမှုကို စနစ်အမျိုးမျိုးတွင် ထုတ်လွှင့်ခြင်း</translation> <translation id="5057360777601936059">သင့်ကင်မရာကို လောလောဆယ်မရနိုင်ပါ။ ကင်မရာကို စနစ်တကျ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ပါ။</translation> <translation id="5152121255775685072">ပြခန်းသို့ သွားရန်</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb index 60af322..a1e88858 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">तस्बिर</translation> <translation id="4649291346448517080">फाइल सुरक्षित गर्न सकिएन</translation> <translation id="4890010094662541459">३ x ३</translation> +<translation id="491895758387112773">मल्टिस्ट्रिम भिडियो रेकर्डिङ</translation> <translation id="5057360777601936059">तपाईंको क्यामेरा हाल उपलब्ध छैन। कृपया क्यामेरा राम्ररी जडान गरिएको छ कि छैन भनी जाँच गर्नुहोस्।</translation> <translation id="5152121255775685072">ग्यालेरीमा जानुहोस्</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb index 1e293f97..eaaa6e8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Bilde</translation> <translation id="4649291346448517080">Kan ikke lagre filen</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Videoopptak med flere strømmer</translation> <translation id="5057360777601936059">Kameraet er ikke tilgjengelig akkurat nå. Sjekk om kameraet er koblet til riktig.</translation> <translation id="5152121255775685072">Gå til galleriet</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb index 7479b51..3cf6ffae 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Zdjęcie</translation> <translation id="4649291346448517080">Nie udało się zapisać pliku</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Nagrywanie kilku strumieni wideo</translation> <translation id="5057360777601936059">Aparat jest obecnie niedostępny. Sprawdź, czy jest prawidłowo podłączony.</translation> <translation id="5152121255775685072">Otwórz galerię</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index 3fc74c1..2d84425 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Não foi possível salvar o arquivo</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Fazer multistreaming da gravação de vídeo</translation> <translation id="5057360777601936059">Sua câmera está indisponível no momento. Verifique se ela está conectada corretamente.</translation> <translation id="5152121255775685072">Ir para a galeria</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb index e88489a..ab81004 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotografia</translation> <translation id="4649291346448517080">Não foi possível guardar o ficheiro.</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Gravação de vídeo multistream</translation> <translation id="5057360777601936059">De momento, a câmara não está disponível. Verifique se a câmara está ligada corretamente.</translation> <translation id="5152121255775685072">Ir para a galeria</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb index 39e70f4..636a207a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotografie</translation> <translation id="4649291346448517080">Fișierul nu poate fi salvat</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Înregistrare video pentru streamuri multiple</translation> <translation id="5057360777601936059">Camera foto este indisponibilă. Verifică dacă ai conectat corect camera foto.</translation> <translation id="5152121255775685072">Accesează galeria</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb index 2fbed28..5821f83 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Фото</translation> <translation id="4649291346448517080">Не удалось сохранить файл.</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Многопотоковая видеозапись</translation> <translation id="5057360777601936059">Камера недоступна. Проверьте, правильно ли подключена камера.</translation> <translation id="5152121255775685072">Перейти в галерею</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb index 31a91258..3f2a18c 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotografia</translation> <translation id="4649291346448517080">Súbor sa nepodarilo uložiť</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">Streamovať záznam videa vo viacerých platformách</translation> <translation id="5057360777601936059">Fotoaparát je momentálne nedostupný. Skontrolujte, či je správne pripojený.</translation> <translation id="5152121255775685072">Prejsť do galérie</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb index fac2300..fdd0afb 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotografija</translation> <translation id="4649291346448517080">Datoteke ni mogoče shraniti</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Večtokovno snemanje videoposnetkov</translation> <translation id="5057360777601936059">Fotoaparat trenutno ni na voljo. Preverite, ali je fotoaparat ustrezno povezan.</translation> <translation id="5152121255775685072">V galerijo</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index 774f59a..4084a6a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Slika</translation> <translation id="4649291346448517080">Čuvanje datoteke nije uspelo</translation> <translation id="4890010094662541459">3×3</translation> +<translation id="491895758387112773">Snimanje videa sa više strimova</translation> <translation id="5057360777601936059">Kamera trenutno nije dostupna. Proverite da li je kamera ispravno povezana.</translation> <translation id="5152121255775685072">Idi u galeriju</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb index ed60b3bf..7e7086a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Слика</translation> <translation id="4649291346448517080">Чување датотеке није успело</translation> <translation id="4890010094662541459">3×3</translation> +<translation id="491895758387112773">Снимање видеа са више стримова</translation> <translation id="5057360777601936059">Камера тренутно није доступна. Проверите да ли је камера исправно повезана.</translation> <translation id="5152121255775685072">Иди у галерију</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb index 9caccab..214f06c1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Det gick inte att spara filen</translation> <translation id="4890010094662541459">3 × 3</translation> +<translation id="491895758387112773">Multistream-videoinspelning</translation> <translation id="5057360777601936059">Kameran är inte tillgänglig. Kontrollera kameraanslutningen.</translation> <translation id="5152121255775685072">Besök galleriet</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb index cbd1403..d8e0f70 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Picha</translation> <translation id="4649291346448517080">Imeshindwa kuhifadhi faili</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Kurekodi video nyingi zinazotiririshwa</translation> <translation id="5057360777601936059">Kamera yako haipatikani kwa sasa. Tafadhali hakikisha kuwa umeunganisha kamera vizuri.</translation> <translation id="5152121255775685072">Nenda kwenye matunzio</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb index 4defb1d..4b7c3f3 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">รูปภาพ</translation> <translation id="4649291346448517080">บันทึกไฟล์ไม่ได้</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">การบันทึกวิดีโอแบบหลายสตรีม</translation> <translation id="5057360777601936059">ขณะนี้กล้องไม่พร้อมใช้งาน โปรดตรวจสอบว่ากล้องเชื่อมต่ออย่างถูกต้อง</translation> <translation id="5152121255775685072">ไปที่แกลเลอรี</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb index fae2c77..d1176d2 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Fotoğraf</translation> <translation id="4649291346448517080">Dosya kaydedilemiyor</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Çoklu akış video kaydı</translation> <translation id="5057360777601936059">Kameranız şu anda kullanılamıyor. Lütfen kameranın düzgün bir şekilde bağlanıp bağlanmadığını kontrol edin.</translation> <translation id="5152121255775685072">Galeriye git</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb index 8f06761..569eee8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Фотографія</translation> <translation id="4649291346448517080">Не вдається зберегти файл</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Багатопотоковий відеозапис</translation> <translation id="5057360777601936059">Камера зараз недоступна. Перевірте, чи правильно її під’єднано.</translation> <translation id="5152121255775685072">Перейти в галерею</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index 8e9ad98..598aa35 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">相片</translation> <translation id="4649291346448517080">無法儲存檔案</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">錄製多串流影片</translation> <translation id="5057360777601936059">您的相機目前無法使用。 請檢查相機是否正確連接。</translation> <translation id="5152121255775685072">前往相片集</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index 6fd3e27f..412ee27 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">相片</translation> <translation id="4649291346448517080">無法儲存檔案</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">錄製多串流視訊</translation> <translation id="5057360777601936059">目前無法使用相機。 請檢查相機是否已正確連接。</translation> <translation id="5152121255775685072">前往圖片庫</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb index 0f1b7772..c8d0db8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -57,6 +57,7 @@ <translation id="4628948037717959914">Isithombe</translation> <translation id="4649291346448517080">Ayikwazi ukulondoloza ifayela</translation> <translation id="4890010094662541459">3 x 3</translation> +<translation id="491895758387112773">Ukurekhoda ividiyo kokusakaza okuningi</translation> <translation id="5057360777601936059">Ikhamera yakho manje ayitholakali. Hlola uma ngabe ikhamera ixhumeke kahle yini.</translation> <translation id="5152121255775685072">Hamba kugalari</translation>
diff --git a/chromeos/components/camera_app_ui/resources/views/main.html b/chromeos/components/camera_app_ui/resources/views/main.html index 0134245..fa42880 100644 --- a/chromeos/components/camera_app_ui/resources/views/main.html +++ b/chromeos/components/camera_app_ui/resources/views/main.html
@@ -479,6 +479,14 @@ data-key="customVideoParameters"> <span i18n-text="expert_custom_video_parameters"></span> </label> + <label id="expert-enable-document-mode-on-all-cameras-item" + class="menu-item"> + <input class="icon" id="expert-enable-document-mode-on-all-cameras" + type="checkbox" tabindex="0" + data-state="enable-document-mode-on-all-cameras" + data-key="enableDocumentModeOnAllCameras"> + <span i18n-text="expert_enable_document_mode_on_all_cameras"></span> + </label> <label class="menu-item inkdrop"> <input class="icon" type="checkbox" tabindex="0" data-state="enable-multistream-recording"
diff --git a/chromeos/crosapi/mojom/image_writer.mojom b/chromeos/crosapi/mojom/image_writer.mojom index be915c9..d0c9592f 100644 --- a/chromeos/crosapi/mojom/image_writer.mojom +++ b/chromeos/crosapi/mojom/image_writer.mojom
@@ -4,7 +4,9 @@ module crosapi.mojom; +import "mojo/public/mojom/base/file_path.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom"; +import "url/mojom/url.mojom"; // A struct representing a removable storage device. [Stable] @@ -67,17 +69,55 @@ // Destroys the partition table of a removable disk specified by // |storage_unit_id| from the request of a remote extension running in Lacros. // |remote_client| will be used to dispatch writing progress events back - // to remote extension which initiates DestroyPartitions. + // to the remote extension which initiates DestroyPartitions. // Returns an error defined by extensions::image_writer::error // (see chrome/browser/extensions/api/image_writer_private/error_messages.cc) // such as error::kOperationAlreadyInProgress or error::kDeviceWriteError, // which are caught before performing writing operation on the removable // device. // |error| should be returned to the caller of the extension API - // imageWriterPrivate.DestroyPartitions. + // imageWriterPrivate.destroyPartitions. // Errors that occur while writing to the removable device are reported by // ImageWriterClient::DispatchOnWriteErrorEvent api. DestroyPartitions@1(string storage_unit_id, pending_remote<ImageWriterClient> remote_client) - => (string? error); + => (string? error); + + // Write an image downloaded from |image_url| to the disk specified by + // |storage_unit_id|. Compare the download with |image_hash| if the optional + // parameter is provided. + // |remote_client| will be used to dispatch writing progress events back + // to the remote extension which initiates WriteFromUrl. + // Returns an error defined by extensions::image_writer::error + // (see chrome/browser/extensions/api/image_writer_private/error_messages.cc) + // such as error::kOperationAlreadyInProgress or error::kDeviceWriteError, + // which are caught before performing writing operation on the removable + // device. + // |error| should be returned to the caller of the extension API + // imageWriterPrivate.writeFromUrl. + // Errors that occur while writing to the removable device are reported by + // ImageWriterClient::DispatchOnWriteErrorEvent api. + [MinVersion=1] + WriteFromUrl@2(string storage_unit_id, url.mojom.Url image_url, + string? image_hash, pending_remote<ImageWriterClient> remote_client) + => (string? error); + + + // Write an image supplied by a local file with |image_path| to the + // disk specified by |storage_unit_id|. + // |remote_client| will be used to dispatch writing progress events back + // to the remote extension which initiates WriteFromFile. + // Returns an error defined by extensions::image_writer::error + // (see chrome/browser/extensions/api/image_writer_private/error_messages.cc) + // such as error::kOperationAlreadyInProgress or error::kDeviceWriteError, + // which are caught before performing writing operation on the removable + // device. + // |error| should be returned to the caller of the extension API + // imageWriterPrivate.writeFromFile. + // Errors that occur while writing to the removable device are reported by + // ImageWriterClient::DispatchOnWriteErrorEvent api. + [MinVersion=1] + WriteFromFile@3(string storage_unit_id, mojo_base.mojom.FilePath image_path, + pending_remote<ImageWriterClient> remote_client) + => (string? error); };
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb index 6695daaf..669570f 100644 --- a/chromeos/strings/chromeos_strings_af.xtb +++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">Gestop – onbekende fout</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> prente</translation> <translation id="4378373042927530923">Nie laat loop nie</translation> +<translation id="4378551569595875038">Koppel tans …</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">Kerberos-kaartjie verval binnekort</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index fb0d412..24a86ea3 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">ምንም በይነመረብ የለም</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">የገባሪነት ሁኔታ</translation> +<translation id="2294675138977897428">ምንም የኤተርኔት ግንኙነት አልተገኘም</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">በአቅራቢያ ያሉ መሣሪያዎችን ለማግኘት ብሉቱዝን ያብሩ</translation> <translation id="2364498172489649528">አልፏል</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">ቆሟል - ያልታወቀ ስህተት</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ምስሎች</translation> <translation id="4378373042927530923">አታሂድ</translation> +<translation id="4378551569595875038">በመገናኘት ላይ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">የእኔ Drive</translation> <translation id="4429881212383817840">የKerberos ቲኬት ጊዜው በቅርቡ ያበቃል</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">ያልታወቀ የWiFi ደህንነት ፕሮቶኮል</translation> <translation id="65587193855025101">ጠፍጣፋ ወለል</translation> <translation id="6564646048574748301">አልተሳካም - አታሚ የማይደረስበት ነው</translation> +<translation id="6603230386432466813">መገናኘት ላይ ችግር እያጋጠመዎት ነው?</translation> <translation id="6618744767048954150">በማሄድ ላይ</translation> <translation id="6620487321149975369">የህትመት ስራዎች በሰው ካልተወገዱ በቀር በታሪክ ውስጥ ይታያሉ</translation> <translation id="6643016212128521049">አጽዳ</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index cbcc876..271a9d5 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">الاتصال بالإنترنت مقطوع</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">حالة التفعيل</translation> +<translation id="2294675138977897428">لم يتم رصد اتصال إيثرنت.</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> نقطة لكل بوصة (DPI)</translation> <translation id="2338501278241028356">تفعيل البلوتوث لاكتشاف الأجهزة القريبة</translation> <translation id="2364498172489649528">تم الاجتياز.</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">توقّفت الطابعة - خطأ غير معروف</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> صورة</translation> <translation id="4378373042927530923">لم يتم التشغيل</translation> +<translation id="4378551569595875038">جارٍ الاتصال...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">ملفاتي</translation> <translation id="4429881212383817840">ستنتهي صلاحية تذكرة Kerberos قريبًا</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">بروتوكول حماية شبكة Wi-Fi غير معروف.</translation> <translation id="65587193855025101">المسطَّح</translation> <translation id="6564646048574748301">تعذَّرت الطباعة - لا يمكن الوصول إلى الطابعة</translation> +<translation id="6603230386432466813">هل تواجه مشكلة أثناء الاتصال؟</translation> <translation id="6618744767048954150">قيد التشغيل</translation> <translation id="6620487321149975369">ستظهر طلبات الطباعة في السجلّ إلّا إذا تمت إزالتها يدويًا.</translation> <translation id="6643016212128521049">محو</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb index 1c66953..7b45489 100644 --- a/chromeos/strings/chromeos_strings_as.xtb +++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">বন্ধ হৈছে - অজ্ঞাত আসোঁৱাহ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> খন প্ৰতিচ্ছবি</translation> <translation id="4378373042927530923">নাই চলা</translation> +<translation id="4378551569595875038">সংযোগ হৈছে...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">মোৰ ড্ৰাইভ</translation> <translation id="4429881212383817840">Kerberos টিকেটৰ ম্যাদ শীঘ্ৰেই উকলি যাব</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index 5e2d6c3..82f9e92 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">İnternet yoxdur</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktivləşdirmə statusu</translation> +<translation id="2294675138977897428">Heç bir Ethernet bağlantısı tapılmadı</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Yaxınlıqdakı cihazları tapmaq üçün Bluetooth'u aktiv edin</translation> <translation id="2364498172489649528">Keçdi</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Dayanıb - Naməlum xəta</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> şəkil</translation> <translation id="4378373042927530923">İşə salınmayıb</translation> +<translation id="4378551569595875038">Qoşulur...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Diskim</translation> <translation id="4429881212383817840">Kerberos biletinin vaxtı tezliklə başa çatacaq</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">Naməlum Wi-Fi güvənlik protokolu</translation> <translation id="65587193855025101">Yastı</translation> <translation id="6564646048574748301">Alınmadı - Printer əlçatan deyil</translation> +<translation id="6603230386432466813">Bağlantı problemi var?</translation> <translation id="6618744767048954150">İcra olunur</translation> <translation id="6620487321149975369">Manual olaraq silinməsə, çap işləri tarixçədə görünəcək</translation> <translation id="6643016212128521049">Silin</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index e65920e..590863c 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Няма падключэння да інтэрнэту</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Стан актывацыі</translation> +<translation id="2294675138977897428">Ethernet-падключэнне не выяўлена</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Каб знайсці прылады паблізу, уключыце Bluetooth</translation> <translation id="2364498172489649528">Пройдзена</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Спынена: невядомая памылка</translation> <translation id="4300073214558989">Відарысаў: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Паслядоўнасць дзеянняў не запускалася</translation> +<translation id="4378551569595875038">Падключэнне...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Мой Дыск</translation> <translation id="4429881212383817840">Дзеянне білета Kerberos хутка скончыцца</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Невядомы пратакол сістэмы бяспекі Wi-Fi</translation> <translation id="65587193855025101">Планшэтны сканер</translation> <translation id="6564646048574748301">Збой: прынтар недаступны</translation> +<translation id="6603230386432466813">Узнікла праблема з падключэннем?</translation> <translation id="6618744767048954150">Выконваецца</translation> <translation id="6620487321149975369">Заданні друку будуць паказвацца ў гісторыі, пакуль яны не будуць выдалены ўручную</translation> <translation id="6643016212128521049">Ачысціць</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index ea3fa96..222c6cd 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Няма достъп до интернет</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Състояние на активирането</translation> +<translation id="2294675138977897428">Не е открита връзка с Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Включете Bluetooth, за да бъдат открити устройствата в близост</translation> <translation id="2364498172489649528">Премината</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Спряло – неизвестна грешка</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> изображения</translation> <translation id="4378373042927530923">Не е стартирано</translation> +<translation id="4378551569595875038">Свързване...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Моят диск</translation> <translation id="4429881212383817840">Пропускът за Kerberos изтича скоро</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Неизвестен протокол за сигурност на Wi-Fi</translation> <translation id="65587193855025101">Плосък скенер</translation> <translation id="6564646048574748301">Неуспешно – няма връзка с принтера</translation> +<translation id="6603230386432466813">Имате проблеми при свързване?</translation> <translation id="6618744767048954150">В ход</translation> <translation id="6620487321149975369">Заданията за отпечатване ще се показват в историята, освен ако не ги премахнете ръчно</translation> <translation id="6643016212128521049">Изчистване</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index bb0be295..e38a8f68 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">বন্ধ হয়ে গেছে - অজানা সমস্যা</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" />টি ছবি</translation> <translation id="4378373042927530923">চালানো যায়নি</translation> +<translation id="4378551569595875038">সংযুক্ত হচ্ছে...</translation> <translation id="4382484599443659549">পিডিএফ</translation> <translation id="4425149324548788773">আমার ড্রাইভ</translation> <translation id="4429881212383817840">Kerberos টিকিটের মেয়াদ শীঘ্রই শেষ হয়ে যাবে</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 5758b97..dfcab51 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -63,7 +63,7 @@ <translation id="2224337661447660594">Nema internetske veze</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Status aktivacije</translation> -<translation id="2294675138977897428">Veza s Ethernetom nije otkrivena</translation> +<translation id="2294675138977897428">Veza s Ethernet mrežom nije otkrivena</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Uključite Bluetooth da otkrijete uređaje u blizini</translation> <translation id="2364498172489649528">Uspješno</translation> @@ -145,6 +145,7 @@ <translation id="4297501883039923494">Zaustavljeno – nepoznata greška</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> slike/a</translation> <translation id="4378373042927530923">Nije pokrenuto</translation> +<translation id="4378551569595875038">Povezivanje…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4429881212383817840">Kerberos tiket uskoro ističe</translation> @@ -279,7 +280,7 @@ <translation id="6527081081771465939">Nepoznati sigurnosni protokol za WiFi</translation> <translation id="65587193855025101">Položeno</translation> <translation id="6564646048574748301">Nije uspjelo – štampač je nedostupan</translation> -<translation id="6603230386432466813">Imate li problema s povezivanjem?</translation> +<translation id="6603230386432466813">Imate poteškoće s povezivanjem?</translation> <translation id="6618744767048954150">Pokrenuto</translation> <translation id="6620487321149975369">Zadaci za štampanje će se pojaviti u historiji osim ako ih ne uklonite ručno</translation> <translation id="6643016212128521049">Obriši</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index 86722d4..a85b820 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Sense connexió a Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Estat d'activació</translation> +<translation id="2294675138977897428">No s'ha detectat cap connexió Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> ppp</translation> <translation id="2338501278241028356">Activa el Bluetooth per detectar dispositius propers</translation> <translation id="2364498172489649528">Comprovació superada</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">S'ha aturat: error desconegut</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imatges</translation> <translation id="4378373042927530923">No s'ha executat</translation> +<translation id="4378551569595875038">Connectant...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">La meva unitat</translation> <translation id="4429881212383817840">El tiquet de Kerberos caducarà aviat</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protocol de seguretat Wi-Fi desconegut</translation> <translation id="65587193855025101">Finestra plana</translation> <translation id="6564646048574748301">Error: no es pot accedir a la impressora</translation> +<translation id="6603230386432466813">Tens problemes per connectar-te?</translation> <translation id="6618744767048954150">Comprovació en curs</translation> <translation id="6620487321149975369">Les tasques d'impressió es mostraran a l'historial tret que se suprimeixin manualment</translation> <translation id="6643016212128521049">Esborra</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index 9a961d5..1f8c98f 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nejste připojeni k internetu</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Stav aktivace</translation> +<translation id="2294675138977897428">Nebylo nalezeno žádné připojení k ethernetu</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Chcete-li objevit okolní zařízení, zapněte Bluetooth</translation> <translation id="2364498172489649528">V pořádku</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Zastaveno – neznámá chyba</translation> <translation id="4300073214558989">Počet obrázků: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Nespuštěno</translation> +<translation id="4378551569595875038">Připojování...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Můj disk</translation> <translation id="4429881212383817840">Platnost lístku Kerberos brzy vyprší</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Neznámý bezpečnostní protokol Wi-Fi</translation> <translation id="65587193855025101">Předlohové sklo</translation> <translation id="6564646048574748301">Tisk selhal – tiskárna není dostupná</translation> +<translation id="6603230386432466813">Máte problémy s připojením?</translation> <translation id="6618744767048954150">Probíhá</translation> <translation id="6620487321149975369">Tiskové úlohy se budou zobrazovat v historii, pokud je ručně neodstraníte</translation> <translation id="6643016212128521049">Vymazat</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 728c952..3f64f3ee 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Der er ingen internetforbindelse</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> +<translation id="2294675138977897428">Der blev ikke registreret nogen Ethernet-forbindelse</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Slå Bluetooth til for at opdage enheder i nærheden</translation> <translation id="2364498172489649528">Bestået</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Stoppet – Ukendt fejl</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> billeder</translation> <translation id="4378373042927530923">Kørte ikke</translation> +<translation id="4378551569595875038">Tilslutter...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mit drev</translation> <translation id="4429881212383817840">Din Kerberos-billet er ved at udløbe</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">Ukendt Wi-Fi-sikkerhedsprotokol</translation> <translation id="65587193855025101">Flatbed</translation> <translation id="6564646048574748301">Handlingen mislykkedes – Ingen forbindelse til printer</translation> +<translation id="6603230386432466813">Har du problemer med at oprette forbindelse?</translation> <translation id="6618744767048954150">Kører</translation> <translation id="6620487321149975369">Udskriftsjobs vises i historikken, medmindre de fjernes manuelt</translation> <translation id="6643016212128521049">Ryd</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 5e6ebf2..c3815e05 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Kein Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktivierungsstatus</translation> +<translation id="2294675138977897428">Keine Ethernetverbindung gefunden</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Aktivieren Sie Bluetooth, damit Geräte in der Nähe gefunden werden</translation> <translation id="2364498172489649528">Bestanden</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Angehalten – Unbekannter Fehler</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Bilder</translation> <translation id="4378373042927530923">Nicht ausgeführt</translation> +<translation id="4378551569595875038">Verbindung...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Meine Ablage</translation> <translation id="4429881212383817840">Kerberos-Ticket läuft bald ab</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Unbekanntes WLAN-Sicherheitsprotokoll</translation> <translation id="65587193855025101">Flachbett</translation> <translation id="6564646048574748301">Fehlgeschlagen – Drucker nicht erreichbar</translation> +<translation id="6603230386432466813">Sie haben Probleme beim Herstellen einer Verbindung?</translation> <translation id="6618744767048954150">Läuft</translation> <translation id="6620487321149975369">Druckaufträge erscheinen im Verlauf, solange sie nicht manuell gelöscht werden</translation> <translation id="6643016212128521049">Löschen</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index ae42117a..d9bac698 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Χωρίς σύνδεση στο διαδίκτυο</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Κατάσταση ενεργοποίησης</translation> +<translation id="2294675138977897428">Δεν εντοπίστηκε σύνδεση Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Ενεργοποιήστε το Bluetooth, για να εντοπίσετε κοντινές συσκευές</translation> <translation id="2364498172489649528">Επιτυχία</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Διακοπή - Άγνωστο σφάλμα</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> εικόνες</translation> <translation id="4378373042927530923">Δεν εκτελέστηκε</translation> +<translation id="4378551569595875038">Σύνδεση…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Το Drive μου</translation> <translation id="4429881212383817840">Το εισιτήριο Kerberos θα λήξει σύντομα</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Άγνωστο πρωτόκολλο ασφαλείας Wi-Fi</translation> <translation id="65587193855025101">Επίπεδος</translation> <translation id="6564646048574748301">Σφάλμα - Δεν είναι δυνατή η πρόσβαση στον εκτυπωτή</translation> +<translation id="6603230386432466813">Αντιμετωπίζετε προβλήματα κατά τη σύνδεση;</translation> <translation id="6618744767048954150">Σε εξέλιξη</translation> <translation id="6620487321149975369">Οι εργασίες εκτύπωσης θα εμφανίζονται στο ιστορικό, εκτός εάν καταργηθούν μη αυτόματα.</translation> <translation id="6643016212128521049">Διαγραφή</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 5679be3..f5ffc54 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">No Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Activation status</translation> +<translation id="2294675138977897428">No Ethernet connection detected</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Turn on Bluetooth to discover nearby devices</translation> <translation id="2364498172489649528">Passed</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Stopped – unknown error</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation> <translation id="4378373042927530923">Not run</translation> +<translation id="4378551569595875038">Connecting...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">Kerberos ticket expires soon</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Unknown Wi-Fi security protocol</translation> <translation id="65587193855025101">Flatbed</translation> <translation id="6564646048574748301">Failed – Printer unreachable</translation> +<translation id="6603230386432466813">Having trouble connecting?</translation> <translation id="6618744767048954150">Running</translation> <translation id="6620487321149975369">Print jobs will appear in history unless they are removed manually</translation> <translation id="6643016212128521049">Clear</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index e298287..279dfa5 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Sin Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Estado de activación</translation> +<translation id="2294675138977897428">No se detectó ninguna conexión de Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Activar Bluetooth para buscar los dispositivos cercanos</translation> <translation id="2364498172489649528">Aprobado</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Se detuvo: error desconocido</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Imágenes</translation> <translation id="4378373042927530923">No se ejecutó la rutina</translation> +<translation id="4378551569595875038">Conectando…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mi unidad</translation> <translation id="4429881212383817840">El ticket de Kerberos caducará pronto</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">el protocolo de seguridad Wi-Fi es desconocido</translation> <translation id="65587193855025101">Cristal del escáner</translation> <translation id="6564646048574748301">Error: No se puede acceder a la impresora</translation> +<translation id="6603230386432466813">¿Tienes problemas para conectarte?</translation> <translation id="6618744767048954150">En ejecución</translation> <translation id="6620487321149975369">Los trabajos de impresión aparecerán en el historial, a menos que se quiten manualmente</translation> <translation id="6643016212128521049">Borrar</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index b9c6001..eefc6a9 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Sin conexión a Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Estado de la activación</translation> +<translation id="2294675138977897428">No se ha detectado ninguna conexión Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> PPP</translation> <translation id="2338501278241028356">Activa el Bluetooth para encontrar dispositivos cercanos</translation> <translation id="2364498172489649528">Aprobado</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Detenido: error desconocido</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imágenes</translation> <translation id="4378373042927530923">Sin ejecutar</translation> +<translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mi unidad</translation> <translation id="4429881212383817840">El ticket de Kerberos caducará pronto</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">Protocolo de seguridad Wi-Fi desconocido</translation> <translation id="65587193855025101">Escáner de superficie plana</translation> <translation id="6564646048574748301">No se ha podido imprimir - Impresora inaccesible</translation> +<translation id="6603230386432466813">¿No puedes conectarte?</translation> <translation id="6618744767048954150">En curso</translation> <translation id="6620487321149975369">Los trabajos de impresión aparecerán en el historial a menos que se quiten de forma manual</translation> <translation id="6643016212128521049">Borrar</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 551b1aed..cedfa0c 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">Peatatud – tundmatu viga</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> pilti</translation> <translation id="4378373042927530923">Ei käitatud</translation> +<translation id="4378551569595875038">Ühendamine ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Minu ketas</translation> <translation id="4429881212383817840">Kerberose pilet aegub peagi</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index 51cee06..cf8d177e 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Ez dago Interneteko konexiorik</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktibazioaren egoera</translation> +<translation id="2294675138977897428">Ez da hauteman Ethernet-eko konexiorik</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Inguruko gailuak ikusteko, aktibatu Bluetooth-a</translation> <translation id="2364498172489649528">Gaindituta</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Geldituta: errore ezezaguna</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> irudi</translation> <translation id="4378373042927530923">Ez da exekutatu</translation> +<translation id="4378551569595875038">Konektatzen…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Nire unitatea</translation> <translation id="4429881212383817840">Laster iraungiko da Kerberos-eko zerbitzu-eskaera</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Wifiaren segurtasun-protokoloa ezezaguna da</translation> <translation id="65587193855025101">Eskaner horizontala</translation> <translation id="6564646048574748301">Hutsegitea - Inprimagailua ez da aurkitu</translation> +<translation id="6603230386432466813">Arazoak dituzu konektatzeko?</translation> <translation id="6618744767048954150">Abian</translation> <translation id="6620487321149975369">Inprimatze-lanak historian agertuko dira, eskuz kendu ezean</translation> <translation id="6643016212128521049">Garbitu</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 87b5b7f..9059378 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">اتصال اینترنت وجود ندارد</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">وضعیت فعالسازی</translation> +<translation id="2294675138977897428">اتصال اترنتی شناسایی نشد</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> نقطه در اینچ</translation> <translation id="2338501278241028356">برای کاوش دستگاههای همین اطراف، بلوتوث را روشن کنید</translation> <translation id="2364498172489649528">موفق</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">متوقف شد - خطای نامشخص</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> تصویر</translation> <translation id="4378373042927530923">اجرا نشد</translation> +<translation id="4378551569595875038">در حال اتصال..</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">بلیت Kerberos بهزودی منقضی میشود</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">پروتکل امنیتی Wi-Fi ناشناس است</translation> <translation id="65587193855025101">صفحه مسطح</translation> <translation id="6564646048574748301">انجام نشد - دسترسی به چاپگر ممکن نیست</translation> +<translation id="6603230386432466813">هنگام متصل شدن با مشکل روبهرو هستید؟</translation> <translation id="6618744767048954150">درحال اجرا</translation> <translation id="6620487321149975369">کارهای چاپ تا زمانیکه بهطور دستی برداشته نشوند در سابقه نشان داده میشوند</translation> <translation id="6643016212128521049">پاک کردن</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 63e7509..a18c8ed7 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Ei internetyhteyttä</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktivoinnin tila</translation> +<translation id="2294675138977897428">Ethernet-yhteyttä ei havaittu</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Löydä lähellä olevat laitteet ottamalla ensin Bluetooth käyttöön.</translation> <translation id="2364498172489649528">Onnistui</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Pysähtynyt – Tuntematon virhe</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> kuvaa</translation> <translation id="4378373042927530923">Ei suoritettu</translation> +<translation id="4378551569595875038">Yhdistetään…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Oma Drive</translation> <translation id="4429881212383817840">Kerberos-tukipyyntö vanhenee pian</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Tuntematon Wi-Fi-suojausprotokolla</translation> <translation id="65587193855025101">Tasoskanneri</translation> <translation id="6564646048574748301">Epäonnistui – Ei yhteyttä tulostimeen</translation> +<translation id="6603230386432466813">Eikö yhdistäminen onnistu?</translation> <translation id="6618744767048954150">Käynnissä</translation> <translation id="6620487321149975369">Tulostustyöt näkyvät historiassa, ellei niitä poisteta manuaalisesti</translation> <translation id="6643016212128521049">Tyhjennä</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 644bd3d..08e2048 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Walang internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Status ng pag-activate</translation> +<translation id="2294675138977897428">Walang nakitang koneksyon sa Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">I-on ang Bluetooth upang tuklasin ang mga kalapit na device</translation> <translation id="2364498172489649528">Nakapasa</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Huminto - Hindi kilalang error</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Larawan</translation> <translation id="4378373042927530923">Hindi Tumakbo</translation> +<translation id="4378551569595875038">Kumokonekta...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Aking Drive</translation> <translation id="4429881212383817840">Mag-e-expire na ang ticket ng Kerberos</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Hindi alam na panseguridad na protocol ng WiFi</translation> <translation id="65587193855025101">Flatbed</translation> <translation id="6564646048574748301">Hindi na-print - Hindi makakonekta sa printer</translation> +<translation id="6603230386432466813">Nagkakaproblema sa pagkonekta?</translation> <translation id="6618744767048954150">Tumatakbo</translation> <translation id="6620487321149975369">Lalabas sa history ang mga pag-print maliban na lang kung manual na aalisin ang mga ito</translation> <translation id="6643016212128521049">I-clear</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index cdd9fafc..087dcfed 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Aucune connexion Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">État de l'activation</translation> +<translation id="2294675138977897428">Aucune connexion Ethernet détectée</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> ppp</translation> <translation id="2338501278241028356">Activer le Bluetooth pour découvrir les appareils à proximité</translation> <translation id="2364498172489649528">Vérification réussie</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Tâche arrêtée : erreur inconnue</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation> <translation id="4378373042927530923">Routine non exécutée</translation> +<translation id="4378551569595875038">Connexion...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mon disque</translation> <translation id="4429881212383817840">Le ticket Kerberos expire bientôt</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protocole de sécurité Wi-Fi inconnu</translation> <translation id="65587193855025101">À plat</translation> <translation id="6564646048574748301">Échec : imprimante inaccessible</translation> +<translation id="6603230386432466813">Vous éprouvez des problèmes de connexion?</translation> <translation id="6618744767048954150">En cours…</translation> <translation id="6620487321149975369">Les tâches d'impression s'afficheront dans l'historique, sauf si vous les retirez manuellement</translation> <translation id="6643016212128521049">Effacer</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 44e92a6..8a3d4fd 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -127,7 +127,7 @@ <translation id="3865414814144988605">Résolution</translation> <translation id="387301095347517405">Nombre de cycles de charge complets effectués sur votre batterie</translation> <translation id="3941014780699102620">Impossible de résoudre l'hôte</translation> -<translation id="3942420633017001071">Diagnostics</translation> +<translation id="3942420633017001071">Diagnostic</translation> <translation id="3967822245660637423">Téléchargement terminé</translation> <translation id="397105322502079400">Calcul en cours…</translation> <translation id="39823212440917567">Les tâches d'impression de plus de <ph name="NUMBER_OF_DAYS" /> jours seront supprimées</translation> @@ -144,6 +144,7 @@ <translation id="4297501883039923494">Tâche suspendue - Erreur inconnue</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation> <translation id="4378373042927530923">Routine non exécutée</translation> +<translation id="4378551569595875038">Connexion</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mon Drive</translation> <translation id="4429881212383817840">Le ticket Kerberos arrive bientôt à expiration</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index 793c8f7..907ca2b 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">Detívose (produciuse un erro descoñecido)</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imaxes</translation> <translation id="4378373042927530923">Non se executou</translation> +<translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">A miña unidade</translation> <translation id="4429881212383817840">O tícket de Kerberos caduca pronto</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 7a18d59..4c22f4b 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">બંધ - અજાણી ભૂલ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> છબીઓ</translation> <translation id="4378373042927530923">ચલાવ્યું નથી</translation> +<translation id="4378551569595875038">કનેક્ટિંગ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">મારી ડ્રાઇવ</translation> <translation id="4429881212383817840">ટૂંક સમયમાં Kerberos ટિકિટની સમયસીમા સમાપ્ત થશે</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 7e636d3..46cc7d2 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">इंटरनेट कनेक्शन नहीं है</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">सक्रियण की स्थिति</translation> +<translation id="2294675138977897428">किसी ईथरनेट कनेक्शन की पहचान नहीं हो पाई</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> डीपीआई</translation> <translation id="2338501278241028356">आस-पास के डिवाइस खोजने के लिए ब्लूटूथ चालू करें</translation> <translation id="2364498172489649528">जांच में पास</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">बंद हो गया - अज्ञात गड़बड़ी</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> इमेज</translation> <translation id="4378373042927530923">चल नहीं पाया</translation> +<translation id="4378551569595875038">कनेक्टिंग...</translation> <translation id="4382484599443659549">पीडीएफ़</translation> <translation id="4425149324548788773">मेरी डिस्क</translation> <translation id="4429881212383817840">Kerberos टिकट की समयसीमा जल्द ही खत्म होने वाली है</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">इस वाई-फ़ाई सुरक्षा प्रोटोकॉल की जानकारी नहीं है</translation> <translation id="65587193855025101">फ़्लैटबेड</translation> <translation id="6564646048574748301">प्रिंट नहीं हो पाया - प्रिंटर से कनेक्ट नहीं हो पा रहा है</translation> +<translation id="6603230386432466813">क्या आपको ईथरनेट कनेक्शन से जुड़ने में समस्या हो रही है?</translation> <translation id="6618744767048954150">जांच चल रही है</translation> <translation id="6620487321149975369">प्रिंट की गई फ़ाइलें तब तक इतिहास में दिखेंगी, जब तक इन्हें मैन्युअल तरीके से हटा नहीं दिया जाता</translation> <translation id="6643016212128521049">साफ़ करें</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 5eb0dafe..26a0849 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">Zaustavljeno – nepoznata pogreška</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> slika/slike</translation> <translation id="4378373042927530923">Nije pokrenuto</translation> +<translation id="4378551569595875038">Povezivanje...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4429881212383817840">Kerberosov tiket uskoro istječe</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index c2b105f8..a97a59a 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nincs internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktiválás állapota</translation> +<translation id="2294675138977897428">Nincs észlelhető Ethernet-kapcsolat</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Kapcsolja be a Bluetooth-t a közeli eszközök felfedezéséhez</translation> <translation id="2364498172489649528">Sikeres ellenőrzés</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Leállt – Ismeretlen hiba</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> kép</translation> <translation id="4378373042927530923">Nem fut</translation> +<translation id="4378551569595875038">Kapcsolódás…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Saját meghajtó</translation> <translation id="4429881212383817840">A Kerberos-jegy hamarosan lejár</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Ismeretlen Wi-Fi biztonsági protokoll</translation> <translation id="65587193855025101">Síkágy</translation> <translation id="6564646048574748301">Sikertelen – Nem lehet hozzáférni a nyomtatóhoz</translation> +<translation id="6603230386432466813">Problémába ütközött a kapcsolódás során?</translation> <translation id="6618744767048954150">Ellenőrzés folyamatban</translation> <translation id="6620487321149975369">A nyomtatási feladatok láthatók az előzmények között, ha nem távolítják el őket manuálisan</translation> <translation id="6643016212128521049">Törlés</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb index 95174023..6cfe01d 100644 --- a/chromeos/strings/chromeos_strings_hy.xtb +++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Ինտերնետ կապ չկա</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Ակտիվացման կարգավիճակը</translation> +<translation id="2294675138977897428">Ethernet միացում չի հայտնաբերվել</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Մոտակա սարքերը գտնելու համար միացրեք Bluetooth-ը</translation> <translation id="2364498172489649528">Անցել է ստուգում</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Դադարեցվել է – Անհայտ սխալ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> պատկեր</translation> <translation id="4378373042927530923">Չի գործարկվել</translation> +<translation id="4378551569595875038">Միացում…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Իմ դրայվը</translation> <translation id="4429881212383817840">Kerberos տոմսի գործողության ժամկետը շուտով կսպառվի</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Wi-Fi-ի անվտանգության անհայտ հաղորդակարգ</translation> <translation id="65587193855025101">Պլանշետային</translation> <translation id="6564646048574748301">Չհաջողվեց տպել – Տպիչն անհասանելի է</translation> +<translation id="6603230386432466813">Չի՞ հաջողվում միանալ</translation> <translation id="6618744767048954150">Ստուգումն ընթացքում է</translation> <translation id="6620487321149975369">Տպելու առաջադրանքները կցուցադրվեն պատմության մեջ, եթե դրանք ձեռքով չեն հեռացվել</translation> <translation id="6643016212128521049">Մաքրել</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index 82706a18..bab8e591 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Tidak ada internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Status aktivasi</translation> +<translation id="2294675138977897428">Koneksi Ethernet tidak terdeteksi</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Aktifkan Bluetooth untuk menemukan perangkat di sekitar</translation> <translation id="2364498172489649528">Lulus</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Dihentikan - Error tidak diketahui</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Gambar</translation> <translation id="4378373042927530923">Tidak Berjalan</translation> +<translation id="4378551569595875038">Menghubungkan...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Drive Saya</translation> <translation id="4429881212383817840">Masa berlaku tiket Kerberos segera berakhir</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protokol keamanan Wi-Fi tidak dikenal</translation> <translation id="65587193855025101">Flatbed</translation> <translation id="6564646048574748301">Gagal - Printer tidak dapat dijangkau</translation> +<translation id="6603230386432466813">Mengalami masalah saat menghubungkan?</translation> <translation id="6618744767048954150">Sedang berjalan</translation> <translation id="6620487321149975369">Tugas pencetakan akan muncul di histori, kecuali dihapus secara manual</translation> <translation id="6643016212128521049">Hapus</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb index e63fbd3..d7d9c61 100644 --- a/chromeos/strings/chromeos_strings_is.xtb +++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">Stöðvað – óþekkt villa</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> myndir</translation> <translation id="4378373042927530923">Ekki keyra</translation> +<translation id="4378551569595875038">Tengist...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Drifið mitt</translation> <translation id="4429881212383817840">Kerberos-miði rennur út fljótlega</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index ac4a5629..6e459da 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nessuna connessione a Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Stato attivazione</translation> +<translation id="2294675138977897428">Nessuna connessione Ethernet rilevata</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Attiva il Bluetooth per trovare dispositivi nelle vicinanze</translation> <translation id="2364498172489649528">Superato</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Operazione interrotta - Errore sconosciuto</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> immagini</translation> <translation id="4378373042927530923">Non eseguito</translation> +<translation id="4378551569595875038">Connessione...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">I miei file</translation> <translation id="4429881212383817840">La richiesta di Kerberos scade a breve</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">protocollo di sicurezza Wi-Fi sconosciuto</translation> <translation id="65587193855025101">Flatbed</translation> <translation id="6564646048574748301">Operazione non riuscita - Stampante non raggiungibile</translation> +<translation id="6603230386432466813">Hai problemi di connessione?</translation> <translation id="6618744767048954150">In corso</translation> <translation id="6620487321149975369">I processi di stampa verranno mostrati nella cronologia a meno che non vengano rimossi manualmente</translation> <translation id="6643016212128521049">Cancella</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 1d33c16b3..e649d37 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">אין אינטרנט</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">סטטוס הפעלה</translation> +<translation id="2294675138977897428">לא זוהה חיבור אתרנט</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">יש להפעיל את Bluetooth כדי לאתר מכשירים קרובים</translation> <translation id="2364498172489649528">הילד או הילדה עברו את הבדיקה בהצלחה</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">הפסיקה – שגיאה לא ידועה</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> תמונות</translation> <translation id="4378373042927530923">לא הופעל</translation> +<translation id="4378551569595875038">התחברות...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">האחסון שלי</translation> <translation id="4429881212383817840">התוקף של כרטיס Kerberos עומד לפוג בקרוב</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">פרוטוקול אבטחת Wi-Fi לא מזוהה</translation> <translation id="65587193855025101">שטוח</translation> <translation id="6564646048574748301">נכשלה – לא ניתן להתחבר אל המדפסת</translation> +<translation id="6603230386432466813">נתקלת בקשיים בהתחברות?</translation> <translation id="6618744767048954150">הבדיקה מתבצעת עכשיו</translation> <translation id="6620487321149975369">משימות הדפסה יופיעו תחת היסטוריה אלא אם הן הוסרו ידנית</translation> <translation id="6643016212128521049">ניקוי</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 69d412a..521bd723 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">インターネットに接続されていません</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">起動状態</translation> +<translation id="2294675138977897428">イーサネット接続がありません</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">近くのデバイスを検出するには Bluetooth をオンにしてください</translation> <translation id="2364498172489649528">成功</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">停止 - 不明なエラー</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> 件の画像</translation> <translation id="4378373042927530923">未実行</translation> +<translation id="4378551569595875038">接続中...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">マイドライブ</translation> <translation id="4429881212383817840">Kerberos チケットはまもなく有効期限が切れます</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Wi-Fi のセキュリティ プロトコルが不明です</translation> <translation id="65587193855025101">フラットベッド</translation> <translation id="6564646048574748301">失敗 - プリンタにアクセスできません</translation> +<translation id="6603230386432466813">接続できない場合</translation> <translation id="6618744767048954150">実行中</translation> <translation id="6620487321149975369">印刷ジョブは、手動で削除するまで履歴に表示されます</translation> <translation id="6643016212128521049">削除</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index 30bf8e4..44976c7 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">ინტერნეტ-კავშირი არ არის</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">აქტივაციის სტატუსი</translation> +<translation id="2294675138977897428">Ethernet-კავშირი აღმოჩენილი არ არის</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">ახლომდებარე მოწყობილობების საპოვნელად ჩართეთ Bluetooth</translation> <translation id="2364498172489649528">გავლილია</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">გაჩერდა — უცნობი შეცდომა</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> სურათი</translation> <translation id="4378373042927530923">არ არის გაშვებული</translation> +<translation id="4378551569595875038">დაკავშირება…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">ჩემი Drive</translation> <translation id="4429881212383817840">Kerberos ბილეთის მოქმედების ვადა მალე იწურება</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Wi-Fi-ს უცნობი უსაფრთხოების პროტოკოლი</translation> <translation id="65587193855025101">ბაქანი</translation> <translation id="6564646048574748301">ვერ მოხერხდა — პრინტერთან დაკავშირება ვერ ხერხდება</translation> +<translation id="6603230386432466813">პრობლემა გაქვთ დაკავშირებასთან?</translation> <translation id="6618744767048954150">მიმდინარეობს</translation> <translation id="6620487321149975369">ბეჭდვის დავალებები გამოჩნდება ისტორიაში, თუ მათ ხელით არ ამოშლით</translation> <translation id="6643016212128521049">გასუფთავება</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 7f7fde1a..5284a4a0 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Интернет жоқ</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Белсендіру күйі</translation> +<translation id="2294675138977897428">Ethernet байланысы анықталмады</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> нүкте/дюйм</translation> <translation id="2338501278241028356">Маңайдағы құрылғыларды табу үшін Bluetooth функциясын қосыңыз</translation> <translation id="2364498172489649528">Сынақтан өтті</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Тоқтатылды: белгісіз қате</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> сурет</translation> <translation id="4378373042927530923">Іске қосылмаған</translation> +<translation id="4378551569595875038">Қосылуда…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Менің Drive дискім</translation> <translation id="4429881212383817840">Kerberos билетінің жарамдылық мерзімі жақында аяқталады</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">WiFi қауіпсіздік протоколы белгісіз.</translation> <translation id="65587193855025101">Планшет</translation> <translation id="6564646048574748301">Сәтсіз: принтер қолжетімді емес</translation> +<translation id="6603230386432466813">Байланыс орнату кезінде қиындық туындады ма?</translation> <translation id="6618744767048954150">Жұмыс істеп тұр</translation> <translation id="6620487321149975369">Қолмен өшірмесеңіз, баспа жұмыстары тарихта сақтала береді.</translation> <translation id="6643016212128521049">Тазалау</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index f3e36ee..39454802 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">គ្មានអ៊ីនធឺណិតទេ</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">ស្ថានភាពនៃការធ្វើឲ្យសកម្ម</translation> +<translation id="2294675138977897428">រកមិនឃើញការតភ្ជាប់អ៊ីសឺរណិតទេ</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">បើកប៊្លូធូសដើម្បីស្វែងរកឧបករណ៍ដែលនៅជិត</translation> <translation id="2364498172489649528">ជាប់</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">បានឈប់ - មានបញ្ហាដែលមិនស្គាល់</translation> <translation id="4300073214558989">រូបភាព <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">មិនដំណើរការទេ</translation> +<translation id="4378551569595875038">កំពុងភ្ជាប់...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">ដ្រាយរបស់ខ្ញុំ</translation> <translation id="4429881212383817840">សំបុត្រ Kerberos ជិតផុតកំណត់ហើយ</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">មិនស្គាល់ប្រូតូកូលសុវត្ថិភាព WiFi</translation> <translation id="65587193855025101">ផ្ទៃកញ្ចក់</translation> <translation id="6564646048574748301">មិនបានសម្រេច - មិនអាចភ្ជាប់ម៉ាស៊ីនបោះពុម្ពបាន</translation> +<translation id="6603230386432466813">មានបញ្ហាក្នុងការភ្ជាប់មែនទេ?</translation> <translation id="6618744767048954150">កំពុងដំណើរការ</translation> <translation id="6620487321149975369">កិច្ចការបោះពុម្ពនឹងបង្ហាញនៅក្នុងប្រវត្តិ ប្រសិនបើអ្នកមិនលុបវាដោយដៃទេ</translation> <translation id="6643016212128521049">ជម្រះ</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 5cdb1be..ff1adc07 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">ನಿಲ್ಲಿಸಲಾಗಿದೆ - ಅಪರಿಚಿತ ದೋಷ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ಚಿತ್ರಗಳು</translation> <translation id="4378373042927530923">ರನ್ ಆಗಲಿಲ್ಲ</translation> +<translation id="4378551569595875038">ಕನೆಕ್ಟ್...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">ನನ್ನ ಡ್ರೈವ್</translation> <translation id="4429881212383817840">Kerberos ಟಿಕೆಟ್ ಶೀಘ್ರದಲ್ಲೇ ಅವಧಿ ಮೀರಲಿದೆ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 938d4cf..c4f8d0c2 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">인터넷 연결 없음</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">활성화 상태</translation> +<translation id="2294675138977897428">감지된 이더넷 연결 없음</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" />dpi</translation> <translation id="2338501278241028356">블루투스를 사용 설정하여 근처 기기 탐색</translation> <translation id="2364498172489649528">통과</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">중지됨 - 알 수 없는 오류</translation> <translation id="4300073214558989">이미지 <ph name="IMAGE_COUNT" />개</translation> <translation id="4378373042927530923">실행되지 않음</translation> +<translation id="4378551569595875038">연결 중...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">내 드라이브</translation> <translation id="4429881212383817840">Kerberos 티켓이 곧 만료됨</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">알려지지 않은 Wi-Fi 보안 프로토콜입니다.</translation> <translation id="65587193855025101">평판</translation> <translation id="6564646048574748301">실패 - 프린터에 연결할 수 없음</translation> +<translation id="6603230386432466813">연결하는 데 문제가 있나요?</translation> <translation id="6618744767048954150">실행 중</translation> <translation id="6620487321149975369">수동으로 삭제하지 않으면 인쇄 작업이 기록에 나타납니다.</translation> <translation id="6643016212128521049">삭제</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index 15a0974..171716d7 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Интернет жок</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Жандыруу абалы</translation> +<translation id="2294675138977897428">Ethernet байланышы табылган жок</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Жакын жердеги түзмөктөрдү табуу үчүн Bluetooth'ду күйгүзүңүз</translation> <translation id="2364498172489649528">Текшерүүдөн өттү</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Токтоду – Белгисиз ката</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> сүрөт</translation> <translation id="4378373042927530923">Иштетилген жок</translation> +<translation id="4378551569595875038">Туташууда…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Менин Drive'ым</translation> <translation id="4429881212383817840">Kerberos билетинин мөөнөтү өтүп баратат</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Белгисиз WiFi коопсуздук протоколу</translation> <translation id="65587193855025101">Планшет</translation> <translation id="6564646048574748301">Басылып чыгарылган жок - Принтер жеткиликсиз</translation> +<translation id="6603230386432466813">Туташа албай жатасызбы?</translation> <translation id="6618744767048954150">Иштеп жатат</translation> <translation id="6620487321149975369">Басып чыгаруу тапшырмаларын кол менен өчүрмөйүнчө, алар таржымалда сакталат</translation> <translation id="6643016212128521049">Тазалоо</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 0048d420..6581f518 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">ບໍ່ມີອິນເຕີເນັດ</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">ສະຖານະການເປີດນຳໃຊ້</translation> +<translation id="2294675138977897428">ບໍ່ພົບການເຊື່ອມຕໍ່ອີເທີເນັດ</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">ເປີດ Bluetooth ເພື່ອຊອກຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ</translation> <translation id="2364498172489649528">ຜ່ານແລ້ວ</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">ຢຸດພິມ, ບໍ່ຮູ້ຈັກຂໍ້ຜິດພາດ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ຮູບ</translation> <translation id="4378373042927530923">ບໍ່ໄດ້ເອີ້ນໃຊ້</translation> +<translation id="4378551569595875038">ກໍາລັງເຊື່ອມຕໍ່ ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">ປີ້ Kerberos ຈະໝົດອາຍຸໃນໄວໆນີ້</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">ໂປຣໂຕຄໍຮັກສາຄວາມປອດໄພ WiFi ທີ່ບໍ່ຮູ້ຈັກ</translation> <translation id="65587193855025101">ແບບແທ່ນນອນ</translation> <translation id="6564646048574748301">ບໍ່ສຳເລັດ, ບໍ່ສາມາດຕິດຕໍ່ເຄື່ອງພິມໄດ້</translation> +<translation id="6603230386432466813">ກຳລັງມີບັນຫາໃນການເຊື່ອມຕໍ່ບໍ?</translation> <translation id="6618744767048954150">ກຳລັງເປີດ</translation> <translation id="6620487321149975369">ວຽກພິມຈະປາກົດໃນປະຫວັດ ເວັ້ນເສຍແຕ່ຜູ້ໃຊ້ຈະລຶບພວກມັນອອກດ້ວຍຕົນເອງ</translation> <translation id="6643016212128521049">ລຶບ</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 7039177..b7b7cac 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nėra interneto ryšio</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktyvinimo būsena</translation> +<translation id="2294675138977897428">Nėra eterneto ryšio</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> tšk./col.</translation> <translation id="2338501278241028356">Įjunkite „Bluetooth“, kad aptiktumėte įrenginius netoliese</translation> <translation id="2364498172489649528">Pavyko</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Sustabdyta – nežinoma klaida</translation> <translation id="4300073214558989">Vaizdų: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Nevykdyti</translation> +<translation id="4378551569595875038">Jungiamasi...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mano Diskas</translation> <translation id="4429881212383817840">„Kerberos“ bilietas netrukus baigs galioti</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Nežinomas „Wi-Fi“ saugos protokolas</translation> <translation id="65587193855025101">Plokščiasis</translation> <translation id="6564646048574748301">Nepavyko – spausdintuvas nepasiekiamas</translation> +<translation id="6603230386432466813">Kyla sunkumų prisijungiant?</translation> <translation id="6618744767048954150">Vykdoma</translation> <translation id="6620487321149975369">Spausdinimo užduotys bus rodomos istorijoje, nebent bus pašalintos neautomatiškai</translation> <translation id="6643016212128521049">Išvalyti</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index eddb384..7d0149c 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nav interneta savienojuma</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktivizācijas statuss</translation> +<translation id="2294675138977897428">Savienojums ar tīklu Ethernet netika atrasts</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Ieslēdziet Bluetooth, lai atklātu tuvumā esošas ierīces</translation> <translation id="2364498172489649528">Pārbaude izpildīta</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Apturēts — nezināma kļūda</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> attēls(-i)</translation> <translation id="4378373042927530923">Nav veikta izpilde</translation> +<translation id="4378551569595875038">Pievienojas...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mans disks</translation> <translation id="4429881212383817840">Kerberos biļetes termiņš drīz beigsies</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Nezināms Wi-Fi drošības protokols</translation> <translation id="65587193855025101">Plakanvirsma</translation> <translation id="6564646048574748301">Neizdevās — printeris nav sasniedzams</translation> +<translation id="6603230386432466813">Vai neizdodas izveidot savienojumu?</translation> <translation id="6618744767048954150">Notiek pārbaude</translation> <translation id="6620487321149975369">Drukas uzdevumi būs redzami vēsturē, ja vien tie netiks noņemti manuāli</translation> <translation id="6643016212128521049">Notīrīt</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index 8c838046..49371db 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Нема интернет</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Статус на активирање</translation> +<translation id="2294675138977897428">Не откривме етернет-врска</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Вклучете Bluetooth за да откриете места во близина</translation> <translation id="2364498172489649528">Помина</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Запрено - непозната грешка</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> слики</translation> <translation id="4378373042927530923">Не е извршена</translation> +<translation id="4378551569595875038">Се поврзува…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Мојот Drive</translation> <translation id="4429881212383817840">Билетот на Kerberos истекува наскоро</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Непознат безбедносен протокол за Wi-Fi</translation> <translation id="65587193855025101">Со рамна плоча</translation> <translation id="6564646048574748301">Неуспешно - печатачот е недостапен</translation> +<translation id="6603230386432466813">Имате ли проблем при поврзувањето?</translation> <translation id="6618744767048954150">Се извршува</translation> <translation id="6620487321149975369">Задачите за печатење ќе се појавуваат во историјата, освен ако не се отстранат рачно</translation> <translation id="6643016212128521049">Исчисти</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 5a8feb5..3e6c0c6 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">പ്രിന്റ് ജോലി നിർത്തി - അജ്ഞാതമായ പിശക്</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ചിത്രങ്ങൾ</translation> <translation id="4378373042927530923">റൺ ചെയ്തിട്ടില്ല</translation> +<translation id="4378551569595875038">കണക്റ്റിംഗ്...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">എന്റെ ഡ്രൈവ്</translation> <translation id="4429881212383817840">Kerberos ടിക്കറ്റ് ഉടൻ കാലഹരണപ്പെടും</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index e417842..7a715fc 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">Зогссон - Тодорхойгүй алдаа</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> зураг</translation> <translation id="4378373042927530923">Ажилдаггүй</translation> +<translation id="4378551569595875038">Холбож байна...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Миний Драйв</translation> <translation id="4429881212383817840">Kerberos тасалбарын хугацаа удахгүй дуусна</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index a529034..043624d 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">थांबले - अज्ञात एरर</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> इमेज</translation> <translation id="4378373042927530923">रन झाले नाही</translation> +<translation id="4378551569595875038">कनेक्ट होतय...</translation> <translation id="4382484599443659549">पीडीएफ</translation> <translation id="4425149324548788773">माझा ड्राइव्ह</translation> <translation id="4429881212383817840">Kerberos तिकीट लवकरच एक्स्पायर होईल</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index aed5524..1ac202b 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Tiada Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Status pengaktifan</translation> +<translation id="2294675138977897428">Tiada sambungan Ethernet dikesan</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Hidupkan Bluetooth untuk menemui peranti berdekatan</translation> <translation id="2364498172489649528">Lulus</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Dihentikan - Ralat tidak diketahui</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Imej</translation> <translation id="4378373042927530923">Tidak Berjalan</translation> +<translation id="4378551569595875038">Menyambung...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Drive Saya</translation> <translation id="4429881212383817840">Tiket Kerberos akan tamat tempoh tidak lama lagi</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protokol keselamatan Wi-Fi tidak diketahui</translation> <translation id="65587193855025101">Dasar rata</translation> <translation id="6564646048574748301">Gagal - Pencetak tidak dapat dicapai</translation> +<translation id="6603230386432466813">Ada masalah membuat sambungan?</translation> <translation id="6618744767048954150">Berjalan</translation> <translation id="6620487321149975369">Tugas cetak akan dipaparkan dalam sejarah melainkan dialih keluar secara manual</translation> <translation id="6643016212128521049">Kosongkan</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index 5561113..a7e3967 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">အင်တာနက် မရှိပါ</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">စဖွင့်ခြင်း အခြေအနေ</translation> +<translation id="2294675138977897428">အီသာနက်ချိတ်ဆက်မှု မတွေ့ပါ</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">အနီးတဝိုက်ရှိ စက်ပစ္စည်းများကို ရှာဖွေရန် ဘလူးတုသ်ကို ဖွင့်ပါ</translation> <translation id="2364498172489649528">အောင်မြင်သည်</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">ရပ်သွားသည် - အမည်မသိ အမှား</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ပုံ</translation> <translation id="4378373042927530923">မလုပ်ဆောင်ပါ</translation> +<translation id="4378551569595875038">ချိတ်ဆက်ရန်...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">Kerberos လက်မှတ်သည် မကြာမီ သက်တမ်းကုန်ပါတော့မည်</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">အမည်မသိ WiFi လုံခြုံရေးပရိုတိုကော</translation> <translation id="65587193855025101">ပက်လက်တင်ရန်ဗန်း</translation> <translation id="6564646048574748301">မအောင်မြင်ပါ - ပရင်တာကို ဆက်သွယ်၍မရပါ</translation> +<translation id="6603230386432466813">ချိတ်ဆက်ရာတွင် ပြဿနာရှိသလား။</translation> <translation id="6618744767048954150">လုပ်ဆောင်နေသည်</translation> <translation id="6620487321149975369">ပရင့်ထုတ်ရန်ဖိုင်များကို ကိုယ်တိုင်မဖယ်ရှားပါက မှတ်တမ်းတွင် ပြပါမည်</translation> <translation id="6643016212128521049">ရှင်းရန်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index b1bf181..f778615 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">इन्टरनेट छैन</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">सक्रियताको वस्तुस्थिति</translation> +<translation id="2294675138977897428">कुनै पनि इथरनेट कनेक्सन भेटिएन</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">नजिकैका डिभाइसहरू पत्ता लगाउन ब्लुटुथ अन गर्नुहोस्</translation> <translation id="2364498172489649528">सुरक्षा जाँचमा पास भयो</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">रोकियो - अज्ञात त्रुटि भयो</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> वटा फोटो</translation> <translation id="4378373042927530923">चलेन</translation> +<translation id="4378551569595875038">जडान गर्दै...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">मेरो ड्राइभ</translation> <translation id="4429881212383817840">Kerberos टिकटको म्याद चाँडै सकिँदै छ</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">अज्ञात WiFi सेक्युरिटी प्रोटोकोल</translation> <translation id="65587193855025101">फ्याल्टबेड</translation> <translation id="6564646048574748301">प्रिन्ट गर्न सकिएन - प्रिन्टरमा कनेक्ट भइरहेको छैन</translation> +<translation id="6603230386432466813">कनेक्ट गर्ने क्रममा समस्या भइरहेको छ?</translation> <translation id="6618744767048954150">जाँच हुँदै छ</translation> <translation id="6620487321149975369">तपाईंले प्रिन्टसम्बन्धी कार्यहरू नहटाउँदासम्म ती कार्यहरू इतिहासमा देखिने छन्</translation> <translation id="6643016212128521049">खालि गर्नुहोस्</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index bd8d7a9..0d61108 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">Gestopt: onbekende fout</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> afbeeldingen</translation> <translation id="4378373042927530923">Niet uitgevoerd</translation> +<translation id="4378551569595875038">Verbinden...</translation> <translation id="4382484599443659549">Pdf</translation> <translation id="4425149324548788773">Mijn Drive</translation> <translation id="4429881212383817840">Kerberos-ticket verloopt binnenkort</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index c0013e1..05b5515 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Ingen nettilkobling</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> +<translation id="2294675138977897428">Finner ingen Ethernet-tilkobling</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Slå på Bluetooth for å finne enheter i nærheten</translation> <translation id="2364498172489649528">Bestått</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Stoppet – ukjent feil</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> bilder</translation> <translation id="4378373042927530923">Ikke kjørt</translation> +<translation id="4378551569595875038">Kobler til …</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Min disk</translation> <translation id="4429881212383817840">Kerberos-saken utløper snart</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Ukjent Wi-Fi-sikkerhetsprotokoll</translation> <translation id="65587193855025101">Planskanner</translation> <translation id="6564646048574748301">Mislykket – skriveren kan ikke nås</translation> +<translation id="6603230386432466813">Har du problemer med å koble til?</translation> <translation id="6618744767048954150">Kjører</translation> <translation id="6620487321149975369">Utskriftsjobber vises i loggen med mindre de fjernes manuelt</translation> <translation id="6643016212128521049">Tøm</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb index 51cb5d3..84437fee 100644 --- a/chromeos/strings/chromeos_strings_or.xtb +++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">ବନ୍ଦ ହୋଇଯାଇଛି - ଅଜଣା ତ୍ରୁଟି</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" />ଟି ଛବି</translation> <translation id="4378373042927530923">ଚାଲୁନାହିଁ</translation> +<translation id="4378551569595875038">ସଂଯୋଗ କରୁଛି...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">ମୋ ଡ୍ରାଇଭ୍</translation> <translation id="4429881212383817840">Kerberos ଟିକେଟ୍ର ମିଆଦ ଶୀଘ୍ର ଶେଷ ହୋଇଯିବ</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 1aa28b6..2fd532ed 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">ਬੰਦ ਹੋ ਗਿਆ - ਅਗਿਆਤ ਗੜਬੜ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ਚਿੱਤਰ</translation> <translation id="4378373042927530923">ਨੈੱਟਵਰਕ ਤਸ਼ਖੀਸ ਨਹੀਂ ਚੱਲੀ</translation> +<translation id="4378551569595875038">ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">Kerberos ਟਿਕਟ ਦੀ ਮਿਆਦ ਜਲਦ ਹੀ ਮੁੱਕ ਜਾਵੇਗੀ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index 2f94b2c..ce3ab1c 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Brak internetu</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Stan aktywacji</translation> +<translation id="2294675138977897428">Nie wykryto połączenia z siecią Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Włącz Bluetooth, by wykryć urządzenia w pobliżu</translation> <translation id="2364498172489649528">Zaliczone</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Zatrzymano – nieznany błąd</translation> <translation id="4300073214558989">Obrazy: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Nie wykonano</translation> +<translation id="4378551569595875038">Łączę...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Mój dysk</translation> <translation id="4429881212383817840">Zgłoszenie Kerberos wkrótce straci ważność</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Nieznany protokół zabezpieczeń Wi-Fi</translation> <translation id="65587193855025101">Szyba</translation> <translation id="6564646048574748301">Niepowodzenie – drukarka jest nieosiągalna</translation> +<translation id="6603230386432466813">Masz kłopoty z nawiązaniem połączenia?</translation> <translation id="6618744767048954150">W toku</translation> <translation id="6620487321149975369">Zadania drukowania będą widoczne w historii, dopóki ich nie usuniesz</translation> <translation id="6643016212128521049">Wyczyść</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 4a6c652..ed46277 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Sem Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Status da ativação</translation> +<translation id="2294675138977897428">Nenhuma conexão Ethernet detectada</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Ativar o Bluetooth para descobrir dispositivos nas proximidades</translation> <translation id="2364498172489649528">Aprovado</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Parado (erro desconhecido)</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imagens</translation> <translation id="4378373042927530923">Não executada</translation> +<translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Meu Drive</translation> <translation id="4429881212383817840">O tíquete do Kerberos expirará em breve</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protocolo de segurança de Wi-Fi desconhecido</translation> <translation id="65587193855025101">Scanner de mesa</translation> <translation id="6564646048574748301">Falha - Impressora inacessível</translation> +<translation id="6603230386432466813">Problemas com a conexão?</translation> <translation id="6618744767048954150">Em execução</translation> <translation id="6620487321149975369">Os trabalhos de impressão aparecerão no histórico, a menos que sejam removidos manualmente</translation> <translation id="6643016212128521049">Limpar</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index 453f4bc..5d9f205 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Sem Internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Estado da ativação</translation> +<translation id="2294675138977897428">Nenhuma ligação Ethernet detetada</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> ppp</translation> <translation id="2338501278241028356">Ativar o Bluetooth para detetar dispositivos próximos</translation> <translation id="2364498172489649528">Aprovado</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Parada – Erro desconhecido</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imagens</translation> <translation id="4378373042927530923">Não foi executada.</translation> +<translation id="4378551569595875038">A ligar...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">O meu disco</translation> <translation id="4429881212383817840">A permissão Kerberos expira em breve</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protocolo de segurança de Wi-Fi desconhecido.</translation> <translation id="65587193855025101">Plano</translation> <translation id="6564646048574748301">Falha – Impressora inacessível</translation> +<translation id="6603230386432466813">Está a ter problemas com a ligação?</translation> <translation id="6618744767048954150">Em execução</translation> <translation id="6620487321149975369">As tarefas de impressão serão apresentadas no histórico, exceto se forem removidas manualmente.</translation> <translation id="6643016212128521049">Limpar</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 5b06fb3..a51037a 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nu există conexiune la internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Stare de activare</translation> +<translation id="2294675138977897428">Nu s-a detectat nicio conexiune la Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Pentru a descoperi dispozitivele din apropiere, activează Bluetooth</translation> <translation id="2364498172489649528">Reușită</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Oprită – Eroare necunoscută</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imagini</translation> <translation id="4378373042927530923">Nu a rulat</translation> +<translation id="4378551569595875038">Se conectează</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Contul meu Drive</translation> <translation id="4429881212383817840">Tichetul Kerberos expiră în curând</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Protocol de securitate Wi-Fi necunoscut</translation> <translation id="65587193855025101">Suport plat</translation> <translation id="6564646048574748301">Nereușită – Imprimanta nu poate fi accesată</translation> +<translation id="6603230386432466813">Ai întâmpinat probleme la conectare?</translation> <translation id="6618744767048954150">Rulează</translation> <translation id="6620487321149975369">Sarcinile de printare vor apărea în istoric dacă nu sunt eliminate manual</translation> <translation id="6643016212128521049">Șterge</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 945b139..ad2a1d3 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Нет подключения к Интернету</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Статус активации</translation> +<translation id="2294675138977897428">Нет подключения по сети Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Включите Bluetooth, чтобы найти устройства</translation> <translation id="2364498172489649528">Завершено</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Печать прервана: неизвестная ошибка</translation> <translation id="4300073214558989">Изображений: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Не проверено</translation> +<translation id="4378551569595875038">Подключение…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Мой диск</translation> <translation id="4429881212383817840">Срок действия билета Kerberos истекает</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Неизвестный протокол обеспечения безопасности сети Wi-Fi.</translation> <translation id="65587193855025101">Планшетный</translation> <translation id="6564646048574748301">Сбой: принтер недоступен</translation> +<translation id="6603230386432466813">Не удается подключиться?</translation> <translation id="6618744767048954150">Выполняется</translation> <translation id="6620487321149975369">Задания печати показываются в истории до тех пор, пока вы их не удалите</translation> <translation id="6643016212128521049">Удалить</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb index c7693dd..a455af05 100644 --- a/chromeos/strings/chromeos_strings_si.xtb +++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">නැවතිණි - නොදන්නා දෝෂයකි</translation> <translation id="4300073214558989">රූප <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">ධාවනය නොවේ</translation> +<translation id="4378551569595875038">සම්බන්ධ වෙමින්...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">මගේ Drive</translation> <translation id="4429881212383817840">Kerberos ප්රවේශපත්රය ඉක්මනින් කල් ඉකුත් වෙයි</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index b824ebc..229e93b9 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Bez internetu</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Stav aktivácie</translation> +<translation id="2294675138977897428">Nezistilo sa žiadne ethernetové pripojenie</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Ak chcete nájsť zariadenia v okolí, zapnite Bluetooth</translation> <translation id="2364498172489649528">Úspešné</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Zastavené – neznáma chyba</translation> <translation id="4300073214558989">Počet obrázkov: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Nebolo spustené</translation> +<translation id="4378551569595875038">Pripája sa...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Môj disk</translation> <translation id="4429881212383817840">Platnosť tiketu Kerberos čoskoro uplynie</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Neznámy protokol zabezpečenia siete Wi‑Fi</translation> <translation id="65587193855025101">Reflektívny skener</translation> <translation id="6564646048574748301">Nepodarilo sa – nedostupné</translation> +<translation id="6603230386432466813">Máte problémy s pripojením?</translation> <translation id="6618744767048954150">Beží</translation> <translation id="6620487321149975369">Tlačové úlohy sa budú zobrazovať v histórii, dokým ich neodstránite ručne</translation> <translation id="6643016212128521049">Vymazať</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 77e27d0a..6f1f459 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Ni internetne povezave</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Stanje aktiviranja</translation> +<translation id="2294675138977897428">Ethernetna povezava ni zaznana</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> pik na palec</translation> <translation id="2338501278241028356">Vklopite Bluetooth, če želite odkriti naprave v bližini</translation> <translation id="2364498172489649528">Preverjanje je uspelo</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Ustavljeno – neznana napaka</translation> <translation id="4300073214558989">Št. slik: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Ni se izvedlo</translation> +<translation id="4378551569595875038">Povezovanje …</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4429881212383817840">Kartonček za Kerberos kmalu poteče</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Neznani varnostni protokol za Wi-Fi</translation> <translation id="65587193855025101">Plosko</translation> <translation id="6564646048574748301">Napaka – tiskalnik je nedosegljiv</translation> +<translation id="6603230386432466813">Imate težave pri povezovanju?</translation> <translation id="6618744767048954150">Preverjanje poteka</translation> <translation id="6620487321149975369">Tiskalna opravila bodo prikazana v zgodovini, razen če jih ročno odstranite</translation> <translation id="6643016212128521049">Izbriši</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb index c4fdd85..441805f 100644 --- a/chromeos/strings/chromeos_strings_sq.xtb +++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">Ndaloi - Gabim i panjohur</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imazhe</translation> <translation id="4378373042927530923">Nuk u ekzekutua</translation> +<translation id="4378551569595875038">Po lidhet...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Disku im</translation> <translation id="4429881212383817840">Bileta e Kerberos skadon së shpejti</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 94fc3d36..e165b8b 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Nema interneta</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Status aktivacije</translation> +<translation id="2294675138977897428">Nije otkrivena eternet veza</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Uključite Bluetooth da biste otkrili uređaje u blizini</translation> <translation id="2364498172489649528">Prošlo</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Zaustavljeno – nepoznata greška</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> slika</translation> <translation id="4378373042927530923">Nije pokrenuto</translation> +<translation id="4378551569595875038">Povezuje se...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4429881212383817840">Kerberos tiket uskoro ističe</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Nepoznat bezbednosni protokol za WiFi</translation> <translation id="65587193855025101">Položeno</translation> <translation id="6564646048574748301">Nije uspelo – štampač nije dostupan</translation> +<translation id="6603230386432466813">Imate problema pri povezivanju?</translation> <translation id="6618744767048954150">U toku je</translation> <translation id="6620487321149975369">Zadaci štampanja će se pojaviti u istoriji ako ih ne uklonite ručno</translation> <translation id="6643016212128521049">Obriši</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index d2f772e5..38a2edf6 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Нема интернета</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Статус активације</translation> +<translation id="2294675138977897428">Није откривена етернет веза</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Укључите Bluetooth да бисте открили уређаје у близини</translation> <translation id="2364498172489649528">Прошло</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Заустављено – непозната грешка</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> слика</translation> <translation id="4378373042927530923">Није покренуто</translation> +<translation id="4378551569595875038">Повезује се...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Мој диск</translation> <translation id="4429881212383817840">Kerberos тикет ускоро истиче</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Непознат безбедносни протокол за WiFi</translation> <translation id="65587193855025101">Положено</translation> <translation id="6564646048574748301">Није успело – штампач није доступан</translation> +<translation id="6603230386432466813">Имате проблема при повезивању?</translation> <translation id="6618744767048954150">У току је</translation> <translation id="6620487321149975369">Задаци штампања ће се појавити у историји ако их не уклоните ручно</translation> <translation id="6643016212128521049">Обриши</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index ef75d166..375e1ef 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Inget internet</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> +<translation id="2294675138977897428">Ingen Ethernet-anslutning hittades</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Aktivera Bluetooth så att det går att upptäcka enheter i närheten</translation> <translation id="2364498172489649528">Godkänd</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Har stoppats – okänt fel</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> bilder</translation> <translation id="4378373042927530923">Har inte körts</translation> +<translation id="4378551569595875038">Ansluter ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Min enhet</translation> <translation id="4429881212383817840">Kerberos-biljetten upphör snart att gälla</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Okänt säkerhetsprotokoll för wifi</translation> <translation id="65587193855025101">Flatbädd</translation> <translation id="6564646048574748301">Misslyckades – skrivaren kan inte nås</translation> +<translation id="6603230386432466813">Går det inte att ansluta?</translation> <translation id="6618744767048954150">Körs</translation> <translation id="6620487321149975369">Utskriftsjobb visas i historiken såvida de inte tas bort manuellt</translation> <translation id="6643016212128521049">Rensa</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index 997f864..1918b2a 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Hakuna intaneti</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Hali ya kuwasha</translation> +<translation id="2294675138977897428">Muunganisho wa Ethaneti haujagunduliwa</translation> <translation id="2326139988748364651">Dpi <ph name="RESOLUTION_VALUE" /></translation> <translation id="2338501278241028356">Washa Bluetooth ili ugundue vifaa vilivyo karibu</translation> <translation id="2364498172489649528">Amefaulu</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Imesimama - Hitilafu isiyojulikana</translation> <translation id="4300073214558989">Picha <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Usitekeleze</translation> +<translation id="4378551569595875038">Inaunganisha...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Hifadhi Yangu</translation> <translation id="4429881212383817840">Muda wa kutumia tiketi ya Kerberos unakaribia kuisha</translation> @@ -277,6 +279,7 @@ <translation id="6527081081771465939">Itifaki isiyojulikana ya ulinzi wa WiFi</translation> <translation id="65587193855025101">Kichanganuzi bapa</translation> <translation id="6564646048574748301">Haijakamilika - Printa haiwezi kufikiwa</translation> +<translation id="6603230386432466813">Je, unatatizika kuunganisha?</translation> <translation id="6618744767048954150">Inakagua</translation> <translation id="6620487321149975369">Kazi za kuchapisha zitaonekana katika historia usipoziondoa mwenyewe</translation> <translation id="6643016212128521049">Futa</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index 6ed379c..075222e 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">அறியப்படாத பிழை காரணமாக அச்சிட முடியவில்லை</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> படங்கள்</translation> <translation id="4378373042927530923">இயங்கவில்லை</translation> +<translation id="4378551569595875038">இணைக்கிறது...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">எனது இயக்ககம்</translation> <translation id="4429881212383817840">Kerberos டிக்கெட் விரைவில் காலாவதியாகும்</translation> @@ -400,7 +401,7 @@ <translation id="9088306295921699330">தற்போதைய உபயோகம்</translation> <translation id="910415269708673980"><ph name="PRINCIPAL_NAME" /> வலைதளத்திற்கான டிக்கெட்டை ரெஃப்ரெஷ் செய்யவும்</translation> <translation id="9106415115617144481">ஸ்கேன் செய்யப்படும் பக்கம்: <ph name="PAGE_NUMBER" /></translation> -<translation id="9111102763498581341">பூட்டைத் திற</translation> +<translation id="9111102763498581341">அன்லாக் செய்</translation> <translation id="9137526406337347448">Google சேவைகள்</translation> <translation id="9149391708638971077">நினைவகச் சோதனையை இயக்கு</translation> <translation id="9173638680043580060">ஒரு நிமிடத்திற்கும் குறைவான நேரமே மீதமுள்ளது</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index 1fb1f42..a85d2d94 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">ఆగిపోయింది - తెలియని ఎర్రర్</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ఇమేజ్లు</translation> <translation id="4378373042927530923">రన్ కాలేదు</translation> +<translation id="4378551569595875038">కనెక్టింగ్...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">నా డిస్క్</translation> <translation id="4429881212383817840">Kerberos టిక్కెట్ గడువు త్వరలో ముగుస్తుంది</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 4267c31..5bc74e1 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">ไม่มีอินเทอร์เน็ต</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">สถานะการเปิดใช้งาน</translation> +<translation id="2294675138977897428">ไม่พบการเชื่อมต่ออีเทอร์เน็ต</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">เปิดบลูทูธเพื่อค้นหาอุปกรณ์ใกล้เคียง</translation> <translation id="2364498172489649528">ผ่าน</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">หยุดพิมพ์ - ข้อผิดพลาดที่ไม่รู้จัก</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ภาพ</translation> <translation id="4378373042927530923">ไม่ทำงาน</translation> +<translation id="4378551569595875038">กำลังเชื่อมต่อ</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">ไดรฟ์ของฉัน</translation> <translation id="4429881212383817840">ตั๋ว Kerberos กำลังจะหมดอายุ</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">โปรโตคอลรักษาความปลอดภัย WiFi ที่ไม่รู้จัก</translation> <translation id="65587193855025101">แผ่นกระจกสำหรับสแกน</translation> <translation id="6564646048574748301">ไม่สำเร็จ - เข้าถึงเครื่องพิมพ์ไม่ได้</translation> +<translation id="6603230386432466813">หากพบปัญหาในการเชื่อมต่อ</translation> <translation id="6618744767048954150">กำลังดำเนินการ</translation> <translation id="6620487321149975369">งานพิมพ์จะปรากฏในประวัติการพิมพ์ เว้นแต่จะมีผู้ใช้นำออกไปด้วยตนเอง</translation> <translation id="6643016212128521049">ล้าง</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index 37f0f414..4416bb3 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">İnternet bağlantısı yok</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Etkinleştirme durumu</translation> +<translation id="2294675138977897428">Ethernet bağlantısı algılanmadı</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Yakındaki cihazları keşfetmek için Bluetooth'u aç</translation> <translation id="2364498172489649528">Başarılı oldu</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Durduruldu - Bilinmeyen hata</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Resim</translation> <translation id="4378373042927530923">Çalıştırılmadı</translation> +<translation id="4378551569595875038">Bağlanıyor...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Drive'ım</translation> <translation id="4429881212383817840">Kerberos biletinin süresi yakında doluyor</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Bilinmeyen kablosuz ağ güvenlik protokolü</translation> <translation id="65587193855025101">Düz Yataklı</translation> <translation id="6564646048574748301">İşlem başarısız - Yazıcıya ulaşılamıyor</translation> +<translation id="6603230386432466813">Bağlanmayla ilgili sorun mu yaşıyorsunuz?</translation> <translation id="6618744767048954150">Çalışıyor</translation> <translation id="6620487321149975369">Yazdırma işleri, manuel olarak kaldırılmadığı sürece geçmişte görünür</translation> <translation id="6643016212128521049">Temizle</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index a7f243f..9e1ac94 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Немає Інтернету</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">Статус активації</translation> +<translation id="2294675138977897428">Не виявлено з’єднання Ethernet</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation> <translation id="2338501278241028356">Щоб знайти пристрої поблизу, увімкніть Bluetooth</translation> <translation id="2364498172489649528">Виконано</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Зупинено – невідома помилка</translation> <translation id="4300073214558989">Зображень: <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Не виконано</translation> +<translation id="4378551569595875038">Підключення…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Мій диск</translation> <translation id="4429881212383817840">Термін дії квитка Kerberos незабаром минає</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Невідомий протокол безпеки Wi-Fi</translation> <translation id="65587193855025101">Планшетний сканер</translation> <translation id="6564646048574748301">Не надруковано – принтер недоступний</translation> +<translation id="6603230386432466813">Проблеми з підключенням?</translation> <translation id="6618744767048954150">Виконується</translation> <translation id="6620487321149975369">Завдання друку відображатимуться в історії, доки ви не вилучите їх вручну</translation> <translation id="6643016212128521049">Очистити</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index e2e45d89..bd4220ba 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">رک گیا - نامعلوم خرابی</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> تصاویر</translation> <translation id="4378373042927530923">نہیں چلا</translation> +<translation id="4378551569595875038">منسلک ہو رہا ہے…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">میری ڈرائیو</translation> <translation id="4429881212383817840">Kerberos کی ٹکٹ کی میعاد جلد ہی ختم ہو جائے گی</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb index 7db4f1d..4a609523 100644 --- a/chromeos/strings/chromeos_strings_uz.xtb +++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -145,6 +145,7 @@ <translation id="4297501883039923494">Toʻxtatildi – Notanish xato</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ta rasm</translation> <translation id="4378373042927530923">Ishga tushmadi</translation> +<translation id="4378551569595875038">Ulanmoqda...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4429881212383817840">Kerberos chiptasi amal qilish muddati tezda tugaydi</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 24108e1..b73f72d 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">Đã dừng – Lỗi không xác định</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> hình ảnh</translation> <translation id="4378373042927530923">Không chạy</translation> +<translation id="4378551569595875038">Đang kết nối…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">Drive của tôi</translation> <translation id="4429881212383817840">Vé Kerberos sẽ sớm hết hạn</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index 4b5f3a9..58a60d1 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -144,6 +144,7 @@ <translation id="4297501883039923494">已停止 - 未知错误</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> 张图片</translation> <translation id="4378373042927530923">未运行</translation> +<translation id="4378551569595875038">正在连接…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">我的云端硬盘</translation> <translation id="4429881212383817840">Kerberos 票据即将过期</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index ed8b558..f24eeb8 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">沒有互聯網</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">啟用狀態</translation> +<translation id="2294675138977897428">偵測不到以太網連線</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">開啟藍牙即可探索附近的裝置</translation> <translation id="2364498172489649528">已通過</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">已停止 - 不明錯誤</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> 張圖片</translation> <translation id="4378373042927530923">未執行</translation> +<translation id="4378551569595875038">連線中…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">我的雲端硬碟</translation> <translation id="4429881212383817840">Kerberos 票證即將到期</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">未知的 Wi-Fi 安全通訊協定</translation> <translation id="65587193855025101">平台式</translation> <translation id="6564646048574748301">失敗 - 無法連接打印機</translation> +<translation id="6603230386432466813">連線時遇到問題嗎?</translation> <translation id="6618744767048954150">正在執行</translation> <translation id="6620487321149975369">除非您手動移除列印工作,否則列印工作會顯示在記錄中</translation> <translation id="6643016212128521049">清除</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 770dd13b..e7c69042 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">沒有網際網路連線</translation> <translation id="2230051135190148440">CHAP</translation> <translation id="225692081236532131">啟用狀態</translation> +<translation id="2294675138977897428">未偵測到乙太網路連線</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">開啟藍牙即可偵測附近的裝置</translation> <translation id="2364498172489649528">已通過</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">已停止 - 不明的錯誤</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> 張圖片</translation> <translation id="4378373042927530923">未執行</translation> +<translation id="4378551569595875038">連線中…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="4425149324548788773">我的雲端硬碟</translation> <translation id="4429881212383817840">Kerberos 票證即將到期</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Wi-Fi 安全通訊協定不明</translation> <translation id="65587193855025101">平台式</translation> <translation id="6564646048574748301">失敗 - 無法連上印表機</translation> +<translation id="6603230386432466813">連線時遇到問題嗎?</translation> <translation id="6618744767048954150">檢查中</translation> <translation id="6620487321149975369">除非手動移除列印工作,否則這項資料會顯示在歷史記錄中</translation> <translation id="6643016212128521049">清除</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index 31a5088..e19c0098 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -63,6 +63,7 @@ <translation id="2224337661447660594">Ayikho i-inthanethi</translation> <translation id="2230051135190148440">I-CHAP</translation> <translation id="225692081236532131">Isimo sokwenza kusebenze</translation> +<translation id="2294675138977897428">Alukho uxhumano lwe-Ethernet olutholiwe</translation> <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Vula i-Bluetooth ukuze uthole amadivayisi aseduze</translation> <translation id="2364498172489649528">Kuphumelele</translation> @@ -144,6 +145,7 @@ <translation id="4297501883039923494">Imile - Iphutha elingaziwa</translation> <translation id="4300073214558989">Izithombe <ph name="IMAGE_COUNT" /></translation> <translation id="4378373042927530923">Akuqaliswanga</translation> +<translation id="4378551569595875038">Iyaxhuma...</translation> <translation id="4382484599443659549">I-PDF</translation> <translation id="4425149324548788773">IDrayivu yami</translation> <translation id="4429881212383817840">Ithikithi le-Kerberos liphelelwa isikhathi maduze</translation> @@ -278,6 +280,7 @@ <translation id="6527081081771465939">Iphrothokholi yokuvikeleka kwe-WiFi engaziwa</translation> <translation id="65587193855025101">I-Flatbed</translation> <translation id="6564646048574748301">Yehlulekile - Iphrinta ayifinyeleleki</translation> +<translation id="6603230386432466813">Unenkinga yokuxhuma?</translation> <translation id="6618744767048954150">Uyagijima</translation> <translation id="6620487321149975369">Imisebenzi yokuphrinta izovela emlandweni ngaphandle kwalapho uma isuswe mathupha</translation> <translation id="6643016212128521049">Sula</translation>
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn index 68c0162..10e4cba 100644 --- a/components/arc/BUILD.gn +++ b/components/arc/BUILD.gn
@@ -203,10 +203,10 @@ sources = [ "session/arc_instance_mode.cc", "session/arc_instance_mode.h", + "session/arc_management_transition.cc", + "session/arc_management_transition.h", "session/arc_stop_reason.cc", "session/arc_stop_reason.h", - "session/arc_supervision_transition.cc", - "session/arc_supervision_transition.h", ] deps = [ "//base" ] @@ -541,6 +541,7 @@ "//ui/base:test_support", "//ui/base/clipboard", "//ui/base/ime", + "//ui/display:test_support", "//ui/events", "//ui/events:dom_keycode_converter", "//ui/events:test_support",
diff --git a/components/arc/arc_prefs.cc b/components/arc/arc_prefs.cc index 476e58df..32b3f26 100644 --- a/components/arc/arc_prefs.cc +++ b/components/arc/arc_prefs.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "components/arc/arc_prefs.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" #include <string> @@ -166,7 +166,7 @@ registry->RegisterIntegerPref( kArcManagementTransition, - static_cast<int>(ArcSupervisionTransition::NO_TRANSITION)); + static_cast<int>(ArcManagementTransition::NO_TRANSITION)); registry->RegisterBooleanPref(kArcIsManaged, false);
diff --git a/components/arc/compat_mode/resize_util.cc b/components/arc/compat_mode/resize_util.cc index d0881cd..49c08b3 100644 --- a/components/arc/compat_mode/resize_util.cc +++ b/components/arc/compat_mode/resize_util.cc
@@ -14,8 +14,14 @@ #include "components/arc/compat_mode/arc_resize_lock_pref_delegate.h" #include "components/arc/compat_mode/arc_window_property_util.h" #include "components/arc/compat_mode/resize_confirmation_dialog_view.h" +#include "components/exo/shell_surface_base.h" +#include "components/exo/shell_surface_util.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/geometry/insets.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size_conversions.h" +#include "ui/gfx/geometry/size_f.h" #include "ui/views/widget/widget.h" namespace arc { @@ -24,19 +30,49 @@ constexpr gfx::Size kPortraitPhoneDp(412, 732); constexpr gfx::Size kLandscapeTabletDp(1064, 600); +constexpr int kDisplayEdgeOffsetDp = 32; using ResizeCallback = base::OnceCallback<void(views::Widget*)>; +gfx::Size GetPossibleSizeInWorkArea(views::Widget* widget, + const gfx::Size& preferred_size) { + auto size = gfx::SizeF(preferred_size); + const float preferred_aspect_ratio = size.width() / size.height(); + + auto workarea = widget->GetWorkAreaBoundsInScreen(); + + // Shrink workarea with the edge offset. + workarea.Inset(gfx::Insets(kDisplayEdgeOffsetDp)); + + // Limit |size| to |workarea| but keep the aspect ratio. + if (size.width() > workarea.width()) { + size.set_width(workarea.width()); + size.set_height(workarea.width() / preferred_aspect_ratio); + } + if (size.height() > workarea.height()) { + size.set_width(workarea.height() * preferred_aspect_ratio); + size.set_height(workarea.height()); + } + + const auto* shell_surface_base = + exo::GetShellSurfaceBaseForWindow(widget->GetNativeWindow()); + // |shell_surface_base| can be null in unittests. + if (shell_surface_base) + size.SetToMax(gfx::SizeF(shell_surface_base->GetMinimumSize())); + + return gfx::ToFlooredSize(size); +} + void ResizeToPhone(views::Widget* widget) { if (widget->IsMaximized()) widget->Restore(); - widget->CenterWindow(kPortraitPhoneDp); + widget->CenterWindow(GetPossibleSizeInWorkArea(widget, kPortraitPhoneDp)); } void ResizeToTablet(views::Widget* widget) { if (widget->IsMaximized()) widget->Restore(); - widget->CenterWindow(kLandscapeTabletDp); + widget->CenterWindow(GetPossibleSizeInWorkArea(widget, kLandscapeTabletDp)); } void TurnOnResizeLock(views::Widget* widget,
diff --git a/components/arc/compat_mode/resize_util_unittest.cc b/components/arc/compat_mode/resize_util_unittest.cc index 48f0db2..dbd371d6 100644 --- a/components/arc/compat_mode/resize_util_unittest.cc +++ b/components/arc/compat_mode/resize_util_unittest.cc
@@ -17,6 +17,8 @@ #include "components/exo/test/exo_test_base_views.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/window.h" +#include "ui/display/test/scoped_screen_override.h" +#include "ui/display/test/test_screen.h" #include "ui/views/test/widget_test.h" #include "ui/views/widget/widget.h" @@ -95,6 +97,14 @@ widget_ = CreateTestWidget(views::Widget::InitParams::TYPE_WINDOW); widget_->GetNativeWindow()->SetProperty(ash::kAppIDKey, std::string(kTestAppId)); + // FHD size by default. + SetDisplayWorkArea(gfx::Rect(0, 0, 1920, 1080)); + } + + void SetDisplayWorkArea(const gfx::Rect& work_area) { + display::Display display = test_screen_.GetPrimaryDisplay(); + display.set_work_area(work_area); + test_screen_.display_list().UpdateDisplay(display); } TestArcResizeLockPrefDelegate* pref_delegate() { return &pref_delegate_; } @@ -103,6 +113,8 @@ private: TestArcResizeLockPrefDelegate pref_delegate_; std::unique_ptr<views::Widget> widget_; + display::test::TestScreen test_screen_; + display::test::ScopedScreenOverride scoped_screen_override_{&test_screen_}; }; // Test that resize phone works properly in both needs-confirmation and no @@ -137,6 +149,29 @@ ResizeCompatMode::kTablet); } +// Test that resize phone/tablet works properly on small displays. +TEST_F(ResizeUtilTest, TestResizeLockToPhoneTabletOnSmallDisplay) { + pref_delegate()->SetResizeLockNeedsConfirmation(kTestAppId, false); + + // Set small workarea size. + constexpr gfx::Size workarea_size(300, 300); + SetDisplayWorkArea(gfx::Rect(workarea_size)); + + ResizeLockToPhone(widget(), pref_delegate()); + EXPECT_LT(widget()->GetWindowBoundsInScreen().width(), + widget()->GetWindowBoundsInScreen().height()); + EXPECT_LT(widget()->GetWindowBoundsInScreen().width(), workarea_size.width()); + EXPECT_LT(widget()->GetWindowBoundsInScreen().height(), + workarea_size.height()); + + ResizeLockToTablet(widget(), pref_delegate()); + EXPECT_GT(widget()->GetWindowBoundsInScreen().width(), + widget()->GetWindowBoundsInScreen().height()); + EXPECT_LT(widget()->GetWindowBoundsInScreen().width(), workarea_size.width()); + EXPECT_LT(widget()->GetWindowBoundsInScreen().height(), + workarea_size.height()); +} + // Test that enabling resizing works properly in both needs-confirmation and no // needs-conirmation case. TEST_F(ResizeUtilTest, TestEnableResizing) {
diff --git a/components/arc/session/arc_container_client_adapter.cc b/components/arc/session/arc_container_client_adapter.cc index 5e677ed0..57dcb9b 100644 --- a/components/arc/session/arc_container_client_adapter.cc +++ b/components/arc/session/arc_container_client_adapter.cc
@@ -36,20 +36,20 @@ } } -// Converts ArcSupervisionTransition into login_manager's. +// Converts ArcManagementTransition into login_manager's. login_manager::UpgradeArcContainerRequest_ManagementTransition -ToLoginManagerManagementTransition(ArcSupervisionTransition transition) { +ToLoginManagerManagementTransition(ArcManagementTransition transition) { switch (transition) { - case ArcSupervisionTransition::NO_TRANSITION: + case ArcManagementTransition::NO_TRANSITION: return login_manager:: UpgradeArcContainerRequest_ManagementTransition_NONE; - case ArcSupervisionTransition::CHILD_TO_REGULAR: + case ArcManagementTransition::CHILD_TO_REGULAR: return login_manager:: UpgradeArcContainerRequest_ManagementTransition_CHILD_TO_REGULAR; - case ArcSupervisionTransition::REGULAR_TO_CHILD: + case ArcManagementTransition::REGULAR_TO_CHILD: return login_manager:: UpgradeArcContainerRequest_ManagementTransition_REGULAR_TO_CHILD; - case ArcSupervisionTransition::UNMANAGED_TO_MANAGED: + case ArcManagementTransition::UNMANAGED_TO_MANAGED: return login_manager:: UpgradeArcContainerRequest_ManagementTransition_UNMANAGED_TO_MANAGED; } @@ -158,7 +158,7 @@ for (const auto& language : params.preferred_languages) request.add_preferred_languages(language); request.set_management_transition( - ToLoginManagerManagementTransition(params.supervision_transition)); + ToLoginManagerManagementTransition(params.management_transition)); chromeos::SessionManagerClient::Get()->UpgradeArcContainer( request, std::move(callback));
diff --git a/components/arc/session/arc_management_transition.cc b/components/arc/session/arc_management_transition.cc new file mode 100644 index 0000000..43c466e --- /dev/null +++ b/components/arc/session/arc_management_transition.cc
@@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/arc/session/arc_management_transition.h" +#include "base/notreached.h" + +namespace arc { + +std::ostream& operator<<(std::ostream& os, + ArcManagementTransition management_transition) { + switch (management_transition) { + case ArcManagementTransition::NO_TRANSITION: + return os << "NO_TRANSITION"; + case ArcManagementTransition::CHILD_TO_REGULAR: + return os << "CHILD_TO_REGULAR"; + case ArcManagementTransition::REGULAR_TO_CHILD: + return os << "REGULAR_TO_CHILD"; + case ArcManagementTransition::UNMANAGED_TO_MANAGED: + return os << "UNMANAGED_TO_MANAGED"; + } + NOTREACHED() << "Unexpected value for ArcManagementTransition: " + << static_cast<int>(management_transition); + + return os << "ArcManagementTransition(" + << static_cast<int>(management_transition) << ")"; +} + +} // namespace arc
diff --git a/components/arc/session/arc_supervision_transition.h b/components/arc/session/arc_management_transition.h similarity index 67% rename from components/arc/session/arc_supervision_transition.h rename to components/arc/session/arc_management_transition.h index 8642ba2..9a9c3b5 100644 --- a/components/arc/session/arc_supervision_transition.h +++ b/components/arc/session/arc_management_transition.h
@@ -2,17 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_ARC_SESSION_ARC_SUPERVISION_TRANSITION_H_ -#define COMPONENTS_ARC_SESSION_ARC_SUPERVISION_TRANSITION_H_ +#ifndef COMPONENTS_ARC_SESSION_ARC_MANAGEMENT_TRANSITION_H_ +#define COMPONENTS_ARC_SESSION_ARC_MANAGEMENT_TRANSITION_H_ #include <ostream> namespace arc { // These values must be kept in sync with -// UpgradeArcInstanceRequest.SupervisionTransition in +// UpgradeArcContainerRequest.ManagementTransition in // third_party/cros_system_api/dbus/arc.proto. -enum class ArcSupervisionTransition : int { +enum class ArcManagementTransition : int { // No transition necessary. NO_TRANSITION = 0, // Child user is transitioning to a regular account, need to lift @@ -27,8 +27,8 @@ }; std::ostream& operator<<(std::ostream& os, - ArcSupervisionTransition supervisionTransition); + ArcManagementTransition managementTransition); } // namespace arc -#endif // COMPONENTS_ARC_SESSION_ARC_SUPERVISION_TRANSITION_H_ +#endif // COMPONENTS_ARC_SESSION_ARC_MANAGEMENT_TRANSITION_H_
diff --git a/components/arc/session/arc_session_impl_unittest.cc b/components/arc/session/arc_session_impl_unittest.cc index d3e6ce1..0e5a972 100644 --- a/components/arc/session/arc_session_impl_unittest.cc +++ b/components/arc/session/arc_session_impl_unittest.cc
@@ -793,15 +793,15 @@ arc_session->StartMiniInstance(); UpgradeParams params; - params.supervision_transition = ArcSupervisionTransition::CHILD_TO_REGULAR; + params.management_transition = ArcManagementTransition::CHILD_TO_REGULAR; params.locale = kDefaultLocale; arc_session->RequestUpgrade(std::move(params)); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(ArcSupervisionTransition::CHILD_TO_REGULAR, + EXPECT_EQ(ArcManagementTransition::CHILD_TO_REGULAR, GetClient(arc_session.get()) ->last_upgrade_params() - .supervision_transition); + .management_transition); EXPECT_EQ(160, GetClient(arc_session.get())->last_start_params().lcd_density); }
diff --git a/components/arc/session/arc_supervision_transition.cc b/components/arc/session/arc_supervision_transition.cc deleted file mode 100644 index ac3a52d5..0000000 --- a/components/arc/session/arc_supervision_transition.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/arc/session/arc_supervision_transition.h" -#include "base/notreached.h" - -namespace arc { - -std::ostream& operator<<(std::ostream& os, - ArcSupervisionTransition supervision_transition) { - switch (supervision_transition) { - case ArcSupervisionTransition::NO_TRANSITION: - return os << "NO_TRANSITION"; - case ArcSupervisionTransition::CHILD_TO_REGULAR: - return os << "CHILD_TO_REGULAR"; - case ArcSupervisionTransition::REGULAR_TO_CHILD: - return os << "REGULAR_TO_CHILD"; - case ArcSupervisionTransition::UNMANAGED_TO_MANAGED: - return os << "UNMANAGED_TO_MANAGED"; - } - NOTREACHED() << "Unexpected value for ArcSupervisionTransition: " - << static_cast<int>(supervision_transition); - - return os << "ArcSupervisionTransition(" - << static_cast<int>(supervision_transition) << ")"; -} - -} // namespace arc
diff --git a/components/arc/session/arc_upgrade_params.h b/components/arc/session/arc_upgrade_params.h index defd02c..17d753f 100644 --- a/components/arc/session/arc_upgrade_params.h +++ b/components/arc/session/arc_upgrade_params.h
@@ -12,7 +12,7 @@ #include "base/files/file_path.h" #include "base/macros.h" -#include "components/arc/session/arc_supervision_transition.h" +#include "components/arc/session/arc_management_transition.h" namespace arc { @@ -71,8 +71,8 @@ // The supervision transition state for this account. Indicates whether // child account should become regular, regular account should become child // or neither. - ArcSupervisionTransition supervision_transition = - ArcSupervisionTransition::NO_TRANSITION; + ArcManagementTransition management_transition = + ArcManagementTransition::NO_TRANSITION; // Define language configuration set during Android container boot. // |preferred_languages| may be empty.
diff --git a/components/arc/session/arc_vm_client_adapter.cc b/components/arc/session/arc_vm_client_adapter.cc index 15492a7..03319cf 100644 --- a/components/arc/session/arc_vm_client_adapter.cc +++ b/components/arc/session/arc_vm_client_adapter.cc
@@ -164,7 +164,7 @@ upgrade_params.is_demo_session), base::StringPrintf( "%s.supervision.transition=%d", prefix.c_str(), - static_cast<int>(upgrade_params.supervision_transition)), + static_cast<int>(upgrade_params.management_transition)), base::StringPrintf("%s.serialno=%s", prefix.c_str(), serial_number.c_str()), };
diff --git a/components/arc/session/arc_vm_client_adapter_unittest.cc b/components/arc/session/arc_vm_client_adapter_unittest.cc index cba7782e..9b43b76 100644 --- a/components/arc/session/arc_vm_client_adapter_unittest.cc +++ b/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -87,7 +87,7 @@ params.skip_boot_completed_broadcast = true; params.packages_cache_mode = UpgradeParams::PackageCacheMode::COPY_ON_INIT; params.skip_gms_core_cache = true; - params.supervision_transition = ArcSupervisionTransition::CHILD_TO_REGULAR; + params.management_transition = ArcManagementTransition::CHILD_TO_REGULAR; params.locale = "en-US"; params.preferred_languages = {"en_US", "en", "ja"}; params.is_demo_session = true; @@ -1189,7 +1189,7 @@ // Use slightly different params than StartUpgradeArc_VariousParams. params.packages_cache_mode = UpgradeParams::PackageCacheMode::SKIP_SETUP_COPY_ON_INIT; - params.supervision_transition = ArcSupervisionTransition::REGULAR_TO_CHILD; + params.management_transition = ArcManagementTransition::REGULAR_TO_CHILD; params.preferred_languages = {"en_US"}; UpgradeArcWithParams(true, std::move(params));
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc index 7d04fa49..e48a523 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -114,8 +114,9 @@ } bool CreditCardAccessManager::IsCardPresentInUnmaskedCache( - const std::string& server_id) const { - return unmasked_card_cache_.find(server_id) != unmasked_card_cache_.end(); + const CreditCard& card) const { + return unmasked_card_cache_.find(GetKeyForUnmaskedCardsCache(card)) != + unmasked_card_cache_.end(); } bool CreditCardAccessManager::ServerCardsAvailable() { @@ -266,11 +267,8 @@ } // If card has been previously unmasked, use cached data. - std::string identifier = card->record_type() == CreditCard::VIRTUAL_CARD - ? card->server_id() + kVirtualCardIdentifier - : card->server_id(); std::unordered_map<std::string, CachedServerCardInfo>::iterator it = - unmasked_card_cache_.find(identifier); + unmasked_card_cache_.find(GetKeyForUnmaskedCardsCache(*card)); if (it != unmasked_card_cache_.end()) { // key is in cache accessor->OnCreditCardFetched(CreditCardFetchResult::kSuccess, /*credit_card=*/&it->second.card, @@ -763,4 +761,12 @@ #endif } +std::string CreditCardAccessManager::GetKeyForUnmaskedCardsCache( + const CreditCard& card) const { + std::string key = card.server_id(); + if (card.record_type() == CreditCard::VIRTUAL_CARD) + key += kVirtualCardIdentifier; + return key; +} + } // namespace autofill
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.h b/components/autofill/core/browser/payments/credit_card_access_manager.h index c4d128f..7b0b1fc 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.h +++ b/components/autofill/core/browser/payments/credit_card_access_manager.h
@@ -148,9 +148,8 @@ // |unamsked_cards_cache_|. std::vector<const CachedServerCardInfo*> GetCachedUnmaskedCards() const; - // Returns true if a |unmasked_cards_cache| contains an entry for the card - // with |server_id|. - bool IsCardPresentInUnmaskedCache(const std::string& server_id) const; + // Returns true if a |unmasked_cards_cache| contains an entry for the card. + bool IsCardPresentInUnmaskedCache(const CreditCard& card) const; CreditCardCVCAuthenticator* GetOrCreateCVCAuthenticator(); @@ -259,6 +258,10 @@ const CreditCardCVCAuthenticator::CVCAuthenticationResponse& response, base::Value request_options); + // Returns the key for the given card to be used for inserting or querying the + // `unmasked_card_cache_`. + std::string GetKeyForUnmaskedCardsCache(const CreditCard& card) const; + // The current form of authentication in progress. UnmaskAuthFlowType unmask_auth_flow_type_ = UnmaskAuthFlowType::kNone;
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc index 0c90fa81..b9728b6 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
@@ -1978,9 +1978,24 @@ // Verify that only one card is present in the cache. EXPECT_TRUE(credit_card_access_manager_->IsCardPresentInUnmaskedCache( - unmasked_card->server_id())); + *unmasked_card)); EXPECT_FALSE(credit_card_access_manager_->IsCardPresentInUnmaskedCache( - credit_card_access_manager_->GetCreditCard(kTestGUID2)->server_id())); + *credit_card_access_manager_->GetCreditCard(kTestGUID2))); +} + +TEST_F(CreditCardAccessManagerTest, IsVirtualCardPresentInUnmaskedCache) { + CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); + CreditCard* unmasked_card = + credit_card_access_manager_->GetCreditCard(kTestGUID); + unmasked_card->set_record_type(CreditCard::VIRTUAL_CARD); + + // Add the virtual card to the cache. + credit_card_access_manager_->CacheUnmaskedCardInfo(*unmasked_card, + kTestCvc16); + + // Verify that the virtual card is present in the cache. + EXPECT_TRUE(credit_card_access_manager_->IsCardPresentInUnmaskedCache( + *unmasked_card)); } } // namespace autofill
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index a4847c3..40779b22 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -139,7 +139,7 @@ // TODO(crbug.com/1150890) Remove once launched const base::Feature kAutofillEnableAugmentedPhoneCountryCode{ "AutofillEnableAugmentedPhoneCountryCode", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // Controls if Autofill parses ADDRESS_HOME_DEPENDENT_LOCALITY. // TODO(crbug.com/1157405): Remove once launched.
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn index ffbb419..f0b022d 100644 --- a/components/autofill_assistant/browser/BUILD.gn +++ b/components/autofill_assistant/browser/BUILD.gn
@@ -40,8 +40,12 @@ "actions/configure_bottom_sheet_action.h", "actions/configure_ui_state_action.cc", "actions/configure_ui_state_action.h", + "actions/delete_password_action.cc", + "actions/delete_password_action.h", "actions/dispatch_js_event_action.cc", "actions/dispatch_js_event_action.h", + "actions/edit_password_action.cc", + "actions/edit_password_action.h", "actions/expect_navigation_action.cc", "actions/expect_navigation_action.h", "actions/fallback_handler/required_field.cc", @@ -348,7 +352,9 @@ "actions/clear_persistent_ui_action_unittest.cc", "actions/collect_user_data_action_unittest.cc", "actions/configure_bottom_sheet_action_unittest.cc", + "actions/delete_password_action_unittest.cc", "actions/dispatch_js_event_action_unittest.cc", + "actions/edit_password_action_unittest.cc", "actions/fallback_handler/required_field_unittest.cc", "actions/fallback_handler/required_fields_fallback_handler_unittest.cc", "actions/generate_password_for_form_field_action_unittest.cc",
diff --git a/components/autofill_assistant/browser/actions/action.cc b/components/autofill_assistant/browser/actions/action.cc index acc2dcc..2c5f134 100644 --- a/components/autofill_assistant/browser/actions/action.cc +++ b/components/autofill_assistant/browser/actions/action.cc
@@ -246,6 +246,12 @@ case ActionProto::ActionInfoCase::kSetTouchableArea: out << "SetTouchableArea"; break; + case ActionProto::ActionInfoCase::kDeletePassword: + out << "DeletePassword"; + break; + case ActionProto::ActionInfoCase::kEditPassword: + out << "EditPassword"; + break; case ActionProto::ActionInfoCase::ACTION_INFO_NOT_SET: out << "ACTION_INFO_NOT_SET"; break;
diff --git a/components/autofill_assistant/browser/actions/action_delegate.h b/components/autofill_assistant/browser/actions/action_delegate.h index a2fbf05..c7b76bdd 100644 --- a/components/autofill_assistant/browser/actions/action_delegate.h +++ b/components/autofill_assistant/browser/actions/action_delegate.h
@@ -208,20 +208,9 @@ const autofill::FormData&, const autofill::FormFieldData&)> callback) = 0; - // Scroll to an |element|'s position. |top_padding| specifies the padding - // between the focused element and the top. - // If |container| is specified, that container will be scrolled, if - // it's null the window will be scrolled. - // TODO(b/168107066): The selector is only used for storing the previously - // selected element and is not being used to resolve it. This is required for - // the current implementation of |ScriptExecutor| that repeats the focus - // after an interrupt. This dependency should be removed from the signature. - virtual void ScrollToElementPosition( - const Selector& selector, - const TopPadding& top_padding, - std::unique_ptr<ElementFinder::Result> container, - const ElementFinder::Result& element, - base::OnceCallback<void(const ClientStatus&)> callback) = 0; + // Store the element that is being scrolled to, such that it can be restored + // after an interrupt. + virtual void StoreScrolledToElement(const ElementFinder::Result& element) = 0; // Sets selector of areas that can be manipulated: // - after the end of the script and before the beginning of the next script.
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util.cc b/components/autofill_assistant/browser/actions/action_delegate_util.cc index 5b9ddeb..c2df36c 100644 --- a/components/autofill_assistant/browser/actions/action_delegate_util.cc +++ b/components/autofill_assistant/browser/actions/action_delegate_util.cc
@@ -59,6 +59,14 @@ base::BindOnce(&IgnoreTimingResult, std::move(done))); } +void RunAndCallSuccessCallback( + base::OnceCallback<void(const ElementFinder::Result&)> step, + const ElementFinder::Result& element, + base::OnceCallback<void(const ClientStatus&)> done) { + std::move(step).Run(element); + std::move(done).Run(OkClientStatus()); +} + // Call |done| with a successful status, no matter what |status|. // // Note that the status details, if any, filled in |status| are conserved. @@ -201,6 +209,13 @@ actions->emplace_back(base::BindOnce(&RunAndIgnoreTiming, std::move(step))); } +void AddStepWithoutCallback( + base::OnceCallback<void(const ElementFinder::Result&)> step, + element_action_util::ElementActionVector* actions) { + actions->emplace_back( + base::BindOnce(&RunAndCallSuccessCallback, std::move(step))); +} + void FindElementAndPerform(const ActionDelegate* delegate, const Selector& selector, element_action_util::ElementActionCallback perform,
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util.h b/components/autofill_assistant/browser/actions/action_delegate_util.h index 142c8a9..75dd26c 100644 --- a/components/autofill_assistant/browser/actions/action_delegate_util.h +++ b/components/autofill_assistant/browser/actions/action_delegate_util.h
@@ -65,6 +65,11 @@ base::OnceCallback<void(const ClientStatus&, base::TimeDelta)>)> step, element_action_util::ElementActionVector* actions); +// Adds a step to the |actions| that does not have a callback. +void AddStepWithoutCallback( + base::OnceCallback<void(const ElementFinder::Result&)> step, + element_action_util::ElementActionVector* actions); + void ClickOrTapElement(const ActionDelegate* delegate, const Selector& selector, ClickType click_type,
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc b/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc index c5ec4f2..d543ddd 100644 --- a/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc +++ b/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc
@@ -133,9 +133,7 @@ EXPECT_CALL(*mock_delegate, WaitUntilDocumentIsInReadyState(_, _, _, _)) .WillOnce(RunOnceCallback<3>(OkClientStatus(), base::TimeDelta::FromSeconds(0))); - EXPECT_CALL(*mock_delegate, ScrollToElementPosition( - _, _, _, EqualsElement(expected_element), _)) - .Times(0); + // No second call to WaitUntilDocumentIsInReadyState. EXPECT_CALL(*this, MockDone(_)).Times(0); auto actions = std::make_unique<element_action_util::ElementActionVector>(); @@ -153,9 +151,11 @@ std::move(done).Run(OkClientStatus()); }, base::BindLambdaForTesting([&]() { mock_delegate.reset(); }))); - actions->emplace_back(base::BindOnce( - &ActionDelegate::ScrollToElementPosition, mock_delegate->GetWeakPtr(), - Selector({"#element"}), TopPadding(), nullptr)); + AddStepIgnoreTiming( + base::BindOnce(&ActionDelegate::WaitUntilDocumentIsInReadyState, + mock_delegate->GetWeakPtr(), + base::TimeDelta::FromMilliseconds(0), DOCUMENT_COMPLETE), + actions.get()); FindElementAndPerform( mock_delegate.get(), expected_selector,
diff --git a/components/autofill_assistant/browser/actions/delete_password_action.cc b/components/autofill_assistant/browser/actions/delete_password_action.cc new file mode 100644 index 0000000..60bf983 --- /dev/null +++ b/components/autofill_assistant/browser/actions/delete_password_action.cc
@@ -0,0 +1,48 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/actions/delete_password_action.h" + +#include "components/autofill_assistant/browser/actions/action_delegate.h" +#include "components/autofill_assistant/browser/client_status.h" +#include "components/autofill_assistant/browser/user_data.h" +#include "components/autofill_assistant/browser/website_login_manager.h" + +namespace autofill_assistant { + +DeletePasswordAction::DeletePasswordAction(ActionDelegate* delegate, + const ActionProto& proto) + : Action(delegate, proto) {} + +DeletePasswordAction::~DeletePasswordAction() {} + +void DeletePasswordAction::InternalProcessAction( + ProcessActionCallback callback) { + callback_ = std::move(callback); + + if (!delegate_->GetUserData()->selected_login_.has_value()) { + VLOG(1) << "DeletePasswordAction: requested login details " + "not available in client memory."; + EndAction(ClientStatus(PRECONDITION_FAILED)); + return; + } + + delegate_->GetWebsiteLoginManager()->DeletePasswordForLogin( + *delegate_->GetUserData()->selected_login_, + base::BindOnce(&DeletePasswordAction::OnPasswordDeleted, + weak_ptr_factory_.GetWeakPtr())); +} + +void DeletePasswordAction::OnPasswordDeleted(bool success) { + auto status = success ? ClientStatus(ACTION_APPLIED) + : ClientStatus(AUTOFILL_INFO_NOT_AVAILABLE); + EndAction(status); +} + +void DeletePasswordAction::EndAction(const ClientStatus& status) { + UpdateProcessedAction(status); + std::move(callback_).Run(std::move(processed_action_proto_)); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/delete_password_action.h b/components/autofill_assistant/browser/actions/delete_password_action.h new file mode 100644 index 0000000..0cbe95d --- /dev/null +++ b/components/autofill_assistant/browser/actions/delete_password_action.h
@@ -0,0 +1,37 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_DELETE_PASSWORD_ACTION_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_DELETE_PASSWORD_ACTION_H_ + +#include "base/callback.h" +#include "base/memory/weak_ptr.h" +#include "components/autofill_assistant/browser/actions/action.h" + +namespace autofill_assistant { + +// Action to delete password. It is only possible if Userdata contains selected +// login. +class DeletePasswordAction : public Action { + public: + explicit DeletePasswordAction(ActionDelegate* delegate, + const ActionProto& proto); + ~DeletePasswordAction() override; + + DeletePasswordAction(const DeletePasswordAction&) = delete; + DeletePasswordAction& operator=(const DeletePasswordAction&) = delete; + + private: + // Overrides Action: + void InternalProcessAction(ProcessActionCallback callback) override; + + void OnPasswordDeleted(bool success); + void EndAction(const ClientStatus& status); + + ProcessActionCallback callback_; + base::WeakPtrFactory<DeletePasswordAction> weak_ptr_factory_{this}; +}; + +} // namespace autofill_assistant +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_DELETE_PASSWORD_ACTION_H_
diff --git a/components/autofill_assistant/browser/actions/delete_password_action_unittest.cc b/components/autofill_assistant/browser/actions/delete_password_action_unittest.cc new file mode 100644 index 0000000..695f160 --- /dev/null +++ b/components/autofill_assistant/browser/actions/delete_password_action_unittest.cc
@@ -0,0 +1,83 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/actions/delete_password_action.h" + +#include <string> +#include <utility> + +#include "base/test/gmock_callback_support.h" +#include "base/test/mock_callback.h" +#include "components/autofill_assistant/browser/actions/mock_action_delegate.h" +#include "components/autofill_assistant/browser/client_status.h" +#include "components/autofill_assistant/browser/mock_website_login_manager.h" +#include "components/autofill_assistant/browser/user_data.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace { +const char kFakeUrl[] = "https://www.example.com"; +const char kFakeUsername[] = "user@example.com"; +} // namespace + +namespace autofill_assistant { +using ::base::test::RunOnceCallback; +using ::testing::_; +using ::testing::Pointee; +using ::testing::Property; +using ::testing::Return; + +class DeletePasswordActionTest : public testing::Test { + public: + void SetUp() override { + ON_CALL(mock_action_delegate_, GetWebsiteLoginManager) + .WillByDefault(Return(&mock_website_login_manager_)); + + ON_CALL(mock_action_delegate_, GetUserData) + .WillByDefault(Return(&user_data_)); + } + + protected: + MockActionDelegate mock_action_delegate_; + MockWebsiteLoginManager mock_website_login_manager_; + base::MockCallback<Action::ProcessActionCallback> callback_; + ActionProto proto_; + UserData user_data_; +}; + +TEST_F(DeletePasswordActionTest, DeletePasswordMissingUserdata) { + DeletePasswordAction action(&mock_action_delegate_, proto_); + EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status, + PRECONDITION_FAILED)))); + + action.ProcessAction(callback_.Get()); +} + +TEST_F(DeletePasswordActionTest, DeletePasswordSuccess) { + DeletePasswordAction action(&mock_action_delegate_, proto_); + user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>( + GURL(kFakeUrl), kFakeUsername); + + EXPECT_CALL(mock_website_login_manager_, OnDeletePasswordForLogin) + .WillOnce(RunOnceCallback<1>(true)); + EXPECT_CALL( + callback_, + Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED)))); + + action.ProcessAction(callback_.Get()); +} + +TEST_F(DeletePasswordActionTest, DeletePasswordNoLoginAvailable) { + DeletePasswordAction action(&mock_action_delegate_, proto_); + user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>( + GURL(kFakeUrl), kFakeUsername); + + EXPECT_CALL(mock_website_login_manager_, OnDeletePasswordForLogin) + .WillOnce(RunOnceCallback<1>(false)); + EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status, + AUTOFILL_INFO_NOT_AVAILABLE)))); + + action.ProcessAction(callback_.Get()); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/edit_password_action.cc b/components/autofill_assistant/browser/actions/edit_password_action.cc new file mode 100644 index 0000000..997167e --- /dev/null +++ b/components/autofill_assistant/browser/actions/edit_password_action.cc
@@ -0,0 +1,73 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/actions/edit_password_action.h" + +#include "components/autofill_assistant/browser/actions/action_delegate.h" +#include "components/autofill_assistant/browser/client_status.h" +#include "components/autofill_assistant/browser/user_data.h" +#include "components/autofill_assistant/browser/value_util.h" +#include "components/autofill_assistant/browser/website_login_manager.h" + +namespace autofill_assistant { + +EditPasswordAction::EditPasswordAction(ActionDelegate* delegate, + const ActionProto& proto) + : Action(delegate, proto) {} + +EditPasswordAction::~EditPasswordAction() {} + +void EditPasswordAction::InternalProcessAction(ProcessActionCallback callback) { + callback_ = std::move(callback); + const auto& edit_password = proto_.edit_password(); + + if (edit_password.memory_key().empty()) { + VLOG(1) << "EditPasswordAction: empty |memory_key|"; + EndAction(ClientStatus(INVALID_ACTION)); + return; + } + + if (!delegate_->GetUserData()->has_additional_value( + edit_password.memory_key()) || + delegate_->GetUserData() + ->additional_value(edit_password.memory_key()) + ->strings() + .values() + .size() != 1) { + VLOG(1) << "EditPasswordAction: requested key '" + << edit_password.memory_key() << "' not available in client memory"; + EndAction(ClientStatus(PRECONDITION_FAILED)); + return; + } + + if (!delegate_->GetUserData()->selected_login_.has_value()) { + VLOG(1) << "EditPasswordAction: requested login details " + "not available in client memory."; + EndAction(ClientStatus(PRECONDITION_FAILED)); + return; + } + + std::string password = delegate_->GetUserData() + ->additional_value(edit_password.memory_key()) + ->strings() + .values(0); + + delegate_->GetWebsiteLoginManager()->EditPasswordForLogin( + *delegate_->GetUserData()->selected_login_, password, + base::BindOnce(&EditPasswordAction::OnPasswordEdited, + weak_ptr_factory_.GetWeakPtr())); +} + +void EditPasswordAction::OnPasswordEdited(bool success) { + auto status = success ? ClientStatus(ACTION_APPLIED) + : ClientStatus(AUTOFILL_INFO_NOT_AVAILABLE); + EndAction(status); +} + +void EditPasswordAction::EndAction(const ClientStatus& status) { + UpdateProcessedAction(status); + std::move(callback_).Run(std::move(processed_action_proto_)); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/edit_password_action.h b/components/autofill_assistant/browser/actions/edit_password_action.h new file mode 100644 index 0000000..15193308 --- /dev/null +++ b/components/autofill_assistant/browser/actions/edit_password_action.h
@@ -0,0 +1,37 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_EDIT_PASSWORD_ACTION_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_EDIT_PASSWORD_ACTION_H_ + +#include "base/callback.h" +#include "base/memory/weak_ptr.h" +#include "components/autofill_assistant/browser/actions/action.h" + +namespace autofill_assistant { + +// Action to edit password. It is only possible if Userdata contains selected +// login. +class EditPasswordAction : public Action { + public: + explicit EditPasswordAction(ActionDelegate* delegate, + const ActionProto& proto); + ~EditPasswordAction() override; + + EditPasswordAction(const EditPasswordAction&) = delete; + EditPasswordAction& operator=(const EditPasswordAction&) = delete; + + private: + // Overrides Action: + void InternalProcessAction(ProcessActionCallback callback) override; + + void OnPasswordEdited(bool success); + void EndAction(const ClientStatus& status); + + ProcessActionCallback callback_; + base::WeakPtrFactory<EditPasswordAction> weak_ptr_factory_{this}; +}; + +} // namespace autofill_assistant +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_EDIT_PASSWORD_ACTION_H_
diff --git a/components/autofill_assistant/browser/actions/edit_password_action_unittest.cc b/components/autofill_assistant/browser/actions/edit_password_action_unittest.cc new file mode 100644 index 0000000..6d041e3 --- /dev/null +++ b/components/autofill_assistant/browser/actions/edit_password_action_unittest.cc
@@ -0,0 +1,117 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/actions/edit_password_action.h" + +#include <string> +#include <utility> + +#include "base/test/gmock_callback_support.h" +#include "base/test/mock_callback.h" +#include "components/autofill_assistant/browser/actions/mock_action_delegate.h" +#include "components/autofill_assistant/browser/client_status.h" +#include "components/autofill_assistant/browser/mock_website_login_manager.h" +#include "components/autofill_assistant/browser/user_data.h" +#include "components/autofill_assistant/browser/value_util.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace { +const char kFakeUrl[] = "https://www.example.com"; +const char kFakeUsername[] = "user@example.com"; +const char kMemoryKey[] = "edited-password"; +const char kPassword[] = "new-pass"; +} // namespace + +namespace autofill_assistant { +using ::base::test::RunOnceCallback; +using ::testing::_; +using ::testing::Pointee; +using ::testing::Property; +using ::testing::Return; + +class EditPasswordActionTest : public testing::Test { + public: + void SetUp() override { + ON_CALL(mock_action_delegate_, GetWebsiteLoginManager) + .WillByDefault(Return(&mock_website_login_manager_)); + + ON_CALL(mock_action_delegate_, GetUserData) + .WillByDefault(Return(&user_data_)); + } + + protected: + MockActionDelegate mock_action_delegate_; + MockWebsiteLoginManager mock_website_login_manager_; + base::MockCallback<Action::ProcessActionCallback> callback_; + ActionProto proto_; + UserData user_data_; +}; + +TEST_F(EditPasswordActionTest, EditPasswordNoMemoryKey) { + EditPasswordAction action(&mock_action_delegate_, proto_); + EXPECT_CALL( + callback_, + Run(Pointee(Property(&ProcessedActionProto::status, INVALID_ACTION)))); + + action.ProcessAction(callback_.Get()); +} + +TEST_F(EditPasswordActionTest, EditPasswordNoSelectedLoginUserData) { + EditSelectedPasswordProto* edit_password = proto_.mutable_edit_password(); + edit_password->set_memory_key(kMemoryKey); + EditPasswordAction action(&mock_action_delegate_, proto_); + EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status, + PRECONDITION_FAILED)))); + + action.ProcessAction(callback_.Get()); +} + +TEST_F(EditPasswordActionTest, EditPasswordNoPasswordInUserData) { + user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>( + GURL(kFakeUrl), kFakeUsername); + EditSelectedPasswordProto* edit_password = proto_.mutable_edit_password(); + edit_password->set_memory_key(kMemoryKey); + EditPasswordAction action(&mock_action_delegate_, proto_); + EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status, + PRECONDITION_FAILED)))); + + action.ProcessAction(callback_.Get()); +} + +TEST_F(EditPasswordActionTest, EditPasswordSuccess) { + user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>( + GURL(kFakeUrl), kFakeUsername); + user_data_.additional_values_[kMemoryKey] = + SimpleValue(std::string(kPassword)); + EditSelectedPasswordProto* edit_password = proto_.mutable_edit_password(); + edit_password->set_memory_key(kMemoryKey); + EditPasswordAction action(&mock_action_delegate_, proto_); + + EXPECT_CALL(mock_website_login_manager_, OnEditPasswordForLogin) + .WillOnce(RunOnceCallback<2>(true)); + EXPECT_CALL( + callback_, + Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED)))); + + action.ProcessAction(callback_.Get()); +} + +TEST_F(EditPasswordActionTest, EditPasswordNoLoginAvailable) { + user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>( + GURL(kFakeUrl), kFakeUsername); + user_data_.additional_values_[kMemoryKey] = + SimpleValue(std::string(kPassword)); + EditSelectedPasswordProto* edit_password = proto_.mutable_edit_password(); + edit_password->set_memory_key(kMemoryKey); + EditPasswordAction action(&mock_action_delegate_, proto_); + + EXPECT_CALL(mock_website_login_manager_, OnEditPasswordForLogin) + .WillOnce(RunOnceCallback<2>(false)); + EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status, + AUTOFILL_INFO_NOT_AVAILABLE)))); + + action.ProcessAction(callback_.Get()); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/mock_action_delegate.h b/components/autofill_assistant/browser/actions/mock_action_delegate.h index 101f590..834dc68 100644 --- a/components/autofill_assistant/browser/actions/mock_action_delegate.h +++ b/components/autofill_assistant/browser/actions/mock_action_delegate.h
@@ -104,12 +104,8 @@ base::OnceCallback<void(const ClientStatus&, const autofill::FormData&, const autofill::FormFieldData&)> callback)); - MOCK_METHOD5(ScrollToElementPosition, - void(const Selector& selector, - const TopPadding& top_padding, - std::unique_ptr<ElementFinder::Result> scrollable_element, - const ElementFinder::Result& element, - base::OnceCallback<void(const ClientStatus&)> callback)); + MOCK_METHOD1(StoreScrolledToElement, + void(const ElementFinder::Result& element)); MOCK_METHOD1(SetTouchableElementArea, void(const ElementAreaProto& touchable_element_area)); MOCK_METHOD1(CollectUserData,
diff --git a/components/autofill_assistant/browser/actions/show_cast_action.cc b/components/autofill_assistant/browser/actions/show_cast_action.cc index 4c355cb..33d8ced 100644 --- a/components/autofill_assistant/browser/actions/show_cast_action.cc +++ b/components/autofill_assistant/browser/actions/show_cast_action.cc
@@ -123,7 +123,8 @@ action_delegate_util::AddOptionalStep( wait_for_stable_element, base::BindOnce(&WebController::ScrollIntoViewIfNeeded, - delegate_->GetWebController()->GetWeakPtr(), true), + delegate_->GetWebController()->GetWeakPtr(), + /* center= */ true), actions.get()); action_delegate_util::AddOptionalStep( wait_for_stable_element, @@ -136,9 +137,14 @@ base::TimeDelta::FromMilliseconds( proto_.show_cast().stable_check_interval_ms()))), actions.get()); - actions->emplace_back(base::BindOnce(&ActionDelegate::ScrollToElementPosition, - delegate_->GetWeakPtr(), selector, - top_padding, std::move(container))); + action_delegate_util::AddStepWithoutCallback( + base::BindOnce(&ActionDelegate::StoreScrolledToElement, + delegate_->GetWeakPtr()), + actions.get()); + actions->emplace_back( + base::BindOnce(&WebController::ScrollToElementPosition, + delegate_->GetWebController()->GetWeakPtr(), + std::move(container), top_padding)); action_delegate_util::FindElementAndPerform( delegate_, selector,
diff --git a/components/autofill_assistant/browser/actions/show_cast_action_unittest.cc b/components/autofill_assistant/browser/actions/show_cast_action_unittest.cc index f8c8f32..246b5d98 100644 --- a/components/autofill_assistant/browser/actions/show_cast_action_unittest.cc +++ b/components/autofill_assistant/browser/actions/show_cast_action_unittest.cc
@@ -66,6 +66,7 @@ OnShortWaitForElement(expected_selector, _)) .WillOnce(RunOnceCallback<1>(ClientStatus(TIMED_OUT), base::TimeDelta::FromSeconds(0))); + EXPECT_CALL(mock_action_delegate_, StoreScrolledToElement(_)).Times(0); EXPECT_CALL(mock_action_delegate_, SetTouchableElementArea(_)).Times(0); EXPECT_CALL(callback_, @@ -91,9 +92,11 @@ .WillOnce(RunOnceCallback<3>(OkClientStatus(), base::TimeDelta::FromSeconds(2))); EXPECT_CALL(mock_action_delegate_, - ScrollToElementPosition(expected_selector, _, Eq(nullptr), + StoreScrolledToElement(EqualsElement(expected_element))); + EXPECT_CALL(mock_web_controller_, + ScrollToElementPosition(Eq(nullptr), _, EqualsElement(expected_element), _)) - .WillOnce(RunOnceCallback<4>(OkClientStatus())); + .WillOnce(RunOnceCallback<3>(OkClientStatus())); EXPECT_CALL(mock_action_delegate_, SetTouchableElementArea(_)); ProcessedActionProto capture; @@ -126,12 +129,13 @@ _, DOCUMENT_INTERACTIVE, EqualsElement(expected_element), _)) .WillOnce(RunOnceCallback<3>(OkClientStatus(), base::TimeDelta::FromSeconds(2))); + EXPECT_CALL(mock_action_delegate_, + StoreScrolledToElement(EqualsElement(expected_element))); EXPECT_CALL( - mock_action_delegate_, - ScrollToElementPosition(expected_selector, _, - Pointee(EqualsElement(expected_container)), + mock_web_controller_, + ScrollToElementPosition(Pointee(EqualsElement(expected_container)), _, EqualsElement(expected_element), _)) - .WillOnce(RunOnceCallback<4>(OkClientStatus())); + .WillOnce(RunOnceCallback<3>(OkClientStatus())); EXPECT_CALL(mock_action_delegate_, SetTouchableElementArea(_)); ProcessedActionProto capture; @@ -169,9 +173,10 @@ .WillOnce(RunOnceCallback<3>(OkClientStatus(), base::TimeDelta::FromSeconds(1))); EXPECT_CALL(mock_action_delegate_, - ScrollToElementPosition(expected_selector, _, _, - EqualsElement(expected_element), _)) - .WillOnce(RunOnceCallback<4>(OkClientStatus())); + StoreScrolledToElement(EqualsElement(expected_element))); + EXPECT_CALL(mock_web_controller_, + ScrollToElementPosition(_, _, EqualsElement(expected_element), _)) + .WillOnce(RunOnceCallback<3>(OkClientStatus())); EXPECT_CALL(mock_action_delegate_, SetTouchableElementArea(_)); ProcessedActionProto capture; @@ -190,8 +195,9 @@ ON_CALL(mock_action_delegate_, WaitUntilDocumentIsInReadyState(_, _, _, _)) .WillByDefault(RunOnceCallback<3>(OkClientStatus(), base::TimeDelta::FromSeconds(0))); - ON_CALL(mock_action_delegate_, ScrollToElementPosition(_, _, _, _, _)) - .WillByDefault(RunOnceCallback<4>(OkClientStatus())); + EXPECT_CALL(mock_action_delegate_, StoreScrolledToElement(_)); + ON_CALL(mock_web_controller_, ScrollToElementPosition(_, _, _, _)) + .WillByDefault(RunOnceCallback<3>(OkClientStatus())); Selector selector({"#focus"}); *proto_.mutable_element_to_present() = selector.proto;
diff --git a/components/autofill_assistant/browser/protocol_utils.cc b/components/autofill_assistant/browser/protocol_utils.cc index 1ab909f..67fd6d1 100644 --- a/components/autofill_assistant/browser/protocol_utils.cc +++ b/components/autofill_assistant/browser/protocol_utils.cc
@@ -16,7 +16,9 @@ #include "components/autofill_assistant/browser/actions/collect_user_data_action.h" #include "components/autofill_assistant/browser/actions/configure_bottom_sheet_action.h" #include "components/autofill_assistant/browser/actions/configure_ui_state_action.h" +#include "components/autofill_assistant/browser/actions/delete_password_action.h" #include "components/autofill_assistant/browser/actions/dispatch_js_event_action.h" +#include "components/autofill_assistant/browser/actions/edit_password_action.h" #include "components/autofill_assistant/browser/actions/expect_navigation_action.h" #include "components/autofill_assistant/browser/actions/generate_password_for_form_field_action.h" #include "components/autofill_assistant/browser/actions/get_element_status_action.h" @@ -233,9 +235,14 @@ return std::make_unique<PresaveGeneratedPasswordAction>(delegate, action); case ActionProto::ActionInfoCase::kGetElementStatus: return std::make_unique<GetElementStatusAction>(delegate, action); - case ActionProto::ActionInfoCase::kScrollIntoView: - return PerformOnSingleElementAction::WithClientId( - delegate, action, action.scroll_into_view().client_id(), + case ActionProto::ActionInfoCase::kScrollIntoView: { + auto actions = + std::make_unique<element_action_util::ElementActionVector>(); + action_delegate_util::AddStepWithoutCallback( + base::BindOnce(&ActionDelegate::StoreScrolledToElement, + delegate->GetWeakPtr()), + actions.get()); + actions->emplace_back( base::BindOnce(&WebController::ScrollIntoView, delegate->GetWebController()->GetWeakPtr(), action.scroll_into_view().animation(), @@ -245,6 +252,10 @@ action.scroll_into_view().has_horizontal_alignment() ? action.scroll_into_view().horizontal_alignment() : "center")); + return PerformOnSingleElementAction::WithClientId( + delegate, action, action.scroll_into_view().client_id(), + base::BindOnce(&element_action_util::PerformAll, std::move(actions))); + } case ActionProto::ActionInfoCase::kWaitForDocumentToBecomeInteractive: return PerformOnSingleElementAction::WithOptionalClientIdTimed( delegate, action, @@ -386,6 +397,10 @@ action.scroll_container().animation())); case ActionProto::ActionInfoCase::kSetTouchableArea: return std::make_unique<SetTouchableAreaAction>(delegate, action); + case ActionProto::ActionInfoCase::kDeletePassword: + return std::make_unique<DeletePasswordAction>(delegate, action); + case ActionProto::ActionInfoCase::kEditPassword: + return std::make_unique<EditPasswordAction>(delegate, action); case ActionProto::ActionInfoCase::ACTION_INFO_NOT_SET: { VLOG(1) << "Encountered action with ACTION_INFO_NOT_SET"; return std::make_unique<UnsupportedAction>(delegate, action);
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc index c5672408..2d5c030 100644 --- a/components/autofill_assistant/browser/script_executor.cc +++ b/components/autofill_assistant/browser/script_executor.cc
@@ -509,16 +509,9 @@ selector, std::move(callback)); } -void ScriptExecutor::ScrollToElementPosition( - const Selector& selector, - const TopPadding& top_padding, - std::unique_ptr<ElementFinder::Result> container, - const ElementFinder::Result& element, - base::OnceCallback<void(const ClientStatus&)> callback) { - last_focused_element_selector_ = selector; - last_focused_element_top_padding_ = top_padding; - delegate_->GetWebController()->ScrollToElementPosition( - std::move(container), top_padding, element, std::move(callback)); +void ScriptExecutor::StoreScrolledToElement( + const ElementFinder::Result& element) { + last_focused_element_ = element.dom_object; } void ScriptExecutor::SetTouchableElementArea( @@ -1347,24 +1340,31 @@ void ScriptExecutor::WaitForDomOperation::RestorePreInterruptScroll() { if (!saved_pre_interrupt_state_) return; + if (!main_script_->last_focused_element_.has_value()) + return; - if (!main_script_->last_focused_element_selector_.empty()) { - auto actions = std::make_unique<element_action_util::ElementActionVector>(); - action_delegate_util::AddStepIgnoreTiming( - base::BindOnce(&ActionDelegate::WaitUntilDocumentIsInReadyState, - main_script_->GetWeakPtr(), - delegate_->GetSettings().document_ready_check_timeout, - DOCUMENT_INTERACTIVE), - actions.get()); - actions->emplace_back(base::BindOnce( - &ActionDelegate::ScrollToElementPosition, main_script_->GetWeakPtr(), - main_script_->last_focused_element_selector_, - main_script_->last_focused_element_top_padding_, nullptr)); - action_delegate_util::FindElementAndPerform( - main_script_, main_script_->last_focused_element_selector_, - base::BindOnce(&element_action_util::PerformAll, std::move(actions)), - base::DoNothing()); + auto element = std::make_unique<ElementFinder::Result>(); + if (!main_script_->GetElementStore() + ->RestoreElement(*main_script_->last_focused_element_, element.get()) + .ok()) { + return; } + + auto actions = std::make_unique<element_action_util::ElementActionVector>(); + action_delegate_util::AddStepIgnoreTiming( + base::BindOnce(&ActionDelegate::WaitUntilDocumentIsInReadyState, + main_script_->GetWeakPtr(), + delegate_->GetSettings().document_ready_check_timeout, + DOCUMENT_INTERACTIVE), + actions.get()); + actions->emplace_back( + base::BindOnce(&WebController::ScrollIntoViewIfNeeded, + main_script_->GetWebController()->GetWeakPtr(), + /* center= */ true)); + element_action_util::TakeElementAndPerform( + base::BindOnce(&element_action_util::PerformAll, std::move(actions)), + /* done= */ base::DoNothing(), /* element_status= */ OkClientStatus(), + std::move(element)); } ScriptExecutor::CurrentActionData::CurrentActionData() = default;
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h index b1106edb..7d37fb6d 100644 --- a/components/autofill_assistant/browser/script_executor.h +++ b/components/autofill_assistant/browser/script_executor.h
@@ -27,6 +27,7 @@ #include "components/autofill_assistant/browser/service.pb.h" #include "components/autofill_assistant/browser/top_padding.h" #include "components/autofill_assistant/browser/wait_for_dom_observer.h" +#include "components/autofill_assistant/browser/web/element.h" #include "components/autofill_assistant/browser/web/element_finder.h" #include "components/autofill_assistant/browser/web/element_store.h" @@ -197,12 +198,7 @@ const autofill::FormData& form_data, const autofill::FormFieldData& field_data)> callback) override; - void ScrollToElementPosition( - const Selector& selector, - const TopPadding& top_padding, - std::unique_ptr<ElementFinder::Result> container, - const ElementFinder::Result& element, - base::OnceCallback<void(const ClientStatus&)> callback) override; + void StoreScrolledToElement(const ElementFinder::Result& element) override; void SetTouchableElementArea( const ElementAreaProto& touchable_element_area) override; void ExpectNavigation() override; @@ -491,8 +487,7 @@ bool should_clean_contextual_ui_on_finish_ = false; ActionProto::ActionInfoCase previous_action_type_ = ActionProto::ACTION_INFO_NOT_SET; - Selector last_focused_element_selector_; - TopPadding last_focused_element_top_padding_; + absl::optional<DomObjectFrameStack> last_focused_element_; std::unique_ptr<ElementAreaProto> touchable_element_area_; // Steps towards the requirements for calling |on_expected_navigation_done_|
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index 7abcb83..c57729e 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -764,6 +764,8 @@ ScrollWindowProto scroll_window = 80; ScrollContainerProto scroll_container = 81; SetTouchableAreaProto set_touchable_area = 82; + DeleteSelectedPasswordProto delete_password = 83; + EditSelectedPasswordProto edit_password = 84; } // Set to true to make the client remove any contextual information if the @@ -2544,6 +2546,19 @@ optional string memory_key = 1; } +// Deletes password for |UserData::selected_login_| from Chrome Password +// Manager. For flows, other than password change, |CollectUserData| must be +// called before |DeleteSelectedPasswowrd|. +message DeleteSelectedPasswordProto {} + +// Edits password for |UserData::selected_login_| in Chrome Password Manager. +// For flows, other than password change, |CollectUserData| must be +// called before |DeleteSelectedPasswowrd|. +message EditSelectedPasswordProto { + // The client memory key where the new password is stored. + optional string memory_key = 1; +} + // Configures the UI of the autofill assistant client. message ConfigureUiStateProto { enum OverlayBehavior {
diff --git a/components/autofill_assistant/browser/web/element_store.cc b/components/autofill_assistant/browser/web/element_store.cc index 3310af80..04bed88 100644 --- a/components/autofill_assistant/browser/web/element_store.cc +++ b/components/autofill_assistant/browser/web/element_store.cc
@@ -32,15 +32,20 @@ return ClientStatus(CLIENT_ID_RESOLUTION_FAILED); } - out_element->dom_object = it->second; - auto* frame = FindCorrespondingRenderFrameHost(out_element->node_frame_id(), - web_contents_); + return RestoreElement(it->second, out_element); +} + +ClientStatus ElementStore::RestoreElement( + const DomObjectFrameStack& object, + ElementFinder::Result* out_element) const { + out_element->dom_object = object; + auto* frame = FindCorrespondingRenderFrameHost( + object.object_data.node_frame_id, web_contents_); if (frame == nullptr) { VLOG(1) << __func__ << " failed to resolve frame."; return ClientStatus(CLIENT_ID_RESOLUTION_FAILED); } out_element->container_frame_host = frame; - return OkClientStatus(); }
diff --git a/components/autofill_assistant/browser/web/element_store.h b/components/autofill_assistant/browser/web/element_store.h index 665f8e1..f3811e45 100644 --- a/components/autofill_assistant/browser/web/element_store.h +++ b/components/autofill_assistant/browser/web/element_store.h
@@ -38,6 +38,11 @@ virtual ClientStatus GetElement(const std::string& client_id, ElementFinder::Result* out_element) const; + // Restore an element. If the element cannot be reconstructed, this returns + // an error status. + ClientStatus RestoreElement(const DomObjectFrameStack& object, + ElementFinder::Result* out_element) const; + // Removes an element. Returns true if the element was removed. bool RemoveElement(const std::string& client_id);
diff --git a/components/autofill_assistant/browser/web/mock_web_controller.h b/components/autofill_assistant/browser/web/mock_web_controller.h index fbe5ab2..b846059 100644 --- a/components/autofill_assistant/browser/web/mock_web_controller.h +++ b/components/autofill_assistant/browser/web/mock_web_controller.h
@@ -34,6 +34,11 @@ void(const Selector& selector, ElementFinder::Callback& callback)); + MOCK_METHOD4(ScrollToElementPosition, + void(std::unique_ptr<ElementFinder::Result>, + const TopPadding&, + const ElementFinder::Result&, + base::OnceCallback<void(const ClientStatus&)>)); MOCK_METHOD5(ScrollIntoView, void(const std::string&, const std::string&,
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index c9aaa8f..854e6543 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -157,7 +157,7 @@ <translation id="5313967007315987356">Ajouter un site</translation> <translation id="5317780077021120954">Enregistrer</translation> <translation id="5335288049665977812">Autoriser les sites à exécuter JavaScript (recommandé)</translation> -<translation id="534295439873310000">Appareils NFC</translation> +<translation id="534295439873310000">Appareils CCP</translation> <translation id="5354152178998424783">Cette action effacera <ph name="DATASIZE" /> de données et de témoins qu'ont stockés des sites.</translation> <translation id="5391532827096253100">Votre connexion à ce site n'est pas sécurisée. Renseignements sur le site</translation> <translation id="5394307150471348411">{DETAIL_COUNT,plural, =1{(+ 1 autre)}one{(+ # autre)}other{(+ # autres)}}</translation> @@ -175,7 +175,7 @@ <translation id="5677928146339483299">Bloqué</translation> <translation id="5689516760719285838">Lieu</translation> <translation id="5690795753582697420">L'appareil photo est désactivé dans les paramètres d'Android</translation> -<translation id="5710871682236653961">Demander avant d'autoriser les sites à envoyer et à recevoir de l'information lorsque vous touchez des appareils NFC (recommandé)</translation> +<translation id="5710871682236653961">Demander avant d'autoriser les sites à envoyer et à recevoir de l'information lorsque vous touchez des appareils CCP (recommandé)</translation> <translation id="5719847187258001597">Cette action entraînera la suppression de l'ensemble des données et des témoins stockés par <ph name="ORIGIN" /> ou son application installée sur votre écran d'accueil.</translation> <translation id="5771720122942595109">Autorisation <ph name="PERMISSION_1" /> bloquée</translation> <translation id="5804241973901381774">Autorisations</translation> @@ -221,7 +221,7 @@ <translation id="6766622839693428701">Glissez le doigt vers le bas pour fermer.</translation> <translation id="6790428901817661496">Jouer</translation> <translation id="6818926723028410516">Sélectionner des éléments</translation> -<translation id="6864395892908308021">Cet appareil ne prend pas en charge la technologie NFC</translation> +<translation id="6864395892908308021">Cet appareil ne prend pas en charge la technologie CCP</translation> <translation id="6910211073230771657">Supprimé</translation> <translation id="6912998170423641340">Empêcher les sites de lire du texte et des images du presse-papiers</translation> <translation id="6945221475159498467">Sélectionner</translation> @@ -246,7 +246,7 @@ <translation id="7521387064766892559">JavaScript</translation> <translation id="7554752735887601236">Un site utilise votre microphone</translation> <translation id="7561196759112975576">Toujours</translation> -<translation id="7572498721684305250">Empêcher les sites d'envoyer et de recevoir de l'information lorsque vous touchez des appareils NFC</translation> +<translation id="7572498721684305250">Empêcher les sites d'envoyer et de recevoir de l'information lorsque vous touchez des appareils CCP</translation> <translation id="757524316907819857">Empêcher les sites de lire du contenu protégé</translation> <translation id="7589445247086920869">Bloquer pour le moteur de recherche actuel</translation> <translation id="7649070708921625228">Aide</translation> @@ -309,7 +309,7 @@ <translation id="8847988622838149491">USB</translation> <translation id="8903921497873541725">Zoom avant</translation> <translation id="8921772741368021346"><ph name="POSITION" /> sur <ph name="DURATION" /></translation> -<translation id="8926666909099850184">La NFC est désactivée pour cet appareil. Activez-la dans le menu <ph name="BEGIN_LINK" />Paramètres Android<ph name="END_LINK" />.</translation> +<translation id="8926666909099850184">La CCP est désactivée pour cet appareil. Activez-la dans le menu <ph name="BEGIN_LINK" />Paramètres Android<ph name="END_LINK" />.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8958424370300090006">Bloquer les témoins pour un site en particulier.</translation> <translation id="8959122750345127698">Navigation inaccessible : <ph name="URL" /></translation>
diff --git a/components/browser_ui/styles/android/java/res/values-night/styles.xml b/components/browser_ui/styles/android/java/res/values-night/styles.xml index cd3d8a6..c08ed325 100644 --- a/components/browser_ui/styles/android/java/res/values-night/styles.xml +++ b/components/browser_ui/styles/android/java/res/values-night/styles.xml
@@ -17,7 +17,6 @@ <item name="colorSurface">@color/modern_grey_900</item> <item name="colorOnBackground">@color/modern_white</item> <item name="colorOnPrimary">@color/modern_blue_800</item> - <item name="colorOnPrimaryContainer">@color/baseline_primary_900</item> <item name="colorOnSurface">@color/modern_grey_100</item> <item name="colorOnSurfaceVariant">@color/white_alpha_70</item> <item name="colorOnSurfaceInverse">@color/modern_grey_800</item>
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml index 9000b14..7b6d19f 100644 --- a/components/browser_ui/styles/android/java/res/values/styles.xml +++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -202,7 +202,6 @@ <item name="colorSurfaceVariant">@color/baseline_neutral_variant_100</item> <item name="colorOnBackground">@color/modern_grey_900</item> <item name="colorOnPrimary">@color/modern_white</item> - <item name="colorOnPrimaryContainer">@color/baseline_primary_900</item> <item name="colorOnSurface">@color/modern_grey_900</item> <item name="colorOnSurfaceVariant">@color/modern_grey_700</item> <item name="colorOnSurfaceInverse">@color/modern_white</item>
diff --git a/components/client_hints/README.md b/components/client_hints/README.md index 202a31d..3c224d75 100644 --- a/components/client_hints/README.md +++ b/components/client_hints/README.md
@@ -76,14 +76,26 @@ ### Adding a new client hint token -The canonical enum for client hint tokens is [network::mojom::WebClientHintsType]. Any new token should be added to the end of that list. Along with that, a string of the token/header name should be added to: +The canonical enum for client hint tokens is [network::mojom::WebClientHintsType]. Any new token should be added to the end of that list. Along with that: -* `kClientHintsNameMapping` in [/services/network/public/cpp/client_hints.cc] -* `kClientHintsHeaderMapping` in [/third_party/blink/common/client_hints/client_hints.cc] +* Add the header name to `kClientHintsNameMapping` in [/services/network/public/cpp/client_hints.cc]. +* Add the header name to `kClientHintsHeaderMapping` in [/third_party/blink/common/client_hints/client_hints.cc] and update its test. +* Add an enum value to `WebFeature` in [/third_party/blink/public/mojom/web_feature/web_feature.mojom]. +* Add the feature enum to `kWebFeatureMapping` in [/third_party/blink/renderer/core/loader/frame_client_hints_preferences_context.cc]. +* Add the client hint header to the `Accept-CH` header in the appropriate test files in [/chrome/test/data/client_hints/] and [/third_party/blink/web_tests/external/wpt/client-hints]. +* Update `expected_client_hints_number` to the current value + 1 in [/chrome/browser/client_hints/client_hints_browsertest.cc]. **NOTE:** It’s very important that the order of these arrays remain in sync. -There should also be a new feature policy created, which should go in [/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5](/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5), and the header should be added to the cors `safe_names` list in [/services/network/public/cpp/cors/cors.cc](/services/network/public/cpp/cors/cors.cc) +There should also be a new feature policy created: + +* Define the permission policy in [/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5](/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5). +* Add an enum to [/third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom](/third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom). +* Add the same enum to `kClientHintsPermissionsPolicyMapping` in [/third_party/blink/common/client_hints/client_hints.cc]. +* Add the permission policy token to the `PermissionsPolicyFeature` enum in [/third_party/blink/public/devtools_protocol/browser_protocol.pdl], [/third_party/devtools-frontend/src/third_party/blink/public/devtools_protocol/browser_protocol.pdl], and [/third_party/devtools-frontend/src/third_party/blink/public/devtools_protocol/browser_protocol.json]. +* Add the permission policy token to [/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt] and [/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt]. + +The header should also be added to the cors `safe_names` list in [/services/network/public/cpp/cors/cors.cc](/services/network/public/cpp/cors/cors.cc) and update its test. TODO(crbug.com/1176808): There should be UseCounters measuring usage, but there are not currently.
diff --git a/components/enterprise/common/proto/connectors.proto b/components/enterprise/common/proto/connectors.proto index 8a2a166f..b8d625ee 100644 --- a/components/enterprise/common/proto/connectors.proto +++ b/components/enterprise/common/proto/connectors.proto
@@ -41,6 +41,9 @@ // Optional email address of user. This field may be empty if the user // is not signed in. optional string email = 5; + + // MimeType of the field as detected by Chrome. + optional string content_type = 6; } message ClientMetadata {
diff --git a/components/feed/core/common/pref_names.cc b/components/feed/core/common/pref_names.cc index 085e32b..c799625 100644 --- a/components/feed/core/common/pref_names.cc +++ b/components/feed/core/common/pref_names.cc
@@ -43,7 +43,6 @@ const char kEnableWebFeedFollowIntroDebug[] = "webfeed_follow_intro_debug.enable"; const char kReliabilityLoggingIdSalt[] = "feedv2.reliability_logging_id_salt"; -const char kIsWebFeedSubscriber[] = "webfeed.is_subscriber"; const char kHasStoredData[] = "feedv2.has_stored_data"; } // namespace prefs @@ -64,8 +63,9 @@ const char kUserClassifierLastTimeToUseSuggestions[] = "feed.user_classifier.last_time_to_use_suggestions"; -// Deprecated 05/2021 (can be removed along with 02/2021) +// Deprecated May/June 2021 const char kEnableWebFeedUI[] = "webfeed_ui.enable"; +const char kIsWebFeedSubscriber[] = "webfeed.is_subscriber"; void RegisterObsoletePrefsFeb_2021(PrefRegistrySimple* registry) { registry->RegisterBooleanPref(kLastRefreshWasSignedIn, false); @@ -80,8 +80,13 @@ base::Time()); registry->RegisterTimePref(kUserClassifierLastTimeToUseSuggestions, base::Time()); - registry->RegisterBooleanPref(kEnableWebFeedUI, false); } + +void RegisterObsoletePrefsJune_2021(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(kEnableWebFeedUI, false); + registry->RegisterBooleanPref(kIsWebFeedSubscriber, false); +} + } // namespace void RegisterProfilePrefs(PrefRegistrySimple* registry) { @@ -107,7 +112,6 @@ registry->RegisterBooleanPref(feed::prefs::kEnableWebFeedFollowIntroDebug, false); registry->RegisterUint64Pref(feed::prefs::kReliabilityLoggingIdSalt, 0); - registry->RegisterBooleanPref(feed::prefs::kIsWebFeedSubscriber, false); registry->RegisterBooleanPref(feed::prefs::kHasStoredData, false); #if defined(OS_IOS) @@ -116,6 +120,7 @@ #endif // defined(OS_IOS) RegisterObsoletePrefsFeb_2021(registry); + RegisterObsoletePrefsJune_2021(registry); } void MigrateObsoleteProfilePrefsFeb_2021(PrefService* prefs) { @@ -127,7 +132,11 @@ prefs->ClearPref(kUserClassifierAverageSuggestionsUsedPerHour); prefs->ClearPref(kUserClassifierLastTimeToViewSuggestions); prefs->ClearPref(kUserClassifierLastTimeToUseSuggestions); +} + +void MigrateObsoleteProfilePrefsJune_2021(PrefService* prefs) { prefs->ClearPref(kEnableWebFeedUI); + prefs->ClearPref(kIsWebFeedSubscriber); } } // namespace feed
diff --git a/components/feed/core/common/pref_names.h b/components/feed/core/common/pref_names.h index 2f835fb5..8a347c8 100644 --- a/components/feed/core/common/pref_names.h +++ b/components/feed/core/common/pref_names.h
@@ -72,8 +72,6 @@ extern const char kEnableWebFeedFollowIntroDebug[]; // Random bytes used in generating reliability logging ID. extern const char kReliabilityLoggingIdSalt[]; -// Whether the user has subscribed to a web feed. -extern const char kIsWebFeedSubscriber[]; // Whether the Feed may have data stored, which should be deleted if the Feed // is ever turned off. extern const char kHasStoredData[]; @@ -82,6 +80,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry); void MigrateObsoleteProfilePrefsFeb_2021(PrefService* prefs); +void MigrateObsoleteProfilePrefsJune_2021(PrefService* prefs); } // namespace feed
diff --git a/components/feed/core/proto/v2/ui.proto b/components/feed/core/proto/v2/ui.proto index 819c1288..5a4b7b5 100644 --- a/components/feed/core/proto/v2/ui.proto +++ b/components/feed/core/proto/v2/ui.proto
@@ -57,6 +57,8 @@ NO_CARDS_AVAILABLE = 1; // An error indicating there were problems refreshing the feed. CANT_REFRESH = 2; + // There is no content because there are no web feed subscriptions. + NO_WEB_FEED_SUBSCRIPTIONS = 3; }; Type type = 1; }
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn index 6a0feaa..b48f2e9 100644 --- a/components/feed/core/v2/BUILD.gn +++ b/components/feed/core/v2/BUILD.gn
@@ -212,6 +212,7 @@ public_deps = [ ":test_helpers" ] deps = [ + ":feed_core_stubs", ":feed_core_v2", ":unit_tests_bundle_data", "public:common",
diff --git a/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc b/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc index c9a4a39c..5f72aade 100644 --- a/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_notice_card_unittest.cc
@@ -21,6 +21,7 @@ namespace test { namespace { class FeedApiNoticeCardTest : public FeedApiTest { + public: void SetUp() override { FeedApiTest::SetUp(); model_generator_.privacy_notice_fulfilled = true; @@ -31,10 +32,14 @@ }; class FeedStreamConditionalActionsUploadTest : public FeedApiNoticeCardTest { - void SetupFeatures() override { + public: + FeedStreamConditionalActionsUploadTest() { scoped_feature_list_.InitAndEnableFeature( feed::kInterestFeedV2ClicksAndViewsConditionalUpload); } + + private: + base::test::ScopedFeatureList scoped_feature_list_; }; TEST_F(FeedApiNoticeCardTest, LoadStreamSendsNoticeCardAcknowledgement) { @@ -80,6 +85,9 @@ // that should be dropped => (5) Simulate the backgrounding of the app to // enable actions upload => (6) Trigger an upload which will upload the // stored ThereAndBackAgain action. + + // WebFeed stream is only fetched when there's a subscription. + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); response_translator_.InjectResponse(model_generator_.MakeFirstPage()); TestWebFeedSurface surface(stream_.get()); WaitForIdleTaskQueue();
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc index 6d87aab0..89bb5f58 100644 --- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -13,6 +13,7 @@ #include "components/feed/core/shared_prefs/pref_names.h" #include "components/feed/core/v2/api_test/feed_api_test.h" #include "components/feed/core/v2/config.h" +#include "components/feed/core/v2/enums.h" #include "components/feed/core/v2/feed_network.h" #include "components/feed/core/v2/feed_stream.h" #include "components/feed/core/v2/feedstore_util.h" @@ -106,7 +107,7 @@ stream_->ExecuteRefreshTask(RefreshTaskId::kRefreshForYouFeed); WaitForIdleTaskQueue(); - EXPECT_EQ(metrics_reporter_->background_refresh_status, + EXPECT_EQ(metrics_reporter_->Stream(kForYouStream).background_refresh_status, LoadStreamStatus::kModelAlreadyLoaded); } @@ -283,6 +284,7 @@ TEST_P(FeedStreamTestForAllStreamTypes, LoadFromNetwork) { { + WaitForIdleTaskQueue(); auto metadata = stream_->GetMetadata(); metadata.set_consistency_token("token"); stream_->SetMetadata(metadata); @@ -309,6 +311,13 @@ ModelStateFor(GetStreamType(), store_.get())); } +TEST_F(FeedApiTest, WebFeedLoadWithNoSubscriptions) { + TestWebFeedSurface surface(stream_.get()); + WaitForIdleTaskQueue(); + + EXPECT_EQ("loading -> no-subscriptions", surface.DescribeUpdates()); +} + // Test that we use QueryInteractiveFeedDiscoverApi and QueryNextPageDiscoverApi // when kDiscoFeedEndpoint is enabled. TEST_F(FeedApiTest, LoadFromNetworkDiscoFeedEnabled) { @@ -345,7 +354,7 @@ features.InitWithFeatures(enabled_features, disabled_features); // WebFeed stream is only fetched when there's a subscription. - FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); // Force a refresh that results in a successful load of both feed types. response_translator_.InjectResponse(MakeTypicalInitialModelState()); @@ -392,12 +401,8 @@ } TEST_F(FeedApiTest, ForceRefreshForDebugging) { - // Enable WebFeed and subscribe to a page, so that we can check if the WebFeed - // is refreshed by ForceRefreshForDebugging. - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(kWebFeed); // WebFeed stream is only fetched when there's a subscription. - FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); // Force a refresh that results in a successful load of both feed types. response_translator_.InjectResponse(MakeTypicalInitialModelState()); @@ -741,6 +746,9 @@ } TEST_F(FeedApiTest, WebFeedUsesSignedInRequestAfterHistoryIsDeleted) { + // WebFeed stream is only fetched when there's a subscription. + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + stream_->OnAllHistoryDeleted(); response_translator_.InjectResponse(MakeTypicalInitialModelState()); @@ -1333,8 +1341,14 @@ ASSERT_EQ("loading -> 2 slices -> loading -> cant-refresh", surface.DescribeUpdates()); - - EXPECT_EQ("{\n}\n\n", DumpStoreState()); + EXPECT_EQ(R"("m": { +} +"recommendedIndex": { +} +"subs": { +} +)", + DumpStoreState(true)); EXPECT_EQ("", stream_->GetMetadata().consistency_token()); EXPECT_FALSE(stream_->IsActivityLoggingEnabled(kForYouStream)); } @@ -1702,7 +1716,7 @@ // Creating a stream should init database. CreateStream(); - EXPECT_EQ("{\n}\n\n", DumpStoreState()); + EXPECT_EQ("{\n}\n", DumpStoreState()); EXPECT_EQ("", stream_->GetMetadata().consistency_token()); } @@ -2062,6 +2076,9 @@ TEST_F(FeedApiTest, LoadMultipleStreams) { response_translator_.InjectResponse(MakeTypicalInitialModelState()); response_translator_.InjectResponse(MakeTypicalInitialModelState()); + // WebFeed stream is only fetched when there's a subscription. + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + TestForYouSurface for_you_surface(stream_.get()); TestWebFeedSurface web_feed_surface(stream_.get()); @@ -2072,6 +2089,9 @@ } TEST_F(FeedApiTest, UnloadOnlyOneOfMultipleModels) { + // WebFeed stream is only fetched when there's a subscription. + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + Config config; config.model_unload_timeout = base::TimeDelta::FromSeconds(1); SetFeedConfigForTesting(config); @@ -2182,11 +2202,8 @@ TEST_F(FeedApiTest, LoadingForYouStreamTriggersWebFeedRefreshIfNoUnreadContent) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(kWebFeed); - // WebFeed stream is only fetched when there's a subscription. - FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); // Both streams should be fetched. response_translator_.InjectResponse(MakeTypicalInitialModelState()); @@ -2209,9 +2226,6 @@ TEST_F(FeedApiTest, LoadingForYouStreamDoesNotTriggerWebFeedRefreshIfNoSubscriptions) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(kWebFeed); - // Only for-you feed is fetched on load. response_translator_.InjectResponse(MakeTypicalInitialModelState()); TestForYouSurface surface(stream_.get()); @@ -2220,16 +2234,16 @@ EXPECT_EQ("loading -> 2 slices", surface.DescribeUpdates()); EXPECT_EQ(LoadStreamStatus::kLoadedFromNetwork, metrics_reporter_->load_stream_status); + EXPECT_EQ( + LoadStreamStatus::kNotAWebFeedSubscriber, + metrics_reporter_->Stream(kWebFeedStream).background_refresh_status); } TEST_F( FeedApiTest, LoadForYouStreamDoesNotTriggerWebFeedRefreshContentIfIsAlreadyAvailable) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(kWebFeed); - // WebFeed stream is only fetched when there's a subscription. - FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); // Both streams should be fetched because there is no unread web-feed content. response_translator_.InjectResponse(MakeTypicalInitialModelState());
diff --git a/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc b/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc index fc04f93..4a9c8a1 100644 --- a/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc
@@ -45,7 +45,6 @@ class FeedApiSubscriptionsTest : public FeedApiTest { public: void SetUp() override { - subscription_feature_list_.InitAndEnableFeature(kWebFeed); FeedApiTest::SetUp(); } @@ -112,21 +111,9 @@ network_.InjectResponse(response); } - void InjectListWebFeedsResponse( - std::vector<feedwire::webfeed::WebFeed> web_feeds) { - feedwire::webfeed::ListWebFeedsResponse response; - for (const auto& feed : web_feeds) { - *response.add_web_feeds() = feed; - } - network_.InjectResponse(response); - } - WebFeedSubscriptionCoordinator& subscriptions() { return stream_->subscriptions(); } - - private: - base::test::ScopedFeatureList subscription_feature_list_; }; TEST_F(FeedApiSubscriptionsTest, FollowWebFeedSuccess) { @@ -789,7 +776,7 @@ TEST_F(FeedApiSubscriptionsTest, SubscribedWebFeedsAreFetchedAfterStartup) { SetUpWithDefaultConfig(); - InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); // Wait until the delayed task runs, and verify the network request was sent. task_environment_.FastForwardBy(GetFeedConfig().fetch_web_feed_info_delay + @@ -810,14 +797,13 @@ "{ WebFeedMetadata{ id=id_cats title=Title cats " "publisher_url=https://cats.com/ status=kSubscribed } }", PrintToString(CheckAllSubscriptions())); - EXPECT_TRUE(subscriptions().IsWebFeedSubscriber()); } TEST_F(FeedApiSubscriptionsTest, SubscribedWebFeedsAreClearedOnSignOut) { // Populate web feeds at startup for a signed-in users. { SetUpWithDefaultConfig(); - InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); // Wait until the delayed task runs, and verify the network request was // sent. @@ -837,14 +823,13 @@ WaitForIdleTaskQueue(); ASSERT_EQ(1, network_.GetListFollowedWebFeedsRequestCount()); EXPECT_EQ("{}", PrintToString(CheckAllSubscriptions())); - EXPECT_FALSE(subscriptions().IsWebFeedSubscriber()); } TEST_F(FeedApiSubscriptionsTest, SubscribedWebFeedsAreFetchedAfterSignInButNotSignOut) { SetUpWithDefaultConfig(); - InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); - InjectListWebFeedsResponse({MakeWireWebFeed("dogs")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("dogs")}); // Wait until the delayed task runs, and verify the network request was sent. task_environment_.FastForwardBy(GetFeedConfig().fetch_web_feed_info_delay + @@ -877,7 +862,7 @@ // SubscribedWebFeedsAreFetchedAfterStartup. { SetUpWithDefaultConfig(); - InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); task_environment_.FastForwardBy(GetFeedConfig().fetch_web_feed_info_delay + base::TimeDelta::FromSeconds(1)); @@ -901,7 +886,7 @@ { task_environment_.FastForwardBy( GetFeedConfig().subscribed_feeds_staleness_threshold); - InjectListWebFeedsResponse({MakeWireWebFeed("catsv2")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("catsv2")}); CreateStream(); task_environment_.FastForwardBy(GetFeedConfig().fetch_web_feed_info_delay + @@ -923,7 +908,7 @@ } base::HistogramTester histograms; CallbackReceiver<WebFeedSubscriptions::RefreshResult> result; - InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); subscriptions().RefreshSubscriptions(result.Bind()); @@ -958,7 +943,7 @@ TEST_F(FeedApiSubscriptionsTest, RefreshSubscriptionsDuringRefresh) { CallbackReceiver<WebFeedSubscriptions::RefreshResult> result1; CallbackReceiver<WebFeedSubscriptions::RefreshResult> result2; - InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); subscriptions().RefreshSubscriptions(result1.Bind()); subscriptions().RefreshSubscriptions(result2.Bind());
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc index dab5995..9ee5994 100644 --- a/components/feed/core/v2/api_test/feed_api_test.cc +++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -39,6 +39,7 @@ #include "components/feed/core/v2/test/test_util.h" #include "components/feed/feed_feature_list.h" #include "components/leveldb_proto/public/proto_database_provider.h" +#include "testing/gtest/include/gtest/gtest.h" namespace feed { namespace test { @@ -662,6 +663,9 @@ TestMetricsReporter::TestMetricsReporter(PrefService* prefs) : MetricsReporter(prefs) {} TestMetricsReporter::~TestMetricsReporter() = default; +TestMetricsReporter::StreamMetrics::StreamMetrics() = default; +TestMetricsReporter::StreamMetrics::~StreamMetrics() = default; + void TestMetricsReporter::ContentSliceViewed(const StreamType& stream_type, int index_in_stream, int stream_slice_count) { @@ -698,8 +702,20 @@ void TestMetricsReporter::OnBackgroundRefresh(const StreamType& stream_type, LoadStreamStatus final_status) { background_refresh_status = final_status; + Stream(stream_type).background_refresh_status = final_status; MetricsReporter::OnBackgroundRefresh(stream_type, final_status); } + +TestMetricsReporter::StreamMetrics& TestMetricsReporter::Stream( + const StreamType& stream_type) { + if (stream_type.IsForYou()) + return for_you; + if (stream_type.IsWebFeed()) + return web_feed; + ADD_FAILURE() << stream_type << " case not supported here"; + return for_you; +} + void TestMetricsReporter::OnClearAll(base::TimeDelta time_since_last_clear) { this->time_since_last_clear = time_since_last_clear; MetricsReporter::OnClearAll(time_since_last_clear); @@ -709,10 +725,11 @@ MetricsReporter::OnUploadActions(status); } -FeedApiTest::FeedApiTest() = default; +FeedApiTest::FeedApiTest() { + scoped_feature_list_.InitAndEnableFeature(kWebFeed); +} FeedApiTest::~FeedApiTest() = default; void FeedApiTest::SetUp() { - SetupFeatures(); kTestTimeEpoch = base::Time::Now(); // Reset to default config, since tests can change it. @@ -834,7 +851,7 @@ if (print_keys) ss << '"' << item.first << "\": "; - ss << item.second << '\n'; + ss << item.second; } return ss.str(); } @@ -862,5 +879,12 @@ return id; } +void FeedStreamTestForAllStreamTypes::SetUp() { + // Enable web feeds and inject a subscription so that we attempt to load + // the web feed stream. + FeedApiTest::SetUp(); + network_.InjectListWebFeedsResponse({MakeWireWebFeed("cats")}); +} + } // namespace test } // namespace feed
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h index d018fefa..874adff 100644 --- a/components/feed/core/v2/api_test/feed_api_test.h +++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -247,6 +247,16 @@ void InjectResponse(feedwire::webfeed::ListWebFeedsResponse response) { InjectApiResponse<ListWebFeedsDiscoverApi>(std::move(response)); } + + void InjectListWebFeedsResponse( + std::vector<feedwire::webfeed::WebFeed> web_feeds) { + feedwire::webfeed::ListWebFeedsResponse response; + for (const auto& feed : web_feeds) { + *response.add_web_feeds() = feed; + } + InjectResponse(response); + } + void InjectEmptyActionRequestResult(); template <typename API> @@ -383,8 +393,17 @@ void OnClearAll(base::TimeDelta time_since_last_clear) override; void OnUploadActions(UploadActionsStatus status) override; - // Test access. + struct StreamMetrics { + StreamMetrics(); + ~StreamMetrics(); + StreamMetrics(const StreamMetrics&) = delete; + StreamMetrics& operator=(const StreamMetrics&) = delete; + absl::optional<LoadStreamStatus> background_refresh_status; + }; + StreamMetrics& Stream(const StreamType& stream_type); + + // Test access. absl::optional<int> slice_viewed_index; absl::optional<LoadStreamStatus> load_stream_status; absl::optional<LoadStreamStatus> load_stream_from_store_status; @@ -393,6 +412,9 @@ absl::optional<LoadStreamStatus> background_refresh_status; absl::optional<base::TimeDelta> time_since_last_clear; absl::optional<UploadActionsStatus> upload_action_status; + + StreamMetrics web_feed; + StreamMetrics for_you; }; class FeedApiTest : public testing::Test, public FeedStream::Delegate { @@ -400,9 +422,6 @@ FeedApiTest(); ~FeedApiTest() override; void SetUp() override; - - virtual void SetupFeatures() {} - void TearDown() override; // FeedStream::Delegate. @@ -459,10 +478,12 @@ bool is_eula_accepted_ = true; bool is_offline_ = false; std::string signed_in_gaia_ = "examplegaia"; - base::test::ScopedFeatureList scoped_feature_list_; int prefetch_image_call_count_ = 0; std::vector<GURL> prefetched_images_; base::RepeatingClosure on_clear_all_; + + private: + base::test::ScopedFeatureList scoped_feature_list_; }; class FeedStreamTestForAllStreamTypes @@ -476,7 +497,11 @@ : TestSurfaceBase(FeedStreamTestForAllStreamTypes::GetStreamType(), stream) {} }; + void SetUp() override; RefreshTaskId GetRefreshTaskId() const; + + private: + base::test::ScopedFeatureList feature_list_; }; class FeedNetworkEndpointTest
diff --git a/components/feed/core/v2/enums.cc b/components/feed/core/v2/enums.cc index 7a85577f..7980cb9 100644 --- a/components/feed/core/v2/enums.cc +++ b/components/feed/core/v2/enums.cc
@@ -67,6 +67,8 @@ return out << "kAbortWithPendingClearAll"; case LoadStreamStatus::kAlreadyHaveUnreadContent: return out << "kAlreadyHaveUnreadContent"; + case LoadStreamStatus::kNotAWebFeedSubscriber: + return out << "kNotAWebFeedSubscriber"; } #else return out << (static_cast<int>(value)); @@ -103,6 +105,7 @@ case LoadStreamStatus::kDataInStoreIsForAnotherUser: case LoadStreamStatus::kAbortWithPendingClearAll: case LoadStreamStatus::kAlreadyHaveUnreadContent: + case LoadStreamStatus::kNotAWebFeedSubscriber: return false; } }
diff --git a/components/feed/core/v2/enums.h b/components/feed/core/v2/enums.h index ec1d7a3..cc37dc65 100644 --- a/components/feed/core/v2/enums.h +++ b/components/feed/core/v2/enums.h
@@ -64,7 +64,8 @@ kDataInStoreIsForAnotherUser = 23, kAbortWithPendingClearAll = 24, kAlreadyHaveUnreadContent = 25, - kMaxValue = kAlreadyHaveUnreadContent, + kNotAWebFeedSubscriber = 26, + kMaxValue = kNotAWebFeedSubscriber, }; // Were we able to load fresh Feed data. This should be 'true' unless some kind
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index f4d7e307..93e51fa 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -134,7 +134,7 @@ has_stored_data_.Init(feed::prefs::kHasStoredData, profile_prefs); web_feed_subscription_coordinator_ = - std::make_unique<WebFeedSubscriptionCoordinator>(profile_prefs, this); + std::make_unique<WebFeedSubscriptionCoordinator>(this); // Inserting this task first ensures that |store_| is initialized before // it is used. @@ -270,8 +270,7 @@ // no unread content. if (base::FeatureList::IsEnabled(kWebFeed)) { if (result.stream_type.IsForYou()) { - if (!HasUnreadContent(kWebFeedStream) && - subscriptions().IsWebFeedSubscriber()) { + if (!HasUnreadContent(kWebFeedStream)) { LoadStreamTask::Options options; options.load_type = LoadStreamTask::LoadType::kBackgroundRefresh; options.stream_type = kWebFeedStream;
diff --git a/components/feed/core/v2/public/test/stub_web_feed_subscriptions.cc b/components/feed/core/v2/public/test/stub_web_feed_subscriptions.cc index 84c67a0..f1ed6441 100644 --- a/components/feed/core/v2/public/test/stub_web_feed_subscriptions.cc +++ b/components/feed/core/v2/public/test/stub_web_feed_subscriptions.cc
@@ -6,8 +6,4 @@ namespace feed { -bool StubWebFeedSubscriptions::IsWebFeedSubscriber() { - return {}; -} - } // namespace feed
diff --git a/components/feed/core/v2/public/test/stub_web_feed_subscriptions.h b/components/feed/core/v2/public/test/stub_web_feed_subscriptions.h index e9b5133d..ef09c77 100644 --- a/components/feed/core/v2/public/test/stub_web_feed_subscriptions.h +++ b/components/feed/core/v2/public/test/stub_web_feed_subscriptions.h
@@ -32,7 +32,7 @@ override {} void RefreshSubscriptions( base::OnceCallback<void(RefreshResult)> callback) override {} - bool IsWebFeedSubscriber() override; + void IsWebFeedSubscriber(base::OnceCallback<void(bool)> callback) override {} }; } // namespace feed
diff --git a/components/feed/core/v2/public/web_feed_subscriptions.h b/components/feed/core/v2/public/web_feed_subscriptions.h index 31de4fa..42005e2 100644 --- a/components/feed/core/v2/public/web_feed_subscriptions.h +++ b/components/feed/core/v2/public/web_feed_subscriptions.h
@@ -72,10 +72,10 @@ virtual void RefreshSubscriptions( base::OnceCallback<void(RefreshResult)> callback) = 0; - // Whether the user has subscribed to at least one web feed. - // Because this function returns synchronously, it may return the wrong value. - // TODO(crbug.com/1152592): Update this and its callers to use an async call. - virtual bool IsWebFeedSubscriber() = 0; + // Whether the user has subscribed to at least one web feed. May require + // fetching data from the server if cached data is not fresh. If fetching + // fails, returns the last-known state. + virtual void IsWebFeedSubscriber(base::OnceCallback<void(bool)> callback) = 0; }; } // namespace feed
diff --git a/components/feed/core/v2/surface_updater.cc b/components/feed/core/v2/surface_updater.cc index d0d5d74..b739862 100644 --- a/components/feed/core/v2/surface_updater.cc +++ b/components/feed/core/v2/surface_updater.cc
@@ -32,6 +32,8 @@ switch (type) { case feedui::ZeroStateSlice::NO_CARDS_AVAILABLE: return "no-cards"; + case feedui::ZeroStateSlice::NO_WEB_FEED_SUBSCRIPTIONS: + return "no-subscriptions"; case feedui::ZeroStateSlice::CANT_REFRESH: // fall-through default: return "cant-refresh"; @@ -158,6 +160,8 @@ case LoadStreamStatus::kCannotLoadFromNetworkThrottled: case LoadStreamStatus::kNetworkFetchFailed: return feedui::ZeroStateSlice::CANT_REFRESH; + case LoadStreamStatus::kNotAWebFeedSubscriber: + return feedui::ZeroStateSlice::NO_WEB_FEED_SUBSCRIPTIONS; case LoadStreamStatus::kNoStatus: case LoadStreamStatus::kLoadedFromStore: case LoadStreamStatus::kLoadedFromNetwork:
diff --git a/components/feed/core/v2/tasks/load_stream_task.cc b/components/feed/core/v2/tasks/load_stream_task.cc index 221acca1..3352fb97 100644 --- a/components/feed/core/v2/tasks/load_stream_task.cc +++ b/components/feed/core/v2/tasks/load_stream_task.cc
@@ -28,6 +28,7 @@ #include "components/feed/core/v2/tasks/upload_actions_task.h" #include "components/feed/core/v2/types.h" #include "components/feed/feed_feature_list.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace feed { namespace { @@ -74,9 +75,27 @@ LoadStreamTask::~LoadStreamTask() = default; void LoadStreamTask::Run() { + if (!CheckPreconditions()) + return; + + if (options_.stream_type.IsWebFeed()) { + Suspend(); + // Unretained is safe because `stream_` owns both this and + // `subscriptions()`. + stream_.subscriptions().IsWebFeedSubscriber(base::BindOnce( + &LoadStreamTask::CheckIfSubscriberComplete, base::Unretained(this))); + return; + } + + PassedPreconditions(); +} + +bool LoadStreamTask::CheckPreconditions() { if (stream_.ClearAllInProgress()) { - return Done({LoadStreamStatus::kAbortWithPendingClearAll, - feedwire::DiscoverLaunchResult::CLEAR_ALL_IN_PROGRESS}); + // TODO(iwells): add a DiscoverLaunchResult for this case? + Done({LoadStreamStatus::kAbortWithPendingClearAll, + feedwire::DiscoverLaunchResult::CLEAR_ALL_IN_PROGRESS}); + return false; } latencies_->StepComplete(LoadLatencyTimes::kTaskExecution); // Phase 1: Try to load from persistent storage. @@ -90,7 +109,8 @@ /*model_loading=*/true); if (should_not_attempt_reason.load_stream_status != LoadStreamStatus::kNoStatus) { - return Done(should_not_attempt_reason); + Done(should_not_attempt_reason); + return false; } if (options_.abort_if_unread_content && @@ -98,11 +118,32 @@ // TODO(iwells): add a DiscoverLaunchResult for this case Done({LoadStreamStatus::kAlreadyHaveUnreadContent, feedwire::DiscoverLaunchResult::CARDS_UNSPECIFIED}); + return false; + } + + return true; +} + +void LoadStreamTask::CheckIfSubscriberComplete(bool is_web_feed_subscriber) { + if (!is_web_feed_subscriber) { + Done({LoadStreamStatus::kNotAWebFeedSubscriber, + feedwire::DiscoverLaunchResult::CARDS_UNSPECIFIED}); return; } - launch_reliability_logger_.LogCacheReadStart(); + Resume( + base::BindOnce(&LoadStreamTask::ResumeAtStart, base::Unretained(this))); +} +void LoadStreamTask::ResumeAtStart() { + // When the task is resumed, we need to ensure the preconditions are still + // met. + if (CheckPreconditions()) + PassedPreconditions(); +} + +void LoadStreamTask::PassedPreconditions() { + launch_reliability_logger_.LogCacheReadStart(); // Use |kLoadNoContent| to short-circuit loading from store if we don't // need the full stream state. auto load_from_store_type =
diff --git a/components/feed/core/v2/tasks/load_stream_task.h b/components/feed/core/v2/tasks/load_stream_task.h index 2294147a..5e4a875 100644 --- a/components/feed/core/v2/tasks/load_stream_task.h +++ b/components/feed/core/v2/tasks/load_stream_task.h
@@ -102,7 +102,10 @@ base::WeakPtr<LoadStreamTask> GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } - + void CheckIfSubscriberComplete(bool is_web_feed_subscriber); + void ResumeAtStart(); + bool CheckPreconditions(); + void PassedPreconditions(); void LoadFromStoreComplete(LoadStreamFromStoreTask::Result result); void UploadActionsComplete(UploadActionsTask::Result result); void QueryApiRequestComplete(
diff --git a/components/feed/core/v2/web_feed_subscription_coordinator.cc b/components/feed/core/v2/web_feed_subscription_coordinator.cc index 5bdd6d7..6b2bb7e 100644 --- a/components/feed/core/v2/web_feed_subscription_coordinator.cc +++ b/components/feed/core/v2/web_feed_subscription_coordinator.cc
@@ -194,9 +194,8 @@ } // namespace internal WebFeedSubscriptionCoordinator::WebFeedSubscriptionCoordinator( - PrefService* profile_prefs, FeedStream* feed_stream) - : feed_stream_(feed_stream), profile_prefs_(profile_prefs) { + : feed_stream_(feed_stream) { base::TimeDelta delay = GetFeedConfig().fetch_web_feed_info_delay; if (IsSignedInAndWebFeedsEnabled() && !delay.is_zero()) { base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( @@ -205,11 +204,12 @@ &WebFeedSubscriptionCoordinator::FetchRecommendedWebFeedsIfStale, GetWeakPtr()), delay); + base::OnceClosure do_nothing = base::DoNothing(); base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce( &WebFeedSubscriptionCoordinator::FetchSubscribedWebFeedsIfStale, - GetWeakPtr()), + GetWeakPtr(), std::move(do_nothing)), delay); } } @@ -227,15 +227,17 @@ index_.Populate(startup_data.subscribed_web_feeds); populated_ = true; - UpdateIsSubscriberPref(); + auto on_populated = std::move(on_populated_); + for (base::OnceClosure& callback : on_populated) { + std::move(callback).Run(); + } } void WebFeedSubscriptionCoordinator::ClearAllFinished() { index_.Clear(); model_.reset(); - UpdateIsSubscriberPref(); FetchRecommendedWebFeedsIfStale(); - FetchSubscribedWebFeedsIfStale(); + FetchSubscribedWebFeedsIfStale(base::DoNothing()); } void WebFeedSubscriptionCoordinator::FollowWebFeed( @@ -644,18 +646,36 @@ model_->UpdateRecommendedFeeds(std::move(result.recommended_web_feeds)); } -void WebFeedSubscriptionCoordinator::FetchSubscribedWebFeedsIfStale() { - if (!IsSignedInAndWebFeedsEnabled()) +void WebFeedSubscriptionCoordinator::FetchSubscribedWebFeedsIfStale( + base::OnceClosure callback) { + if (!populated_) { + on_populated_.push_back(base::BindOnce( + &WebFeedSubscriptionCoordinator::FetchSubscribedWebFeedsIfStale, + base::Unretained(this), std::move(callback))); return; + } + + if (!IsSignedInAndWebFeedsEnabled()) { + std::move(callback).Run(); + return; + } base::TimeDelta staleness = base::Time::Now() - index_.GetSubscribedFeedsUpdateTime(); if (staleness > GetFeedConfig().subscribed_feeds_staleness_threshold || staleness < -base::TimeDelta::FromHours(1)) { fetching_subscribed_web_feeds_because_stale_ = true; + auto callback_adaptor = [](base::OnceClosure callback, RefreshResult) { + std::move(callback).Run(); + }; + on_refresh_subscriptions_.push_back( + base::BindOnce(callback_adaptor, std::move(callback))); + WithModel(base::BindOnce( &WebFeedSubscriptionCoordinator::FetchSubscribedWebFeedsStart, base::Unretained(this))); + } else { + std::move(callback).Run(); } } @@ -687,7 +707,6 @@ if (result.status == WebFeedRefreshStatus::kSuccess) model_->UpdateSubscribedFeeds(std::move(result.subscribed_web_feeds)); - UpdateIsSubscriberPref(); CallRefreshCompleteCallbacks( RefreshResult{result.status == WebFeedRefreshStatus::kSuccess}); } @@ -701,22 +720,17 @@ } } -// Ideally, this function would be async so that we can determine with more -// certainty that the user is a web feed subscriber. Until the UI can be -// updated, we need to return an answer right away, so we cache a boolean in -// prefs. -bool WebFeedSubscriptionCoordinator::IsWebFeedSubscriber() { - if (populated_) { - return IsSignedInAndWebFeedsEnabled() && index_.HasSubscriptions(); - } else { - return profile_prefs_->GetBoolean(feed::prefs::kIsWebFeedSubscriber); - } +void WebFeedSubscriptionCoordinator::IsWebFeedSubscriber( + base::OnceCallback<void(bool)> callback) { + FetchSubscribedWebFeedsIfStale( + base::BindOnce(&WebFeedSubscriptionCoordinator::IsWebFeedSubscriberDone, + base::Unretained(this), std::move(callback))); } -void WebFeedSubscriptionCoordinator::UpdateIsSubscriberPref() { - profile_prefs_->SetBoolean( - feed::prefs::kIsWebFeedSubscriber, - IsSignedInAndWebFeedsEnabled() && index_.HasSubscriptions()); +void WebFeedSubscriptionCoordinator::IsWebFeedSubscriberDone( + base::OnceCallback<void(bool)> callback) { + std::move(callback).Run(IsSignedInAndWebFeedsEnabled() && + index_.HasSubscriptions()); } } // namespace feed
diff --git a/components/feed/core/v2/web_feed_subscription_coordinator.h b/components/feed/core/v2/web_feed_subscription_coordinator.h index 46fb3fefa..5c765c7 100644 --- a/components/feed/core/v2/web_feed_subscription_coordinator.h +++ b/components/feed/core/v2/web_feed_subscription_coordinator.h
@@ -17,7 +17,6 @@ #include "components/feed/core/v2/web_feed_subscriptions/unsubscribe_from_web_feed_task.h" #include "components/feed/core/v2/web_feed_subscriptions/web_feed_index.h" -class PrefService; namespace feed { namespace internal { class WebFeedSubscriptionModel; @@ -29,8 +28,7 @@ // Coordinates the state of subscription to web feeds. class WebFeedSubscriptionCoordinator : public WebFeedSubscriptions { public: - explicit WebFeedSubscriptionCoordinator(PrefService* profile_prefs, - FeedStream* feed_stream); + explicit WebFeedSubscriptionCoordinator(FeedStream* feed_stream); virtual ~WebFeedSubscriptionCoordinator(); WebFeedSubscriptionCoordinator(const WebFeedSubscriptionCoordinator&) = delete; @@ -63,7 +61,7 @@ base::OnceCallback<void(std::vector<WebFeedMetadata>)> callback) override; void RefreshSubscriptions( base::OnceCallback<void(RefreshResult)> callback) override; - bool IsWebFeedSubscriber() override; + void IsWebFeedSubscriber(base::OnceCallback<void(bool)> callback) override; // Types / functions exposed for task implementations. @@ -152,19 +150,20 @@ void FetchRecommendedWebFeedsComplete( FetchRecommendedWebFeedsTask::Result result); - void FetchSubscribedWebFeedsIfStale(); + void FetchSubscribedWebFeedsIfStale(base::OnceClosure callback); void FetchSubscribedWebFeedsStart(); void FetchSubscribedWebFeedsComplete( FetchSubscribedWebFeedsTask::Result result); void CallRefreshCompleteCallbacks(RefreshResult); - void UpdateIsSubscriberPref(); + void IsWebFeedSubscriberDone(base::OnceCallback<void(bool)> callback); FeedStream* feed_stream_; // Always non-null, it owns this. - PrefService* profile_prefs_; WebFeedIndex index_; // Whether `Populate()` has been called. bool populated_ = false; + std::vector<base::OnceClosure> on_populated_; + // A model of subscriptions. In memory only while needed. // TODO(harringtond): Unload the model eventually. std::unique_ptr<WebFeedSubscriptionModel> model_;
diff --git a/components/full_restore/arc_read_handler.cc b/components/full_restore/arc_read_handler.cc index dbc5153b..02ffa7e 100644 --- a/components/full_restore/arc_read_handler.cc +++ b/components/full_restore/arc_read_handler.cc
@@ -60,41 +60,22 @@ int32_t task_id, int32_t session_id) { auto it = session_id_to_window_id_.find(session_id); - if (it == session_id_to_window_id_.end()) + if (it == session_id_to_window_id_.end()) { + not_restored_task_ids_.insert(task_id); + UpdateWindowCandidates(task_id, /*restore_window_id=*/-1); return; + } int32_t restore_window_id = it->second; session_id_to_window_id_.erase(it); task_id_to_window_id_[task_id] = restore_window_id; - // Go through |arc_window_candidates_|. If the window for |task_id| has been - // created, set the correct restore window id, and remove the window from the - // hidden container. - auto window_it = std::find_if( - arc_window_candidates_.begin(), arc_window_candidates_.end(), - [task_id](aura::Window* window) { - return window->GetProperty(::full_restore::kWindowIdKey) == task_id; - }); - if (window_it != arc_window_candidates_.end()) { - (*window_it) - ->SetProperty(full_restore::kRestoreWindowIdKey, restore_window_id); - - // When the window was created, there was not any window info due to there - // being no task. Apply properties to the window now that there is window - // info. - std::unique_ptr<WindowInfo> window_info = GetWindowInfo(restore_window_id); - if (window_info) { - FullRestoreReadHandler::GetInstance()->ApplyProperties(window_info.get(), - *window_it); - } - - FullRestoreInfo::GetInstance()->OnARCTaskReadyForUnparentedWindow( - *window_it); - arc_window_candidates_.erase(*window_it); - } + UpdateWindowCandidates(task_id, restore_window_id); } void ArcReadHandler::OnTaskDestroyed(int32_t task_id) { + not_restored_task_ids_.erase(task_id); + auto it = task_id_to_window_id_.find(task_id); if (it == task_id_to_window_id_.end()) return; @@ -156,9 +137,12 @@ return it->second; // If |session_id_to_window_id_| is empty, that means there is no ARC apps - // launched. - if (session_id_to_window_id_.empty()) + // launched. If `not_restored_task_ids_` has `task_id`, that means the ARC app + // window is not restored. + if (session_id_to_window_id_.empty() || + base::Contains(not_restored_task_ids_, task_id)) { return 0; + } // If |session_id_to_window_id_| is not empty, that means there are ARC // apps launched. Returns -1 to add the ARC app window to the hidden @@ -202,4 +186,40 @@ window_id_to_app_id_.erase(it); } +void ArcReadHandler::UpdateWindowCandidates(int32_t task_id, + int32_t restore_window_id) { + // Go through `arc_window_candidates_`. + auto window_it = std::find_if( + arc_window_candidates_.begin(), arc_window_candidates_.end(), + [task_id](aura::Window* window) { + return window->GetProperty(full_restore::kWindowIdKey) == task_id; + }); + if (window_it == arc_window_candidates_.end()) + return; + + // If `restore_window_id` is valid, sets the window property + // `kRestoreWindowIdKey` and `kWindowInfoKey`. + if (restore_window_id > 0) { + (*window_it) + ->SetProperty(full_restore::kRestoreWindowIdKey, restore_window_id); + + // When the window was created, there was not any window info due to there + // being no task. Apply properties to the window now that there is window + // info. + std::unique_ptr<WindowInfo> window_info = GetWindowInfo(restore_window_id); + if (window_info) { + FullRestoreReadHandler::GetInstance()->ApplyProperties(window_info.get(), + *window_it); + } + } + + // Remove the window from the hidden container. + if ((*window_it)->GetProperty(full_restore::kParentToHiddenContainerKey)) { + FullRestoreInfo::GetInstance()->OnARCTaskReadyForUnparentedWindow( + *window_it); + } + + arc_window_candidates_.erase(*window_it); +} + } // namespace full_restore
diff --git a/components/full_restore/arc_read_handler.h b/components/full_restore/arc_read_handler.h index dbe26eec..86726bd5 100644 --- a/components/full_restore/arc_read_handler.h +++ b/components/full_restore/arc_read_handler.h
@@ -81,6 +81,10 @@ // Removes AppRestoreData for |restore_window_id|. void RemoveAppRestoreData(int32_t restore_window_id); + // Finds the window from `arc_window_candidates_` for `task_id`, and remove + // the window from `arc_window_candidates_`. + void UpdateWindowCandidates(int32_t task_id, int32_t restore_window_id); + // The user profile path for ARC app windows. base::FilePath profile_path_; @@ -101,6 +105,12 @@ // windows, whose tasks have not been created. Once the task for the window is // created, the window is removed from |arc_window_candidates_|. std::set<aura::Window*> arc_window_candidates_; + + // ARC app tasks could be created before the window initialized. + // `not_restored_task_ids_` is used to record tasks not created by the restore + // process. Once the window is created for the task, the window can be removed + // from the hidden container. + std::set<int32_t> not_restored_task_ids_; }; } // namespace full_restore
diff --git a/components/infobars/core/confirm_infobar_delegate.cc b/components/infobars/core/confirm_infobar_delegate.cc index 8398ad3..5157ebb1 100644 --- a/components/infobars/core/confirm_infobar_delegate.cc +++ b/components/infobars/core/confirm_infobar_delegate.cc
@@ -45,6 +45,11 @@ : IDS_APP_CANCEL); } +ui::ImageModel ConfirmInfoBarDelegate::GetButtonImage( + InfoBarButton button) const { + return ui::ImageModel(); +} + bool ConfirmInfoBarDelegate::OKButtonTriggersUACPrompt() const { return false; }
diff --git a/components/infobars/core/confirm_infobar_delegate.h b/components/infobars/core/confirm_infobar_delegate.h index 3e2ee62..ef9fb22b 100644 --- a/components/infobars/core/confirm_infobar_delegate.h +++ b/components/infobars/core/confirm_infobar_delegate.h
@@ -10,6 +10,8 @@ #include "build/build_config.h" #include "components/infobars/core/infobar_delegate.h" #include "components/infobars/core/infobar_manager.h" +#include "ui/base/models/image_model.h" +#include "ui/gfx/image/image_skia.h" #include "ui/gfx/text_constants.h" namespace infobars { @@ -55,6 +57,10 @@ // returns "OK" for the OK button and "Cancel" for the Cancel button. virtual std::u16string GetButtonLabel(InfoBarButton button) const; + // Returns the label for the specified button. The default implementation + // returns an empty image. + virtual ui::ImageModel GetButtonImage(InfoBarButton button) const; + // Returns whether or not the OK button will trigger a UAC elevation prompt on // Windows. virtual bool OKButtonTriggersUACPrompt() const;
diff --git a/components/navigation_interception/intercept_navigation_delegate.cc b/components/navigation_interception/intercept_navigation_delegate.cc index bd55764..a4e4d29 100644 --- a/components/navigation_interception/intercept_navigation_delegate.cc +++ b/components/navigation_interception/intercept_navigation_delegate.cc
@@ -13,6 +13,7 @@ #include "components/navigation_interception/jni_headers/InterceptNavigationDelegate_jni.h" #include "components/navigation_interception/navigation_params_android.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_throttle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" @@ -68,9 +69,24 @@ // static std::unique_ptr<content::NavigationThrottle> -InterceptNavigationDelegate::CreateThrottleFor( +InterceptNavigationDelegate::MaybeCreateThrottleFor( content::NavigationHandle* handle, navigation_interception::SynchronyMode mode) { + // Navigations in a subframe or non-primary frame tree should not be + // intercepted. As examples of a non-primary frame tree, a navigation + // occurring in a Portal element or an unactivated prerendering page should + // not launch an app. + // TODO(bokan): This is a bit of a stopgap approach since we won't run + // throttles again when the prerender is activated which means links that are + // prerendered will avoid launching an app intent that a regular navigation + // would have. Longer term we'll want prerender activation to check for app + // intents, or have this throttle cancel the prerender if an intent would + // have been launched (without launching the intent). It's also not clear + // what the right behavior for <portal> elements is. + // https://crbug.com/1227659. + if (!handle->IsInPrimaryMainFrame()) + return nullptr; + return std::make_unique<InterceptNavigationThrottle>( handle, base::BindRepeating(&CheckIfShouldIgnoreNavigationOnUIThread), mode);
diff --git a/components/navigation_interception/intercept_navigation_delegate.h b/components/navigation_interception/intercept_navigation_delegate.h index 598a5cc4..accf14ef 100644 --- a/components/navigation_interception/intercept_navigation_delegate.h +++ b/components/navigation_interception/intercept_navigation_delegate.h
@@ -30,8 +30,9 @@ // 1) the Java-side interface implementation must be associated (via the // Associate method) with a WebContents for which URLRequests are to be // intercepted, -// 2) the NavigationThrottle obtained via CreateThrottleFor must be associated -// with the NavigationHandle in the ContentBrowserClient implementation. +// 2) the NavigationThrottle obtained via MaybeCreateThrottleFor must be +// associated with the NavigationHandle in the ContentBrowserClient +// implementation. class InterceptNavigationDelegate : public base::SupportsUserData::Data { public: // Pass true for |escape_external_handler_value| to have @@ -54,7 +55,7 @@ // Creates a InterceptNavigationThrottle that will direct all callbacks to // the InterceptNavigationDelegate. - static std::unique_ptr<content::NavigationThrottle> CreateThrottleFor( + static std::unique_ptr<content::NavigationThrottle> MaybeCreateThrottleFor( content::NavigationHandle* handle, navigation_interception::SynchronyMode mode);
diff --git a/components/omnibox/browser/actions/omnibox_pedal_concepts.h b/components/omnibox/browser/actions/omnibox_pedal_concepts.h index e100d87..369ba1bd0 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_concepts.h +++ b/components/omnibox/browser/actions/omnibox_pedal_concepts.h
@@ -10,7 +10,7 @@ // This value is generated during Pedal concept data processing, and written // to all data files as well as the source code here to ensure synchrony. // The runtime loaded data must match this version exactly or it won't load. -constexpr int OMNIBOX_PEDAL_CONCEPTS_DATA_VERSION = 15930805; +constexpr int OMNIBOX_PEDAL_CONCEPTS_DATA_VERSION = 15940346; // Unique identifiers for Pedals, used to bind loaded data to implementations. // Also used in the Omnibox.SuggestionUsed.Pedal histogram. Do not remove or
diff --git a/components/omnibox/browser/actions/omnibox_pedal_implementations.cc b/components/omnibox/browser/actions/omnibox_pedal_implementations.cc index 2f0a0d9a..13ae435 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_implementations.cc +++ b/components/omnibox/browser/actions/omnibox_pedal_implementations.cc
@@ -137,7 +137,7 @@ OmniboxPedalUpdateCreditCard() : OmniboxPedal( OmniboxPedalId::UPDATE_CREDIT_CARD, - OmniboxPedal::LabelStrings( + LabelStrings( IDS_OMNIBOX_PEDAL_UPDATE_CREDIT_CARD_HINT, IDS_OMNIBOX_PEDAL_UPDATE_CREDIT_CARD_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_UPDATE_CREDIT_CARD_SUFFIX, @@ -308,7 +308,7 @@ OmniboxPedalRunChromeSafetyCheck() : OmniboxPedal( OmniboxPedalId::RUN_CHROME_SAFETY_CHECK, - OmniboxPedal::LabelStrings( + LabelStrings( IDS_OMNIBOX_PEDAL_RUN_CHROME_SAFETY_CHECK_HINT, IDS_OMNIBOX_PEDAL_RUN_CHROME_SAFETY_CHECK_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_RUN_CHROME_SAFETY_CHECK_SUFFIX, @@ -351,7 +351,7 @@ OmniboxPedalManageSecuritySettings() : OmniboxPedal( OmniboxPedalId::MANAGE_SECURITY_SETTINGS, - OmniboxPedal::LabelStrings( + LabelStrings( IDS_OMNIBOX_PEDAL_MANAGE_SECURITY_SETTINGS_HINT, IDS_OMNIBOX_PEDAL_MANAGE_SECURITY_SETTINGS_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_MANAGE_SECURITY_SETTINGS_SUFFIX, @@ -387,13 +387,13 @@ class OmniboxPedalManageCookies : public OmniboxPedal { public: OmniboxPedalManageCookies() - : OmniboxPedal(OmniboxPedalId::MANAGE_COOKIES, - OmniboxPedal::LabelStrings( - IDS_OMNIBOX_PEDAL_MANAGE_COOKIES_HINT, + : OmniboxPedal( + OmniboxPedalId::MANAGE_COOKIES, + LabelStrings(IDS_OMNIBOX_PEDAL_MANAGE_COOKIES_HINT, IDS_OMNIBOX_PEDAL_MANAGE_COOKIES_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_MANAGE_COOKIES_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_MANAGE_COOKIES), - GURL()) {} + GURL()) {} std::vector<SynonymGroupSpec> SpecifySynonymGroups() const override { return { @@ -424,13 +424,13 @@ class OmniboxPedalManageAddresses : public OmniboxPedal { public: OmniboxPedalManageAddresses() - : OmniboxPedal(OmniboxPedalId::MANAGE_ADDRESSES, - OmniboxPedal::LabelStrings( - IDS_OMNIBOX_PEDAL_MANAGE_ADDRESSES_HINT, + : OmniboxPedal( + OmniboxPedalId::MANAGE_ADDRESSES, + LabelStrings(IDS_OMNIBOX_PEDAL_MANAGE_ADDRESSES_HINT, IDS_OMNIBOX_PEDAL_MANAGE_ADDRESSES_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_MANAGE_ADDRESSES_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_MANAGE_ADDRESSES), - GURL()) {} + GURL()) {} std::vector<SynonymGroupSpec> SpecifySynonymGroups() const override { return { @@ -461,13 +461,13 @@ class OmniboxPedalManageSync : public OmniboxPedal { public: OmniboxPedalManageSync() - : OmniboxPedal(OmniboxPedalId::MANAGE_SYNC, - OmniboxPedal::LabelStrings( - IDS_OMNIBOX_PEDAL_MANAGE_SYNC_HINT, + : OmniboxPedal( + OmniboxPedalId::MANAGE_SYNC, + LabelStrings(IDS_OMNIBOX_PEDAL_MANAGE_SYNC_HINT, IDS_OMNIBOX_PEDAL_MANAGE_SYNC_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_MANAGE_SYNC_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_MANAGE_SYNC), - GURL()) {} + GURL()) {} std::vector<SynonymGroupSpec> SpecifySynonymGroups() const override { return { @@ -495,7 +495,7 @@ OmniboxPedalManageSiteSettings() : OmniboxPedal( OmniboxPedalId::MANAGE_SITE_SETTINGS, - OmniboxPedal::LabelStrings( + LabelStrings( IDS_OMNIBOX_PEDAL_MANAGE_SITE_SETTINGS_HINT, IDS_OMNIBOX_PEDAL_MANAGE_SITE_SETTINGS_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_MANAGE_SITE_SETTINGS_SUFFIX, @@ -525,8 +525,9 @@ class OmniboxPedalAuthRequired : public OmniboxPedal { public: - explicit OmniboxPedalAuthRequired(OmniboxPedalId id) - : OmniboxPedal(id, OmniboxPedal::LabelStrings(), GURL()) {} + explicit OmniboxPedalAuthRequired(OmniboxPedalId id, + LabelStrings label_strings) + : OmniboxPedal(id, label_strings, GURL()) {} bool IsReadyToTrigger( const AutocompleteInput& input, const AutocompleteProviderClient& client) const override { @@ -542,7 +543,13 @@ class OmniboxPedalCreateGoogleDoc : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleDoc() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_DOC) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_DOC, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveDocsIcon; @@ -578,7 +585,13 @@ class OmniboxPedalCreateGoogleSheet : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleSheet() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_SHEET) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_SHEET, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveSheetsIcon; @@ -614,7 +627,13 @@ class OmniboxPedalCreateGoogleSlide : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleSlide() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_SLIDE) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_SLIDE, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveSlidesIcon; @@ -650,8 +669,13 @@ class OmniboxPedalCreateGoogleCalendarEvent : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleCalendarEvent() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_CALENDAR_EVENT) { - } + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_CALENDAR_EVENT, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kGoogleCalendarIcon; @@ -687,7 +711,13 @@ class OmniboxPedalCreateGoogleSite : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleSite() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_SITE) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_SITE, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kGoogleSitesIcon; @@ -723,7 +753,13 @@ class OmniboxPedalCreateGoogleKeepNote : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleKeepNote() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_KEEP_NOTE) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_KEEP_NOTE, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kGoogleKeepNoteIcon; @@ -759,7 +795,13 @@ class OmniboxPedalCreateGoogleForm : public OmniboxPedalAuthRequired { public: OmniboxPedalCreateGoogleForm() - : OmniboxPedalAuthRequired(OmniboxPedalId::CREATE_GOOGLE_FORM) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CREATE_GOOGLE_FORM, + LabelStrings( + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_HINT, + IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveFormsIcon; @@ -795,9 +837,13 @@ class OmniboxPedalSeeChromeTips : public OmniboxPedal { public: OmniboxPedalSeeChromeTips() - : OmniboxPedal(OmniboxPedalId::SEE_CHROME_TIPS, - OmniboxPedal::LabelStrings(), - GURL()) {} + : OmniboxPedal( + OmniboxPedalId::SEE_CHROME_TIPS, + LabelStrings(IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_HINT, + IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS), + GURL()) {} std::vector<SynonymGroupSpec> SpecifySynonymGroups() const override { return { @@ -828,7 +874,13 @@ class OmniboxPedalManageGoogleAccount : public OmniboxPedalAuthRequired { public: OmniboxPedalManageGoogleAccount() - : OmniboxPedalAuthRequired(OmniboxPedalId::MANAGE_GOOGLE_ACCOUNT) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::MANAGE_GOOGLE_ACCOUNT, + LabelStrings( + IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_HINT, + IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kGoogleSuperGIcon; @@ -864,7 +916,13 @@ class OmniboxPedalChangeGooglePassword : public OmniboxPedalAuthRequired { public: OmniboxPedalChangeGooglePassword() - : OmniboxPedalAuthRequired(OmniboxPedalId::CHANGE_GOOGLE_PASSWORD) {} + : OmniboxPedalAuthRequired( + OmniboxPedalId::CHANGE_GOOGLE_PASSWORD, + LabelStrings( + IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_HINT, + IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD)) {} #if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kGoogleSuperGIcon; @@ -897,12 +955,17 @@ // ============================================================================= -class OmniboxPedalCloseIncognito : public OmniboxPedal { +class OmniboxPedalCloseIncognitoWindows : public OmniboxPedal { public: - OmniboxPedalCloseIncognito() - : OmniboxPedal(OmniboxPedalId::CLOSE_INCOGNITO_WINDOWS, - LabelStrings(), - GURL()) {} + OmniboxPedalCloseIncognitoWindows() + : OmniboxPedal( + OmniboxPedalId::CLOSE_INCOGNITO_WINDOWS, + LabelStrings( + IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_HINT, + IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS), + GURL()) {} std::vector<SynonymGroupSpec> SpecifySynonymGroups() const override { return { @@ -929,7 +992,7 @@ } protected: - ~OmniboxPedalCloseIncognito() override = default; + ~OmniboxPedalCloseIncognitoWindows() override = default; }; // ============================================================================= @@ -937,9 +1000,14 @@ class OmniboxPedalPlayChromeDinoGame : public OmniboxPedal { public: OmniboxPedalPlayChromeDinoGame() - : OmniboxPedal(OmniboxPedalId::PLAY_CHROME_DINO_GAME, - LabelStrings(), - GURL("chrome://dino")) {} + : OmniboxPedal( + OmniboxPedalId::PLAY_CHROME_DINO_GAME, + LabelStrings( + IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_HINT, + IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUGGESTION_CONTENTS, + IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUFFIX, + IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME), + GURL("chrome://dino")) {} std::vector<SynonymGroupSpec> SpecifySynonymGroups() const override { return { @@ -1014,7 +1082,7 @@ } if (OmniboxFieldTrial::IsPedalsBatch3Enabled()) { if (incognito) { - add(new OmniboxPedalCloseIncognito()); + add(new OmniboxPedalCloseIncognitoWindows()); } add(new OmniboxPedalPlayChromeDinoGame()); }
diff --git a/components/omnibox/browser/actions/omnibox_pedal_provider.cc b/components/omnibox/browser/actions/omnibox_pedal_provider.cc index 22a2993..ae106ece 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_provider.cc +++ b/components/omnibox/browser/actions/omnibox_pedal_provider.cc
@@ -316,7 +316,7 @@ OmniboxPedal* pedal = pedal_iter->second.get(); const base::Value* ui_strings = pedal_value.FindDictKey("omnibox_ui_strings"); - if (ui_strings) { + if (ui_strings && pedal->GetLabelStrings().hint.empty()) { pedal->SetLabelStrings(*ui_strings); } const std::string* url = pedal_value.FindStringKey("url");
diff --git a/components/omnibox/resources/omnibox_pedal_concepts.json b/components/omnibox/resources/omnibox_pedal_concepts.json index b337a27..487d410 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts.json +++ b/components/omnibox/resources/omnibox_pedal_concepts.json
@@ -1,7 +1,7 @@ { "schema": "pedals_translation_model", "schema_version": 3, - "time_generated": "2021-07-02T01:23:17.277Z", + "time_generated": "2021-07-07T18:46:49.196Z", "primary_language_code": "en", "pedal_definitions": [ { @@ -113,7 +113,7 @@ "name": "CREATE_GOOGLE_SHEET", "enabled": true, "url": "https://docs.google.com/spreadsheets/u/0/create?usp=chrome_actions", - "description": "Create a new Google Sheet quickly (like sheet.new)\n", + "description": "Create a new Google Sheet quickly (like sheet.new)\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_HINT\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET", "tags": "google" }, { @@ -121,7 +121,7 @@ "name": "CREATE_GOOGLE_SLIDE", "enabled": true, "url": "https://docs.google.com/presentation/u/0/create?usp=chrome_actions", - "description": "Create new Google Slides quickly (like slide.new)", + "description": "Create new Google Slides quickly (like slide.new)\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_HINT\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE", "tags": "google" }, { @@ -129,7 +129,7 @@ "name": "CREATE_GOOGLE_CALENDAR_EVENT", "enabled": true, "url": "https://calendar.google.com/calendar/u/0/r/eventedit?usp=chrome_actions", - "description": "Create a new Google Calendar event quickly (like cal.new)", + "description": "Create a new Google Calendar event quickly (like cal.new)\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_HINT\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT", "tags": "google" }, { @@ -137,7 +137,7 @@ "name": "CREATE_GOOGLE_SITE", "enabled": true, "url": "https://sites.google.com/u/0/create?usp=chrome_actions", - "description": "Create a new Google Site quickly (like site.new)", + "description": "Create a new Google Site quickly (like site.new)\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_HINT\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE", "tags": "google" }, { @@ -145,7 +145,7 @@ "name": "CREATE_GOOGLE_KEEP_NOTE", "enabled": true, "url": "https://keep.google.com/u/0/?usp=chrome_actions#NEWNOTE", - "description": "Create a new Google Keep note quickly (like keep.new)", + "description": "Create a new Google Keep note quickly (like keep.new)\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_HINT\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE", "tags": "google" }, { @@ -153,7 +153,7 @@ "name": "CREATE_GOOGLE_FORM", "enabled": true, "url": "https://docs.google.com/forms/u/0/create?usp=chrome_actions", - "description": "Create a new Google Form quickly (like form.new)", + "description": "Create a new Google Form quickly (like form.new)\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_HINT\nIDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM", "tags": "google" }, { @@ -169,7 +169,7 @@ "name": "SEE_CHROME_TIPS", "enabled": true, "url": "https://www.google.com/chrome/tips/", - "description": "Learn about new Chrome features", + "description": "Learn about new Chrome features\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_HINT\nIDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS", "tags": "" }, { @@ -177,7 +177,7 @@ "name": "MANAGE_GOOGLE_ACCOUNT", "enabled": true, "url": "https://myaccount.google.com/?utm_source=ga-chrome-actions&utm_medium=manageGA", - "description": "Manage your Google Account", + "description": "Manage your Google Account\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_HINT\nIDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT", "tags": "google" }, { @@ -193,7 +193,7 @@ "name": "CHANGE_GOOGLE_PASSWORD", "enabled": true, "url": "https://myaccount.google.com/signinoptions/password?utm_source=ga-chrome-actions&utm_medium=changePW", - "description": "Change the password for your Google Account", + "description": "Change the password for your Google Account\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_HINT\nIDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD", "tags": "google" }, { @@ -209,7 +209,7 @@ "name": "CLOSE_INCOGNITO_WINDOWS", "enabled": true, "url": "", - "description": "Close incognito windows", + "description": "Close incognito windows\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_HINT\nIDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS", "tags": "no_test,incognito" }, { @@ -217,7 +217,7 @@ "name": "PLAY_CHROME_DINO_GAME", "enabled": true, "url": "chrome://dino", - "description": "Play the Chrome Dino running game", + "description": "Play the Chrome Dino running game\n\nUser-facing strings for this Pedal:\nIDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_HINT\nIDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUGGESTION_CONTENTS\nIDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUFFIX\nIDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME", "tags": "" } ],
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_am.json b/components/omnibox/resources/omnibox_pedal_concepts_am.json index 230b1fd..02885dc 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_am.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_am.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ar.json b/components/omnibox/resources/omnibox_pedal_concepts_ar.json index fb3f6c8..c1de8e0 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ar.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ar.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_bg.json b/components/omnibox/resources/omnibox_pedal_concepts_bg.json index 76c8cd0..4744cf5 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_bg.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_bg.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_bn.json b/components/omnibox/resources/omnibox_pedal_concepts_bn.json index 1de4e63..f64d4f5 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_bn.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_bn.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ca.json b/components/omnibox/resources/omnibox_pedal_concepts_ca.json index 7d8ab4e7..d752910b 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ca.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ca.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_cs.json b/components/omnibox/resources/omnibox_pedal_concepts_cs.json index c7c310b..8c13032 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_cs.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_cs.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "aktualizovat",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_da.json b/components/omnibox/resources/omnibox_pedal_concepts_da.json index 0c62e0d..57acf154a 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_da.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_da.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "adgangskode",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_de.json b/components/omnibox/resources/omnibox_pedal_concepts_de.json index 6880547..ec33130 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_de.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_de.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "aktualisieren",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_el.json b/components/omnibox/resources/omnibox_pedal_concepts_el.json index 75eb62d..4a7c042 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_el.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_el.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_en-GB.json b/components/omnibox/resources/omnibox_pedal_concepts_en-GB.json index 3ea12280..225bca0 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_en-GB.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_en-GB.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_en.json b/components/omnibox/resources/omnibox_pedal_concepts_en.json index 9ae2e7e..9efe6c0b 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_en.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_en.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_es-419.json b/components/omnibox/resources/omnibox_pedal_concepts_es-419.json index c0c62de..6bf3500 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_es-419.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_es-419.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "abrir",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_es.json b/components/omnibox/resources/omnibox_pedal_concepts_es.json index 33176f2..57482837 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_es.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_es.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_et.json b/components/omnibox/resources/omnibox_pedal_concepts_et.json index d288467..5945746 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_et.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_et.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "ajalugu",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_fa.json b/components/omnibox/resources/omnibox_pedal_concepts_fa.json index e8d418f..7368ee6 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_fa.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_fa.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_fi.json b/components/omnibox/resources/omnibox_pedal_concepts_fi.json index 63ca8e6..00c7258 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_fi.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_fi.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "asenna",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_fil.json b/components/omnibox/resources/omnibox_pedal_concepts_fil.json index dc532acf..8b71a65 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_fil.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_fil.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "akin",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_fr.json b/components/omnibox/resources/omnibox_pedal_concepts_fr.json index afda5a5..2536171 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_fr.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_fr.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "actualise",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_gu.json b/components/omnibox/resources/omnibox_pedal_concepts_gu.json index 637d3ce..9455bd440 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_gu.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_gu.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_he.json b/components/omnibox/resources/omnibox_pedal_concepts_he.json index 0aa7f77ee..8a382266 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_he.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_he.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_hi.json b/components/omnibox/resources/omnibox_pedal_concepts_hi.json index c55496cd..06edb30 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_hi.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_hi.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_hr.json b/components/omnibox/resources/omnibox_pedal_concepts_hr.json index e504b4fb..4521487 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_hr.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_hr.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "anonimna",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_hu.json b/components/omnibox/resources/omnibox_pedal_concepts_hu.json index 144393a0..45d2bb2b8 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_hu.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_hu.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_id.json b/components/omnibox/resources/omnibox_pedal_concepts_id.json index 4f1be6cc..e50b290 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_id.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_id.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "bagaimana",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_it.json b/components/omnibox/resources/omnibox_pedal_concepts_it.json index d604b74..4653096a 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_it.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_it.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ja.json b/components/omnibox/resources/omnibox_pedal_concepts_ja.json index 848acfb..603fa77 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ja.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ja.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": true, "dictionary": [ " ",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_kn.json b/components/omnibox/resources/omnibox_pedal_concepts_kn.json index 11e599e..6eca099 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_kn.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_kn.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ko.json b/components/omnibox/resources/omnibox_pedal_concepts_ko.json index 87c524a..3d2f641f 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ko.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ko.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_lt.json b/components/omnibox/resources/omnibox_pedal_concepts_lt.json index 07414a5..40e0045 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_lt.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_lt.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_lv.json b/components/omnibox/resources/omnibox_pedal_concepts_lv.json index ab074b0d..e10be30 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_lv.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_lv.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ml.json b/components/omnibox/resources/omnibox_pedal_concepts_ml.json index ce2ce5e10..6168dd8 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ml.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ml.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_mr.json b/components/omnibox/resources/omnibox_pedal_concepts_mr.json index 8a95fb2a..ed75b93 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_mr.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_mr.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ms.json b/components/omnibox/resources/omnibox_pedal_concepts_ms.json index 27c48e2..9759e10b 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ms.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ms.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "alih",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_nl.json b/components/omnibox/resources/omnibox_pedal_concepts_nl.json index 28cefda..fd0778c 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_nl.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_nl.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "aan",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_pl.json b/components/omnibox/resources/omnibox_pedal_concepts_pl.json index c1d979d..66d94f4 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_pl.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_pl.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_pt-BR.json b/components/omnibox/resources/omnibox_pedal_concepts_pt-BR.json index 5d46c158..2d68b4d3 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_pt-BR.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_pt-BR.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "abrir",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_pt-PT.json b/components/omnibox/resources/omnibox_pedal_concepts_pt-PT.json index 9624e06..6b6e8642 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_pt-PT.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_pt-PT.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "abrir",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ro.json b/components/omnibox/resources/omnibox_pedal_concepts_ro.json index f6230dbf..497b9a4 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ro.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ro.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ru.json b/components/omnibox/resources/omnibox_pedal_concepts_ru.json index ed6bfc4..c25d27d9 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ru.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ru.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_sk.json b/components/omnibox/resources/omnibox_pedal_concepts_sk.json index c64511ba..5207d09 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_sk.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_sk.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_sl.json b/components/omnibox/resources/omnibox_pedal_concepts_sl.json index ade640f7..136710e 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_sl.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_sl.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "beleženja",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_sr.json b/components/omnibox/resources/omnibox_pedal_concepts_sr.json index 622f9812..a61487db 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_sr.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_sr.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_sv.json b/components/omnibox/resources/omnibox_pedal_concepts_sv.json index 26d58ab..6a65014 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_sv.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_sv.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "aktivera",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_sw.json b/components/omnibox/resources/omnibox_pedal_concepts_sw.json index 3baf855c..ede531a3 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_sw.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_sw.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "anza",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ta.json b/components/omnibox/resources/omnibox_pedal_concepts_ta.json index 47b5a36..32fc14c0 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_ta.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_ta.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_te.json b/components/omnibox/resources/omnibox_pedal_concepts_te.json index 6f547af6..924e02b 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_te.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_te.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_th.json b/components/omnibox/resources/omnibox_pedal_concepts_th.json index 10ef5e48..66c0624 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_th.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_th.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_tr.json b/components/omnibox/resources/omnibox_pedal_concepts_tr.json index 216136a2..56ec1f7 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_tr.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_tr.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "aç",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_uk.json b/components/omnibox/resources/omnibox_pedal_concepts_uk.json index e868b2c..6003053 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_uk.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_uk.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_vi.json b/components/omnibox/resources/omnibox_pedal_concepts_vi.json index b1af05f..d2b5b47 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_vi.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_vi.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "a",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json b/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json index 4075f46..aa15da5 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": true, "dictionary": [ " ",
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_zh-TW.json b/components/omnibox/resources/omnibox_pedal_concepts_zh-TW.json index 0d0ff61..437c58f 100644 --- a/components/omnibox/resources/omnibox_pedal_concepts_zh-TW.json +++ b/components/omnibox/resources/omnibox_pedal_concepts_zh-TW.json
@@ -1,7 +1,7 @@ { "schema": "pedal_concepts_runtime", "schema_version": 3, - "data_version": 15930805, + "data_version": 15940346, "tokenize_each_character": false, "dictionary": [ "chrome",
diff --git a/components/omnibox_strings.grdp b/components/omnibox_strings.grdp index ef78aca..7485893 100644 --- a/components/omnibox_strings.grdp +++ b/components/omnibox_strings.grdp
@@ -250,17 +250,160 @@ Manage site settings button, press Enter to manage permissions and data stored across sites in Chrome settings </message> - <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT" desc="The button text contents to suggest pedal action, Create Google Doc."> - Create Google Doc + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_DOC"> + Create doc </message> - <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS" desc="The suggestion content text to suggest pedal action, Create Google Doc."> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_DOC"> Create a new Google Doc quickly </message> - <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX" desc="Suffix for spoken suggestion description with Create Google Doc pedal action to explain keystroke used to Create Google Doc."> - <ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to Create Google Doc + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create Google doc."> + <ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new Google Doc quickly </message> - <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC" desc="Announcement when the Create Google Doc pedal button is focused."> - Create Google Doc button, press Enter to Create a new Google Doc quickly + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_DOC"> + Create doc button, press Enter to create a new Google Doc quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_SHEET"> + Create sheet + </message> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_SHEET"> + Create a new Google Sheet quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create Google sheet."> + <ph name="CREATE_GOOGLE_SHEET_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new Google Sheet quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_SHEET"> + Create sheet button, press Enter to create a new Google Sheet quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_SLIDE"> + Create presentation + </message> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_SLIDE"> + Create a new Google presentation in Slides quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create presentation."> + <ph name="CREATE_GOOGLE_SLIDE_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new Google presentation in Slides quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_SLIDE"> + Create presentation button, press Enter to create a new Google presentation in Slides quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_CALENDAR_EVENT"> + Create event + </message> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_CALENDAR_EVENT"> + Create a new event in Google Calendar quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create calendar event."> + <ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new event in Google Calendar quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_CALENDAR_EVENT"> + Create event button, press Enter to create a new event in Google Calendar quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_SITE"> + Create site + </message> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_SITE"> + Create a new site in Google Sites quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create site."> + <ph name="CREATE_GOOGLE_SITE_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new site in Google Sites quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_SITE"> + Create site button, press Enter to create a new site in Google Sites quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_KEEP_NOTE"> + Create note + </message> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_KEEP_NOTE"> + Create a new note in Google Keep quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create note."> + <ph name="CREATE_GOOGLE_KEEP_NOTE_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new note in Google Keep quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_KEEP_NOTE"> + Create note button, press Enter to create a new note in Google Keep quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_HINT" desc="The button text contents to suggest pedal action, CREATE_GOOGLE_FORM"> + Create form + </message> + <message name="IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CREATE_GOOGLE_FORM"> + Create a new form in Google Forms quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to create form."> + <ph name="CREATE_GOOGLE_FORM_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to create a new form in Google Forms quickly + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM" desc="Announcement when pedal action button is focused, CREATE_GOOGLE_FORM"> + Create form button, press Enter to create a new form in Google Forms quickly + </message> + + <message name="IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_HINT" desc="The button text contents to suggest pedal action, SEE_CHROME_TIPS"> + See Chrome tips + </message> + <message name="IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, SEE_CHROME_TIPS"> + Learn about Chrome features + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to see Chrome tips."> + <ph name="SEE_CHROME_TIPS_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to learn about Chrome features + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS" desc="Announcement when pedal action button is focused, SEE_CHROME_TIPS"> + See Chrome tips button, press Enter to learn about Chrome features + </message> + + <message name="IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_HINT" desc="The button text contents to suggest pedal action, MANAGE_GOOGLE_ACCOUNT"> + Manage Google Account + </message> + <message name="IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, MANAGE_GOOGLE_ACCOUNT"> + Manage your info, privacy, and security in your Google Account + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to manage Google Account."> + <ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to manage your info, privacy, and security in your Google Account + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT" desc="Announcement when pedal action button is focused, MANAGE_GOOGLE_ACCOUNT"> + Manage Google Account, press Enter to manage your info, privacy, and security in your Google Account + </message> + + <message name="IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_HINT" desc="The button text contents to suggest pedal action, CHANGE_GOOGLE_PASSWORD"> + Change Google password + </message> + <message name="IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CHANGE_GOOGLE_PASSWORD"> + Change your Google Account password + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to change Google password."> + <ph name="CHANGE_GOOGLE_PASSWORD_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to change your Google Account password + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD" desc="Announcement when pedal action button is focused, CHANGE_GOOGLE_PASSWORD"> + Change Google password button, press Enter to change your Google Account password + </message> + + <message name="IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_HINT" desc="The button text contents to suggest pedal action, CLOSE_INCOGNITO_WINDOWS"> + Close incognito windows + </message> + <message name="IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, CLOSE_INCOGNITO_WINDOWS"> + Close all incognito windows for the current incognito profile + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to close incognito windows."> + <ph name="CLOSE_INCOGNITO_WINDOWS_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to close all incognito windows for the current incognito profile + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS" desc="Announcement when pedal action button is focused, CLOSE_INCOGNITO_WINDOWS"> + Close incognito windows button, press Enter to close all incognito windows for the current incognito profile + </message> + + <message name="IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_HINT" desc="The button text contents to suggest pedal action, PLAY_CHROME_DINO_GAME"> + Play Chrome Dino + </message> + <message name="IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUGGESTION_CONTENTS" desc="The button hover tooltip text to describe pedal action, PLAY_CHROME_DINO_GAME"> + Play the Chrome Dino game + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUFFIX" desc="Suffix for spoken suggestion description with pedal action button, to explain keystroke used to play Chrome Dino game."> + <ph name="PLAY_CHROME_DINO_GAME_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph>, press Tab then Enter to play the Chrome Dino game + </message> + <message name="IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME" desc="Announcement when pedal action button is focused, PLAY_CHROME_DINO_GAME"> + Play Chrome Dino game button, press Enter to play the Chrome Dino game </message> <!-- Omnibox Actions, which are a generalization of Omnibox Pedals. -->
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC.png.sha1 index 6ee7293..886ba28c 100644 --- a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC.png.sha1 +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC.png.sha1
@@ -1 +1 @@ -396ed356a2c3b857d1dfd7a3647bb11f6a510302 \ No newline at end of file +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX.png.sha1 index 6ee7293..886ba28c 100644 --- a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX.png.sha1 +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX.png.sha1
@@ -1 +1 @@ -396ed356a2c3b857d1dfd7a3647bb11f6a510302 \ No newline at end of file +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUFFIX.png.sha1 b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUFFIX.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_ACC_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUFFIX.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT.png.sha1 index 6ee7293..886ba28c 100644 --- a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT.png.sha1 +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_HINT.png.sha1
@@ -1 +1 @@ -396ed356a2c3b857d1dfd7a3647bb11f6a510302 \ No newline at end of file +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS.png.sha1 index 6ee7293..886ba28c 100644 --- a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS.png.sha1 +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS.png.sha1
@@ -1 +1 @@ -396ed356a2c3b857d1dfd7a3647bb11f6a510302 \ No newline at end of file +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_HINT.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_HINT.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_HINT.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUGGESTION_CONTENTS.png.sha1 b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUGGESTION_CONTENTS.png.sha1 new file mode 100644 index 0000000..886ba28c --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_OMNIBOX_PEDAL_SEE_CHROME_TIPS_SUGGESTION_CONTENTS.png.sha1
@@ -0,0 +1 @@ +c23fd95bf791f5e6b4a28f3b98fe574fc56f1e57 \ No newline at end of file
diff --git a/components/page_info/page_info_ui.cc b/components/page_info/page_info_ui.cc index 69a540d3..a5a63bf 100644 --- a/components/page_info/page_info_ui.cc +++ b/components/page_info/page_info_ui.cc
@@ -565,8 +565,8 @@ ? IDS_PAGE_INFO_BUTTON_TEXT_ASK_BY_DEFAULT : IDS_PAGE_INFO_BUTTON_TEXT_ASK_BY_USER; } else if (permission.setting == CONTENT_SETTING_DEFAULT) { - // TODO(crbug.com/1225563): Replace with actual strings. - return u"This site will ask before accessing"; + // TODO(crbug.com/1225563): Replace with permission specific strings. + message_id = IDS_PAGE_INFO_BUTTON_TEXT_ASK_BY_DEFAULT; } else { message_id = IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED; } @@ -604,6 +604,7 @@ message_id = IDS_PAGE_INFO_PERMISSION_MANAGED_BY_POLICY; break; case content_settings::SettingSource::SETTING_SOURCE_EXTENSION: + // TODO(crbug.com/1225563): Consider "enforced" instead of "managed". message_id = IDS_PAGE_INFO_PERMISSION_MANAGED_BY_EXTENSION; break; default:
diff --git a/components/page_info_strings.grdp b/components/page_info_strings.grdp index 6ab2378..b0a3e901 100644 --- a/components/page_info_strings.grdp +++ b/components/page_info_strings.grdp
@@ -478,6 +478,12 @@ <message name="IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED" desc="The Page Info permission subpage and the main page info page contain a label which shows the state of the site permission. This is the text shown if the permission is not allowed (blocked or ask state) by any source (the user, the administrator, etc.)."> Not allowed </message> + <message name="IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_IN_INCOGNITO" desc="The Page Info permission subpage and the main page info page contain a label which shows the state of the site permission. This is the text shown if the permission is not allowed in incognito mode."> + Not allowed in Incognito + </message> + <message name="IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_INSECURE" desc="The Page Info permission subpage and the main page info page contain a label which shows the state of the site permission. This is the text shown if the permission is not allowed in non-secure sites."> + Not allowed for non-secure sites + </message> <message name="IDS_PAGE_INFO_STATE_TEXT_MUTED" desc="The Page Info permission subpage and the main page info page contain a label which shows the state of the site permission. This is the text shown if the sound permission is blocked by any source (the user, the administrator, etc.)."> Muted </message> @@ -530,7 +536,7 @@ Site settings </message> <message name="IDS_PAGE_INFO_SITE_SETTINGS_TOOLTIP" desc="The text of the tooltip on IDS_PAGE_INFO_SITE_SETTINGS_LINK."> - Open site settings + Go to site settings </message> <!-- Permission decision strings --> @@ -718,14 +724,23 @@ </message> <!-- Subpages headers --> - <message name="IDS_PAGE_INFO_SECURITY_SUBPAGE_HEADER" desc="The header label of the Security subpage in page info bubble."> + <message name="IDS_PAGE_INFO_SECURITY_SUBPAGE_BUTTON" desc="The label of the button to open the Security subpage in Page Info bubble."> + Show connection details + </message> + <message name="IDS_PAGE_INFO_SECURITY_SUBPAGE_HEADER" desc="The header label of the Security subpage in Page Info bubble."> Security </message> <!-- Permissions subpage --> + <message name="IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_BUTTON_TOOLTIP" desc="The label of the button to open the Permissions subpage for a specific permission in Page Info bubble."> + Show permission details + </message> <message name="IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON" desc="The text on the button, that opens settings page for the permission, in permission's subpage in page info bubble."> Manage </message> + <message name="IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON_TOOLTIP" desc="The label of the button to open settings from the Permissions subpage for a specific permission in Page Info bubble."> + Go to permission settings + </message> <message name="IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_REMEMBER_THIS_SETTING" desc="The text near the checkbox, that controls if user's decision will be remembered for this permission, in permission's subpage in page info bubble."> Remember this setting </message>
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_BUTTON_TOOLTIP.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_BUTTON_TOOLTIP.png.sha1 new file mode 100644 index 0000000..d676554 --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_BUTTON_TOOLTIP.png.sha1
@@ -0,0 +1 @@ +698bccf9840e9272bba34044c40b8560ab5e41fd \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON_TOOLTIP.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON_TOOLTIP.png.sha1 new file mode 100644 index 0000000..49a53ff4 --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_PERMISSIONS_SUBPAGE_MANAGE_BUTTON_TOOLTIP.png.sha1
@@ -0,0 +1 @@ +4ce213c9f428a9baab95355510642ab362264e36 \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_SECURITY_SUBPAGE_BUTTON.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_SECURITY_SUBPAGE_BUTTON.png.sha1 new file mode 100644 index 0000000..910f220 --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_SECURITY_SUBPAGE_BUTTON.png.sha1
@@ -0,0 +1 @@ +e93e2a0424739342374e0726b3c1a4408c8678cf \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_SITE_SETTINGS_TOOLTIP.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_SITE_SETTINGS_TOOLTIP.png.sha1 new file mode 100644 index 0000000..873102f --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_SITE_SETTINGS_TOOLTIP.png.sha1
@@ -0,0 +1 @@ +be5bcda63c0e1efc3cc3693fc6becfbcc8a15ac2 \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_INSECURE.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_INSECURE.png.sha1 new file mode 100644 index 0000000..0777726 --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_INSECURE.png.sha1
@@ -0,0 +1 @@ +62b7df73627066260e8d61f2b704adf468d8d62b \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_IN_INCOGNITO.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_IN_INCOGNITO.png.sha1 new file mode 100644 index 0000000..0777726 --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_IN_INCOGNITO.png.sha1
@@ -0,0 +1 @@ +62b7df73627066260e8d61f2b704adf468d8d62b \ No newline at end of file
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 887e6fb..0e8755e 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -244,8 +244,6 @@ "ui/import_flow.h", "ui/insecure_credentials_manager.cc", "ui/insecure_credentials_manager.h", - "ui/insecure_credentials_reader.cc", - "ui/insecure_credentials_reader.h", "ui/password_check_referrer.cc", "ui/password_check_referrer.h", "ui/plaintext_reason.h", @@ -348,11 +346,7 @@ } if (is_mac) { - sources += [ - "login_database_mac.cc", - "password_recovery_util_mac.cc", - "password_recovery_util_mac.h", - ] + sources += [ "login_database_mac.cc" ] } if (is_ios) { @@ -698,7 +692,6 @@ "sync_credentials_filter_unittest.cc", "ui/bulk_leak_check_service_adapter_unittest.cc", "ui/insecure_credentials_manager_unittest.cc", - "ui/insecure_credentials_reader_unittest.cc", "ui/post_save_compromised_helper_unittest.cc", "ui/saved_passwords_presenter_unittest.cc", "vote_uploads_test_matchers.h",
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc index 6404454..97e8eb2 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
@@ -45,6 +45,10 @@ form.username_value = std::u16string(username); form.password_value = std::u16string(password); form.signon_realm = form.url.GetOrigin().spec(); + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = base::flat_map<InsecureType, InsecurityMetadata>(); return form; } @@ -57,7 +61,9 @@ protected: void SetUp() override { - store_ = new testing::StrictMock<MockPasswordStore>; + // TODO(crbug.com/1223022): Use StrickMock after MockPasswordStore is + // replaced with the MockPasswordStoreInterface. + store_ = base::MakeRefCounted<testing::NiceMock<MockPasswordStore>>(); CHECK(store_->Init(nullptr)); delegate_helper_ = std::make_unique<LeakDetectionDelegateHelper>(
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc index a023365..ee423f2 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -129,8 +129,10 @@ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; testing::NiceMock<MockPasswordManagerClient> client_; MockLeakDetectionCheckFactory* mock_factory_ = nullptr; + // TODO(crbug.com/1218413): Use StrickMock after MockPasswordStore is replaced + // with the MockPasswordStoreInterface. scoped_refptr<MockPasswordStore> mock_store_ = - base::MakeRefCounted<testing::StrictMock<MockPasswordStore>>(); + base::MakeRefCounted<testing::NiceMock<MockPasswordStore>>(); LeakDetectionDelegate delegate_{&client_}; std::unique_ptr<TestingPrefServiceSimple> pref_service_ = std::make_unique<TestingPrefServiceSimple>();
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc index 8888810..86aa8d5 100644 --- a/components/password_manager/core/browser/login_database.cc +++ b/components/password_manager/core/browser/login_database.cc
@@ -829,13 +829,6 @@ return true; } -#if defined(OS_MAC) -void LoginDatabase::InitPasswordRecoveryUtil( - std::unique_ptr<PasswordRecoveryUtilMac> password_recovery_util) { - password_recovery_util_ = std::move(password_recovery_util); -} -#endif - base::StringPiece LoginDatabase::GetMetricsSuffixForStore() const { // Note: For historic reasons, the profile store does not use a suffix, only // the account store does. @@ -1810,8 +1803,6 @@ metrics_util::LogDeleteUndecryptableLoginsReturnValue( metrics_util::DeleteCorruptedPasswordsResult::kSuccessNoDeletions); } else { - DCHECK(password_recovery_util_); - password_recovery_util_->RecordPasswordRecovery(); metrics_util::LogDeleteUndecryptableLoginsReturnValue( metrics_util::DeleteCorruptedPasswordsResult::kSuccessPasswordsDeleted); UMA_HISTOGRAM_COUNTS_100("PasswordManager.CleanedUpPasswords", @@ -2106,11 +2097,6 @@ count_removed_logins++; } } - if (count_removed_logins == forms_to_be_deleted.size() && - count_removed_logins > 0) { - DCHECK(password_recovery_util_); - password_recovery_util_->RecordPasswordRecovery(); - } #endif if (!statement->Succeeded())
diff --git a/components/password_manager/core/browser/login_database.h b/components/password_manager/core/browser/login_database.h index 8a9d430b..46ccbc18 100644 --- a/components/password_manager/core/browser/login_database.h +++ b/components/password_manager/core/browser/login_database.h
@@ -31,10 +31,6 @@ #include "base/gtest_prod_util.h" #endif -#if defined(OS_MAC) -#include "components/password_manager/core/browser/password_recovery_util_mac.h" -#endif - namespace password_manager { class SQLTableBuilder; @@ -67,12 +63,6 @@ // should be called. virtual bool Init(); -#if defined(OS_MAC) - // Registers utility which is used to save password recovery status on MacOS. - void InitPasswordRecoveryUtil( - std::unique_ptr<PasswordRecoveryUtilMac> password_recovery_util); -#endif - // Reports usage metrics to UMA. void ReportMetrics(const std::string& sync_username, bool custom_passphrase_sync_enabled, @@ -370,10 +360,6 @@ std::string encrypted_password_statement_by_id_; std::string id_and_password_statement_; -#if defined(OS_MAC) - std::unique_ptr<PasswordRecoveryUtilMac> password_recovery_util_; -#endif - #if defined(OS_POSIX) && !defined(OS_APPLE) // Whether password values should be encrypted. // TODO(crbug.com/571003) Only linux doesn't use encryption. Remove this once
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc index c7578839..91c3831 100644 --- a/components/password_manager/core/browser/login_database_unittest.cc +++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -2470,11 +2470,6 @@ ASSERT_TRUE(db.Init()); #if defined(OS_MAC) - testing_local_state().registry()->RegisterTimePref(prefs::kPasswordRecovery, - base::Time()); - db.InitPasswordRecoveryUtil(std::make_unique<PasswordRecoveryUtilMac>( - &testing_local_state(), base::ThreadTaskRunnerHandle::Get())); - // Make sure that we can't get any logins when database is corrupted. std::vector<std::unique_ptr<PasswordForm>> result; EXPECT_FALSE(db.GetAutofillableLogins(&result)); @@ -2494,9 +2489,6 @@ EXPECT_THAT(result, UnorderedElementsAre(Pointee(form1), Pointee(form3))); RunUntilIdle(); - - // Make sure that password recovery pref is set. - ASSERT_TRUE(testing_local_state().HasPrefPath(prefs::kPasswordRecovery)); #else EXPECT_EQ(DatabaseCleanupResult::kSuccess, db.DeleteUndecryptableLogins()); #endif @@ -2525,17 +2517,11 @@ LoginDatabase db(database_path(), IsAccountStore(false)); ASSERT_TRUE(db.Init()); - testing_local_state().registry()->RegisterTimePref(prefs::kPasswordRecovery, - base::Time()); - db.InitPasswordRecoveryUtil(std::make_unique<PasswordRecoveryUtilMac>( - &testing_local_state(), base::ThreadTaskRunnerHandle::Get())); - std::vector<std::unique_ptr<PasswordForm>> result; EXPECT_FALSE(db.GetAutofillableLogins(&result)); EXPECT_TRUE(result.empty()); RunUntilIdle(); - EXPECT_FALSE(testing_local_state().HasPrefPath(prefs::kPasswordRecovery)); } TEST_F(LoginDatabaseUndecryptableLoginsTest, KeychainLockedTest) {
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h index 682ddd5..f344f6ff 100644 --- a/components/password_manager/core/browser/mock_password_store.h +++ b/components/password_manager/core/browser/mock_password_store.h
@@ -100,6 +100,28 @@ MOCK_CONST_METHOD0(IsAbleToSavePasswords, bool()); + // TODO(crbug.bom/1226042): Remove this after PasswordStore no longer + // inherits PasswordStoreSync. + MOCK_METHOD(PasswordStoreChangeList, + AddLoginSync, + (const PasswordForm&, AddLoginError*), + (override)); + MOCK_METHOD(bool, + AddInsecureCredentialsSync, + (base::span<const InsecureCredential>), + (override)); + MOCK_METHOD(PasswordStoreChangeList, + UpdateLoginSync, + (const PasswordForm&, UpdateLoginError*), + (override)); + MOCK_METHOD(bool, + UpdateInsecureCredentialsSync, + (const PasswordForm&, base::span<const InsecureCredential>), + (override)); + MOCK_METHOD(PasswordStoreChangeList, + RemoveLoginSync, + (const PasswordForm& form), + (override)); MOCK_METHOD0(BeginTransaction, bool()); MOCK_METHOD0(RollbackTransaction, void()); MOCK_METHOD0(CommitTransaction, bool());
diff --git a/components/password_manager/core/browser/password_bubble_experiment.h b/components/password_manager/core/browser/password_bubble_experiment.h index d75d6d66..fadf729 100644 --- a/components/password_manager/core/browser/password_bubble_experiment.h +++ b/components/password_manager/core/browser/password_bubble_experiment.h
@@ -38,6 +38,7 @@ void TurnOffAutoSignin(PrefService* prefs); // Returns true if the Chrome Sign In promo should be shown. +// TODO(crbug.com/1108738): This is unused; remove it and its prefs. bool ShouldShowChromeSignInPasswordPromo( PrefService* prefs, const syncer::SyncService* sync_service);
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index d772ec3..9b0f4a2d 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -249,10 +249,6 @@ registry->RegisterInt64Pref(prefs::kOsPasswordLastChanged, 0); registry->RegisterBooleanPref(prefs::kOsPasswordBlank, false); #endif - -#if defined(OS_MAC) - registry->RegisterTimePref(prefs::kPasswordRecovery, base::Time()); -#endif } PasswordManager::PasswordManager(PasswordManagerClient* client)
diff --git a/components/password_manager/core/browser/password_recovery_util_mac.cc b/components/password_manager/core/browser/password_recovery_util_mac.cc deleted file mode 100644 index 19529ff..0000000 --- a/components/password_manager/core/browser/password_recovery_util_mac.cc +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/password_manager/core/browser/password_recovery_util_mac.h" - -#include "base/bind.h" -#include "base/single_thread_task_runner.h" -#include "base/time/time.h" -#include "components/password_manager/core/common/password_manager_pref_names.h" -#include "components/prefs/pref_service.h" - -namespace password_manager { - -PasswordRecoveryUtilMac::PasswordRecoveryUtilMac( - PrefService* local_state, - scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) - : local_state_(local_state), - main_thread_task_runner_(main_thread_task_runner) {} - -PasswordRecoveryUtilMac::~PasswordRecoveryUtilMac() {} - -void PasswordRecoveryUtilMac::RecordPasswordRecovery() { - main_thread_task_runner_->PostTask( - FROM_HERE, base::BindOnce( - [](PrefService* local_state) { - local_state->SetTime(prefs::kPasswordRecovery, - base::Time::Now()); - }, - local_state_)); -} - -} // namespace password_manager
diff --git a/components/password_manager/core/browser/password_recovery_util_mac.h b/components/password_manager/core/browser/password_recovery_util_mac.h deleted file mode 100644 index 42d2bd45..0000000 --- a/components/password_manager/core/browser/password_recovery_util_mac.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright (c) 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_RECOVERY_UTIL_MAC_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_RECOVERY_UTIL_MAC_H_ - -#include "base/memory/scoped_refptr.h" - -class PrefService; - -namespace base { -class SingleThreadTaskRunner; -} // namespace base - -namespace password_manager { - -// A utility class which is used by login database to store the date when some -// undecryptable logins were deleted. -class PasswordRecoveryUtilMac { - public: - PasswordRecoveryUtilMac( - PrefService* local_state, - scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner); - - ~PasswordRecoveryUtilMac(); - - // Posts tasks on main thread to store the current time. - void RecordPasswordRecovery(); - - private: - PrefService* local_state_; - scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_; -}; - -} // namespace password_manager - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_RECOVERY_UTIL_MAC_H_
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index ce4ab20..98779677 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -73,11 +73,6 @@ } // namespace -void PasswordStore::DatabaseInsecureCredentialsObserver:: - OnInsecureCredentialsChangedIn(PasswordStore* store) { - OnInsecureCredentialsChanged(); -} - PasswordStore::PasswordStore() : observers_(new base::ObserverListThreadSafe<Observer>()) {} @@ -372,16 +367,6 @@ observers_->RemoveObserver(observer); } -void PasswordStore::AddDatabaseInsecureCredentialsObserver( - DatabaseInsecureCredentialsObserver* observer) { - insecure_credentials_observers_->AddObserver(observer); -} - -void PasswordStore::RemoveDatabaseInsecureCredentialsObserver( - DatabaseInsecureCredentialsObserver* observer) { - insecure_credentials_observers_->RemoveObserver(observer); -} - bool PasswordStore::ScheduleTask(base::OnceClosure task) { return background_task_runner_ && background_task_runner_->PostTask(FROM_HERE, std::move(task)); @@ -447,54 +432,6 @@ return true; } -PasswordStoreChangeList PasswordStore::AddLoginSync(const PasswordForm& form, - AddLoginError* error) { - // There is no good way to check if the password is actually up to date, or - // at least to check if it was actually changed. Assume it is. - if (AffiliatedMatchHelper::IsValidAndroidCredential(PasswordFormDigest(form))) - ScheduleFindAndUpdateAffiliatedWebLogins(form); - return AddLoginImpl(form, error); -} - -bool PasswordStore::AddInsecureCredentialsSync( - base::span<const InsecureCredential> credentials) { - return base::ranges::all_of(credentials, [this](const auto& cred) { - return !AddInsecureCredentialImpl(cred).empty(); - }); -} - -PasswordStoreChangeList PasswordStore::UpdateLoginSync( - const PasswordForm& form, - UpdateLoginError* error) { - if (AffiliatedMatchHelper::IsValidAndroidCredential( - PasswordFormDigest(form))) { - // Ideally, a |form| would not be updated in any way unless it was ensured - // that it, as a whole, can be used for a successful login. This, sadly, can - // not be guaranteed. It might be that |form| just contains updates to some - // meta-attribute, while it still has an out-of-date password. If such a - // password were to be propagated to affiliated credentials in that case, it - // may very well overwrite the actual, up-to-date password. Try to mitigate - // this risk by ignoring updates unless they actually update the password. - std::unique_ptr<PasswordForm> old_form(GetLoginImpl(form)); - if (old_form && form.password_value != old_form->password_value) - ScheduleFindAndUpdateAffiliatedWebLogins(form); - } - return UpdateLoginImpl(form, error); -} - -bool PasswordStore::UpdateInsecureCredentialsSync( - const PasswordForm& form, - base::span<const InsecureCredential> credentials) { - RemoveInsecureCredentialsImpl(form.signon_realm, form.username_value, - RemoveInsecureCredentialsReason::kSyncUpdate); - return AddInsecureCredentialsSync(credentials); -} - -PasswordStoreChangeList PasswordStore::RemoveLoginSync( - const PasswordForm& form) { - return RemoveLoginImpl(form); -} - void PasswordStore::NotifyLoginsChanged( const PasswordStoreChangeList& changes) { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); @@ -504,19 +441,6 @@ if (sync_bridge_) sync_bridge_->ActOnPasswordStoreChanges(changes); } - - if (base::ranges::any_of(changes, [](const auto& change) { - return change.insecure_credentials_changed(); - })) { - NotifyInsecureCredentialsChanged(); - } -} - -void PasswordStore::NotifyInsecureCredentialsChanged() { - insecure_credentials_observers_->Notify( - FROM_HERE, - &DatabaseInsecureCredentialsObserver::OnInsecureCredentialsChangedIn, - base::RetainedRef(this)); } void PasswordStore::NotifyDeletionsHaveSynced(bool success) { @@ -541,12 +465,7 @@ void PasswordStore::InvokeAndNotifyAboutInsecureCredentialsChange( base::OnceCallback<PasswordStoreChangeList()> callback) { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - PasswordStoreChangeList changes = std::move(callback).Run(); - if (!changes.empty()) { - NotifyInsecureCredentialsChanged(); - if (sync_bridge_) - sync_bridge_->ActOnPasswordStoreChanges(changes); - } + NotifyLoginsChanged(std::move(callback).Run()); } void PasswordStore::NotifyUnsyncedCredentialsWillBeDeleted(
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index 1f023c50b6..b363f7e 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -63,27 +63,6 @@ public PasswordStoreInterface, public SmartBubbleStatsStore { public: - class DatabaseInsecureCredentialsObserver { - // An interface used to notify clients (observers) of this object that the - // list of insecure credentials in the password store has changed. - // Register the observer via - // PasswordStore::AddDatabaseInsecureCredentialsObserver. - public: - // Notifies the observer that the list of insecure credentials changed. - // Will be called from the UI thread. - virtual void OnInsecureCredentialsChanged() = 0; - - // Like OnInsecureCredentialsChanged(), but also receives the originating - // PasswordStore as a parameter. This is useful for observers that observe - // changes in both the profile-scoped and the account-scoped store. The - // default implementation simply calls OnInsecureCredentialsChanged(), so - // observers that don't care about the store can just ignore this. - virtual void OnInsecureCredentialsChangedIn(PasswordStore* store); - - protected: - virtual ~DatabaseInsecureCredentialsObserver() = default; - }; - // Used to notify that unsynced credentials are about to be deleted. class UnsyncedCredentialsDeletionNotifier { public: @@ -210,15 +189,6 @@ // indicates whether any data was actually cleared. void ClearStore(base::OnceCallback<void(bool)> completion); - // Adds an observer to be notified when the list of insecure passwords in - // the password store changes. - void AddDatabaseInsecureCredentialsObserver( - DatabaseInsecureCredentialsObserver* observer); - - // Removes |observer| from the list of insecure credentials observer. - void RemoveDatabaseInsecureCredentialsObserver( - DatabaseInsecureCredentialsObserver* observer); - // Schedules the given |task| to be run on the PasswordStore's TaskRunner. bool ScheduleTask(base::OnceClosure task); @@ -349,28 +319,11 @@ // store is empty. virtual bool IsEmpty() = 0; - // PasswordStoreSync: - PasswordStoreChangeList AddLoginSync(const PasswordForm& form, - AddLoginError* error) override; - bool AddInsecureCredentialsSync( - base::span<const InsecureCredential> credentials) override; - PasswordStoreChangeList UpdateLoginSync(const PasswordForm& form, - UpdateLoginError* error) override; - bool UpdateInsecureCredentialsSync( - const PasswordForm& form, - base::span<const InsecureCredential> credentials) override; - - PasswordStoreChangeList RemoveLoginSync(const PasswordForm& form) override; - // Called by *Internal() methods once the underlying data-modifying operation // has been performed. Notifies observers that password store data may have // been changed. void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override; - // Notifies insecure credentials observers added via - // AddDatabaseInsecureCredentialsObserver() that data have been changed. - void NotifyInsecureCredentialsChanged() override; - void NotifyDeletionsHaveSynced(bool success) override; void NotifyUnsyncedCredentialsWillBeDeleted( @@ -396,11 +349,6 @@ PasswordStoreBackend* backend_ = nullptr; private: - FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, - UpdatePasswordsStoredForAffiliatedWebsites); - FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, AddInsecureCredentialsSync); - FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, UpdateInsecureCredentialsSync); - using StatsResult = std::vector<InteractionsStats>; using StatsTask = base::OnceCallback<StatsResult()>; @@ -563,10 +511,6 @@ // The observers. scoped_refptr<base::ObserverListThreadSafe<Observer>> observers_; - scoped_refptr< - base::ObserverListThreadSafe<DatabaseInsecureCredentialsObserver>> - insecure_credentials_observers_ = base::MakeRefCounted< - base::ObserverListThreadSafe<DatabaseInsecureCredentialsObserver>>(); std::unique_ptr<PasswordSyncBridge> sync_bridge_;
diff --git a/components/password_manager/core/browser/password_store_impl.cc b/components/password_manager/core/browser/password_store_impl.cc index 856d142..1f56a401 100644 --- a/components/password_manager/core/browser/password_store_impl.cc +++ b/components/password_manager/core/browser/password_store_impl.cc
@@ -312,6 +312,38 @@ return login_db_->IsEmpty(); } +PasswordStoreChangeList PasswordStoreImpl::AddLoginSync( + const PasswordForm& form, + AddLoginError* error) { + return AddLoginImpl(form, error); +} + +bool PasswordStoreImpl::AddInsecureCredentialsSync( + base::span<const InsecureCredential> credentials) { + return base::ranges::all_of(credentials, [this](const auto& cred) { + return !AddInsecureCredentialImpl(cred).empty(); + }); +} + +PasswordStoreChangeList PasswordStoreImpl::UpdateLoginSync( + const PasswordForm& form, + UpdateLoginError* error) { + return UpdateLoginImpl(form, error); +} + +bool PasswordStoreImpl::UpdateInsecureCredentialsSync( + const PasswordForm& form, + base::span<const InsecureCredential> credentials) { + RemoveInsecureCredentialsImpl(form.signon_realm, form.username_value, + RemoveInsecureCredentialsReason::kSyncUpdate); + return AddInsecureCredentialsSync(credentials); +} + +PasswordStoreChangeList PasswordStoreImpl::RemoveLoginSync( + const PasswordForm& form) { + return RemoveLoginImpl(form); +} + bool PasswordStoreImpl::BeginTransaction() { if (login_db_) return login_db_->BeginTransaction();
diff --git a/components/password_manager/core/browser/password_store_impl.h b/components/password_manager/core/browser/password_store_impl.h index fd449955..dcc17b0 100644 --- a/components/password_manager/core/browser/password_store_impl.h +++ b/components/password_manager/core/browser/password_store_impl.h
@@ -86,6 +86,16 @@ bool IsEmpty() override; // Implements PasswordStoreSync interface. + PasswordStoreChangeList AddLoginSync(const PasswordForm& form, + AddLoginError* error) override; + bool AddInsecureCredentialsSync( + base::span<const InsecureCredential> credentials) override; + PasswordStoreChangeList UpdateLoginSync(const PasswordForm& form, + UpdateLoginError* error) override; + bool UpdateInsecureCredentialsSync( + const PasswordForm& form, + base::span<const InsecureCredential> credentials) override; + PasswordStoreChangeList RemoveLoginSync(const PasswordForm& form) override; bool BeginTransaction() override; void RollbackTransaction() override; bool CommitTransaction() override; @@ -100,6 +110,11 @@ bool DeleteAndRecreateDatabaseFile() override; private: + FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, + UpdatePasswordsStoredForAffiliatedWebsites); + FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, AddInsecureCredentialsSync); + FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, UpdateInsecureCredentialsSync); + // Implements PasswordStoreBackend interface. void GetAllLoginsAsync(LoginsReply callback) override;
diff --git a/components/password_manager/core/browser/password_store_sync.h b/components/password_manager/core/browser/password_store_sync.h index 14ae9581..5e173dd 100644 --- a/components/password_manager/core/browser/password_store_sync.h +++ b/components/password_manager/core/browser/password_store_sync.h
@@ -163,9 +163,6 @@ // Notifies observers that password store data may have been changed. virtual void NotifyLoginsChanged(const PasswordStoreChangeList& changes) = 0; - // Notifies observers that local list of insecure credentials changed. - virtual void NotifyInsecureCredentialsChanged() = 0; - // Notifies any waiting callback that all pending deletions have been // committed to the Sync server now, or that Sync definitely won't commit // them (because Sync was turned off permanently).
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index f507ccb..b27377af 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -114,11 +114,6 @@ DISALLOW_COPY_AND_ASSIGN(MockPasswordStoreConsumer); }; -struct MockDatabaseInsecureCredentialsObserver - : PasswordStore::DatabaseInsecureCredentialsObserver { - MOCK_METHOD0(OnInsecureCredentialsChanged, void()); -}; - class MockPasswordStoreSigninNotifier : public PasswordStoreSigninNotifier { public: MOCK_METHOD(void, @@ -461,8 +456,6 @@ } TEST_F(PasswordStoreTest, InsecurePasswordObserverOnInsecureCredentialAdded) { - MockDatabaseInsecureCredentialsObserver observer; - constexpr PasswordFormData kTestCredentials = {PasswordForm::Scheme::kHtml, kTestWebRealm1, kTestWebRealm1, @@ -481,15 +474,18 @@ scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); store->Init(nullptr); store->AddLogin(*FillPasswordFormWithData(kTestCredentials)); - store->AddDatabaseInsecureCredentialsObserver(&observer); + WaitForPasswordStore(); + + MockPasswordStoreObserver mock_observer; + store->AddObserver(&mock_observer); // Expect a notification after adding a credential. - EXPECT_CALL(observer, OnInsecureCredentialsChanged); + EXPECT_CALL(mock_observer, OnLoginsChanged); store->AddInsecureCredential(insecure_credential); WaitForPasswordStore(); // Adding the same credential should not result in another notification. - EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(0); + EXPECT_CALL(mock_observer, OnLoginsChanged).Times(0); store->AddInsecureCredential(insecure_credential); WaitForPasswordStore(); @@ -497,8 +493,6 @@ } TEST_F(PasswordStoreTest, InsecurePasswordObserverOnInsecureCredentialRemoved) { - MockDatabaseInsecureCredentialsObserver observer; - constexpr PasswordFormData kTestCredentials = {PasswordForm::Scheme::kHtml, kTestWebRealm1, kTestWebRealm1, @@ -521,17 +515,18 @@ store->AddInsecureCredential(insecure_credential); WaitForPasswordStore(); - store->AddDatabaseInsecureCredentialsObserver(&observer); + MockPasswordStoreObserver mock_observer; + store->AddObserver(&mock_observer); // Expect a notification after removing a credential. - EXPECT_CALL(observer, OnInsecureCredentialsChanged); + EXPECT_CALL(mock_observer, OnLoginsChanged); store->RemoveInsecureCredentials(insecure_credential.signon_realm, insecure_credential.username, RemoveInsecureCredentialsReason::kRemove); WaitForPasswordStore(); // Removing the same credential should not result in another notification. - EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(0); + EXPECT_CALL(mock_observer, OnLoginsChanged).Times(0); store->RemoveInsecureCredentials(insecure_credential.signon_realm, insecure_credential.username, RemoveInsecureCredentialsReason::kRemove); @@ -725,7 +720,9 @@ // When the password stored for an Android application is updated, credentials // with the same username stored for affiliated web sites should also be updated // automatically. -TEST_F(PasswordStoreTest, UpdatePasswordsStoredForAffiliatedWebsites) { +// TODO(crbug.bom/1226042): Remove this test since we no longer update passwords +// for affiliated websites through sync. +TEST_F(PasswordStoreTest, DISABLED_UpdatePasswordsStoredForAffiliatedWebsites) { const char16_t kTestUsername[] = u"username_value_1"; const char16_t kTestOtherUsername[] = u"username_value_2"; const char16_t kTestOldPassword[] = u"old_password_value"; @@ -887,14 +884,14 @@ _, testing::SizeIs(kExpectedNumberOfPropagatedUpdates))); if (test_remove_and_add_login) { store->ScheduleTask( - base::BindOnce(IgnoreResult(&PasswordStore::RemoveLoginSync), store, - *all_credentials[0])); + base::BindOnce(IgnoreResult(&PasswordStoreImpl::RemoveLoginSync), + store, *all_credentials[0])); store->ScheduleTask(base::BindOnce( - IgnoreResult(&PasswordStore::AddLoginSync), store, + IgnoreResult(&PasswordStoreImpl::AddLoginSync), store, *expected_credentials_after_update[0], /*error=*/nullptr)); } else { store->ScheduleTask(base::BindOnce( - IgnoreResult(&PasswordStore::UpdateLoginSync), store, + IgnoreResult(&PasswordStoreImpl::UpdateLoginSync), store, *expected_credentials_after_update[0], /*error=*/nullptr)); } WaitForPasswordStore(); @@ -1428,11 +1425,12 @@ base::Time(), InsecureType::kReused, IsMuted(false))}; AddLoginError add_login_error = AddLoginError::kDbError; - store->ScheduleTask(base::BindOnce(IgnoreResult(&PasswordStore::AddLoginSync), - store, *test_form, &add_login_error)); store->ScheduleTask( - base::BindOnce(IgnoreResult(&PasswordStore::AddInsecureCredentialsSync), - store, credentials)); + base::BindOnce(IgnoreResult(&PasswordStoreImpl::AddLoginSync), store, + *test_form, &add_login_error)); + store->ScheduleTask(base::BindOnce( + IgnoreResult(&PasswordStoreImpl::AddInsecureCredentialsSync), store, + credentials)); WaitForPasswordStore(); EXPECT_EQ(add_login_error, AddLoginError::kNone); @@ -1487,7 +1485,7 @@ // Update the password store with the new insecure credentials. store->ScheduleTask(base::BindOnce( - IgnoreResult(&PasswordStore::UpdateInsecureCredentialsSync), store, + IgnoreResult(&PasswordStoreImpl::UpdateInsecureCredentialsSync), store, *test_form, new_credentials)); WaitForPasswordStore(); @@ -1501,57 +1499,6 @@ store->ShutdownOnUIThread(); } -// Verify that when a password is updated that the corresponding row is also -// removed from the insecure credentials table and consumer is notified. -TEST_F(PasswordStoreTest, InsecureCredentialsObserverOnPasswordUpdate) { - scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); - store->Init(nullptr); - - MockDatabaseInsecureCredentialsObserver observer; - store->AddDatabaseInsecureCredentialsObserver(&observer); - - /* clang-format off */ - static const PasswordFormData kTestCredential = - {PasswordForm::Scheme::kHtml, - kTestWebRealm1, - kTestWebOrigin1, - "", u"", u"username_element_1", u"password_element_1", - u"username_value_1", - u"", kTestLastUsageTime, 1}; - /* clang-format on */ - - std::unique_ptr<PasswordForm> test_form( - FillPasswordFormWithData(kTestCredential)); - - store->AddLogin(*test_form); - WaitForPasswordStore(); - - // If there are no insecure credentials, we should not notify insecure - // credentials observer. - EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(0); - - test_form->password_value = u"new_password"; - store->UpdateLogin(*test_form); - WaitForPasswordStore(); - testing::Mock::VerifyAndClear(&observer); - - // Add insecure credential. - InsecureCredential insecure_credential(kTestWebRealm1, u"username_value_1", - base::Time::FromTimeT(1), - InsecureType::kLeaked, IsMuted(false)); - store->AddInsecureCredential(insecure_credential); - WaitForPasswordStore(); - - // Expect a notification after updating a password. - EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(1); - - test_form->password_value = u"new_password_2"; - store->UpdateLogin(*test_form); - WaitForPasswordStore(); - - store->ShutdownOnUIThread(); -} - TEST_F(PasswordStoreTest, TestGetLoginRequestCancelable) { scoped_refptr<PasswordStoreWithMockedMetadataStore> store = CreatePasswordStoreWithMockedMetaData();
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index b61c61a4..af37fd1 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -471,8 +471,6 @@ // This is used to keep track of all the changes applied to the password // store to notify other observers of the password store. PasswordStoreChangeList password_store_changes; - // Whether local state of insecure credentials changed. - bool local_insecure_credentials_changed = false; { ScopedStoreTransaction transaction(password_store_sync_); const base::Time time_now = base::Time::Now(); @@ -558,7 +556,6 @@ if (!remote_and_local_insecure_credentials_equal) { password_store_sync_->UpdateInsecureCredentialsSync( form, remote_insecure_credentials); - local_insecure_credentials_changed = true; } DCHECK_LE(changes.size(), 1U); base::UmaHistogramEnumeration( @@ -602,7 +599,6 @@ std::vector<InsecureCredential> credentials = InsecureCredentialsFromEntityChange(*entity_change); if (!credentials.empty()) { - local_insecure_credentials_changed = true; password_store_sync_->AddInsecureCredentialsSync( std::move(credentials)); } @@ -674,9 +670,6 @@ // metadata changes, and no need to notify observers since they aren't // interested in changes to sync metadata. password_store_sync_->NotifyLoginsChanged(password_store_changes); - if (local_insecure_credentials_changed) { - password_store_sync_->NotifyInsecureCredentialsChanged(); - } } metrics_util::LogPasswordSyncState(metrics_util::SYNCING_OK); @@ -712,7 +705,6 @@ // to notify other observers of the password store. PasswordStoreChangeList password_store_changes; // Whether local state of insecure credentials changed. - bool insecure_credentials_changed = false; { ScopedStoreTransaction transaction(password_store_sync_); @@ -730,7 +722,6 @@ InsecureCredentialsFromEntityChange(*entity_change); if (!credentials.empty()) { - insecure_credentials_changed = true; password_store_sync_->AddInsecureCredentialsSync( std::move(credentials)); } @@ -803,7 +794,6 @@ local_insecure_credentials)) { password_store_sync_->UpdateInsecureCredentialsSync( form, remote_insecure_credentials); - insecure_credentials_changed = true; } } base::UmaHistogramEnumeration( @@ -876,9 +866,6 @@ // changes are only metadata changes. In such case, no need to notify // observers since they aren't interested in changes to sync metadata. password_store_sync_->NotifyLoginsChanged(password_store_changes); - if (insecure_credentials_changed) { - password_store_sync_->NotifyInsecureCredentialsChanged(); - } } metrics_util::LogApplySyncChangesState( metrics_util::ApplySyncChangesState::kApplyOK);
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index c928904..e7195f3 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -370,7 +370,6 @@ NotifyLoginsChanged, (const PasswordStoreChangeList&), (override)); - MOCK_METHOD(void, NotifyInsecureCredentialsChanged, (), (override)); MOCK_METHOD(void, NotifyDeletionsHaveSynced, (bool), (override)); MOCK_METHOD(void, NotifyUnsyncedCredentialsWillBeDeleted, @@ -569,8 +568,6 @@ metadata_change_list->UpdateMetadata(kStorageKey, metadata); EXPECT_CALL(*mock_password_store_sync(), NotifyLoginsChanged).Times(0); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged) - .Times(0); EXPECT_CALL(*mock_sync_metadata_store_sync(), UpdateSyncMetadata(syncer::PASSWORDS, kStorageKey, _)); @@ -598,8 +595,6 @@ EXPECT_CALL( *mock_password_store_sync(), NotifyLoginsChanged(UnorderedElementsAre(ChangeHasPrimaryKey(1)))); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged) - .Times(0); // Processor shouldn't be notified about remote changes. EXPECT_CALL(mock_processor(), Put).Times(0); @@ -650,8 +645,6 @@ EXPECT_CALL(*mock_password_store_sync(), NotifyLoginsChanged( UnorderedElementsAre(ChangeHasPrimaryKey(kPrimaryKey)))); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged) - .Times(0); // Processor shouldn't be notified about remote changes. EXPECT_CALL(mock_processor(), Put).Times(0); @@ -680,8 +673,6 @@ EXPECT_CALL(*mock_password_store_sync(), NotifyLoginsChanged( UnorderedElementsAre(ChangeHasPrimaryKey(kPrimaryKey)))); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged) - .Times(0); // Processor shouldn't be notified about remote changes. EXPECT_CALL(mock_processor(), Delete).Times(0); @@ -1252,8 +1243,6 @@ EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged); - syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateAdd( /*storage_key=*/"", SpecificsToEntity(specifics))); @@ -1284,7 +1273,6 @@ EXPECT_CALL(*mock_password_store_sync(), AddInsecureCredentialsSync(UnorderedElementsAreArray(kIssues))); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged); EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); @@ -1380,7 +1368,6 @@ *mock_password_store_sync(), UpdateInsecureCredentialsSync(FormHasSignonRealm(kSignonRealm1), UnorderedElementsAreArray(kIssues))); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged); sync_pb::PasswordSpecifics specifics = CreateSpecificsWithSignonRealmAndIssues(kSignonRealm1, kIssuesTypes); @@ -1424,8 +1411,6 @@ UpdateLoginSync(FormHasSignonRealm(kSignonRealm1), _)); EXPECT_CALL(*mock_password_store_sync(), UpdateInsecureCredentialsSync) .Times(0); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged) - .Times(0); syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateUpdate( @@ -1464,7 +1449,6 @@ *mock_password_store_sync(), UpdateInsecureCredentialsSync(FormHasSignonRealm(kSignonRealm1), UnorderedElementsAreArray(kRemoteIssues))); - EXPECT_CALL(*mock_password_store_sync(), NotifyInsecureCredentialsChanged); syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateAdd(
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc index 0406448..10698ba1 100644 --- a/components/password_manager/core/browser/test_password_store.cc +++ b/components/password_manager/core/browser/test_password_store.cc
@@ -341,9 +341,14 @@ return {}; PasswordStoreChangeList changes; - for (const auto& form : stored_passwords_[insecure_credential.signon_realm]) { - if (form.username_value == insecure_credential.username) + for (auto& form : stored_passwords_[insecure_credential.signon_realm]) { + if (form.username_value == insecure_credential.username) { + form.password_issues->insert( + {insecure_credential.insecure_type, + InsecurityMetadata(insecure_credential.create_time, + insecure_credential.is_muted)}); changes.emplace_back(PasswordStoreChange::UPDATE, form); + } } return changes; } @@ -362,9 +367,11 @@ return {}; PasswordStoreChangeList changes; - for (const auto& form : stored_passwords_[signon_realm]) { - if (form.username_value == username) + for (auto& form : stored_passwords_[signon_realm]) { + if (form.username_value == username) { + form.password_issues->clear(); changes.emplace_back(PasswordStoreChange::UPDATE, form); + } } return changes; } @@ -400,6 +407,39 @@ NOTIMPLEMENTED(); } +PasswordStoreChangeList TestPasswordStore::AddLoginSync( + const PasswordForm& form, + AddLoginError* error) { + NOTIMPLEMENTED(); + return {}; +} + +bool TestPasswordStore::AddInsecureCredentialsSync( + base::span<const InsecureCredential> credentials) { + NOTIMPLEMENTED(); + return true; +} + +PasswordStoreChangeList TestPasswordStore::UpdateLoginSync( + const PasswordForm& form, + UpdateLoginError* error) { + NOTIMPLEMENTED(); + return {}; +} + +bool TestPasswordStore::UpdateInsecureCredentialsSync( + const PasswordForm& form, + base::span<const InsecureCredential> credentials) { + NOTIMPLEMENTED(); + return true; +} + +PasswordStoreChangeList TestPasswordStore::RemoveLoginSync( + const PasswordForm& form) { + NOTIMPLEMENTED(); + return {}; +} + bool TestPasswordStore::BeginTransaction() { return true; }
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h index 590e5d5..85ee509 100644 --- a/components/password_manager/core/browser/test_password_store.h +++ b/components/password_manager/core/browser/test_password_store.h
@@ -134,6 +134,18 @@ base::Time remove_end) override; // PasswordStoreSync interface. + // TODO(crbug.bom/1226042): Remove this after PasswordStore no longer + // inherits PasswordStoreSync. + PasswordStoreChangeList AddLoginSync(const PasswordForm& form, + AddLoginError* error) override; + bool AddInsecureCredentialsSync( + base::span<const InsecureCredential> credentials) override; + PasswordStoreChangeList UpdateLoginSync(const PasswordForm& form, + UpdateLoginError* error) override; + bool UpdateInsecureCredentialsSync( + const PasswordForm& form, + base::span<const InsecureCredential> credentials) override; + PasswordStoreChangeList RemoveLoginSync(const PasswordForm& form) override; bool BeginTransaction() override; void RollbackTransaction() override; bool CommitTransaction() override;
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_manager.cc b/components/password_manager/core/browser/ui/insecure_credentials_manager.cc index 8a115007..79cda653 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_manager.cc +++ b/components/password_manager/core/browser/ui/insecure_credentials_manager.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_functions.h" @@ -79,12 +80,20 @@ NOTREACHED(); } -// This function takes three lists of insecure credentials, weak passwords -// and saved passwords and joins them, producing a map that contains -// CredentialWithPassword as keys and vector<PasswordForm> as values with -// InsecureCredentialTypeFlags as values. -CredentialPasswordsMap JoinInsecureCredentialsWithSavedPasswords( - const std::vector<InsecureCredential>& insecure_credentials, +bool IsPasswordFormLeaked(const PasswordForm& form) { + return form.password_issues->find(InsecureType::kLeaked) != + form.password_issues->end(); +} + +bool IsPasswordFormPhished(const PasswordForm& form) { + return form.password_issues->find(InsecureType::kPhished) != + form.password_issues->end(); +} + +// This function two lists: weak passwords and saved passwords and joins them, +// producing a map that contains CredentialWithPassword as keys and +// vector<PasswordForm> as values. +CredentialPasswordsMap GetInsecureCredentialsFromPasswords( const base::flat_set<std::u16string>& weak_passwords, SavedPasswordsPresenter::SavedPasswordsView saved_passwords) { CredentialPasswordsMap credentials_to_forms; @@ -106,35 +115,21 @@ return credentials_to_forms; } - // Since a single (signon_realm, username) pair might have multiple - // corresponding entries in saved_passwords, we are using a multiset and doing - // look-up via equal_range. In most cases the resulting |range| should have a - // size of 1, however. - std::multiset<PasswordForm, CredentialWithoutPasswordLess> password_forms( - saved_passwords.begin(), saved_passwords.end()); - for (const auto& credential : insecure_credentials) { - auto range = password_forms.equal_range(credential); - // Make use of a set to only filter out repeated passwords, if any. - std::for_each(range.first, range.second, [&](const PasswordForm& form) { + for (const auto& form : saved_passwords) { + DCHECK(form.password_issues.has_value()); + if (IsPasswordFormLeaked(form) || IsPasswordFormPhished(form)) { CredentialView insecure_credential(form); auto& credential_to_form = credentials_to_forms[insecure_credential]; - - // Using |= operator to save in a bit mask both Leaked and Phished. - credential_to_form.type |= ConvertInsecureType(credential.insecure_type); - - // Use the latest time. Relevant when the same credential is both - // phished and leaked. - credential_to_form.latest_time = - std::max(credential_to_form.latest_time, credential.create_time); - + for (const auto& pair : form.password_issues.value()) { + credential_to_form.type |= ConvertInsecureType(pair.first); + credential_to_form.latest_time = + std::max(credential_to_form.latest_time, pair.second.create_time); + } // Populate the map. The values are vectors, because it is // possible that multiple saved passwords match to the same // insecure credential. credential_to_form.forms.push_back(form); - }); - } - - for (const auto& form : saved_passwords) { + } if (weak_passwords.contains(form.password_value)) { CredentialView weak_credential(form); auto& credential_to_form = credentials_to_forms[weak_credential]; @@ -233,17 +228,13 @@ scoped_refptr<PasswordStore> account_store) : presenter_(presenter), profile_store_(std::move(profile_store)), - account_store_(std::move(account_store)), - insecure_credentials_reader_(profile_store_.get(), account_store_.get()) { - observed_insecure_credentials_reader_.Observe(&insecure_credentials_reader_); + account_store_(std::move(account_store)) { observed_saved_password_presenter_.Observe(presenter_); } InsecureCredentialsManager::~InsecureCredentialsManager() = default; -void InsecureCredentialsManager::Init() { - insecure_credentials_reader_.Init(); -} +void InsecureCredentialsManager::Init() {} #if !defined(OS_ANDROID) && !defined(OS_IOS) void InsecureCredentialsManager::StartWeakCheck( @@ -348,8 +339,8 @@ } void InsecureCredentialsManager::UpdateInsecureCredentials() { - credentials_to_forms_ = JoinInsecureCredentialsWithSavedPasswords( - insecure_credentials_, weak_passwords_, presenter_->GetSavedPasswords()); + credentials_to_forms_ = GetInsecureCredentialsFromPasswords( + weak_passwords_, presenter_->GetSavedPasswords()); } void InsecureCredentialsManager::OnWeakCheckDone( @@ -362,15 +353,6 @@ NotifyWeakCredentialsChanged(); } -// Re-computes the list of insecure credentials with passwords after -// obtaining a new list of insecure credentials. -void InsecureCredentialsManager::OnInsecureCredentialsChanged( - const std::vector<InsecureCredential>& insecure_credentials) { - insecure_credentials_ = insecure_credentials; - UpdateInsecureCredentials(); - NotifyInsecureCredentialsChanged(); -} - void InsecureCredentialsManager::OnEdited(const PasswordForm& form) { // The WeakCheck is a Desktop only feature for now. Disable on Mobile to avoid // pulling in a big dependency on zxcvbn. @@ -392,8 +374,8 @@ // new list of saved passwords. void InsecureCredentialsManager::OnSavedPasswordsChanged( SavedPasswordsPresenter::SavedPasswordsView saved_passwords) { - credentials_to_forms_ = JoinInsecureCredentialsWithSavedPasswords( - insecure_credentials_, weak_passwords_, saved_passwords); + credentials_to_forms_ = + GetInsecureCredentialsFromPasswords(weak_passwords_, saved_passwords); NotifyInsecureCredentialsChanged(); NotifyWeakCredentialsChanged(); }
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_manager.h b/components/password_manager/core/browser/ui/insecure_credentials_manager.h index 31682b3f..2545f1d0 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_manager.h +++ b/components/password_manager/core/browser/ui/insecure_credentials_manager.h
@@ -23,7 +23,6 @@ #include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/ui/credential_utils.h" -#include "components/password_manager/core/browser/ui/insecure_credentials_reader.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" #include "url/gurl.h" @@ -141,8 +140,7 @@ // insecure credentials with corresponding autofill::PasswordForms. It supports // an observer interface, and clients can register themselves to get notified // about changes to the list. -class InsecureCredentialsManager : public InsecureCredentialsReader::Observer, - public SavedPasswordsPresenter::Observer { +class InsecureCredentialsManager : public SavedPasswordsPresenter::Observer { public: using CredentialsView = base::span<const CredentialWithPassword>; @@ -213,10 +211,6 @@ void OnWeakCheckDone(base::ElapsedTimer timer_since_weak_check_start, base::flat_set<std::u16string> weak_passwords); - // InsecureCredentialsReader::Observer: - void OnInsecureCredentialsChanged( - const std::vector<InsecureCredential>& insecure_credentials) override; - // SavedPasswordsPresenter::Observer: void OnEdited(const PasswordForm& form) override; void OnSavedPasswordsChanged( @@ -240,10 +234,6 @@ scoped_refptr<PasswordStore> profile_store_; scoped_refptr<PasswordStore> account_store_; - // The reader used to read the insecure credentials from the password - // stores. - InsecureCredentialsReader insecure_credentials_reader_; - // Cache of the most recently obtained insecure credentials. std::vector<InsecureCredential> insecure_credentials_; @@ -254,12 +244,6 @@ // create_type and combined insecure type. CredentialPasswordsMap credentials_to_forms_; - // A scoped observer for |insecure_credentials_reader_| to listen changes - // related to InsecureCredential only. - base::ScopedObservation<InsecureCredentialsReader, - InsecureCredentialsReader::Observer> - observed_insecure_credentials_reader_{this}; - // A scoped observer for |presenter_|. base::ScopedObservation<SavedPasswordsPresenter, SavedPasswordsPresenter::Observer>
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc b/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc index bf32c3e..57824bf 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc +++ b/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc
@@ -63,14 +63,6 @@ using StrictMockInsecureCredentialsManagerObserver = ::testing::StrictMock<MockInsecureCredentialsManagerObserver>; -InsecureCredential MakeInsecureCredential( - std::string signon_realm, - base::StringPiece16 username, - InsecureType type = InsecureType::kLeaked) { - return InsecureCredential(std::move(signon_realm), std::u16string(username), - base::Time(), type, IsMuted(false)); -} - PasswordForm MakeSavedPassword(base::StringPiece signon_realm, base::StringPiece16 username, base::StringPiece16 password, @@ -81,6 +73,10 @@ form.username_value = std::u16string(username); form.password_value = std::u16string(password); form.username_element = std::u16string(username_element); + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = base::flat_map<InsecureType, InsecurityMetadata>(); return form; } @@ -92,13 +88,10 @@ CredentialWithPassword MakeCompromisedCredential( const PasswordForm& form, - const InsecureCredential& credential) { + InsecureCredentialTypeFlags type = + InsecureCredentialTypeFlags::kCredentialLeaked) { CredentialWithPassword credential_with_password((CredentialView(form))); - credential_with_password.create_time = credential.create_time; - credential_with_password.insecure_type = - credential.insecure_type == InsecureType::kLeaked - ? InsecureCredentialTypeFlags::kCredentialLeaked - : InsecureCredentialTypeFlags::kCredentialPhished; + credential_with_password.insecure_type = type; return credential_with_password; } @@ -110,10 +103,9 @@ } CredentialWithPassword MakeWeakAndCompromisedCredential( - const PasswordForm& form, - const InsecureCredential& credential) { + const PasswordForm& form) { CredentialWithPassword credential_with_password = - MakeCompromisedCredential(form, credential); + MakeCompromisedCredential(form); credential_with_password.insecure_type |= InsecureCredentialTypeFlags::kWeakCredential; return credential_with_password; @@ -186,48 +178,41 @@ // Tests whether adding and removing an observer works as expected. TEST_F(InsecureCredentialsManagerTest, NotifyObserversAboutCompromisedCredentialChanges) { - store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1)); + PasswordForm password_form = + MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + store().AddLogin(password_form); RunUntilIdle(); - std::vector<InsecureCredential> credentials = { - MakeInsecureCredential(kExampleCom, kUsername1)}; - StrictMockInsecureCredentialsManagerObserver observer; provider().AddObserver(&observer); // Adding a compromised credential should notify observers. - EXPECT_CALL(observer, OnInsecureCredentialsChanged); - store().AddInsecureCredential(credentials[0]); - RunUntilIdle(); - EXPECT_THAT(store().insecure_credentials(), ElementsAreArray(credentials)); + password_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); - // Adding the exact same credential should not result in a notification, as - // the database is not actually modified. - EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(0); - store().AddInsecureCredential(credentials[0]); + EXPECT_CALL(observer, OnInsecureCredentialsChanged); + EXPECT_CALL(observer, OnWeakCredentialsChanged); + store().UpdateLogin(password_form); RunUntilIdle(); // Remove should notify, and observers should be passed an empty list. + password_form.password_issues->clear(); EXPECT_CALL(observer, OnInsecureCredentialsChanged(IsEmpty())); - store().RemoveInsecureCredentials(credentials[0].signon_realm, - credentials[0].username, - RemoveInsecureCredentialsReason::kRemove); - RunUntilIdle(); - EXPECT_THAT(store().insecure_credentials(), IsEmpty()); + EXPECT_CALL(observer, OnWeakCredentialsChanged); + store().UpdateLogin(password_form); - // Similarly to repeated add, a repeated remove should not notify either. - EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(0); - store().RemoveInsecureCredentials(credentials[0].signon_realm, - credentials[0].username, - RemoveInsecureCredentialsReason::kRemove); RunUntilIdle(); + EXPECT_THAT(provider().GetInsecureCredentials(), IsEmpty()); // After an observer is removed it should no longer receive notifications. provider().RemoveObserver(&observer); EXPECT_CALL(observer, OnInsecureCredentialsChanged).Times(0); - store().AddInsecureCredential(credentials[0]); + password_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + store().UpdateLogin(password_form); RunUntilIdle(); - EXPECT_THAT(store().insecure_credentials(), ElementsAreArray(credentials)); + EXPECT_THAT(provider().GetInsecureCredentials(), + ElementsAre(MakeCompromisedCredential(password_form))); } // Tests whether adding and removing an observer works as expected. @@ -271,17 +256,14 @@ TEST_F(InsecureCredentialsManagerTest, JoinSingleCredentials) { PasswordForm password = MakeSavedPassword(kExampleCom, kUsername1, kPassword1); - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); + password.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(password); - store().AddInsecureCredential(credential); RunUntilIdle(); - CredentialWithPassword expected = - MakeCompromisedCredential(password, credential); - expected.password = password.password_value; - EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected)); + EXPECT_THAT(provider().GetInsecureCredentials(), + ElementsAre(MakeCompromisedCredential(password))); } // Tests that the provider is able to join a password with a credential that was @@ -289,18 +271,16 @@ TEST_F(InsecureCredentialsManagerTest, JoinPhishedAndLeaked) { PasswordForm password = MakeSavedPassword(kExampleCom, kUsername1, kPassword1); - InsecureCredential leaked = - MakeInsecureCredential(kExampleCom, kUsername1, InsecureType::kLeaked); - InsecureCredential phished = - MakeInsecureCredential(kExampleCom, kUsername1, InsecureType::kPhished); + + password.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + password.password_issues->insert( + {InsecureType::kPhished, InsecurityMetadata()}); store().AddLogin(password); - store().AddInsecureCredential(leaked); - store().AddInsecureCredential(phished); RunUntilIdle(); - CredentialWithPassword expected = MakeCompromisedCredential(password, leaked); - expected.password = password.password_value; + CredentialWithPassword expected = MakeCompromisedCredential(password); expected.insecure_type = (InsecureCredentialTypeFlags::kCredentialLeaked | InsecureCredentialTypeFlags::kCredentialPhished); @@ -310,39 +290,42 @@ // Tests that the provider reacts whenever the saved passwords or the // compromised credentials change. TEST_F(InsecureCredentialsManagerTest, ReactToChangesInBothTables) { - std::vector<PasswordForm> passwords = { - MakeSavedPassword(kExampleCom, kUsername1, kPassword1), - MakeSavedPassword(kExampleCom, kUsername2, kPassword216)}; + PasswordForm password1 = + MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + PasswordForm password2 = + MakeSavedPassword(kExampleCom, kUsername2, kPassword216); - std::vector<InsecureCredential> credentials = { - MakeInsecureCredential(kExampleCom, kUsername1), - MakeInsecureCredential(kExampleCom, kUsername2)}; - - std::vector<CredentialWithPassword> expected = { - MakeCompromisedCredential(passwords[0], credentials[0]), - MakeCompromisedCredential(passwords[1], credentials[1])}; - - store().AddLogin(passwords[0]); + store().AddLogin(password1); RunUntilIdle(); EXPECT_THAT(provider().GetInsecureCredentials(), IsEmpty()); - store().AddInsecureCredential(credentials[0]); + password1.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + store().UpdateLogin(password1); RunUntilIdle(); - EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected[0])); + EXPECT_THAT(provider().GetInsecureCredentials(), + ElementsAre(MakeCompromisedCredential(password1))); - store().AddLogin(passwords[1]); + store().AddLogin(password2); RunUntilIdle(); - EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected[0])); + EXPECT_THAT(provider().GetInsecureCredentials(), + ElementsAre(MakeCompromisedCredential(password1))); - store().AddInsecureCredential(credentials[1]); + password2.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + store().UpdateLogin(password2); RunUntilIdle(); - EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAreArray(expected)); + EXPECT_THAT( + provider().GetInsecureCredentials(), + testing::UnorderedElementsAre(MakeCompromisedCredential(password1), + MakeCompromisedCredential(password2))); - store().RemoveLogin(passwords[0]); + store().RemoveLogin(password1); RunUntilIdle(); - EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected[1])); + EXPECT_THAT(provider().GetInsecureCredentials(), + ElementsAre(MakeCompromisedCredential(password2))); - store().RemoveLogin(passwords[1]); + store().RemoveLogin(password2); RunUntilIdle(); EXPECT_THAT(provider().GetInsecureCredentials(), IsEmpty()); } @@ -350,109 +333,44 @@ // Tests that the provider is able to join multiple passwords with compromised // credentials. TEST_F(InsecureCredentialsManagerTest, JoinMultipleCredentials) { - std::vector<PasswordForm> passwords = { - MakeSavedPassword(kExampleCom, kUsername1, kPassword1), - MakeSavedPassword(kExampleCom, kUsername2, kPassword216)}; + PasswordForm password1 = + MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + password1.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); - std::vector<InsecureCredential> credentials = { - MakeInsecureCredential(kExampleCom, kUsername1), - MakeInsecureCredential(kExampleCom, kUsername2)}; + PasswordForm password2 = + MakeSavedPassword(kExampleCom, kUsername2, kPassword216); + password2.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); - store().AddLogin(passwords[0]); - store().AddLogin(passwords[1]); - store().AddInsecureCredential(credentials[0]); - store().AddInsecureCredential(credentials[1]); + store().AddLogin(password1); + store().AddLogin(password2); RunUntilIdle(); - CredentialWithPassword expected1 = - MakeCompromisedCredential(passwords[0], credentials[0]); - CredentialWithPassword expected2 = - MakeCompromisedCredential(passwords[1], credentials[1]); - - EXPECT_THAT(provider().GetInsecureCredentials(), - ElementsAre(expected1, expected2)); -} - -// Tests that joining a compromised credential with saved passwords with a -// different username results in an empty list. -TEST_F(InsecureCredentialsManagerTest, JoinWitDifferentUsername) { - std::vector<PasswordForm> passwords = { - MakeSavedPassword(kExampleCom, kUsername2, kPassword1), - MakeSavedPassword(kExampleCom, kUsername2, kPassword216)}; - - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); - - store().AddLogin(passwords[0]); - store().AddLogin(passwords[1]); - store().AddInsecureCredential(credential); - RunUntilIdle(); - - EXPECT_THAT(provider().GetInsecureCredentials(), IsEmpty()); -} - -// Tests that joining a compromised credential with saved passwords with a -// matching username but different signon_realm results in an empty list. -TEST_F(InsecureCredentialsManagerTest, JoinWitDifferentSignonRealm) { - std::vector<PasswordForm> passwords = { - MakeSavedPassword(kExampleOrg, kUsername1, kPassword1), - MakeSavedPassword(kExampleOrg, kUsername1, kPassword216)}; - - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); - - store().AddLogin(passwords[0]); - store().AddLogin(passwords[1]); - store().AddInsecureCredential(credential); - RunUntilIdle(); - - EXPECT_THAT(provider().GetInsecureCredentials(), IsEmpty()); -} - -// Tests that joining a compromised credential with multiple saved passwords for -// the same signon_realm and username combination results in multiple entries -// when the passwords are distinct. -TEST_F(InsecureCredentialsManagerTest, JoinWithMultipleDistinctPasswords) { - std::vector<PasswordForm> passwords = { - MakeSavedPassword(kExampleCom, kUsername1, kPassword1, u"element_1"), - MakeSavedPassword(kExampleCom, kUsername1, kPassword216, u"element_2")}; - - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); - - store().AddLogin(passwords[0]); - store().AddLogin(passwords[1]); - store().AddInsecureCredential(credential); - RunUntilIdle(); - - CredentialWithPassword expected1 = - MakeCompromisedCredential(passwords[0], credential); - CredentialWithPassword expected2 = - MakeCompromisedCredential(passwords[1], credential); - - EXPECT_THAT(provider().GetInsecureCredentials(), - ElementsAre(expected1, expected2)); + EXPECT_THAT( + provider().GetInsecureCredentials(), + testing::UnorderedElementsAre(MakeCompromisedCredential(password1), + MakeCompromisedCredential(password2))); } // Tests that joining a compromised credential with multiple saved passwords for // the same signon_realm and username combination results in a single entry // when the passwords are the same. TEST_F(InsecureCredentialsManagerTest, JoinWithMultipleRepeatedPasswords) { - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); - std::vector<PasswordForm> passwords = { - MakeSavedPassword(kExampleCom, kUsername1, kPassword1, u"element_1"), - MakeSavedPassword(kExampleCom, kUsername1, kPassword1, u"element_2")}; + PasswordForm password1 = + MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + password1.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); - store().AddLogin(passwords[0]); - store().AddLogin(passwords[1]); - store().AddInsecureCredential(credential); + PasswordForm password2 = + MakeSavedPassword(kExampleCom, kUsername2, kPassword216); + + store().AddLogin(password1); + store().AddLogin(password2); RunUntilIdle(); - CredentialWithPassword expected = - MakeCompromisedCredential(passwords[0], credential); - - EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected)); + EXPECT_THAT(provider().GetInsecureCredentials(), + ElementsAre(MakeCompromisedCredential(password1))); } // Tests that verifies mapping compromised credentials to passwords works @@ -463,20 +381,20 @@ MakeSavedPassword(kExampleCom, kUsername1, kPassword1, u"element_2"), MakeSavedPassword(kExampleOrg, kUsername2, kPassword216)}; - std::vector<InsecureCredential> credentials = { - MakeInsecureCredential(kExampleCom, kUsername1), - MakeInsecureCredential(kExampleOrg, kUsername2)}; + passwords.at(0).password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + passwords.at(1).password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + passwords.at(2).password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); std::vector<CredentialWithPassword> credentials_with_password = { - MakeCompromisedCredential(passwords[0], credentials[0]), - MakeCompromisedCredential(passwords[1], credentials[0]), - MakeCompromisedCredential(passwords[2], credentials[1])}; + MakeCompromisedCredential(passwords[0]), + MakeCompromisedCredential(passwords[1]), + MakeCompromisedCredential(passwords[2])}; - store().AddLogin(passwords[0]); - store().AddLogin(passwords[1]); - store().AddLogin(passwords[2]); - store().AddInsecureCredential(credentials[0]); - store().AddInsecureCredential(credentials[1]); + for (const auto& form : passwords) + store().AddLogin(form); RunUntilIdle(); EXPECT_THAT(provider().GetSavedPasswordsFor(credentials_with_password[0]), @@ -649,14 +567,13 @@ std::vector<PasswordForm> passwords = { MakeSavedPassword(kExampleCom, kUsername1, kWeakPassword1), MakeSavedPassword(kExampleCom, kUsername2, kStrongPassword116)}; - std::vector<InsecureCredential> compromised_credentials = { - MakeInsecureCredential(kExampleCom, kUsername1), - MakeInsecureCredential(kExampleCom, kUsername2)}; + passwords.at(0).password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + passwords.at(1).password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(passwords[0]); store().AddLogin(passwords[1]); - store().AddInsecureCredential(compromised_credentials[0]); - store().AddInsecureCredential(compromised_credentials[1]); RunUntilIdle(); provider().StartWeakCheck(); @@ -692,11 +609,11 @@ TEST_F(InsecureCredentialsManagerTest, SingleCredentialIsWeakAndCompromised) { std::vector<PasswordForm> passwords = { MakeSavedPassword(kExampleCom, kUsername1, kWeakPassword1)}; - std::vector<InsecureCredential> compromised_credentials = { - MakeInsecureCredential(kExampleCom, kUsername1)}; + + passwords.at(0).password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(passwords[0]); - store().AddInsecureCredential(compromised_credentials[0]); RunUntilIdle(); provider().StartWeakCheck(); @@ -738,14 +655,11 @@ PasswordForm password_form = MakeSavedPassword(kExampleCom, kUsername1, kPassword1); LeakCheckCredential credential = MakeLeakCredential(kUsername1, kPassword1); - InsecureCredential compromised_credential = - MakeInsecureCredential(kExampleCom, kUsername1); store().AddLogin(password_form); RunUntilIdle(); - CredentialWithPassword expected = - MakeCompromisedCredential(password_form, compromised_credential); + CredentialWithPassword expected = MakeCompromisedCredential(password_form); expected.create_time = base::Time::Now(); provider().SaveInsecureCredential(credential); @@ -759,18 +673,17 @@ TEST_F(InsecureCredentialsManagerTest, UpdateCompromisedPassword) { PasswordForm password_form = MakeSavedPassword(kExampleCom, kUsername1, kPassword1); - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); + password_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(password_form); - store().AddInsecureCredential(credential); RunUntilIdle(); CredentialWithPassword expected = #if !defined(OS_ANDROID) && !defined(OS_IOS) - MakeWeakAndCompromisedCredential(password_form, credential); + MakeWeakAndCompromisedCredential(password_form); #else - MakeCompromisedCredential(password_form, credential); + MakeCompromisedCredential(password_form); #endif EXPECT_TRUE(provider().UpdateCredential(expected, kPassword2)); @@ -829,17 +742,16 @@ TEST_F(InsecureCredentialsManagerTest, UpdateInsecurePassword) { PasswordForm password_form = MakeSavedPassword(kExampleCom, kUsername1, kWeakPassword1); - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); + password_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(password_form); - store().AddInsecureCredential(credential); RunUntilIdle(); provider().StartWeakCheck(); RunUntilIdle(); CredentialWithPassword expected = - MakeWeakAndCompromisedCredential(password_form, credential); + MakeWeakAndCompromisedCredential(password_form); EXPECT_THAT(provider().GetWeakCredentials(), ElementsAre(expected)); EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected)); @@ -852,17 +764,15 @@ #endif // !defined(OS_ANDROID) && !defined(OS_IOS) TEST_F(InsecureCredentialsManagerTest, RemoveCompromisedCredential) { - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); PasswordForm password = MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + password.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(password); - store().AddInsecureCredential(credential); RunUntilIdle(); - CredentialWithPassword expected = - MakeCompromisedCredential(password, credential); + CredentialWithPassword expected = MakeCompromisedCredential(password); expected.password = password.password_value; EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected)); @@ -891,17 +801,16 @@ TEST_F(InsecureCredentialsManagerTest, RemoveInsecureCredential) { PasswordForm password_form = MakeSavedPassword(kExampleCom, kUsername1, kWeakPassword1); - InsecureCredential credential = - MakeInsecureCredential(kExampleCom, kUsername1); + password_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); store().AddLogin(password_form); - store().AddInsecureCredential(credential); RunUntilIdle(); provider().StartWeakCheck(); RunUntilIdle(); CredentialWithPassword expected = - MakeWeakAndCompromisedCredential(password_form, credential); + MakeWeakAndCompromisedCredential(password_form); EXPECT_THAT(provider().GetWeakCredentials(), ElementsAre(expected)); EXPECT_THAT(provider().GetInsecureCredentials(), ElementsAre(expected)); @@ -987,34 +896,36 @@ for (const PasswordForm& account_password : account_store_passwords) account_store().AddLogin(account_password); - // Mark `kPassword1` to be compromised in the profile store, and `kPassword2` - // to be compromised in the account store. - profile_store().AddInsecureCredential( - MakeInsecureCredential(kExampleCom, kUsername1)); - account_store().AddInsecureCredential( - MakeInsecureCredential(kExampleOrg, kUsername1)); + RunUntilIdle(); + + LeakCheckCredential credential = MakeLeakCredential(kUsername1, kPassword3); + + // Mark `kUsername1` and `kPassword3` to be compromised. + provider().SaveInsecureCredential(credential); RunUntilIdle(); // Each password should be joined only with compromised credential from // their store. - EXPECT_THAT( - provider().GetSavedPasswordsFor( - CredentialView(kExampleCom, GURL(), kUsername1, kPassword1)), - ElementsAreArray(profile_store().stored_passwords().at(kExampleCom))); - EXPECT_THAT(provider().GetSavedPasswordsFor( - CredentialView(kExampleOrg, GURL(), kUsername1, kPassword3)), + CredentialView(kExampleCom, GURL(), kUsername1, kPassword1)), IsEmpty()); - EXPECT_THAT(provider().GetSavedPasswordsFor( - CredentialView(kExampleCom, GURL(), kUsername1, kPassword3)), - IsEmpty()); + EXPECT_EQ(provider() + .GetSavedPasswordsFor( + CredentialView(kExampleOrg, GURL(), kUsername1, kPassword3)) + .size(), + 1u); - EXPECT_THAT( - provider().GetSavedPasswordsFor( - CredentialView(kExampleOrg, GURL(), kUsername1, kPassword216)), - ElementsAreArray(account_store().stored_passwords().at(kExampleOrg))); + EXPECT_EQ(provider() + .GetSavedPasswordsFor( + CredentialView(kExampleCom, GURL(), kUsername1, kPassword3)) + .size(), + 1u); + + EXPECT_THAT(provider().GetSavedPasswordsFor(CredentialView( + kExampleOrg, GURL(), kUsername1, kPassword216)), + IsEmpty()); } // Test verifies that saving LeakCheckCredential via provider adds expected @@ -1039,32 +950,60 @@ provider().SaveInsecureCredential(MakeLeakCredential(kUsername1, kPassword1)); RunUntilIdle(); - EXPECT_EQ(1U, profile_store().insecure_credentials().size()); - EXPECT_EQ(1U, account_store().insecure_credentials().size()); + EXPECT_EQ(2U, provider().GetInsecureCredentials().size()); + EXPECT_EQ(1U, profile_store() + .stored_passwords() + .at(kExampleCom) + .back() + .password_issues->size()); + EXPECT_EQ(1U, account_store() + .stored_passwords() + .at(kExampleOrg) + .back() + .password_issues->size()); + EXPECT_EQ(0U, account_store() + .stored_passwords() + .at(kExampleCom) + .back() + .password_issues->size()); - // Now, mark `kUsername1`, `kPassword2` as compromised, a new entry should be - // added only to the account store. + // Now, mark `kUsername1`, `kPassword216` as compromised, a new entry should + // be added only to the account store. provider().SaveInsecureCredential( MakeLeakCredential(kUsername1, kPassword216)); RunUntilIdle(); - EXPECT_EQ(1U, profile_store().insecure_credentials().size()); - EXPECT_EQ(2U, account_store().insecure_credentials().size()); + EXPECT_EQ(3U, provider().GetInsecureCredentials().size()); + EXPECT_EQ(1U, profile_store() + .stored_passwords() + .at(kExampleCom) + .back() + .password_issues->size()); + EXPECT_EQ(1U, account_store() + .stored_passwords() + .at(kExampleCom) + .back() + .password_issues->size()); + EXPECT_EQ(1U, account_store() + .stored_passwords() + .at(kExampleOrg) + .back() + .password_issues->size()); } TEST_F(InsecureCredentialsManagerWithTwoStoresTest, RemoveCompromisedCredential) { // Add `kUsername1`,`kPassword1` to both stores. - profile_store().AddLogin( - MakeSavedPassword(kExampleCom, kUsername1, kPassword1)); - account_store().AddLogin( - MakeSavedPassword(kExampleCom, kUsername1, kPassword1)); - - // Mark `kUsername1` and `kPassword1` to be compromised in both stores. - profile_store().AddInsecureCredential( - MakeInsecureCredential(kExampleCom, kUsername1)); - account_store().AddInsecureCredential( - MakeInsecureCredential(kExampleCom, kUsername1)); + PasswordForm profile_form = + MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + profile_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + PasswordForm account_form = + MakeSavedPassword(kExampleCom, kUsername1, kPassword1); + account_form.password_issues->insert( + {InsecureType::kLeaked, InsecurityMetadata()}); + profile_store().AddLogin(profile_form); + account_store().AddLogin(account_form); RunUntilIdle(); // Now remove the compromised credentials
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_reader.cc b/components/password_manager/core/browser/ui/insecure_credentials_reader.cc deleted file mode 100644 index 8a4b651..0000000 --- a/components/password_manager/core/browser/ui/insecure_credentials_reader.cc +++ /dev/null
@@ -1,121 +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 "components/password_manager/core/browser/ui/insecure_credentials_reader.h" - -#include <iterator> - -#include "base/containers/cxx20_erase.h" -#include "base/ranges/algorithm.h" -#include "components/password_manager/core/browser/password_form.h" - -namespace password_manager { -InsecureCredentialsReader::InsecureCredentialsReader( - PasswordStore* profile_store, - PasswordStore* account_store) - : profile_store_(profile_store), account_store_(account_store) { - DCHECK(profile_store_); - observed_password_stores_.AddObservation(profile_store_); - if (account_store_) { - observed_password_stores_.AddObservation(account_store_); - } else { - // Since we aren't expecting any response from the account store, mark it as - // responded not to block responses from the the profile waiting for the - // account store to respond. - account_store_responded_ = true; - } -} - -InsecureCredentialsReader::~InsecureCredentialsReader() = default; - -void InsecureCredentialsReader::Init() { - profile_store_->GetAllInsecureCredentials(this); - if (account_store_) - account_store_->GetAllInsecureCredentials(this); -} - -void InsecureCredentialsReader::OnInsecureCredentialsChanged() { - // This class overrides OnInsecureCredentialsChangedIn() (the version of - // this method that also receives the originating store), so the store-less - // version never gets called. - NOTREACHED(); -} - -void InsecureCredentialsReader::OnInsecureCredentialsChangedIn( - PasswordStore* store) { - store->GetAllInsecureCredentials(this); -} - -void InsecureCredentialsReader::OnGetInsecureCredentials( - std::vector<InsecureCredential> insecure_credentials) { - // This class overrides OnGetInsecureCredentialFrom() (the version of this - // method that also receives the originating store), so the store-less version - // never gets called. - NOTREACHED(); -} - -void InsecureCredentialsReader::OnGetInsecureCredentialsFrom( - PasswordStore* store, - std::vector<InsecureCredential> insecure_credentials) { - profile_store_responded_ |= store == profile_store_; - account_store_responded_ |= store == account_store_; - // Remove all previously cached credentials from `store` and then insert - // the just received `insecure_credentials`. - PasswordForm::Store to_remove = store == profile_store_ - ? PasswordForm::Store::kProfileStore - : PasswordForm::Store::kAccountStore; - - base::EraseIf(insecure_credentials_, [to_remove](const auto& credential) { - return credential.in_store == to_remove; - }); - - base::ranges::move(insecure_credentials, - std::back_inserter(insecure_credentials_)); - - // Observers are reptitively notified of insecure credentials, and hence - // vbservers can expect partial view of the insecure credentials, so inform - // the observers directly. - for (auto& observer : observers_) - observer.OnInsecureCredentialsChanged(insecure_credentials_); - - // For the callbacks waiting for the results of - // `GetAllInsecureCredentials()`, they should be notified only when both - // stores responded. - if (!profile_store_responded_ || !account_store_responded_) - return; - - for (auto& callback : - std::exchange(get_all_insecure_credentials_callbacks_, {})) { - std::move(callback).Run(insecure_credentials_); - } -} - -void InsecureCredentialsReader::GetAllInsecureCredentials( - GetInsecureCredentialsCallback cb) { - if (profile_store_responded_ && account_store_responded_) { - std::move(cb).Run(insecure_credentials_); - return; - } - // Add the callback *before* triggering any of the fetches. This ensures - // that we don't miss a notitication if the fetches return synchronously - // (which is the case in tests). - get_all_insecure_credentials_callbacks_.push_back(std::move(cb)); - - if (!profile_store_responded_) - profile_store_->GetAllInsecureCredentials(this); - if (!account_store_responded_) { - DCHECK(account_store_); - account_store_->GetAllInsecureCredentials(this); - } -} - -void InsecureCredentialsReader::AddObserver(Observer* observer) { - observers_.AddObserver(observer); -} - -void InsecureCredentialsReader::RemoveObserver(Observer* observer) { - observers_.RemoveObserver(observer); -} - -} // namespace password_manager
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_reader.h b/components/password_manager/core/browser/ui/insecure_credentials_reader.h deleted file mode 100644 index 5b65962..0000000 --- a/components/password_manager/core/browser/ui/insecure_credentials_reader.h +++ /dev/null
@@ -1,90 +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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_INSECURE_CREDENTIALS_READER_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_INSECURE_CREDENTIALS_READER_H_ - -#include "base/observer_list.h" -#include "base/scoped_multi_source_observation.h" -#include "components/password_manager/core/browser/insecure_credentials_consumer.h" -#include "components/password_manager/core/browser/password_store.h" - -namespace password_manager { -// This class is responsible for reading and listening to change in the -// insecure credentials in the underlying password stores. -class InsecureCredentialsReader - : public PasswordStore::DatabaseInsecureCredentialsObserver, - public InsecureCredentialsConsumer { - public: - using GetInsecureCredentialsCallback = - base::OnceCallback<void(std::vector<InsecureCredential>)>; - // Observer interface. Clients can implement this to get notified about - // changes to the list of insecure credentials. Clients can register and - // de-register themselves, and are expected to do so before the provider gets - // out of scope. - class Observer : public base::CheckedObserver { - public: - virtual void OnInsecureCredentialsChanged( - const std::vector<InsecureCredential>& insecure_credentials) = 0; - }; - - // |profile_store| cannot be null, and must outlive this class. - explicit InsecureCredentialsReader(PasswordStore* profile_store, - PasswordStore* account_store = nullptr); - InsecureCredentialsReader(const InsecureCredentialsReader&) = delete; - InsecureCredentialsReader& operator=(const InsecureCredentialsReader&) = - delete; - ~InsecureCredentialsReader() override; - - void Init(); - - // `callback` must outlive this object. - void GetAllInsecureCredentials(GetInsecureCredentialsCallback callback); - - // Allows clients and register and de-register themselves. - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - - private: - // PasswordStore::DatabaseInsecureCredentialsObserver: - void OnInsecureCredentialsChanged() override; - void OnInsecureCredentialsChangedIn(PasswordStore* store) override; - - // InsecureCredentialsConsumer: - void OnGetInsecureCredentials( - std::vector<InsecureCredential> insecure_credentials) override; - void OnGetInsecureCredentialsFrom( - PasswordStore* store, - std::vector<InsecureCredential> insecure_credentials) override; - - // The password stores containing the insecure credentials. - // |profile_store_| must not be null and must outlive this class. - PasswordStore* profile_store_; - PasswordStore* account_store_; - - // Cache of the most recently obtained insecure credentials. - std::vector<InsecureCredential> insecure_credentials_; - - // A scoped observer for |profile_store_|, and |account_store_| that listens - // to changes related to InsecureCredentials only. - base::ScopedMultiSourceObservation< - PasswordStore, - PasswordStore::DatabaseInsecureCredentialsObserver, - &PasswordStore::AddDatabaseInsecureCredentialsObserver, - &PasswordStore::RemoveDatabaseInsecureCredentialsObserver> - observed_password_stores_{this}; - - base::ObserverList<Observer, /*check_empty=*/true> observers_; - std::vector<GetInsecureCredentialsCallback> - get_all_insecure_credentials_callbacks_; - - // Whether we are still waiting for a first response from the profile and - // account stores. - bool profile_store_responded_ = false; - bool account_store_responded_ = false; -}; - -} // namespace password_manager - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_INSECURE_CREDENTIALS_READER_H_
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_reader_unittest.cc b/components/password_manager/core/browser/ui/insecure_credentials_reader_unittest.cc deleted file mode 100644 index fdeb0bd..0000000 --- a/components/password_manager/core/browser/ui/insecure_credentials_reader_unittest.cc +++ /dev/null
@@ -1,153 +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 "components/password_manager/core/browser/ui/insecure_credentials_reader.h" - -#include "base/memory/scoped_refptr.h" -#include "base/scoped_observation.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/mock_callback.h" -#include "base/test/task_environment.h" -#include "components/password_manager/core/browser/password_form.h" -#include "components/password_manager/core/browser/test_password_store.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace password_manager { - -namespace { - -using ::testing::UnorderedElementsAre; - -constexpr const char kTestWebRealm[] = "https://one.example.com/"; - -class MockInsecureCredentialsReaderObserver - : public InsecureCredentialsReader::Observer { - public: - MOCK_METHOD(void, - OnInsecureCredentialsChanged, - (const std::vector<InsecureCredential>&), - (override)); -}; - -PasswordForm MakeTestPassword(base::StringPiece username) { - PasswordForm form; - form.signon_realm = std::string(kTestWebRealm); - form.url = GURL(kTestWebRealm); - form.username_value = base::ASCIIToUTF16(username); - form.password_value = u"password"; - form.username_element = u"username_element"; - return form; -} - -class InsecureCredentialsReaderTest : public ::testing::Test { - protected: - InsecureCredentialsReaderTest() { - profile_store_->Init(/*prefs=*/nullptr); - account_store_->Init(/*prefs=*/nullptr); - } - - ~InsecureCredentialsReaderTest() override { - account_store_->ShutdownOnUIThread(); - profile_store_->ShutdownOnUIThread(); - task_env_.RunUntilIdle(); - } - - TestPasswordStore& profile_store() { return *profile_store_; } - TestPasswordStore& account_store() { return *account_store_; } - InsecureCredentialsReader& reader() { return reader_; } - - void RunUntilIdle() { task_env_.RunUntilIdle(); } - - private: - base::test::SingleThreadTaskEnvironment task_env_; - scoped_refptr<TestPasswordStore> profile_store_ = - base::MakeRefCounted<TestPasswordStore>(IsAccountStore(false)); - scoped_refptr<TestPasswordStore> account_store_ = - base::MakeRefCounted<TestPasswordStore>(IsAccountStore(true)); - InsecureCredentialsReader reader_{profile_store_.get(), account_store_.get()}; -}; - -} // namespace - -TEST_F(InsecureCredentialsReaderTest, AddCredentialsToBothStores) { - profile_store().AddLogin(MakeTestPassword("profile@gmail.com")); - account_store().AddLogin(MakeTestPassword("account1@gmail.com")); - account_store().AddLogin(MakeTestPassword("account2@gmail.com")); - RunUntilIdle(); - - InsecureCredential profile_cred; - profile_cred.signon_realm = kTestWebRealm; - profile_cred.username = u"profile@gmail.com"; - profile_cred.in_store = PasswordForm::Store::kProfileStore; - - InsecureCredential account_cred1; - account_cred1.signon_realm = kTestWebRealm; - account_cred1.username = u"account1@gmail.com"; - account_cred1.in_store = PasswordForm::Store::kAccountStore; - - InsecureCredential account_cred2; - account_cred2.signon_realm = kTestWebRealm; - account_cred2.username = u"account2@gmail.com"; - account_cred2.in_store = PasswordForm::Store::kAccountStore; - - ::testing::NiceMock<MockInsecureCredentialsReaderObserver> mock_observer; - reader().AddObserver(&mock_observer); - - EXPECT_CALL(mock_observer, - OnInsecureCredentialsChanged(UnorderedElementsAre(profile_cred))); - profile_store().AddInsecureCredential(profile_cred); - RunUntilIdle(); - - EXPECT_CALL(mock_observer, OnInsecureCredentialsChanged(UnorderedElementsAre( - profile_cred, account_cred1))); - account_store().AddInsecureCredential(account_cred1); - RunUntilIdle(); - - EXPECT_CALL(mock_observer, OnInsecureCredentialsChanged(UnorderedElementsAre( - profile_cred, account_cred1, account_cred2))); - account_store().AddInsecureCredential(account_cred2); - RunUntilIdle(); - - EXPECT_CALL(mock_observer, OnInsecureCredentialsChanged(UnorderedElementsAre( - account_cred1, account_cred2))); - profile_store().RemoveInsecureCredentials( - profile_cred.signon_realm, profile_cred.username, - RemoveInsecureCredentialsReason::kRemove); - RunUntilIdle(); - - EXPECT_CALL(mock_observer, OnInsecureCredentialsChanged(UnorderedElementsAre( - profile_cred, account_cred1, account_cred2))); - profile_store().AddInsecureCredential(profile_cred); - RunUntilIdle(); - - reader().RemoveObserver(&mock_observer); -} - -TEST_F(InsecureCredentialsReaderTest, GetAllInsecureCredentials) { - InsecureCredential profile_cred; - profile_cred.signon_realm = kTestWebRealm; - profile_cred.username = u"profile@gmail.com"; - profile_cred.in_store = PasswordForm::Store::kProfileStore; - - InsecureCredential account_cred; - account_cred.signon_realm = kTestWebRealm; - account_cred.username = u"account1@gmail.com"; - account_cred.in_store = PasswordForm::Store::kAccountStore; - - profile_store().AddInsecureCredential(profile_cred); - account_store().AddInsecureCredential(account_cred); - - base::MockCallback<InsecureCredentialsReader::GetInsecureCredentialsCallback> - get_all_insecure_credentials_cb; - - reader().GetAllInsecureCredentials(get_all_insecure_credentials_cb.Get()); - - // The callback is run only after the stores respond in RunUntilIdle(). - EXPECT_CALL(get_all_insecure_credentials_cb, - Run(UnorderedElementsAre(profile_cred, account_cred))); - RunUntilIdle(); -} - -} // namespace password_manager
diff --git a/components/password_manager/core/common/password_manager_pref_names.cc b/components/password_manager/core/common/password_manager_pref_names.cc index 5d3af2e..20eb904 100644 --- a/components/password_manager/core/common/password_manager_pref_names.cc +++ b/components/password_manager/core/common/password_manager_pref_names.cc
@@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "build/build_config.h" #include "components/password_manager/core/common/password_manager_pref_names.h" +#include "build/build_config.h" + namespace password_manager { namespace prefs { @@ -19,7 +20,6 @@ #if defined(OS_APPLE) const char kKeychainMigrationStatus[] = "password_manager.keychain_migration"; -const char kPasswordRecovery[] = "password_manager.password_recovery"; #endif const char kWasAutoSignInFirstRunExperienceShown[] =
diff --git a/components/password_manager/core/common/password_manager_pref_names.h b/components/password_manager/core/common/password_manager_pref_names.h index d6aba17..89f5a68 100644 --- a/components/password_manager/core/common/password_manager_pref_names.h +++ b/components/password_manager/core/common/password_manager_pref_names.h
@@ -37,11 +37,6 @@ // The current status of migrating the passwords from the Keychain to the // database. Stores a value from MigrationStatus. extern const char kKeychainMigrationStatus[]; - -// The date of when passwords were cleaned up for MacOS users who previously -// lost access to their password because of encryption key modification in -// Keychain. -extern const char kPasswordRecovery[]; #endif // Boolean that indicated whether first run experience for the auto sign-in
diff --git a/components/password_manager/core/common/password_manager_ui.h b/components/password_manager/core/common/password_manager_ui.h index 73a079f..884bb6d0 100644 --- a/components/password_manager/core/common/password_manager_ui.h +++ b/components/password_manager/core/common/password_manager_ui.h
@@ -36,9 +36,6 @@ // Chrome needs to ask the user to confirm password updating. PENDING_PASSWORD_UPDATE_STATE, - // The user was prompted to sign in to Chrome after saving a password. - CHROME_SIGN_IN_PROMO_STATE, - // A user opted in to account storage is about to lose some unsynced // passwords. WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE,
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn index eb29d622..861d73b 100644 --- a/components/permissions/BUILD.gn +++ b/components/permissions/BUILD.gn
@@ -21,6 +21,8 @@ sources = [ "chooser_controller.cc", "chooser_controller.h", + "chooser_title_util.cc", + "chooser_title_util.h", "constants.cc", "constants.h", "contexts/accessibility_permission_context.cc", @@ -163,8 +165,12 @@ sources += [ "bluetooth_chooser_controller.cc", "bluetooth_chooser_controller.h", + "bluetooth_chooser_desktop.cc", + "bluetooth_chooser_desktop.h", "bluetooth_scanning_prompt_controller.cc", "bluetooth_scanning_prompt_controller.h", + "bluetooth_scanning_prompt_desktop.cc", + "bluetooth_scanning_prompt_desktop.h", "permission_prompt_impl.cc", ] }
diff --git a/components/permissions/android/translations/permissions_android_strings_fr-CA.xtb b/components/permissions/android/translations/permissions_android_strings_fr-CA.xtb index 4ce4864..3967b40 100644 --- a/components/permissions/android/translations/permissions_android_strings_fr-CA.xtb +++ b/components/permissions/android/translations/permissions_android_strings_fr-CA.xtb
@@ -18,7 +18,7 @@ <translation id="5817918615728894473">Associer</translation> <translation id="5858741533101922242">Chrome n'est pas en mesure d'activer l'adaptateur Bluetooth</translation> <translation id="5860491529813859533">Activer</translation> -<translation id="6092062101542170135">Pour continuer, activez la NFC dans les paramètres d'Android</translation> +<translation id="6092062101542170135">Pour continuer, activez la CCP dans les paramètres d'Android</translation> <translation id="6393863479814692971">Google Chrome a besoin de votre autorisation pour accéder à votre caméra et à votre micro pour ce site.</translation> <translation id="6656545060687952787">Google Chrome nécessite l'accès à votre position pour rechercher des appareils. <ph name="BEGIN_LINK" />Mettre les autorisations à jour<ph name="END_LINK" /></translation> <translation id="6697947395630195233">Chrome a besoin d'accéder à votre position afin de la partager avec ce site.</translation>
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc b/components/permissions/bluetooth_chooser_desktop.cc similarity index 71% rename from chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc rename to components/permissions/bluetooth_chooser_desktop.cc index df3284925..33be9f2f 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc +++ b/components/permissions/bluetooth_chooser_desktop.cc
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h" +#include "components/permissions/bluetooth_chooser_desktop.h" -#include "base/check.h" -#include "chrome/browser/ui/bluetooth/chrome_bluetooth_chooser_controller.h" -#include "chrome/browser/ui/browser_dialogs.h" +#include "components/permissions/bluetooth_chooser_controller.h" + +namespace permissions { BluetoothChooserDesktop::BluetoothChooserDesktop( - content::RenderFrameHost* frame, - const content::BluetoothChooser::EventHandler& event_handler) { - auto controller = - std::make_unique<ChromeBluetoothChooserController>(frame, event_handler); + std::unique_ptr<permissions::BluetoothChooserController> controller, + base::OnceCallback< + base::OnceClosure(std::unique_ptr<permissions::ChooserController>)> + show_dialog_callback) { bluetooth_chooser_controller_ = controller->GetWeakPtr(); - close_closure_ = - chrome::ShowDeviceChooserDialog(frame, std::move(controller)); + close_closure_runner_.ReplaceClosure( + std::move(show_dialog_callback).Run(std::move(controller))); } BluetoothChooserDesktop::~BluetoothChooserDesktop() { @@ -24,8 +24,6 @@ // instance. if (bluetooth_chooser_controller_) bluetooth_chooser_controller_->ResetEventHandler(); - if (close_closure_) - std::move(close_closure_).Run(); } void BluetoothChooserDesktop::SetAdapterPresence(AdapterPresence presence) { @@ -51,3 +49,5 @@ is_paired, signal_strength_level); } } + +} // namespace permissions
diff --git a/components/permissions/bluetooth_chooser_desktop.h b/components/permissions/bluetooth_chooser_desktop.h new file mode 100644 index 0000000..e2ad5909 --- /dev/null +++ b/components/permissions/bluetooth_chooser_desktop.h
@@ -0,0 +1,57 @@ +// Copyright 2015 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_PERMISSIONS_BLUETOOTH_CHOOSER_DESKTOP_H_ +#define COMPONENTS_PERMISSIONS_BLUETOOTH_CHOOSER_DESKTOP_H_ + +#include "base/callback_helpers.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/bluetooth_chooser.h" + +namespace permissions { + +class BluetoothChooserController; +class ChooserController; + +// Represents a Bluetooth chooser to ask the user to select a Bluetooth +// device from a list of options. This implementation is for desktop. +// BluetoothChooserAndroid implements the mobile part. +class BluetoothChooserDesktop : public content::BluetoothChooser { + public: + // The OnceClosure returned by |show_dialog_callback| can be invoked to close + // the dialog. It should be a no-op to invoke the closure if the dialog has + // already been closed by the user. + BluetoothChooserDesktop( + std::unique_ptr<permissions::BluetoothChooserController> controller, + base::OnceCallback< + base::OnceClosure(std::unique_ptr<permissions::ChooserController>)> + show_dialog_callback); + + BluetoothChooserDesktop(const BluetoothChooserDesktop&) = delete; + BluetoothChooserDesktop& operator=(const BluetoothChooserDesktop&) = delete; + + ~BluetoothChooserDesktop() override; + + // BluetoothChooser: + void SetAdapterPresence(AdapterPresence presence) override; + void ShowDiscoveryState(DiscoveryState state) override; + void AddOrUpdateDevice(const std::string& device_id, + bool should_update_name, + const std::u16string& device_name, + bool is_gatt_connected, + bool is_paired, + int signal_strength_level) override; + + private: + // DeviceChooserContentView owns the controller. + base::WeakPtr<BluetoothChooserController> bluetooth_chooser_controller_; + + // Closes the displayed UI if it is still open. Used to ensure the bubble + // closes if this controller is torn down. + base::ScopedClosureRunner close_closure_runner_; +}; + +} // namespace permissions + +#endif // COMPONENTS_PERMISSIONS_BLUETOOTH_CHOOSER_DESKTOP_H_
diff --git a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.cc b/components/permissions/bluetooth_scanning_prompt_desktop.cc similarity index 68% rename from chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.cc rename to components/permissions/bluetooth_scanning_prompt_desktop.cc index f796d56..378c3c9 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.cc +++ b/components/permissions/bluetooth_scanning_prompt_desktop.cc
@@ -2,24 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_desktop.h" +#include "components/permissions/bluetooth_scanning_prompt_desktop.h" -#include "chrome/browser/chooser_controller/title_util.h" -#include "chrome/browser/ui/browser_dialogs.h" #include "components/permissions/bluetooth_scanning_prompt_controller.h" -#include "components/strings/grit/components_strings.h" + +namespace permissions { BluetoothScanningPromptDesktop::BluetoothScanningPromptDesktop( content::RenderFrameHost* frame, - const content::BluetoothScanningPrompt::EventHandler& event_handler) { + const content::BluetoothScanningPrompt::EventHandler& event_handler, + std::u16string title, + base::OnceCallback< + base::OnceClosure(std::unique_ptr<permissions::ChooserController>)> + show_dialog_callback) { auto controller = std::make_unique<permissions::BluetoothScanningPromptController>( - frame, event_handler, - CreateChooserTitle(frame, IDS_BLUETOOTH_SCANNING_PROMPT_ORIGIN, - IDS_BLUETOOTH_SCANNING_PROMPT_ORIGIN)); + frame, event_handler, title); bluetooth_scanning_prompt_controller_ = controller->GetWeakPtr(); - close_closure_ = - chrome::ShowDeviceChooserDialog(frame, std::move(controller)); + close_closure_runner_.ReplaceClosure( + std::move(show_dialog_callback).Run(std::move(controller))); } BluetoothScanningPromptDesktop::~BluetoothScanningPromptDesktop() { @@ -28,8 +29,6 @@ // BluetoothScanningPrompt instance. if (bluetooth_scanning_prompt_controller_) bluetooth_scanning_prompt_controller_->ResetEventHandler(); - if (close_closure_) - std::move(close_closure_).Run(); } void BluetoothScanningPromptDesktop::AddOrUpdateDevice( @@ -41,3 +40,5 @@ device_id, should_update_name, device_name); } } + +} // namespace permissions
diff --git a/components/permissions/bluetooth_scanning_prompt_desktop.h b/components/permissions/bluetooth_scanning_prompt_desktop.h new file mode 100644 index 0000000..365b4144 --- /dev/null +++ b/components/permissions/bluetooth_scanning_prompt_desktop.h
@@ -0,0 +1,63 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PERMISSIONS_BLUETOOTH_SCANNING_PROMPT_DESKTOP_H_ +#define COMPONENTS_PERMISSIONS_BLUETOOTH_SCANNING_PROMPT_DESKTOP_H_ + +#include <string> + +#include "base/callback_helpers.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/bluetooth_scanning_prompt.h" + +namespace content { +class RenderFrameHost; +} // namespace content + +namespace permissions { + +class BluetoothScanningPromptController; +class ChooserController; + +// Represents a Bluetooth scanning prompt to ask the user permission to +// allow a site to receive Bluetooth advertisement packets from Bluetooth +// devices. This implementation is for desktop. +class BluetoothScanningPromptDesktop : public content::BluetoothScanningPrompt { + public: + // The OnceClosure returned by |show_dialog_callback| can be invoked to close + // the dialog. It should be a no-op to invoke the closure if the dialog has + // already been closed by the user. + BluetoothScanningPromptDesktop( + content::RenderFrameHost* frame, + const content::BluetoothScanningPrompt::EventHandler& event_handler, + std::u16string title, + base::OnceCallback< + base::OnceClosure(std::unique_ptr<permissions::ChooserController>)> + show_dialog_callback); + + BluetoothScanningPromptDesktop(const BluetoothScanningPromptDesktop&) = + delete; + BluetoothScanningPromptDesktop& operator=( + const BluetoothScanningPromptDesktop&) = delete; + + ~BluetoothScanningPromptDesktop() override; + + // content::BluetoothScanningPrompt: + void AddOrUpdateDevice(const std::string& device_id, + bool should_update_name, + const std::u16string& device_name) override; + + private: + // DeviceChooserContentView owns the controller. + base::WeakPtr<BluetoothScanningPromptController> + bluetooth_scanning_prompt_controller_; + + // Closes the displayed UI, if there is one. This is used to ensure the UI + // closes if this controller is destroyed. + base::ScopedClosureRunner close_closure_runner_; +}; + +} // namespace permissions + +#endif // COMPONENTS_PERMISSIONS_BLUETOOTH_SCANNING_PROMPT_DESKTOP_H_
diff --git a/components/permissions/chooser_title_util.cc b/components/permissions/chooser_title_util.cc new file mode 100644 index 0000000..fdce3bc --- /dev/null +++ b/components/permissions/chooser_title_util.cc
@@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/permissions/chooser_title_util.h" + +#include "components/url_formatter/elide_url.h" +#include "content/public/browser/render_frame_host.h" +#include "ui/base/l10n/l10n_util.h" +#include "url/origin.h" + +namespace permissions { + +std::u16string CreateChooserTitle(content::RenderFrameHost* render_frame_host, + int title_string_id_origin) { + if (!render_frame_host) + return u""; + + return l10n_util::GetStringFUTF16( + title_string_id_origin, + url_formatter::FormatOriginForSecurityDisplay( + render_frame_host->GetLastCommittedOrigin(), + url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC)); +} + +} // namespace permissions
diff --git a/components/permissions/chooser_title_util.h b/components/permissions/chooser_title_util.h new file mode 100644 index 0000000..2ec03424 --- /dev/null +++ b/components/permissions/chooser_title_util.h
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PERMISSIONS_CHOOSER_TITLE_UTIL_H_ +#define COMPONENTS_PERMISSIONS_CHOOSER_TITLE_UTIL_H_ + +#include <string> + +namespace content { +class RenderFrameHost; +} + +namespace permissions { + +// Creates a title for a chooser using the origin of the frame. Returns the +// empty string if |render_frame_host| is null. +std::u16string CreateChooserTitle(content::RenderFrameHost* render_frame_host, + int title_string_id_origin); + +} // namespace permissions + +#endif // COMPONENTS_PERMISSIONS_CHOOSER_TITLE_UTIL_H_
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc index 25e1a29..bec58c7 100644 --- a/components/permissions/permission_manager.cc +++ b/components/permissions/permission_manager.cc
@@ -9,6 +9,8 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/feature_list.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -606,6 +608,9 @@ if (!subscription) return; + if (is_processing_permission_change_) + base::debug::DumpWithoutCrashing(); + ContentSettingsType type = subscription->permission; subscriptions_.Remove(subscription_id); auto type_count = subscription_type_counts_.find(type); @@ -631,7 +636,9 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); std::vector<base::OnceClosure> callbacks; callbacks.reserve(subscriptions_.size()); - + base::AutoReset<bool> reset(&is_processing_permission_change_, true); + SCOPED_CRASH_KEY_NUMBER("PermissionManager", "content_type", + static_cast<int>(content_type)); for (SubscriptionsMap::iterator iter(&subscriptions_); !iter.IsAtEnd(); iter.Advance()) { Subscription* subscription = iter.GetCurrentValue();
diff --git a/components/permissions/permission_manager.h b/components/permissions/permission_manager.h index 590c8f4..7c5db7c 100644 --- a/components/permissions/permission_manager.h +++ b/components/permissions/permission_manager.h
@@ -221,6 +221,9 @@ bool is_shutting_down_ = false; + // This is false when not processing a permission change and true otherwise + bool is_processing_permission_change_ = false; + DISALLOW_COPY_AND_ASSIGN(PermissionManager); };
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc index c0cde12..7964fb0 100644 --- a/components/policy/core/browser/configuration_policy_handler.cc +++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -634,7 +634,7 @@ LegacyPoliciesDeprecatingPolicyHandler::LegacyPoliciesDeprecatingPolicyHandler( std::vector<std::unique_ptr<ConfigurationPolicyHandler>> legacy_policy_handlers, - std::unique_ptr<SchemaValidatingPolicyHandler> new_policy_handler) + std::unique_ptr<NamedPolicyHandler> new_policy_handler) : legacy_policy_handlers_(std::move(legacy_policy_handlers)), new_policy_handler_(std::move(new_policy_handler)) {} @@ -693,11 +693,14 @@ bool SimpleDeprecatingPolicyHandler::CheckPolicySettings( const PolicyMap& policies, PolicyErrorMap* errors) { - // TODO(crbug/1102492): When the legacy policy value is ignored, do you think - // it's a good idea to add the "Ignore" error to it: IDS_POLICY_LABEL_IGNORED - // && IDS_POLICY_OVERRIDDEN. - if (policies.Get(new_policy_handler_->policy_name())) + if (policies.Get(new_policy_handler_->policy_name())) { + if (policies.Get(legacy_policy_handler_->policy_name())) { + errors->AddError(legacy_policy_handler_->policy_name(), + IDS_POLICY_OVERRIDDEN, + new_policy_handler_->policy_name()); + } return new_policy_handler_->CheckPolicySettings(policies, errors); + } // The new policy is not set, fall back to legacy ones. return legacy_policy_handler_->CheckPolicySettings(policies, errors);
diff --git a/components/policy/core/browser/configuration_policy_handler.h b/components/policy/core/browser/configuration_policy_handler.h index 87c33e3..60b2c5f 100644 --- a/components/policy/core/browser/configuration_policy_handler.h +++ b/components/policy/core/browser/configuration_policy_handler.h
@@ -454,7 +454,7 @@ LegacyPoliciesDeprecatingPolicyHandler( std::vector<std::unique_ptr<ConfigurationPolicyHandler>> legacy_policy_handlers, - std::unique_ptr<SchemaValidatingPolicyHandler> new_policy_handler); + std::unique_ptr<NamedPolicyHandler> new_policy_handler); ~LegacyPoliciesDeprecatingPolicyHandler() override; // ConfigurationPolicyHandler: @@ -472,7 +472,7 @@ private: std::vector<std::unique_ptr<ConfigurationPolicyHandler>> legacy_policy_handlers_; - std::unique_ptr<SchemaValidatingPolicyHandler> new_policy_handler_; + std::unique_ptr<NamedPolicyHandler> new_policy_handler_; DISALLOW_COPY_AND_ASSIGN(LegacyPoliciesDeprecatingPolicyHandler); };
diff --git a/components/policy/core/browser/configuration_policy_handler_unittest.cc b/components/policy/core/browser/configuration_policy_handler_unittest.cc index a1be9a1..a481e7a 100644 --- a/components/policy/core/browser/configuration_policy_handler_unittest.cc +++ b/components/policy/core/browser/configuration_policy_handler_unittest.cc
@@ -1070,7 +1070,7 @@ POLICY_SOURCE_CLOUD, base::Value(1337), nullptr); errors.Clear(); EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors)); - EXPECT_TRUE(errors.empty()); + EXPECT_FALSE(errors.empty()); prefs.Clear(); handler.ApplyPolicySettingsWithParameters(policy_map, params, &prefs); expected = std::make_unique<base::Value>(1337);
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 451ee5b..0865562 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -550,6 +550,27 @@ Wenn die Richtlinie nicht konfiguriert ist, schlägt die Installation von <ph name="PLUGIN_VM_NAME" /> fehl, wenn weniger als 20 GB (Standardwert) freier Speicherplatz auf dem Gerät verfügbar sind. Wenn die Richtlinie konfiguriert ist, schlägt die Installation von <ph name="PLUGIN_VM_NAME" /> fehl, wenn der freie Speicherplatz auf dem Gerät nicht dem in der Richtlinie angegebenen Mindestwert entspricht.</translation> <translation id="1690383938831887552">Verhindern, dass Signed HTTP Exchanges geladen werden</translation> +<translation id="1700458869527146675">Durch Festlegen der Richtlinie werden die Proxyeinstellungen für Chrome- und ARC-Apps so konfiguriert, dass alle Proxyoptionen, die über die Befehlszeile eingegeben werden, ignoriert werden. + + Wird die Richtlinie nicht konfiguriert, können Nutzer die Proxyeinstellungen auswählen. + + Durch Festlegen der Richtlinie „<ph name="PROXY_SETTINGS_POLICY_NAME" />“ werden die folgenden Felder übernommen: +* „<ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />“ legt fest, welcher Proxyserver von Chrome verwendet werden soll, und verhindert, dass Nutzer die Proxyeinstellungen ändern +* „<ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />“, eine URL zu einer PAC-Proxydatei +* „<ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />“ verhindert, dass der Netzwerkstapel zurück zu direkten Verbindungen mit ungültigem oder nicht verfügbarem PAC-Skript fällt +* „<ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />“, eine URL des Proxyservers +* „<ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />“, eine Liste mit Hosts, für die der Proxy umgangen wird + +Das Feld „<ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" />“ wurde zugunsten des Felds „<ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />“ eingestellt. + + Für „<ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />“ können folgende Werte festgelegt werden: + * <ph name="PROXY_MODE_ENUM_DIRECT" /> – kein Proxy wird verwendet und alle anderen Felder werden ignoriert. + * <ph name="PROXY_MODE_ENUM_SYSTEM" /> – der Proxy des Systems wird verwendet und alle anderen Felder werden ignoriert. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> – alle anderen Felder werden ignoriert. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> – die Felder „<ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />“ und „<ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />“ werden verwendet. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> – die Felder „<ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />“, „<ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />“ und „<ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />“ werden verwendet. + + Hinweis: Ausführliche Beispiele finden Sie in den Chromium-Projekten unter https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation> <translation id="1700811900332333712">Powerwash-Anfrage durch Gerät zulassen</translation> <translation id="1708496595873025510">Beschränkung für Abruf des Varianten-Seeds festlegen</translation> <translation id="1713829924716792485">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, können Nutzer, die mit einem Host für den Remotezugriff verbunden sind, Dateien zwischen Client und Host übertragen. Verbindungen zur Remote-Unterstützung sind hiervon ausgenommen, da sie keine Dateiübertragung unterstützen. @@ -573,6 +594,11 @@ Wird diese Richtlinie nicht festgelegt, hat dies keine Auswirkungen auf die Steuerung des Bildschirms durch den Nutzer und auf die Funktionen zur automatischen Anpassung der Bildschirmhelligkeit. Hinweis: Die Richtlinienwerte sollten in % angegeben werden und zwischen 0 und 100 liegen.</translation> +<translation id="1733939382419067578">Wenn diese Richtlinie konfiguriert ist, können Sie eine Liste mit URL-Mustern erstellen, die angeben, welche Websites Benachrichtigungen anzeigen dürfen. + + Wenn die Richtlinie nicht konfiguriert ist, gilt „<ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" />“ für alle Websites, sofern konfiguriert. Falls nicht, wird die persönliche Einstellung des Nutzers verwendet. + + Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> ist kein akzeptierter Wert für diese Richtlinie.</translation> <translation id="1736269219679256369">Fortfahren von SSL-Hinweisseite erlauben</translation> <translation id="173993509627303617">Webanwendungen, die erzwungen installiert wurden, daran hindern, Geräteattribute anzufragen.</translation> <translation id="174765717426930019">Allen mit dem Ziel <ph name="BLANK_PAGE_NAME" /> geöffneten Pop-ups erlauben, mit der Seite zu interagieren, die das Pop-up geöffnet hat, es sei denn, die öffnende Seite hat dieser Art von Interaktion ausdrücklich nicht zugestimmt </translation> @@ -2435,6 +2461,11 @@ <translation id="4043796890723386527">Diese Einstellung hindert Nutzer daran, sekundäre Profile zu erstellen oder zu verwenden und den Gastmodus im <ph name="LACROS_NAME" />-Browser zu verwenden</translation> <translation id="4051723201852944592">Fenster-Okklusion aktivieren</translation> <translation id="4056910949759281379">SPDY-Protokoll deaktivieren</translation> +<translation id="4061107397839125009">Wenn diese Richtlinie konfiguriert ist, können Sie eine Liste mit URL-Mustern erstellen, die angeben, welche Websites keine Benachrichtigungen anzeigen dürfen. + + Wenn die Richtlinie nicht konfiguriert ist, gilt „<ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" />“ für alle Websites, sofern konfiguriert. Falls nicht, wird die persönliche Einstellung des Nutzers verwendet. + + Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> ist kein akzeptierter Wert für diese Richtlinie.</translation> <translation id="4061590579642538878">Informationen über Absturzberichte melden.</translation> <translation id="4075675819066819571">Ablage auf der linken Seite des Bildschirms anzeigen</translation> <translation id="408029843066770167">Abfragen an einen Google-Dienst für die Zeiteinstellung zulassen</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 483dae6..0d50a2d 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -556,6 +556,27 @@ Si no estableces esta política, fallará la instalación de <ph name="PLUGIN_VM_NAME" /> cuando el espacio libre en disco disponible en el dispositivo sea inferior a 20 GB (valor predeterminado). Si la estableces, fallará la instalación de <ph name="PLUGIN_VM_NAME" /> cuando el espacio libre en disco disponible en el dispositivo sea inferior al espacio que requiere la política.</translation> <translation id="1690383938831887552">No permitir que se carguen los intercambios HTTP firmados</translation> +<translation id="1700458869527146675">Si estableces la política, se especificará la configuración del proxy para Chrome y las apps de ARC, por lo que se ignorarán todas las opciones relacionadas con el proxy que se especificaron en la línea de comandos. + + Si no la estableces, los usuarios podrán elegir su configuración de proxy. + + Si estableces la política <ph name="PROXY_SETTINGS_POLICY_NAME" />, se aceptarán los siguientes campos: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> (podrás especificar el servidor proxy que usa Chrome y evitar que los usuarios cambien la configuración del proxy) + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" /> (una dirección URL a un archivo de proxy en formato .pac) + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> (evita que la pila de red recurra a conexiones directas con una secuencia de comandos PAC no válida o no disponible) + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> (URL del servidor proxy) + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> (lista de hosts que determinarán que se evite el proxy) + + El campo <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> está obsoleto y ha sido sustituido por el campo <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Para <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, puedes elegir alguno de los valores siguientes: + * <ph name="PROXY_MODE_ENUM_DIRECT" />: no se usará nunca un proxy y se ignorará el resto de los campos. + * <ph name="PROXY_MODE_ENUM_SYSTEM" />: se usará el proxy del sistema y se ignorará el resto de los campos. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />: se ignorará el resto de los campos. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: se usarán los campos <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> y <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: se usarán los campos <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> y <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + + Nota: Para obtener más ejemplos detallados, visita The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> <translation id="1700811900332333712">Permite que el dispositivo solicite Powerwash</translation> <translation id="1708496595873025510">Establece la restricción en la obtención del valor de inicialización de las variaciones.</translation> <translation id="1713829924716792485">Si habilitas la política o no la estableces, los usuarios conectados con un host de acceso remoto podrán transferir archivos entre el cliente y el host. Esta acción no se aplicará a las conexiones de asistencia remota, las cuales no admiten la transferencia de archivos. @@ -579,6 +600,11 @@ Si no estableces la política, no se verán afectados los controles de la pantalla ni las funciones de brillo automático. Nota: Los valores de la política deben especificarse en porcentajes del 0 al 100.</translation> +<translation id="1733939382419067578">Si estableces la política, podrás especificar una lista de patrones de URL que indiquen los sitios que pueden mostrar notificaciones. + + Si no estableces la política, se aplicará <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> para todos los sitios, en caso de haberse establecido. De lo contrario se aplicará la configuración personal del usuario. + + Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política.</translation> <translation id="1736269219679256369">Permitir continuar desde la página de advertencia de SSL</translation> <translation id="173993509627303617">Impedir que las aplicaciones web instaladas de manera automática busquen atributos de dispositivos</translation> <translation id="174765717426930019">Permitir que se abran todas ventanas emergentes destinadas a <ph name="BLANK_PAGE_NAME" /> para interactuar con la página que abrió la ventana emergente, a menos que esta página inhabilite esta interacción de forma explícita </translation> @@ -2455,6 +2481,11 @@ <translation id="4043796890723386527">Impedir que los usuarios creen o utilicen perfiles secundarios o usen el modo de invitado en el navegador <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">Habilita la oclusión de ventanas</translation> <translation id="4056910949759281379">Inhabilitar el protocolo SPDY</translation> +<translation id="4061107397839125009">Si estableces la política, podrás especificar una lista de patrones de URL que indiquen los sitios que no pueden mostrar notificaciones. + + Si no estableces la política, se aplicará <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> para todos los sitios, en caso de haberse establecido. De lo contrario se aplicará la configuración personal del usuario. + + Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política.</translation> <translation id="4061590579642538878">Proporciona datos sobre los informes de fallas</translation> <translation id="4075675819066819571">Ubicar la biblioteca en el lado izquierdo de la pantalla</translation> <translation id="408029843066770167">Permitir consultas a un servicio de hora de Google</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index f15aabfad..e3d1296 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -555,6 +555,27 @@ Si no se asigna ningún valor a esta política, la instalación de <ph name="PLUGIN_VM_NAME" /> fallará si el dispositivo tiene menos de 20 GB (valor predeterminado) de espacio disponible en disco. Si se le asigna un valor, la instalación de <ph name="PLUGIN_VM_NAME" /> fallará si el dispositivo tiene menos espacio disponible en disco del requerido por la política.</translation> <translation id="1690383938831887552">Evitar que se cargue contenido Signed HTTP Exchange</translation> +<translation id="1700458869527146675">Si se establece la política, se definirá la configuración de proxy aplicable a Chrome y a las aplicaciones ARC, que ignoran todas las opciones relacionadas con el proxy especificadas en la línea de comandos. + + Si no se establece la política, los usuarios podrán elegir su configuración de proxy. + + Si se establece la política <ph name="PROXY_SETTINGS_POLICY_NAME" />, se aceptarán los siguientes campos: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />: permite especificar el servidor proxy que usará Chrome, e impide que los usuarios puedan cambiar la configuración del proxy. + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />: URL a un archivo .pac de proxy. + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />: evita que la pila de red recurra a conexiones directas con una secuencia de comandos PAC no válida o no disponible. + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />: URL del servidor proxy. + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />: lista de hosts que determinarán que se evite el proxy. + + El campo <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> está obsoleto y ha sido sustituido por el campo <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + En el campo <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, si eliges el valor: + * <ph name="PROXY_MODE_ENUM_DIRECT" />: nunca se usará un proxy y se ignorarán los demás campos. + * <ph name="PROXY_MODE_ENUM_SYSTEM" />: se usará el proxy del sistema y se ignorarán los demás campos. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />: se ignorarán los demás campos. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: se usarán los campos <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> y <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: se usarán los campos <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> y <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + + Nota: Puedes consultar ejemplos más detallados en The Chromium Projects: https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation> <translation id="1700811900332333712">Permite el uso de Powerwash en el dispositivo</translation> <translation id="1708496595873025510">Establecer restricción en obtención de base de variaciones</translation> <translation id="1713829924716792485">Si se habilita esta política o no se le asigna ningún valor, los usuarios conectados a un host de acceso remoto podrán transferir archivos entre el cliente y el host. Esto no se aplica a las conexiones de asistencia remota, ya que no admiten la transferencia de archivos. @@ -578,6 +599,11 @@ Si no se configura esta política, las funciones de brillo automático y los controles de pantalla del usuario no se ven afectados. Nota: Los valores que se asignen a esta política deben ser porcentajes de 0 a 100.</translation> +<translation id="1733939382419067578">Si se establece la política, podrás definir una lista de patrones de URL donde se especifique qué sitios pueden mostrar notificaciones. + + Si no se establece la política, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> se aplicará a todos los sitios, si se ha definido. Si no, se aplicará la configuración personal del usuario. + + Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Esta política no acepta el valor <ph name="WILDCARD_VALUE" />.</translation> <translation id="1736269219679256369">Permitir que se continúe desde la página de advertencia de SSL</translation> <translation id="173993509627303617">Evita que las aplicaciones web instaladas forzadamente consulten los atributos del dispositivo.</translation> <translation id="174765717426930019">Permitir que todas las ventanas emergentes abiertas con <ph name="BLANK_PAGE_NAME" /> como objetivo interactúen con la página que ha solicitado abrir la ventana emergente a no ser que esa página haya rechazado explícitamente dicha interacción </translation> @@ -2469,6 +2495,11 @@ <translation id="4043796890723386527">Evita que los usuarios creen y utilicen perfiles secundarios, y que usen el modo invitados en el navegador <ph name="LACROS_NAME" />.</translation> <translation id="4051723201852944592">Habilitar la oclusión de ventana</translation> <translation id="4056910949759281379">Inhabilitar protocolo SPDY</translation> +<translation id="4061107397839125009">Si se establece la política, podrás definir una lista de patrones de URL donde se especifique qué sitios no pueden mostrar notificaciones. + + Si no se establece la política, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> se aplicará a todos los sitios, si se ha definido. Si no, se aplicará la configuración personal del usuario. + + Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Esta política no acepta el valor <ph name="WILDCARD_VALUE" />.</translation> <translation id="4061590579642538878">Proporcionar información de informes sobre fallos</translation> <translation id="4075675819066819571">Colocar la estantería en la parte izquierda de la pantalla</translation> <translation id="408029843066770167">Permitir consultas a un servicio de hora de Google</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 36e7603..0cb5f0d 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -555,6 +555,27 @@ Jika kebijakan ini tidak disetel, penginstalan <ph name="PLUGIN_VM_NAME" /> akan gagal jika ruang disk kosong yang tersedia di perangkat kurang dari 20 GB (nilai default). Jika kebijakan ini disetel, penginstalan <ph name="PLUGIN_VM_NAME" /> akan gagal jika ruang disk kosong yang tersedia di perangkat kurang dari yang ditentukan oleh kebijakan.</translation> <translation id="1690383938831887552">Cegah pemuatan Signed HTTP Exchange</translation> +<translation id="1700458869527146675">Menyetel kebijakan akan mengonfigurasi setelan proxy untuk Chrome dan aplikasi ARC, yang mengabaikan semua opsi terkait proxy yang ditentukan dari command line. + + Jika kebijakan tidak disetel, pengguna dapat memilih setelan proxy mereka. + + Menyetel kebijakan <ph name="PROXY_SETTINGS_POLICY_NAME" /> akan menyetujui kolom berikut: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, yang memungkinkan Anda menentukan server proxy yang digunakan oleh Chrome dan mencegah pengguna mengubah setelan proxy + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />, URL ke file .pac proxy + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, yang mencegah stack jaringan kembali ke koneksi langsung dengan skrip PAC yang tidak valid atau tidak tersedia + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />, URL server proxy + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />, daftar host proxy yang diabaikan + + Kolom <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> tidak digunakan lagi dan digantikan dengan kolom <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Untuk <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, jika Anda memilih nilai: + * <ph name="PROXY_MODE_ENUM_DIRECT" />, proxy tidak akan pernah digunakan dan semua kolom lainnya akan diabaikan. + * <ph name="PROXY_MODE_ENUM_SYSTEM" />, proxy sistem akan digunakan dan semua kolom lainnya akan diabaikan. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />, semua kolom lainnya akan diabaikan. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />, kolom <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> dan <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> akan digunakan. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, kolom <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, dan <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> akan digunakan. + + Catatan: Untuk contoh yang lebih mendetail, buka Project Chromium ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> <translation id="1700811900332333712">Izinkan perangkat untuk meminta powerwash</translation> <translation id="1708496595873025510">Setel batasan pada pengambilan bibit Varietas</translation> <translation id="1713829924716792485">Jika kebijakan disetel ke Aktif atau tidak disetel, pengguna yang terhubung ke host akses jarak jauh akan diizinkan untuk mentransfer file antara klien dan host. Ini tidak berlaku untuk koneksi bantuan jarak jauh, yang tidak mendukung transfer file. @@ -578,6 +599,11 @@ Tidak menyetel kebijakan tidak akan memengaruhi kontrol layar pengguna atau fitur kecerahan otomatis. Catatan: Nilai kebijakan harus ditentukan dalam persen dari 0 sampai 100.</translation> +<translation id="1733939382419067578">Menyetel kebijakan memungkinkan Anda menetapkan daftar pola URL yang menentukan situs yang dapat menampilkan notifikasi. + + Tidak menyetel kebijakan berarti <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. + + Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="1736269219679256369">Memungkinkan melanjutkan dari halaman peringatan SSL</translation> <translation id="173993509627303617">Cegah aplikasi web yang diinstal otomatis mengkueri atribut perangkat.</translation> <translation id="174765717426930019">Izinkan semua pop-up yang dibuka dengan target <ph name="BLANK_PAGE_NAME" /> untuk berinteraksi dengan halaman yang meminta membuka pop-up, kecuali jika halaman pembuka secara eksplisit memilih untuk melarang interaksi tersebut </translation> @@ -2469,6 +2495,11 @@ <translation id="4043796890723386527">Cegah pengguna membuat dan menggunakan profil sekunder serta menggunakan mode tamu di browser <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">Mengaktifkan Penghalangan Jendela</translation> <translation id="4056910949759281379">Nonaktifkan protokol SPDY</translation> +<translation id="4061107397839125009">Menyetel kebijakan memungkinkan Anda menetapkan daftar pola URL yang menentukan situs yang tidak dapat menampilkan notifikasi. + + Tidak menyetel kebijakan berarti <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. + + Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="4061590579642538878">Laporkan informasi tentang laporan kerusakan.</translation> <translation id="4075675819066819571">Posisikan rak di sisi kiri layar</translation> <translation id="408029843066770167">Izinkan kueri ke layanan waktu Google</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 35cd26d..0b188f5 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -552,6 +552,27 @@ Se il criterio non viene configurato, l'installazione di <ph name="PLUGIN_VM_NAME" /> non va a buon fine se lo spazio libero disponibile sul dispositivo è inferiore a 20 GB (valore predefinito). Se il criterio è impostato, l'installazione di <ph name="PLUGIN_VM_NAME" /> non va a buon fine se lo spazio libero disponibile sul dispositivo è inferiore a quello richiesto dal criterio.</translation> <translation id="1690383938831887552">Impedisci il caricamento di scambi Signed HTTP Exchange</translation> +<translation id="1700458869527146675">L'impostazione del criterio consente di configurare le impostazioni del proxy per Chrome e le app ARC, ignorando tutte le opzioni relative al proxy specificate dalla riga di comando. + + Se il criterio non viene configurato, gli utenti possono scegliere le impostazioni del proxy. + + L'impostazione del criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> consente di accettare i seguenti campi: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, che consente di specificare il server proxy utilizzato da Chrome e impedisce agli utenti di modificare le impostazioni del proxy + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />, un URL a un file proxy .pac + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, che impedisce allo stack di rete di utilizzare connessioni dirette con uno script PAC non valido o non disponibile + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />, un URL del server proxy + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />, un elenco di host per i quali verrà bypassato il proxy + + Il campo <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> è deprecato a favore del campo <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Per il campo <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, se scegli il valore: + * <ph name="PROXY_MODE_ENUM_DIRECT" />, non viene mai utilizzato un proxy e tutti gli altri campi vengono ignorati. + * <ph name="PROXY_MODE_ENUM_SYSTEM" />, viene utilizzato il proxy del sistema e tutti gli altri campi vengono ignorati. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />, tutti gli altri campi vengono ignorati. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />, vengono utilizzati i campi <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> e <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, vengono utilizzati i campi <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> e <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + + Nota: per esempi più dettagliati, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation> <translation id="1700811900332333712">Consenti al dispositivo di richiedere il powerwash</translation> <translation id="1708496595873025510">Imposta la limitazione sul recupero del numero di inizializzazione delle varianti</translation> <translation id="1713829924716792485">Se il criterio viene impostato su Attivato o se non viene configurato, gli utenti connessi a un host di accesso remoto possono trasferire file dal client all'host e viceversa. Questo criterio non si applica alle connessioni di assistenza remota, che non supportano il trasferimento di file. @@ -575,6 +596,11 @@ Se il criterio non viene configurato, i controlli o le funzionalità di luminosità automatica dello schermo dell'utente rimangono invariati. Nota: i valori del criterio devono essere specificati in percentuali da 0 a 100.</translation> +<translation id="1733939382419067578">La configurazione del criterio consente di impostare un elenco di pattern URL che specificano i siti che possono mostrare notifiche. + + Se il criterio non viene configurato, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente. + + Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation> <translation id="1736269219679256369">Consenti di proseguire dalla pagina di avviso SSL</translation> <translation id="173993509627303617">Le applicazioni web con installazione forzata non possono richiedere gli attributi dei dispositivi.</translation> <translation id="174765717426930019">Consenti a tutti i popup aperti con una destinazione <ph name="BLANK_PAGE_NAME" /> di interagire con la pagina che ha richiesto l'apertura del popup se la pagina di apertura non disattiva esplicitamente tale interazione </translation> @@ -2442,6 +2468,11 @@ <translation id="4043796890723386527">Impedisci agli utenti di creare e usare profili secondari e di utilizzare la modalità ospite nel browser <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">Attiva Copertura finestra</translation> <translation id="4056910949759281379">Disabilita protocollo SPDY</translation> +<translation id="4061107397839125009">La configurazione del criterio consente di impostare un elenco di pattern URL che specificano i siti che non possono mostrare notifiche. + + Se il criterio non viene configurato, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente. + + Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation> <translation id="4061590579642538878">Segnala informazioni relative ai rapporti sugli arresti anomali.</translation> <translation id="4075675819066819571">Posiziona la barra delle app sul lato sinistro dello schermo</translation> <translation id="408029843066770167">Consenti query a un servizio orario di Google</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 7eba7e3..4c6496ea 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -544,6 +544,27 @@ このポリシーを未設定のままにした場合、デバイスで使用できるディスクの空き容量が 20 GB(デフォルト値)未満のときに <ph name="PLUGIN_VM_NAME" /> のインストールが失敗します。 このポリシーを設定した場合、デバイスで使用できるディスクの空き容量がポリシーで要求される値未満のときに <ph name="PLUGIN_VM_NAME" /> のインストールが失敗します。</translation> <translation id="1690383938831887552">Signed HTTP Exchange の読み込みを許可しない</translation> +<translation id="1700458869527146675">このポリシーでは、Chrome と ARC アプリのプロキシ設定を行います。いずれもコマンドラインで指定されたプロキシ関連の設定はすべて無視されます。 + + このポリシーを未設定のままにした場合、ユーザーはプロキシ設定を選択できます。 + + <ph name="PROXY_SETTINGS_POLICY_NAME" /> ポリシーを設定すると、次のフィールドを受け取れるようになります。 + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />: Chrome で使用するプロキシ サーバーを指定して、ユーザーがプロキシ設定を変更できないようにします + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />: プロキシ .pac ファイルへの URL + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />: ネットワーク スタックが無効または使用できない PAC スクリプトを使用して直接接続にフォールバックできないようにします。 + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />: プロキシ サーバーの URL + *<ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />: プロキシを使用しないホストのリスト + + <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> フィールドは非推奨となりました。代わりに <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> フィールドを使用してください。 + + <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> については、以下のいずれかの値を指定します。 + * <ph name="PROXY_MODE_ENUM_DIRECT" />: プロキシは一切使用せず、他のフィールドをすべて無視します。 + * <ph name="PROXY_MODE_ENUM_SYSTEM" />: システムのプロキシを使用して、他のフィールドをすべて無視します。 + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />: 他のフィールドをすべて無視します。 + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> フィールドと <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> フィールドを使用します。 + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> フィールド、<ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> フィールド、<ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> フィールドを使用します。 + + 注: 詳しい例については、Chromium プロジェクトの説明(https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)をご覧ください。</translation> <translation id="1700811900332333712">デバイスに Powerwash のリクエストを許可する</translation> <translation id="1708496595873025510">バリエーション シードの取得に制限を設定する</translation> <translation id="1713829924716792485">このポリシーを有効に設定するか未設定のままにした場合、リモート アクセス ホストに接続しているユーザーは、クライアントとホスト間でファイルを転送できます。これは、ファイル転送がサポートされていないリモート サポート接続には適用されません。 @@ -565,6 +586,11 @@ このポリシーを未設定のままにした場合、ユーザーによる画面制御と明るさの自動調整機能には影響しません。 注: ポリシーの値は 0~100(%)の範囲で指定する必要があります。</translation> +<translation id="1733939382419067578">このポリシーでは、通知の表示を許可するサイトの URL パターンリストを指定できます。 + + このポリシーを未設定のままにした場合、<ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> が設定されていればその設定がすべてのサイトで使用され、設定されていなければユーザーの個人設定が適用されます。 + + 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation> <translation id="1736269219679256369">SSL 警告ページから移動することを許可する</translation> <translation id="173993509627303617">自動インストールされたウェブ アプリケーションにデバイス属性の取得を許可しない。</translation> <translation id="174765717426930019">ポップアップの表示元ページで操作が明示的に禁止されている場合以外は、<ph name="BLANK_PAGE_NAME" /> をターゲットとして開いたすべてのポップアップにそのリクエスト元ページの操作を許可する </translation> @@ -2391,6 +2417,11 @@ <translation id="4043796890723386527">ユーザーに <ph name="LACROS_NAME" /> ブラウザでの予備のプロフィールの作成と使用、およびゲストモードの使用を許可しない</translation> <translation id="4051723201852944592">ウィンドウ オクルージョンを有効にします</translation> <translation id="4056910949759281379">SPDY プロトコルを無効にする</translation> +<translation id="4061107397839125009">このポリシーでは、通知の表示を許可しないサイトの URL パターンリストを指定できます。 + + このポリシーを未設定のままにした場合、<ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> が設定されていればその設定がすべてのサイトで使用され、設定されていなければユーザーの個人設定が適用されます。 + + 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation> <translation id="4061590579642538878">障害レポートに関する情報を報告します。</translation> <translation id="4075675819066819571">シェルフを画面の左側に配置する</translation> <translation id="408029843066770167">Google 時間サービスへのクエリを許可する</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index d1db3daec..4370c58 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -556,6 +556,27 @@ 정책을 설정하지 않으면 기기의 디스크 여유 공간이 20GB(기본값) 미만일 경우 <ph name="PLUGIN_VM_NAME" /> 설치에 실패합니다. 정책을 설정하면 기기의 디스크 여유 공간이 정책에서 요구하는 수준보다 적을 경우 <ph name="PLUGIN_VM_NAME" /> 설치에 실패합니다.</translation> <translation id="1690383938831887552">서명된 HTTP 교환(SXG) 로드 차단</translation> +<translation id="1700458869527146675">정책을 설정하면 Chrome 및 ARC 앱에 프록시 설정이 구성되어 명령줄로 지정된 모든 프록시 관련 옵션이 무시됩니다. + + 설정하지 않으면 사용자가 프록시 설정을 선택할 수 있습니다. + + <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 설정하면 다음 필드가 허용됩니다. + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />: Chrome에서 사용되는 프록시 서버를 지정할 수 있으며 사용자가 프록시 설정을 변경하지 못함 + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />: 프록시 .pac 파일의 URL + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />: 네트워크 스택이 잘못되거나 사용 불가능한 PAC 스크립트가 포함된 직접 연결로 돌아가지 못하게 함 + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />: 프록시 서버의 URL + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />: 프록시가 우회되는 호스트의 목록 + + <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> 필드가 지원 중단되고 <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> 필드로 대체되었습니다. + + 선택할 수 있는 <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />의 값과 그에 따른 결과입니다. + * <ph name="PROXY_MODE_ENUM_DIRECT" />: 프록시가 사용되지 않고 다른 모든 필드가 무시됩니다. + * <ph name="PROXY_MODE_ENUM_SYSTEM" /> 값을 선택하면 시스템 프록시가 사용되고 다른 모든 필드가 무시됩니다. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> 값을 선택하면 다른 모든 필드가 무시됩니다. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> 및 <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 필드가 사용됩니다. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> 및 <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 필드가 사용됩니다. + + 참고: 자세한 예시를 보려면 Chromium 프로젝트(https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)를 참고하세요.</translation> <translation id="1700811900332333712">기기가 파워워시를 요청하도록 허용</translation> <translation id="1708496595873025510">버전 시드 가져오기 제한 설정</translation> <translation id="1713829924716792485">정책을 사용 설정하거나 설정하지 않으면 원격 액세스 호스트에 연결된 사용자가 클라이언트와 호스트 사이에 파일을 전송할 수 있습니다. 이 정책은 파일 전송을 지원하지 않는 원격 지원 연결에는 적용되지 않습니다. @@ -579,6 +600,11 @@ 정책을 설정하지 않으면 사용자 화면 제어 또는 자동 밝기 기능에 어떠한 영향도 미치지 않습니다. 참고: 이 정책의 값은 0부터 100까지의 비율로 지정해야 합니다.</translation> +<translation id="1733939382419067578">정책을 설정하면 알림 표시가 가능한 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. + + 정책을 설정하지 않았을 때 <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" />이 설정되어 있으면 모든 사이트에 적용되며 설정되지 않으면 사용자의 개인 설정이 적용됩니다. + + 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation> <translation id="1736269219679256369">SSL 경고 페이지에서 계속 진행하도록 허용</translation> <translation id="173993509627303617">강제 설치된 웹 애플리케이션이 기기 속성을 쿼리할 수 없게 합니다.</translation> <translation id="174765717426930019">팝업이 열리는 페이지에서 팝업 상호작용을 명시적으로 거부하는 경우를 제외하고 <ph name="BLANK_PAGE_NAME" /> 대상으로 열리는 모든 팝업이 팝업 표시를 요청하는 페이지와 상호작용하도록 허용 </translation> @@ -2463,6 +2489,11 @@ <translation id="4043796890723386527">사용자가 <ph name="LACROS_NAME" /> 브라우저에서 보조 프로필을 만들어 사용하거나 게스트 모드를 사용하지 못하도록 차단</translation> <translation id="4051723201852944592">창 오클루전 사용 설정</translation> <translation id="4056910949759281379">SPDY 프로토콜 사용 중지</translation> +<translation id="4061107397839125009">정책을 설정하면 알림 표시가 불가능한 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. + + 정책을 설정하지 않았을 때 <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" />이 설정되어 있으면 모든 사이트에 적용되며 설정되지 않으면 사용자의 개인 설정이 적용됩니다. + + 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation> <translation id="4061590579642538878">비정상 종료 보고서에 관한 정보를 보고합니다.</translation> <translation id="4075675819066819571">실행기를 화면 왼쪽에 놓기</translation> <translation id="408029843066770167">Google 시간 서비스에 쿼리 허용</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index b9e54f0..f411bf01 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -557,6 +557,27 @@ Als dit beleid niet is ingesteld, mislukt de installatie van <ph name="PLUGIN_VM_NAME" /> als de beschikbare vrije opslagruimte op het apparaat minder is dan 20 GB (standaardwaarde). Als dit beleid is ingesteld, mislukt de installatie van <ph name="PLUGIN_VM_NAME" /> als de beschikbare vrije opslagruimte op het apparaat minder is dan de waarde die wordt vereist door het beleid.</translation> <translation id="1690383938831887552">Niet toestaan dat Signed HTTP Exchanges worden geladen</translation> +<translation id="1700458869527146675">Als je het beleid instelt, bepaal je de proxyinstellingen voor Chrome en ARC-apps, die alle proxygerelateerde opties negeren die via de opdrachtregel worden opgegeven. + + Als je het beleid niet instelt, kunnen gebruikers hun proxyinstellingen kiezen. + + Als je het beleid <ph name="PROXY_SETTINGS_POLICY_NAME" /> instelt, worden de volgende velden geaccepteerd: +* <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />: Hiermee kun je de proxyserver opgeven die Chrome gebruikt en voorkomen dat gebruikers de proxyinstellingen wijzigen. +* <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />: Een URL naar een pac-bestand van de proxy. +* <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />: Hiermee wordt voorkomen dat de netwerkstack terugvalt op directe verbindingen met een ongeldig of niet-beschikbaar PAC-script. +* <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />: Een URL van de proxyserver. +* <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />: Een lijst met hosts die de proxy omzeilen. + +Het veld <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> is beëindigd ten gunste van het veld <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Als je voor <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> de volgende waarde kiest: +* <ph name="PROXY_MODE_ENUM_DIRECT" />: Er wordt nooit een proxy gebruikt en alle andere velden worden genegeerd. + * <ph name="PROXY_MODE_ENUM_SYSTEM" />: De proxy van het systeem wordt gebruikt en alle andere velden worden genegeerd. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />: Alle andere velden worden genegeerd. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: De velden <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> en <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> worden gebruikt. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: De velden <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> en <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> worden gebruikt. + + Opmerking: Voor gedetailleerdere voorbeelden ga je naar The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> <translation id="1700811900332333712">Geef het apparaat toestemming om Powerwash te activeren</translation> <translation id="1708496595873025510">De beperking voor het ophalen van de seed voor varianten instellen</translation> <translation id="1713829924716792485">Als je dit beleid toepast of niet instelt, kunnen gebruikers die met een host voor externe toegang zijn verbonden, bestanden overzetten tussen de client en de host. Dit is niet van toepassing op verbindingen voor hulp op afstand, die geen bestandsoverdracht ondersteunen. @@ -580,6 +601,11 @@ Als je het beleid niet instelt, bepaalt de gebruiker de helderheid en heeft dit geen invloed op de functies voor automatische helderheid. Opmerking: Geef de beleidswaarden op in procenten, minimaal 0 en maximaal 100.</translation> +<translation id="1733939382419067578">Als je het beleid instelt, kun je een lijst met URL-patronen instellen van de sites die meldingen mogen weergeven. + + Als je het beleid niet instelt, is <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> (indien ingesteld) van toepassing op alle sites. Zo niet, dan gelden de persoonlijke instellingen van de gebruiker. + + Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation> <translation id="1736269219679256369">Doorgaan vanaf de SSL-waarschuwingspagina toestaan</translation> <translation id="173993509627303617">Voorkomen dat afgedwongen geïnstalleerde web-apps query's voor apparaatkenmerken kunnen uitvoeren.</translation> <translation id="174765717426930019">Toestaan dat alle pop-ups die zijn geopend met het doel <ph name="BLANK_PAGE_NAME" />, interactie hebben met de pagina die het openen van de pop-up heeft aangevraagd, tenzij de openende pagina expliciet geen toestemming geeft voor dergelijke interactie </translation> @@ -2428,6 +2454,11 @@ <translation id="4043796890723386527">Voorkomen dat gebruikers secundaire profielen maken en gebruiken of dat ze de gastmodus gebruiken in de <ph name="LACROS_NAME" />-browser</translation> <translation id="4051723201852944592">Occlusie van vensters aanzetten</translation> <translation id="4056910949759281379">SPDY-protocol uitzetten</translation> +<translation id="4061107397839125009">Als je het beleid instelt, kun je een lijst met URL-patronen instellen van de sites die geen meldingen mogen weergeven. + + Als je het beleid niet instelt, is <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> (indien ingesteld) van toepassing op alle sites. Zo niet, dan gelden de persoonlijke instellingen van de gebruiker. + + Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation> <translation id="4061590579642538878">Informatie over crashrapporten rapporteren.</translation> <translation id="4075675819066819571">De plank aan de linkerkant van het scherm plaatsen</translation> <translation id="408029843066770167">Query's naar een Google-tijdservice toestaan</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 1627266..3bdbeee 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -552,6 +552,27 @@ Se esta política não for definida, haverá falha na instalação do <ph name="PLUGIN_VM_NAME" /> caso o espaço livre disponível em disco seja inferior a 20 GB (valor padrão). Se esta política for definida, haverá falha na instalação do <ph name="PLUGIN_VM_NAME" /> caso o espaço livre disponível em disco no dispositivo seja inferior ao exigido pela política.</translation> <translation id="1690383938831887552">Impedir o carregamento de Signed HTTP Exchanges</translation> +<translation id="1700458869527146675">Se a política for definida, haverá configurações de proxy para o Chrome e apps ARC, ignorando todas as opções relacionadas a proxy especificadas na linha de comando. + + Se a política for deixada sem definição, os usuários poderão escolher as configurações de proxy. + + Se a política <ph name="PROXY_SETTINGS_POLICY_NAME" /> for definida, os campos a seguir serão aceitos: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, que permite especificar o servidor proxy usado pelo Chrome e evitar que os usuários mudem as configurações de proxy. + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />, um URL de um arquivo de proxy .pac. + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, que evita que a pilha de rede retome as conexões diretas com um script de PAC inválido ou indisponível. + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />, um URL do servidor proxy. + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />, uma lista de hosts que ignorarão o proxy. + + O campo <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> foi descontinuado e substituído pelo campo <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Para o <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, se você escolher o valor: + * <ph name="PROXY_MODE_ENUM_DIRECT" />, um proxy nunca será usado e todos os outros campos serão ignorados; + * <ph name="PROXY_MODE_ENUM_SYSTEM" />, o proxy do sistema será usado e todos os outros campos serão ignorados; + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />, todos os outros campos serão ignorados; + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />, os campos <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> e <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> serão usados; + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, os campos <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> e <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> serão usados. + + Observação: para ver mais exemplos detalhados, acesse The Chromium Projects em https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett (link em inglês).</translation> <translation id="1700811900332333712">Permitir que o dispositivo solicite um Powerwash</translation> <translation id="1708496595873025510">Definir a restrição para busca do termo-semente "Variações"</translation> <translation id="1713829924716792485">Se a política for definida como "Ativada" ou deixada sem definição, os usuários poderão se conectar a um host de acesso remoto para transferir arquivos entre o cliente e o host. Isso não se aplica a conexões de assistência remota, que não são compatíveis com a transferência de arquivos. @@ -575,6 +596,11 @@ Se a política não for definida, os controles da tela pelo usuário ou os recursos de brilho automático não serão afetados. Observação: os valores da política precisam ser especificados em porcentagens de 0 a 100.</translation> +<translation id="1733939382419067578">Se a política for definida, será possível configurar uma lista de padrões de URL que especifica os sites que podem exibir notificações. + + Se a política for deixada sem definição, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se estiver definida. Caso contrário, a configuração pessoal do usuário será aplicada. + + Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns (link em inglês). O valor <ph name="WILDCARD_VALUE" /> não é aceito para esta política.</translation> <translation id="1736269219679256369">Permitir a continuação na página de aviso SSL</translation> <translation id="173993509627303617">Impedir que aplicativos da Web instalados à força consultem os atributos do dispositivo.</translation> <translation id="174765717426930019">Permitir que todos os pop-ups abertos com direcionamento para <ph name="BLANK_PAGE_NAME" /> interajam com a página que abriu o pop-up, a menos que ela rejeite explicitamente a interação </translation> @@ -2453,6 +2479,11 @@ <translation id="4043796890723386527">Impedir que os usuários criem e usem perfis secundários e usem o modo visitante no navegador <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">Ativar oclusão de janelas</translation> <translation id="4056910949759281379">Desativar o protocolo SPDY</translation> +<translation id="4061107397839125009">Se a política for definida, será possível configurar uma lista de padrões de URL que especifica os sites que não podem exibir notificações. + + Se a política for deixada sem definição, <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se estiver definida. Caso contrário, a configuração pessoal do usuário será aplicada. + + Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns (link em inglês). O valor <ph name="WILDCARD_VALUE" /> não é aceito para esta política.</translation> <translation id="4061590579642538878">Enviar informações sobre relatórios de erros.</translation> <translation id="4075675819066819571">Posicionar a estante no lado esquerdo da tela</translation> <translation id="408029843066770167">Permitir consultas a um serviço de hora do Google</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 53973c8..80256ac 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -553,6 +553,27 @@ Если не настроить это правило, установка <ph name="PLUGIN_VM_NAME" /> будет возможна, только если на устройстве не менее 20 ГБ свободного пространства (значение по умолчанию). Если правило настроено, установка <ph name="PLUGIN_VM_NAME" /> будет выполнена, только если на устройстве больше свободного пространства, чем задано в правиле.</translation> <translation id="1690383938831887552">Запретить загрузку веб-контента, для показа которого используется Signed HTTP Exchange</translation> +<translation id="1700458869527146675">Правило позволяет задать настройки прокси-сервера для Chrome и ARC-приложений, игнорируя все настройки прокси, указанные с помощью командной строки. + + Если правило не задано, пользователи могут самостоятельно настраивать прокси-сервер. + + Правило <ph name="PROXY_SETTINGS_POLICY_NAME" /> позволяет указать значения следующих полей: + * поле <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> задает прокси-сервер для Chrome и запрещает пользователям изменять эти настройки; + * поле <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" /> задает URL PAC-файла прокси-сервера; + * поле <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> предотвращает возврат сетевого стека к прямым соединениям с недопустимым или недоступным PAC-скриптом; + * поле <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> задает URL прокси-сервера; + * поле <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> задает список хостов, для которых прокси-сервер будет игнорироваться. + + Поле <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> заменено полем <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Вы можете выбрать одно из следующих значений поля <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />: + * <ph name="PROXY_MODE_ENUM_DIRECT" /> – прокси-сервер никогда не будет использоваться, а значения остальных полей будут игнорироваться. + * <ph name="PROXY_MODE_ENUM_SYSTEM" /> – будут использоваться системные настройки прокси-сервера, значения остальных полей будут игнорироваться. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> – значения остальных полей будут игнорироваться. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> – будут использоваться поля <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> и <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> – будут использоваться поля <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> и <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + + Примечание. Подробную информацию можно найти здесь: https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation> <translation id="1700811900332333712">Разрешить запрос функции Powerwash на устройстве</translation> <translation id="1708496595873025510">Ограничение загрузки исходного значения Variations</translation> <translation id="1713829924716792485">Если правило включено или не настроено, то пользователи, подключенные к хосту удаленного доступа, могут перемещать файлы между клиентом и хостом. Это правило не действует для подключений удаленной поддержки, не поддерживающих передачу файлов. @@ -576,6 +597,11 @@ Если правило не настроено, пользовательские настройки экрана и функция адаптивной яркости не будут изменены. Примечание. Значение указывается в процентах (от 0 до 100).</translation> +<translation id="1733939382419067578">Позволяет задать список шаблонов URL для указания сайтов, которым разрешено показывать уведомления. + + Если это правило не настроено, то действует правило <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> при условии, что оно задано. В противном случае действуют персональные настройки пользователя. + + Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила.</translation> <translation id="1736269219679256369">Разрешить переход со страницы предупреждения SSL</translation> <translation id="173993509627303617">Запретить принудительно установленным веб-приложениям запрашивать атрибуты устройств</translation> <translation id="174765717426930019">Разрешить всем всплывающим окнам, открытым с использованием target="<ph name="BLANK_PAGE_NAME" />", взаимодействовать со страницей, которая запросила их открытие (кроме случаев, когда она явно предоставила отказ от этого взаимодействия) </translation> @@ -2436,6 +2462,11 @@ <translation id="4043796890723386527">Запретить пользователям создавать дополнительные профили и использовать гостевой режим в браузере <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">Включить перекрытие окон</translation> <translation id="4056910949759281379">Отключение протокола SPDY</translation> +<translation id="4061107397839125009">Позволяет задать список шаблонов URL для указания сайтов, которым запрещено показывать уведомления. + + Если это правило не настроено, то действует правило <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> при условии, что оно задано. В противном случае действуют персональные настройки пользователя. + + Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила.</translation> <translation id="4061590579642538878">Передача информации из отчетов о сбое</translation> <translation id="4075675819066819571">Расположить панель запуска с левой стороны экрана</translation> <translation id="408029843066770167">Разрешить отправлять запросы в службу времени Google</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index f7cf398..255b579c 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -555,6 +555,27 @@ หากไม่ได้ตั้งค่านโยบายนี้ การติดตั้ง <ph name="PLUGIN_VM_NAME" /> จะไม่สำเร็จหากอุปกรณ์มีพื้นที่ว่างในดิสก์น้อยกว่า 20 GB (ค่าเริ่มต้น) หากตั้งค่านโยบายนี้ การติดตั้ง <ph name="PLUGIN_VM_NAME" /> จะไม่สำเร็จหากอุปกรณ์มีพื้นที่ว่างในดิสก์น้อยกว่าที่นโยบายกำหนดไว้</translation> <translation id="1690383938831887552">ป้องกันไม่ให้โหลด Signed HTTP Exchange</translation> +<translation id="1700458869527146675">การตั้งค่านโยบายนี้จะกำหนดค่าพร็อกซีสำหรับ Chrome และแอป ARC โดยไม่พิจารณาตัวเลือกเกี่ยวกับพร็อกซีทั้งหมดที่ระบุจากบรรทัดคำสั่ง + + การไม่ตั้งค่านโยบายนี้จะทำให้ผู้ใช้เลือกการตั้งค่าพร็อกซีได้ + + การตั้งค่านโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> จะยอมรับช่องต่อไปนี้ + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> สำหรับให้คุณระบุพร็อกซีเซิร์ฟเวอร์ที่ Chrome จะใช้ได้ และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่าพร็อกซี + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" /> คือ URL ที่ชี้ไปยังไฟล์ .pac ของพร็อกซี + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> สำหรับป้องกันไม่ให้สแต็กเครือข่ายเปลี่ยนไปใช้วิธีสำรอง นั่นคือการเชื่อมต่อโดยตรงกับสคริปต์ PAC ที่ไม่ถูกต้องหรือไม่พร้อมใช้งาน + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> คือ URL ของพร็อกซีเซิร์ฟเวอร์ + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> คือรายการโฮสต์ที่จะข้ามพร็อกซี + + ช่อง <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> เลิกใช้งานแล้วเพื่อใช้ช่อง <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> + + สำหรับ <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> หากคุณเลือกค่าต่อไปนี้ + * <ph name="PROXY_MODE_ENUM_DIRECT" /> ระบบจะไม่ใช้พร็อกซีและจะไม่พิจารณาช่องอื่นๆ ทั้งหมด + * <ph name="PROXY_MODE_ENUM_SYSTEM" /> ระบบจะใช้พร็อกซีของระบบและจะไม่พิจารณาช่องอื่นๆ ทั้งหมด + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> ระบบจะไม่พิจารณาช่องอื่นๆ ทั้งหมด + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> ระบบจะใช้ช่อง <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> และ <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> ระบบจะใช้ช่อง <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> และ <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> + + หมายเหตุ: ดูตัวอย่างโดยละเอียดเพิ่มเติมได้ที่ The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )</translation> <translation id="1700811900332333712">อนุญาตให้อุปกรณ์ขอทำ Powerwash</translation> <translation id="1708496595873025510">ตั้งค่าข้อจำกัดการเรียกเมล็ดรูปแบบ</translation> <translation id="1713829924716792485">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ตั้งค่าจะทำให้ผู้ใช้เชื่อมต่อกับโฮสต์การเข้าถึงระยะไกลเพื่อโอนไฟล์ระหว่างไคลเอ็นต์และโฮสต์ได้ นโยบายนี้ไม่มีผลกับการเชื่อมต่อความช่วยเหลือระยะไกล ซึ่งไม่รองรับการโอนไฟล์ @@ -578,6 +599,11 @@ การไม่ตั้งค่านโยบายจะไม่ส่งผลต่อการควบคุมหน้าจอของผู้ใช้หรือฟีเจอร์ความสว่างอัตโนมัติ หมายเหตุ: ระบุค่านโยบายเป็นเปอร์เซ็นต์จาก 0 ถึง 100</translation> +<translation id="1733939382419067578">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่แสดงการแจ้งเตือนได้ + + การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล + + ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation> <translation id="1736269219679256369">อนุญาตให้ดำเนินการจากหน้าคำเตือน SSL</translation> <translation id="173993509627303617">ป้องกันไม่ให้เว็บแอปพลิเคชันที่บังคับติดตั้งค้นหาแอตทริบิวต์ของอุปกรณ์</translation> <translation id="174765717426930019">อนุญาตให้เปิดป๊อปอัปทั้งหมดโดยมีการกำหนดเป้าหมายให้ <ph name="BLANK_PAGE_NAME" /> โต้ตอบกับหน้าที่ขอเปิดป๊อปอัป เว้นแต่หน้าที่เปิดเลือกไม่ใช้การโต้ตอบดังกล่าวอย่างชัดแจ้ง </translation> @@ -2422,6 +2448,11 @@ <translation id="4043796890723386527">ป้องกันไม่ให้ผู้ใช้สร้างและใช้โปรไฟล์รอง ตลอดจนป้องกันไม่ให้ใช้โหมดผู้มาเยือนในเบราว์เซอร์ <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">เปิดใช้การตรวจหาการบังหน้าต่าง</translation> <translation id="4056910949759281379">ปิดใช้งานโปรโตคอล SPDY</translation> +<translation id="4061107397839125009">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่แสดงการแจ้งเตือนไม่ได้ + + การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล + + ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation> <translation id="4061590579642538878">รายงานข้อมูลเกี่ยวกับรายงานข้อขัดข้อง</translation> <translation id="4075675819066819571">กำหนดตำแหน่งชั้นวางให้อยู่ที่ด้านซ้ายของหน้าจอ</translation> <translation id="408029843066770167">อนุญาตคำค้นหาที่ส่งไปยังบริการเวลาของ Google</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 9e53694..9e063c9 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -555,6 +555,27 @@ Bu politika ayarlanmadan bırakılırsa boş disk alanınız 20 GB'tan (varsayılan değer) az olduğunda <ph name="PLUGIN_VM_NAME" /> yüklemesi başarısız olur. Politika ayarlanırsa cihazda yetersiz disk alanı olduğunda <ph name="PLUGIN_VM_NAME" /> yüklemesi başarısız olur.</translation> <translation id="1690383938831887552">İmzalanmış HTTP Takaslarının yüklenmesini engelle</translation> +<translation id="1700458869527146675">Politikanın ayarlanması, komut satırında proxy ile ilgili belirtilen tüm seçenekleri yok sayan Chrome ve ARC-uygulamaları için proxy ayarlarını yapılandırır. + + Politika ayarlanmazsa kullanıcılar kendi proxy ayarlarını seçebilir. + + <ph name="PROXY_SETTINGS_POLICY_NAME" /> politikasının ayarlanması, aşağıdaki alanları kabul eder: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />, Chrome'un kullandığı proxy sunucusunu belirtmenizi sağlar ve kullanıcıların proxy ayarlarını değiştirmesini önler + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" />, proxy .pac dosyası için URL + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, ağ yığınının geçersiz veya kullanılamayan PAC komut dosyasıyla doğrudan bağlantılara geri dönmesini önler + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" />, proxy sunucu URL'si + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />, proxy'nin atlanacağı ana makinelerin listesi + + <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> alanı kullanımdan kaldırılıp yerine <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> alanı getirilmiştir. + + <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> için aşağıdaki değerleri seçerseniz: + * <ph name="PROXY_MODE_ENUM_DIRECT" />, proxy hiçbir zaman kullanılmaz ve diğer tüm alanlar yok sayılır. + * <ph name="PROXY_MODE_ENUM_SYSTEM" />, sisteme ait proxy kullanılır ve diğer tüm alanlar yok sayılır. + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />, diğer tüm alanlar yok sayılır. + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />, <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> ve <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> alanları kullanılır. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> ve <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> alanları kullanılır. + + Not: Daha ayrıntılı örnekler için Chromium Projeleri'ni ziyaret edin (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation> <translation id="1700811900332333712">Cihaza Powerwash isteme izni verme</translation> <translation id="1708496595873025510">Varyasyon temelini alma sınırlamasını ayarla</translation> <translation id="1713829924716792485">Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa uzaktan erişim ana makinesine bağlı kullanıcıların istemci ile ana makine arasında dosya aktarımı yapmasına izin verilir. Bu durum, dosya aktarımını desteklemeyen uzaktan yardım bağlantıları için geçerli değildir. @@ -578,6 +599,11 @@ Politika ayarlanmadan bırakıldığında kullanıcı ekran kontrolleri veya otomatik parlaklık özellikleri etkilenmez. Not: Politika değerleri 0-100 aralığında yüzde olarak belirtilmelidir.</translation> +<translation id="1733939382419067578">Politikayı ayarlamak bildirimleri görüntüleyebilen siteleri belirten URL kalıpları için bir liste yapmanıza olanak tanır. + + Politikayı ayarlamadan bırakırsanız <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> (etkinse) bütün siteler için geçerli olur. Aksi takdirde kullanıcının kişisel ayarları geçerlidir. + + Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir.</translation> <translation id="1736269219679256369">SSL uyarı sayfasından devam etmeye izin ver</translation> <translation id="173993509627303617">Zorunlu yüklenmiş web uygulamalarının cihaz özelliklerini sorgulamasını önle.</translation> <translation id="174765717426930019"><ph name="BLANK_PAGE_NAME" /> sayfasını hedefleyerek açılan tüm pop-up'lara, pop-up'ı açmak isteyen sayfayla etkileşimde bulunma izni ver. Bu izin, pop-up'ı açan sayfa böyle bir etkileşimi açıkça devre dışı bırakmadığı sürece verilir. </translation> @@ -2442,6 +2468,11 @@ <translation id="4043796890723386527">Kullanıcıların, <ph name="LACROS_NAME" /> tarayıcıda ikinci profiller oluşturup kullanmalarını ve misafir modunu kullanmalarını engelle.</translation> <translation id="4051723201852944592">Pencere Kapamayı Etkinleştir</translation> <translation id="4056910949759281379">SPDY protokolünü devre dışı bırak</translation> +<translation id="4061107397839125009">Politikayı ayarlamak, bildirimleri görüntüleyemeyen siteleri belirten URL kalıpları için bir liste yapmanıza olanak tanır. + + Politikayı ayarlamadan bırakırsanız <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> (etkinse) bütün siteler için geçerli olur. Aksi takdirde kullanıcının kişisel ayarları geçerlidir. + + Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir.</translation> <translation id="4061590579642538878">Kilitlenme raporlarıyla ilgili bilgileri raporlama</translation> <translation id="4075675819066819571">Rafı ekranın sol tarafında konumlandır</translation> <translation id="408029843066770167">Google zaman hizmetini sorgulamaya izin ver</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 3b4b417bc..70cce4c9 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -555,6 +555,27 @@ Якщо це правило не налаштовано, а на диску є менше ніж 20 ГБ (значення за умовчанням) вільного місця, <ph name="PLUGIN_VM_NAME" /> не буде встановлено. Якщо це правило налаштовано, <ph name="PLUGIN_VM_NAME" /> не буде встановлено, коли на диску буде менше вільного місця, ніж указано в правилі.</translation> <translation id="1690383938831887552">Заборонити завантаження за допомогою технології Signed HTTP Exchange</translation> +<translation id="1700458869527146675">За допомогою налаштувань цього правила можна вибрати параметри проксі для Chrome і додатків ARC, які ігнорують усі опції проксі, указані в командному рядку. + + Якщо не налаштувати це правило, користувачі зможуть самостійно вибирати параметри проксі. + + Якщо правило <ph name="PROXY_SETTINGS_POLICY_NAME" /> налаштовано, буде прийнято ці поля: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> визначає проксі-сервер для Chrome і забороняє користувачам змінювати ці налаштування; + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" /> – URL-адреса файлу .pac проксі-сервера; + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" />, не дає мережевому стеку використовувати прямі підключення з недійсним або недоступним скриптом PAC; + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> – URL-адреса проксі-сервера; + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> – список хостів, які працюватимуть в обхід проксі-сервера. + + Поле <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> застаріле. Замість нього використовується поле<ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" />. + + Якщо для параметра <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> вибрати значення: + * <ph name="PROXY_MODE_ENUM_DIRECT" />, проксі ніколи не використовуватиметься, а всі інші поля ігноруватимуться; + * <ph name="PROXY_MODE_ENUM_SYSTEM" />, використовуватимуться проксі системи, а всі інші поля ігноруватимуться; + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />, усі інші поля ігноруватимуться; + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />, використовуватимуться поля <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> та <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, використовуватимуться поля <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />, <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> та <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. + + Примітка: щоб переглянути детальніші приклади, відвідайте веб-сайт проектів Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation> <translation id="1700811900332333712">Дозволити пристрою надсилати запит на запуск Powerwash</translation> <translation id="1708496595873025510">Установити обмеження щодо отримання початкового числа Варіацій</translation> <translation id="1713829924716792485">Якщо це правило ввімкнено або не налаштовано, користувачі з віддаленим доступом до хосту можуть переносити файли між клієнтом і хостом. Це не стосується з'єднань для віддаленої допомоги, що не підтримують перенесення файлів. @@ -578,6 +599,11 @@ Якщо це правило не налаштовано, елементи керування екраном і функції адаптації яскравості не змінюються. Примітка. Значення правила потрібно вказувати у відсотках від 0 до 100.</translation> +<translation id="1733939382419067578">За допомогою цього правила можна вказати список шаблонів URL-адрес, що визначають сайти, які можуть показувати сповіщення. + + Якщо це правило не налаштовано, до всіх сайтів застосовуватиметься правило <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> за умови, що воно налаштоване. Якщо ні, використовуються особисті налаштування користувачів. + + Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила.</translation> <translation id="1736269219679256369">Дозволяти перехід зі сторінки застереження SSL</translation> <translation id="173993509627303617">Заборонити примусово встановленим веб-додаткам запитувати атрибути пристроїв.</translation> <translation id="174765717426930019">Дозволити всім спливаючим вікнам, які спрямовують на сторінку <ph name="BLANK_PAGE_NAME" />, взаємодіяти зі сторінкою, що надіслала запит, якщо ця сторінка спеціально не забороняла таку взаємодію </translation> @@ -2467,6 +2493,11 @@ <translation id="4043796890723386527">Не дозволяти користувачам створювати й використовувати додаткові профілі та вмикати режим гостя у веб-переглядачі <ph name="LACROS_NAME" /></translation> <translation id="4051723201852944592">Увімкнути перекривання вікон</translation> <translation id="4056910949759281379">Вимкнути протокол SPDY</translation> +<translation id="4061107397839125009">За допомогою цього правила можна вказати список шаблонів URL-адрес, що визначають сайти, яким заборонено показувати сповіщення. + + Якщо це правило не налаштовано, до всіх сайтів застосовуватиметься правило <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> за умови, що воно налаштоване. Якщо ні, використовуються особисті налаштування користувачів. + + Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила.</translation> <translation id="4061590579642538878">Повідомляти дані звітів про аварійне завершення роботи.</translation> <translation id="4075675819066819571">Розташування полиці ліворуч на екрані</translation> <translation id="408029843066770167">Дозволити запити в службу часу Google</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 07cbe1f..6dcf785 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -554,6 +554,28 @@ 如果不設定這項政策,當裝置上的可用磁碟空間小於 20 GB (預設值) 時,系統將無法安裝 <ph name="PLUGIN_VM_NAME" />。 如果設定這項政策,當裝置上的可用磁碟空間小於政策所要求的值時,系統將無法安裝 <ph name="PLUGIN_VM_NAME" />。</translation> <translation id="1690383938831887552">禁止載入採用 Signed HTTP Exchange 技術的內容</translation> +<translation id="1700458869527146675">你可以透過這項政策,設定 Chrome 和 ARC 應用程式的 Proxy 設定,系統會忽略所有從指令列所指定的 Proxy 相關選項。 + + 如果不設定這項政策,使用者就能選擇要使用的 Proxy 設定。 + + 設定 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策時,可使用下列欄位: + * <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> 可用來指定 Chrome 要使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定 + * <ph name="PROXY_PAC_URL_PROXY_SETTINGS_FIELD" /> 是 Proxy .pac 檔案的網址 + * <ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> 可以防止網路堆疊回到執行無效或無法使用 PAC 指令碼的直接連線 + * <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> 是 Proxy 伺服器網址 + * <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 是會略過 Proxy 的一系列主機 + + <ph name="PROXY_SERVER_MODE_PROXY_SETTINGS_FIELD" /> 欄位已淘汰,請改用 <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> 欄位。 + + 如果將 <ph name="PROXY_MODE_PROXY_SETTINGS_FIELD" /> 的值設為: + * <ph name="PROXY_MODE_ENUM_DIRECT" /> - 一律不使用 Proxy,而且會忽略其餘欄位。 + * <ph name="PROXY_MODE_ENUM_SYSTEM" /> - 使用系統 Proxy 並忽略其餘欄位。 + * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> - 忽略其餘欄位。 + * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> - 使用 <ph name="PROXY_SERVER_PROXY_SETTINGS_FIELD" /> 和 <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 欄位。 + + * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> - 使用 <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />、<ph name="PROXY_PAC_MANDATORY_PROXY_SETTINGS_FIELD" /> 和 <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 欄位。 + + 注意:如需詳細範例,請前往 Chromium 專案 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)。</translation> <translation id="1700811900332333712">允許裝置要求執行 Powerwash</translation> <translation id="1708496595873025510">設定變異版本種子的擷取限制</translation> <translation id="1713829924716792485">如果將這項政策設為啟用或不設定,使用者可連線至遠端存取主機,以便在用戶端和主機之間傳輸檔案。遠端協助連線不支援檔案傳輸功能,因此不適用這項政策。 @@ -577,6 +599,11 @@ 如果不設定這項政策,使用者螢幕控制項和自動調整亮度功能皆不會受到影響。 注意:政策設定值應指定為 0 至 100 之間的百分比值。</translation> +<translation id="1733939382419067578">你可以透過這項政策設定網址模式清單,用於指定可顯示通知的網站。 + + 在未設定這項政策的情況下,如果已設定 <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> 政策,後者就會適用於所有網站;如未設定,則會採用使用者的個人設定。 + + 想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation> <translation id="1736269219679256369">允許忽略 SSL 警告網頁,繼續前往原本指定的頁面</translation> <translation id="173993509627303617">禁止強制安裝的網頁應用程式查詢裝置屬性。</translation> <translation id="174765717426930019">除非要求開啟彈出式視窗的網頁明確拒絕與該彈出式視窗互動,否則一律允許透過 <ph name="BLANK_PAGE_NAME" /> 連結目標開啟的彈出式視窗進行這類互動 </translation> @@ -2421,6 +2448,11 @@ <translation id="4043796890723386527">禁止使用者在 <ph name="LACROS_NAME" /> 瀏覽器中建立及使用次要設定檔,以及使用訪客模式</translation> <translation id="4051723201852944592">啟用視窗遮蔽功能</translation> <translation id="4056910949759281379">停用 SPDY 通訊協定</translation> +<translation id="4061107397839125009">你可以透過這項政策設定網址模式清單,用於指定無法顯示通知的網站。 + + 在未設定這項政策的情況下,如果已設定 <ph name="DEFAULT_NOTIFICATIONS_SETTING_POLICY_NAME" /> 政策,後者就會適用於所有網站;如未設定,則會採用使用者的個人設定。 + + 想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation> <translation id="4061590579642538878">回報當機報告相關資訊。</translation> <translation id="4075675819066819571">將檔案櫃放在畫面的左側</translation> <translation id="408029843066770167">允許向 Google 時間服務傳送查詢</translation>
diff --git a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc index 16f4025..69964f7 100644 --- a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc +++ b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc
@@ -1712,6 +1712,8 @@ request_data.SetStringKey( "csd", request.request_data().csd().SerializeAsString()); } + request_data.SetStringKey("content_type", + request.request_data().content_type()); request_dict.SetKey("request_data", std::move(request_data)); } if (tab_url.is_valid()) {
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index fdb0a02..65131d7 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -101,7 +101,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />Essayez d'effacer vos témoins<ph name="END_LINK" /></translation> <translation id="1301324364792935241">Vérifiez les paramètres de DNS sécurisés</translation> <translation id="1307966114820526988">Fonctionnalités obsolètes</translation> -<translation id="131405271941274527"><ph name="URL" /> souhaite vous envoyer et recevoir de l'information lorsque vous touchez votre téléphone sur un appareil NFC</translation> +<translation id="131405271941274527"><ph name="URL" /> souhaite vous envoyer et recevoir de l'information lorsque vous touchez votre téléphone sur un appareil CCP</translation> <translation id="1314509827145471431">Reliure à droite</translation> <translation id="1319245136674974084">Ne plus me poser la question pour cette application</translation> <translation id="1320233736580025032">Enveloppe Prc1</translation> @@ -1215,7 +1215,7 @@ <translation id="5334013548165032829">Journaux détaillés du système</translation> <translation id="5334145288572353250">Enregistrer l'adresse?</translation> <translation id="5340250774223869109">L'application est bloquée</translation> -<translation id="534295439873310000">Appareils NFC</translation> +<translation id="534295439873310000">Appareils CCP</translation> <translation id="5344579389779391559">L'accès à cette page peut engendrer des frais</translation> <translation id="5355557959165512791">Vous ne pouvez pas consulter le site <ph name="SITE" /> pour le moment, car son certificat a été révoqué. Les erreurs réseau et les attaques sont généralement temporaires, ce qui signifie que cette page devrait fonctionner de nouveau plus tard.</translation> <translation id="536296301121032821">Échec de stockage des paramètres de la règle</translation> @@ -1333,7 +1333,7 @@ <translation id="578633867165174378">Chrome a trouvé le mot de passe que vous venez juste d'utiliser dans une violation de données. Nous vous recommandons de changer ce mot de passe maintenant.</translation> <translation id="5803412860119678065">Voulez-vous fournir les renseignements concernant votre carte <ph name="CARD_DETAIL" />?</translation> <translation id="5804241973901381774">Autorisations</translation> -<translation id="5804427196348435412">Utiliser des appareils NFC</translation> +<translation id="5804427196348435412">Utiliser des appareils CCP</translation> <translation id="5810442152076338065">Votre connexion au domaine <ph name="DOMAIN" /> est protégée par une suite de chiffrement obsolète.</translation> <translation id="5813119285467412249">&Rétablir l'ajout</translation> <translation id="5817918615728894473">Associer</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index e8a97b02..246418c 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -310,6 +310,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿದಿನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}=1{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿದಿನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}one{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿ {NUM_DAYS} ದಿನಗಳಿಗೆ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}other{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿ {NUM_DAYS} ದಿನಗಳಿಗೆ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}}</translation> <translation id="2053553514270667976">ಪಿನ್ ಕೋಡ್</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 ಸಲಹೆ}one{# ಸಲಹೆಗಳು}other{# ಸಲಹೆಗಳು}}</translation> +<translation id="2071156619270205202">ಈ ಕಾರ್ಡ್, ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗೆ ಅರ್ಹವಾಗಿಲ್ಲ.</translation> <translation id="2071692954027939183">ಅಧಿಸೂಚನೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಅವುಗಳನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ</translation> <translation id="2079545284768500474">ರದ್ದುಮಾಡಿ</translation> <translation id="20817612488360358">ಸಿಸ್ಟಂ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸಲು ಹೊಂದಿಸಲಾಗಿದೆ ಆದರೆ ಬಹಿರಂಗವಾದ ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಸಹ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿದೆ.</translation> @@ -438,9 +439,11 @@ <translation id="2521385132275182522">ಕೆಳಗಿನ ಬಲಭಾಗದಲ್ಲಿ ಸ್ಟೇಪಲ್ ಹಾಕಿ</translation> <translation id="2523886232349826891">ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಉಳಿಸಲಾಗಿದೆ</translation> <translation id="2524461107774643265">ಇನ್ನಷ್ಟು ಮಾಹಿತಿಯನ್ನು ಸೇರಿಸಿ</translation> +<translation id="2529899080962247600">ಈ ಕ್ಷೇತ್ರವು <ph name="MAX_ITEMS_LIMIT" /> ಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ನಮೂದುಗಳನ್ನು ಹೊಂದಿರುವಂತಿಲ್ಲ. ಮುಂದಿನ ಎಲ್ಲಾ ನಮೂದುಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{ಮತ್ತು ಇನ್ನೂ 1}one{ಮತ್ತು ಇನ್ನೂ #}other{ಮತ್ತು ಇನ್ನೂ #}}</translation> <translation id="2536110899380797252">ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ</translation> <translation id="2539524384386349900">ಪತ್ತೆ ಮಾಡು</translation> +<translation id="2540701853218677861">ಸಮಯಸ್ಟ್ಯಾಂಪ್ಗಳು ಮತ್ತು ವಿಫಲ ಪ್ರಯತ್ನಗಳು ಸೇರಿದಂತೆ, ಸಾಧನದ ಲಾಗಿನ್/ಲಾಗ್ ಔಟ್ ಇತಿಹಾಸ</translation> <translation id="2541219929084442027">ನಿಮ್ಮ ಎಲ್ಲಾ ಅಪರಿಚಿತ ಟ್ಯಾಬ್ಗಳನ್ನು ಮುಚ್ಚಿದ ಬಳಿಕ ನೀವು ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ವೀಕ್ಷಿಸಿದ ಪುಟಗಳು ಬ್ರೌಸರ್ ಇತಿಹಾಸದಲ್ಲಿ, ಕುಕೀ ಸಂಗ್ರಹದಲ್ಲಿ ಅಥವಾ ಹುಡುಕಾಟ ಇತಿಹಾಸದಲ್ಲಿ ಉಳಿಯುವುದಿಲ್ಲ. ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡುವ ಯಾವುದೇ ಫೈಲ್ಗಳು ಇಲ್ಲವೇ ನೀವು ರಚಿಸುವ ಯಾವುದೇ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಹಾಗೆಯೇ ಇರಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="2544644783021658368">ಏಕೈಕ ಡಾಕ್ಯುಮೆಂಟ್</translation> <translation id="254947805923345898">ಕಾರ್ಯನೀತಿಯ ಮೌಲ್ಯವು ಮಾನ್ಯವಾಗಿಲ್ಲ.</translation> @@ -630,6 +633,7 @@ <translation id="3320021301628644560">ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ</translation> <translation id="3324983252691184275">ಕಡುಗೆಂಪು</translation> <translation id="3329013043687509092">ಸ್ಯಾಚುರೇಶನ್</translation> +<translation id="3333762389743153920">ವರ್ಚುವಲ್ ಕಾರ್ಡ್ಗೆ ಅರ್ಹವಾಗಿಲ್ಲ</translation> <translation id="3338095232262050444">ಸುರಕ್ಷಿತ</translation> <translation id="3355823806454867987">ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಿಸಿ...</translation> <translation id="3360103848165129075">ಪಾವತಿ ಹ್ಯಾಂಡ್ಲರ್ ಶೀಟ್</translation> @@ -1143,6 +1147,7 @@ <translation id="5126510351761255129">ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="512670116361803001"><ph name="APP_NAME" /> ಅನ್ನು ಸರಿಯಾಗಿ ಮರುಗಾತ್ರಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗದಿರಬಹುದು. ಆ್ಯಪ್ ಸಮಸ್ಯೆಗಳನ್ನು ಎದುರಿಸದಂತೆ ತಡೆಯಲು ಪೂರ್ವನಿಗದಿ ವಿಂಡೋ ಗಾತ್ರಗಳನ್ನು ಬಳಸಿ.</translation> <translation id="5135404736266831032">ವಿಳಾಸಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation> +<translation id="5138014172396933048">ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಇದೀಗ ಲಭ್ಯವಿಲ್ಲ, ನಿಮ್ಮ ಬ್ಯಾಂಕ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ</translation> <translation id="5138227688689900538">ಕಡಿಮೆ ತೋರಿಸಿ</translation> <translation id="514010763713772514">ಮುಂದಿನ ಬಾರಿ ಹೆಚ್ಚು ವೇಗವಾಗಿ ಪರಿಶೀಲಿಸಿ</translation> <translation id="5145883236150621069">ನೀತಿ ಪ್ರತಿಕ್ರಿಯೆಯಲ್ಲಿ ದೋಷದ ಕೋಡ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ</translation> @@ -1189,6 +1194,7 @@ <translation id="5287240709317226393">ಕುಕೀಸ್ ಅನ್ನು ತೋರಿಸಿ</translation> <translation id="5287456746628258573">ಈ ಸೈಟ್ ಹಳೆಯ ಸುರಕ್ಷತಾ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಬಳಸುತ್ತದೆ, ಇದು ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಈ ಸೈಟ್ಗೆ ಕಳುಹಿಸಿದಾಗ ಅದನ್ನು (ಉದಾಹರಣೆಗೆ, ಪಾಸ್ವರ್ಡ್ಗಳು ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗಳು) ಬಹಿರಂಗಪಡಿಸಬಹುದು.</translation> <translation id="5288108484102287882">ಕಾರ್ಯನೀತಿ ಮೌಲ್ಯಗಳ ಮೌಲ್ಯೀಕರಣ ಪ್ರಕ್ರಿಯೆಯು ಎಚ್ಚರಿಕೆಯ ಸಂದೇಶಗಳನ್ನು ತೋರಿಸುತ್ತಿದೆ</translation> +<translation id="5288808348893593856">Chrome ನಿಮಗೆ ಸೂಚಿಸಿದ ಹೊರತು, ನಿಮ್ಮ ಕನೆಕ್ಷನ್ ಸುರಕ್ಷಿತವಾಗಿದೆ.</translation> <translation id="5289384342738547352">ಹಲವಾರು ಡಾಕ್ಯುಮೆಂಟ್ಗಳ ನಿರ್ವಹಣೆ</translation> <translation id="5299298092464848405">ನೀತಿಯ ಪಾರ್ಸಿಂಗ್ನಲ್ಲಿ ದೋಷ</translation> <translation id="5300589172476337783">ತೋರಿಸಿ</translation> @@ -1551,9 +1557,11 @@ <translation id="6685834062052613830">ಸೈನ್ ಔಟ್ ಮಾಡಿ ಹಾಗೂ ಸೆಟಪ್ ಪೂರ್ಣಗೊಳಿಸಿ</translation> <translation id="6687335167692595844">ವಿನಂತಿಸಲಾದ ಫಾಂಟ್ ಗಾತ್ರ</translation> <translation id="6688743156324860098">ಅಪ್ಡೇಟ್ ಮಾಡಿ…</translation> +<translation id="6688775486821967877">ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಇದೀಗ ಲಭ್ಯವಿಲ್ಲ, ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="6689249931105087298">ಕಪ್ಪು ಬಿಂದು ಕಂಪ್ರೆಶ್ಶನ್ಗೆ ಸಂಬಂಧಿಸಿದ</translation> <translation id="6689271823431384964">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಕಾರಣದಿಂದಾಗಿ, ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲು Chrome ಅವಕಾಶ ನೀಡುತ್ತಿದೆ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಬದಲಿಸಬಹುದು. ಕಾರ್ಡ್ ಹೋಲ್ಡರ್ ಹೆಸರು ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಬರುತ್ತದೆ.</translation> <translation id="6698381487523150993">ರಚಿಸಲಾಗಿದೆ:</translation> +<translation id="6699188552522342100">ಈ ವೆಬ್ಸೈಟ್ ನಿಖರವಾಗಿದೆಯೇ?</translation> <translation id="6702919718839027939">ಪ್ರಸ್ತುತಿ ಮೋಡ್</translation> <translation id="6710213216561001401">ಹಿಂದಿನದು</translation> <translation id="6710594484020273272"><ಹುಡುಕಾಟದ ಪದ ಟೈಪ್ ಮಾಡಿ></translation> @@ -2060,6 +2068,7 @@ <ph name="LIST_ITEM" />ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾ <ph name="END_LIST" /></translation> <translation id="8574899947864779331">ಕಾರ್ಡ್ಗಳನ್ನು ವೇಗವಾಗಿ ದೃಢೀಕರಿಸಲು ಟಚ್ ID ಬಳಸಿ</translation> +<translation id="8577348305244205642">ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="858637041960032120">ಫೋನ್ ಸಂ. ಸೇರಿಸಿ </translation> <translation id="8589998999637048520">ಅತ್ಯುತ್ತಮ ಗುಣಮಟ್ಟ</translation>
diff --git a/components/sync/driver/sync_service_crypto.cc b/components/sync/driver/sync_service_crypto.cc index 1994955..671fd9b 100644 --- a/components/sync/driver/sync_service_crypto.cc +++ b/components/sync/driver/sync_service_crypto.cc
@@ -9,7 +9,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/feature_list.h" -#include "base/metrics/histogram_macros.h" +#include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" #include "base/sequenced_task_runner.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -370,6 +370,7 @@ if (state_.required_user_action == RequiredUserAction::kUnknownDuringInitialization) { UpdateRequiredUserActionAndNotify(RequiredUserAction::kNone); + RefreshIsRecoverabilityDegraded(); } // This indicates OnTrustedVaultKeyRequired() was called as part of the @@ -495,6 +496,7 @@ } UpdateRequiredUserActionAndNotify(RequiredUserAction::kNone); + RefreshIsRecoverabilityDegraded(); // Make sure the data types that depend on the decryption key are started at // this time. @@ -591,7 +593,7 @@ state_.required_user_action == RequiredUserAction::kTrustedVaultKeyRequiredButFetching); - UMA_HISTOGRAM_ENUMERATION( + base::UmaHistogramEnumeration( "Sync.TrustedVaultFetchKeysAttempt", is_second_fetch_attempt ? TrustedVaultFetchKeysAttemptForUMA::kSecondAttempt @@ -619,7 +621,7 @@ DCHECK(state_.engine); - UMA_HISTOGRAM_COUNTS_100("Sync.TrustedVaultFetchedKeysCount", keys.size()); + base::UmaHistogramCounts100("Sync.TrustedVaultFetchedKeysCount", keys.size()); if (keys.empty()) { // Nothing to do if no keys have been fetched from the client (e.g. user @@ -644,7 +646,8 @@ state_.required_user_action != RequiredUserAction::kTrustedVaultKeyRequiredButFetching; - UMA_HISTOGRAM_BOOLEAN("Sync.TrustedVaultAddKeysAttemptIsSuccessful", success); + base::UmaHistogramBoolean("Sync.TrustedVaultAddKeysAttemptIsSuccessful", + success); if (success) { return; @@ -712,8 +715,6 @@ state_.required_user_action = new_required_user_action; delegate_->CryptoRequiredUserActionChanged(); - - RefreshIsRecoverabilityDegraded(); } void SyncServiceCrypto::RefreshIsRecoverabilityDegraded() { @@ -765,6 +766,13 @@ UpdateRequiredUserActionAndNotify(RequiredUserAction::kNone); delegate_->CryptoStateChanged(); } + + if (!initial_trusted_vault_recoverability_logged_to_uma_) { + initial_trusted_vault_recoverability_logged_to_uma_ = true; + base::UmaHistogramBoolean( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + is_recoverability_degraded); + } } } // namespace syncer
diff --git a/components/sync/driver/sync_service_crypto.h b/components/sync/driver/sync_service_crypto.h index 9893867..4b19dc2 100644 --- a/components/sync/driver/sync_service_crypto.h +++ b/components/sync/driver/sync_service_crypto.h
@@ -214,6 +214,8 @@ SEQUENCE_CHECKER(sequence_checker_); + bool initial_trusted_vault_recoverability_logged_to_uma_ = false; + base::WeakPtrFactory<SyncServiceCrypto> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(SyncServiceCrypto);
diff --git a/components/sync/driver/sync_service_crypto_unittest.cc b/components/sync/driver/sync_service_crypto_unittest.cc index 748c564..0e3aa2c97 100644 --- a/components/sync/driver/sync_service_crypto_unittest.cc +++ b/components/sync/driver/sync_service_crypto_unittest.cc
@@ -11,6 +11,7 @@ #include "base/callback_helpers.h" #include "base/observer_list.h" #include "base/run_loop.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "components/signin/public/identity_manager/account_info.h" @@ -799,6 +800,7 @@ override_features.InitAndEnableFeature( switches::kSyncTrustedVaultPassphraseRecovery); + base::HistogramTester histogram_tester; trusted_vault_client_.SetIsRecoverabilityDegraded(false); crypto_.OnPassphraseTypeChanged(PassphraseType::kTrustedVaultPassphrase, base::Time::Now()); @@ -809,6 +811,9 @@ ASSERT_FALSE(crypto_.IsTrustedVaultKeyRequired()); EXPECT_FALSE(crypto_.IsTrustedVaultRecoverabilityDegraded()); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/false, /*expected_bucket_count=*/1); } TEST_F(SyncServiceCryptoTest, @@ -817,6 +822,7 @@ override_features.InitAndEnableFeature( switches::kSyncTrustedVaultPassphraseRecovery); + base::HistogramTester histogram_tester; trusted_vault_client_.SetIsRecoverabilityDegraded(true); crypto_.OnPassphraseTypeChanged(PassphraseType::kTrustedVaultPassphrase, base::Time::Now()); @@ -827,6 +833,9 @@ ASSERT_FALSE(crypto_.IsTrustedVaultKeyRequired()); EXPECT_TRUE(crypto_.IsTrustedVaultRecoverabilityDegraded()); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/true, /*expected_bucket_count=*/1); } TEST_F(SyncServiceCryptoTest, ShouldReportDegradedRecoverabilityUponChange) { @@ -834,6 +843,7 @@ override_features.InitAndEnableFeature( switches::kSyncTrustedVaultPassphraseRecovery); + base::HistogramTester histogram_tester; trusted_vault_client_.SetIsRecoverabilityDegraded(false); crypto_.OnPassphraseTypeChanged(PassphraseType::kTrustedVaultPassphrase, base::Time::Now()); @@ -849,6 +859,11 @@ EXPECT_CALL(delegate_, CryptoStateChanged()); trusted_vault_client_.SetIsRecoverabilityDegraded(true); EXPECT_TRUE(crypto_.IsTrustedVaultRecoverabilityDegraded()); + + // For UMA purposes, only the initial value counts (false). + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/false, /*expected_bucket_count=*/1); } TEST_F(SyncServiceCryptoTest, @@ -857,6 +872,7 @@ override_features.InitAndEnableFeature( switches::kSyncTrustedVaultPassphraseRecovery); + base::HistogramTester histogram_tester; trusted_vault_client_.SetIsRecoverabilityDegraded(true); crypto_.OnPassphraseTypeChanged(PassphraseType::kTrustedVaultPassphrase, base::Time::Now()); @@ -872,6 +888,11 @@ EXPECT_CALL(delegate_, CryptoStateChanged()); trusted_vault_client_.SetIsRecoverabilityDegraded(false); EXPECT_FALSE(crypto_.IsTrustedVaultRecoverabilityDegraded()); + + // For UMA purposes, only the initial value counts (true). + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/true, /*expected_bucket_count=*/1); } TEST_F(SyncServiceCryptoTest, ShouldReportDegradedRecoverabilityUponRetrieval) { @@ -879,6 +900,7 @@ override_features.InitAndEnableFeature( switches::kSyncTrustedVaultPassphraseRecovery); + base::HistogramTester histogram_tester; trusted_vault_client_.SetIsRecoverabilityDegraded(true); // Mimic startup with trusted vault keys being required. @@ -909,6 +931,9 @@ // The recoverability state should be exposed. EXPECT_TRUE(crypto_.IsTrustedVaultRecoverabilityDegraded()); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultRecoverabilityDegradedOnStartup", + /*sample=*/true, /*expected_bucket_count=*/1); } TEST_F(SyncServiceCryptoTest,
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc index 977b834..6bfcba51 100644 --- a/components/sync/driver/sync_service_impl.cc +++ b/components/sync/driver/sync_service_impl.cc
@@ -254,14 +254,15 @@ } #if BUILDFLAG(IS_CHROMEOS_ASH) - // TODO(https://crbug.com/1222010): read actual minor mode signal from account - // capability. // For Chrome OS, sync auto-starts and `IsFirstSetupComplete` is marked as // true automatically in the first run. Below code is needed to disable sync // for minor mode users (e.g. under age of 18) when consent flow is abandoned // (due to crash or system shutdown) as sync should not auto-starts for minor - // users. This could be removed after launch of `SplitSettingsSync`, when - // sync won't be started automatically. + // users. At the time when below is called, we are not sure whether user is in + // minor mode. Thus we turn off data types for all users, and turn back on + // when we are certain the user is not in minor mode in `SyncConsentScreen` + // during OOBE. Below code could be removed after launch of + // `SplitSettingsSync`, when sync won't be started automatically. if (chromeos::features::IsMinorModeRestrictionEnabled() && !chromeos::features::IsSplitSettingsSyncEnabled() && !user_settings_->IsFirstSetupComplete()) {
diff --git a/content/browser/conversions/conversion_host.h b/content/browser/conversions/conversion_host.h index ebbf719..29b11fb 100644 --- a/content/browser/conversions/conversion_host.h +++ b/content/browser/conversions/conversion_host.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/compiler_specific.h" #include "base/containers/flat_map.h" #include "base/gtest_prod_util.h" #include "content/browser/conversions/conversion_manager.h" @@ -44,10 +45,10 @@ const std::string& attribution_source_event_id, const std::string& attribution_destination, const std::string& attribution_report_to, - int64_t attribution_expiry); + int64_t attribution_expiry) WARN_UNUSED_RESULT; static blink::mojom::ImpressionPtr MojoImpressionFromImpression( - const blink::Impression& impression); + const blink::Impression& impression) WARN_UNUSED_RESULT; private: FRIEND_TEST_ALL_PREFIXES(ConversionHostTest,
diff --git a/content/browser/conversions/conversion_manager.h b/content/browser/conversions/conversion_manager.h index 9c81d704..2234f04 100644 --- a/content/browser/conversions/conversion_manager.h +++ b/content/browser/conversions/conversion_manager.h
@@ -9,6 +9,7 @@ #include "base/callback.h" #include "base/callback_forward.h" +#include "base/compiler_specific.h" #include "base/containers/circular_deque.h" #include "content/browser/conversions/conversion_policy.h" #include "content/browser/conversions/conversion_report.h" @@ -62,8 +63,8 @@ // Get all reports sent in this session. Used for populating WebUI. Limited to // last 100. - virtual const base::circular_deque<SentReportInfo>& - GetSentReportsForWebUI() = 0; + virtual const base::circular_deque<SentReportInfo>& GetSentReportsForWebUI() + const WARN_UNUSED_RESULT = 0; // Sends all pending reports immediately, and runs |done| once they have all // been sent. @@ -71,7 +72,8 @@ // Returns the ConversionPolicy that is used to control API policies such // as noise. - virtual const ConversionPolicy& GetConversionPolicy() const = 0; + virtual const ConversionPolicy& GetConversionPolicy() const + WARN_UNUSED_RESULT = 0; // Deletes all data in storage for URLs matching |filter|, between // |delete_begin| and |delete_end| time.
diff --git a/content/browser/conversions/conversion_manager_impl.cc b/content/browser/conversions/conversion_manager_impl.cc index c01dbcc..77ce3843a 100644 --- a/content/browser/conversions/conversion_manager_impl.cc +++ b/content/browser/conversions/conversion_manager_impl.cc
@@ -192,7 +192,7 @@ } const base::circular_deque<SentReportInfo>& -ConversionManagerImpl::GetSentReportsForWebUI() { +ConversionManagerImpl::GetSentReportsForWebUI() const { return sent_reports_; }
diff --git a/content/browser/conversions/conversion_manager_impl.h b/content/browser/conversions/conversion_manager_impl.h index 717208e..4138cf5 100644 --- a/content/browser/conversions/conversion_manager_impl.h +++ b/content/browser/conversions/conversion_manager_impl.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/callback.h" +#include "base/compiler_specific.h" #include "base/containers/circular_deque.h" #include "base/files/file_path.h" #include "base/macros.h" @@ -83,7 +84,7 @@ const base::Clock* clock, const base::FilePath& user_data_directory, scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy, - size_t max_sent_reports_to_store); + size_t max_sent_reports_to_store) WARN_UNUSED_RESULT; ConversionManagerImpl( StoragePartition* storage_partition, @@ -102,7 +103,8 @@ void GetPendingReportsForWebUI( base::OnceCallback<void(std::vector<ConversionReport>)> callback, base::Time max_report_time) override; - const base::circular_deque<SentReportInfo>& GetSentReportsForWebUI() override; + const base::circular_deque<SentReportInfo>& GetSentReportsForWebUI() + const override; void SendReportsForWebUI(base::OnceClosure done) override; const ConversionPolicy& GetConversionPolicy() const override; void ClearData(base::Time delete_begin,
diff --git a/content/browser/conversions/conversion_network_sender_impl.cc b/content/browser/conversions/conversion_network_sender_impl.cc index 288b082..1ef5d2fc 100644 --- a/content/browser/conversions/conversion_network_sender_impl.cc +++ b/content/browser/conversions/conversion_network_sender_impl.cc
@@ -73,7 +73,7 @@ GURL GetReportUrl(const content::ConversionReport& report) { url::Replacements<char> replacements; - const char kEndpointPath[] = + static constexpr char kEndpointPath[] = "/.well-known/attribution-reporting/report-attribution"; replacements.SetPath(kEndpointPath, url::Component(0, strlen(kEndpointPath))); return report.impression.reporting_origin().GetURL().ReplaceComponents(
diff --git a/content/browser/conversions/conversion_policy.h b/content/browser/conversions/conversion_policy.h index 250d8a6..45620b0 100644 --- a/content/browser/conversions/conversion_policy.h +++ b/content/browser/conversions/conversion_policy.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include <memory> +#include "base/compiler_specific.h" #include "base/time/time.h" #include "content/browser/conversions/storable_impression.h" #include "content/common/content_export.h" @@ -29,13 +30,14 @@ // Returns a noised value of |conversion_data|. By default, this reports // completely random data for 5% of conversions, and sends the real data for // 95%. Virtual for testing. - virtual uint64_t GetNoisedConversionData(uint64_t conversion_data) const; + virtual uint64_t GetNoisedConversionData(uint64_t conversion_data) const + WARN_UNUSED_RESULT; // Returns a noised value of |event_source_trigger_data|. By default, this // reports completely random data for 5% of conversions, and sends the real // data for 95%. Virtual for testing. virtual uint64_t GetNoisedEventSourceTriggerData( - uint64_t event_source_trigger_data) const; + uint64_t event_source_trigger_data) const WARN_UNUSED_RESULT; private: friend class ConversionStorageDelegateImpl; @@ -46,11 +48,11 @@ // `ConversionStorageDelegateImpl::GetFakeEventSourceTriggerData()` and // `ConversionPolicy::NoiseProvider::GetNoisedEventSourceTriggerData()`. static uint64_t GetNoisedEventSourceTriggerDataImpl( - uint64_t event_source_trigger_data); + uint64_t event_source_trigger_data) WARN_UNUSED_RESULT; }; static std::unique_ptr<ConversionPolicy> CreateForTesting( - std::unique_ptr<NoiseProvider> noise_provider); + std::unique_ptr<NoiseProvider> noise_provider) WARN_UNUSED_RESULT; // |debug_mode| indicates whether the API is currently running in a mode where // it should not use noise. @@ -61,27 +63,29 @@ // Gets the sanitized conversion data for a conversion. This strips entropy // from the provided to data to at most 3 bits of information. - virtual uint64_t GetSanitizedConversionData(uint64_t conversion_data) const; + virtual uint64_t GetSanitizedConversionData(uint64_t conversion_data) const + WARN_UNUSED_RESULT; // Gets the sanitized event source trigger data for a conversion. virtual uint64_t GetSanitizedEventSourceTriggerData( - uint64_t event_source_trigger_data) const; + uint64_t event_source_trigger_data) const WARN_UNUSED_RESULT; // Gets the sanitized impression data for an impression. - virtual uint64_t GetSanitizedImpressionData(uint64_t impression_data) const; + virtual uint64_t GetSanitizedImpressionData(uint64_t impression_data) const + WARN_UNUSED_RESULT; // Returns the expiry time for an impression that is clamped to a maximum // value of 30 days from |impression_time|. virtual base::Time GetExpiryTimeForImpression( const absl::optional<base::TimeDelta>& declared_expiry, base::Time impression_time, - StorableImpression::SourceType source_type) const; + StorableImpression::SourceType source_type) const WARN_UNUSED_RESULT; // Delays reports that should have been sent while the browser was not open by // given them a noisy report time to help disassociate them from other // reports. virtual base::Time GetReportTimeForExpiredReportAtStartup( - base::Time now) const; + base::Time now) const WARN_UNUSED_RESULT; private: // For testing only.
diff --git a/content/browser/conversions/conversion_storage.h b/content/browser/conversions/conversion_storage.h index 60ea3932..cf2c2d3 100644 --- a/content/browser/conversions/conversion_storage.h +++ b/content/browser/conversions/conversion_storage.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/callback.h" +#include "base/compiler_specific.h" #include "base/time/time.h" #include "content/browser/conversions/conversion_report.h" #include "content/browser/conversions/storable_conversion.h" @@ -35,7 +36,8 @@ // `ConversionStorage::MaybeCreateAndStoreConversionReport()`. // The report will be pre-populated from storage with the conversion // event data. - virtual base::Time GetReportTime(const ConversionReport& report) const = 0; + virtual base::Time GetReportTime(const ConversionReport& report) const + WARN_UNUSED_RESULT = 0; // This limit is used to determine if an impression is allowed to schedule // a new conversion reports. When an impression reaches this limit it is @@ -43,7 +45,8 @@ // Impressions will be checked against this limit after they schedule a new // report. virtual int GetMaxConversionsPerImpression( - StorableImpression::SourceType source_type) const = 0; + StorableImpression::SourceType source_type) const + WARN_UNUSED_RESULT = 0; // These limits are designed solely to avoid excessive disk / memory usage. // In particular, they do not correspond with any privacy parameters. @@ -52,19 +55,20 @@ // // Returns the maximum number of impressions that can be in storage at any // time for an impression top-level origin. - virtual int GetMaxImpressionsPerOrigin() const = 0; + virtual int GetMaxImpressionsPerOrigin() const WARN_UNUSED_RESULT = 0; // Returns the maximum number of conversions that can be in storage at any // time for a conversion top-level origin. Note that since reporting // origins are the actual entities that invoke conversion registration, we // could consider changing this limit to be keyed by a <conversion origin, // reporting origin> tuple. - virtual int GetMaxConversionsPerOrigin() const = 0; + virtual int GetMaxConversionsPerOrigin() const WARN_UNUSED_RESULT = 0; // Returns the maximum number of distinct conversion destinations that can // be in storage at any time for event-source impressions with a given // reporting origin. - virtual int GetMaxAttributionDestinationsPerEventSource() const = 0; + virtual int GetMaxAttributionDestinationsPerEventSource() const + WARN_UNUSED_RESULT = 0; struct RateLimitConfig { base::TimeDelta time_window; @@ -72,18 +76,19 @@ }; // Returns the rate limits for capping attributions per window. - virtual RateLimitConfig GetRateLimits() const = 0; + virtual RateLimitConfig GetRateLimits() const WARN_UNUSED_RESULT = 0; // Selects how to handle the given impression; may involve RNG or other // dynamic criteria. virtual StorableImpression::AttributionLogic SelectAttributionLogic( - const StorableImpression& impression) const = 0; + const StorableImpression& impression) const WARN_UNUSED_RESULT = 0; // Returns random data for falsely attributed event sources. Only present on // the delegate interface so it can be overridden to return deterministic // data in tests. The data must be sanitized in the same way it would be for // `ConversionPolicy::GetNoisedEventSourceTriggerData()`. - virtual uint64_t GetFakeEventSourceTriggerData() const = 0; + virtual uint64_t GetFakeEventSourceTriggerData() const + WARN_UNUSED_RESULT = 0; }; virtual ~ConversionStorage() = default; @@ -111,7 +116,7 @@ // a negative number for no limit. virtual std::vector<ConversionReport> GetConversionsToReport( base::Time max_report_time, - int limit = -1) = 0; + int limit = -1) WARN_UNUSED_RESULT = 0; // Returns all active impressions in storage. Active impressions are all // impressions that can still convert. Impressions that: are past expiry, @@ -119,8 +124,8 @@ // converted and then superceded by a matching impression should not be // returned. |limit| limits the number of impressions to return; use // a negative number for no limit. - virtual std::vector<StorableImpression> GetActiveImpressions( - int limit = -1) = 0; + virtual std::vector<StorableImpression> GetActiveImpressions(int limit = -1) + WARN_UNUSED_RESULT = 0; // Deletes all impressions that have expired and have no pending conversion // reports. Returns the number of impressions that were deleted.
diff --git a/content/browser/conversions/conversion_storage_sql.cc b/content/browser/conversions/conversion_storage_sql.cc index a981427..eb28743 100644 --- a/content/browser/conversions/conversion_storage_sql.cc +++ b/content/browser/conversions/conversion_storage_sql.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/check_op.h" +#include "base/compiler_specific.h" #include "base/containers/flat_set.h" #include "base/files/file_util.h" #include "base/logging.h" @@ -103,7 +104,7 @@ count); } -bool ShouldReplaceImpressionToAttribute( +WARN_UNUSED_RESULT bool ShouldReplaceImpressionToAttribute( const absl::optional<StorableImpression>& impression_to_attribute, int64_t candidate_priority, base::Time candidate_impression_time) { @@ -191,7 +192,7 @@ // In the case where we get a new impression for a given <reporting_origin, // conversion_destination> we should mark all active, converted impressions // with the matching <reporting_origin, conversion_destination> as not active. - const char kDeactivateMatchingConvertedImpressionsSql[] = + static constexpr char kDeactivateMatchingConvertedImpressionsSql[] = "UPDATE impressions SET active = 0 " "WHERE conversion_destination = ? AND reporting_origin = ? AND " "active = 1 AND num_conversions > 0"; @@ -204,14 +205,14 @@ const StorableImpression::AttributionLogic attribution_logic = delegate_->SelectAttributionLogic(impression); - const char kInsertImpressionSql[] = + static constexpr char kInsertImpressionSql[] = "INSERT INTO impressions" - "(impression_data, impression_origin, conversion_origin, " - "conversion_destination, " - "reporting_origin, impression_time, expiry_time, source_type, " - "attributed_truthfully, priority, impression_site, " - "num_conversions, active) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"; + "(impression_data,impression_origin,conversion_origin," + "conversion_destination," + "reporting_origin,impression_time,expiry_time,source_type," + "attributed_truthfully,priority,impression_site," + "num_conversions,active)" + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kInsertImpressionSql)); statement.BindInt64( @@ -289,8 +290,8 @@ // Prioritization is scoped within report windows. // This is reasonably optimized as is, because we only store a ~small number // of reports per impression_id. - const char kMinPrioritySql[] = - "SELECT MIN(priority), conversion_id " + static constexpr char kMinPrioritySql[] = + "SELECT MIN(priority),conversion_id " "FROM conversions " "WHERE impression_id = ? AND report_time = ?"; sql::Statement min_priority_statement( @@ -304,7 +305,7 @@ // Deactivate the impression as a new report will never be generated in the // future. if (min_priority_statement.GetColumnType(0) == sql::ColumnType::kNull) { - const char kDeactivateSql[] = + static constexpr char kDeactivateSql[] = "UPDATE impressions SET active = 0 WHERE impression_id = ?"; sql::Statement deactivate_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeactivateSql)); @@ -328,7 +329,7 @@ } // Otherwise, delete the existing report with the lowest priority. - const char kDeleteConversionSql[] = + static constexpr char kDeleteConversionSql[] = "DELETE FROM conversions WHERE conversion_id = ?"; sql::Statement delete_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteConversionSql)); @@ -365,10 +366,10 @@ // Get all impressions that match this <reporting_origin, // conversion_destination> pair. Only get impressions that are active and not // past their expiry time. - const char kGetMatchingImpressionsSql[] = - "SELECT impression_origin, impression_id, impression_time, priority, " - "impression_data, conversion_origin, expiry_time, " - "attributed_truthfully, source_type, num_conversions " + static constexpr char kGetMatchingImpressionsSql[] = + "SELECT impression_origin,impression_id,impression_time,priority," + "impression_data,conversion_origin,expiry_time," + "attributed_truthfully,source_type,num_conversions " "FROM impressions " "WHERE conversion_destination = ? AND reporting_origin = ? " "AND active = 1 AND expiry_time > ? " @@ -491,7 +492,7 @@ if (maybe_replace_lower_priority_report_result == ConversionStorageSql::MaybeReplaceLowerPriorityReportResult:: kAddNewReport) { - const char kUpdateImpressionForConversionSql[] = + static constexpr char kUpdateImpressionForConversionSql[] = "UPDATE impressions SET num_conversions = num_conversions + 1 " "WHERE impression_id = ?"; sql::Statement impression_update_statement(db_->GetCachedStatement( @@ -505,7 +506,7 @@ } // Delete all unattributed impressions. - const char kDeleteUnattributedImpressionsSql[] = + static constexpr char kDeleteUnattributedImpressionsSql[] = "DELETE FROM impressions WHERE impression_id = ?"; sql::Statement delete_impression_statement(db_->GetCachedStatement( SQL_FROM_HERE, kDeleteUnattributedImpressionsSql)); @@ -535,10 +536,10 @@ bool ConversionStorageSql::StoreConversionReport(const ConversionReport& report, int64_t impression_id, int64_t priority) { - const char kStoreConversionSql[] = - "INSERT INTO conversions " - "(impression_id, conversion_data, conversion_time, report_time, " - "priority) VALUES(?,?,?,?,?)"; + static constexpr char kStoreConversionSql[] = + "INSERT INTO conversions" + "(impression_id,conversion_data,conversion_time,report_time," + "priority)VALUES(?,?,?,?,?)"; sql::Statement store_conversion_statement( db_->GetCachedStatement(SQL_FROM_HERE, kStoreConversionSql)); store_conversion_statement.BindInt64(0, impression_id); @@ -561,12 +562,12 @@ // less than |max_report_time| and their matching information from the // impression table. Negatives are treated as no limit // (https://sqlite.org/lang_select.html#limitoffset). - const char kGetExpiredConversionsSql[] = - "SELECT C.conversion_data, C.conversion_time, " - "C.report_time, " - "C.conversion_id, I.impression_origin, I.conversion_origin, " - "I.reporting_origin, I.impression_data, I.impression_time, " - "I.expiry_time, I.impression_id, I.source_type, I.priority " + static constexpr char kGetExpiredConversionsSql[] = + "SELECT C.conversion_data,C.conversion_time," + "C.report_time," + "C.conversion_id,I.impression_origin,I.conversion_origin," + "I.reporting_origin,I.impression_data,I.impression_time," + "I.expiry_time,I.impression_id,I.source_type,I.priority " "FROM conversions C JOIN impressions I ON " "C.impression_id = I.impression_id WHERE C.report_time <= ? " "LIMIT ?"; @@ -631,9 +632,9 @@ // Delete all impressions that have no associated conversions and are past // their expiry time. Optimized by |kImpressionExpiryIndexSql|. - const char kDeleteExpiredImpressionsSql[] = + static constexpr char kDeleteExpiredImpressionsSql[] = "DELETE FROM impressions WHERE expiry_time <= ? AND " - "impression_id NOT IN (SELECT impression_id FROM conversions)"; + "impression_id NOT IN(SELECT impression_id FROM conversions)"; sql::Statement delete_expired_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteExpiredImpressionsSql)); delete_expired_statement.BindTime(0, clock_->Now()); @@ -645,9 +646,9 @@ // inactive. This is done in a separate statement from // |kDeleteExpiredImpressionsSql| so that each query is optimized by an index. // Optimized by |kConversionUrlIndexSql|. - const char kDeleteInactiveImpressionsSql[] = + static constexpr char kDeleteInactiveImpressionsSql[] = "DELETE FROM impressions WHERE active = 0 AND " - "impression_id NOT IN (SELECT impression_id FROM conversions)"; + "impression_id NOT IN(SELECT impression_id FROM conversions)"; sql::Statement delete_inactive_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteInactiveImpressionsSql)); @@ -662,7 +663,7 @@ return false; // Delete the row identified by |conversion_id|. - const char kDeleteSentConversionSql[] = + static constexpr char kDeleteSentConversionSql[] = "DELETE FROM conversions WHERE conversion_id = ?"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteSentConversionSql)); @@ -696,12 +697,12 @@ // adding indexes on the impression_time and conversion_time columns. // See this comment for more information: // crrev.com/c/2150071/4/content/browser/conversions/conversion_storage_sql.cc#342 - const char kScanCandidateData[] = - "SELECT C.conversion_id, I.impression_id," - "I.impression_origin, I.conversion_origin, I.reporting_origin " + static constexpr char kScanCandidateData[] = + "SELECT C.conversion_id,I.impression_id," + "I.impression_origin,I.conversion_origin,I.reporting_origin " "FROM impressions I LEFT JOIN conversions C ON " "C.impression_id = I.impression_id WHERE" - "(I.impression_time BETWEEN ?1 AND ?2) OR" + "(I.impression_time BETWEEN ?1 AND ?2)OR" "(C.conversion_time BETWEEN ?1 AND ?2)"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kScanCandidateData)); @@ -742,7 +743,7 @@ return; for (int64_t impression_id : unique_impression_ids_to_delete) { - const char kDeleteImpressionSql[] = + static constexpr char kDeleteImpressionSql[] = "DELETE FROM impressions WHERE impression_id = ?"; sql::Statement impression_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteImpressionSql)); @@ -752,7 +753,7 @@ } for (int64_t conversion_id : conversion_ids_to_delete) { - const char kDeleteConversionSql[] = + static constexpr char kDeleteConversionSql[] = "DELETE FROM conversions WHERE conversion_id = ?"; sql::Statement conversion_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteConversionSql)); @@ -771,7 +772,7 @@ // Delete all unattributed conversions here to ensure everything is cleaned // up. for (int64_t impression_id : unique_impression_ids_to_delete) { - const char kDeleteVestigialConversionSql[] = + static constexpr char kDeleteVestigialConversionSql[] = "DELETE FROM conversions WHERE impression_id = ?"; sql::Statement delete_vestigial_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteVestigialConversionSql)); @@ -821,10 +822,10 @@ // // Optimizing these queries are also tough, see this comment for an idea: // http://crrev.com/c/2150071/12/content/browser/conversions/conversion_storage_sql.cc#468 - const char kSelectImpressionRangeSql[] = - "SELECT impression_id FROM impressions WHERE (impression_time BETWEEN ?1 " - "AND ?2) OR " - "impression_id in (SELECT impression_id FROM conversions " + static constexpr char kSelectImpressionRangeSql[] = + "SELECT impression_id FROM impressions WHERE(impression_time BETWEEN ?1 " + "AND ?2)OR " + "impression_id IN(SELECT impression_id FROM conversions " "WHERE conversion_time BETWEEN ?1 AND ?2)"; sql::Statement select_impressions_statement( db_->GetCachedStatement(SQL_FROM_HERE, kSelectImpressionRangeSql)); @@ -839,7 +840,7 @@ if (!select_impressions_statement.Succeeded()) return; - const char kDeleteImpressionSql[] = + static constexpr char kDeleteImpressionSql[] = "DELETE FROM impressions WHERE impression_id = ?"; sql::Statement delete_impression_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteImpressionSql)); @@ -850,9 +851,9 @@ return; } - const char kDeleteConversionRangeSql[] = - "DELETE FROM conversions WHERE (conversion_time BETWEEN ? AND ?) " - "OR impression_id NOT IN (SELECT impression_id FROM impressions)"; + static constexpr char kDeleteConversionRangeSql[] = + "DELETE FROM conversions WHERE(conversion_time BETWEEN ? AND ?)" + "OR impression_id NOT IN(SELECT impression_id FROM impressions)"; sql::Statement delete_conversions_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteConversionRangeSql)); delete_conversions_statement.BindTime(0, delete_begin); @@ -881,8 +882,8 @@ sql::Transaction transaction(db_.get()); if (!transaction.Begin()) return; - const char kDeleteAllConversionsSql[] = "DELETE FROM conversions"; - const char kDeleteAllImpressionsSql[] = "DELETE FROM impressions"; + static constexpr char kDeleteAllConversionsSql[] = "DELETE FROM conversions"; + static constexpr char kDeleteAllImpressionsSql[] = "DELETE FROM impressions"; sql::Statement delete_all_conversions_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteAllConversionsSql)); sql::Statement delete_all_impressions_statement( @@ -910,8 +911,8 @@ bool ConversionStorageSql::HasCapacityForStoringImpression( const std::string& serialized_origin) { // Optimized by impression_origin_idx. - const char kCountImpressionsSql[] = - "SELECT COUNT(impression_origin) FROM impressions WHERE " + static constexpr char kCountImpressionsSql[] = + "SELECT COUNT(impression_origin)FROM impressions WHERE " "impression_origin = ?"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kCountImpressionsSql)); @@ -931,10 +932,10 @@ // // Note: to take advantage of this, we need to hint to the query planner that // |active| is a boolean, so include it in the conditional. - const char kCountConversionsSql[] = - "SELECT COUNT(conversion_id) FROM conversions C JOIN impressions I ON" + static constexpr char kCountConversionsSql[] = + "SELECT COUNT(conversion_id)FROM conversions C JOIN impressions I ON" " I.impression_id = C.impression_id" - " WHERE I.conversion_destination = ? AND (active BETWEEN 0 AND 1)"; + " WHERE I.conversion_destination = ? AND(active BETWEEN 0 AND 1)"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kCountConversionsSql)); statement.BindString(0, serialized_origin); @@ -952,10 +953,10 @@ // Negatives are treated as no limit // (https://sqlite.org/lang_select.html#limitoffset). - const char kGetActiveImpressionsSql[] = - "SELECT impression_data, impression_origin, conversion_origin, " - "reporting_origin, impression_time, expiry_time, impression_id, " - "source_type, priority " + static constexpr char kGetActiveImpressionsSql[] = + "SELECT impression_data,impression_origin,conversion_origin," + "reporting_origin,impression_time,expiry_time,impression_id," + "source_type,priority " "FROM impressions " "WHERE active = 1 and expiry_time > ? " "LIMIT ?"; @@ -1133,7 +1134,7 @@ // |StorableImpression::AttributionLogic| enum. // |impression_site| is used to optimize the lookup of impressions; // |StorableImpression::ImpressionSite| is always derived from the origin. - const char kImpressionTableSql[] = + static constexpr char kImpressionTableSql[] = "CREATE TABLE IF NOT EXISTS impressions" "(impression_id INTEGER PRIMARY KEY," "impression_data INTEGER NOT NULL," @@ -1157,9 +1158,9 @@ // `StoreImpression()`, `DeleteExpiredImpressions()`. Impressions and // conversions are considered matching if they share this pair. These calls // only look at active conversions, so include |active| in the index. - const char kConversionDestinationIndexSql[] = + static constexpr char kConversionDestinationIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(active, conversion_destination, reporting_origin)"; + "ON impressions(active,conversion_destination,reporting_origin)"; if (!db_->Execute(kConversionDestinationIndexSql)) return false; @@ -1167,23 +1168,23 @@ // `MaybeCreateAndStoreConversionReport()` by indexing impressions by expiry // time. Both calls require only returning impressions that expire after a // given time. - const char kImpressionExpiryIndexSql[] = + static constexpr char kImpressionExpiryIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_expiry_idx " "ON impressions(expiry_time)"; if (!db_->Execute(kImpressionExpiryIndexSql)) return false; // Optimizes counting impressions by impression origin. - const char kImpressionOriginIndexSql[] = + static constexpr char kImpressionOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_origin_idx " "ON impressions(impression_origin)"; if (!db_->Execute(kImpressionOriginIndexSql)) return false; // Optimizes `EnsureCapacityForPendingDestinationLimit()`. - const char kImpressionSiteIndexSql[] = + static constexpr char kImpressionSiteIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_site_idx " - "ON impressions(active, impression_site, source_type)"; + "ON impressions(active,impression_site,source_type)"; if (!db_->Execute(kImpressionSiteIndexSql)) return false; @@ -1193,21 +1194,21 @@ // should be used for clearing site data. |report_time| is the time a // <conversion, impression> pair should be reported, and is specified by // |delegate_|. - const char kConversionTableSql[] = - "CREATE TABLE IF NOT EXISTS conversions " + static constexpr char kConversionTableSql[] = + "CREATE TABLE IF NOT EXISTS conversions" "(conversion_id INTEGER PRIMARY KEY," - " impression_id INTEGER NOT NULL," - " conversion_data INTEGER NOT NULL," - " conversion_time INTEGER NOT NULL," - " report_time INTEGER NOT NULL," - " priority INTEGER NOT NULL)"; + "impression_id INTEGER NOT NULL," + "conversion_data INTEGER NOT NULL," + "conversion_time INTEGER NOT NULL," + "report_time INTEGER NOT NULL," + "priority INTEGER NOT NULL)"; if (!db_->Execute(kConversionTableSql)) return false; // Optimize sorting conversions by report time for calls to // GetConversionsToReport(). The reports with the earliest report times are // periodically fetched from storage to be sent. - const char kConversionReportTimeIndexSql[] = + static constexpr char kConversionReportTimeIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_report_idx " "ON conversions(report_time)"; if (!db_->Execute(kConversionReportTimeIndexSql)) @@ -1217,7 +1218,7 @@ // quickly know if an expired impression can be deleted safely if it has no // corresponding pending conversions during calls to // DeleteExpiredImpressions(). - const char kConversionClickIdIndexSql[] = + static constexpr char kConversionClickIdIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_impression_id_idx " "ON conversions(impression_id)"; if (!db_->Execute(kConversionClickIdIndexSql)) @@ -1279,8 +1280,8 @@ const std::string serialized_conversion_destination = impression.ConversionDestination().Serialize(); - const char kSelectImpressionsSql[] = - "SELECT impression_id, conversion_destination " + static constexpr char kSelectImpressionsSql[] = + "SELECT impression_id,conversion_destination " "FROM impressions " "WHERE impression_site = ? AND source_type = ? " "AND active = 1 AND num_conversions = 0 " @@ -1350,7 +1351,7 @@ if (!transaction.Begin()) return false; - const char kDeleteImpressionSql[] = + static constexpr char kDeleteImpressionSql[] = "DELETE FROM impressions WHERE impression_id = ?"; sql::Statement delete_impression_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteImpressionSql));
diff --git a/content/browser/conversions/conversion_storage_sql.h b/content/browser/conversions/conversion_storage_sql.h index 5701697..34ad0c6 100644 --- a/content/browser/conversions/conversion_storage_sql.h +++ b/content/browser/conversions/conversion_storage_sql.h
@@ -8,6 +8,7 @@ #include <memory> #include <vector> +#include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" @@ -95,9 +96,9 @@ void ClearAllDataAllTime() VALID_CONTEXT_REQUIRED(sequence_checker_); bool HasCapacityForStoringImpression(const std::string& serialized_origin) - VALID_CONTEXT_REQUIRED(sequence_checker_); + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; int GetCapacityForStoringConversion(const std::string& serialized_origin) - VALID_CONTEXT_REQUIRED(sequence_checker_); + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; enum class MaybeReplaceLowerPriorityReportResult { kError, @@ -109,30 +110,32 @@ const StorableImpression& impression, int num_conversions, int64_t conversion_priority, - base::Time report_time) VALID_CONTEXT_REQUIRED(sequence_checker_); + base::Time report_time) + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; // When storing an event-source impression, deletes active event-source // impressions in order by |impression_time| until there are sufficiently few // unique conversion destinations for the same |impression_site|. bool EnsureCapacityForPendingDestinationLimit( const StorableImpression& impression) - VALID_CONTEXT_REQUIRED(sequence_checker_); + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; // Stores |report| in the database, but uses |impression_id| rather than // |ConversionReport::impression::impression_id()|, which may be null. bool StoreConversionReport(const ConversionReport& report, int64_t impression_id, int64_t priority) - VALID_CONTEXT_REQUIRED(sequence_checker_); + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; // Initializes the database if necessary, and returns whether the database is // open. |should_create| indicates whether the database should be created if // it is not already. bool LazyInit(DbCreationPolicy creation_policy) - VALID_CONTEXT_REQUIRED(sequence_checker_); + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; bool InitializeSchema(bool db_empty) - VALID_CONTEXT_REQUIRED(sequence_checker_); - bool CreateSchema() VALID_CONTEXT_REQUIRED(sequence_checker_); + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; + bool CreateSchema() + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; void HandleInitializationFailure(const InitStatus status) VALID_CONTEXT_REQUIRED(sequence_checker_);
diff --git a/content/browser/conversions/conversion_storage_sql_migrations.cc b/content/browser/conversions/conversion_storage_sql_migrations.cc index 1b2bc46..b047154 100644 --- a/content/browser/conversions/conversion_storage_sql_migrations.cc +++ b/content/browser/conversions/conversion_storage_sql_migrations.cc
@@ -29,8 +29,8 @@ std::vector<ImpressionIdAndConversionOrigin> GetImpressionIdAndConversionOrigins(sql::Database* db, int64_t start_impression_id) { - const char kGetImpressionsSql[] = - "SELECT impression_id, conversion_origin " + static constexpr char kGetImpressionsSql[] = + "SELECT impression_id,conversion_origin " "FROM impressions " "WHERE impression_id >= ? " "ORDER BY impression_id " @@ -64,8 +64,8 @@ std::vector<ImpressionIdAndImpressionOrigin> GetImpressionIdAndImpressionOrigins(sql::Database* db, int64_t start_impression_id) { - const char kGetImpressionsSql[] = - "SELECT impression_id, impression_origin " + static constexpr char kGetImpressionsSql[] = + "SELECT impression_id,impression_origin " "FROM impressions " "WHERE impression_id >= ? " "ORDER BY impression_id " @@ -107,7 +107,7 @@ // https://sqlite.org/lang_altertable.html#otheralter. Other approaches, like // using "ALTER ... ADD COLUMN" require setting a DEFAULT value for the column // which is undesirable. - const char kNewImpressionTableSql[] = + static constexpr char kNewImpressionTableSql[] = "CREATE TABLE IF NOT EXISTS new_impressions" "(impression_id INTEGER PRIMARY KEY," "impression_data TEXT NOT NULL," @@ -124,7 +124,7 @@ // Transfer the existing rows to the new table, inserting a placeholder for // the conversion_destination column. - const char kPopulateNewImpressionTableSql[] = + static constexpr char kPopulateNewImpressionTableSql[] = "INSERT INTO new_impressions SELECT " "impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time," @@ -133,11 +133,11 @@ if (!db->Execute(kPopulateNewImpressionTableSql)) return false; - const char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; + static constexpr char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; if (!db->Execute(kDropOldImpressionTableSql)) return false; - const char kRenameImpressionTableSql[] = + static constexpr char kRenameImpressionTableSql[] = "ALTER TABLE new_impressions RENAME TO impressions"; if (!db->Execute(kRenameImpressionTableSql)) return false; @@ -152,7 +152,7 @@ std::vector<ImpressionIdAndConversionOrigin> impressions = GetImpressionIdAndConversionOrigins(db, /*start_impression_id=*/0); - const char kUpdateDestinationSql[] = + static constexpr char kUpdateDestinationSql[] = "UPDATE impressions SET conversion_destination = ? WHERE impression_id = " "?"; sql::Statement update_destination_statement( @@ -177,13 +177,13 @@ } // Create the pre-existing impression table indices on the new table. - const char kImpressionExpiryIndexSql[] = + static constexpr char kImpressionExpiryIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_expiry_idx " "ON impressions(expiry_time)"; if (!db->Execute(kImpressionExpiryIndexSql)) return false; - const char kImpressionOriginIndexSql[] = + static constexpr char kImpressionOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_origin_idx " "ON impressions(impression_origin)"; if (!db->Execute(kImpressionOriginIndexSql)) @@ -192,9 +192,9 @@ // Replace the pre-existing conversion_origin_idx with an index that uses the // conversion destination, as attribution logic now depends on the // conversion_destination. - const char kConversionDestinationIndexSql[] = + static constexpr char kConversionDestinationIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(active, conversion_destination, reporting_origin)"; + "ON impressions(active,conversion_destination,reporting_origin)"; if (!db->Execute(kConversionDestinationIndexSql)) return false; @@ -214,7 +214,7 @@ // https://sqlite.org/lang_altertable.html#otheralter. Other approaches, like // using "ALTER ... ADD COLUMN" require setting a DEFAULT value for the column // which is undesirable. - const char kNewImpressionTableSql[] = + static constexpr char kNewImpressionTableSql[] = "CREATE TABLE IF NOT EXISTS new_impressions" "(impression_id INTEGER PRIMARY KEY," "impression_data TEXT NOT NULL," @@ -233,7 +233,7 @@ // Transfer the existing rows to the new table, inserting default values for // the source_type and attributed_truthfully columns. - const char kPopulateNewImpressionTableSql[] = + static constexpr char kPopulateNewImpressionTableSql[] = "INSERT INTO new_impressions SELECT " "impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time," @@ -248,31 +248,31 @@ if (!populate_statement.Run()) return false; - const char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; + static constexpr char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; if (!db->Execute(kDropOldImpressionTableSql)) return false; - const char kRenameImpressionTableSql[] = + static constexpr char kRenameImpressionTableSql[] = "ALTER TABLE new_impressions RENAME TO impressions"; if (!db->Execute(kRenameImpressionTableSql)) return false; // Create the pre-existing impression table indices on the new table. - const char kImpressionExpiryIndexSql[] = + static constexpr char kImpressionExpiryIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_expiry_idx " "ON impressions(expiry_time)"; if (!db->Execute(kImpressionExpiryIndexSql)) return false; - const char kImpressionOriginIndexSql[] = + static constexpr char kImpressionOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_origin_idx " "ON impressions(impression_origin)"; if (!db->Execute(kImpressionOriginIndexSql)) return false; - const char kConversionDestinationIndexSql[] = + static constexpr char kConversionDestinationIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(active, conversion_destination, reporting_origin)"; + "ON impressions(active,conversion_destination,reporting_origin)"; if (!db->Execute(kConversionDestinationIndexSql)) return false; @@ -287,7 +287,7 @@ if (!transaction.Begin()) return false; - const char kRateLimitTableSql[] = + static constexpr char kRateLimitTableSql[] = "CREATE TABLE IF NOT EXISTS rate_limits" "(rate_limit_id INTEGER PRIMARY KEY," "attribution_type INTEGER NOT NULL," @@ -300,20 +300,20 @@ if (!db->Execute(kRateLimitTableSql)) return false; - const char kRateLimitImpressionSiteTypeIndexSql[] = + static constexpr char kRateLimitImpressionSiteTypeIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_impression_site_type_idx " - "ON rate_limits(attribution_type, conversion_destination, " - "impression_site, conversion_time)"; + "ON rate_limits(attribution_type,conversion_destination," + "impression_site,conversion_time)"; if (!db->Execute(kRateLimitImpressionSiteTypeIndexSql)) return false; - const char kRateLimitConversionTimeIndexSql[] = + static constexpr char kRateLimitConversionTimeIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_conversion_time_idx " "ON rate_limits(conversion_time)"; if (!db->Execute(kRateLimitConversionTimeIndexSql)) return false; - const char kRateLimitImpressionIndexSql[] = + static constexpr char kRateLimitImpressionIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_impression_id_idx " "ON rate_limits(impression_id)"; if (!db->Execute(kRateLimitImpressionIndexSql)) @@ -332,12 +332,12 @@ // Any corresponding impressions will naturally be cleaned up by the expiry // logic. - const char kDropZeroCreditConversionsSql[] = + static constexpr char kDropZeroCreditConversionsSql[] = "DELETE FROM conversions WHERE attribution_credit = 0"; if (!db->Execute(kDropZeroCreditConversionsSql)) return false; - const char kDropAttributionCreditColumnSql[] = + static constexpr char kDropAttributionCreditColumnSql[] = "ALTER TABLE conversions DROP COLUMN attribution_credit"; if (!db->Execute(kDropAttributionCreditColumnSql)) return false; @@ -357,7 +357,7 @@ // documented at https://sqlite.org/lang_altertable.html#otheralter. Other // approaches, like using "ALTER ... ADD COLUMN" require setting a DEFAULT // value for the column which is undesirable. - const char kNewImpressionTableSql[] = + static constexpr char kNewImpressionTableSql[] = "CREATE TABLE IF NOT EXISTS new_impressions" "(impression_id INTEGER PRIMARY KEY," "impression_data TEXT NOT NULL," @@ -377,7 +377,7 @@ // Transfer the existing rows to the new table, inserting default values for // the priority column. - const char kPopulateNewImpressionTableSql[] = + static constexpr char kPopulateNewImpressionTableSql[] = "INSERT INTO new_impressions SELECT " "impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time," @@ -389,31 +389,31 @@ if (!populate_statement.Run()) return false; - const char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; + static constexpr char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; if (!db->Execute(kDropOldImpressionTableSql)) return false; - const char kRenameImpressionTableSql[] = + static constexpr char kRenameImpressionTableSql[] = "ALTER TABLE new_impressions RENAME TO impressions"; if (!db->Execute(kRenameImpressionTableSql)) return false; // Create the pre-existing impression table indices on the new table. - const char kImpressionExpiryIndexSql[] = + static constexpr char kImpressionExpiryIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_expiry_idx " "ON impressions(expiry_time)"; if (!db->Execute(kImpressionExpiryIndexSql)) return false; - const char kImpressionOriginIndexSql[] = + static constexpr char kImpressionOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_origin_idx " "ON impressions(impression_origin)"; if (!db->Execute(kImpressionOriginIndexSql)) return false; - const char kConversionDestinationIndexSql[] = + static constexpr char kConversionDestinationIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(active, conversion_destination, reporting_origin)"; + "ON impressions(active,conversion_destination,reporting_origin)"; if (!db->Execute(kConversionDestinationIndexSql)) return false; @@ -432,7 +432,7 @@ // steps documented at https://sqlite.org/lang_altertable.html#otheralter. // Other approaches, like using "ALTER ... ADD COLUMN" require setting a // DEFAULT value for the column which is undesirable. - const char kNewImpressionTableSql[] = + static constexpr char kNewImpressionTableSql[] = "CREATE TABLE IF NOT EXISTS new_impressions" "(impression_id INTEGER PRIMARY KEY," "impression_data TEXT NOT NULL," @@ -453,7 +453,7 @@ // Transfer the existing rows to the new table, inserting placeholder values // for the impression_site column. - const char kPopulateNewImpressionTableSql[] = + static constexpr char kPopulateNewImpressionTableSql[] = "INSERT INTO new_impressions SELECT " "impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time," @@ -465,11 +465,11 @@ if (!populate_statement.Run()) return false; - const char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; + static constexpr char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; if (!db->Execute(kDropOldImpressionTableSql)) return false; - const char kRenameImpressionTableSql[] = + static constexpr char kRenameImpressionTableSql[] = "ALTER TABLE new_impressions RENAME TO impressions"; if (!db->Execute(kRenameImpressionTableSql)) return false; @@ -482,7 +482,7 @@ std::vector<ImpressionIdAndImpressionOrigin> impressions = GetImpressionIdAndImpressionOrigins(db, /*start_impression_id=*/0); - const char kUpdateImpressionSiteSql[] = + static constexpr char kUpdateImpressionSiteSql[] = "UPDATE impressions SET impression_site = ? WHERE impression_id = ?"; sql::Statement update_impression_site_statement( db->GetCachedStatement(SQL_FROM_HERE, kUpdateImpressionSiteSql)); @@ -506,28 +506,28 @@ } // Create the pre-existing impression table indices on the new table. - const char kImpressionExpiryIndexSql[] = + static constexpr char kImpressionExpiryIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_expiry_idx " "ON impressions(expiry_time)"; if (!db->Execute(kImpressionExpiryIndexSql)) return false; - const char kImpressionOriginIndexSql[] = + static constexpr char kImpressionOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_origin_idx " "ON impressions(impression_origin)"; if (!db->Execute(kImpressionOriginIndexSql)) return false; - const char kConversionDestinationIndexSql[] = + static constexpr char kConversionDestinationIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(active, conversion_destination, reporting_origin)"; + "ON impressions(active,conversion_destination,reporting_origin)"; if (!db->Execute(kConversionDestinationIndexSql)) return false; // Create the new impression table index. - const char kImpressionSiteIndexSql[] = + static constexpr char kImpressionSiteIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_site_idx " - "ON impressions(active, impression_site, source_type)"; + "ON impressions(active,impression_site,source_type)"; if (!db->Execute(kImpressionSiteIndexSql)) return false; @@ -543,8 +543,8 @@ std::vector<ImpressionIdAndImpressionData> GetImpressionIdAndImpressionData( sql::Database* db, int64_t start_impression_id) { - const char kGetImpressionsSql[] = - "SELECT impression_id, impression_data " + static constexpr char kGetImpressionsSql[] = + "SELECT impression_id,impression_data " "FROM impressions " "WHERE impression_id >= ? " "ORDER BY impression_id " @@ -580,7 +580,7 @@ // steps documented at https://sqlite.org/lang_altertable.html#otheralter. // Other approaches, like using "ALTER ... ADD COLUMN" require setting a // DEFAULT value for the column which is undesirable. - const char kNewImpressionTableSql[] = + static constexpr char kNewImpressionTableSql[] = "CREATE TABLE IF NOT EXISTS new_impressions" "(impression_id INTEGER PRIMARY KEY," "impression_data INTEGER NOT NULL," @@ -601,7 +601,7 @@ // Transfer the existing impressions rows to the new table with a placeholder // for the impression_data column. - const char kPopulateNewImpressionsSql[] = + static constexpr char kPopulateNewImpressionsSql[] = "INSERT INTO new_impressions SELECT " "impression_id,0,impression_origin,conversion_origin,reporting_origin," "impression_time,expiry_time,num_conversions,active," @@ -621,7 +621,7 @@ std::vector<ImpressionIdAndImpressionData> impressions = GetImpressionIdAndImpressionData(db, /*start_impression_id=*/0); - const char kUpdateImpressionDataSql[] = + static constexpr char kUpdateImpressionDataSql[] = "UPDATE new_impressions SET impression_data = ? WHERE impression_id = ?"; sql::Statement update_impression_data_statement( db->GetCachedStatement(SQL_FROM_HERE, kUpdateImpressionDataSql)); @@ -646,37 +646,37 @@ db, impressions.back().impression_id + 1); } - const char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; + static constexpr char kDropOldImpressionTableSql[] = "DROP TABLE impressions"; if (!db->Execute(kDropOldImpressionTableSql)) return false; - const char kRenameImpressionTableSql[] = + static constexpr char kRenameImpressionTableSql[] = "ALTER TABLE new_impressions RENAME TO impressions"; if (!db->Execute(kRenameImpressionTableSql)) return false; // Create the pre-existing impression table indices on the new table. - const char kImpressionExpiryIndexSql[] = + static constexpr char kImpressionExpiryIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_expiry_idx " "ON impressions(expiry_time)"; if (!db->Execute(kImpressionExpiryIndexSql)) return false; - const char kImpressionOriginIndexSql[] = + static constexpr char kImpressionOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_origin_idx " "ON impressions(impression_origin)"; if (!db->Execute(kImpressionOriginIndexSql)) return false; - const char kConversionDestinationIndexSql[] = + static constexpr char kConversionDestinationIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(active, conversion_destination, reporting_origin)"; + "ON impressions(active,conversion_destination,reporting_origin)"; if (!db->Execute(kConversionDestinationIndexSql)) return false; - const char kImpressionSiteIndexSql[] = + static constexpr char kImpressionSiteIndexSql[] = "CREATE INDEX IF NOT EXISTS impression_site_idx " - "ON impressions(active, impression_site, source_type)"; + "ON impressions(active,impression_site,source_type)"; if (!db->Execute(kImpressionSiteIndexSql)) return false; @@ -685,13 +685,13 @@ // https://sqlite.org/lang_altertable.html#otheralter./ Other approaches, like // using "ALTER ... ADD COLUMN" require setting a DEFAULT value for the column // which is undesirable. - const char kNewConversionTableSql[] = - "CREATE TABLE IF NOT EXISTS new_conversions " + static constexpr char kNewConversionTableSql[] = + "CREATE TABLE IF NOT EXISTS new_conversions" "(conversion_id INTEGER PRIMARY KEY," - " impression_id INTEGER NOT NULL," - " conversion_data INTEGER NOT NULL," - " conversion_time INTEGER NOT NULL," - " report_time INTEGER NOT NULL)"; + "impression_id INTEGER NOT NULL," + "conversion_data INTEGER NOT NULL," + "conversion_time INTEGER NOT NULL," + "report_time INTEGER NOT NULL)"; if (!db->Execute(kNewConversionTableSql)) return false; @@ -700,7 +700,7 @@ // we can use here because valid conversion_data is in the range [0, 8]. // Existing impression_id values should never be NULL, but if they are, we // insert 0 instead of failing. - const char kPopulateNewConversionsSql[] = + static constexpr char kPopulateNewConversionsSql[] = "INSERT INTO new_conversions SELECT " "conversion_id,IFNULL(impression_id,0)," "CAST(conversion_data AS INTEGER),conversion_time,report_time " @@ -710,23 +710,23 @@ if (!populate_new_conversions_statement.Run()) return false; - const char kDropOldConversionTableSql[] = "DROP TABLE conversions"; + static constexpr char kDropOldConversionTableSql[] = "DROP TABLE conversions"; if (!db->Execute(kDropOldConversionTableSql)) return false; - const char kRenameConversionTableSql[] = + static constexpr char kRenameConversionTableSql[] = "ALTER TABLE new_conversions RENAME TO conversions"; if (!db->Execute(kRenameConversionTableSql)) return false; // Create the pre-existing conversion table indices on the new table. - const char kConversionReportTimeIndexSql[] = + static constexpr char kConversionReportTimeIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_report_idx " "ON conversions(report_time)"; if (!db->Execute(kConversionReportTimeIndexSql)) return false; - const char kConversionClickIdIndexSql[] = + static constexpr char kConversionClickIdIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_impression_id_idx " "ON conversions(impression_id)"; if (!db->Execute(kConversionClickIdIndexSql)) @@ -747,20 +747,20 @@ // steps documented at https://sqlite.org/lang_altertable.html#otheralter. // Other approaches, like using "ALTER ... ADD COLUMN" require setting a // DEFAULT value for the column which is undesirable. - const char kNewTableSql[] = - "CREATE TABLE IF NOT EXISTS new_conversions " + static constexpr char kNewTableSql[] = + "CREATE TABLE IF NOT EXISTS new_conversions" "(conversion_id INTEGER PRIMARY KEY," - " impression_id INTEGER NOT NULL," - " conversion_data INTEGER NOT NULL," - " conversion_time INTEGER NOT NULL," - " report_time INTEGER NOT NULL," - " priority INTEGER NOT NULL)"; + "impression_id INTEGER NOT NULL," + "conversion_data INTEGER NOT NULL," + "conversion_time INTEGER NOT NULL," + "report_time INTEGER NOT NULL," + "priority INTEGER NOT NULL)"; if (!db->Execute(kNewTableSql)) return false; // Transfer the existing rows to the new table, inserting 0 for the priority // column. - const char kPopulateSql[] = + static constexpr char kPopulateSql[] = "INSERT INTO new_conversions SELECT " "conversion_id,impression_id,conversion_data,conversion_time," "report_time,0 " @@ -770,23 +770,23 @@ if (!populate_statement.Run()) return false; - const char kDropOldTableSql[] = "DROP TABLE conversions"; + static constexpr char kDropOldTableSql[] = "DROP TABLE conversions"; if (!db->Execute(kDropOldTableSql)) return false; - const char kRenameTableSql[] = + static constexpr char kRenameTableSql[] = "ALTER TABLE new_conversions RENAME TO conversions"; if (!db->Execute(kRenameTableSql)) return false; // Create the pre-existing conversion table indices on the new table. - const char kConversionReportTimeIndexSql[] = + static constexpr char kConversionReportTimeIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_report_idx " "ON conversions(report_time)"; if (!db->Execute(kConversionReportTimeIndexSql)) return false; - const char kConversionClickIdIndexSql[] = + static constexpr char kConversionClickIdIndexSql[] = "CREATE INDEX IF NOT EXISTS conversion_impression_id_idx " "ON conversions(impression_id)"; if (!db->Execute(kConversionClickIdIndexSql))
diff --git a/content/browser/conversions/conversion_storage_sql_migrations.h b/content/browser/conversions/conversion_storage_sql_migrations.h index 600d518..d315173 100644 --- a/content/browser/conversions/conversion_storage_sql_migrations.h +++ b/content/browser/conversions/conversion_storage_sql_migrations.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_CONVERSIONS_CONVERSION_STORAGE_SQL_MIGRATIONS_H_ #define CONTENT_BROWSER_CONVERSIONS_CONVERSION_STORAGE_SQL_MIGRATIONS_H_ +#include "base/compiler_specific.h" + namespace sql { class Database; class MetaTable; @@ -43,7 +45,8 @@ // Upgrades |db| to the latest schema, and updates the version stored in // |meta_table| accordingly. Must be called with an open |db|. bool UpgradeConversionStorageSqlSchema(sql::Database* db, - sql::MetaTable* meta_table); + sql::MetaTable* meta_table) + WARN_UNUSED_RESULT; } // namespace content
diff --git a/content/browser/conversions/conversion_storage_sql_migrations_unittest.cc b/content/browser/conversions/conversion_storage_sql_migrations_unittest.cc index c00128a..30e2368 100644 --- a/content/browser/conversions/conversion_storage_sql_migrations_unittest.cc +++ b/content/browser/conversions/conversion_storage_sql_migrations_unittest.cc
@@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/macros.h" #include "base/path_service.h" #include "base/strings/string_util.h" #include "base/test/metrics/histogram_tester.h" @@ -46,8 +47,9 @@ std::make_unique<ConfigurableStorageDelegate>(), &clock); // We need to run an operation on storage to force the lazy initialization. - static_cast<ConversionStorage*>(&storage)->GetConversionsToReport( - base::Time::Min()); + ignore_result( + static_cast<ConversionStorage*>(&storage)->GetConversionsToReport( + base::Time::Min())); } base::FilePath DbPath() {
diff --git a/content/browser/conversions/conversion_test_utils.cc b/content/browser/conversions/conversion_test_utils.cc index 50ac28a2..da40b28b 100644 --- a/content/browser/conversions/conversion_test_utils.cc +++ b/content/browser/conversions/conversion_test_utils.cc
@@ -152,7 +152,7 @@ } const base::circular_deque<SentReportInfo>& -TestConversionManager::GetSentReportsForWebUI() { +TestConversionManager::GetSentReportsForWebUI() const { return sent_reports_; }
diff --git a/content/browser/conversions/conversion_test_utils.h b/content/browser/conversions/conversion_test_utils.h index 0955a1e..896ee1c9 100644 --- a/content/browser/conversions/conversion_test_utils.h +++ b/content/browser/conversions/conversion_test_utils.h
@@ -169,7 +169,8 @@ void GetPendingReportsForWebUI( base::OnceCallback<void(std::vector<ConversionReport>)> callback, base::Time max_report_time) override; - const base::circular_deque<SentReportInfo>& GetSentReportsForWebUI() override; + const base::circular_deque<SentReportInfo>& GetSentReportsForWebUI() + const override; void SendReportsForWebUI(base::OnceClosure done) override; const ConversionPolicy& GetConversionPolicy() const override; void ClearData(base::Time delete_begin, @@ -228,23 +229,28 @@ explicit ImpressionBuilder(base::Time time); ~ImpressionBuilder(); - ImpressionBuilder& SetExpiry(base::TimeDelta delta); + ImpressionBuilder& SetExpiry(base::TimeDelta delta) WARN_UNUSED_RESULT; - ImpressionBuilder& SetData(uint64_t data); + ImpressionBuilder& SetData(uint64_t data) WARN_UNUSED_RESULT; - ImpressionBuilder& SetImpressionOrigin(const url::Origin& origin); + ImpressionBuilder& SetImpressionOrigin(const url::Origin& origin) + WARN_UNUSED_RESULT; - ImpressionBuilder& SetConversionOrigin(const url::Origin& domain); + ImpressionBuilder& SetConversionOrigin(const url::Origin& domain) + WARN_UNUSED_RESULT; - ImpressionBuilder& SetReportingOrigin(const url::Origin& origin); + ImpressionBuilder& SetReportingOrigin(const url::Origin& origin) + WARN_UNUSED_RESULT; - ImpressionBuilder& SetSourceType(StorableImpression::SourceType source_type); + ImpressionBuilder& SetSourceType(StorableImpression::SourceType source_type) + WARN_UNUSED_RESULT; - ImpressionBuilder& SetPriority(int64_t priority); + ImpressionBuilder& SetPriority(int64_t priority) WARN_UNUSED_RESULT; - ImpressionBuilder& SetImpressionId(absl::optional<int64_t> impression_id); + ImpressionBuilder& SetImpressionId(absl::optional<int64_t> impression_id) + WARN_UNUSED_RESULT; - StorableImpression Build() const; + StorableImpression Build() const WARN_UNUSED_RESULT; private: uint64_t impression_data_; @@ -260,7 +266,7 @@ // Returns a StorableConversion with default data which matches the default // impressions created by ImpressionBuilder. -StorableConversion DefaultConversion(); +StorableConversion DefaultConversion() WARN_UNUSED_RESULT; // Helper class to construct a StorableConversion for tests using default data. // StorableConversion members are not mutable after construction requiring a @@ -270,19 +276,21 @@ ConversionBuilder(); ~ConversionBuilder() = default; - ConversionBuilder& SetConversionData(uint64_t conversion_data); + ConversionBuilder& SetConversionData(uint64_t conversion_data) + WARN_UNUSED_RESULT; ConversionBuilder& SetEventSourceTriggerData( - uint64_t event_source_trigger_data); + uint64_t event_source_trigger_data) WARN_UNUSED_RESULT; ConversionBuilder& SetConversionDestination( - const net::SchemefulSite& conversion_destination); + const net::SchemefulSite& conversion_destination) WARN_UNUSED_RESULT; - ConversionBuilder& SetReportingOrigin(const url::Origin& reporting_origin); + ConversionBuilder& SetReportingOrigin(const url::Origin& reporting_origin) + WARN_UNUSED_RESULT; - ConversionBuilder& SetPriority(int64_t priority); + ConversionBuilder& SetPriority(int64_t priority) WARN_UNUSED_RESULT; - StorableConversion Build() const; + StorableConversion Build() const WARN_UNUSED_RESULT; private: uint64_t conversion_data_ = 111; @@ -300,7 +308,7 @@ std::vector<ConversionReport> GetConversionsToReportForTesting( ConversionManagerImpl* manager, - base::Time max_report_time); + base::Time max_report_time) WARN_UNUSED_RESULT; } // namespace content
diff --git a/content/browser/conversions/rate_limit_table.cc b/content/browser/conversions/rate_limit_table.cc index 8bf95c96..099a1496 100644 --- a/content/browser/conversions/rate_limit_table.cc +++ b/content/browser/conversions/rate_limit_table.cc
@@ -38,7 +38,7 @@ // |conversion_destination| is the destination of the conversion. // |conversion_origin| is the origin of the conversion. // |conversion_time| is the report's conversion time. - const char kRateLimitTableSql[] = + static constexpr char kRateLimitTableSql[] = "CREATE TABLE IF NOT EXISTS rate_limits" "(rate_limit_id INTEGER PRIMARY KEY," "attribution_type INTEGER NOT NULL," @@ -52,22 +52,22 @@ return false; // Optimizes calls to |IsAttributionAllowed()|. - const char kRateLimitImpressionSiteTypeIndexSql[] = + static constexpr char kRateLimitImpressionSiteTypeIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_impression_site_type_idx " - "ON rate_limits(attribution_type, conversion_destination, " - "impression_site, conversion_time)"; + "ON rate_limits(attribution_type,conversion_destination," + "impression_site,conversion_time)"; if (!db->Execute(kRateLimitImpressionSiteTypeIndexSql)) return false; // Optimizes calls to |DeleteExpiredRateLimits()| and |ClearAllDataInRange()|. - const char kRateLimitConversionTimeIndexSql[] = + static constexpr char kRateLimitConversionTimeIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_conversion_time_idx " "ON rate_limits(conversion_time)"; if (!db->Execute(kRateLimitConversionTimeIndexSql)) return false; // Optimizes calls to |ClearDataForImpressionIds()|. - const char kRateLimitImpressionIndexSql[] = + static constexpr char kRateLimitImpressionIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_impression_id_idx " "ON rate_limits(impression_id)"; return db->Execute(kRateLimitImpressionIndexSql); @@ -84,13 +84,14 @@ base::Time now = clock_->Now(); if (now - last_cleared_ >= kDeleteFrequency) { last_cleared_ = now; - DeleteExpiredRateLimits(db); + if (!DeleteExpiredRateLimits(db)) + return false; } - const char kStoreRateLimitSql[] = - "INSERT INTO rate_limits " - "(attribution_type, impression_id, impression_site, impression_origin, " - "conversion_destination, conversion_origin, conversion_time) " + static constexpr char kStoreRateLimitSql[] = + "INSERT INTO rate_limits" + "(attribution_type,impression_id,impression_site,impression_origin," + "conversion_destination,conversion_origin,conversion_time)" "VALUES(?,?,?,?,?,?,?)"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kStoreRateLimitSql)); @@ -115,8 +116,8 @@ delegate_->GetRateLimits(); base::Time min_timestamp = now - rate_limits.time_window; - const char kAttributionAllowedSql[] = - "SELECT COUNT(*) FROM rate_limits " + static constexpr char kAttributionAllowedSql[] = + "SELECT COUNT(*)FROM rate_limits " "WHERE attribution_type = ? " "AND impression_site = ? " "AND conversion_destination = ? " @@ -143,7 +144,7 @@ DCHECK(!((delete_begin.is_null() || delete_begin.is_min()) && delete_end.is_max())); - const char kDeleteRateLimitRangeSql[] = + static constexpr char kDeleteRateLimitRangeSql[] = "DELETE FROM rate_limits WHERE conversion_time BETWEEN ? AND " "?"; sql::Statement statement( @@ -156,7 +157,7 @@ bool RateLimitTable::ClearAllDataAllTime(sql::Database* db) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - const char kDeleteAllRateLimitsSql[] = "DELETE FROM rate_limits"; + static constexpr char kDeleteAllRateLimitsSql[] = "DELETE FROM rate_limits"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kDeleteAllRateLimitsSql)); return statement.Run(); @@ -172,9 +173,9 @@ std::vector<int64_t> rate_limit_ids_to_delete; { - const char kScanCandidateData[] = - "SELECT rate_limit_id, impression_site, impression_origin, " - "conversion_destination, conversion_origin FROM rate_limits " + static constexpr char kScanCandidateData[] = + "SELECT rate_limit_id,impression_site,impression_origin," + "conversion_destination,conversion_origin FROM rate_limits " "WHERE conversion_time BETWEEN ? AND ?"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kScanCandidateData)); @@ -200,7 +201,7 @@ return false; for (int64_t rate_limit_id : rate_limit_ids_to_delete) { - const char kDeleteRateLimitSql[] = + static constexpr char kDeleteRateLimitSql[] = "DELETE FROM rate_limits WHERE rate_limit_id = ?"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kDeleteRateLimitSql)); @@ -212,17 +213,15 @@ return transaction.Commit(); } -int RateLimitTable::DeleteExpiredRateLimits(sql::Database* db) { +bool RateLimitTable::DeleteExpiredRateLimits(sql::Database* db) { base::Time timestamp = clock_->Now() - delegate_->GetRateLimits().time_window; - const char kDeleteExpiredRateLimits[] = + static constexpr char kDeleteExpiredRateLimits[] = "DELETE FROM rate_limits WHERE conversion_time <= ?"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kDeleteExpiredRateLimits)); statement.BindTime(0, timestamp); - if (!statement.Run()) - return 0; - return db->GetLastChangeCount(); + return statement.Run(); } bool RateLimitTable::ClearDataForImpressionIds( @@ -235,7 +234,7 @@ return false; for (int64_t id : impression_ids) { - const char kDeleteRateLimitSql[] = + static constexpr char kDeleteRateLimitSql[] = "DELETE FROM rate_limits WHERE impression_id = ?"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kDeleteRateLimitSql));
diff --git a/content/browser/conversions/rate_limit_table.h b/content/browser/conversions/rate_limit_table.h index 71bd2cd..c3fccc9d 100644 --- a/content/browser/conversions/rate_limit_table.h +++ b/content/browser/conversions/rate_limit_table.h
@@ -6,6 +6,7 @@ #define CONTENT_BROWSER_CONVERSIONS_RATE_LIMIT_TABLE_H_ #include "base/callback.h" +#include "base/compiler_specific.h" #include "base/containers/flat_set.h" #include "base/sequence_checker.h" #include "base/thread_annotations.h" @@ -38,40 +39,43 @@ // Creates the table in |db| if it doesn't exist. // Returns false on failure. - bool CreateTable(sql::Database* db); + bool CreateTable(sql::Database* db) WARN_UNUSED_RESULT; // Adds a rate limit to the table. // Returns false on failure. - bool AddRateLimit(sql::Database* db, const ConversionReport& report); + bool AddRateLimit(sql::Database* db, + const ConversionReport& report) WARN_UNUSED_RESULT; // Checks if the given attribution is allowed according to the data in the // table and policy as specified by the delegate. bool IsAttributionAllowed(sql::Database* db, const ConversionReport& report, - base::Time now); + base::Time now) WARN_UNUSED_RESULT; // These should be 1:1 with |ConversionStorageSql|'s |ClearData| functions. // Returns false on failure. bool ClearAllDataInRange(sql::Database* db, base::Time delete_begin, - base::Time delete_end); + base::Time delete_end) WARN_UNUSED_RESULT; // Returns false on failure. - bool ClearAllDataAllTime(sql::Database* db); + bool ClearAllDataAllTime(sql::Database* db) WARN_UNUSED_RESULT; // Returns false on failure. bool ClearDataForOriginsInRange( sql::Database* db, base::Time delete_begin, base::Time delete_end, - base::RepeatingCallback<bool(const url::Origin&)> filter); + base::RepeatingCallback<bool(const url::Origin&)> filter) + WARN_UNUSED_RESULT; bool ClearDataForImpressionIds(sql::Database* db, - const base::flat_set<int64_t>& impression_ids); + const base::flat_set<int64_t>& impression_ids) + WARN_UNUSED_RESULT; private: // Deletes data in the table older than the window determined by |clock_| and // |delegate_->GetRateLimits()|. - // Returns the number of deleted rows. - int DeleteExpiredRateLimits(sql::Database* db) - VALID_CONTEXT_REQUIRED(sequence_checker_); + // Returns false on failure. + bool DeleteExpiredRateLimits(sql::Database* db) + VALID_CONTEXT_REQUIRED(sequence_checker_) WARN_UNUSED_RESULT; // Must outlive |this|. const ConversionStorage::Delegate* delegate_
diff --git a/content/browser/conversions/sql_utils.h b/content/browser/conversions/sql_utils.h index 8788bdc..670584d3 100644 --- a/content/browser/conversions/sql_utils.h +++ b/content/browser/conversions/sql_utils.h
@@ -9,17 +9,18 @@ #include <string> +#include "base/compiler_specific.h" #include "url/origin.h" namespace content { -std::string SerializeOrigin(const url::Origin& origin); +std::string SerializeOrigin(const url::Origin& origin) WARN_UNUSED_RESULT; -url::Origin DeserializeOrigin(const std::string& origin); +url::Origin DeserializeOrigin(const std::string& origin) WARN_UNUSED_RESULT; -int64_t SerializeImpressionOrConversionData(uint64_t data); +int64_t SerializeImpressionOrConversionData(uint64_t data) WARN_UNUSED_RESULT; -uint64_t DeserializeImpressionOrConversionData(int64_t data); +uint64_t DeserializeImpressionOrConversionData(int64_t data) WARN_UNUSED_RESULT; // Prevent these functions from being called in the wrong direction. int64_t SerializeImpressionOrConversionData(int64_t data) = delete;
diff --git a/content/browser/conversions/storable_conversion.h b/content/browser/conversions/storable_conversion.h index 90844d5..b53f4e6e 100644 --- a/content/browser/conversions/storable_conversion.h +++ b/content/browser/conversions/storable_conversion.h
@@ -7,6 +7,7 @@ #include <stdint.h> +#include "base/compiler_specific.h" #include "content/common/content_export.h" #include "net/base/schemeful_site.h" #include "url/origin.h" @@ -32,19 +33,23 @@ StorableConversion& operator=(StorableConversion&& other); ~StorableConversion(); - uint64_t conversion_data() const { return conversion_data_; } + uint64_t conversion_data() const WARN_UNUSED_RESULT { + return conversion_data_; + } - const net::SchemefulSite& conversion_destination() const { + const net::SchemefulSite& conversion_destination() const WARN_UNUSED_RESULT { return conversion_destination_; } - const url::Origin& reporting_origin() const { return reporting_origin_; } + const url::Origin& reporting_origin() const WARN_UNUSED_RESULT { + return reporting_origin_; + } - uint64_t event_source_trigger_data() const { + uint64_t event_source_trigger_data() const WARN_UNUSED_RESULT { return event_source_trigger_data_; } - int64_t priority() const { return priority_; } + int64_t priority() const WARN_UNUSED_RESULT { return priority_; } private: // Conversion data associated with conversion registration event.
diff --git a/content/browser/conversions/storable_impression.h b/content/browser/conversions/storable_impression.h index a5cff3d..86927fb0 100644 --- a/content/browser/conversions/storable_impression.h +++ b/content/browser/conversions/storable_impression.h
@@ -7,6 +7,7 @@ #include <stdint.h> +#include "base/compiler_specific.h" #include "base/time/time.h" #include "content/common/content_export.h" #include "net/base/schemeful_site.h" @@ -59,35 +60,47 @@ StorableImpression& operator=(StorableImpression&& other); ~StorableImpression(); - uint64_t impression_data() const { return impression_data_; } + uint64_t impression_data() const WARN_UNUSED_RESULT { + return impression_data_; + } - const url::Origin& impression_origin() const { return impression_origin_; } + const url::Origin& impression_origin() const WARN_UNUSED_RESULT { + return impression_origin_; + } - const url::Origin& conversion_origin() const { return conversion_origin_; } + const url::Origin& conversion_origin() const WARN_UNUSED_RESULT { + return conversion_origin_; + } - const url::Origin& reporting_origin() const { return reporting_origin_; } + const url::Origin& reporting_origin() const WARN_UNUSED_RESULT { + return reporting_origin_; + } - base::Time impression_time() const { return impression_time_; } + base::Time impression_time() const WARN_UNUSED_RESULT { + return impression_time_; + } - base::Time expiry_time() const { return expiry_time_; } + base::Time expiry_time() const WARN_UNUSED_RESULT { return expiry_time_; } - absl::optional<int64_t> impression_id() const { return impression_id_; } + absl::optional<int64_t> impression_id() const WARN_UNUSED_RESULT { + return impression_id_; + } - SourceType source_type() const { return source_type_; } + SourceType source_type() const WARN_UNUSED_RESULT { return source_type_; } - int64_t priority() const { return priority_; } + int64_t priority() const WARN_UNUSED_RESULT { return priority_; } // Returns the schemeful site of |conversion_origin|. // // TODO(johnidel): Consider storing the SchemefulSite as a separate member so // that we avoid unnecessary copies of |conversion_origin_|. - net::SchemefulSite ConversionDestination() const; + net::SchemefulSite ConversionDestination() const WARN_UNUSED_RESULT; // Returns the schemeful site of |impression_origin|. // // TODO(johnidel): Consider storing the SchemefulSite as a separate member so // that we avoid unnecessary copies of |impression_origin_|. - net::SchemefulSite ImpressionSite() const; + net::SchemefulSite ImpressionSite() const WARN_UNUSED_RESULT; private: uint64_t impression_data_;
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.cc b/content/browser/file_system_access/file_system_access_file_handle_impl.cc index f7cdcd2..47c20bc 100644 --- a/content/browser/file_system_access/file_system_access_file_handle_impl.cc +++ b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
@@ -4,6 +4,7 @@ #include "content/browser/file_system_access/file_system_access_file_handle_impl.h" +#include "base/callback_helpers.h" #include "base/feature_list.h" #include "base/guid.h" #include "base/logging.h" @@ -23,6 +24,7 @@ #include "third_party/blink/public/mojom/blob/blob.mojom.h" #include "third_party/blink/public/mojom/blob/serialized_blob.mojom.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom.h" +#include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom.h" using blink::mojom::FileSystemAccessStatus; @@ -152,10 +154,11 @@ if (!IsAccessHandleEnabled()) { mojo::ReportBadMessage("File System Access Access Handle not enabled"); - std::move(callback).Run(file_system_access_error::FromStatus( - FileSystemAccessStatus::kInvalidState, - "File System Access Access Handle not enabled"), - base::File()); + std::move(callback).Run( + file_system_access_error::FromStatus( + FileSystemAccessStatus::kInvalidState, + "File System Access Access Handle not enabled"), + blink::mojom::FileSystemAccessAccessHandleFilePtr()); return; } @@ -164,20 +167,45 @@ file_system_access_error::FromStatus( FileSystemAccessStatus::kInvalidState, "Access handles may only be created on temporary file systems"), - base::File()); + blink::mojom::FileSystemAccessAccessHandleFilePtr()); return; } + auto open_file_callback = + file_system_context()->is_incognito() + ? base::BindOnce(&FileSystemAccessFileHandleImpl::DoOpenIncognitoFile, + weak_factory_.GetWeakPtr()) + : base::BindOnce(&FileSystemAccessFileHandleImpl::DoOpenFile, + weak_factory_.GetWeakPtr()); RunWithWritePermission( - base::BindOnce(&FileSystemAccessFileHandleImpl::DoOpenFile, - weak_factory_.GetWeakPtr()), + std::move(open_file_callback), base::BindOnce([](blink::mojom::FileSystemAccessErrorPtr result, OpenAccessHandleCallback callback) { - std::move(callback).Run(std::move(result), base::File()); + std::move(callback).Run( + std::move(result), + blink::mojom::FileSystemAccessAccessHandleFilePtr()); }), std::move(callback)); } +void FileSystemAccessFileHandleImpl::DoOpenIncognitoFile( + OpenAccessHandleCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_EQ(GetWritePermissionStatus(), + blink::mojom::PermissionStatus::GRANTED); + // TODO(crbug.com/1225653): Actually do something with the receiver. + mojo::PendingRemote<blink::mojom::FileSystemAccessFileDelegateHost> + file_delegate_host_remote; + mojo::PendingReceiver<blink::mojom::FileSystemAccessFileDelegateHost> + file_delegate_host_receiver = + file_delegate_host_remote.InitWithNewPipeAndPassReceiver(); + + std::move(callback).Run( + file_system_access_error::Ok(), + blink::mojom::FileSystemAccessAccessHandleFile::NewIncognitoFileDelegate( + std::move(file_delegate_host_remote))); +} + void FileSystemAccessFileHandleImpl::DoOpenFile( OpenAccessHandleCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -200,7 +228,10 @@ blink::mojom::FileSystemAccessErrorPtr result = file_system_access_error::FromFileError(file.error_details()); - std::move(callback).Run(std::move(result), std::move(file)); + std::move(callback).Run( + std::move(result), + blink::mojom::FileSystemAccessAccessHandleFile::NewRegularFile( + std::move(file))); } void FileSystemAccessFileHandleImpl::IsSameEntry(
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.h b/content/browser/file_system_access/file_system_access_file_handle_impl.h index 28ace7e7..85fd81407b 100644 --- a/content/browser/file_system_access/file_system_access_file_handle_impl.h +++ b/content/browser/file_system_access/file_system_access_file_handle_impl.h
@@ -86,6 +86,7 @@ bool auto_close, CreateFileWriterCallback callback, base::File::Error result); + void DoOpenIncognitoFile(OpenAccessHandleCallback callback); void DoOpenFile(OpenAccessHandleCallback callback); void DidOpenFile(OpenAccessHandleCallback callback,
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc index 7513066c..941c8ab 100644 --- a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc +++ b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
@@ -13,11 +13,14 @@ #include "base/bind.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "content/browser/file_system_access/fixed_file_system_access_permission_grant.h" +#include "content/public/common/content_features.h" #include "content/public/test/browser_task_environment.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" @@ -27,6 +30,7 @@ #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" #include "storage/browser/test/test_file_system_context.h" +#include "storage/common/file_system/file_system_types.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -40,35 +44,7 @@ : task_environment_(base::test::TaskEnvironment::MainThreadType::IO) {} void SetUp() override { - ASSERT_TRUE(dir_.CreateUniqueTempDir()); - - file_system_context_ = storage::CreateFileSystemContextForTesting( - /*quota_manager_proxy=*/nullptr, dir_.GetPath()); - - test_file_url_ = file_system_context_->CreateCrackedFileSystemURL( - test_src_origin_, storage::kFileSystemTypeTest, - base::FilePath::FromUTF8Unsafe("test")); - - ASSERT_EQ(base::File::FILE_OK, - storage::AsyncFileTestHelper::CreateFile( - file_system_context_.get(), test_file_url_)); - - chrome_blob_context_ = base::MakeRefCounted<ChromeBlobStorageContext>(); - chrome_blob_context_->InitializeOnIOThread(base::FilePath(), - base::FilePath(), nullptr); - - manager_ = base::MakeRefCounted<FileSystemAccessManagerImpl>( - file_system_context_, chrome_blob_context_, - /*permission_context=*/nullptr, - /*off_the_record=*/false); - - handle_ = std::make_unique<FileSystemAccessFileHandleImpl>( - manager_.get(), - FileSystemAccessManagerImpl::BindingContext( - test_src_origin_, test_src_url_, /*worker_process_id=*/1), - test_file_url_, - FileSystemAccessManagerImpl::SharedHandleState( - allow_grant_, allow_grant_, /*file_system=*/{})); + SetupHelper(storage::kFileSystemTypeTest, /*is_incognito=*/false); } void TearDown() override { task_environment_.RunUntilIdle(); } @@ -110,6 +86,45 @@ } protected: + void SetupHelper(storage::FileSystemType type, bool is_incognito) { + ASSERT_TRUE(dir_.CreateUniqueTempDir()); + + if (is_incognito) { + file_system_context_ = + storage::CreateIncognitoFileSystemContextForTesting( + base::ThreadTaskRunnerHandle::Get(), + base::ThreadTaskRunnerHandle::Get(), + /*quota_manager_proxy=*/nullptr, dir_.GetPath()); + } else { + file_system_context_ = storage::CreateFileSystemContextForTesting( + /*quota_manager_proxy=*/nullptr, dir_.GetPath()); + } + + test_file_url_ = file_system_context_->CreateCrackedFileSystemURL( + test_src_origin_, type, base::FilePath::FromUTF8Unsafe("test")); + + ASSERT_EQ(base::File::FILE_OK, + storage::AsyncFileTestHelper::CreateFile( + file_system_context_.get(), test_file_url_)); + + chrome_blob_context_ = base::MakeRefCounted<ChromeBlobStorageContext>(); + chrome_blob_context_->InitializeOnIOThread(base::FilePath(), + base::FilePath(), nullptr); + + manager_ = base::MakeRefCounted<FileSystemAccessManagerImpl>( + file_system_context_, chrome_blob_context_, + /*permission_context=*/nullptr, + /*off_the_record=*/false); + + handle_ = std::make_unique<FileSystemAccessFileHandleImpl>( + manager_.get(), + FileSystemAccessManagerImpl::BindingContext( + test_src_origin_, test_src_url_, /*worker_process_id=*/1), + test_file_url_, + FileSystemAccessManagerImpl::SharedHandleState( + allow_grant_, allow_grant_, /*file_system=*/{})); + } + const GURL test_src_url_ = GURL("http://example.com/foo"); const url::Origin test_src_origin_ = url::Origin::Create(test_src_url_); @@ -133,6 +148,31 @@ std::unique_ptr<FileSystemAccessFileHandleImpl> handle_; }; +class FileSystemAccessAccessHandleTest + : public FileSystemAccessFileHandleImplTest { + public: + FileSystemAccessAccessHandleTest() { + scoped_feature_list_.InitAndEnableFeature( + features::kFileSystemAccessAccessHandle); + } + + void SetUp() override { + // AccessHandles are only allowed for temporary file systems. + SetupHelper(storage::kFileSystemTypeTemporary, /*is_incognito=*/false); + } + + protected: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +class FileSystemAccessAccessHandleIncognitoTest + : public FileSystemAccessAccessHandleTest { + void SetUp() override { + // AccessHandles are only allowed for temporary file systems. + SetupHelper(storage::kFileSystemTypeTemporary, /*is_incognito=*/true); + } +}; + TEST_F(FileSystemAccessFileHandleImplTest, CreateFileWriterOverLimitNotOK) { int max_files = 5; handle_->set_max_swap_files_for_testing(max_files); @@ -221,4 +261,36 @@ loop.Run(); } +TEST_F(FileSystemAccessAccessHandleTest, OpenAccessHandle) { + base::RunLoop loop; + handle_->OpenAccessHandle( + base::BindLambdaForTesting( + [&](blink::mojom::FileSystemAccessErrorPtr result, + blink::mojom::FileSystemAccessAccessHandleFilePtr file) { + EXPECT_EQ(result->status, + blink::mojom::FileSystemAccessStatus::kOk); + // File should be valid and no incognito remote is needed. + EXPECT_TRUE(file->is_regular_file()); + EXPECT_TRUE(file->get_regular_file().IsValid()); + }) + .Then(loop.QuitClosure())); + loop.Run(); +} + +TEST_F(FileSystemAccessAccessHandleIncognitoTest, OpenAccessHandle) { + base::RunLoop loop; + handle_->OpenAccessHandle( + base::BindLambdaForTesting( + [&](blink::mojom::FileSystemAccessErrorPtr result, + blink::mojom::FileSystemAccessAccessHandleFilePtr file) { + EXPECT_EQ(result->status, + blink::mojom::FileSystemAccessStatus::kOk); + // Incognito remote should be valid and no file is needed. + EXPECT_TRUE(file->is_incognito_file_delegate()); + EXPECT_TRUE(file->get_incognito_file_delegate().is_valid()); + }) + .Then(loop.QuitClosure())); + loop.Run(); +} + } // namespace content
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc index cafb9550..15a9664 100644 --- a/content/browser/interest_group/ad_auction_service_impl.cc +++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -26,7 +26,6 @@ #include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/simple_url_loader.h" -#include "services/network/public/mojom/url_loader_factory.mojom-forward.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h index 8d092d9..0005a7c 100644 --- a/content/browser/interest_group/ad_auction_service_impl.h +++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -15,7 +15,7 @@ #include "content/public/browser/document_service_base.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/remote.h" -#include "services/network/public/mojom/url_loader_factory.mojom-forward.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" #include "third_party/blink/public/mojom/interest_group/ad_auction_service.mojom.h" #include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom-forward.h" #include "url/gurl.h"
diff --git a/content/browser/loader/file_url_loader_factory.cc b/content/browser/loader/file_url_loader_factory.cc index a857355..73efe24d 100644 --- a/content/browser/loader/file_url_loader_factory.cc +++ b/content/browser/loader/file_url_loader_factory.cc
@@ -16,7 +16,6 @@ #include "base/files/file_util.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/metrics/histogram_macros.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" @@ -60,8 +59,6 @@ #include "services/network/public/mojom/url_response_head.mojom.h" #include "storage/common/file_system/file_system_util.h" #include "url/gurl.h" -#include "url/third_party/mozilla/url_parse.h" -#include "url/url_canon_ip.h" #if defined(OS_WIN) #include "base/win/shortcut.h" @@ -464,9 +461,6 @@ &FileURLLoader::OnMojoDisconnect, base::Unretained(this))); client_.Bind(std::move(client_remote)); - host_safety_status_ = url::CheckHostnameSafety( - request.url.host_piece().data(), - url::Component(0, request.url.host_piece().size())); base::FilePath path; if (!net::FileURLToFilePath(request.url, &path)) { @@ -713,19 +707,8 @@ MaybeDeleteSelf(); } - void RecordCompletionHistogram(net::Error net_error) { - if (net_error == net::OK) { - UMA_HISTOGRAM_ENUMERATION("Net.File.Request.Success.HostSafetyStatus", - host_safety_status_); - } else { - UMA_HISTOGRAM_ENUMERATION("Net.File.Request.Failure.HostSafetyStatus", - host_safety_status_); - } - } - void OnClientComplete(net::Error net_error, std::unique_ptr<FileURLLoaderObserver> observer) { - RecordCompletionHistogram(net_error); client_->OnComplete(network::URLLoaderCompletionStatus(net_error)); client_.reset(); if (observer) { @@ -754,14 +737,12 @@ if (result == MOJO_RESULT_OK) { network::URLLoaderCompletionStatus status(net::OK); - RecordCompletionHistogram(net::OK); status.encoded_data_length = total_bytes_written_; status.encoded_body_length = total_bytes_written_; status.decoded_body_length = total_bytes_written_; client_->OnComplete(status); } else { client_->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED)); - RecordCompletionHistogram(net::ERR_FAILED); } client_.reset(); MaybeDeleteSelf(); @@ -778,7 +759,6 @@ // It is used to set some of the URLLoaderCompletionStatus data passed back // to the URLLoaderClients (eg SimpleURLLoader). uint64_t total_bytes_written_ = 0; - url::HostSafetyStatus host_safety_status_ = url::HostSafetyStatus::kOk; DISALLOW_COPY_AND_ASSIGN(FileURLLoader); };
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc index 3b350fe55..0e08735 100644 --- a/content/browser/permissions/permission_controller_impl.cc +++ b/content/browser/permissions/permission_controller_impl.cc
@@ -380,8 +380,15 @@ } void PermissionControllerImpl::OnDelegatePermissionStatusChange( - Subscription* subscription, + SubscriptionId subscription_id, blink::mojom::PermissionStatus status) { + Subscription* subscription = subscriptions_.Lookup(subscription_id); + DCHECK(subscription); + // TODO(crbug.com/1223407) Adding this block to prevent crashes while we + // investigate the root cause of the crash. This block will be removed as the + // CHECK() above should be enough. + if (!subscription) + return; absl::optional<blink::mojom::PermissionStatus> status_override = devtools_permission_overrides_.Get( url::Origin::Create(subscription->requesting_origin), @@ -416,6 +423,7 @@ subscription->render_process_id = -1; } + auto id = subscription_id_generator_.GenerateNextId(); PermissionControllerDelegate* delegate = browser_context_->GetPermissionControllerDelegate(); if (delegate) { @@ -424,10 +432,8 @@ permission, render_frame_host, requesting_origin, base::BindRepeating( &PermissionControllerImpl::OnDelegatePermissionStatusChange, - base::Unretained(this), subscription.get())); + base::Unretained(this), id)); } - - auto id = subscription_id_generator_.GenerateNextId(); subscriptions_.AddWithID(std::move(subscription), id); return id; }
diff --git a/content/browser/permissions/permission_controller_impl.h b/content/browser/permissions/permission_controller_impl.h index 3702cb36..21e1c43 100644 --- a/content/browser/permissions/permission_controller_impl.h +++ b/content/browser/permissions/permission_controller_impl.h
@@ -93,7 +93,7 @@ SubscriptionsStatusMap GetSubscriptionsStatuses( const absl::optional<GURL>& origin = absl::nullopt); void NotifyChangedSubscriptions(const SubscriptionsStatusMap& old_statuses); - void OnDelegatePermissionStatusChange(Subscription* subscription, + void OnDelegatePermissionStatusChange(SubscriptionId subscription_id, blink::mojom::PermissionStatus status); void UpdateDelegateOverridesForDevTools( const absl::optional<url::Origin>& origin);
diff --git a/content/browser/renderer_host/media/fake_video_capture_device_launcher.cc b/content/browser/renderer_host/media/fake_video_capture_device_launcher.cc index 95df258..d906387e 100644 --- a/content/browser/renderer_host/media/fake_video_capture_device_launcher.cc +++ b/content/browser/renderer_host/media/fake_video_capture_device_launcher.cc
@@ -18,8 +18,6 @@ namespace { -static const int kMaxBufferCount = 3; - class FakeLaunchedVideoCaptureDevice : public content::LaunchedVideoCaptureDevice { public: @@ -79,7 +77,7 @@ auto device = system_->CreateDevice(device_id); scoped_refptr<media::VideoCaptureBufferPool> buffer_pool( new media::VideoCaptureBufferPoolImpl( - media::VideoCaptureBufferType::kSharedMemory, kMaxBufferCount)); + media::VideoCaptureBufferType::kSharedMemory)); #if BUILDFLAG(IS_CHROMEOS_ASH) auto device_client = std::make_unique<media::VideoCaptureDeviceClient>( media::VideoCaptureBufferType::kSharedMemory,
diff --git a/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc b/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc index ab7663b..a17a2460 100644 --- a/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc +++ b/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc
@@ -25,6 +25,7 @@ #include "media/capture/video/fake_video_capture_device.h" #include "media/capture/video/fake_video_capture_device_factory.h" #include "media/capture/video/video_capture_buffer_pool_impl.h" +#include "media/capture/video/video_capture_buffer_pool_util.h" #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" #include "media/capture/video/video_capture_device_client.h" #include "media/capture/video/video_frame_receiver.h" @@ -74,7 +75,7 @@ // The maximum number of video frame buffers in-flight at any one time. This // value should be based on the logical capacity of the capture pipeline, and // not on hardware performance. -const int kMaxNumberOfBuffers = 4; +const int kMaxNumberOfBuffers = media::kVideoCaptureDefaultMaxBufferPoolSize; } // anonymous namespace
diff --git a/content/browser/renderer_host/media/video_capture_controller_unittest.cc b/content/browser/renderer_host/media/video_capture_controller_unittest.cc index d0dc7b3..494b282 100644 --- a/content/browser/renderer_host/media/video_capture_controller_unittest.cc +++ b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
@@ -34,6 +34,7 @@ #include "media/base/video_frame_metadata.h" #include "media/base/video_util.h" #include "media/capture/video/video_capture_buffer_pool_impl.h" +#include "media/capture/video/video_capture_buffer_pool_util.h" #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" #include "media/capture/video/video_capture_device_client.h" #include "media/capture/video/video_frame_receiver_on_task_runner.h"
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index d68e24f5..9b07757 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3428,6 +3428,7 @@ switches::kEnableUseZoomForDSF, switches::kEnableViewport, switches::kEnableVtune, + switches::kEnableWebGLDeveloperExtensions, switches::kEnableWebGLDraftExtensions, switches::kEnableWebGLImageChromium, switches::kFileUrlPathAlias,
diff --git a/content/browser/sms/webotp_service.cc b/content/browser/sms/webotp_service.cc index 1c5b3e39..90e19f5 100644 --- a/content/browser/sms/webotp_service.cc +++ b/content/browser/sms/webotp_service.cc
@@ -81,6 +81,46 @@ return false; } +Outcome FailureTypeToOutcome(SmsFetchFailureType failure_type) { + switch (failure_type) { + case SmsFetchFailureType::kPromptTimeout: + return Outcome::kTimeout; + case SmsFetchFailureType::kPromptCancelled: + return Outcome::kUserCancelled; + case SmsFetchFailureType::kCrossDeviceFailure: + return Outcome::kCrossDeviceFailure; + default: + NOTREACHED(); + return Outcome::kTimeout; + } +} + +Outcome SmsStatusToOutcome(SmsStatus status) { + switch (status) { + case SmsStatus::kSuccess: + return Outcome::kSuccess; + case SmsStatus::kUnhandledRequest: + return Outcome::kUnhandledRequest; + case SmsStatus::kAborted: + return Outcome::kAborted; + case SmsStatus::kCancelled: + return Outcome::kCancelled; + case SmsStatus::kBackendNotAvailable: + // Records when the backend is not available AND the request gets + // cancelled. i.e. client specifies GmsBackend.VERIFICATION but it's + // unavailable. If client specifies GmsBackend.AUTO and the verification + // backend is not available, we fall back to the user consent backend and + // the request will be handled accordingly. e.g. if the user declined the + // prompt, we record it as |kUserCancelled|. + return Outcome::kBackendNotAvailable; + default: + // The status |kTimeout| has been handled as part of the + // |delayed_rejection_reason_| handling logic. + NOTREACHED(); + return Outcome::kTimeout; + } +} + } // namespace WebOTPService::WebOTPService( @@ -153,7 +193,7 @@ start_time_ = base::TimeTicks::Now(); callback_ = std::move(callback); timeout_timer_.Reset(); - prompt_failure_.reset(); + delayed_rejection_reason_.reset(); // |one_time_code_| and prompt are still present from the previous request so // a new subscription is unnecessary. Note that it is only safe for us to use @@ -209,30 +249,6 @@ void WebOTPService::OnFailure(FailureType failure_type) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - switch (failure_type) { - case FailureType::kPromptTimeout: - case FailureType::kPromptCancelled: - // We do not complete the request here and instead rely on |OnTimeout| to - // complete the request. This delays the promise resolution for privacy - // reasons. e.g. if a promise gets resolved right after a user declines - // the prompt, sites would know that the SMS did reach the user and they - // could use such information for targeting. By using a timeout in all - // cases, it is not possible to distinguish between sms not being received - // and received but not shared. - // Note that we still unsubscribe it from the fetcher and |Unsubscribe| - // will be called again during the normal |CompleteRequest| process but it - // should be no-op. - prompt_failure_ = failure_type; - fetcher_->Unsubscribe(origin_list_, this); - return; - case FailureType::kBackendNotAvailable: - CompleteRequest(SmsStatus::kBackendNotAvailable); - return; - default: /* do nothing as it is handled below. */ - break; - } - - // Records Sms parsing failures. SmsParser::SmsParsingStatus status = SmsParsingStatus::kParsed; switch (failure_type) { case FailureType::kSmsNotParsed_OTPFormatRegexNotMatch: @@ -246,11 +262,28 @@ break; case FailureType::kPromptTimeout: case FailureType::kPromptCancelled: + case FailureType::kCrossDeviceFailure: + // We do not complete the request here and instead rely on |OnTimeout| to + // complete the request. This delays the promise resolution for privacy + // reasons. e.g. if a promise gets resolved right after a user declines + // the prompt, sites would know that the SMS did reach the user and they + // could use such information for targeting. By using a timeout in all + // cases, it is not possible to distinguish between sms not being received + // and received but not shared. + // Note that we still unsubscribe it from the fetcher and |Unsubscribe| + // will be called again during the normal |CompleteRequest| process but it + // should be no-op. + delayed_rejection_reason_ = failure_type; + fetcher_->Unsubscribe(origin_list_, this); + return; case FailureType::kBackendNotAvailable: + CompleteRequest(SmsStatus::kBackendNotAvailable); + return; case FailureType::kNoFailure: NOTREACHED(); - break; } + + // Records Sms parsing failures. DCHECK(status != SmsParsingStatus::kParsed); RecordSmsParsingStatus(status, render_frame_host()->GetPageUkmSourceId()); } @@ -309,7 +342,7 @@ } start_time_ = base::TimeTicks(); callback_.Reset(); - prompt_failure_.reset(); + delayed_rejection_reason_.reset(); fetcher_->Unsubscribe(origin_list_, this); } @@ -351,8 +384,8 @@ if (status == SmsStatus::kSuccess) { DCHECK(!receive_time_.is_null()); RecordContinueOnSuccessTime(base::TimeTicks::Now() - receive_time_); - } else if (prompt_failure_ && - prompt_failure_.value() == FailureType::kPromptCancelled) { + } else if (delayed_rejection_reason_ && delayed_rejection_reason_.value() == + FailureType::kPromptCancelled) { DCHECK(!receive_time_.is_null()); RecordCancelOnSuccessTime(base::TimeTicks::Now() - receive_time_); } @@ -376,49 +409,30 @@ // 4. before the timeout if the request is cancelled in favor of a new // request by the website. // In 2, 3 and 4, there is a different SmsStatus when trying to record metrics - // so we need to do it based on prompt_failure_. - if (prompt_failure_) { + // so we need to do it based on delayed_rejection_reason_. + if (delayed_rejection_reason_) { DCHECK_NE(status, SmsStatus::kSuccess); - if (prompt_failure_.value() == FailureType::kPromptCancelled) { - RecordSmsOutcome(Outcome::kUserCancelled, source_id, recorder, - is_cross_origin_frame); + // Records Outcome for requests which we reject with delay. + RecordSmsOutcome(FailureTypeToOutcome(delayed_rejection_reason_.value()), + source_id, recorder, is_cross_origin_frame); + + if (delayed_rejection_reason_.value() == FailureType::kPromptCancelled) { RecordSmsUserCancelTime(base::TimeTicks::Now() - start_time_, source_id, recorder); - } else if (prompt_failure_.value() == FailureType::kPromptTimeout) { - RecordSmsOutcome(Outcome::kTimeout, source_id, recorder, - is_cross_origin_frame); } - prompt_failure_.reset(); + delayed_rejection_reason_.reset(); return; } + // Records Outcome for requests which we resolve / reject immediately. + RecordSmsOutcome(SmsStatusToOutcome(status), source_id, recorder, + is_cross_origin_frame); if (status == SmsStatus::kSuccess) { - RecordSmsOutcome(Outcome::kSuccess, source_id, recorder, - is_cross_origin_frame); RecordSmsSuccessTime(base::TimeTicks::Now() - start_time_, source_id, recorder); - } else if (status == SmsStatus::kUnhandledRequest) { - RecordSmsOutcome(Outcome::kUnhandledRequest, source_id, recorder, - is_cross_origin_frame); - } else if (status == SmsStatus::kAborted) { - RecordSmsOutcome(Outcome::kAborted, source_id, recorder, - is_cross_origin_frame); } else if (status == SmsStatus::kCancelled) { - RecordSmsOutcome(Outcome::kCancelled, source_id, recorder, - is_cross_origin_frame); RecordSmsCancelTime(base::TimeTicks::Now() - start_time_); - } else if (status == SmsStatus::kBackendNotAvailable) { - // Records when the backend is not available AND the request gets cancelled. - // i.e. client specifies GmsBackend.VERIFICATION but it's unavailable. If - // client specifies GmsBackend.AUTO and the verification backend is not - // available, we fall back to the user consent backend and the request will - // be handled accordingly. e.g. if the user declined the prompt, we record - // it as |kUserCancelled|. - RecordSmsOutcome(Outcome::kBackendNotAvailable, source_id, recorder, - is_cross_origin_frame); } - // The status |kTimeout| has been handled as part of the |prompt_failure_| - // handling logic. } void WebOTPService::OnUserConsentComplete(UserConsentResult result) {
diff --git a/content/browser/sms/webotp_service.h b/content/browser/sms/webotp_service.h index c732dfb..f7861b58 100644 --- a/content/browser/sms/webotp_service.h +++ b/content/browser/sms/webotp_service.h
@@ -99,7 +99,7 @@ // Timer to trigger timeout for any pending request. We (re)arm the timer // every time we receive a new request. base::DelayTimer timeout_timer_; - absl::optional<FailureType> prompt_failure_; + absl::optional<FailureType> delayed_rejection_reason_; // The ptr is valid only when we are handling an incoming otp response. std::unique_ptr<UserConsentHandler> consent_handler_;
diff --git a/content/browser/sms/webotp_service_unittest.cc b/content/browser/sms/webotp_service_unittest.cc index 7741463..2b02338 100644 --- a/content/browser/sms/webotp_service_unittest.cc +++ b/content/browser/sms/webotp_service_unittest.cc
@@ -1210,4 +1210,17 @@ ExpectOutcomeUKM(url, blink::WebOTPServiceOutcome::kCancelled); } +TEST_F(WebOTPServiceTest, + RecordCrossDeviceFailureAsOutcomeUponPreviousRequestCancelled) { + RecordFailureOutcomeUponPreviousRequestCancelled( + FailureType::kCrossDeviceFailure, + blink::WebOTPServiceOutcome::kCrossDeviceFailure); +} + +TEST_F(WebOTPServiceTest, RecordCrossDeviceFailureAsOutcomeUponDestruction) { + RecordFailureOutcomeUponDestruction( + FailureType::kCrossDeviceFailure, + blink::WebOTPServiceOutcome::kCrossDeviceFailure); +} + } // namespace content
diff --git a/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc b/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc index 14148a12..c6d960c 100644 --- a/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc +++ b/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc
@@ -9,7 +9,6 @@ #include "base/files/file_util.h" #include "base/process/process_handle.h" #include "base/strings/string_number_conversions.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/webrtc/webrtc_content_browsertest_base.h" @@ -81,13 +80,8 @@ WebRtcAudioDebugRecordingsBrowserTest() { // Automatically grant device permission. AppendUseFakeUIForMediaStreamFlag(); - // Allow Plan B. - scoped_features_.InitAndEnableFeature( - blink::features::kRTCAllowPlanBOutsideDeprecationTrial); } ~WebRtcAudioDebugRecordingsBrowserTest() override {} - - base::test::ScopedFeatureList scoped_features_; }; #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/content/browser/webrtc/webrtc_browsertest.cc b/content/browser/webrtc/webrtc_browsertest.cc index ed7b895b..20e9843 100644 --- a/content/browser/webrtc/webrtc_browsertest.cc +++ b/content/browser/webrtc/webrtc_browsertest.cc
@@ -4,7 +4,6 @@ #include "base/command_line.h" #include "base/files/file_util.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -43,9 +42,6 @@ WebRtcContentBrowserTestBase::SetUpCommandLine(command_line); // Automatically grant device permission. AppendUseFakeUIForMediaStreamFlag(); - // Allow Plan B. - scoped_features_.InitAndEnableFeature( - blink::features::kRTCAllowPlanBOutsideDeprecationTrial); } protected: @@ -60,8 +56,6 @@ // the javascript and waits for "OK". MakeTypicalCall(javascript, "/media/peerconnection-setConfiguration.html"); } - - base::test::ScopedFeatureList scoped_features_; }; IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, CanSetupAudioAndVideoCall) {
diff --git a/content/browser/webrtc/webrtc_data_browsertest.cc b/content/browser/webrtc/webrtc_data_browsertest.cc index 8d3ac5c..bb5f2d1 100644 --- a/content/browser/webrtc/webrtc_data_browsertest.cc +++ b/content/browser/webrtc/webrtc_data_browsertest.cc
@@ -4,7 +4,6 @@ #include "base/command_line.h" #include "base/files/file_util.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -40,9 +39,6 @@ WebRtcContentBrowserTestBase::SetUpCommandLine(command_line); // Automatically grant device permission. AppendUseFakeUIForMediaStreamFlag(); - // Allow Plan B. - scoped_features_.InitAndEnableFeature( - blink::features::kRTCAllowPlanBOutsideDeprecationTrial); } protected: @@ -51,8 +47,6 @@ void MakeTypicalPeerConnectionCall(const std::string& javascript) { MakeTypicalCall(javascript, "/media/peerconnection-call-data.html"); } - - base::test::ScopedFeatureList scoped_features_; }; IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcDataBrowserTest, CanSetupLegacyCall) {
diff --git a/content/browser/webrtc/webrtc_stress_pause_browsertest.cc b/content/browser/webrtc/webrtc_stress_pause_browsertest.cc index 006aba1..2d08d01 100644 --- a/content/browser/webrtc/webrtc_stress_pause_browsertest.cc +++ b/content/browser/webrtc/webrtc_stress_pause_browsertest.cc
@@ -5,7 +5,6 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -45,16 +44,12 @@ WebRtcContentBrowserTestBase::SetUpCommandLine(command_line); // Automatically grant device permission. AppendUseFakeUIForMediaStreamFlag(); - // Allow Plan B. - scoped_features_.InitAndEnableFeature( - blink::features::kRTCAllowPlanBOutsideDeprecationTrial); } protected: void MakeTypicalPeerConnectionCall(const std::string& javascript) { MakeTypicalCall(javascript, "/media/peerconnection-pause-play.html"); } - base::test::ScopedFeatureList scoped_features_; }; IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcStressPauseBrowserTest,
diff --git a/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc b/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc index 0acf6114..143005d 100644 --- a/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc +++ b/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc
@@ -5,7 +5,6 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -48,16 +47,12 @@ WebRtcContentBrowserTestBase::SetUpCommandLine(command_line); // Automatically grant device permission. AppendUseFakeUIForMediaStreamFlag(); - // Allow Plan B. - scoped_features_.InitAndEnableFeature( - blink::features::kRTCAllowPlanBOutsideDeprecationTrial); } protected: void MakeTypicalPeerConnectionCall(const std::string& javascript) { MakeTypicalCall(javascript, "/media/peerconnection-resolution-switch.html"); } - base::test::ScopedFeatureList scoped_features_; }; IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcStressResolutionSwitchBrowserTest,
diff --git a/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc b/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc index f785516..028529bf 100644 --- a/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc +++ b/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc
@@ -5,7 +5,6 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -50,9 +49,6 @@ WebRtcContentBrowserTestBase::SetUpCommandLine(command_line); // Automatically grant device permission. AppendUseFakeUIForMediaStreamFlag(); - // Allow Plan B. - scoped_features_.InitAndEnableFeature( - blink::features::kRTCAllowPlanBOutsideDeprecationTrial); } protected: @@ -60,7 +56,6 @@ MakeTypicalCall(javascript, "/media/peerconnection-source-feed-switch.html"); } - base::test::ScopedFeatureList scoped_features_; }; IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcStressSourceSwitchBrowserTest,
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 63b56f90..e7af36c 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -466,6 +466,8 @@ {wrf::EnableSharedWorker, switches::kDisableSharedWorkers, false}, {wrf::EnableTextFragmentAnchor, switches::kDisableScrollToTextFragment, false}, + {wrf::EnableWebGLDeveloperExtensions, + switches::kEnableWebGLDeveloperExtensions, true}, {wrf::EnableWebGLDraftExtensions, switches::kEnableWebGLDraftExtensions, true}, {wrf::EnableWebGPU, switches::kEnableUnsafeWebGPU, true},
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index 0703cbb..c279e1163 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -54,6 +54,7 @@ #include "services/device/public/cpp/geolocation/location_provider.h" #include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/web_transport.mojom.h"
diff --git a/content/public/browser/navigation_controller.cc b/content/public/browser/navigation_controller.cc index 58ae7d6c..775fff0 100644 --- a/content/public/browser/navigation_controller.cc +++ b/content/public/browser/navigation_controller.cc
@@ -8,6 +8,7 @@ #include "build/build_config.h" #include "content/public/browser/page_navigator.h" #include "content/public/browser/render_frame_host.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/blink/public/mojom/navigation/was_activated_option.mojom.h" namespace content {
diff --git a/content/public/browser/page_navigator.h b/content/public/browser/page_navigator.h index db7685b5..09fcacd 100644 --- a/content/public/browser/page_navigator.h +++ b/content/public/browser/page_navigator.h
@@ -22,7 +22,6 @@ #include "content/public/common/referrer.h" #include "ipc/ipc_message.h" #include "services/network/public/cpp/resource_request_body.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/navigation/impression.h" #include "third_party/blink/public/common/tokens/tokens.h" @@ -31,6 +30,10 @@ #include "ui/base/window_open_disposition.h" #include "url/gurl.h" +namespace network { +class SharedURLLoaderFactory; +} + namespace content { class NavigationHandle;
diff --git a/content/public/browser/sms_fetcher.h b/content/public/browser/sms_fetcher.h index ce19cb7..13f68324 100644 --- a/content/public/browser/sms_fetcher.h +++ b/content/public/browser/sms_fetcher.h
@@ -30,7 +30,11 @@ // The underlying API is not available kBackendNotAvailable = 6, - kMaxValue = kBackendNotAvailable, + + // Failure type when using WebOTP on desktop + kCrossDeviceFailure = 7, + + kMaxValue = kCrossDeviceFailure, }; // TODO(yigu): Do not use anonymous namespace in header.
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index bf0799bf..a6e03c4 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -449,6 +449,11 @@ const char kEnableWebAuthDeprecatedMojoTestingApi[] = "enable-web-auth-deprecated-mojo-testing-api"; +// Enables WebGL developer extensions which are not generally exposed +// to the web platform. +const char kEnableWebGLDeveloperExtensions[] = + "enable-webgl-developer-extensions"; + // Enables WebGL extensions not yet approved by the community. const char kEnableWebGLDraftExtensions[] = "enable-webgl-draft-extensions";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index b960b6e..e6d138e 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -130,6 +130,7 @@ CONTENT_EXPORT extern const char kEnableViewport[]; CONTENT_EXPORT extern const char kEnableVtune[]; CONTENT_EXPORT extern const char kEnableWebAuthDeprecatedMojoTestingApi[]; +CONTENT_EXPORT extern const char kEnableWebGLDeveloperExtensions[]; CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[]; CONTENT_EXPORT extern const char kEnableWebGLImageChromium[]; CONTENT_EXPORT extern const char kEnableWebVR[];
diff --git a/content/test/data/conversions/databases/version_1.sql b/content/test/data/conversions/databases/version_1.sql index 30605718..9188982 100644 --- a/content/test/data/conversions/databases/version_1.sql +++ b/content/test/data/conversions/databases/version_1.sql
@@ -2,7 +2,7 @@ BEGIN TRANSACTION; -CREATE TABLE impressions (impression_id INTEGER PRIMARY KEY, impression_data TEXT NOT NULL, impression_origin TEXT NOT NULL, conversion_origin TEXT NOT NULL, reporting_origin TEXT NOT NULL, impression_time INTEGER NOT NULL, expiry_time INTEGER NOT NULL, num_conversions INTEGER DEFAULT 0, active INTEGER DEFAULT 1); +CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1); INSERT INTO impressions VALUES(1, @@ -15,9 +15,9 @@ 0, 1); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL, attribution_credit INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,attribution_credit INTEGER NOT NULL); -CREATE INDEX conversion_origin_idx ON impressions(active, conversion_origin, reporting_origin); +CREATE INDEX conversion_origin_idx ON impressions(active,conversion_origin,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time);
diff --git a/content/test/data/conversions/databases/version_2.sql b/content/test/data/conversions/databases/version_2.sql index e0d89d7b..bf3037a 100644 --- a/content/test/data/conversions/databases/version_2.sql +++ b/content/test/data/conversions/databases/version_2.sql
@@ -16,7 +16,7 @@ 1, 'https://conversion.test/'); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL, attribution_credit INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,attribution_credit INTEGER NOT NULL); CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); @@ -32,6 +32,6 @@ CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); COMMIT;
diff --git a/content/test/data/conversions/databases/version_3.sql b/content/test/data/conversions/databases/version_3.sql index b4432da..24a7f9f 100644 --- a/content/test/data/conversions/databases/version_3.sql +++ b/content/test/data/conversions/databases/version_3.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL, attribution_credit INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,attribution_credit INTEGER NOT NULL); CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); @@ -12,7 +12,7 @@ INSERT INTO meta VALUES('version','3'); INSERT INTO meta VALUES('last_compatible_version','3'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time);
diff --git a/content/test/data/conversions/databases/version_4.sql b/content/test/data/conversions/databases/version_4.sql index d9b986d6..0e740c9 100644 --- a/content/test/data/conversions/databases/version_4.sql +++ b/content/test/data/conversions/databases/version_4.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL, attribution_credit INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,attribution_credit INTEGER NOT NULL); CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL); @@ -14,7 +14,7 @@ INSERT INTO meta VALUES('version','4'); INSERT INTO meta VALUES('last_compatible_version','3'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time); @@ -24,7 +24,7 @@ CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type, conversion_destination, impression_site, conversion_time); +CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time); CREATE INDEX rate_limit_conversion_time_idx ON rate_limits(conversion_time);
diff --git a/content/test/data/conversions/databases/version_5.sql b/content/test/data/conversions/databases/version_5.sql index e10d13b..14f755b 100644 --- a/content/test/data/conversions/databases/version_5.sql +++ b/content/test/data/conversions/databases/version_5.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL); CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL); @@ -14,7 +14,7 @@ INSERT INTO meta VALUES('version','5'); INSERT INTO meta VALUES('last_compatible_version','5'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time); @@ -24,7 +24,7 @@ CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type, conversion_destination, impression_site, conversion_time); +CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time); CREATE INDEX rate_limit_conversion_time_idx ON rate_limits(conversion_time);
diff --git a/content/test/data/conversions/databases/version_6.sql b/content/test/data/conversions/databases/version_6.sql index 6c9a6d2..67365cc 100644 --- a/content/test/data/conversions/databases/version_6.sql +++ b/content/test/data/conversions/databases/version_6.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL); CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL); @@ -14,7 +14,7 @@ INSERT INTO meta VALUES('version','6'); INSERT INTO meta VALUES('last_compatible_version','6'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time); @@ -24,7 +24,7 @@ CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type, conversion_destination, impression_site, conversion_time); +CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time); CREATE INDEX rate_limit_conversion_time_idx ON rate_limits(conversion_time);
diff --git a/content/test/data/conversions/databases/version_7.sql b/content/test/data/conversions/databases/version_7.sql index 8eb5cd6..543d96f7 100644 --- a/content/test/data/conversions/databases/version_7.sql +++ b/content/test/data/conversions/databases/version_7.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER, conversion_data TEXT NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER,conversion_data TEXT NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL); CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL); @@ -14,19 +14,19 @@ INSERT INTO meta VALUES('version','7'); INSERT INTO meta VALUES('last_compatible_version','7'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time); CREATE INDEX impression_origin_idx ON impressions(impression_origin); -CREATE INDEX impression_site_idx ON impressions(active, impression_site, source_type); +CREATE INDEX impression_site_idx ON impressions(active,impression_site,source_type); CREATE INDEX conversion_report_idx ON conversions(report_time); CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type, conversion_destination, impression_site, conversion_time); +CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time); CREATE INDEX rate_limit_conversion_time_idx ON rate_limits(conversion_time);
diff --git a/content/test/data/conversions/databases/version_8.sql b/content/test/data/conversions/databases/version_8.sql index d6ede342..a9ec23e 100644 --- a/content/test/data/conversions/databases/version_8.sql +++ b/content/test/data/conversions/databases/version_8.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER NOT NULL, conversion_data INTEGER NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL); CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL); @@ -14,19 +14,19 @@ INSERT INTO meta VALUES('version','8'); INSERT INTO meta VALUES('last_compatible_version','8'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time); CREATE INDEX impression_origin_idx ON impressions(impression_origin); -CREATE INDEX impression_site_idx ON impressions(active, impression_site, source_type); +CREATE INDEX impression_site_idx ON impressions(active,impression_site,source_type); CREATE INDEX conversion_report_idx ON conversions(report_time); CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type, conversion_destination, impression_site, conversion_time); +CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time); CREATE INDEX rate_limit_conversion_time_idx ON rate_limits(conversion_time);
diff --git a/content/test/data/conversions/databases/version_9.sql b/content/test/data/conversions/databases/version_9.sql index 665ea7b..c60db91 100644 --- a/content/test/data/conversions/databases/version_9.sql +++ b/content/test/data/conversions/databases/version_9.sql
@@ -4,7 +4,7 @@ CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL); -CREATE TABLE conversions (conversion_id INTEGER PRIMARY KEY, impression_id INTEGER NOT NULL, conversion_data INTEGER NOT NULL, conversion_time INTEGER NOT NULL, report_time INTEGER NOT NULL, priority INTEGER NOT NULL); +CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL); CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL); @@ -14,19 +14,19 @@ INSERT INTO meta VALUES('version','9'); INSERT INTO meta VALUES('last_compatible_version','9'); -CREATE INDEX conversion_destination_idx ON impressions(active, conversion_destination, reporting_origin); +CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); CREATE INDEX impression_expiry_idx ON impressions(expiry_time); CREATE INDEX impression_origin_idx ON impressions(impression_origin); -CREATE INDEX impression_site_idx ON impressions(active, impression_site, source_type); +CREATE INDEX impression_site_idx ON impressions(active,impression_site,source_type); CREATE INDEX conversion_report_idx ON conversions(report_time); CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); -CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type, conversion_destination, impression_site, conversion_time); +CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time); CREATE INDEX rate_limit_conversion_time_idx ON rate_limits(conversion_time);
diff --git a/docs/lacros.md b/docs/lacros.md index 2468bf5..986ca4d 100644 --- a/docs/lacros.md +++ b/docs/lacros.md
@@ -73,11 +73,6 @@ ## GN var and C++ macros -*Note* that this will take effect once target_os flip of lacros-chrome is landed -with patch [crrev.com/c/2644407](https://crrev.com/c/2644407). For a short while -please keep using `BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS` -and `is_chromeos_ash || is_chromeos_lacros` to target both binaries. - Both lacros and ash are built with gn arg `target_os="chromeos"`. This means that C++ macro defined(OS_CHROMEOS) and gn variable is_chromeos are set true for both lacros and ash.
diff --git a/docs/mac_lld.md b/docs/mac_lld.md index db28facf..9f421a3 100644 --- a/docs/mac_lld.md +++ b/docs/mac_lld.md
@@ -1,32 +1,27 @@ # LLD for Mac builds -*Disclaimer* We don't use LLD for Mac builds. Using it is not supported, and -if you try to use it, it likely won't work. Only keep reading if you want to -work on the build. +Like on most other platforms, Chromium uses the LLD linker on macOS. +This is a recent change. If things go well, it will ship in m93, +but we might discover showstopper bugs that delay things a bit. + ## Background Chromium uses [LLD](https://lld.llvm.org/) as linker on all platforms, -except when targeting macOS or iOS. LLD is faster than other ELF linkers (ELF +except when targeting iOS. LLD is faster than other ELF linkers (ELF is the executable file format used on most OSs, including Linux, Android, Chrome OS, Fuchsia), and it's faster than other COFF linkers (the executable file format on Windows). -ld64, the standard Mach-O linker (the executable file format on iOS and macOS), -is on the other hand already fairly fast and works well, so there are fewer -advantages to using LLD here. (Having said that, LLD is currently 4x faster -at linking Chromium Framework than ld64 in symbol\_level=0 release builds, -despite ld64 being already fast. Maybe that's due to LLD not yet doing -critical things and it will get slower, but at the moment it's faster than -ld64.) +LLD is currently 3-4x faster at linking Chromium Framework than ld64, the macOS +system linker in symbol\_level=0 release builds, despite ld64 being already +fast. -LLD does have a few advantages unrelated to speed, however: +LLD has advantages unrelated to speed, too: -- It's developed in the LLVM repository, and we ship it in our clang package - (except on macOS, where it's not in the default clang package but an opt-in - download instead). We can fix issues upstream and quickly deploy fixed - versions, instead of having to wait for Xcode releases (which is where ld64 - ships). +- It's developed in the LLVM repository, and we ship it in our clang package. + We can fix issues upstream and quickly deploy fixed versions, instead of + having to wait for Xcode releases (which is where ld64 ships). - For the same reason, it has a much simpler LTO setup: Clang and LLD both link in the same LLVM libraries that are built at the same revision, and compiler @@ -38,13 +33,12 @@ (ld64 supports this too as of Xcode 12, but we had to wait many years for it, and it's currently [too crashy](https://crbug.com/1147968) to be usable). -For that reason, it's possible to opt in to LLD for macOS builds (not for -iOS builds, and that's intentionally not in scope). +- While LLD for ELF, LLD for COFF, and LLD for MachO are mostly independent + codebases, they all use LLVM libraries. That gives them similar behavior. + Using LLD unifies the build across platforms somewhat. -A background note: There are two versions of LLD upstream: The newer ports, -and an older design that's still available as ld64.lld.darwinold for Mach-O -LLD. We use the new `lld/MachO` port, not the old one. The new one is the -default selection for `-fuse-ld=lld` on macOS as of March 1 2021. +For that reason, we moved to LLD for macOS builds (not for iOS builds, +that's intentionally not in scope at the moment). Just like the LLD ELF port tries to be commandline-compatible with other ELF linkers and the LLD COFF port tries to be commandline-compatible with the @@ -54,45 +48,22 @@ ## Current status and known issues -A `symbol_level = 0` `is_debug = false` `use_lld = true` x64 build produces -a mostly-working Chromium.app, but there are open issues and missing features: +LLD is used by default in all build configurations except for PGO +profile collection builds ([bug](https://crbug.com/1220128)). All +tests on all bots are passing, both Intel and Arm. -- LLD's ARM support is fairly new - - Chromium crashes very early during startup ([bug](https://llvm.org/PR50411)) - - likely other bugs for `target_cpu="arm64"` -- Some tests fail, see mac-rel job on https://chromium-review.googlesource.com/c/chromium/src/+/2885356 - - Two crashpad_tests fail - ([fixed upstream](https://reviews.llvm.org/rGb4ead2c37bcbb1f81919c68e2a2a227aac90f07c)) - - LLD-linked Chromium fails to run on macOS 10.14 or earlier - ([bug](https://llvm.org/PR49800)) -- LLD doesn't yet implement `-dead_strip`, leading to many linker warnings -- LLD doesn't yet implement deduplication (aka "ICF") -- LLD doesn't yet implement call graph profile sort +There are a few open issues: -## Opting in +- LLD implements deduplication (aka "ICF"), but it's not enabled by + default. We don't turn it on yet. +- LLD doesn't yet implement call graph profile sort. +- LTO support in LLD/macOS isn't complete yet, and we don't use LTO + on macOS yet for that reason. -1. First, obtain lld. Do either of: +## Hacking on LLD - 1. Do nothing. Chromium's hooks already downloaded a prebuilt lld binary - for you. - 2. build `lld` and `llvm-ar` locally and copy it to - `third_party/llvm-build/Release+Asserts/bin`. Also run - `ln -s lld third_party/llvm-build/Release+Asserts/bin/ld64.lld`. - - You have to do this again every time `runhooks` updates the clang - package. - - The prebuilt might work less well than a more up-to-date, locally-built - version -- see the list of open issues above for details. If anything is - marked "fixed upstream", then the fix is upstream but not yet in the - prebuilt lld binary. - -2. Add `use_lld = true` to your args.gn - -3. Then just build normally. - -`use_lld = true` makes the build use thin archives. For that reason, `use_lld` -also switches from `libtool` to `llvm-ar`. +If you want to work on LLD, follow +[this paragraph](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/clang.md#Using-a-custom-clang-binary). ## Creating stand-alone repros for bugs @@ -100,22 +71,4 @@ env var is sufficient. See "Note to self:" [here](https://bugs.llvm.org/show_bug.cgi?id=48657#c0) for -making a repro file that involved the full app and framework bundles. - -Locally, apply this patch before building chrome to make a repro that can -be used with both lld and ld (useful for making comparisons): - - diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn - index 5ea2f2130abb..ed871642cee9 100644 - --- a/build/config/compiler/BUILD.gn - +++ b/build/config/compiler/BUILD.gn - @@ -1780,7 +1780,7 @@ config("export_dynamic") { - config("thin_archive") { - # The macOS and iOS default linker ld64 does not support reading thin - # archives. - - if ((is_posix && !is_nacl && (!is_apple || use_lld)) || is_fuchsia) { - + if ((is_posix && !is_nacl && (!is_apple)) || is_fuchsia) { - arflags = [ "-T" ] - } else if (is_win && use_lld) { - arflags = [ "/llvmlibthin" ] - +making a repro file that involved the full app and framework bundles. \ No newline at end of file
diff --git a/docs/profiling.md b/docs/profiling.md index a18340d..4f9b149 100644 --- a/docs/profiling.md +++ b/docs/profiling.md
@@ -1,5 +1,6 @@ # CPU Profiling Chrome + [TOC] ## Introduction @@ -257,14 +258,17 @@ Find the PID for all child processes of Chromium: $ pgrep -P $CHROMIUM_PID -Combine commands to run tool for Chromium and all and all it's children: +Combine commands to run tool for Chromium and all its children: $ cat <(pgrep -x Chromium) <(pgrep -P $(pgrep -x Chromium)) | xargs $MY_TOOL --pid ## Checkout setup +Profiling should always be done on a build that represents the performance of official builds as much as possible. `is_official_build` enables some additional optimizations like PGO. is_debug = false - + is_component_build = false + is_official_build = true + # Most profiling techniques on macOS will work with minimal symbols for local builds. # You should try and use minimal symbols when starting out because most tools will take # an incredibly long time to process the symbols and in some cases will freeze the application @@ -272,6 +276,9 @@ blink_symbol_level = 0 symbol_level = 0 +## Viewing traces. +Once collected the traces produced by any tool in this section can be converted to pprof using [InstrumentsToPprof](https://github.com/google/instrumentsToPprof#instrumentstopprof). + ## Tools ### Sample @@ -284,10 +291,48 @@ #### Usage Sample stacks of $pid for 10 seconds grabbing a stack every 1ms. [-maydie] to still have stacks if process exits. + $ sample $pid 10 1 -mayDie -f ./output.txt ### Instruments - $TODO(http://crbug.com/1201656) : Fill this in. +#### Pros +* Ships with macOS. +* Can produce much more than sampling profiles via different modes. +* Is low overhead. +* Only captures cpu-active stacks (In Time Profiler mode) so no idle stack filtering is needed. +#### Cons +* Cannot produce human-readable reports fully automatically. (Requires use of GUI) +* Built-in trace viewer is quite underpowered. + +#### Usage +To get a trace use either the GUI in the "Time Profiler" mode or this command: + + $ xcrun -r xctrace record --template 'Time Profiler' --all-processes --time-limit 30s --output 'profile.trace' ### DTrace - $TODO(http://crbug.com/1201656) : Fill this in. +#### Pros +* Ships with macOS. +* Can produce much more than sampling profiles via different probes. +* Supports scripting. +* Is low overhead. +* Only captures cpu-active stacks so no idle stack filtering is needed. +* Can be used fully from the command-line / script. +#### Cons +* Requires partially disabling SIP + +#### SIP +By default `dtrace` does not work well with [SIP](https://support.apple.com/en-us/HT204899). Disabling SIP as a whole is not recommended and instead should be done only for DTrace using these steps: + +* Reboot in recovery mode +* Start a shell +* Execute `csrutil enable --without dtrace --without debug` +* Reboot + +#### Usage +To get sampled cpu stacks + + $ dtrace -p $PID -o $OUTPUT_FILE -n "profile-1001/pid == $PID/ {{ @[ustack()] = count(); }}" + +To get stacks that caused wake-ups + + $ dtrace -p $PID -o $OUTPUT_FILE -n "mach_kernel::wakeup/pid == $PID/ {{ @[ustack()] = count(); }}"
diff --git a/extensions/browser/api/messaging/extension_message_port.cc b/extensions/browser/api/messaging/extension_message_port.cc index 8fcc08e..c14ef47e 100644 --- a/extensions/browser/api/messaging/extension_message_port.cc +++ b/extensions/browser/api/messaging/extension_message_port.cc
@@ -219,14 +219,12 @@ base::WeakPtr<ChannelDelegate> channel_delegate, const PortId& port_id, const std::string& extension_id, - const ChannelEndpoint& endpoint, - bool include_child_frames) { + const ChannelEndpoint& endpoint) { if (endpoint.is_for_render_frame()) { return std::make_unique<ExtensionMessagePort>( channel_delegate, port_id, extension_id, endpoint.GetRenderFrameHost(), - include_child_frames); + /*include_child_frames=*/false); } - DCHECK(!include_child_frames); // NOTE: We don't want all the workers within the extension, so we cannot // reuse other constructor from above. std::unique_ptr<ExtensionMessagePort> port(new ExtensionMessagePort(
diff --git a/extensions/browser/api/messaging/extension_message_port.h b/extensions/browser/api/messaging/extension_message_port.h index 838ac93..925d8f2 100644 --- a/extensions/browser/api/messaging/extension_message_port.h +++ b/extensions/browser/api/messaging/extension_message_port.h
@@ -62,8 +62,7 @@ base::WeakPtr<ChannelDelegate> channel_delegate, const PortId& port_id, const std::string& extension_id, - const ChannelEndpoint& endpoint, - bool include_child_frames); + const ChannelEndpoint& endpoint); ~ExtensionMessagePort() override;
diff --git a/extensions/browser/api/messaging/message_service.cc b/extensions/browser/api/messaging/message_service.cc index 2a02eb24..c78fd3c0 100644 --- a/extensions/browser/api/messaging/message_service.cc +++ b/extensions/browser/api/messaging/message_service.cc
@@ -222,7 +222,7 @@ weak_factory_.GetWeakPtr(), source_port_id, source_endpoint.extension_id ? *source_endpoint.extension_id : ExtensionId(), - source, false /* include_child_frames */); + source); } if (!opener_port->IsValidPort()) return; @@ -376,8 +376,7 @@ std::unique_ptr<ExtensionMessagePort> opener_port = ExtensionMessagePort::CreateForEndpoint( - weak_factory_.GetWeakPtr(), source_port_id, extension->id(), source, - false /* include_child_frames */); + weak_factory_.GetWeakPtr(), source_port_id, extension->id(), source); if (!opener_port->IsValidPort()) return; @@ -458,8 +457,7 @@ std::unique_ptr<ExtensionMessagePort> opener_port = ExtensionMessagePort::CreateForEndpoint( - weak_factory_.GetWeakPtr(), source_port_id, extension_id, source, - false /* include_child_frames */); + weak_factory_.GetWeakPtr(), source_port_id, extension_id, source); if (!opener_port->IsValidPort()) return;
diff --git a/extensions/renderer/activity_log_converter_strategy_unittest.cc b/extensions/renderer/activity_log_converter_strategy_unittest.cc index f0d6c542..e7577dd 100644 --- a/extensions/renderer/activity_log_converter_strategy_unittest.cc +++ b/extensions/renderer/activity_log_converter_strategy_unittest.cc
@@ -56,10 +56,9 @@ testing::AssertionResult VerifyDouble(v8::Local<v8::Value> v8_value, double expected) { - double out; std::unique_ptr<base::Value> value( converter_->FromV8Value(v8_value, context())); - if (value->is_double() && value->GetAsDouble(&out) && out == expected) + if (value->is_double() && value->GetDouble() == expected) return testing::AssertionSuccess(); return testing::AssertionFailure(); }
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index 0160fe87..87e2506 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -2319,14 +2319,17 @@ }, { "id": 256, - "description": "Don't expose disjoint_timer_query extensions to WebGL unless site isolation is enabled", - "cr_bugs": [808744], - "os": { - "type": "android" - }, - "disabled_webgl_extensions": [ - "EXT_disjoint_timer_query", - "EXT_disjoint_timer_query_webgl2" + "description": "Expose WebGL's disjoint_timer_query extensions on platforms with site isolation", + "cr_bugs": [808744, 870491], + "features": [ + "enable_webgl_timer_query_extensions" + ], + "exceptions": [ + { + "os": { + "type": "android" + } + } ] }, {
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt index 39d71b1..b7e265f 100644 --- a/gpu/config/gpu_workaround_list.txt +++ b/gpu/config/gpu_workaround_list.txt
@@ -65,6 +65,7 @@ emulate_abs_int_function emulate_isnan_on_float enable_bgra8_overlays_with_yuv_overlay_support +enable_webgl_timer_query_extensions etc1_power_of_two_only exit_on_context_lost flush_on_framebuffer_change
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index c97ea4f..d8f21c5 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -2896,7 +2896,7 @@ cipd_version: "refs/heads/master" cmd: "luciexe" } - properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$build/reclient\":{\"instance\":\"rbe-chromium-trusted\",\"jobs\":500,\"metrics_project\":\"chromium-reclient-metrics\"},\"$kitchen\":{\"devshell\":true,\"emulate_gce\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"$recipe_engine/resultdb/test_presentation\":{\"column_keys\":[],\"grouping_keys\":[\"status\",\"v.test_suite\"]},\"builder_group\":\"chromium.fyi\",\"recipe\":\"reclient_goma_comparison\"}" + properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":250,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$build/reclient\":{\"instance\":\"rbe-chromium-trusted\",\"jobs\":250,\"metrics_project\":\"chromium-reclient-metrics\"},\"$kitchen\":{\"devshell\":true,\"emulate_gce\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"$recipe_engine/resultdb/test_presentation\":{\"column_keys\":[],\"grouping_keys\":[\"status\",\"v.test_suite\"]},\"builder_group\":\"chromium.fyi\",\"recipe\":\"reclient_goma_comparison\"}" execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -25919,11 +25919,11 @@ cipd_version: "refs/heads/master" cmd: "luciexe" } - properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"$recipe_engine/resultdb/test_presentation\":{\"column_keys\":[],\"grouping_keys\":[\"status\",\"v.test_suite\"]},\"builder_group\":\"chromium.mac\",\"recipe\":\"chromium\",\"xcode_build_version\":\"12d4e\"}" + properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"$recipe_engine/resultdb/test_presentation\":{\"column_keys\":[],\"grouping_keys\":[\"status\",\"v.test_suite\"]},\"builder_group\":\"chromium.mac\",\"recipe\":\"chromium\",\"xcode_build_version\":\"13a5155e\"}" execution_timeout_secs: 10800 caches { - name: "xcode_ios_12d4e" - path: "xcode_ios_12d4e.app" + name: "xcode_ios_13a5155e" + path: "xcode_ios_13a5155e.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -50757,7 +50757,7 @@ cipd_version: "refs/heads/master" cmd: "luciexe" } - properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"$recipe_engine/resultdb/test_presentation\":{\"column_keys\":[],\"grouping_keys\":[\"status\",\"v.test_suite\"]},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12d4e\"}" + properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"$recipe_engine/resultdb/test_presentation\":{\"column_keys\":[],\"grouping_keys\":[\"status\",\"v.test_suite\"]},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"13a5155e\"}" execution_timeout_secs: 14400 expiration_secs: 7200 grace_period { @@ -50768,8 +50768,8 @@ path: "win_toolchain" } caches { - name: "xcode_ios_12d4e" - path: "xcode_ios_12d4e.app" + name: "xcode_ios_13a5155e" + path: "xcode_ios_13a5155e.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index e9237cb..7aa5218e 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -3767,10 +3767,11 @@ category = "linux", short_name = "cmp", ), + goma_jobs = 250, executable = "recipe:reclient_goma_comparison", execution_timeout = 6 * time.hour, reclient_instance = rbe_instance.DEFAULT, - reclient_jobs = 500, + reclient_jobs = 250, configure_kitchen = True, kitchen_emulate_gce = True, os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, @@ -5885,6 +5886,7 @@ # We don't have necessary capacity to run this configuration in CQ, but it # is part of the main waterfall main_console_view = "main", + xcode = xcode.x13latestbeta, ) ci.memory_builder(
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star index 2711686..aa99df9 100644 --- a/infra/config/subprojects/chromium/try.star +++ b/infra/config/subprojects/chromium/try.star
@@ -1692,6 +1692,7 @@ try_.chromium_mac_ios_builder( name = "ios-simulator-noncq", + xcode = xcode.x13latestbeta, ) try_.chromium_mac_ios_builder(
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 64a9cba..cabf4b1 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -484,6 +484,9 @@ deps = [ ":main", ":tests_fake_hook", + + # Use the provider API controlled by args.gn. + ios_provider_target, ] if (current_toolchain == default_toolchain) {
diff --git a/ios/chrome/app/startup/BUILD.gn b/ios/chrome/app/startup/BUILD.gn index 41a4ec5a..711a06d 100644 --- a/ios/chrome/app/startup/BUILD.gn +++ b/ios/chrome/app/startup/BUILD.gn
@@ -90,7 +90,6 @@ "//ios/public/provider/chrome/browser", "//ios/web", "//ios/web/public/init", - ios_provider_target, ] }
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index aa95ee7..d57d9c6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -413,6 +413,7 @@ <translation id="5197255632782567636">ಇಂಟರ್ನೆಟ್</translation> <translation id="5210365745912300556">ಟ್ಯಾಬ್ ಅನ್ನು ಮುಚ್ಚಿ</translation> <translation id="5228579091201413441">ಸಿಂಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> +<translation id="5232485538978018676">ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="5234764350956374838">ವಜಾಗೊಳಿಸಿ</translation> <translation id="5245322853195994030">ಸಿಂಕ್ ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="5271549068863921519">ಪಾಸ್ವರ್ಡ್ ಉಳಿಸಿ</translation> @@ -733,6 +734,7 @@ <translation id="8206354486702514201">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಜಾರಿಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="8225985093977202398">ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ಚಿತ್ರಗಳು ಮತ್ತು ಫೈಲ್ಗಳು</translation> <translation id="8261506727792406068">ಅಳಿಸಿ</translation> +<translation id="8271720166617117963">ಸಮ್ಮತಿಸಿ ಮತ್ತು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="8281781826761538115">ಡಿಫಾಲ್ಟ್ - <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">ಸ್ಕಿಪ್</translation> <translation id="8283172974887967105">ಹೊಂದಿಸಿ…</translation>
diff --git a/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm b/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm index b5e16df..1e0adff8 100644 --- a/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm +++ b/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm
@@ -26,7 +26,8 @@ if (!auth_service) return std::string(); - ChromeIdentity* identity = auth_service->GetAuthenticatedIdentity(); + ChromeIdentity* identity = + auth_service->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (!identity) return std::string();
diff --git a/ios/chrome/browser/credential_provider/credential_provider_service.mm b/ios/chrome/browser/credential_provider/credential_provider_service.mm index 8506a0f..5f9a712 100644 --- a/ios/chrome/browser/credential_provider/credential_provider_service.mm +++ b/ios/chrome/browser/credential_provider/credential_provider_service.mm
@@ -238,9 +238,12 @@ } void CredentialProviderService::UpdateAccountValidationId() { - if (authentication_service_->IsAuthenticatedIdentityManaged()) { + if (authentication_service_->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)) { account_validation_id_ = - authentication_service_->GetAuthenticatedIdentity().gaiaID; + authentication_service_ + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin) + .gaiaID; } else { account_validation_id_ = nil; }
diff --git a/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm b/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm index 0879272..5c2635d4 100644 --- a/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm +++ b/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm
@@ -160,7 +160,8 @@ password_store_->AddLogin(form); task_environment_.RunUntilIdle(); - EXPECT_FALSE(auth_service_->GetAuthenticatedIdentity()); + EXPECT_FALSE( + auth_service_->GetPrimaryIdentity(signin::ConsentLevel::kSignin)); EXPECT_FALSE(credential_store_.credentials.firstObject.validationIdentifier); ios::FakeChromeIdentityService* identity_service = @@ -170,8 +171,9 @@ identity_service->GetAllIdentities(nullptr).firstObject; auth_service_->SignIn(identity); - ASSERT_TRUE(auth_service_->GetAuthenticatedIdentity()); - ASSERT_TRUE(auth_service_->IsAuthenticatedIdentityManaged()); + ASSERT_TRUE(auth_service_->GetPrimaryIdentity(signin::ConsentLevel::kSignin)); + ASSERT_TRUE( + auth_service_->HasPrimaryIdentityManaged(signin::ConsentLevel::kSignin)); CoreAccountInfo account = CoreAccountInfo(); account.email = base::SysNSStringToUTF8(identity.userEmail); @@ -185,9 +187,10 @@ ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForFileOperationTimeout, ^{ base::RunLoop().RunUntilIdle(); - return [auth_service_->GetAuthenticatedIdentity().gaiaID - isEqualToString:credential_store_.credentials.firstObject - .validationIdentifier]; + return + [auth_service_->GetPrimaryIdentity(signin::ConsentLevel::kSignin).gaiaID + isEqualToString:credential_store_.credentials.firstObject + .validationIdentifier]; })); auth_service_->SignOut(signin_metrics::SIGNOUT_TEST, @@ -202,9 +205,10 @@ ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForFileOperationTimeout, ^{ base::RunLoop().RunUntilIdle(); - return ![auth_service_->GetAuthenticatedIdentity().gaiaID - isEqualToString:credential_store_.credentials.firstObject - .validationIdentifier]; + return ! + [auth_service_->GetPrimaryIdentity(signin::ConsentLevel::kSignin).gaiaID + isEqualToString:credential_store_.credentials.firstObject + .validationIdentifier]; })); }
diff --git a/ios/chrome/browser/ios_chrome_field_trials.cc b/ios/chrome/browser/ios_chrome_field_trials.cc index f9e60ee..4df36cb 100644 --- a/ios/chrome/browser/ios_chrome_field_trials.cc +++ b/ios/chrome/browser/ios_chrome_field_trials.cc
@@ -9,6 +9,7 @@ #include "components/metrics/persistent_histograms.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/chrome_paths.h" +#include "ios/chrome/browser/ui/first_run/fre_field_trial.h" #import "ios/chrome/browser/ui/first_run/location_permissions_field_trial.h" void IOSChromeFieldTrials::SetupFieldTrials() { @@ -30,4 +31,6 @@ location_permissions_field_trial::Create( *low_entropy_provider, feature_list, GetApplicationContext()->GetLocalState()); + fre_field_trial::Create(*low_entropy_provider, feature_list, + GetApplicationContext()->GetLocalState()); }
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm b/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm index 4b8759be..316f637 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm
@@ -125,6 +125,11 @@ form.password_value = std::u16string(password); form.username_element = std::u16string(username_element); form.in_store = PasswordForm::Store::kProfileStore; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); return form; } @@ -279,6 +284,7 @@ manager().AddObserver(&observer); // Adding a compromised credential should notify observers. + EXPECT_CALL(observer, PasswordCheckStatusChanged); EXPECT_CALL( observer, CompromisedCredentialsChanged(ElementsAre(ExpectCompromisedCredential(
diff --git a/ios/chrome/browser/policy/policy_watcher_browser_agent.mm b/ios/chrome/browser/policy/policy_watcher_browser_agent.mm index 1ff1cb6..e880785 100644 --- a/ios/chrome/browser/policy/policy_watcher_browser_agent.mm +++ b/ios/chrome/browser/policy/policy_watcher_browser_agent.mm
@@ -73,7 +73,7 @@ AuthenticationServiceFactory::GetForBrowserState( browser_->GetBrowserState()); - if (service->IsAuthenticated()) { + if (service->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { sign_out_in_progress_ = true; base::UmaHistogramBoolean("Enterprise.BrowserSigninIOS.SignedOutByPolicy", true);
diff --git a/ios/chrome/browser/policy/policy_watcher_browser_agent_unittest.mm b/ios/chrome/browser/policy/policy_watcher_browser_agent_unittest.mm index b9dbacb..57edae9 100644 --- a/ios/chrome/browser/policy/policy_watcher_browser_agent_unittest.mm +++ b/ios/chrome/browser/policy/policy_watcher_browser_agent_unittest.mm
@@ -163,7 +163,8 @@ AuthenticationServiceFactory::GetForBrowserState( chrome_browser_state_.get()); - ASSERT_FALSE(authentication_service->IsAuthenticated()); + ASSERT_FALSE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // Strict mock, will fail if a method is called. id mockHandler = @@ -184,7 +185,8 @@ SignIn(); - ASSERT_TRUE(authentication_service->IsAuthenticated()); + ASSERT_TRUE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); id mockHandler = OCMProtocolMock(@protocol(PolicySignoutPromptCommands)); agent_->Initialize(mockHandler); @@ -197,7 +199,8 @@ // Verify the forceSignOut command was dispatched by the browser agent. EXPECT_OCMOCK_VERIFY(mockHandler); - EXPECT_FALSE(authentication_service->IsAuthenticated()); + EXPECT_FALSE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that the pref change doesn't trigger a command if the scene isn't @@ -211,7 +214,8 @@ SignIn(); - ASSERT_TRUE(authentication_service->IsAuthenticated()); + ASSERT_TRUE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // Strict mock, will fail if a method is called. id mockHandler = @@ -223,7 +227,8 @@ false); EXPECT_TRUE(scene_state_.appState.shouldShowPolicySignoutPrompt); - EXPECT_FALSE(authentication_service->IsAuthenticated()); + EXPECT_FALSE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that the handler is called and the user signed out if the policy is @@ -259,14 +264,16 @@ SceneStateBrowserAgent::CreateForBrowser(browser.get(), scene_state); // The SignOut will occur when the handler is set. - ASSERT_TRUE(authentication_service->IsAuthenticated()); + ASSERT_TRUE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); id mockHandler = OCMProtocolMock(@protocol(PolicySignoutPromptCommands)); OCMExpect([mockHandler showPolicySignoutPrompt]); agent->Initialize(mockHandler); EXPECT_OCMOCK_VERIFY(mockHandler); - EXPECT_FALSE(authentication_service->IsAuthenticated()); + EXPECT_FALSE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that the command to show the UI isn't sent if the authentication @@ -286,14 +293,16 @@ name:@"myName"]; authentication_service->SignIn(identity); - ASSERT_TRUE(authentication_service->IsAuthenticated()); + ASSERT_TRUE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // Strict protocol: method calls will fail until the method is stubbed. id mockHandler = OCMStrictProtocolMock(@protocol(PolicySignoutPromptCommands)); agent_->Initialize(mockHandler); - ASSERT_TRUE(authentication_service->IsAuthenticated()); + ASSERT_TRUE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // As the SignOut callback hasn't been called yet, this shouldn't trigger a UI // update. agent_->SignInUIDismissed(); @@ -301,7 +310,8 @@ OCMExpect([mockHandler showPolicySignoutPrompt]); base::RunLoop().RunUntilIdle(); - ASSERT_FALSE(authentication_service->IsAuthenticated()); + ASSERT_FALSE(authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // Once the SignOut callback is executed, the command should be sent. EXPECT_OCMOCK_VERIFY(mockHandler);
diff --git a/ios/chrome/browser/policy/reporting/profile_report_generator_ios.mm b/ios/chrome/browser/policy/reporting/profile_report_generator_ios.mm index 2c083ef..637c10a 100644 --- a/ios/chrome/browser/policy/reporting/profile_report_generator_ios.mm +++ b/ios/chrome/browser/policy/reporting/profile_report_generator_ios.mm
@@ -40,13 +40,13 @@ void ProfileReportGeneratorIOS::GetSigninUserInfo( enterprise_management::ChromeUserProfileInfo* report) { if (!AuthenticationServiceFactory::GetForBrowserState(browser_state_) - ->IsAuthenticated()) { + ->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { return; } ChromeIdentity* account_info = AuthenticationServiceFactory::GetForBrowserState(browser_state_) - ->GetAuthenticatedIdentity(); + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); auto* signed_in_user_info = report->mutable_chrome_signed_in_user(); signed_in_user_info->set_email( base::SysNSStringToUTF8(account_info.userEmail));
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm index b595051..d2a5d8b 100644 --- a/ios/chrome/browser/prefs/browser_prefs.mm +++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -68,6 +68,7 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h" +#include "ios/chrome/browser/ui/first_run/fre_field_trial.h" #import "ios/chrome/browser/ui/first_run/location_permissions_field_trial.h" #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h" #include "ios/chrome/browser/voice/voice_search_prefs_registration.h" @@ -129,6 +130,7 @@ update_client::RegisterPrefs(registry); variations::VariationsService::RegisterPrefs(registry); location_permissions_field_trial::RegisterLocalStatePrefs(registry); + fre_field_trial::RegisterLocalStatePrefs(registry); component_updater::AutofillStatesComponentInstallerPolicy::RegisterPrefs( registry);
diff --git a/ios/chrome/browser/providers/BUILD.gn b/ios/chrome/browser/providers/BUILD.gn index cfc3f81..fb627df4 100644 --- a/ios/chrome/browser/providers/BUILD.gn +++ b/ios/chrome/browser/providers/BUILD.gn
@@ -36,7 +36,7 @@ configs += [ "//build/config/compiler:enable_arc" ] } -source_set("provider_factory") { +source_set("chromium_provider_factory") { sources = [ "chromium_browser_provider_factory.mm" ] deps = [ ":providers", @@ -45,3 +45,15 @@ ] configs += [ "//build/config/compiler:enable_arc" ] } + +group("chromium_providers") { + deps = [ + # The target providing the ChromeBrowserProvider factory. + ":chromium_provider_factory", + + # The provider API needs to provide MaterialDesignComponent API (as the + # internal provider provides an alternate implementation). + "//ios/third_party/material_components_ios:material_components_ios+bundle", + "//ios/third_party/material_components_ios:material_components_ios+link", + ] +}
diff --git a/ios/chrome/browser/signin/authentication_service.h b/ios/chrome/browser/signin/authentication_service.h index a59e6c818..d6b4535 100644 --- a/ios/chrome/browser/signin/authentication_service.h +++ b/ios/chrome/browser/signin/authentication_service.h
@@ -14,6 +14,7 @@ #include "components/keyed_service/core/keyed_service.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/signin/public/base/signin_metrics.h" +#include "components/signin/public/identity_manager/consent_level.h" #include "components/signin/public/identity_manager/identity_manager.h" #import "ios/chrome/browser/signin/user_approved_account_list_manager.h" #include "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" @@ -83,16 +84,37 @@ // Returns true if the user is signed in. // While the AuthenticationService is in background, this will reload the // credentials to ensure the value is up to date. + bool HasPrimaryIdentity(signin::ConsentLevel consent_level) const; + + // Returns true if the user is signed in. + // While the AuthenticationService is in background, this will reload the + // credentials to ensure the value is up to date. + // DEPRECATED, use HasPrimaryIdentity(). virtual bool IsAuthenticated() const; // Returns true if the user is signed in and the identity is considered // managed. + // Virtual for testing. + virtual bool HasPrimaryIdentityManaged( + signin::ConsentLevel consent_level) const; + + // Returns true if the user is signed in and the identity is considered + // managed. + // DEPRECATED, use HasPrimaryIdentityManaged(). virtual bool IsAuthenticatedIdentityManaged() const; // Retrieves the identity of the currently authenticated user or |nil| if // either the user is not authenticated, or is authenticated through // ClientLogin. // Virtual for testing. + virtual ChromeIdentity* GetPrimaryIdentity( + signin::ConsentLevel consent_level) const; + + // Retrieves the identity of the currently authenticated user or |nil| if + // either the user is not authenticated, or is authenticated through + // ClientLogin. + // Virtual for testing. + // DEPRECATED, use HasPrimaryIdentityManaged(). virtual ChromeIdentity* GetAuthenticatedIdentity() const; // Grants signin::ConsentLevel::kSignin to |identity|.
diff --git a/ios/chrome/browser/signin/authentication_service.mm b/ios/chrome/browser/signin/authentication_service.mm index b29f8e55..fa65e25 100644 --- a/ios/chrome/browser/signin/authentication_service.mm +++ b/ios/chrome/browser/signin/authentication_service.mm
@@ -118,7 +118,8 @@ HandleForgottenIdentity(nil, true /* should_prompt */); - crash_keys::SetCurrentlySignedIn(IsAuthenticated()); + crash_keys::SetCurrentlySignedIn( + HasPrimaryIdentity(signin::ConsentLevel::kSignin)); identity_service_observation_.Observe( ios::GetChromeBrowserProvider().GetChromeIdentityService()); @@ -140,7 +141,7 @@ } void AuthenticationService::OnApplicationWillEnterForeground() { - if (IsAuthenticated()) { + if (HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { bool can_sync_start = sync_setup_service_->CanSyncFeatureStart(); LoginMethodAndSyncState loginMethodAndSyncState = can_sync_start ? SHARED_AUTHENTICATION_SYNC_ON @@ -182,7 +183,7 @@ } bool AuthenticationService::IsAccountListApprovedByUser() const { - DCHECK(IsAuthenticated()); + DCHECK(HasPrimaryIdentity(signin::ConsentLevel::kSignin)); std::vector<CoreAccountInfo> accounts_info = identity_manager_->GetAccountsWithRefreshTokens(); return user_approved_account_list_manager_.IsAccountListApprouvedByUser( @@ -190,7 +191,7 @@ } void AuthenticationService::ApproveAccountList() { - DCHECK(IsAuthenticated()); + DCHECK(HasPrimaryIdentity(signin::ConsentLevel::kSignin)); if (IsAccountListApprovedByUser()) return; std::vector<CoreAccountInfo> current_accounts_info = @@ -230,22 +231,39 @@ pref_service_->SetBoolean(prefs::kSigninLastAccountsMigrated, true); } -ChromeIdentity* AuthenticationService::GetAuthenticatedIdentity() const { +bool AuthenticationService::HasPrimaryIdentity( + signin::ConsentLevel consent_level) const { + return GetPrimaryIdentity(consent_level) != nil; +} + +bool AuthenticationService::HasPrimaryIdentityManaged( + signin::ConsentLevel consent_level) const { + return identity_manager_ + ->FindExtendedAccountInfo( + identity_manager_->GetPrimaryAccountInfo(consent_level)) + .IsManaged(); +} + +ChromeIdentity* AuthenticationService::GetPrimaryIdentity( + signin::ConsentLevel consent_level) const { // There is no authenticated identity if there is no signed in user or if the // user signed in via the client login flow. - if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) { + if (!identity_manager_->HasPrimaryAccount(consent_level)) { return nil; } std::string authenticated_gaia_id = - identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin) - .gaia; + identity_manager_->GetPrimaryAccountInfo(consent_level).gaia; if (authenticated_gaia_id.empty()) return nil; return account_manager_service_->GetIdentityWithGaiaID(authenticated_gaia_id); } +ChromeIdentity* AuthenticationService::GetAuthenticatedIdentity() const { + return GetPrimaryIdentity(signin::ConsentLevel::kSignin); +} + void AuthenticationService::SignIn(ChromeIdentity* identity) { CHECK(signin::IsSigninAllowed(pref_service_)); DCHECK(account_manager_service_->IsValidIdentity(identity)); @@ -327,7 +345,8 @@ return; } - const bool is_managed = IsAuthenticatedIdentityManaged(); + const bool is_managed = + HasPrimaryIdentityManaged(signin::ConsentLevel::kSignin); // Get first setup complete value before to stop the sync service. const bool is_first_setup_complete = sync_setup_service_->IsFirstSetupComplete(); @@ -425,9 +444,9 @@ void AuthenticationService::OnIdentityListChanged(bool keychain_reload) { if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) { // IdentityManager::HasPrimaryAccount() needs to be called instead of - // AuthenticationService::IsAuthenticated() or - // AuthenticationService::GetAuthenticatedIdentity(). - // If the primary identity has just been removed, GetAuthenticatedIdentity() + // AuthenticationService::HasPrimaryIdentity() or + // AuthenticationService::GetPrimaryIdentity(). + // If the primary identity has just been removed, GetPrimaryIdentity() // would return NO (since this method tests if the primary identity exists // in ChromeIdentityService). // In this case, we do need to call ReloadCredentialsFromIdentities(). @@ -461,7 +480,8 @@ if (is_blocked && weak_ptr.get()) { // If the identity is blocked, sign out of the account. As only managed // account can be blocked, this will clear the associated browsing data. - if (identity == weak_ptr->GetAuthenticatedIdentity()) { + if (identity == + weak_ptr->GetPrimaryIdentity(signin::ConsentLevel::kSignin)) { weak_ptr->SignOut(signin_metrics::ABORT_SIGNIN, /*force_clear_browsing_data=*/false, nil); } @@ -513,7 +533,8 @@ return; } - ChromeIdentity* authenticated_identity = GetAuthenticatedIdentity(); + ChromeIdentity* authenticated_identity = + GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (authenticated_identity && authenticated_identity != invalid_identity) { // |authenticated_identity| exists and is a valid identity. Nothing to do // here. @@ -539,7 +560,7 @@ base::AutoReset<bool> auto_reset(&is_reloading_credentials_, true); HandleForgottenIdentity(nil, keychain_reload); - if (!IsAuthenticated()) + if (!HasPrimaryIdentity(signin::ConsentLevel::kSignin)) return; DCHECK( @@ -556,12 +577,9 @@ } bool AuthenticationService::IsAuthenticated() const { - return GetAuthenticatedIdentity() != nil; + return HasPrimaryIdentity(signin::ConsentLevel::kSignin); } bool AuthenticationService::IsAuthenticatedIdentityManaged() const { - return identity_manager_ - ->FindExtendedAccountInfo(identity_manager_->GetPrimaryAccountInfo( - signin::ConsentLevel::kSignin)) - .IsManaged(); + return HasPrimaryIdentityManaged(signin::ConsentLevel::kSignin); }
diff --git a/ios/chrome/browser/signin/authentication_service_fake.h b/ios/chrome/browser/signin/authentication_service_fake.h index 814383e..7aaf97c0 100644 --- a/ios/chrome/browser/signin/authentication_service_fake.h +++ b/ios/chrome/browser/signin/authentication_service_fake.h
@@ -35,11 +35,11 @@ bool force_clear_browsing_data, ProceduralBlock completion) override; - bool IsAuthenticated() const override; + ChromeIdentity* GetPrimaryIdentity( + signin::ConsentLevel consent_level) const override; - ChromeIdentity* GetAuthenticatedIdentity() const override; - - bool IsAuthenticatedIdentityManaged() const override; + bool HasPrimaryIdentityManaged( + signin::ConsentLevel consent_level) const override; private: AuthenticationServiceFake( @@ -52,7 +52,8 @@ // Internal method effectively signing out the user. void SignOutInternal(ProceduralBlock completion); - __strong ChromeIdentity* authenticated_identity_; + __strong ChromeIdentity* primary_identity_; + signin::ConsentLevel consent_level_ = signin::ConsentLevel::kSignin; // WeakPtrFactory should be last. base::WeakPtrFactory<AuthenticationServiceFake> weak_factory_{this};
diff --git a/ios/chrome/browser/signin/authentication_service_fake.mm b/ios/chrome/browser/signin/authentication_service_fake.mm index 08ecd007..a5b01c1 100644 --- a/ios/chrome/browser/signin/authentication_service_fake.mm +++ b/ios/chrome/browser/signin/authentication_service_fake.mm
@@ -41,16 +41,20 @@ // AuthenticationService. DCHECK(identity); sync_setup_service_->PrepareForFirstSyncSetup(); - authenticated_identity_ = identity; + primary_identity_ = identity; + consent_level_ = signin::ConsentLevel::kSignin; } -void AuthenticationServiceFake::GrantSyncConsent(ChromeIdentity* identity) {} +void AuthenticationServiceFake::GrantSyncConsent(ChromeIdentity* identity) { + consent_level_ = signin::ConsentLevel::kSync; +} void AuthenticationServiceFake::SignOut( signin_metrics::ProfileSignout signout_source, bool force_clear_browsing_data, ProceduralBlock completion) { - if (force_clear_browsing_data || IsAuthenticatedIdentityManaged()) { + if (force_clear_browsing_data || + HasPrimaryIdentityManaged(signin::ConsentLevel::kSignin)) { base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&AuthenticationServiceFake::SignOutInternal, weak_factory_.GetWeakPtr(), completion)); @@ -60,25 +64,33 @@ } void AuthenticationServiceFake::SignOutInternal(ProceduralBlock completion) { - authenticated_identity_ = nil; + primary_identity_ = nil; + consent_level_ = signin::ConsentLevel::kSignin; if (completion) completion(); } -bool AuthenticationServiceFake::IsAuthenticated() const { - return authenticated_identity_ != nil; +ChromeIdentity* AuthenticationServiceFake::GetPrimaryIdentity( + signin::ConsentLevel consent_level) const { + switch (consent_level) { + case signin::ConsentLevel::kSignin: + return primary_identity_; + break; + case signin::ConsentLevel::kSync: + return (consent_level_ == signin::ConsentLevel::kSync) ? primary_identity_ + : nil; + break; + } + return nil; } -ChromeIdentity* AuthenticationServiceFake::GetAuthenticatedIdentity() const { - return authenticated_identity_; -} - -bool AuthenticationServiceFake::IsAuthenticatedIdentityManaged() const { - if (!authenticated_identity_) { +bool AuthenticationServiceFake::HasPrimaryIdentityManaged( + signin::ConsentLevel consent_level) const { + if (!GetPrimaryIdentity(consent_level)) { return false; } - return [authenticated_identity_.userEmail - hasSuffix:ios::kManagedIdentityEmailSuffix]; + return + [primary_identity_.userEmail hasSuffix:ios::kManagedIdentityEmailSuffix]; } std::unique_ptr<KeyedService>
diff --git a/ios/chrome/browser/signin/authentication_service_unittest.mm b/ios/chrome/browser/signin/authentication_service_unittest.mm index 3bd5eee..2043133 100644 --- a/ios/chrome/browser/signin/authentication_service_unittest.mm +++ b/ios/chrome/browser/signin/authentication_service_unittest.mm
@@ -167,18 +167,20 @@ std::unique_ptr<TestChromeBrowserState> browser_state_; }; -TEST_F(AuthenticationServiceTest, TestDefaultGetAuthenticatedIdentity) { - EXPECT_FALSE(authentication_service()->GetAuthenticatedIdentity()); - EXPECT_FALSE(authentication_service()->IsAuthenticated()); +TEST_F(AuthenticationServiceTest, TestDefaultGetPrimaryIdentity) { + EXPECT_FALSE(authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); + EXPECT_FALSE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } -TEST_F(AuthenticationServiceTest, TestSignInAndGetAuthenticatedIdentity) { +TEST_F(AuthenticationServiceTest, TestSignInAndGetPrimaryIdentity) { // Sign in. SetExpectationsForSignIn(); authentication_service()->SignIn(identity(0)); - EXPECT_NSEQ(identity(0), - authentication_service()->GetAuthenticatedIdentity()); + EXPECT_NSEQ(identity(0), authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); std::string user_email = base::SysNSStringToUTF8([identity(0) userEmail]); AccountInfo account_info = @@ -187,7 +189,8 @@ EXPECT_EQ(base::SysNSStringToUTF8([identity(0) gaiaID]), account_info.gaia); EXPECT_TRUE( identity_manager()->HasAccountWithRefreshToken(account_info.account_id)); - EXPECT_TRUE(authentication_service()->IsAuthenticated()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that reauth prompt can be set and reset. @@ -219,8 +222,10 @@ EXPECT_TRUE(identity_manager() ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync) .email.empty()); - EXPECT_FALSE(authentication_service()->GetAuthenticatedIdentity()); - EXPECT_FALSE(authentication_service()->IsAuthenticated()); + EXPECT_FALSE(authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); + EXPECT_FALSE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); EXPECT_FALSE(authentication_service()->ShouldReauthPromptForSignInAndSync()); } @@ -241,8 +246,10 @@ EXPECT_TRUE(identity_manager() ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync) .email.empty()); - EXPECT_FALSE(authentication_service()->GetAuthenticatedIdentity()); - EXPECT_FALSE(authentication_service()->IsAuthenticated()); + EXPECT_FALSE(authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); + EXPECT_FALSE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); EXPECT_TRUE(authentication_service()->ShouldReauthPromptForSignInAndSync()); } @@ -264,8 +271,10 @@ EXPECT_TRUE(identity_manager() ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync) .email.empty()); - EXPECT_FALSE(authentication_service()->GetAuthenticatedIdentity()); - EXPECT_FALSE(authentication_service()->IsAuthenticated()); + EXPECT_FALSE(authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); + EXPECT_FALSE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); EXPECT_FALSE(authentication_service()->ShouldReauthPromptForSignInAndSync()); } @@ -373,18 +382,20 @@ EXPECT_FALSE(authentication_service()->IsAccountListApprovedByUser()); } -TEST_F(AuthenticationServiceTest, IsAuthenticatedBackground) { +TEST_F(AuthenticationServiceTest, HasPrimaryIdentityBackground) { // Sign in. SetExpectationsForSignIn(); authentication_service()->SignIn(identity(0)); - EXPECT_TRUE(authentication_service()->IsAuthenticated()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // Remove the signed in identity while in background, and check that - // IsAuthenticated is up-to-date. + // HasPrimaryIdentity is up-to-date. identity_service()->ForgetIdentity(identity(0), nil); base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(authentication_service()->IsAuthenticated()); + EXPECT_FALSE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that MDM errors are correctly cleared on foregrounding, sending @@ -470,7 +481,8 @@ SetExpectationsForSignIn(); authentication_service()->SignIn(identity(2)); EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 3UL); - EXPECT_TRUE(authentication_service()->IsAuthenticatedIdentityManaged()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)); NSDictionary* user_info = [NSDictionary dictionary]; SetCachedMDMInfo(identity(2), user_info); @@ -490,7 +502,8 @@ SetExpectationsForSignIn(); authentication_service()->SignIn(identity(2)); EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 3UL); - EXPECT_TRUE(authentication_service()->IsAuthenticatedIdentityManaged()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)); NSDictionary* user_info = [NSDictionary dictionary]; SetCachedMDMInfo(identity(2), user_info); @@ -563,14 +576,16 @@ HandleMDMNotification(identity(1), user_info1, _)) .WillOnce(Invoke(handle_mdm_notification_callback)); FireAccessTokenRefreshFailed(identity(1), user_info1); - EXPECT_TRUE(authentication_service()->IsAuthenticated()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // User signed out as |identity_| is the primary account. EXPECT_CALL(*identity_service(), HandleMDMNotification(identity(0), user_info1, _)) .WillOnce(Invoke(handle_mdm_notification_callback)); FireAccessTokenRefreshFailed(identity(0), user_info1); - EXPECT_FALSE(authentication_service()->IsAuthenticated()); + EXPECT_FALSE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that MDM dialog isn't shown when there is no cached MDM error. @@ -621,13 +636,14 @@ SetExpectationsForSignIn(); authentication_service()->SignIn(identity(0)); - EXPECT_NSEQ(identity(0), - authentication_service()->GetAuthenticatedIdentity()); + EXPECT_NSEQ(identity(0), authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); EXPECT_TRUE( identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSignin)); EXPECT_FALSE( identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync)); - EXPECT_TRUE(authentication_service()->IsAuthenticated()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); // Grant Sync consent. EXPECT_CALL(*sync_setup_service_mock(), PrepareForFirstSyncSetup).Times(1); @@ -635,13 +651,14 @@ SetSyncRequested(true)); authentication_service()->GrantSyncConsent(identity(0)); - EXPECT_NSEQ(identity(0), - authentication_service()->GetAuthenticatedIdentity()); + EXPECT_NSEQ(identity(0), authentication_service()->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)); EXPECT_TRUE( identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSignin)); EXPECT_TRUE( identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync)); - EXPECT_TRUE(authentication_service()->IsAuthenticated()); + EXPECT_TRUE(authentication_service()->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } TEST_F(AuthenticationServiceTest, SigninDisallowedCrash) {
diff --git a/ios/chrome/browser/test/BUILD.gn b/ios/chrome/browser/test/BUILD.gn index 500312a..6e92a80e 100644 --- a/ios/chrome/browser/test/BUILD.gn +++ b/ios/chrome/browser/test/BUILD.gn
@@ -35,10 +35,6 @@ "//ios/chrome/test/base:perf_test_support", "//ios/public/provider/chrome/browser", "//ios/web/public/test", - - # Perf tests can run with any provider, but the resulting numbers will only - # be meaningful if ChromeBrowserProviderImpl is used. - ios_provider_target, ] frameworks = [ "UIKit.framework" ] }
diff --git a/ios/chrome/browser/translate/BUILD.gn b/ios/chrome/browser/translate/BUILD.gn index 95bbe1a..3f448dd 100644 --- a/ios/chrome/browser/translate/BUILD.gn +++ b/ios/chrome/browser/translate/BUILD.gn
@@ -97,7 +97,6 @@ "//ios/chrome/browser/web:test_support", "//ios/chrome/browser/web:web_internal", "//ios/chrome/common", - "//ios/public/provider/chrome/browser:test_support", "//ios/web/public", "//ios/web/public/test:util", "//skia",
diff --git a/ios/chrome/browser/translate/translate_service_ios_unittest.cc b/ios/chrome/browser/translate/translate_service_ios_unittest.cc index fbd0d8a..a6050c2 100644 --- a/ios/chrome/browser/translate/translate_service_ios_unittest.cc +++ b/ios/chrome/browser/translate/translate_service_ios_unittest.cc
@@ -5,7 +5,6 @@ #include "ios/chrome/browser/translate/translate_service_ios.h" #include "ios/chrome/browser/chrome_url_constants.h" -#include "ios/public/provider/chrome/browser/test_chrome_provider_initializer.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" #include "url/gurl.h"
diff --git a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm index 3326ec6..de5666f 100644 --- a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm +++ b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm
@@ -83,10 +83,9 @@ [UIAlertAction actionWithTitle:title style:style handler:^(UIAlertAction*) { - [weakSelf setNoInteractionAction:nil]; + [weakSelf alertDismissed]; if (actionBlock) actionBlock(); - [weakSelf alertDismissed]; }]; alertAction.enabled = enabled;
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow.mm b/ios/chrome/browser/ui/authentication/authentication_flow.mm index cb0b12d..8bd299f 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow.mm
@@ -334,9 +334,10 @@ } - (void)checkSigninSteps { - _browserStateIdentity = AuthenticationServiceFactory::GetForBrowserState( - _browser->GetBrowserState()) - ->GetAuthenticatedIdentity(); + _browserStateIdentity = + AuthenticationServiceFactory::GetForBrowserState( + _browser->GetBrowserState()) + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (_browserStateIdentity) _shouldSignOut = YES;
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm index ae39df4..dc34032 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -250,27 +250,21 @@ ChromeBrowserState* browserState = browser->GetBrowserState(); signin::IdentityManager* identityManager = IdentityManagerFactory::GetForBrowserState(browserState); - BOOL isCurrentUserSyncing = - identityManager->HasPrimaryAccount(signin::ConsentLevel::kSync); AuthenticationService* authenticationService = AuthenticationServiceFactory::GetForBrowserState(browserState); - std::string lastSyncingEmail; - if (isCurrentUserSyncing) { - // User is opted in to sync, the current data comes belongs to the syncing - // account. - lastSyncingEmail = - identityManager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync) - .email; - DCHECK(!lastSyncingEmail.empty()); - } else { + NSString* lastSyncingEmail = + authenticationService->GetPrimaryIdentity(signin::ConsentLevel::kSync) + .userEmail; + if (!lastSyncingEmail) { // User is not opted in to sync, the current data comes may belong to the // previously syncing account (if any). lastSyncingEmail = - browserState->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername); + base::SysUTF8ToNSString(browserState->GetPrefs()->GetString( + prefs::kGoogleServicesLastUsername)); } - if (isCurrentUserSyncing && - authenticationService->IsAuthenticatedIdentityManaged()) { + if (authenticationService->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSync)) { // If the current user is a managed account and sync is enabled, the sign-in // needs to wipe the current data. We need to ask confirm from the user. AccountInfo primaryAccountInfo = identityManager->FindExtendedAccountInfo( @@ -278,18 +272,20 @@ DCHECK(!primaryAccountInfo.IsEmpty()); NSString* hostedDomain = base::SysUTF8ToNSString(primaryAccountInfo.hosted_domain); - [self promptSwitchFromManagedEmail:base::SysUTF8ToNSString(lastSyncingEmail) + [self promptSwitchFromManagedEmail:lastSyncingEmail withHostedDomain:hostedDomain toEmail:[identity userEmail] viewController:viewController browser:browser]; return; } + BOOL isCurrentUserSyncing = + identityManager->HasPrimaryAccount(signin::ConsentLevel::kSync); _navigationController = [SettingsNavigationController importDataControllerForBrowser:browser delegate:self importDataDelegate:self - fromEmail:base::SysUTF8ToNSString(lastSyncingEmail) + fromEmail:lastSyncingEmail toEmail:[identity userEmail] isSyncing:isCurrentUserSyncing]; [_delegate presentViewController:_navigationController @@ -303,7 +299,7 @@ ChromeBrowserState* browserState = browser->GetBrowserState(); DCHECK(!AuthenticationServiceFactory::GetForBrowserState(browserState) - ->IsAuthenticated()); + ->HasPrimaryIdentity(signin::ConsentLevel::kSignin)); // Workaround for crbug.com/1003578 //
diff --git a/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.mm b/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.mm index 273c961..a55ff26 100644 --- a/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.mm +++ b/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.mm
@@ -73,7 +73,7 @@ if (!authService->ShouldReauthPromptForSignInAndSync()) return nullptr; // Returns null if user has already signed in via some other path. - if (authService->IsAuthenticated()) { + if (authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { authService->ResetReauthPromptForSignInAndSync(); return nullptr; }
diff --git a/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm b/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm index 1ce2b0e..c2dae2f 100644 --- a/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm
@@ -209,7 +209,7 @@ AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState(browserState); return !gSignedInAccountsViewControllerIsShown && - authService->IsAuthenticated() && + authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin) && !authService->IsAccountListApprovedByUser(); }
diff --git a/ios/chrome/browser/ui/authentication/signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/BUILD.gn index c0db2071..feeafdb 100644 --- a/ios/chrome/browser/ui/authentication/signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
@@ -55,6 +55,7 @@ "//ios/chrome/browser/main:public", "//ios/chrome/browser/policy:policy_util", "//ios/chrome/browser/signin", + "//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui/authentication/signin/add_account_signin", "//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin", "//ios/chrome/browser/ui/authentication/signin/consistency_promo_signin",
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm index db15bf2b..58e5e77 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm
@@ -66,7 +66,8 @@ AuthenticationService* authenticationService = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); - DCHECK(authenticationService->IsAuthenticated()); + DCHECK( + authenticationService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)); self.identityManager = IdentityManagerFactory::GetForBrowserState( self.browser->GetBrowserState()); self.advancedSettingsSigninNavigationController = @@ -225,9 +226,10 @@ AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); - ChromeIdentity* identity = (signinResult == SigninCoordinatorResultSuccess) - ? authService->GetAuthenticatedIdentity() - : nil; + ChromeIdentity* identity = + (signinResult == SigninCoordinatorResultSuccess) + ? authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin) + : nil; SigninCompletionInfo* completionInfo = [SigninCompletionInfo signinCompletionInfoWithIdentity:identity]; [self runCompletionCallbackWithSigninResult:signinResult
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm index b39fa2c0..8871541 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm
@@ -134,7 +134,8 @@ authentication_service_fake_->SignIn(identity_); [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultSuccess]; - ASSERT_TRUE(authentication_service_fake_->IsAuthenticated()); + ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that a user is authenticated but not synced when sync is disabled and @@ -151,7 +152,8 @@ authentication_service_fake_->SignIn(identity_); [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultSuccess]; - ASSERT_TRUE(authentication_service_fake_->IsAuthenticated()); + ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that a user is not authenticated when sign-in is canceled. @@ -160,7 +162,8 @@ [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultCanceledByUser]; - ASSERT_FALSE(authentication_service_fake_->IsAuthenticated()); + ASSERT_FALSE(authentication_service_fake_->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } // Tests that a user's authentication does not change when sign-in is @@ -171,5 +174,6 @@ [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultInterrupted]; - ASSERT_TRUE(authentication_service_fake_->IsAuthenticated()); + ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); }
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm index cc915d3..0d21370 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm
@@ -367,7 +367,8 @@ DCHECK([self.selectedIdentity isEqual:identity]); [self.defaultAccountCoordinator startSigninSpinner]; self.authenticationService->SignIn(self.selectedIdentity); - DCHECK(self.authenticationService->IsAuthenticated()); + DCHECK(self.authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); } #pragma mark - ConsistencyAccountChooserCoordinatorDelegate @@ -438,7 +439,8 @@ // an account change event must come from the consistency sheet. // TODO(crbug.com/1081764): Update if sign-in UI becomes non-blocking. ChromeIdentity* signedInIdentity = - self.authenticationService->GetAuthenticatedIdentity(); + self.authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSignin); DCHECK([signedInIdentity isEqual:self.selectedIdentity]); break; } @@ -464,7 +466,8 @@ } __weak __typeof(self) weakSelf = self; if (error.state() == GoogleServiceAuthError::State::NONE && - self.authenticationService->GetAuthenticatedIdentity() && + self.authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSignin) && accountsInCookieJarInfo.signed_in_accounts.size() > 0) { [self.defaultAccountCoordinator stopSigninSpinner]; [self.navigationController
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm index 3823ecb..286f166 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm
@@ -19,6 +19,7 @@ #import "ios/chrome/browser/ui/authentication/signin/user_signin/logging/upgrade_signin_logger.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.h" +#import "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" @@ -60,6 +61,7 @@ (UINavigationController*)navigationController browser: (Browser*)browser { + DCHECK(!base::FeatureList::IsEnabled(kEnableFREUIModuleIOS)); UserSigninLogger* logger = [[FirstRunSigninLogger alloc] initWithAccessPoint:AccessPoint::ACCESS_POINT_START_PAGE promoAction:PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm index b22e6789..89e570f 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
@@ -89,7 +89,7 @@ AuthenticationService* auth_service = AuthenticationServiceFactory::GetForBrowserState(browser_state); // Do not show the SSO promo if the user is already logged in. - if (auth_service->IsAuthenticated()) + if (auth_service->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) return false; // Used for testing purposes only.
diff --git a/ios/chrome/browser/ui/authentication/signin/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator.mm index 780412c1..ed170cd 100644 --- a/ios/chrome/browser/ui/authentication/signin/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator.mm
@@ -89,7 +89,8 @@ AuthenticationService* authenticationService = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); - DCHECK(authenticationService->IsAuthenticated()); + DCHECK( + authenticationService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)); // TODO(crbug.com/1019685): Should test if reauth is still needed. If still // needed, the reauth should be really started. // If not, the coordinator can be closed successfuly, by calling @@ -99,7 +100,7 @@ ios::GetChromeBrowserProvider().GetChromeTrustedVaultService(); self.identity = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()) - ->GetAuthenticatedIdentity(); + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); __weak __typeof(self) weakSelf = self; void (^callback)(BOOL success, NSError* error) = ^(BOOL success, NSError* error) {
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm index 9a5319a..a260aa1 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
@@ -118,7 +118,8 @@ // The user should be signed out before triggering sign-in or upgrade states. // Users are allowed to be signed-in during FirstRun for testing purposes. DCHECK(base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency) || - !authenticationService->IsAuthenticated() || + !authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin) || self.signinIntent == UserSigninIntentFirstRun); [super start];
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey.mm index 72ff0411..ba34317 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey.mm
@@ -79,7 +79,7 @@ } - (void)verifyAuthenticated { - EG_TEST_HELPER_ASSERT_TRUE([SigninEarlGreyAppInterface isAuthenticated], + EG_TEST_HELPER_ASSERT_TRUE([SigninEarlGreyAppInterface hasPrimaryIdentity], @"User is not signed in"); }
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h index 01d14189..e6892a3 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h
@@ -45,8 +45,8 @@ // Returns a matcher for an identity picker cell for |email|. + (id<GREYMatcher>)identityCellMatcherForEmail:(NSString*)email; -// Checks if any identity is currently authenticated. -+ (BOOL)isAuthenticated; +// Checks whether there is a primary identity. ++ (BOOL)hasPrimaryIdentity; // Signs out the current user. + (void)signOut;
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm index 5d43009..2f9edff 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm
@@ -90,12 +90,13 @@ grey_sufficientlyVisible(), nil); } -+ (BOOL)isAuthenticated { ++ (BOOL)hasPrimaryIdentity { ChromeBrowserState* browserState = chrome_test_util::GetOriginalBrowserState(); AuthenticationService* authentication_service = AuthenticationServiceFactory::GetForBrowserState(browserState); - return authentication_service->IsAuthenticated(); + return authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin); } + (void)signOut {
diff --git a/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.mm b/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.mm index 077ff25..66327c8 100644 --- a/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.mm +++ b/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.mm
@@ -66,7 +66,8 @@ AuthenticationService* auth_service = AuthenticationServiceFactory::GetForBrowserState(browser_state); DCHECK(auth_service); - ChromeIdentity* identity = auth_service->GetAuthenticatedIdentity(); + ChromeIdentity* identity = + auth_service->GetPrimaryIdentity(signin::ConsentLevel::kSignin); UIImage* image = ios::GetChromeBrowserProvider() .GetChromeIdentityService()
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm index 65e4bcf2..56a74e8 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
@@ -501,9 +501,9 @@ return; // If the sign-in view is removed when the user is authenticated, then the - // sign-in has been done by another view, and this mediator cannot be counted - // as being dismissed. - if (self.authService->IsAuthenticated()) + // sign-in for sync has been done by another view, and this mediator cannot be + // counted as being dismissed. + if (self.authService->HasPrimaryIdentity(signin::ConsentLevel::kSync)) return; int displayedCount = self.prefService->GetInteger(displayedCountPreferenceKey);
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm index a252829..e220d01 100644 --- a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm
@@ -70,7 +70,8 @@ - (void)start { DCHECK(self.completion); - DCHECK(self.authenticationService->IsAuthenticated()); + DCHECK(self.authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self.baseViewController @@ -171,7 +172,8 @@ self.browser->GetBrowserState()); BOOL syncEnabled = syncSetupService->IsFirstSetupComplete(); SignedInUserState signedInUserState; - if (self.authenticationService->IsAuthenticatedIdentityManaged()) { + if (self.authenticationService->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)) { signedInUserState = syncEnabled ? SignedInUserStateWithManagedAccountAndSyncing : SignedInUserStateWithManagedAccountAndNotSyncing; @@ -218,7 +220,8 @@ if (!self.browser) return; - if (!self.authenticationService->IsAuthenticated()) { + if (!self.authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)) { self.completion(YES); return; } @@ -237,7 +240,8 @@ }); // Get UMA metrics on the usage of different options for signout available // for users with non-managed accounts. - if (!self.authenticationService->IsAuthenticatedIdentityManaged()) { + if (!self.authenticationService->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)) { UMA_HISTOGRAM_BOOLEAN("Signin.UserRequestedWipeDataOnSignout", forceClearData); }
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_mediator.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_mediator.mm index 334e517e..0de3b69 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_mediator.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_mediator.mm
@@ -102,8 +102,10 @@ #pragma mark - Private - (ChromeIdentity*)findDefaultSelectedIdentity { - if (self.authenticationService->IsAuthenticated()) { - return self.authenticationService->GetAuthenticatedIdentity(); + if (self.authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)) { + return self.authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSignin); } return self.accountManagerService->GetDefaultIdentity();
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index 729c10a..b5be214f 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -545,7 +545,7 @@ style:UIAlertActionStyleDefault]; } - if (self.authService->IsAuthenticated()) { + if (self.authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { [self.alertCoordinator addItemWithTitle:l10n_util::GetNSString( IDS_IOS_DISCOVER_FEED_MENU_MANAGE_ACTIVITY_ITEM)
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm index 0498c3e..641b562 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -736,7 +736,8 @@ - (void)updateAccountImage { UIImage* image; // Fetches user's identity from Authentication Service. - ChromeIdentity* identity = self.authService->GetAuthenticatedIdentity(); + ChromeIdentity* identity = + self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (identity) { // Fetches user's avatar from Authentication Service. Use cached version if // one is available. If not, use the default avatar and initiate a fetch
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn index 5363bd6..54db023 100644 --- a/ios/chrome/browser/ui/first_run/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -5,6 +5,8 @@ source_set("field_trial") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ + "fre_field_trial.cc", + "fre_field_trial.h", "ios_first_run_field_trials.cc", "ios_first_run_field_trials.h", "location_permissions_field_trial.cc", @@ -217,6 +219,7 @@ ":eg_test_support+eg2", "//base", "//base/test:test_support", + "//components/policy/core/common:common_constants", "//ios/chrome/app/strings:ios_chromium_strings_grit", "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser/ui:feature_flags",
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm index efbccca..728f8ca 100644 --- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -2,7 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" +#include "components/policy/core/common/policy_loader_ios_constants.h" #import "ios/chrome/browser/ui/first_run/first_run_app_interface.h" #import "ios/chrome/browser/ui/first_run/first_run_constants.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" @@ -12,6 +14,7 @@ #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" +#import "ios/testing/earl_grey/app_launch_manager.h" #import "ios/testing/earl_grey/earl_grey_test.h" #include "ui/base/l10n/l10n_util.h" @@ -157,4 +160,29 @@ [self verifySignInScreenIsDisplayed]; } +// Tests that the FRE is shown when incognito is forced by policy. +- (void)testFirstRunWithIncognitoForced { + AppLaunchConfiguration config = self.appConfigurationForTestCase; + + std::string policy_data = "<dict>" + " <key>IncognitoModeAvailability</key>" + " <integer>2</integer>" + "</dict>"; + base::RemoveChars(policy_data, base::kWhitespaceASCII, &policy_data); + + config.additional_args.push_back( + "-" + base::SysNSStringToUTF8(kPolicyLoaderIOSConfigurationKey)); + config.additional_args.push_back(policy_data); + + [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; + + // Assert that the FRE UI is shown while the browser is in incognito mode. + // Do this by looking at the presence of a UI artifact in the first screen + // (TOS) that is a signature for the presence of the FRE. + id<GREYMatcher> termsOfServiceLink = grey_accessibilityLabel( + l10n_util::GetNSString(IDS_IOS_FIRSTRUN_TERMS_TITLE)); + [[EarlGrey selectElementWithMatcher:termsOfServiceLink] + assertWithMatcher:grey_notNil()]; +} + @end
diff --git a/ios/chrome/browser/ui/first_run/first_run_screen_view_controller.mm b/ios/chrome/browser/ui/first_run/first_run_screen_view_controller.mm index 3529a2a..4450ad0 100644 --- a/ios/chrome/browser/ui/first_run/first_run_screen_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/first_run_screen_view_controller.mm
@@ -234,6 +234,12 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; + // Reset |didReachBottom| to make sure that its value is correctly updated + // to reflect the scrolling state when the view reappears and is refreshed + // (e.g., when getting back from a full screen view that was hidding this + // view controller underneath). + self.didReachBottom = NO; + // Only add the scroll view delegate after all the view layouts are fully // done. dispatch_async(dispatch_get_main_queue(), ^{
diff --git a/ios/chrome/browser/ui/first_run/fre_field_trial.cc b/ios/chrome/browser/ui/first_run/fre_field_trial.cc new file mode 100644 index 0000000..8d26764 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/fre_field_trial.cc
@@ -0,0 +1,110 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ios/chrome/browser/ui/first_run/fre_field_trial.h" + +#include "base/feature_list.h" +#include "base/metrics/field_trial.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" +#include "components/variations/variations_associated_data.h" +#include "components/version_info/version_info.h" +#include "ios/chrome/browser/first_run/first_run.h" +#include "ios/chrome/browser/ui/first_run/ios_first_run_field_trials.h" +#include "ios/chrome/browser/ui/ui_feature_flags.h" +#include "ios/chrome/common/channel_info.h" + +namespace { +// String local state preference with the name of the assigned trial group. +// Empty if no group has been assigned yet. +const char kTrialGroupPrefName[] = "fre_refactoring.trial_group"; + +// Group names for the FRE redesign permissions trial. +const char kEnabledGroup[] = "Enabled"; +const char kDisabledGroup[] = "Disabled"; +const char kDefaultGroup[] = "Default"; +// Experiment IDs defined for the above field trial groups. +const variations::VariationID kDefaultTrialID = 3330131; +const variations::VariationID kEnabledTrialID = 3330132; +const variations::VariationID kDisabledTrialID = 3330133; + +// Default local state pref value. +const int kDefaultPrefValue = -1; +} // namespace + +namespace fre_field_trial { + +// Creates a trial for the first run (when there is no variations seed) if +// necessary and enables the feature based on the randomly selected trial group. +// Returns the group number. +int CreateFirstRunTrial( + base::FieldTrial::EntropyProvider const& low_entropy_provider, + base::FeatureList* feature_list) { + int enabled_percent; + int control_percent; + int default_percent; + switch (GetChannel()) { + case version_info::Channel::UNKNOWN: + case version_info::Channel::CANARY: + case version_info::Channel::DEV: + case version_info::Channel::BETA: + enabled_percent = 0; + control_percent = 0; + default_percent = 100; + break; + case version_info::Channel::STABLE: + enabled_percent = 0; + control_percent = 0; + default_percent = 100; + break; + } + + // Set up the trial and groups. + FirstRunFieldTrialConfig config(kEnableFREUIModuleIOS.name); + + config.AddGroup(kDefaultGroup, kDefaultTrialID, default_percent); + config.AddGroup(kEnabledGroup, kEnabledTrialID, enabled_percent); + config.AddGroup(kDisabledGroup, kDisabledTrialID, control_percent); + DCHECK_EQ(100, config.GetTotalProbability()); + + scoped_refptr<base::FieldTrial> trial = + config.CreateOneTimeRandomizedTrial(kDefaultGroup, low_entropy_provider); + + // Finalize the group choice and activates the trial - similar to a variation + // config that's marked with |starts_active| true. This is required for + // studies that register variation ids, so they don't reveal extra information + // beyond the low-entropy source. + int group = trial->group(); + base::FeatureList::OverrideState feature_state = + trial->group_name() == kEnabledGroup + ? base::FeatureList::OVERRIDE_ENABLE_FEATURE + : base::FeatureList::OVERRIDE_DISABLE_FEATURE; + + feature_list->RegisterFieldTrialOverride(kEnableFREUIModuleIOS.name, + feature_state, trial.get()); + return group; +} + +void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { + registry->RegisterIntegerPref(kTrialGroupPrefName, kDefaultPrefValue); +} + +void Create(const base::FieldTrial::EntropyProvider& low_entropy_provider, + base::FeatureList* feature_list, + PrefService* local_state) { + int trial_group = local_state->GetInteger(kTrialGroupPrefName); + if (trial_group == kDefaultPrefValue && !FirstRun::IsChromeFirstRun()) { + // Do not bucket existing users that have not been already been grouped. The + // experiment wants to only add users who have not seen the First Run + // Experience yet. + return; + } + // Create trial and group user for the first time, or tag users again to + // ensure the experiment can be used to filter UMA metrics. + trial_group = CreateFirstRunTrial(low_entropy_provider, feature_list); + // Persist the assigned group for subsequent runs. + local_state->SetInteger(kTrialGroupPrefName, trial_group); +} + +} // namespace fre_field_trial
diff --git a/ios/chrome/browser/ui/first_run/fre_field_trial.h b/ios/chrome/browser/ui/first_run/fre_field_trial.h new file mode 100644 index 0000000..d9cef25 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/fre_field_trial.h
@@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_FIRST_RUN_FRE_FIELD_TRIAL_H_ +#define IOS_CHROME_BROWSER_UI_FIRST_RUN_FRE_FIELD_TRIAL_H_ + +#include "base/metrics/field_trial.h" + +class PrefRegistrySimple; +class PrefService; + +namespace base { +class FeatureList; +} // namespace base + +namespace fre_field_trial { + +// Returns true if the user is in the group that will be shown the First Run +// Modal. +bool IsInFirstRunModalGroup(); + +// Returns true if the user is in the group that will have the location prompt +// removed from First Run. +bool IsInRemoveFirstRunPromptGroup(); + +// Registers the local state pref used to manage grouping for this field trial. +void RegisterLocalStatePrefs(PrefRegistrySimple* registry); + +// Creates a field trial to control the LocationPermissions feature. The trial +// is client controlled because one arm of the experiment involves changing the +// user experience during First Run. +// +// The trial group chosen on first run is persisted to local state prefs. +void Create(const base::FieldTrial::EntropyProvider& low_entropy_provider, + base::FeatureList* feature_list, + PrefService* local_state); + +} // namespace fre_field_trial + +#endif // IOS_CHROME_BROWSER_UI_FIRST_RUN_FRE_FIELD_TRIAL_H_
diff --git a/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.cc b/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.cc index db9e9149..be0516a 100644 --- a/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.cc +++ b/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.cc
@@ -22,11 +22,11 @@ scoped_refptr<base::FieldTrial> FirstRunFieldTrialConfig::CreateOneTimeRandomizedTrial( - const std::string& disabled_group_name, + const std::string& default_group_name, const base::FieldTrial::EntropyProvider& low_entropy_provider) { scoped_refptr<base::FieldTrial> trial = base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( - trial_name_, GetTotalProbability(), disabled_group_name, + trial_name_, GetTotalProbability(), default_group_name, base::FieldTrial::ONE_TIME_RANDOMIZED, 0, /*default_group_number=*/nullptr, &low_entropy_provider); for (const auto& group : groups_) {
diff --git a/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.h b/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.h index 0413f57..fd278b26 100644 --- a/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.h +++ b/ios/chrome/browser/ui/first_run/ios_first_run_field_trials.h
@@ -42,9 +42,9 @@ ~FirstRunFieldTrialConfig(); // Creates and returns a one-time randomized FieldTrial with - // |disabled_group_name| with groups configured with Google Variation IDs. + // |default_group_name| with groups configured with Google Variation IDs. scoped_refptr<base::FieldTrial> CreateOneTimeRandomizedTrial( - const std::string& disabled_group_name, + const std::string& default_group_name, const base::FieldTrial::EntropyProvider& low_entropy_provider); // Adds a new FieldTrial group of |name| with a probability of |percentage|.
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm index 12d45e3..38ac10c 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
@@ -65,6 +65,8 @@ promoAction:signin_metrics::PromoAction:: PROMO_ACTION_NO_SIGNIN_PROMO accountManagerService:accountManagerService]; + + [_logger logSigninStarted]; } return self; }
diff --git a/ios/chrome/browser/ui/first_run/sync/sync_screen_coordinator.mm b/ios/chrome/browser/ui/first_run/sync/sync_screen_coordinator.mm index e98d48a..95fdd4a 100644 --- a/ios/chrome/browser/ui/first_run/sync/sync_screen_coordinator.mm +++ b/ios/chrome/browser/ui/first_run/sync/sync_screen_coordinator.mm
@@ -73,7 +73,8 @@ AuthenticationService* authenticationService = AuthenticationServiceFactory::GetForBrowserState(browserState); - if (!authenticationService->GetAuthenticatedIdentity()) { + if (!authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)) { // Don't show sync screen if no logged-in user account. return [self.delegate willFinishPresenting]; }
diff --git a/ios/chrome/browser/ui/first_run/sync/sync_screen_mediator.mm b/ios/chrome/browser/ui/first_run/sync/sync_screen_mediator.mm index 9329349..928c7eb 100644 --- a/ios/chrome/browser/ui/first_run/sync/sync_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/sync/sync_screen_mediator.mm
@@ -50,8 +50,8 @@ - (void)startSyncWithConfirmationID:(const int)confirmationID consentIDs:(NSArray<NSNumber*>*)consentIDs advancedSyncSettingsLinkWasTapped:(BOOL)advancedSyncSettingsLinkWasTapped { - ChromeIdentity* identity = - self.authenticationService->GetAuthenticatedIdentity(); + ChromeIdentity* identity = self.authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSignin); DCHECK(identity); sync_pb::UserConsentTypes::SyncConsent syncConsent;
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm index 8373fb4..ee7473b 100644 --- a/ios/chrome/browser/ui/main/scene_controller.mm +++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -1063,7 +1063,8 @@ self.sceneState.appState.mainBrowserState); DCHECK(authenticationService); DCHECK(authenticationService->initialized()); - BOOL isSignedIn = authenticationService->IsAuthenticated(); + BOOL isSignedIn = authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin); // Tailored promos take priority over general promo. BOOL isMadeForIOSPromoEligible =
diff --git a/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm b/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm index 71ccb97..3898e8f 100644 --- a/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm +++ b/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm
@@ -20,7 +20,11 @@ @property(nonatomic, assign) BOOL stateChangedDuringAnimation; @property(nonatomic, assign) BOOL finalOmniboxFocusedState; @property(nonatomic, assign) BOOL finalToolbarExpandedState; -@property(nonatomic, assign) unsigned int inProgressAnimationCount; +@property(nonatomic, assign) int inProgressAnimationCount; + +// Sometimes, the toolbar animations finish before the omnibox animations are +// even queued, causing the final completions to be run too early. +@property(nonatomic, assign) BOOL areOmniboxChangesQueued; @end @@ -43,6 +47,7 @@ } self.isAnimating = animated; + self.areOmniboxChangesQueued = NO; self.inProgressAnimationCount = 0; if (toolbarExpanded) { @@ -62,11 +67,19 @@ // with a constraint animation seems to be to let the constraint animation // start and compute the final frames, then perform the transform animation. dispatch_async(dispatch_get_main_queue(), ^{ + self.areOmniboxChangesQueued = YES; if (omniboxFocused) { [self focusOmniboxAnimated:animated]; } else { [self defocusOmniboxAnimated:animated]; } + + // Make sure that some omnibox animations were queued. Otherwise, the final + // call to |animationFinished after the toolbar animations finished was + // interrupted and cleanup still needs to occur. + if (self.inProgressAnimationCount == 0 && self.isAnimating) { + [self animationFinished]; + } }); } @@ -139,6 +152,7 @@ completion:^(BOOL _) { [self animationFinished]; }]; + self.inProgressAnimationCount += 1; [UIView animateWithDuration:duration * 0.2 delay:duration * 0.8 @@ -320,19 +334,15 @@ - (void)animationFinished { self.inProgressAnimationCount -= 1; - if (self.inProgressAnimationCount > 0) { + // Make sure all the animations have been queued and finished. + if (!self.areOmniboxChangesQueued || self.inProgressAnimationCount > 0) { return; } // inProgressAnimation count should never be negative because it should // always be incremented before starting an animation and decremented // when the animation finishes. - // TODO(crbug.com/1224915): Relaxing DCHECK for iOS15 as this negative. See - // crbug for steps to reproduce. - if (@available(iOS 15, *)) { - } else { - DCHECK(self.inProgressAnimationCount == 0); - } + DCHECK(self.inProgressAnimationCount == 0); self.isAnimating = NO; if (self.stateChangedDuringAnimation) {
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index 8c182c6..e3337275 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -193,7 +193,7 @@ if (!_browser) return; - if (![self authService] -> IsAuthenticated()) { + if (![self authService]->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { // This accounts table view will be popped or dismissed when the user // is signed out. Avoid reloading it in that case as that would lead to an // empty table view. @@ -208,7 +208,7 @@ // Update the title with the name with the currently signed-in account. ChromeIdentity* authenticatedIdentity = - [self authService] -> GetAuthenticatedIdentity(); + [self authService]->GetPrimaryIdentity(signin::ConsentLevel::kSignin); NSString* title = nil; if (authenticatedIdentity) { title = [authenticatedIdentity userFullName]; @@ -220,7 +220,7 @@ [super loadModel]; - if (![self authService] -> IsAuthenticated()) + if (![self authService]->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) return; TableViewModel* model = self.tableViewModel; @@ -272,7 +272,8 @@ toSectionWithIdentifier:SectionIdentifierSignOut]; } else { // Adds a signout option if the account is not managed. - if (![self authService]->IsAuthenticatedIdentityManaged()) { + if (![self authService]->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)) { [model addItem:[self signOutItem] toSectionWithIdentifier:SectionIdentifierSignOut]; } @@ -291,7 +292,8 @@ [model setFooter:[self signOutSyncingFooterItem] forSectionWithIdentifier:SectionIdentifierSignOut]; } - } else if ([self authService]->IsAuthenticatedIdentityManaged()) { + } else if ([self authService]->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)) { [model setFooter:[self signOutManagedAccountFooterItem] forSectionWithIdentifier:SectionIdentifierSignOut]; } else { @@ -452,8 +454,8 @@ "-stopBrowserStateServiceObservers"; [self reloadData]; - if (![self authService] -> IsAuthenticated() && - _dimissAccountDetailsViewControllerBlock) { + if (![self authService]->HasPrimaryIdentity(signin::ConsentLevel::kSignin) && + _dimissAccountDetailsViewControllerBlock) { _dimissAccountDetailsViewControllerBlock(/*animated=*/YES); _dimissAccountDetailsViewControllerBlock = nil; } @@ -667,7 +669,7 @@ _alertCoordinator = nil; AuthenticationService* authService = [self authService]; - if (authService->IsAuthenticated()) { + if (authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { _authenticationOperationInProgress = YES; [self preventUserInteraction]; __weak AccountsTableViewController* weakSelf = self; @@ -685,7 +687,8 @@ // Logs the UMA metrics to record the data retention option selected by the user // on signout. If the account is managed the data will always be cleared. - (void)logSignoutMetricsWithForceClearData:(BOOL)forceClearData { - if (![self authService]->IsAuthenticatedIdentityManaged()) { + if (![self authService]->HasPrimaryIdentityManaged( + signin::ConsentLevel::kSignin)) { UMA_HISTOGRAM_BOOLEAN("Signin.UserRequestedWipeDataOnSignout", forceClearData); } @@ -718,7 +721,7 @@ if (!_browser) return; - if ([self authService] -> IsAuthenticated()) { + if ([self authService]->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { return; } if (_authenticationOperationInProgress) {
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm index 5498564..438c86f 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
@@ -142,7 +142,8 @@ } // Sync changes should only be commited if the user is authenticated and // the sign-in has not been interrupted. - if (self.authService->IsAuthenticated() && !self.signinInterrupted) { + if (self.authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin) && + !self.signinInterrupted) { SyncSetupService* syncSetupService = SyncSetupServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); @@ -200,7 +201,7 @@ ChromeIdentity* authenticatedIdentity = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()) - ->GetAuthenticatedIdentity(); + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); [self.googleServicesSettingsViewController preventUserInteraction]; DCHECK(!self.authenticationFlow); self.authenticationFlow = @@ -219,7 +220,8 @@ } - (void)openReauthDialogAsSyncIsInAuthError { - ChromeIdentity* identity = self.authService->GetAuthenticatedIdentity(); + ChromeIdentity* identity = + self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (self.authService->HasCachedMDMErrorForIdentity(identity)) { self.authService->ShowMDMErrorDialogForIdentity(identity); return; @@ -383,7 +385,7 @@ ChromeIdentity* primaryAccount = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()) - ->GetAuthenticatedIdentity(); + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); self.signinInterrupted = !success && primaryAccount; } @@ -410,7 +412,7 @@ ios::GetChromeBrowserProvider() .GetChromeIdentityService() ->PresentAccountDetailsController( - self.authService->GetAuthenticatedIdentity(), + self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin), self.googleServicesSettingsViewController, /*animated=*/YES); }
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm index 91b6cda0..fdcd6eadf 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -127,7 +127,7 @@ } // Returns YES if the user is authenticated. -@property(nonatomic, assign, readonly) BOOL isAuthenticated; +@property(nonatomic, assign, readonly) BOOL hasPrimaryIdentity; // Returns YES if Sync settings has been confirmed. @property(nonatomic, assign, readonly) BOOL isSyncSettingsConfirmed; // Returns YES if the user cannot turn on sync for enterprise policy reasons. @@ -254,7 +254,7 @@ // Loads the identity section. - (void)loadIdentitySection { self.accountItem = nil; - if (!self.isAuthenticated) + if (!self.hasPrimaryIdentity) return; [self createIdentitySection]; [self configureIdentityAccountItem]; @@ -297,7 +297,7 @@ TableViewModel* model = self.consumer.tableViewModel; BOOL hasIdentitySection = [model hasSectionForSectionIdentifier:IdentitySectionIdentifier]; - if (!self.isAuthenticated) { + if (!self.hasPrimaryIdentity) { if (!hasIdentitySection) { DCHECK(!self.accountItem); return; @@ -324,7 +324,8 @@ // Configures the identity account item. - (void)configureIdentityAccountItem { DCHECK(self.accountItem); - ChromeIdentity* identity = self.authService->GetAuthenticatedIdentity(); + ChromeIdentity* identity = + self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); DCHECK(identity); self.accountItem.image = [self.resizedAvatarCache resizedAvatarForIdentity:identity]; @@ -379,7 +380,7 @@ BOOL hasAccountSignInItem = [model hasItemForItemType:SignInItemType sectionIdentifier:SyncSectionIdentifier]; - if (self.isAuthenticated) { + if (self.hasPrimaryIdentity) { self.hasRecordedSigninImpression = NO; if (!hasAccountSignInItem) return NO; @@ -440,7 +441,7 @@ if (self.isSyncDisabledByAdministrator) { type = SyncDisabledByAdministratorErrorItemType; hasError = YES; - } else if (self.isAuthenticated && + } else if (self.hasPrimaryIdentity && self.syncSetupService->CanSyncFeatureStart()) { switch (self.syncSetupService->GetSyncServiceState()) { case SyncSetupService::kSyncServiceUnrecoverableError: @@ -668,8 +669,8 @@ #pragma mark - Properties -- (BOOL)isAuthenticated { - return self.authService->IsAuthenticated(); +- (BOOL)hasPrimaryIdentity { + return self.authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin); } - (BOOL)isSyncSettingsConfirmed { @@ -691,7 +692,7 @@ } - (BOOL)shouldDisplaySync { - return self.isAuthenticated && !self.isSyncDisabledByAdministrator; + return self.hasPrimaryIdentity && !self.isSyncDisabledByAdministrator; } - (ItemArray)nonPersonalizedItems { @@ -818,7 +819,7 @@ passwordLeakCheckItem.on = [self passwordLeakCheckItemOnState]; passwordLeakCheckItem.accessibilityIdentifier = kPasswordLeakCheckItemAccessibilityIdentifier; - passwordLeakCheckItem.enabled = self.isAuthenticated; + passwordLeakCheckItem.enabled = self.hasPrimaryIdentity; _passwordLeakCheckItem = passwordLeakCheckItem; } return _passwordLeakCheckItem; @@ -932,17 +933,17 @@ // based on the sync preference and the sign in status. - (BOOL)passwordLeakCheckItemOnState { return self.safeBrowsingPreference.value && - self.passwordLeakCheckEnabled.value && self.isAuthenticated; + self.passwordLeakCheckEnabled.value && self.hasPrimaryIdentity; } // Updates the detail text and on state of the leak check item based on the // state. - (void)updateLeakCheckItem { self.passwordLeakCheckItem.enabled = - self.isAuthenticated && self.safeBrowsingPreference.value; + self.hasPrimaryIdentity && self.safeBrowsingPreference.value; self.passwordLeakCheckItem.on = [self passwordLeakCheckItemOnState]; - if (!self.isAuthenticated && self.passwordLeakCheckEnabled.value) { + if (!self.hasPrimaryIdentity && self.passwordLeakCheckEnabled.value) { // If the user is signed out and the sync preference is enabled, this // informs that it will be turned on on sign in. self.passwordLeakCheckItem.detailText = @@ -987,7 +988,7 @@ ItemType type = static_cast<ItemType>(item.type); switch (type) { case AllowChromeSigninItemType: { - if (self.isAuthenticated) { + if (self.hasPrimaryIdentity) { __weak GoogleServicesSettingsMediator* weakSelf = self; [self.commandHandler showSignOutFromTargetRect:targetRect @@ -1118,7 +1119,7 @@ [self updateSyncSection:YES]; // It is possible for |onSyncStateChanged| to be called before // |onPrimaryAccountCleared|, when the primary account is removed. - if (self.isAuthenticated && self.accountItem) { + if (self.hasPrimaryIdentity && self.accountItem) { [self configureIdentityAccountItem]; [self.consumer reloadItem:self.accountItem]; }
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm index faa854a..2205d156 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -128,7 +128,8 @@ // Sync changes should only be commited if the user is authenticated and // the sign-in has not been interrupted. if (base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency) && - (self.authService->IsAuthenticated() || !self.signinInterrupted)) { + (self.authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin) || + !self.signinInterrupted)) { SyncSetupService* syncSetupService = SyncSetupServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); @@ -188,7 +189,7 @@ ChromeIdentity* primaryAccount = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()) - ->GetAuthenticatedIdentity(); + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); // TODO(crbug.com/1101346): SigninCoordinatorResult should be received instead // of guessing if the sign-in has been interrupted. self.signinInterrupted = !success && primaryAccount; @@ -226,8 +227,8 @@ ios::GetChromeBrowserProvider() .GetChromeIdentityService() ->PresentWebAndAppSettingDetailsController( - authService->GetAuthenticatedIdentity(), self.viewController, - YES); + authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin), + self.viewController, YES); } - (void)openDataFromChromeSyncWebPage { @@ -306,7 +307,7 @@ ChromeIdentity* authenticatedIdentity = AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()) - ->GetAuthenticatedIdentity(); + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin); [self.viewController preventUserInteraction]; DCHECK(!self.authenticationFlow); self.authenticationFlow = @@ -324,7 +325,8 @@ } - (void)openReauthDialogAsSyncIsInAuthError { - ChromeIdentity* identity = self.authService->GetAuthenticatedIdentity(); + ChromeIdentity* identity = + self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (self.authService->HasCachedMDMErrorForIdentity(identity)) { self.authService->ShowMDMErrorDialogForIdentity(identity); return;
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm index 4b48f85e..31b1d84 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm
@@ -114,7 +114,11 @@ form.url = GURL(website + "/login"); form.action = GURL(website + "/action"); form.username_element = u"email"; - + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); store()->AddLogin(form); store()->AddInsecureCredential(MakeInsecureCredential(website, username)); }
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm index 6af47c5..bf3ee9c 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -58,6 +58,11 @@ form.password_value = u"test"; form.signon_realm = "http://www.example.com/"; form.in_store = PasswordForm::Store::kProfileStore; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form.password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); return form; }
diff --git a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm index fae4320e..4741268 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm
@@ -173,6 +173,11 @@ form->signon_realm = "http://www.example.com/"; form->scheme = password_manager::PasswordForm::Scheme::kHtml; form->blocked_by_user = false; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form->password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); AddPasswordForm(std::move(form)); } @@ -189,6 +194,11 @@ form->signon_realm = "http://www.example2.com/"; form->scheme = password_manager::PasswordForm::Scheme::kHtml; form->blocked_by_user = false; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form->password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); AddPasswordForm(std::move(form)); } @@ -206,6 +216,11 @@ form->signon_realm = "http://www.secret.com/"; form->scheme = password_manager::PasswordForm::Scheme::kHtml; form->blocked_by_user = true; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form->password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); AddPasswordForm(std::move(form)); } @@ -223,6 +238,11 @@ form->signon_realm = "http://www.secret2.com/"; form->scheme = password_manager::PasswordForm::Scheme::kHtml; form->blocked_by_user = true; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form->password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); AddPasswordForm(std::move(form)); }
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm index c054c6c..58757f5 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm
@@ -190,6 +190,11 @@ form->signon_realm = "http://www.example.com/"; form->scheme = password_manager::PasswordForm::Scheme::kHtml; form->blocked_by_user = false; + // TODO(crbug.com/1223022): Once all places that operate changes on forms + // via UpdateLogin properly set |password_issues|, setting them to an empty + // map should be part of the default constructor. + form->password_issues = + base::flat_map<InsecureType, password_manager::InsecurityMetadata>(); AddPasswordForm(std::move(form)); }
diff --git a/ios/chrome/browser/ui/settings/search_engine_settings_egtest.mm b/ios/chrome/browser/ui/settings/search_engine_settings_egtest.mm index bccf081..5f4cbf7 100644 --- a/ios/chrome/browser/ui/settings/search_engine_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/search_engine_settings_egtest.mm
@@ -184,11 +184,30 @@ performAction:grey_swipeSlowInDirectionWithStartPoint(kGREYDirectionLeft, 0.2, 0.5)]; - [[EarlGrey - selectElementWithMatcher:grey_allOf(grey_accessibilityLabel(@"Delete"), - grey_kindOfClassName( - @"UISwipeActionStandardButton"), - nil)] performAction:grey_tap()]; + id<GREYMatcher> deleteButtonMatcher = + grey_allOf(grey_accessibilityLabel(@"Delete"), + grey_kindOfClassName(@"UISwipeActionStandardButton"), nil); + // Depending on the device, the swipe may have deleted the element or just + // displayed the "Delete" button. Check if the delete button is still on + // screen and tap it if it is the case. + GREYCondition* waitForDeleteToDisappear = [GREYCondition + conditionWithName:@"Element is already deleted" + block:^{ + NSError* error = nil; + [[EarlGrey selectElementWithMatcher:deleteButtonMatcher] + assertWithMatcher:grey_nil() + error:&error]; + return error == nil; + }]; + + bool matchedElement = [waitForDeleteToDisappear + waitWithTimeout:base::test::ios::kWaitForUIElementTimeout]; + + if (!matchedElement) { + // Delete button is still on screen, tap it + [[EarlGrey selectElementWithMatcher:deleteButtonMatcher] + performAction:grey_tap()]; + } [[EarlGrey selectElementWithMatcher:customSearchEngineCell] assertWithMatcher:grey_nil()];
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm index 5f0fbe3..edd2c1d 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -339,7 +339,7 @@ AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState(_browserState); - _identity = authService->GetAuthenticatedIdentity(); + _identity = authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); _identityServiceObserver.reset( new ChromeIdentityServiceObserverBridge(self)); @@ -550,7 +550,7 @@ if (!signin::IsSigninAllowed(_browserState->GetPrefs())) { // Ensure that the user sign-in state always reflects the sign-in allowed // preference. - DCHECK(!authService->IsAuthenticated()); + DCHECK(!authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)); item = signin::IsSigninAllowedByPolicy(_browserState->GetPrefs()) ? [self signinDisabledTextItem] : [self signinDisabledByPolicyTextItem]; @@ -579,7 +579,7 @@ [_signinPromoViewMediator signinPromoViewIsVisible]; item = signinPromoItem; - } else if (!authService->IsAuthenticated()) { + } else if (!authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { AccountSignInItem* signInTextItem = [[AccountSignInItem alloc] initWithType:SettingsItemTypeSignInButton]; signInTextItem.accessibilityIdentifier = kSettingsSignInCellId; @@ -617,7 +617,7 @@ TableViewModel<TableViewItem*>* model = self.tableViewModel; AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState(_browserState); - if (authService->IsAuthenticated()) { + if (authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { // Account profile item. [model addItem:[self accountCellItem] toSectionWithIdentifier:SettingsSectionIdentifierAccount]; @@ -627,7 +627,7 @@ // Add Sync & Google Services cell. if (base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency)) { // Sync item. - if (authService->IsAuthenticated()) { + if (authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { [model addItem:[self googleSyncDetailItem] toSectionWithIdentifier:SettingsSectionIdentifierAccount]; } @@ -655,7 +655,7 @@ signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS prefService:_browserState ->GetPrefs()] && - !authService->IsAuthenticated(); + !authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin); } // Returns YES if the Sync service is available and all promos have not been @@ -1515,7 +1515,7 @@ - (void)updateIdentityAccountItem:(TableViewAccountItem*)identityAccountItem { AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState(_browserState); - _identity = authService->GetAuthenticatedIdentity(); + _identity = authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (!_identity) { // This could occur during the sign out process. Just ignore as the account // cell will be replaced by the "Sign in" button. @@ -1567,7 +1567,7 @@ SyncSetupServiceFactory::GetForBrowserState(_browserState); AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState(_browserState); - if (!authService->IsAuthenticated()) { + if (!authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { // No sync status when the user is not signed-in. googleServicesItem.detailText = nil; googleServicesItem.image = @@ -1665,7 +1665,7 @@ AuthenticationService* authService = AuthenticationServiceFactory::GetForBrowserState(_browserState); - if (authService->IsAuthenticated()) { + if (authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { if (_googleSyncDetailItem) { [self updateGoogleSyncDetailItem:_googleSyncDetailItem]; [self reconfigureCellsForItems:@[ _googleSyncDetailItem ]];
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm index 02129b01..b0a6260d 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm
@@ -111,8 +111,9 @@ base::Time passphraseTime = service->GetUserSettings()->GetExplicitPassphraseTime(); NSString* userEmail = - [AuthenticationServiceFactory::GetForBrowserState(browserState) - ->GetAuthenticatedIdentity() userEmail]; + AuthenticationServiceFactory::GetForBrowserState(browserState) + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin) + .userEmail; DCHECK(userEmail); _headerMessage = passphraseTime.is_null() @@ -531,7 +532,7 @@ - (void)onEndBatchOfRefreshTokenStateChanges { ChromeBrowserState* browserState = self.browser->GetBrowserState(); if (AuthenticationServiceFactory::GetForBrowserState(browserState) - ->IsAuthenticated()) { + ->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { return; } [base::mac::ObjCCastStrict<SettingsNavigationController>(
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm index 5ec11e4..a906e26 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm
@@ -107,9 +107,10 @@ EXPECT_EQ(1, NumberOfSections()); EXPECT_EQ(2, NumberOfItemsInSection(0)); // Passphrase message item. - NSString* userEmail = [AuthenticationServiceFactory::GetForBrowserState( - chrome_browser_state_.get()) - ->GetAuthenticatedIdentity() userEmail]; + NSString* userEmail = AuthenticationServiceFactory::GetForBrowserState( + chrome_browser_state_.get()) + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin) + .userEmail; EXPECT_NSEQ( l10n_util::GetNSStringF(IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL, base::SysNSStringToUTF16(userEmail)),
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn index b9e7f1d..11934694 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
@@ -2,8 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//ios/public/provider/chrome/browser/build_config.gni") - source_set("grid_ui_constants") { configs += [ "//build/config/compiler:enable_arc" ] sources = [
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb index 63fb1ce..84f0a0fa 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Vind uit hoe</translation> <translation id="7294706895582948780">Vul Chrome-wagwoorde outomaties in</translation> <translation id="7362314760212854110">Jy het onlangs by jou Google-rekening afgemeld. Meld by Chrome aan om jou wagwoorde te sien.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Wys besonderhede</translation> <translation id="8219905600827687498">Voorgestelde wagwoorde</translation> <translation id="8300526662653766176">Stel 'n wagkode</translation> <translation id="8518521100965196752">Om wagwoorde te gebruik, moet jy eers 'n wagkode op jou toestel stel.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Geen soekresultate gevind nie</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb index 10e768d..ee8a6ff 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">እንዴት እንደሆነ ይወቁ</translation> <translation id="7294706895582948780">የChrome ይለፍ ቃላትን ራስ-ሙላ</translation> <translation id="7362314760212854110">በቅርቡ ከGoogle መለያዎ ዘግተው ወጥተው ነበር። የይለፍ ቃላትዎን ለማየት ወደ Chrome ይግቡ።</translation> +<translation id="8179976553408161302">አስገባ</translation> <translation id="8190452200642501331">ዝርዝሮቹን አሳይ</translation> <translation id="8219905600827687498">የተጠቆሙ የይለፍ ቃላት</translation> <translation id="8300526662653766176">የይለፍ ኮድ ያዘጋጁ</translation> <translation id="8518521100965196752">የይለፍ ቃላትን ለመጠቀም በመጀመሪያ በመሣሪያዎ ላይ የይለፍ ኮድ ማቀናበር አለብዎት።</translation> <translation id="8877181643142698531">ዩአርኤል</translation> -<translation id="895466449242525281">ምንም የፍለጋ ውጤቶች አልተገኙም</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb index f3470ef..c2ff64b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">طريقة التنفيذ</translation> <translation id="7294706895582948780">الملء التلقائي لكلمات المرور في متصفِّح Chrome</translation> <translation id="7362314760212854110">تم تسجيل الخروج من حسابك على Google مؤخّرًا. للاطّلاع على كلمات المرور الخاصة بك، يُرجى تسجيل الدخول إلى متصفِّح Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">عرض التفاصيل</translation> <translation id="8219905600827687498">كلمات المرور المقترَحة</translation> <translation id="8300526662653766176">إعداد رمز مرور</translation> <translation id="8518521100965196752">لاستخدام كلمات المرور، يجب أولاً إعداد رمز مرور على جهازك.</translation> <translation id="8877181643142698531">عنوان URL</translation> -<translation id="895466449242525281">لم يتم العثور على أي نتائج بحث.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb index 296953e..b2761e2a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">কেনেকৈ কৰিব জানক</translation> <translation id="7294706895582948780">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা Chromeৰ পাছৱৰ্ডসমূহ</translation> <translation id="7362314760212854110">আপুনি শেহতীয়াকৈ নিজৰ Google একাউণ্টৰ পৰা ছাইন আউট কৰিছে। আপোনাৰ পাছৱৰ্ডসমূহ চাবলৈ Chromeত ছাইন ইন কৰক।</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">সবিশেষ দেখুৱাওক</translation> <translation id="8219905600827687498">পৰামৰ্শ হিচাপে আগবঢ়োৱা পাছৱৰ্ডসমূহ</translation> <translation id="8300526662653766176">এটা পাছক’ড ছেট কৰক</translation> <translation id="8518521100965196752">পাছৱৰ্ডসমূহ ব্যৱহাৰ কৰিবলৈ আপুনি প্ৰথমে নিজৰ ডিভাইচত এটা পাছক’ড ছেট কৰিবই লাগিব।</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">সন্ধানৰ কোনো ফলাফল পোৱা নগ’ল</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb index d448f33..575184d 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">İstifadə qaydasını öyrənin</translation> <translation id="7294706895582948780">Chrome Parollarını Avtomatik Doldurun</translation> <translation id="7362314760212854110">Bu yaxınlarda Google Hesabınızdan çıxmısınız. Parollarınızı görmək üçün Chrome'a daxil olun.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Detalları göstərin</translation> <translation id="8219905600827687498">Təklif edilən parollar</translation> <translation id="8300526662653766176">Parol ayarlayın</translation> <translation id="8518521100965196752">Parollardan istifadə etmək üçün əvvəlcə cihazınızda parol ayarlamalısınız.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Heç bir axtarış nəticəsi tapılmadı</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb index 4668be9..6ecf8cd8 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Даведацца больш</translation> <translation id="7294706895582948780">Функцыя аўтазапаўнення для пароляў Chrome</translation> <translation id="7362314760212854110">Вы нядаўна выйшлі са свайго Уліковага запісу Google. Увайдзіце ў Chrome, каб паглядзець свае паролі.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Паказаць падрабязныя звесткі</translation> <translation id="8219905600827687498">Прапанаваныя паролі</translation> <translation id="8300526662653766176">Задайце код доступу</translation> <translation id="8518521100965196752">Каб выкарыстоўваць паролі, на прыладзе трэба спачатку наладзіць блакіроўку экрана.</translation> <translation id="8877181643142698531">URL-адрас</translation> -<translation id="895466449242525281">Няма вынікаў пошуку</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb index ef0e5f98..17d86a4 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Научете как</translation> <translation id="7294706895582948780">Автоматично попълване на пароли в Chrome</translation> <translation id="7362314760212854110">Наскоро излязохте от профила си в Google. За да видите паролите си, влезте в Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Показване на подробностите</translation> <translation id="8219905600827687498">Предложени пароли</translation> <translation id="8300526662653766176">Задаване на код за достъп</translation> <translation id="8518521100965196752">За да използвате паролите, трябва първо да зададете код за достъп на устройството си.</translation> <translation id="8877181643142698531">URL адрес</translation> -<translation id="895466449242525281">Няма намерени резултати от търсенето</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb index 819a9e6..89b2540 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">কীভাবে করবেন জানুন</translation> <translation id="7294706895582948780">Chrome-এর পাসওয়ার্ড অটোফিল করা</translation> <translation id="7362314760212854110">আপনার Google অ্যাকাউন্ট থেকে সম্প্রতি সাইন-আউট করেছেন। আপনার পাসওয়ার্ড দেখতে, Chrome-এ সাইন-ইন করুন।</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">বিস্তারিত বিবরণ দেখুন</translation> <translation id="8219905600827687498">সাজেস্ট করা পাসওয়ার্ড</translation> <translation id="8300526662653766176">একটি পাসকোড সেট করুন</translation> <translation id="8518521100965196752">পাসওয়ার্ড ব্যবহার করার জন্য আপনার ডিভাইসে আপনাকে একটি পাসকোড সেট করতে হবে।</translation> <translation id="8877181643142698531">ইউআরএল</translation> -<translation id="895466449242525281">কোনও সার্চ ফলাফল পাওয়া যায়নি</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb index a3de164..7adc2de 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Saznajte kako</translation> <translation id="7294706895582948780">Automatsko popunjavanje lozinki za Chrome</translation> <translation id="7362314760212854110">Nedavno ste se odjavili s Google računa. Da vidite lozinke, prijavite se na Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Prikaz detalja</translation> <translation id="8219905600827687498">Predložene lozinke</translation> <translation id="8300526662653766176">Postavite šifru</translation> <translation id="8518521100965196752">Prvo postavite šifru na uređaju da koristite lozinke.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nije pronađen nijedan rezultat pretraživanja</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb index 8b84318..3e1bc17 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Informació</translation> <translation id="7294706895582948780">Autocompleta les contrasenyes de Chrome</translation> <translation id="7362314760212854110">Fa poc has tancat la sessió del teu Compte de Google. Per veure les teves contrasenyes, inicia la sessió a Chrome.</translation> +<translation id="8179976553408161302">Retorn</translation> <translation id="8190452200642501331">Mostra els detalls</translation> <translation id="8219905600827687498">Contrasenyes suggerides</translation> <translation id="8300526662653766176">Estableix una contrasenya</translation> <translation id="8518521100965196752">Per utilitzar les contrasenyes, primer has d'establir una contrasenya al dispositiu.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">No s'ha trobat cap resultat de la cerca</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb index 183135e9..783e409 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Postup</translation> <translation id="7294706895582948780">Automatické vyplňování hesel Chromu</translation> <translation id="7362314760212854110">Nedávno jste byli odhlášeni z účtu Google. Chcete-li zobrazit hesla, přihlaste se do Chromu.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Zobrazit podrobnosti</translation> <translation id="8219905600827687498">Návrhy hesel</translation> <translation id="8300526662653766176">Nastavte heslo</translation> <translation id="8518521100965196752">Chcete-li použít hesla, musíte nejdříve na zařízení nastavit heslo.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nebyly nalezeny žádné výsledky</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb index 0b4765d0..6dcf89a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Sådan gør du</translation> <translation id="7294706895582948780">Udfyld Chrome-adgangskoder automatisk</translation> <translation id="7362314760212854110">Du loggede for nylig ud af din Google-konto. Log ind i Chrome for at se dine adgangskoder.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Se info</translation> <translation id="8219905600827687498">Forslag til adgangskoder</translation> <translation id="8300526662653766176">Angiv en adgangskode</translation> <translation id="8518521100965196752">Før du kan bruge adgangskoder, skal du angive en adgangskode på din enhed.</translation> <translation id="8877181643142698531">Webadresse</translation> -<translation id="895466449242525281">Der blev ikke fundet nogen søgeresultater</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb index 8fb0a98..49555e2 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Weitere Informationen</translation> <translation id="7294706895582948780">Chrome-Passwörter automatisch ausfüllen</translation> <translation id="7362314760212854110">Sie haben sich kürzlich von Ihrem Google-Konto abgemeldet. Wenn Sie Ihre Passwörter einsehen möchten, melden Sie sich in Chrome an.</translation> +<translation id="8179976553408161302">Eingabetaste</translation> <translation id="8190452200642501331">Details anzeigen</translation> <translation id="8219905600827687498">Vorgeschlagene Passwörter</translation> <translation id="8300526662653766176">Sicherheitscode einrichten</translation> <translation id="8518521100965196752">Sie müssen zuerst einen Code auf Ihrem Gerät einrichten, um Passwörter zu verwenden.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Keine Suchergebnisse gefunden</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb index ca28bdc..1ef4c9ad 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Μάθετε πώς</translation> <translation id="7294706895582948780">Αυτοσυμπλήρωση κωδικών πρόσβασης Chrome</translation> <translation id="7362314760212854110">Αποσυνδεθήκατε πρόσφατα από τον Λογαριασμό σας Google. Για να δείτε τους κωδικούς πρόσβασής σας, συνδεθείτε στο Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Εμφάνιση λεπτομερειών</translation> <translation id="8219905600827687498">Προτεινόμενοι κωδικοί πρόσβασης</translation> <translation id="8300526662653766176">Ορισμός κωδικού πρόσβασης</translation> <translation id="8518521100965196752">Για να χρησιμοποιήσετε κωδικούς πρόσβασης, θα πρέπει πρώτα να ορίσετε έναν κωδικό πρόσβασης στη συσκευή σας.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Δεν βρέθηκαν αποτελέσματα αναζήτησης.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb index d1ea330..cf33ca20 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Learn how</translation> <translation id="7294706895582948780">Auto-fill Chrome passwords</translation> <translation id="7362314760212854110">You recently signed out of your Google Account. To see your passwords, sign in to Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Show details</translation> <translation id="8219905600827687498">Suggested passwords</translation> <translation id="8300526662653766176">Set a passcode</translation> <translation id="8518521100965196752">To use passwords, you must first set a passcode on your device.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">No search results found</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb index a735fdb..f81bea6 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Más información</translation> <translation id="7294706895582948780">Autocompletar las contraseñas de Chrome</translation> <translation id="7362314760212854110">Saliste de tu Cuenta de Google hace poco. Para ver las contraseñas, accede a Chrome.</translation> +<translation id="8179976553408161302">Intro</translation> <translation id="8190452200642501331">Mostrar detalles</translation> <translation id="8219905600827687498">Contraseñas sugeridas</translation> <translation id="8300526662653766176">Establece un código</translation> <translation id="8518521100965196752">Para usar contraseñas, primero debes establecer un código en tu dispositivo.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">No se encontraron resultados en la búsqueda</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb index ddbf166..8d38b48 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Más información</translation> <translation id="7294706895582948780">Autocompletar contraseñas de Chrome</translation> <translation id="7362314760212854110">Has cerrado la sesión de tu cuenta de Google recientemente. Para ver tus contraseñas, inicia sesión en Chrome.</translation> +<translation id="8179976553408161302">Intro</translation> <translation id="8190452200642501331">Mostrar detalles</translation> <translation id="8219905600827687498">Contraseñas sugeridas</translation> <translation id="8300526662653766176">Establecer una contraseña</translation> <translation id="8518521100965196752">Para usar las contraseñas, primero debes establecer una contraseña en tu dispositivo.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">No se han encontrado resultados de búsqueda</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb index 8dd213d..131e3d8 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Juhised</translation> <translation id="7294706895582948780">Chrome'i paroolide automaatne täitmine</translation> <translation id="7362314760212854110">Logisite hiljuti oma Google'i kontolt välja. Oma paroolide nägemiseks logige Chrome'i sisse.</translation> +<translation id="8179976553408161302">Sisestusklahv</translation> <translation id="8190452200642501331">Kuva üksikasjad</translation> <translation id="8219905600827687498">Soovitatud paroolid</translation> <translation id="8300526662653766176">Pääsukoodi seadistamine</translation> <translation id="8518521100965196752">Paroolide kasutamiseks peate oma seadmes esmalt pääsukoodi seadistama.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Otsingutulemusi ei leitud</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb index cb54610..0b251f9 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Lortu argibideak</translation> <translation id="7294706895582948780">Bete automatikoki Chrome-ko pasahitzak</translation> <translation id="7362314760212854110">Google-ko kontuko saioa amaitu duzu duela gutxi. Pasahitzak ikusteko, hasi saioa Chrome-n.</translation> +<translation id="8179976553408161302">Sartu</translation> <translation id="8190452200642501331">Erakutsi xehetasunak</translation> <translation id="8219905600827687498">Iradokitako pasahitzak</translation> <translation id="8300526662653766176">Ezarri pasakode bat</translation> <translation id="8518521100965196752">Pasahitzak erabiltzeko, lehenik, pasakode bat ezarri behar duzu gailuan.</translation> <translation id="8877181643142698531">URLa</translation> -<translation id="895466449242525281">Ez da aurkitu bilaketa-emaitzarik</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb index b5b46606..e61ebd82 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">با نحوه انجام کار آشنا شوید</translation> <translation id="7294706895582948780">تکمیل خودکار گذرواژههای Chrome</translation> <translation id="7362314760212854110">بهتازگی از سیستم «حساب Google» خود خارج شدهاید. برای دیدن گذرواژههایتان، به سیستم Chrome وارد شوید.</translation> +<translation id="8179976553408161302">ورود</translation> <translation id="8190452200642501331">نمایش جزئیات</translation> <translation id="8219905600827687498">گذرواژههای پیشنهادشده</translation> <translation id="8300526662653766176">تنظیم گذرنویسه</translation> <translation id="8518521100965196752">برای استفاده از گذرواژهها، ابتدا باید گذرنویسهای در دستگاه تنظیم کنید.</translation> <translation id="8877181643142698531">نشانی وب</translation> -<translation id="895466449242525281">هیچ نتیجهای برای جستجو پیدا نشد</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb index 03a023f4..aa37b07d 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Lue lisää</translation> <translation id="7294706895582948780">Chromen automaattisen täytön salasanat</translation> <translation id="7362314760212854110">Kirjauduit äskettäin ulos Google-tililtäsi. Jos haluat nähdä salasanasi, kirjaudu Chromeen.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Näytä tiedot</translation> <translation id="8219905600827687498">Salasanaehdotukset</translation> <translation id="8300526662653766176">Aseta tunnuskoodi</translation> <translation id="8518521100965196752">Salasanojen käyttöä varten sinun on ensin asetettava laitteellesi tunnuskoodi.</translation> <translation id="8877181643142698531">URL-osoite</translation> -<translation id="895466449242525281">Ei hakutuloksia</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb index e97ad747..96eaa2a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Alamin Kung Paano</translation> <translation id="7294706895582948780">Gumamit ng AutoFill sa Mga Password sa Chrome</translation> <translation id="7362314760212854110">Nag-sign out ka kamakailan sa iyong Google Account. Para makita ang iyong mga password, mag-sign in sa Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Ipakita ang Mga Detalye</translation> <translation id="8219905600827687498">Mga Iminumungkahing Password</translation> <translation id="8300526662653766176">Magtakda ng Passcode</translation> <translation id="8518521100965196752">Para gumamit ng mga password, dapat ka munang magtakda ng passcode sa iyong device.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Walang nakitang resulta ng paghahanap</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb index 145ce9e..4f550dca 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Découvrir comment</translation> <translation id="7294706895582948780">Remplir automatiquement les mots de passe dans Chrome</translation> <translation id="7362314760212854110">Vous vous êtes récemment déconnecté de votre compte Google. Pour afficher vos mots de passe, connectez-vous à Chrome.</translation> +<translation id="8179976553408161302">Entrée</translation> <translation id="8190452200642501331">Afficher les renseignements</translation> <translation id="8219905600827687498">Mots de passe suggérés</translation> <translation id="8300526662653766176">Définir un mot de passe</translation> <translation id="8518521100965196752">Pour utiliser vos mots de passe, vous devez d'abord définir un code sur votre appareil.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Aucun résultat de recherche n'a été trouvé</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb index 8a8100bf..656abb6 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">En savoir plus</translation> <translation id="7294706895582948780">Saisir automatiquement les mots de passe Chrome</translation> <translation id="7362314760212854110">Vous vous êtes récemment déconnecté de votre compte Google. Pour afficher vos mots de passe, connectez-vous à Chrome.</translation> +<translation id="8179976553408161302">Entrée</translation> <translation id="8190452200642501331">Afficher les détails</translation> <translation id="8219905600827687498">Mots de passe suggérés</translation> <translation id="8300526662653766176">Définir un code secret</translation> <translation id="8518521100965196752">Pour utiliser les mots de passe, vous devez d'abord définir un code secret sur votre appareil.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Aucun résultat de recherche n'a été trouvé</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb index 2a040a2..5ec67e1 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Máis información</translation> <translation id="7294706895582948780">Autocompletar contrasinais de Chrome</translation> <translation id="7362314760212854110">Pechaches sesión recentemente na túa Conta de Google. Para ver os teus contrasinais, inicia sesión en Chrome.</translation> +<translation id="8179976553408161302">Intro</translation> <translation id="8190452200642501331">Mostrar detalles</translation> <translation id="8219905600827687498">Contrasinais suxeridos</translation> <translation id="8300526662653766176">Define un contrasinal</translation> <translation id="8518521100965196752">Para usar os contrasinais, en primeiro lugar debes definir un contrasinal no teu dispositivo.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Non se encontraron resultados de busca</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb index 9ce518d..c0a67ff 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">જાણો કેવી રીતે</translation> <translation id="7294706895582948780">Chromeના પાસવર્ડ ઑટોમૅટિક રીતે ભરાય</translation> <translation id="7362314760212854110">તમે તાજેતરમાં તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થયા હતા. તમારા પાસવર્ડ જોવા માટે, Chromeમાં સાઇન ઇન કરો.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">વિગતો બતાવો</translation> <translation id="8219905600827687498">સૂચવેલા પાસવર્ડ</translation> <translation id="8300526662653766176">પાસકોડ સેટ કરો</translation> <translation id="8518521100965196752">પાસવર્ડનો ઉપયોગ કરવા માટે, તમારે પહેલાં તમારા ડિવાઇસ પર પાસકોડ સેટ કરવો આવશ્યક છે.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">કોઈ શોધ પરિણામ મળ્યું નથી</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb index 06504e5..5afc757c 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">तरीका जानें</translation> <translation id="7294706895582948780">Chrome में सेव सभी पासवर्ड ऑटोमैटिक भरें</translation> <translation id="7362314760212854110">आपने हाल ही में अपने Google खाते से साइन आउट किया है. अपने पासवर्ड देखने के लिए, Chrome में साइन इन करें.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">जानकारी दिखाएं</translation> <translation id="8219905600827687498">सुझाए गए पासवर्ड</translation> <translation id="8300526662653766176">पासवर्ड सेट करें</translation> <translation id="8518521100965196752">पासवर्ड इस्तेमाल करने के लिए, आपको सबसे पहले अपने डिवाइस पर एक पासवर्ड सेट करना होगा.</translation> <translation id="8877181643142698531">यूआरएल</translation> -<translation id="895466449242525281">कोई भी खोज नतीजा नहीं मिला</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb index e595151..cf131ba9 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Saznajte kako</translation> <translation id="7294706895582948780">Automatsko popunjavanje zaporki u Chromeu</translation> <translation id="7362314760212854110">Nedavno ste se odjavili s Google računa. Da biste vidjeli svoje zaporke, prijavite se u Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Prikaz pojedinosti</translation> <translation id="8219905600827687498">Predložene zaporke</translation> <translation id="8300526662653766176">Postavite šifru</translation> <translation id="8518521100965196752">Da biste koristili zaporke, najprije morate postaviti šifru na uređaju.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nema rezultata pretraživanja</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb index 9993b4b..4ae05b7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">További információ</translation> <translation id="7294706895582948780">Chrome-jelszavak automatikus kitöltése</translation> <translation id="7362314760212854110">Nemrég kijelentkezett Google-fiókjából. Jelszavai megtekintéséhez jelentkezzen be a Chrome-ba.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Részletek megjelenítése</translation> <translation id="8219905600827687498">Javasolt jelszavak</translation> <translation id="8300526662653766176">Biztonsági kód beállítása</translation> <translation id="8518521100965196752">A jelszavak használatához előbb be kell állítania az eszközön a biztonsági kódot.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nincs találat</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb index 856713a..0e2aabba 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Իմանալ ավելին</translation> <translation id="7294706895582948780">Chrome-ի գաղտնաբառերի ինքնալրացում</translation> <translation id="7362314760212854110">Դուք վերջերս դուրս եք եկել ձեր Google հաշվից։ Ձեր գաղտնաբառերը տեսնելու համար մտեք հաշիվ Chrome դիտարկիչում։</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Ցուցադրել մանրամասները</translation> <translation id="8219905600827687498">Առաջարկվող գաղտնաբառեր</translation> <translation id="8300526662653766176">Սահմանեք անցակոդ</translation> <translation id="8518521100965196752">Գաղտնաբառերն օգտագործելու համար նախ պետք է ձեր սարքում անցակոդ սահմանեք։</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Որոնման արդյունքներ չկան</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb index 548bd980..9d53614 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Pelajari Caranya</translation> <translation id="7294706895582948780">Isi Otomatis Sandi Chrome</translation> <translation id="7362314760212854110">Anda baru saja logout dari Akun Google. Untuk melihat sandi Anda, login ke Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Tampilkan Detail</translation> <translation id="8219905600827687498">Sandi yang Disarankan</translation> <translation id="8300526662653766176">Setel Kode Sandi</translation> <translation id="8518521100965196752">Untuk menggunakan sandi, Anda harus menyetel kode sandi di perangkat terlebih dahulu.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Hasil penelusuran tidak ditemukan</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb index 45305e91..2fb64bb 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Kynntu þér hvernig</translation> <translation id="7294706895582948780">Sjálfvirk útfylling aðgangsorða í Chrome</translation> <translation id="7362314760212854110">Þú skráðir þig nýlega út af Google reikningnum. Skráðu þig inn á Chrome til að sjá aðgangsorðin þín.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Sýna upplýsingar</translation> <translation id="8219905600827687498">Uppástungur um aðgangsorð</translation> <translation id="8300526662653766176">Veldu aðgangskóða</translation> <translation id="8518521100965196752">Til að nota aðgangsorð þarftu fyrst að stilla aðgangskóða í tækinu þínu.</translation> <translation id="8877181643142698531">Vefslóð</translation> -<translation id="895466449242525281">Engar leitarniðurstöður fundust</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb index 93fc347..63ed11e 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Scopri come</translation> <translation id="7294706895582948780">Usa Riempimento automatico per password di Chrome</translation> <translation id="7362314760212854110">Di recente hai scollegato il tuo Account Google. Per visualizzare le tue password, accedi a Chrome.</translation> +<translation id="8179976553408161302">Invio</translation> <translation id="8190452200642501331">Mostra dettagli</translation> <translation id="8219905600827687498">Password suggerite</translation> <translation id="8300526662653766176">Imposta un passcode</translation> <translation id="8518521100965196752">Per utilizzare le password, devi innanzitutto impostare un passcode sul dispositivo.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nessun risultato di ricerca trovato</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb index fd4346c..7b9b198b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">איך עושים זאת?</translation> <translation id="7294706895582948780">מילוי אוטומטי של סיסמאות ב-Chrome</translation> <translation id="7362314760212854110">יצאת לאחרונה מחשבון Google שלך. כדי לראות את הסיסמאות צריך להיכנס אל Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">הצגת הפרטים</translation> <translation id="8219905600827687498">הצעות לסיסמאות</translation> <translation id="8300526662653766176">עליך להגדיר קוד גישה</translation> <translation id="8518521100965196752">כדי שניתן יהיה להשתמש בסיסמאות, יש להגדיר קוד גישה במכשיר.</translation> <translation id="8877181643142698531">כתובת URL</translation> -<translation id="895466449242525281">לא נמצאו תוצאות חיפוש</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb index 4b3481e..0238f62 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">詳細</translation> <translation id="7294706895582948780">Chrome のパスワード自動入力</translation> <translation id="7362314760212854110">最近 Google アカウントからログアウトしました。パスワードを確認するには、Chrome にログインしてください。</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">詳細を表示します</translation> <translation id="8219905600827687498">パスワードの候補</translation> <translation id="8300526662653766176">パスコードの設定</translation> <translation id="8518521100965196752">パスワードを使用するには、まずデバイスにパスコードを設定する必要があります。</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">一致する結果は見つかりませんでした</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb index c00fdb7..19f7123 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ინსტრუქცია</translation> <translation id="7294706895582948780">Chrome-ის პაროლების ავტომატური შევსება</translation> <translation id="7362314760212854110">ახლახან თქვენი Google ანგარიშიდან გახვედით. პაროლების სანახავად შედით Chrome-ში.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">დეტალების ჩვენება</translation> <translation id="8219905600827687498">შემოთავაზებული პაროლები</translation> <translation id="8300526662653766176">დააყენეთ საიდუმლო კოდი</translation> <translation id="8518521100965196752">პაროლების გამოსაყენებლად, პირველ რიგში, საჭიროა საიდუმლო კოდის დაყენება თქვენს მოწყობილობაზე.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">ძიების შედეგები არ არის</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb index 3a46579..58776fb 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Әдісін білу</translation> <translation id="7294706895582948780">Chrome құпия сөздерін автотолтыру</translation> <translation id="7362314760212854110">Жақында Google есептік жазбасынан шықтыңыз. Құпия сөздерді көру үшін Chrome браузерінде есептік жазбаға кіріңіз.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Мәліметтерді көрсету</translation> <translation id="8219905600827687498">Ұсынылатын құпия сөздер</translation> <translation id="8300526662653766176">Рұқсат кодын орнату</translation> <translation id="8518521100965196752">Құпия сөздерді пайдалану үшін алдымен құрылғыға рұқсат кодын орнату керек.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Іздеу нәтижелері табылмады.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb index 29548666..6c4c68b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ស្វែងយល់អំពីរបៀប</translation> <translation id="7294706895582948780">បំពេញពាក្យសម្ងាត់ Chrome ដោយស្វ័យប្រវត្តិ</translation> <translation id="7362314760212854110">អ្នកបានចេញពីគណនី Google របស់អ្នកកាលពីថ្មីៗនេះ។ ដើម្បីមើលពាក្យសម្ងាត់របស់អ្នក សូមចូល Chrome។</translation> +<translation id="8179976553408161302">បញ្ចូល</translation> <translation id="8190452200642501331">បង្ហាញព័ត៌មានលម្អិត</translation> <translation id="8219905600827687498">ពាក្យសម្ងាត់ដែលបានណែនាំ</translation> <translation id="8300526662653766176">កំណត់លេខកូដសម្ងាត់</translation> <translation id="8518521100965196752">ដើម្បីប្រើពាក្យសម្ងាត់ អ្នកត្រូវតែកំណត់លេខកូដសម្ងាត់នៅលើឧបករណ៍របស់អ្នកជាមុនសិន។</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">រកមិនឃើញលទ្ធផលស្វែងរកទេ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb index a957868aa..eda3243 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ಹೇಗೆ ಎಂಬುದನ್ನು ತಿಳಿದುಕೊಳ್ಳಿ</translation> <translation id="7294706895582948780">ಸ್ವಯಂ ಭರ್ತಿ Chrome ಪಾಸ್ವರ್ಡ್ಗಳು</translation> <translation id="7362314760212854110">ನೀವು ಇತ್ತೀಚೆಗೆ ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಸೈನ್ ಔಟ್ ಆಗಿದ್ದೀರಿ. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನೋಡಲು, Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">ವಿವರಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="8219905600827687498">ಸೂಚಿಸಿದ ಪಾಸ್ವರ್ಡ್ಗಳು</translation> <translation id="8300526662653766176">ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="8518521100965196752">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಲು, ನೀವು ಮೊದಲು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಬೇಕು.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">ಯಾವುದೇ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb index eb6cc536..756fb3f 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">방법 알아보기</translation> <translation id="7294706895582948780">Chrome 비밀번호 자동 완성</translation> <translation id="7362314760212854110">최근 Google 계정에서 로그아웃했습니다. 비밀번호를 확인하려면 Chrome에 로그인하세요.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">세부정보 표시</translation> <translation id="8219905600827687498">추천 비밀번호</translation> <translation id="8300526662653766176">비밀번호 설정</translation> <translation id="8518521100965196752">비밀번호를 사용하려면 기기에 비밀번호를 설정해야 합니다.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">검색결과 없음</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb index 662576c0..d49da7f 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Үйрөнүп алыңыз</translation> <translation id="7294706895582948780">Chrome сырсөздөрүн автоматтык түрдө толтуруңүз</translation> <translation id="7362314760212854110">Google аккаунтуңуздан жакында чыгарылдыңыз. Сырсөздөрүңүздү көрүү үчүн Chrome'го кириңиз.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Чоо-жайларды көрсөтүү</translation> <translation id="8219905600827687498">Сунушталган сырсөздөр</translation> <translation id="8300526662653766176">Өткөрүүчү кодду коюуңуз</translation> <translation id="8518521100965196752">Сырсөздөрдү колдонуу үчүн адегенде, түзмөгүңүздөгү өткөрүүчү кодду жөндөп алышыңыз керек.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Эч нерсе табылган жок</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb index c05e14b..13cd32f 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ສຶກສາວິທີການ</translation> <translation id="7294706895582948780">ຕື່ມລະຫັດຜ່ານໃນ Chrome ໂດຍອັດຕະໂນມັດ</translation> <translation id="7362314760212854110">ທ່ານໄດ້ອອກຈາກລະບົບບັນຊີ Google ຂອງທ່ານແລ້ວເມື່ອບໍ່ດົນມານີ້. ເພື່ອເຫັນລະຫັດຜ່ານຂອງທ່ານ, ກະລຸນາເຂົ້າສູ່ລະບົບ Chrome.</translation> +<translation id="8179976553408161302">ປ້ອນເຂົ້າ</translation> <translation id="8190452200642501331">ສະແດງລາຍລະອຽດ</translation> <translation id="8219905600827687498">ລະຫັດຜ່ານທີ່ແນະນຳ</translation> <translation id="8300526662653766176">ຕັ້ງຄ່າລະຫັດຜ່ານ</translation> <translation id="8518521100965196752">ເພື່ອໃຊ້ລະຫັດຜ່ານ, ທ່ານຕ້ອງຕັ້ງລະຫັດຜ່ານໃນອຸປະກອນຂອງທ່ານກ່ອນ.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">ບໍ່ພົບຜົນການຊອກຫາໃດໆ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb index f50cf78..0cd1000 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Sužinokite, kaip tai padaryti</translation> <translation id="7294706895582948780">Automatinis „Chrome“ slaptažodžių pildymas</translation> <translation id="7362314760212854110">Neseniai buvote atjungti nuo „Google“ paskyros. Jei norite peržiūrėti slaptažodžius, prisijunkite prie „Chrome“.</translation> +<translation id="8179976553408161302">Įvesti</translation> <translation id="8190452200642501331">Rodyti išsamią informaciją</translation> <translation id="8219905600827687498">Siūlomi slaptažodžiai</translation> <translation id="8300526662653766176">Slaptažodžio nustatymas</translation> <translation id="8518521100965196752">Jei norite naudoti slaptažodžius, pirmiausia turite nustatyti įrenginio slaptažodį.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nerasta paieškos rezultatų</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb index 4d9fcf84..dde851a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Uzzināt, kā to izdarīt</translation> <translation id="7294706895582948780">Chrome paroļu automātiskā aizpilde</translation> <translation id="7362314760212854110">Jūs nesen izrakstījāties no Google konta. Lai skatītu savas paroles, pierakstieties pārlūkā Chrome.</translation> +<translation id="8179976553408161302">Ievadīt</translation> <translation id="8190452200642501331">Rādīt informāciju</translation> <translation id="8219905600827687498">Ieteiktās paroles</translation> <translation id="8300526662653766176">Piekļuves koda iestatīšana</translation> <translation id="8518521100965196752">Lai izmantotu paroles, vispirms ierīcei ir jāiestata piekļuves kods.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Netika atrasts neviens meklēšanas rezultāts</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb index 95bb8f5..8fa0571 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Дознајте како</translation> <translation id="7294706895582948780">Автоматско пополнување лозинки на Chrome</translation> <translation id="7362314760212854110">Неодамна се одјавивте од сметката на Google. За да ги видите лозинките, најавете се на Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Прикажи детали</translation> <translation id="8219905600827687498">Предложени лозинки</translation> <translation id="8300526662653766176">Поставете лозинка</translation> <translation id="8518521100965196752">За да ги користите лозинките, прво мора да поставите лозинка на вашиот уред.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Не се пронајдени резултати од пребарувањето</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb index 96e3914..cae1458 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">എങ്ങനെയെന്നറിയുക</translation> <translation id="7294706895582948780">Chrome പാസ്വേഡുകൾ സ്വയമേവ പൂരിപ്പിക്കൽ</translation> <translation id="7362314760212854110">നിങ്ങളുടെ Google അക്കൗണ്ടിൽ നിന്ന് അടുത്തിടെ സൈൻ ഔട്ട് ചെയ്തു. നിങ്ങളുടെ പാസ്വേഡുകൾ കാണാൻ, Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">വിശദാംശങ്ങൾ കാണിക്കുക</translation> <translation id="8219905600827687498">നിർദ്ദേശിച്ചിരിക്കുന്ന പാസ്വേഡുകൾ</translation> <translation id="8300526662653766176">പാസ്കോഡ് സജ്ജീകരിക്കുക</translation> <translation id="8518521100965196752">പാസ്വേഡുകൾ ഉപയോഗിക്കാൻ, ആദ്യം നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്കോഡ് സജ്ജീകരിക്കുക.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">തിരയൽ ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb index a58cf765c..e9a9841 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Заавар харах</translation> <translation id="7294706895582948780">Chrome-н нууц үгнүүдийг автоматаар бөглөх</translation> <translation id="7362314760212854110">Та саяхан Google Бүртгэлээсээ гарсан байна. Нууц үгнүүдээ харахын тулд Chrome-д нэвтэрнэ үү.</translation> +<translation id="8179976553408161302">Нэвтрэх</translation> <translation id="8190452200642501331">Дэлгэрэнгүйг харуулах</translation> <translation id="8219905600827687498">Санал болгосон нууц үгнүүд</translation> <translation id="8300526662653766176">Нууц код тохируулна уу</translation> <translation id="8518521100965196752">Нууц үгнүүдийг ашиглахын тулд та эхлээд төхөөрөмж дээрээ нууц код тохируулах ёстой.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Хайлтын илэрц олдсонгүй</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb index 62f1018..f3b23d26 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">कसे ते जाणून घ्या</translation> <translation id="7294706895582948780">Chrome पासवर्ड ऑटोफिल करा</translation> <translation id="7362314760212854110">तुम्ही नुकतेच तुमच्या Google खाते मधून साइन आउट केले तुमचे पासवर्ड पाहण्यासाठी, Chrome मध्ये साइन इन करा.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">तपशील दाखवा</translation> <translation id="8219905600827687498">सुचवलेले पासवर्ड</translation> <translation id="8300526662653766176">पासकोड सेट करा</translation> <translation id="8518521100965196752">पासवर्ड वापरण्यासाठी, तुम्ही आधी तुमच्या डिव्हाइसवर पासकोड सेट करणे आवश्यक आहे.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">शोध परिणाम आढळले नाहीत</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb index d25305be..3b07087 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Ketahui Caranya</translation> <translation id="7294706895582948780">Autolengkap Kata Laluan Chrome</translation> <translation id="7362314760212854110">Baru-baru ini anda telah log keluar daripada Akaun Google anda. Untuk melihat kata laluan anda, log masuk ke Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Tunjukkan Butiran</translation> <translation id="8219905600827687498">Kata Laluan yang Dicadangkan</translation> <translation id="8300526662653766176">Tetapkan Kod Laluan</translation> <translation id="8518521100965196752">Untuk menggunakan kata laluan, anda mesti menetapkan kod laluan pada peranti anda dahulu.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Tiada hasil carian dijumpai</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb index d58bb28d..aff6238 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">လုပ်ဆောင်ပုံ လေ့လာရန်</translation> <translation id="7294706895582948780">Chrome စကားဝှက်များ အော်တိုဖြည့်ခြင်း</translation> <translation id="7362314760212854110">မကြာသေးမီက သင့် Google Account မှနေ၍ ထွက်ထားသည်။ သင့်စကားဝှက်များကို ကြည့်ရန် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ။</translation> +<translation id="8179976553408161302">အင်တာ</translation> <translation id="8190452200642501331">အသေးစိတ် ပြရန်</translation> <translation id="8219905600827687498">အကြံပြုထားသော စကားဝှက်များ</translation> <translation id="8300526662653766176">လျှို့ဝှက်ကုဒ်တစ်ခု သတ်မှတ်ပါ</translation> <translation id="8518521100965196752">စကားဝှက်များသုံးရန် သင့်စက်တွင် လျှို့ဝှက်ကုဒ်တစ်ခုကို ဦးစွာ သတ်မှတ်ရပါမည်။</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">ရှာဖွေမှု ရလဒ်များ မရှိပါ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb index 77fba29..421e380f 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">तरिका जान्नुहोस्</translation> <translation id="7294706895582948780">Chrome मा सुरक्षित गरिएका पासवर्डहरू स्वतः भरियोस्</translation> <translation id="7362314760212854110">तपाईंले भर्खरै आफ्नो Google खाताबाट साइन आउट गर्नुभयो। आफ्ना पासवर्डहरू हेर्न Chrome मा साइन इन गर्नुहोस्।</translation> +<translation id="8179976553408161302">प्रविष्टि गर्नुहोस्</translation> <translation id="8190452200642501331">विवरणहरू देखाउनुहोस्</translation> <translation id="8219905600827687498">सिफारिस गरिएका पासवर्डहरू</translation> <translation id="8300526662653766176">कुनै पासकोड सेट गर्नुहोस्</translation> <translation id="8518521100965196752">पासवर्डहरू प्रयोग गर्न सर्वप्रथम तपाईंले आफ्नो यन्त्रमा अनिवार्य रूपमा कुनै पासकोड सेट गर्नु पर्छ।</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">कुनै खोज परिणाम फेला परेन</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb index 9ef2a6c..d931f789 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Meer informatie</translation> <translation id="7294706895582948780">Chrome-wachtwoorden automatisch invullen</translation> <translation id="7362314760212854110">Je bent onlangs uitgelogd van je Google-account. Log in bij Chrome om je wachtwoorden te bekijken.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Details tonen</translation> <translation id="8219905600827687498">Voorgestelde wachtwoorden</translation> <translation id="8300526662653766176">Een toegangscode instellen</translation> <translation id="8518521100965196752">Als je wachtwoorden wilt gebruiken, moet je eerst een toegangscode instellen op je apparaat.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Geen zoekresultaten gevonden</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb index e076420..de46c38f 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Finn ut hvordan</translation> <translation id="7294706895582948780">Autoutfyll Chrome-passord</translation> <translation id="7362314760212854110">Du har nylig logget av Google-kontoen din. For å se passordene dine, logg på Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Vis detaljer</translation> <translation id="8219905600827687498">Foreslåtte passord</translation> <translation id="8300526662653766176">Angi en adgangskode</translation> <translation id="8518521100965196752">For å bruke passord må du først angi en adgangskode på enheten din.</translation> <translation id="8877181643142698531">Nettadresse</translation> -<translation id="895466449242525281">Søket ga ingen treff</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb index 4ef41b4..4d477e6 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">କିପରି କରିବେ ତାହା ଜାଣନ୍ତୁ</translation> <translation id="7294706895582948780">Chrome ପାସୱାର୍ଡଗୁଡ଼ିକ ସ୍ୱତଃପୂରଣ କରନ୍ତୁ</translation> <translation id="7362314760212854110">ଆପଣ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରୁ ସାଇନ୍ ଆଉଟ୍ କରିଛନ୍ତି। ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକ ଦେଖିବାକୁ, Chromeରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ।</translation> +<translation id="8179976553408161302">ପ୍ରବେଶ</translation> <translation id="8190452200642501331">ବିବରଣୀ ଦେଖାନ୍ତୁ</translation> <translation id="8219905600827687498">ପ୍ରସ୍ତାବିତ ପାସୱାର୍ଡଗୁଡ଼ିକ</translation> <translation id="8300526662653766176">ଏକ ପାସକୋଡ୍ ସେଟ୍ କରନ୍ତୁ</translation> <translation id="8518521100965196752">ପାସୱାର୍ଡଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାକୁ, ଆପଣ ଆପଣଙ୍କ ଡିଭାଇସରେ ନିଶ୍ଚିତ ରୂପେ ପ୍ରଥମେ ଏକ ପାସକୋଡ୍ ସେଟ୍ କରିବା ଆବଶ୍ୟକ।</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">କୌଣସି ସନ୍ଧାନ ଫଳାଫଳ ମିଳିଲା ନାହିଁ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb index 17adcb7..2743dd5 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ਤਰੀਕਾ ਜਾਣੋ</translation> <translation id="7294706895582948780">ਆਟੋਫਿਲ Chrome ਪਾਸਵਰਡ</translation> <translation id="7362314760212854110">ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚੋਂ ਸਾਈਨ-ਆਊਟ ਕੀਤਾ ਹੈ। ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਦੇਖਣ ਲਈ, Chrome 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> +<translation id="8179976553408161302">ਦਰਜ ਕਰੋ</translation> <translation id="8190452200642501331">ਵੇਰਵੇ ਦਿਖਾਓ</translation> <translation id="8219905600827687498">ਸੁਝਾਏ ਗਏ ਪਾਸਵਰਡ</translation> <translation id="8300526662653766176">ਕੋਈ ਪਾਸਕੋਡ ਸੈੱਟ ਕਰੋ</translation> <translation id="8518521100965196752">ਪਾਸਵਰਡਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਪਾਸਕੋਡ ਸੈੱਟ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">ਕੋਈ ਖੋਜ ਨਤੀਜਾ ਨਹੀਂ ਮਿਲਿਆ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb index 4ca0631..a418e57 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Instrukcje</translation> <translation id="7294706895582948780">Wypełniaj hasła w Chrome</translation> <translation id="7362314760212854110">Niedawno nastąpiło wylogowanie z konta Google. Aby zobaczyć swoje hasła, zaloguj się w Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Pokaż szczegóły</translation> <translation id="8219905600827687498">Sugerowane hasła</translation> <translation id="8300526662653766176">Ustaw kod dostępu</translation> <translation id="8518521100965196752">Aby użyć haseł, musisz najpierw ustawić kod dostępu na urządzeniu.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Brak wyników wyszukiwania</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb index ea84db2..fec9ea5d 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Saiba como</translation> <translation id="7294706895582948780">Preenchimento automático de senhas do Chrome</translation> <translation id="7362314760212854110">Você saiu da sua Conta do Google recentemente. Faça login no Chrome para ver suas senhas.</translation> +<translation id="8179976553408161302">Entrar</translation> <translation id="8190452200642501331">Mostrar detalhes</translation> <translation id="8219905600827687498">Senhas sugeridas</translation> <translation id="8300526662653766176">Defina uma senha</translation> <translation id="8518521100965196752">Para usar senhas, defina uma no dispositivo primeiro.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nenhum resultado da pesquisa encontrado</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb index 8c971a04..014e385 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Saber como</translation> <translation id="7294706895582948780">Preenchimento automático de palavras-passe do Chrome</translation> <translation id="7362314760212854110">Recentemente, terminou sessão na sua Conta Google. Para ver as suas palavras-passe, inicie sessão no Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Mostrar detalhes</translation> <translation id="8219905600827687498">Palavras-passe sugeridas</translation> <translation id="8300526662653766176">Defina um código secreto</translation> <translation id="8518521100965196752">Para utilizar palavras-passe, tem de definir primeiro um código secreto no dispositivo.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Não foram encontrados resultados da pesquisa.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb index 3343558..61fe993 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Află cum</translation> <translation id="7294706895582948780">Completează automat parolele Chrome</translation> <translation id="7362314760212854110">Te-ai deconectat recent de la Contul Google. Pentru a vedea parolele, conectează-te la Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Afișează detaliile</translation> <translation id="8219905600827687498">Parole sugerate</translation> <translation id="8300526662653766176">Setează o parolă</translation> <translation id="8518521100965196752">Pentru a folosi parolele, trebuie mai întâi să setezi o parolă pe dispozitiv.</translation> <translation id="8877181643142698531">Adresa URL</translation> -<translation id="895466449242525281">Nu s-au găsit rezultate ale căutării</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb index 4debdf4..dd7c38b2 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Узнать больше</translation> <translation id="7294706895582948780">Автозаполнение паролей из Chrome</translation> <translation id="7362314760212854110">Вы недавно вышли из аккаунта Google. Чтобы увидеть свои пароли, войдите в Chrome.</translation> +<translation id="8179976553408161302">ВВОД</translation> <translation id="8190452200642501331">Показать сведения</translation> <translation id="8219905600827687498">Рекомендуемые пароли</translation> <translation id="8300526662653766176">Установите код доступа</translation> <translation id="8518521100965196752">Чтобы использовать пароли, установите на устройстве код доступа.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Ничего не найдено.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb index a16fb9f..7e8d21b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">කෙසේදැයි දැන ගන්න</translation> <translation id="7294706895582948780">Chrome මුරපද ස්වයං පිරවුම</translation> <translation id="7362314760212854110">ඔබ මෑතදී ඔබේ Google ගිණුමෙන් වැරී ඇත. ඔබේ මුරපද බැලීමට, Chrome වෙත පුරන්න.</translation> +<translation id="8179976553408161302">ඇතුළු කරන්න</translation> <translation id="8190452200642501331">විස්තර පෙන්වන්න</translation> <translation id="8219905600827687498">යෝජිත මුරපද</translation> <translation id="8300526662653766176">මුරකේතයක් සකසන්න</translation> <translation id="8518521100965196752">මුරපද භාවිත කිරීමට, ඔබ ප්රථමයෙන් ඔබේ උපාංගයේ මුරකේතයක් සැකසිය යුතුය.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">සෙවීම් ප්රතිඵල හමු නොවිය</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb index 032e90a..2440e5ff 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Postup</translation> <translation id="7294706895582948780">Automatické dopĺňanie hesiel Chromu</translation> <translation id="7362314760212854110">Nedávno ste sa odhlásili z účtu Google. Ak si chcete zobraziť heslá, prihláste sa do Chromu.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Zobraziť podrobnosti</translation> <translation id="8219905600827687498">Navrhnuté heslá</translation> <translation id="8300526662653766176">Nastavenie vstupného kódu</translation> <translation id="8518521100965196752">Ak chcete používať heslá, najprv musíte v zariadení nastaviť vstupný kód.</translation> <translation id="8877181643142698531">Webová adresa</translation> -<translation id="895466449242525281">Neboli nájdené žiadne výsledky vyhľadávania</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb index 172dc31..c94a855a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Več o tem</translation> <translation id="7294706895582948780">Samodejno izpolnjevanje gesel v Chromu</translation> <translation id="7362314760212854110">Nedavno ste se odjavili iz računa Google. Če si želite ogledati gesla, se prijavite v Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Prikaz podrobnosti</translation> <translation id="8219905600827687498">Predlagana gesla</translation> <translation id="8300526662653766176">Nastavitev gesla</translation> <translation id="8518521100965196752">Če želite uporabiti gesla, morate najprej nastaviti geslo v napravi.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Ni rezultatov iskanja</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb index a83bebc..6e235981 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Mëso se si</translation> <translation id="7294706895582948780">Plotëso automatikisht fjalëkalimet e Chrome</translation> <translation id="7362314760212854110">Dole së fundi nga "Llogaria jote e Google". Për të parë fjalëkalimet e tua, identifikohu në Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Shfaq detajet</translation> <translation id="8219905600827687498">Fjalëkalimet e sugjeruara</translation> <translation id="8300526662653766176">Vendos një kod</translation> <translation id="8518521100965196752">Për të përdorur fjalëkalimet, duhet të vendosësh në fillim një kod në pajisjen tënde.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nuk u gjetën rezultate kërkimi</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb index b35f20d..edbc0064 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Saznajte kako</translation> <translation id="7294706895582948780">Automatsko popunjavanje lozinki za Chrome</translation> <translation id="7362314760212854110">Nedavno ste se odjavili sa Google naloga. Da biste videli lozinke, prijavite se u Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Prikaži detalje</translation> <translation id="8219905600827687498">Predložene lozinke</translation> <translation id="8300526662653766176">Podesite šifru</translation> <translation id="8518521100965196752">Da biste koristili lozinke, prvo morate da podesite šifru na uređaju.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Nije pronađen nijedan rezultat pretrage</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb index dad25714..53bd98b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Сазнајте како</translation> <translation id="7294706895582948780">Аутоматско попуњавање лозинки за Chrome</translation> <translation id="7362314760212854110">Недавно сте се одјавили са Google налога. Да бисте видели лозинке, пријавите се у Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Прикажи детаље</translation> <translation id="8219905600827687498">Предложене лозинке</translation> <translation id="8300526662653766176">Подесите шифру</translation> <translation id="8518521100965196752">Да бисте користили лозинке, прво морате да подесите шифру на уређају.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Није пронађен ниједан резултат претраге</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb index bb504c25..1c56e3e 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Läs mer</translation> <translation id="7294706895582948780">Autofyll lösenord i Chrome</translation> <translation id="7362314760212854110">Du har nyligen loggat ut från Google-kontot. Logga in i Chrome om du vill se dina lösenord.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Visa information</translation> <translation id="8219905600827687498">Föreslagna lösenord</translation> <translation id="8300526662653766176">Ställ in ett lösenord</translation> <translation id="8518521100965196752">Du måste ställa in ett lösenord på enheten innan du kan använda lösenord här.</translation> <translation id="8877181643142698531">Webbadress</translation> -<translation id="895466449242525281">Inga sökresultat hittades</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb index d209dd5..1dd23340 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Fahamu Utaratibu Wake</translation> <translation id="7294706895582948780">Jaza Kiotomatiki Manenosiri ya Chrome</translation> <translation id="7362314760212854110">Uliondoka kwenye Akaunti yako ya Google hivi majuzi. Ili uone manenosiri yako, ingia katika akaunti ya Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Onyesha Maelezo</translation> <translation id="8219905600827687498">Manenosiri Yanayopendekezwa</translation> <translation id="8300526662653766176">Weka Nambari ya Siri</translation> <translation id="8518521100965196752">Ili utumie manenosiri, ni lazima kwanza uweke nambari ya siri kwenye kifaa chako.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Hakuna matokeo ya utafutaji yaliyopatikana</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb index 805caae5..0dc538a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">எப்படி என அறிக</translation> <translation id="7294706895582948780">Chrome கடவுச்சொற்களைத் தன்னிரப்புதல்</translation> <translation id="7362314760212854110">சமீபத்தில் உங்கள் Google கணக்கிலிருந்து வெளியேறிவிட்டீர்கள். உங்கள் கடவுச்சொற்களைப் பார்க்க, Chromeமில் உள்நுழையவும்.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">விவரங்களைக் காட்டும்</translation> <translation id="8219905600827687498">பரிந்துரைக்கப்படும் கடவுச்சொற்கள்</translation> <translation id="8300526662653766176">கடவுக்குறியீட்டை அமைக்கவும்</translation> <translation id="8518521100965196752">கடவுச்சொற்களைப் பயன்படுத்த, முதலில் உங்கள் சாதனத்தில் கடவுக்குறியீட்டை அமைக்க வேண்டும்.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">தேடல் முடிவுகள் எதுவுமில்லை</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb index 425c55e..92e7d624 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ఎలాగో తెలుసుకోండి</translation> <translation id="7294706895582948780">Chrome పాస్వర్డ్లను ఆటోఫిల్ చేయండి</translation> <translation id="7362314760212854110">ఇటీవల మీ Google ఖాతా నుండి మీరు సైన్ అవుట్ చేశారు. మీ పాస్వర్డ్లను చూడడానికి, Chromeకు సైన్ ఇన్ చేయండి.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">వివరాలను చూపించు</translation> <translation id="8219905600827687498">సూచించిన పాస్వర్డ్లు</translation> <translation id="8300526662653766176">పాస్కోడ్ను సెట్ చేయండి</translation> <translation id="8518521100965196752">పాస్వర్డ్లను ఉపయోగించడానికి, మీరు ముందుగా తప్పనిసరిగా మీ పరికరంలో పాస్కోడ్ను సెట్ చేయాలి.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">సెర్చ్ ఫలితాలు ఏవీ కనుగొనబడలేదు</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb index 350a2f1..d9b9eda5 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">ดูวิธี</translation> <translation id="7294706895582948780">ป้อนรหัสผ่านที่บันทึกไว้ใน Chrome โดยอัตโนมัติ</translation> <translation id="7362314760212854110">คุณออกจากระบบบัญชี Google ไปเมื่อเร็วๆ นี้ ลงชื่อเข้าใช้ Chrome เพื่อดูรหัสผ่าน</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">แสดงรายละเอียด</translation> <translation id="8219905600827687498">รหัสผ่านแนะนำ</translation> <translation id="8300526662653766176">ตั้งรหัสผ่าน</translation> <translation id="8518521100965196752">หากต้องการใช้รหัสผ่าน คุณต้องตั้งรหัสผ่านในอุปกรณ์ก่อน</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">ไม่พบผลการค้นหา</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb index 9784cdc..099711d7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Nasıl Yapacağınızı Öğrenin</translation> <translation id="7294706895582948780">Chrome Şifrelerini Otomatik Doldur</translation> <translation id="7362314760212854110">Google Hesabınızın oturumu kapatıldı. Şifrelerinizi görmek için Chrome'da oturum açın.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Ayrıntıları Göster</translation> <translation id="8219905600827687498">Önerilen Şifreler</translation> <translation id="8300526662653766176">Şifre Kodu Ayarlayın</translation> <translation id="8518521100965196752">Şifreleri kullanmak için öncelikle cihazınızda bir şifre kodu ayarlamanız gerekir.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Arama sonucu bulunamadı</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb index 54f979c..2f662a5 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Докладніше</translation> <translation id="7294706895582948780">Автозаповнення паролів у Chrome</translation> <translation id="7362314760212854110">Нещодавно ви вийшли з облікового запису Google. Щоб переглянути свої паролі, увійдіть у Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Показати деталі</translation> <translation id="8219905600827687498">Пропоновані паролі</translation> <translation id="8300526662653766176">Налаштуйте код доступу</translation> <translation id="8518521100965196752">Щоб використовувати паролі, спершу потрібно налаштувати код доступу на пристрої.</translation> <translation id="8877181643142698531">URL-адреса</translation> -<translation id="895466449242525281">Немає результатів пошуку</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb index 4febe58..a79bae20 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">طریقہ جانیں</translation> <translation id="7294706895582948780">آٹو فل Chrome پاس ورڈز</translation> <translation id="7362314760212854110">آپ نے حال ہی میں اپنے Google اکاؤنٹ سے سائن آؤٹ کیا ہے۔ اپنے پاس ورڈز دیکھنے کے لیے، Chrome میں سائن ان کریں۔</translation> +<translation id="8179976553408161302">انٹر</translation> <translation id="8190452200642501331">تفصیلات دکھائیں</translation> <translation id="8219905600827687498">تجویز کردہ پاس ورڈز</translation> <translation id="8300526662653766176">ایک پاس کوڈ سیٹ کریں</translation> <translation id="8518521100965196752">پاس ورڈز استعمال کرنے کے ليے، آپ کو اپنے آلے پر پہلے پاس کوڈ سیٹ کرنا ہوگا۔</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">تلاش کا کوئی نتیجہ نہیں ملا</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb index 9c2d751..a58d119 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Batafsil axborot</translation> <translation id="7294706895582948780">Chromeda parollarning avtomatik kiritilishi</translation> <translation id="7362314760212854110">Yaqinda Google hisobingizdan chiqarildingiz. Parollaringizni ochish uchun Chrome hisobingizga kiring.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Tafsilotlarni ochish</translation> <translation id="8219905600827687498">Tavsiya etilgan parollar</translation> <translation id="8300526662653766176">Maxfiy kodni belgilang</translation> <translation id="8518521100965196752">Parollarni ishlatish uchun qurilmangizni maxfiy kod bilan qulflang.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Qidiruv hech qanday natija bermadi</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb index 5975378..b0e591d 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Tìm hiểu cách thức</translation> <translation id="7294706895582948780">Tự động điền mật khẩu trên Chrome</translation> <translation id="7362314760212854110">Gần đây, bạn đã đăng xuất khỏi Tài khoản Google. Để xem các mật khẩu, hãy đăng nhập vào Chrome.</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">Xem chi tiết</translation> <translation id="8219905600827687498">Mật khẩu đề xuất</translation> <translation id="8300526662653766176">Đặt mật mã</translation> <translation id="8518521100965196752">Để sử dụng mật khẩu, trước tiên, bạn phải đặt mật mã trên thiết bị của mình.</translation> <translation id="8877181643142698531">URL</translation> -<translation id="895466449242525281">Không tìm thấy kết quả nào</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb index 441267e..958a27b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">了解如何操作</translation> <translation id="7294706895582948780">自动填充 Chrome 中存储的密码</translation> <translation id="7362314760212854110">您最近退出过自己的 Google 帐号。若要查看您的密码,请登录 Chrome。</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">显示详情</translation> <translation id="8219905600827687498">建议的密码</translation> <translation id="8300526662653766176">设置密码</translation> <translation id="8518521100965196752">您必须先在设备上设置密码,才能使用密码。</translation> <translation id="8877181643142698531">网址</translation> -<translation id="895466449242525281">未找到任何搜索结果</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb index a9ff7be3..259e6df 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">瞭解詳情</translation> <translation id="7294706895582948780">自動填入 Chrome 密碼</translation> <translation id="7362314760212854110">您最近登出了 Google 帳戶,請登入 Chrome 以查看密碼。</translation> +<translation id="8179976553408161302">Enter 鍵</translation> <translation id="8190452200642501331">顯示詳情</translation> <translation id="8219905600827687498">建議的密碼</translation> <translation id="8300526662653766176">設定密碼</translation> <translation id="8518521100965196752">如要使用密碼,您必須先在裝置上設定密碼。</translation> <translation id="8877181643142698531">網址</translation> -<translation id="895466449242525281">找不到任何搜尋結果</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb index 0ec9a8f..fe78be3 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">瞭解詳情</translation> <translation id="7294706895582948780">自動填入 Chrome 密碼</translation> <translation id="7362314760212854110">你最近登出了 Google 帳戶,請登入 Chrome 以查看密碼。</translation> +<translation id="8179976553408161302">Enter</translation> <translation id="8190452200642501331">顯示詳細資料</translation> <translation id="8219905600827687498">建議的密碼</translation> <translation id="8300526662653766176">請設定螢幕解鎖密碼</translation> <translation id="8518521100965196752">你必須先在裝置上設定螢幕解鎖密碼才能使用密碼。</translation> <translation id="8877181643142698531">網址</translation> -<translation id="895466449242525281">找不到相符的搜尋結果</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb index 6dd7173..afbbf5e 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb
@@ -22,10 +22,10 @@ <translation id="7021375594770280489">Funda ukuthi kanjani</translation> <translation id="7294706895582948780">Gcwalisa Ngokuzenzakalela Amaphasiwedi e-Chrome</translation> <translation id="7362314760212854110">Kamuva nje uphume ngemvume ku-akhawunti yakho ye-Google. Ukuze ubone amaphasiwedi wakho, ngena ngemvume ku-Chrome.</translation> +<translation id="8179976553408161302">Faka</translation> <translation id="8190452200642501331">Bonisa Imininingwane</translation> <translation id="8219905600827687498">Amaphasiwedi Aphakanyisiwe</translation> <translation id="8300526662653766176">Setha ikhodi yokudlula</translation> <translation id="8518521100965196752">Ukuze usebenzise amaphasiwedi, kuzomele uqale usethe ikhodi yokudlula kudivayisi yakho.</translation> <translation id="8877181643142698531">I-URL</translation> -<translation id="895466449242525281">Ayikho imiphumela yosesho etholakele</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 094af67..ff3f1a9a 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -31,8 +31,6 @@ "ios_chrome_scoped_testing_chrome_browser_state_manager.h", "ios_chrome_scoped_testing_local_state.cc", "ios_chrome_scoped_testing_local_state.h", - "ios_chrome_unit_test_suite.h", - "ios_chrome_unit_test_suite.mm", "root_view_controller_test.h", "root_view_controller_test.mm", "scoped_key_window.h", @@ -109,10 +107,36 @@ ] } +source_set("ios_chrome_unit_test_suite") { + testonly = true + sources = [ + "ios_chrome_unit_test_suite.h", + "ios_chrome_unit_test_suite.mm", + ] + deps = [ + "//base", + "//base/test:test_support", + "//components/content_settings/core/common", + "//ios/chrome/browser:chrome_paths", + "//ios/chrome/browser:chrome_url_constants", + "//ios/chrome/browser/browser_state:browser_state_impl", + "//ios/chrome/test:test_support", + "//ios/components/webui:url_constants", + "//ios/public/provider/chrome/browser", + "//ios/web/public", + "//ios/web/public/test", + "//testing/gtest", + "//ui/base", + "//url", + ] + configs += [ "//build/config/compiler:enable_arc" ] +} + source_set("run_all_unittests") { testonly = true sources = [ "run_all_unittests.cc" ] deps = [ + ":ios_chrome_unit_test_suite", ":test_support", "//base", "//base/test:test_support", @@ -141,6 +165,9 @@ "//ios/chrome/app/resources:packed_resources", "//ios/chrome/browser/ui/main", + # Use the same provider as Chromium.app to have meaningful perf numbers. + ios_provider_target, + # Add perf_tests target here. "//ios/chrome/browser/ui/ntp:perf_tests", "//ios/chrome/browser/ui/omnibox:perf_tests", @@ -163,6 +190,9 @@ "//ios/chrome/app:tests_fake_hook", "//ios/chrome/app/resources:packed_resources", + # Use the test implementation of the provider API. + "//ios/public/provider/chrome/browser:test_providers", + # Add unit_tests target here. "//ios/chrome/app:unit_tests", "//ios/chrome/app/application_delegate:unit_tests",
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm index e50e59b..b7e23c5 100644 --- a/ios/chrome/test/app/signin_test_util.mm +++ b/ios/chrome/test/app/signin_test_util.mm
@@ -80,7 +80,8 @@ // Sign out current user and clear all browsing data on the device. AuthenticationService* authentication_service = AuthenticationServiceFactory::GetForBrowserState(browser_state); - if (authentication_service->IsAuthenticated()) { + if (authentication_service->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)) { authentication_service->SignOut(signin_metrics::SIGNOUT_TEST, /*force_clear_browsing_data=*/true, nil); }
diff --git a/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni b/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni index fc63fd7..fda411b 100644 --- a/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni +++ b/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni
@@ -103,6 +103,9 @@ "//ios/chrome/test/earl_grey:hooks", "//ios/testing:http_server_bundle_data", "//ios/third_party/earl_grey2:app_framework+link", + + # Use the same provider API as Chromium.app. + ios_provider_target, ] if (!defined(bundle_deps)) {
diff --git a/ios/chrome/test/ios_chrome_unit_test_suite.mm b/ios/chrome/test/ios_chrome_unit_test_suite.mm index a5c91c5c..0f8c642 100644 --- a/ios/chrome/test/ios_chrome_unit_test_suite.mm +++ b/ios/chrome/test/ios_chrome_unit_test_suite.mm
@@ -15,7 +15,6 @@ #include "ios/chrome/test/testing_application_context.h" #include "ios/components/webui/web_ui_url_constants.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" -#include "ios/public/provider/chrome/browser/test_chrome_provider_initializer.h" #import "ios/web/public/web_client.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/resource/resource_bundle.h" @@ -35,8 +34,10 @@ ~IOSChromeUnitTestSuiteInitializer() override {} void OnTestStart(const testing::TestInfo& test_info) override { - test_ios_chrome_provider_initializer_.reset( - new ios::TestChromeProviderInitializer()); + chrome_browser_provider_ = ios::CreateChromeBrowserProvider(); + ios::ChromeBrowserProvider* previous_provider = + ios::SetChromeBrowserProvider(chrome_browser_provider_.get()); + DCHECK(!previous_provider); DCHECK(!GetApplicationContext()); application_context_.reset(new TestingApplicationContext); @@ -46,12 +47,14 @@ DCHECK_EQ(GetApplicationContext(), application_context_.get()); application_context_.reset(); - test_ios_chrome_provider_initializer_.reset(); + ios::ChromeBrowserProvider* previous_provider = + ios::SetChromeBrowserProvider(nullptr); + DCHECK_EQ(previous_provider, chrome_browser_provider_.get()); + chrome_browser_provider_.reset(); } private: - std::unique_ptr<ios::TestChromeProviderInitializer> - test_ios_chrome_provider_initializer_; + std::unique_ptr<ios::ChromeBrowserProvider> chrome_browser_provider_; std::unique_ptr<ApplicationContext> application_context_; DISALLOW_COPY_AND_ASSIGN(IOSChromeUnitTestSuiteInitializer);
diff --git a/ios/chrome/test/wpt/BUILD.gn b/ios/chrome/test/wpt/BUILD.gn index 30e4ce2e..783b538 100644 --- a/ios/chrome/test/wpt/BUILD.gn +++ b/ios/chrome/test/wpt/BUILD.gn
@@ -18,7 +18,12 @@ } ios_chrome_xcuitest_app_host("ios_cwt_chromedriver_tests") { - deps = [ ":app_support" ] + deps = [ + ":app_support", + + # Use the chromium implementation of the provider API. + "//ios/chrome/browser/providers:chromium_providers", + ] bundle_deps = [ "//ios/third_party/gtx:gtx+bundle" ] }
diff --git a/ios/chrome/test/xcuitest/BUILD.gn b/ios/chrome/test/xcuitest/BUILD.gn index be83e42..32b6be7b 100644 --- a/ios/chrome/test/xcuitest/BUILD.gn +++ b/ios/chrome/test/xcuitest/BUILD.gn
@@ -7,6 +7,10 @@ ios_chrome_xcuitest_app_host("ios_chrome_xcuitests") { use_default_test_hooks = true + deps = [ + # Use the chromium implementation of the provider API. + "//ios/chrome/browser/providers:chromium_providers", + ] } ios_xcuitest_test("ios_chrome_device_check_xcuitests_module") {
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index e834dca..6732d1d4 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -fc814ff7d7569c14b3c70c96b43a76179794b2c7 \ No newline at end of file +9b7d5289d1c25e0e12d6c02df55c69904a8539c7 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index 8907989..ad5e88ca 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -b873f027997bd7782939d77537aac698fac72d21 \ No newline at end of file +e8ceeab03e24e536f18255cb6881cdef93092607 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index 21c1dde..f28a792 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -67584985bee51e3eabb9fd0263424e149dd2c246 \ No newline at end of file +cd4dca5a5f3e305c3b3706606f379abb720d4cef \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index 196ea61..12acfde 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -c240beea5ac858723cb538870dfe61e9b0517a72 \ No newline at end of file +fdac00d5e828ef11bc0e47f7fa4881108fc41adb \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index ffed8db..d5207d53 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -436b2808ce1ddb3409de03228d0b19e690aa936c \ No newline at end of file +aadecd4d989053c0038523c48e2e2607ab39e65c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index 972a756..303e03354 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -86febbfcf053683e2a665efa63d73656b7d93822 \ No newline at end of file +18a4ef60d1dca93696149b32cb40446faff6b7cd \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index 45260a8..649b1d0 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -347ea27807d911d5516b9ae7cf79cca5cceb27ba \ No newline at end of file +caebf67ab590d3ddf2863e80cd2f0fe7e54def7a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 31afa94..554f389 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -4e7511b60afcaf1f675e3b6bf4d22260b8e1f072 \ No newline at end of file +5c4dc8196e266eb7350af03c96a33d7e7772c063 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index c4332196..b54c79c 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -51c9debce061fc8dfb52d261c6d48c0a987cfb4c \ No newline at end of file +1805187e0253baa23270bbbbea3c5dd24270eca3 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index 6f47fa8..54fc0c4 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -bbad05ae7e758bdabebd2800f5b03079188360ee \ No newline at end of file +edd7915c8370cbff07e1282dd7f7c6ca63fb44b4 \ No newline at end of file
diff --git a/ios/public/provider/chrome/browser/BUILD.gn b/ios/public/provider/chrome/browser/BUILD.gn index 842e077..e318e12 100644 --- a/ios/public/provider/chrome/browser/BUILD.gn +++ b/ios/public/provider/chrome/browser/BUILD.gn
@@ -49,8 +49,6 @@ sources = [ "test_chrome_browser_provider.h", "test_chrome_browser_provider.mm", - "test_chrome_provider_initializer.h", - "test_chrome_provider_initializer.mm", "test_text_zoom_provider.h", "test_text_zoom_provider.mm", ] @@ -72,3 +70,26 @@ "//testing/gtest", ] } + +source_set("test_provider_factory") { + testonly = true + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ "test_chrome_browser_provider_factory.mm" ] + deps = [ + ":browser", + ":test_support", + ] +} + +group("test_providers") { + testonly = true + deps = [ + # The target providing the ChromeBrowserProvider factory. + ":test_provider_factory", + + # The provider API needs to provide MaterialDesignComponent API (as the + # internal provider provides an alternate implementation). + "//ios/third_party/material_components_ios:material_components_ios+bundle", + "//ios/third_party/material_components_ios:material_components_ios+link", + ] +}
diff --git a/ios/public/provider/chrome/browser/build_config.gni b/ios/public/provider/chrome/browser/build_config.gni index 506fc9b..29f6046 100644 --- a/ios/public/provider/chrome/browser/build_config.gni +++ b/ios/public/provider/chrome/browser/build_config.gni
@@ -18,9 +18,9 @@ ios_launchscreen_assets_target = "//ios/chrome/app/resources:launchscreen_assets" - # Label of the target providing implementation for ChromeBrowserProvider. - # Overridden when using the Google-internal repository to build Chrome on iOS. - ios_provider_target = "//ios/chrome/browser/providers:provider_factory" + # Label of the target providing the "Provider API". Overridden when using + # the Google internal repository to build Chrome on iOS. + ios_provider_target = "//ios/chrome/browser/providers:chromium_providers" # This defines targets to include resources needed by the providers which are # copied to the application bundle.
diff --git a/ios/public/provider/chrome/browser/test_chrome_browser_provider_factory.mm b/ios/public/provider/chrome/browser/test_chrome_browser_provider_factory.mm new file mode 100644 index 0000000..d79ed45 --- /dev/null +++ b/ios/public/provider/chrome/browser/test_chrome_browser_provider_factory.mm
@@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/public/provider/chrome/browser/chrome_browser_provider.h" +#import "ios/public/provider/chrome/browser/test_chrome_browser_provider.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace ios { +std::unique_ptr<ChromeBrowserProvider> CreateChromeBrowserProvider() { + return std::make_unique<TestChromeBrowserProvider>(); +} +} // namespace ios
diff --git a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h b/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h deleted file mode 100644 index c9ef180..0000000 --- a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_PROVIDER_INITIALIZER_H_ -#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_PROVIDER_INITIALIZER_H_ - -#include <memory> - -#include "base/macros.h" - -namespace ios { - -class TestChromeBrowserProvider; - -// Initializes various objects needed to run unit tests that use ios:: -// objects. Currently this includes setting up the chrome browser provider as -// a |TestChromeBrowserProvider|. -class TestChromeProviderInitializer { - public: - TestChromeProviderInitializer(); - virtual ~TestChromeProviderInitializer(); - - private: - std::unique_ptr<TestChromeBrowserProvider> chrome_browser_provider_; - - DISALLOW_COPY_AND_ASSIGN(TestChromeProviderInitializer); -}; - -} // namespace ios - -#endif // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_PROVIDER_INITIALIZER_H_
diff --git a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm b/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm deleted file mode 100644 index 3c5bf29b..0000000 --- a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/public/provider/chrome/browser/test_chrome_provider_initializer.h" - -#include "ios/public/provider/chrome/browser/test_chrome_browser_provider.h" -#include "testing/gtest/include/gtest/gtest.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace ios { - -TestChromeProviderInitializer::TestChromeProviderInitializer() { - chrome_browser_provider_.reset(new TestChromeBrowserProvider()); - ChromeBrowserProvider* previous_provider = - ios::SetChromeBrowserProvider(chrome_browser_provider_.get()); - EXPECT_FALSE(previous_provider); -} - -TestChromeProviderInitializer::~TestChromeProviderInitializer() { - ChromeBrowserProvider* previous_provider = - ios::SetChromeBrowserProvider(nullptr); - EXPECT_EQ(previous_provider, chrome_browser_provider_.get()); -} - -} // namespace ios
diff --git a/ios/showcase/BUILD.gn b/ios/showcase/BUILD.gn index bf766e7..c60690cc 100644 --- a/ios/showcase/BUILD.gn +++ b/ios/showcase/BUILD.gn
@@ -14,6 +14,9 @@ deps = [ ":features", "//ios/showcase/core:main", + + # Use the chromium implementation of the provider API. + "//ios/chrome/browser/providers:chromium_providers", ] bundle_deps = [ "//ios/showcase/core/resources" ] if (ios_enable_credential_provider_extension) { @@ -58,6 +61,9 @@ "//ios/showcase/core:main_eg2", "//ios/showcase/test:eg_app_support+eg2", "//ios/testing/earl_grey:eg_app_support+eg2", + + # Use the chromium implementation of the provider API. + "//ios/chrome/browser/providers:chromium_providers", ] bundle_deps = [ "//ios/chrome/app/resources",
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn index 2f36b3bc..a66905c 100644 --- a/ios/third_party/material_components_ios/BUILD.gn +++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -80,6 +80,7 @@ "src/components/BottomSheet/src/MDCBottomSheetPresentationController.h", "src/components/BottomSheet/src/MDCBottomSheetPresentationControllerDelegate.h", "src/components/BottomSheet/src/MDCBottomSheetTransitionController.h", + "src/components/BottomSheet/src/MDCBottomSheetTransitionControllerDelegate.h", "src/components/BottomSheet/src/MDCSheetState.h", "src/components/BottomSheet/src/MaterialBottomSheet.h", "src/components/BottomSheet/src/ShapeThemer/MDCBottomSheetControllerShapeThemer.h", @@ -821,6 +822,7 @@ "src/components/BottomSheet/src/MDCBottomSheetPresentationControllerDelegate.h", "src/components/BottomSheet/src/MDCBottomSheetTransitionController.h", "src/components/BottomSheet/src/MDCBottomSheetTransitionController.m", + "src/components/BottomSheet/src/MDCBottomSheetTransitionControllerDelegate.h", "src/components/BottomSheet/src/MDCSheetState.h", "src/components/BottomSheet/src/MaterialBottomSheet.h", "src/components/BottomSheet/src/ShapeThemer/MDCBottomSheetControllerShapeThemer.h",
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index 66acd24..f2ccd2e 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc
@@ -1273,7 +1273,7 @@ } void PipelineImpl::Seek(base::TimeDelta time, PipelineStatusCallback seek_cb) { - DVLOG(2) << __func__ << " to " << time.InMicroseconds(); + DVLOG(2) << __func__ << " to " << time; DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(seek_cb);
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index e96ba09d..b140cd58 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -25,6 +25,7 @@ "capture_switches.cc", "capture_switches.h", ] + deps = [ "//base" ] } # Things needed by //media/capture/mojom/video_capture_types.mojom. @@ -120,6 +121,8 @@ "video/video_capture_buffer_pool.h", "video/video_capture_buffer_pool_impl.cc", "video/video_capture_buffer_pool_impl.h", + "video/video_capture_buffer_pool_util.cc", + "video/video_capture_buffer_pool_util.h", "video/video_capture_buffer_tracker.cc", "video/video_capture_buffer_tracker.h", "video/video_capture_buffer_tracker_factory.h", @@ -143,6 +146,7 @@ public_deps = [ ":capture_base", ":capture_device_specific", + ":capture_switches", ] deps = [
diff --git a/media/capture/capture_switches.cc b/media/capture/capture_switches.cc index 6348e85..f6ac00c 100644 --- a/media/capture/capture_switches.cc +++ b/media/capture/capture_switches.cc
@@ -4,6 +4,8 @@ #include "media/capture/capture_switches.h" +#include "base/command_line.h" + namespace switches { // Enables GpuMemoryBuffer-based buffer pool. @@ -20,4 +22,11 @@ const char kDisableVideoCaptureUseGpuMemoryBuffer[] = "disable-video-capture-use-gpu-memory-buffer"; +CAPTURE_EXPORT bool IsVideoCaptureUseGpuMemoryBufferEnabled() { + return !base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableVideoCaptureUseGpuMemoryBuffer) && + base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kVideoCaptureUseGpuMemoryBuffer); +} + } // namespace switches
diff --git a/media/capture/capture_switches.h b/media/capture/capture_switches.h index dfc352ab..7dc17da37 100644 --- a/media/capture/capture_switches.h +++ b/media/capture/capture_switches.h
@@ -10,9 +10,10 @@ namespace switches { CAPTURE_EXPORT extern const char kVideoCaptureUseGpuMemoryBuffer[]; - CAPTURE_EXPORT extern const char kDisableVideoCaptureUseGpuMemoryBuffer[]; +CAPTURE_EXPORT bool IsVideoCaptureUseGpuMemoryBufferEnabled(); + } // namespace switches #endif // MEDIA_CAPTURE_CAPTURE_SWITCHES_H_
diff --git a/media/capture/video/video_capture_buffer_pool_impl.cc b/media/capture/video/video_capture_buffer_pool_impl.cc index 4166925..dae889e 100644 --- a/media/capture/video/video_capture_buffer_pool_impl.cc +++ b/media/capture/video/video_capture_buffer_pool_impl.cc
@@ -11,6 +11,7 @@ #include "base/memory/ptr_util.h" #include "build/build_config.h" #include "media/capture/video/video_capture_buffer_handle.h" +#include "media/capture/video/video_capture_buffer_pool_util.h" #include "media/capture/video/video_capture_buffer_tracker.h" #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" #include "ui/gfx/buffer_format_util.h" @@ -22,6 +23,11 @@ namespace media { VideoCaptureBufferPoolImpl::VideoCaptureBufferPoolImpl( + VideoCaptureBufferType buffer_type) + : VideoCaptureBufferPoolImpl(buffer_type, + kVideoCaptureDefaultMaxBufferPoolSize) {} + +VideoCaptureBufferPoolImpl::VideoCaptureBufferPoolImpl( VideoCaptureBufferType buffer_type, int count) : buffer_type_(buffer_type),
diff --git a/media/capture/video/video_capture_buffer_pool_impl.h b/media/capture/video/video_capture_buffer_pool_impl.h index 9de75bc..533f92d 100644 --- a/media/capture/video/video_capture_buffer_pool_impl.h +++ b/media/capture/video/video_capture_buffer_pool_impl.h
@@ -29,6 +29,7 @@ class CAPTURE_EXPORT VideoCaptureBufferPoolImpl : public VideoCaptureBufferPool { public: + explicit VideoCaptureBufferPoolImpl(VideoCaptureBufferType buffer_type); explicit VideoCaptureBufferPoolImpl( VideoCaptureBufferType buffer_type, int count);
diff --git a/media/capture/video/video_capture_buffer_pool_util.cc b/media/capture/video/video_capture_buffer_pool_util.cc new file mode 100644 index 0000000..4f6e254 --- /dev/null +++ b/media/capture/video/video_capture_buffer_pool_util.cc
@@ -0,0 +1,43 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/capture/video/video_capture_buffer_pool_util.h" + +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "media/capture/capture_switches.h" + +namespace media { + +int DeviceVideoCaptureMaxBufferPoolSize() { + // The maximum number of video frame buffers in-flight at any one time. + // If all buffers are still in use by consumers when new frames are produced + // those frames get dropped. + static int max_buffer_count = kVideoCaptureDefaultMaxBufferPoolSize; + +#if defined(OS_MAC) + // On macOS, we allow a few more buffers as it's routinely observed that it + // runs out of three when just displaying 60 FPS media in a video element. + max_buffer_count = 10; +#elif BUILDFLAG(IS_CHROMEOS_ASH) + // On Chrome OS with MIPI cameras running on HAL v3, there can be four + // concurrent streams of camera pipeline depth ~6. We allow at most 36 buffers + // here to take into account the delay caused by the consumer (e.g. display or + // video encoder). + if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled()) { + max_buffer_count = 36; + } +#elif defined(OS_WIN) + // On Windows, for GMB backed zero-copy more buffers are needed because it's + // routinely observed that it runs out of default buffer count when just + // displaying 60 FPS media in a video element + if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled()) { + max_buffer_count = 30; + } +#endif + + return max_buffer_count; +} + +} // namespace media
diff --git a/media/capture/video/video_capture_buffer_pool_util.h b/media/capture/video/video_capture_buffer_pool_util.h new file mode 100644 index 0000000..61a12c645 --- /dev/null +++ b/media/capture/video/video_capture_buffer_pool_util.h
@@ -0,0 +1,17 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_CAPTURE_VIDEO_VIDEO_CAPTURE_BUFFER_POOL_UTIL_H_ +#define MEDIA_CAPTURE_VIDEO_VIDEO_CAPTURE_BUFFER_POOL_UTIL_H_ + +#include "media/capture/capture_export.h" + +namespace media { + +constexpr int kVideoCaptureDefaultMaxBufferPoolSize = 4; +CAPTURE_EXPORT int DeviceVideoCaptureMaxBufferPoolSize(); + +} // namespace media + +#endif // MEDIA_CAPTURE_VIDEO_VIDEO_CAPTURE_BUFFER_POOL_UTIL_H_
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc index 892135a4..20c3faa 100644 --- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc +++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc
@@ -314,10 +314,6 @@ bool VP9VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob* encode_job) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (!ApplyPendingUpdateRates()) - return false; - if (svc_layers_) { if (svc_layers_->UpdateEncodeJob(encode_job->IsKeyframeRequested(), current_params_.kf_period_frames)) { @@ -398,9 +394,18 @@ // Update active layer status in |svc_layers_|, and key frame is produced when // active layer changed. - if (svc_layers_ && - !svc_layers_->MaybeUpdateActiveLayer(¤t_params_.bitrate_allocation)) - return false; + if (svc_layers_) { + if (!svc_layers_->MaybeUpdateActiveLayer( + ¤t_params_.bitrate_allocation)) { + return false; + } + } else { + // Simple stream encoding. + if (current_params_.bitrate_allocation.GetSumBps() != + current_params_.bitrate_allocation.GetBitrateBps(0, 0)) { + return false; + } + } CHECK(rate_ctrl_);
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc index 321d825..e3d5f413 100644 --- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc +++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
@@ -49,6 +49,11 @@ {0.50, 0.50, 0.00}, // For two temporal layers. {0.25, 0.25, 0.50}, // For three temporal layers. }; +constexpr uint8_t kTemporalLayerPattern[][4] = { + {0, 0, 0, 0}, + {0, 1, 0, 1}, + {0, 2, 1, 2}, +}; VaapiVideoEncoderDelegate::Config kDefaultVaapiVideoEncoderDelegateConfig{ kDefaultMaxNumRefFrames, @@ -78,11 +83,11 @@ size_t num_spatial_layers, size_t num_temporal_layers, std::array<bool, kVp9NumRefsPerFrame>* ref_frames_used, - absl::optional<uint8_t>* temporal_layer_id) { + uint8_t* temporal_layer_id) { switch (num_temporal_layers) { case 1: + *temporal_layer_id = 0; if (num_spatial_layers > 1) { - *temporal_layer_id = 0; // K-SVC stream. *ref_frames_used = keyframe ? kRefFramesUsedForKeyFrame @@ -101,9 +106,7 @@ } { - constexpr uint8_t kTwoTemporalLayerIds[] = {0, 1}; - *temporal_layer_id = - kTwoTemporalLayerIds[frame_num % base::size(kTwoTemporalLayerIds)]; + *temporal_layer_id = kTemporalLayerPattern[1][frame_num % 4]; *ref_frames_used = kRefFramesUsedForInterFrameInTemporalLayer; } break; @@ -115,10 +118,7 @@ } { - constexpr uint8_t kThreeTemporalLayerIds[] = {0, 2, 1, 2}; - *temporal_layer_id = - kThreeTemporalLayerIds[frame_num % - base::size(kThreeTemporalLayerIds)]; + *temporal_layer_id = kTemporalLayerPattern[2][frame_num % 4]; *ref_frames_used = kRefFramesUsedForInterFrameInTemporalLayer; } break; @@ -152,12 +152,26 @@ return bitrate_allocation; } -MATCHER_P5(MatchRtcConfigWithRates, - size, +std::vector<gfx::Size> GetDefaultSpatialLayerResolutions( + size_t num_spatial_layers) { + constexpr gfx::Size& kDefaultSize = + kDefaultVideoEncodeAcceleratorConfig.input_visible_size; + std::vector<gfx::Size> spatial_layer_resolutions(num_spatial_layers); + for (size_t sid = 0; sid < num_spatial_layers; ++sid) { + const int denom = + kSpatialLayersResolutionScaleDenom[num_spatial_layers - 1][sid]; + spatial_layer_resolutions[sid] = + gfx::Size(kDefaultSize.width() / denom, kDefaultSize.height() / denom); + } + + return spatial_layer_resolutions; +} + +MATCHER_P4(MatchRtcConfigWithRates, bitrate_allocation, framerate, - num_spatial_layers, num_temporal_layers, + spatial_layer_resolutions, "") { if (arg.target_bandwidth != bitrate_allocation.GetSumBps() / 1000) return false; @@ -165,6 +179,7 @@ if (arg.framerate != static_cast<double>(framerate)) return false; + const size_t num_spatial_layers = spatial_layer_resolutions.size(); for (size_t sid = 0; sid < num_spatial_layers; ++sid) { int bitrate_sum = 0; for (size_t tid = 0; tid < num_temporal_layers; tid++) { @@ -183,6 +198,7 @@ } } + const gfx::Size& size = spatial_layer_resolutions.back(); return arg.width == size.width() && arg.height == size.height() && base::checked_cast<size_t>(arg.ss_number_layers) == num_spatial_layers && @@ -196,8 +212,8 @@ spatial_layer_id, "") { return arg.frame_type == frame_type && - (!temporal_layer_id || arg.temporal_layer_id == *temporal_layer_id) && - (!spatial_layer_id || arg.spatial_layer_id == *spatial_layer_id); + arg.temporal_layer_id == temporal_layer_id && + arg.spatial_layer_id == spatial_layer_id; } class MockVaapiWrapper : public VaapiWrapper { @@ -240,11 +256,11 @@ size_t num_temporal_layers); void EncodeConstantQuantizationParameterSequence( bool is_keyframe, - size_t num_spatial_layers, + const gfx::Size& layer_size, absl::optional<std::array<bool, kVp9NumRefsPerFrame>> expected_ref_frames_used, - absl::optional<uint8_t> expected_temporal_layer_id = absl::nullopt, - absl::optional<uint8_t> expected_spatial_layer_id = absl::nullopt); + uint8_t expected_temporal_layer_id, + uint8_t expected_spatial_layer_id); void UpdateRatesTest(size_t num_spatial_layers, size_t num_temporal_layers); private: @@ -252,10 +268,13 @@ bool keyframe, const scoped_refptr<VASurface>& va_surface, const scoped_refptr<VP9Picture>& picture); - void UpdateRatesSequence(const VideoBitrateAllocation& bitrate_allocation, - uint32_t framerate, - size_t num_spatial_layers, - size_t num_temporal_layers); + void UpdateRatesAndEncode( + const VideoBitrateAllocation& bitrate_allocation, + uint32_t framerate, + bool is_key_pic, + const std::vector<gfx::Size>& expected_spatial_layer_resolutions, + size_t expected_temporal_layers, + size_t expected_temporal_layer_id); std::unique_ptr<VP9VaapiVideoEncoderDelegate> encoder_; scoped_refptr<MockVaapiWrapper> mock_vaapi_wrapper_; @@ -309,21 +328,16 @@ VideoBitrateAllocation initial_bitrate_allocation; initial_bitrate_allocation.SetBitrate( 0, 0, kDefaultVideoEncodeAcceleratorConfig.bitrate.target()); - std::vector<gfx::Size> svc_layer_size; + std::vector<gfx::Size> svc_layer_size = + GetDefaultSpatialLayerResolutions(num_spatial_layers); if (num_spatial_layers > 1u || num_temporal_layers > 1u) { DCHECK_GT(num_spatial_layers, 0u); for (size_t sid = 0; sid < num_spatial_layers; ++sid) { const double bitrate_factor = kSpatialLayersBitrateScaleFactors[num_spatial_layers - 1][sid]; - const double resolution_denom = - kSpatialLayersResolutionScaleDenom[num_spatial_layers - 1][sid]; VideoEncodeAccelerator::Config::SpatialLayer spatial_layer; - spatial_layer.width = - config.input_visible_size.width() / resolution_denom; - spatial_layer.height = - config.input_visible_size.height() / resolution_denom; - svc_layer_size.emplace_back( - gfx::Size(spatial_layer.width, spatial_layer.height)); + spatial_layer.width = svc_layer_size[sid].width(); + spatial_layer.height = svc_layer_size[sid].height(); spatial_layer.bitrate_bps = config.bitrate.target() * bitrate_factor; spatial_layer.framerate = *config.initial_framerate; spatial_layer.num_of_temporal_layers = num_temporal_layers; @@ -331,17 +345,14 @@ config.spatial_layers.push_back(spatial_layer); } } - if (svc_layer_size.empty()) - svc_layer_size = {config.input_visible_size}; EXPECT_CALL( *mock_rate_ctrl_, UpdateRateControl(MatchRtcConfigWithRates( - kDefaultVideoEncodeAcceleratorConfig.input_visible_size, GetDefaultVideoBitrateAllocation( num_spatial_layers, num_temporal_layers, config.bitrate.target()), - VideoEncodeAccelerator::kDefaultFramerate, num_spatial_layers, - num_temporal_layers))) + VideoEncodeAccelerator::kDefaultFramerate, num_temporal_layers, + svc_layer_size))) .Times(1) .WillOnce(Return()); @@ -354,22 +365,14 @@ void VP9VaapiVideoEncoderDelegateTest:: EncodeConstantQuantizationParameterSequence( bool is_keyframe, - size_t num_spatial_layers, + const gfx::Size& layer_size, absl::optional<std::array<bool, kVp9NumRefsPerFrame>> expected_ref_frames_used, - absl::optional<uint8_t> expected_temporal_layer_id, - absl::optional<uint8_t> expected_spatial_layer_id) { + uint8_t expected_temporal_layer_id, + uint8_t expected_spatial_layer_id) { InSequence seq; constexpr VASurfaceID kDummyVASurfaceID = 123; - const double resolution_denom = - kSpatialLayersResolutionScaleDenom[num_spatial_layers - 1] - [expected_spatial_layer_id.value_or(0)]; - gfx::Size layer_size = gfx::Size( - kDefaultVideoEncodeAcceleratorConfig.input_visible_size.width() / - resolution_denom, - kDefaultVideoEncodeAcceleratorConfig.input_visible_size.height() / - resolution_denom); auto va_surface = base::MakeRefCounted<VASurface>( kDummyVASurfaceID, layer_size, VA_RT_FORMAT_YUV420, base::DoNothing()); scoped_refptr<VP9Picture> picture = new VaapiVP9Picture(va_surface); @@ -402,77 +405,82 @@ encoder_->BitrateControlUpdate(kDefaultEncodedFrameSize); } -void VP9VaapiVideoEncoderDelegateTest::UpdateRatesSequence( +void VP9VaapiVideoEncoderDelegateTest::UpdateRatesAndEncode( const VideoBitrateAllocation& bitrate_allocation, uint32_t framerate, - size_t num_spatial_layers, - size_t num_temporal_layers) { + bool is_key_pic, + const std::vector<gfx::Size>& expected_spatial_layer_resolutions, + size_t expected_temporal_layers, + size_t expected_temporal_layer_id) { ASSERT_TRUE(encoder_->current_params_.bitrate_allocation != bitrate_allocation || encoder_->current_params_.framerate != framerate); + // Since the request is pended, this is always successful and no call happens + // to VP9SVCLayers and RateControl. + EXPECT_TRUE(encoder_->UpdateRates(bitrate_allocation, framerate)); + EXPECT_TRUE(encoder_->pending_update_rates_.has_value()); EXPECT_CALL(*mock_rate_ctrl_, UpdateRateControl(MatchRtcConfigWithRates( - encoder_->visible_size_, bitrate_allocation, framerate, - num_spatial_layers, num_temporal_layers))) + bitrate_allocation, framerate, expected_temporal_layers, + expected_spatial_layer_resolutions))) .Times(1) .WillOnce(Return()); - EXPECT_TRUE(encoder_->UpdateRates(bitrate_allocation, framerate)); + // The pending update rates request is applied in GetSVCLayerResolutions(). + EXPECT_EQ(encoder_->GetSVCLayerResolutions(), + expected_spatial_layer_resolutions); + + EXPECT_EQ(encoder_->current_params_.bitrate_allocation, bitrate_allocation); + EXPECT_EQ(encoder_->current_params_.framerate, framerate); + + const size_t num_spatial_layers = expected_spatial_layer_resolutions.size(); + for (size_t sid = 0; sid < num_spatial_layers; ++sid) { + const gfx::Size& layer_size = expected_spatial_layer_resolutions[sid]; + const bool is_keyframe = is_key_pic && sid == 0; + EncodeConstantQuantizationParameterSequence( + is_keyframe, layer_size, + /*expected_ref_frames_used=*/{}, expected_temporal_layer_id, sid); + } } void VP9VaapiVideoEncoderDelegateTest::UpdateRatesTest( size_t num_spatial_layers, size_t num_temporal_layers) { ASSERT_TRUE(num_temporal_layers <= VP9SVCLayers::kMaxSupportedTemporalLayers); - const auto update_rates_and_encode = - [this, num_spatial_layers, num_temporal_layers]( - bool is_key_pic, const VideoBitrateAllocation& bitrate_allocation, - uint32_t framerate) { - UpdateRatesSequence(bitrate_allocation, framerate, num_spatial_layers, - num_temporal_layers); - - for (size_t sid = 0; sid < num_spatial_layers; ++sid) { - const bool is_keyframe = is_key_pic && sid == 0; - EncodeConstantQuantizationParameterSequence( - is_keyframe, num_spatial_layers, {}, absl::nullopt, - absl::nullopt); - // Check if a rate change request is applied because the request is - // applied during PrepareEncodeJob(). - EXPECT_EQ(encoder_->current_params_.bitrate_allocation, - bitrate_allocation); - EXPECT_EQ(encoder_->current_params_.framerate, framerate); - } - }; + ASSERT_TRUE(num_spatial_layers <= VP9SVCLayers::kMaxSupportedTemporalLayers); + const auto spatial_layer_resolutions = + GetDefaultSpatialLayerResolutions(num_spatial_layers); + auto update_rates_and_encode = [this, num_spatial_layers, num_temporal_layers, + &spatial_layer_resolutions]( + bool is_key_pic, + uint8_t expected_temporal_layer_id, + uint32_t bitrate, uint32_t framerate) { + auto bitrate_allocation = GetDefaultVideoBitrateAllocation( + num_spatial_layers, num_temporal_layers, bitrate); + UpdateRatesAndEncode(bitrate_allocation, framerate, is_key_pic, + spatial_layer_resolutions, num_temporal_layers, + expected_temporal_layer_id); + }; const uint32_t kBitrate = kDefaultVideoEncodeAcceleratorConfig.bitrate.target(); const uint32_t kFramerate = *kDefaultVideoEncodeAcceleratorConfig.initial_framerate; + const uint8_t* expected_temporal_ids = + kTemporalLayerPattern[num_temporal_layers - 1]; // Call UpdateRates before Encode. - update_rates_and_encode( - true, - GetDefaultVideoBitrateAllocation(num_spatial_layers, num_temporal_layers, - kBitrate / 2), - kFramerate); + update_rates_and_encode(true, expected_temporal_ids[0], kBitrate / 2, + kFramerate); // Bitrate change only. - update_rates_and_encode( - false, - GetDefaultVideoBitrateAllocation(num_spatial_layers, num_temporal_layers, - kBitrate), - kFramerate); + update_rates_and_encode(false, expected_temporal_ids[1], kBitrate, + kFramerate); // Framerate change only. - update_rates_and_encode( - false, - GetDefaultVideoBitrateAllocation(num_spatial_layers, num_temporal_layers, - kBitrate), - kFramerate + 2); + update_rates_and_encode(false, expected_temporal_ids[2], kBitrate, + kFramerate + 2); // Bitrate + Frame changes. - update_rates_and_encode( - false, - GetDefaultVideoBitrateAllocation(num_spatial_layers, num_temporal_layers, - kBitrate * 3 / 4), - kFramerate - 5); + update_rates_and_encode(false, expected_temporal_ids[3], kBitrate * 3 / 4, + kFramerate - 5); } struct VP9VaapiVideoEncoderDelegateTestParam { @@ -494,18 +502,20 @@ InitializeVP9VaapiVideoEncoderDelegate(num_spatial_layers, num_temporal_layers); + const std::vector<gfx::Size> layer_sizes = + GetDefaultSpatialLayerResolutions(num_spatial_layers); constexpr size_t kEncodeFrames = 20; for (size_t frame_num = 0; frame_num < kEncodeFrames; ++frame_num) { for (size_t sid = 0; sid < num_spatial_layers; ++sid) { const bool is_keyframe = (frame_num == 0 && sid == 0); std::array<bool, kVp9NumRefsPerFrame> ref_frames_used; - absl::optional<uint8_t> temporal_layer_id; + uint8_t temporal_layer_id; GetTemporalLayer(is_keyframe, frame_num, num_spatial_layers, num_temporal_layers, &ref_frames_used, &temporal_layer_id); - EncodeConstantQuantizationParameterSequence( - is_keyframe, num_spatial_layers, ref_frames_used, temporal_layer_id, - sid); + EncodeConstantQuantizationParameterSequence(is_keyframe, layer_sizes[sid], + ref_frames_used, + temporal_layer_id, sid); } } } @@ -518,17 +528,19 @@ num_temporal_layers); constexpr size_t kNumKeyFrames = 3; constexpr size_t kKeyFrameInterval = 20; + const std::vector<gfx::Size> layer_sizes = + GetDefaultSpatialLayerResolutions(num_spatial_layers); for (size_t j = 0; j < kNumKeyFrames; j++) { for (size_t i = 0; i < kKeyFrameInterval; i++) { for (size_t sid = 0; sid < num_spatial_layers; ++sid) { const bool keyframe = (i == 0 && sid == 0); std::array<bool, kVp9NumRefsPerFrame> ref_frames_used; - absl::optional<uint8_t> temporal_layer_id; + uint8_t temporal_layer_id; GetTemporalLayer(keyframe, i, num_spatial_layers, num_temporal_layers, &ref_frames_used, &temporal_layer_id); - EncodeConstantQuantizationParameterSequence( - keyframe, num_spatial_layers, ref_frames_used, temporal_layer_id, - sid); + EncodeConstantQuantizationParameterSequence(keyframe, layer_sizes[sid], + ref_frames_used, + temporal_layer_id, sid); } } }
diff --git a/media/renderers/win/media_foundation_renderer.cc b/media/renderers/win/media_foundation_renderer.cc index 0ce808b9..ebd43b4 100644 --- a/media/renderers/win/media_foundation_renderer.cc +++ b/media/renderers/win/media_foundation_renderer.cc
@@ -505,6 +505,8 @@ base::win::ScopedPropVariant frames_dropped; RETURN_IF_FAILED(media_engine_ex->GetStatistics( MF_MEDIA_ENGINE_STATISTIC_FRAMES_DROPPED, frames_dropped.Receive())); + DVLOG_FUNC(3) << "video_frames_decoded=" << frames_rendered.get().ulVal + << ", video_frames_dropped=" << frames_dropped.get().ulVal; statistics.video_frames_decoded = frames_rendered.get().ulVal; statistics.video_frames_dropped = frames_dropped.get().ulVal; return S_OK; @@ -514,7 +516,7 @@ PipelineStatistics new_stats = {}; HRESULT hr = PopulateStatistics(new_stats); if (FAILED(hr)) { - DVLOG(3) << "Unable to populate pipeline stats: " << PrintHr(hr); + DVLOG_FUNC(3) << "Unable to populate pipeline stats: " << PrintHr(hr); return; } @@ -525,6 +527,7 @@ } void MediaFoundationRenderer::StartSendingStatistics() { + DVLOG_FUNC(2); const auto kPipelineStatsPollingPeriod = base::TimeDelta::FromMilliseconds(500); statistics_timer_.Start(FROM_HERE, kPipelineStatsPollingPeriod, this, @@ -532,6 +535,7 @@ } void MediaFoundationRenderer::StopSendingStatistics() { + DVLOG_FUNC(2); statistics_timer_.Stop(); }
diff --git a/media/renderers/win/media_foundation_stream_wrapper.cc b/media/renderers/win/media_foundation_stream_wrapper.cc index ce71d39..7eb15906 100644 --- a/media/renderers/win/media_foundation_stream_wrapper.cc +++ b/media/renderers/win/media_foundation_stream_wrapper.cc
@@ -150,8 +150,6 @@ int stream_id, IMFMediaSource* parent_source, DemuxerStream* demuxer_stream) { - DVLOG_FUNC(1); - { base::AutoLock auto_lock(lock_); parent_source_ = parent_source; @@ -159,6 +157,10 @@ demuxer_stream_ = demuxer_stream; stream_id_ = stream_id; stream_type_ = demuxer_stream_->type(); + + DVLOG_FUNC(1) << "stream_id=" << stream_id + << ", stream_type=" << DemuxerStream::GetTypeName(stream_type_); + RETURN_IF_FAILED(GenerateStreamDescriptor()); RETURN_IF_FAILED(MFCreateEventQueue(&mf_media_event_queue_)); return S_OK; @@ -232,7 +234,7 @@ } bool MediaFoundationStreamWrapper::HasEnded() const { - DVLOG_FUNC(2); + DVLOG_FUNC(2) << "stream_ended_=" << stream_ended_; return stream_ended_; }
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc index 7944f26..8bdbe5b 100644 --- a/net/disk_cache/backend_unittest.cc +++ b/net/disk_cache/backend_unittest.cc
@@ -69,6 +69,8 @@ #if defined(OS_WIN) #include "base/win/scoped_handle.h" + +#include <windows.h> #endif // Provide a BackendImpl object to macros from histogram_macros.h.
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index 3e1e676..2e15b86 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -102,8 +102,6 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/scheme_host_port.h" -#include "url/third_party/mozilla/url_parse.h" -#include "url/url_canon_ip.h" #if BUILDFLAG(ENABLE_MDNS) #include "net/dns/mdns_client_impl.h" @@ -787,17 +785,6 @@ source_net_log_.EndEventWithNetErrorCode( NetLogEventType::HOST_RESOLVER_IMPL_REQUEST, net_error); - base::StringPiece hostname = GetHostname(request_host_); - url::HostSafetyStatus host_safety_status = url::CheckHostnameSafety( - hostname.data(), url::Component(0, hostname.size())); - if (net_error == net::OK) { - UMA_HISTOGRAM_ENUMERATION("Net.DNS.Request.Success.HostSafetyStatus", - host_safety_status); - } else { - UMA_HISTOGRAM_ENUMERATION("Net.DNS.Request.Failure.HostSafetyStatus", - host_safety_status); - } - if (!parameters_.is_speculative) { DCHECK(!request_time_.is_null()); base::TimeDelta duration = tick_clock_->NowTicks() - request_time_;
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb index a7ca11e..2dfbd7d8 100644 --- a/remoting/resources/remoting_strings_kn.xtb +++ b/remoting/resources/remoting_strings_kn.xtb
@@ -68,6 +68,7 @@ <translation id="4176825807642096119">ಪ್ರವೇಶ ಕೋಡ್</translation> <translation id="4227991223508142681">ಹೋಸ್ಟ್ ಒದಗಿಸುವಿಕೆ ಸೌಲಭ್ಯ</translation> <translation id="4240294130679914010">ಕ್ರೊಮೋಟಿಂಗ್ ಹೋಸ್ಟ್ ಅಸ್ಥಾಪಕ</translation> +<translation id="4257751272692708833"><ph name="PRODUCT_NAME" /> URL ಫಾರ್ವರ್ಡ್ ಮಾಡುವವರು</translation> <translation id="4277736576214464567">ಪ್ರವೇಶ ಕೋಡ್ ಅಮಾನ್ಯವಾಗಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="4281844954008187215">ಸೇವೆಯ ನಿಯಮಗಳು</translation> <translation id="4405930547258349619">ಮುಖ್ಯ ಲೈಬ್ರರಿ</translation> @@ -123,6 +124,7 @@ <translation id="6612717000975622067">Ctrl-Alt-Del ಕಳುಹಿಸು</translation> <translation id="6654753848497929428">ಹಂಚಿಕೊಳ್ಳಿ</translation> <translation id="677755392401385740">ಈ ಬಳಕೆದಾರರಿಗಾಗಿ ಹೋಸ್ಟ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ: <ph name="HOST_USERNAME" />.</translation> +<translation id="6902524959760471898"><ph name="PRODUCT_NAME" /> ಕ್ಲೈಂಟ್ನಲ್ಲಿ URL ತೆರೆಯಲು ಸಹಾಯಕ ಆ್ಯಪ್</translation> <translation id="6939719207673461467">ಕೀಬೋರ್ಡ್ ತೋರಿಸು/ಮರೆಮಾಡು.</translation> <translation id="6963936880795878952">ಅಮಾನ್ಯ ಪಿನ್ ಬಳಸಿಕೊಂಡು ಅದಕ್ಕೆ ಸಂಪರ್ಕಿಸಲು ಯಾರೋ ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಾರಣ ರಿಮೋಟ್ ಕಂಪ್ಯೂಟರ್ಗೆ ಸಂಪರ್ಕಗಳನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="6965382102122355670">ಸರಿ</translation>
diff --git a/services/video_capture/device_media_to_mojo_adapter.cc b/services/video_capture/device_media_to_mojo_adapter.cc index a4dd256..1488c8a 100644 --- a/services/video_capture/device_media_to_mojo_adapter.cc +++ b/services/video_capture/device_media_to_mojo_adapter.cc
@@ -6,12 +6,11 @@ #include "base/bind.h" #include "base/check.h" -#include "base/command_line.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "media/base/bind_to_current_loop.h" -#include "media/capture/capture_switches.h" #include "media/capture/video/video_capture_buffer_pool_impl.h" +#include "media/capture/video/video_capture_buffer_pool_util.h" #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" #include "media/capture/video/video_frame_receiver_on_task_runner.h" #include "mojo/public/cpp/bindings/callback_helpers.h" @@ -179,39 +178,7 @@ // static int DeviceMediaToMojoAdapter::max_buffer_pool_buffer_count() { - // The maximum number of video frame buffers in-flight at any one time. - // If all buffers are still in use by consumers when new frames are produced - // those frames get dropped. - static int kMaxBufferCount = 4; - -#if defined(OS_MAC) - // On macOS, we allow a few more buffers as it's routinely observed that it - // runs out of three when just displaying 60 FPS media in a video element. - kMaxBufferCount = 10; -#elif BUILDFLAG(IS_CHROMEOS_ASH) - // On Chrome OS with MIPI cameras running on HAL v3, there can be four - // concurrent streams of camera pipeline depth ~6. We allow at most 36 buffers - // here to take into account the delay caused by the consumer (e.g. display or - // video encoder). - if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableVideoCaptureUseGpuMemoryBuffer) && - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kVideoCaptureUseGpuMemoryBuffer)) { - kMaxBufferCount = 36; - } -#elif defined(OS_WIN) - // On Windows, for GMB backed zero-copy more buffers are needed because it's - // routinely observed that it runs out of default buffer count when just - // displaying 60 FPS media in a video element - if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableVideoCaptureUseGpuMemoryBuffer) && - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kVideoCaptureUseGpuMemoryBuffer)) { - kMaxBufferCount = 30; - } -#endif - - return kMaxBufferCount; + return media::DeviceVideoCaptureMaxBufferPoolSize(); } } // namespace video_capture
diff --git a/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc b/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc index c11bf02..3b7b234 100644 --- a/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc +++ b/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc
@@ -12,6 +12,7 @@ #include "media/base/bind_to_current_loop.h" #include "media/capture/video/scoped_buffer_pool_reservation.h" #include "media/capture/video/video_capture_buffer_pool_impl.h" +#include "media/capture/video/video_capture_buffer_pool_util.h" #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" #include "mojo/public/cpp/bindings/callback_helpers.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -46,12 +47,7 @@ } int SharedMemoryVirtualDeviceMojoAdapter::max_buffer_pool_buffer_count() { - // The maximum number of video frame buffers in-flight at any one time - // If all buffers are still in use by consumers when new frames are produced - // those frames get dropped. - static const int kMaxBufferCount = 4; - - return kMaxBufferCount; + return media::kVideoCaptureDefaultMaxBufferPoolSize; } void SharedMemoryVirtualDeviceMojoAdapter::RequestFrameBuffer(
diff --git a/sql/database.cc b/sql/database.cc index b5107b3..7172050 100644 --- a/sql/database.cc +++ b/sql/database.cc
@@ -1172,12 +1172,20 @@ if (error != SQLITE_OK) error = OnSqliteError(error, nullptr, sql); - // This needs to be a FATAL log because the error case of arriving here is - // that there's a malformed SQL statement. This can arise in development if - // a change alters the schema but not all queries adjust. This can happen - // in production if the schema is corrupted. - DCHECK_NE(error, SQLITE_ERROR) - << "SQL Error in " << sql << ", " << GetErrorMessage(); +#if DCHECK_IS_ON() + // Report SQL compilation errors. On developer machines, the errors are most + // likely caused by invalid SQL in an under-development feature. In + // production, SQL compilation errors are caused by database schema + // corruption. + // + // DCHECK would not be appropriate here, because on-disk data is always + // subject to corruption, so Chrome cannot assume that the database schema + // will remain intact. + if (error == SQLITE_ERROR) { + DLOG(ERROR) << "SQL compilation error: " << GetErrorMessage() + << ". Statement: " << sql; + } +#endif // DCHECK_IS_ON() return error == SQLITE_OK; } @@ -1244,11 +1252,23 @@ int rc = sqlite3_prepare_v3(db_, sql, /* nByte= */ -1, /* prepFlags= */ 0, &sqlite_statement, /* pzTail= */ nullptr); if (rc != SQLITE_OK) { - // This is evidence of a syntax error in the incoming SQL. - DCHECK_NE(rc, SQLITE_ERROR) << "SQL compile error " << GetErrorMessage(); - - // It could also be database corruption. OnSqliteError(rc, nullptr, sql); + +#if DCHECK_IS_ON() + // Report SQL compilation errors. On developer machines, the errors are most + // likely caused by invalid SQL in an under-development feature. In + // production, SQL compilation errors are caused by database schema + // corruption. + // + // DCHECK would not be appropriate here, because on-disk data is always + // subject to corruption, so Chrome cannot assume that the database schema + // will remain intact. + if (rc == SQLITE_ERROR) { + DLOG(ERROR) << "SQL compilation error: " << GetErrorMessage() + << ". Statement: " << sql; + } +#endif // DCHECK_IS_ON() + return base::MakeRefCounted<StatementRef>(nullptr, nullptr, false); } return base::MakeRefCounted<StatementRef>(tracking_db, sqlite_statement, @@ -1628,35 +1648,39 @@ histogram_tag_ = tag; } -int Database::OnSqliteError(int err, - sql::Statement* stmt, +int Database::OnSqliteError(int sqlite_error_code, + sql::Statement* statement, const char* sql) const { TRACE_EVENT0("sql", "Database::OnSqliteError"); - // Always log the error. - if (!sql && stmt) - sql = stmt->GetSQLStatement(); - if (!sql) - sql = "-- unknown"; + bool is_expected_error = IsExpectedSqliteError(sqlite_error_code); + if (!is_expected_error) { + // Log unexpected errors. + if (!sql && statement) + sql = statement->GetSQLStatement(); + if (!sql) + sql = "(SQL unknown)"; - std::string id = histogram_tag_; - if (id.empty()) - id = DbPath().BaseName().AsUTF8Unsafe(); - LOG(ERROR) << id << " sqlite error " << err << ", errno " << GetLastErrno() - << ": " << GetErrorMessage() << ", sql: " << sql; + std::string id = histogram_tag_; + if (id.empty()) + id = DbPath().BaseName().AsUTF8Unsafe(); + LOG(ERROR) << id << " SQLite error: code " << sqlite_error_code << " errno " + << GetLastErrno() << ": " << GetErrorMessage() + << " sql: " << sql; + } if (!error_callback_.is_null()) { // Fire from a copy of the callback in case of reentry into // re/set_error_callback(). // TODO(shess): <http://crbug.com/254584> - ErrorCallback(error_callback_).Run(err, stmt); - return err; + ErrorCallback(error_callback_).Run(sqlite_error_code, statement); + return sqlite_error_code; } // The default handling is to assert on debug and to ignore on release. - if (!IsExpectedSqliteError(err)) + if (!is_expected_error) DLOG(DCHECK) << GetErrorMessage(); - return err; + return sqlite_error_code; } bool Database::FullIntegrityCheck(std::vector<std::string>* messages) {
diff --git a/sql/database_unittest.cc b/sql/database_unittest.cc index 5ad77dc..c7d85020 100644 --- a/sql/database_unittest.cc +++ b/sql/database_unittest.cc
@@ -12,6 +12,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" +#include "base/test/bind.h" #include "base/test/gtest_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/trace_event/process_memory_dump.h" @@ -433,6 +434,79 @@ } } +TEST_P(SQLDatabaseTest, Execute_CompilationError) { + bool error_callback_called = false; + db_->set_error_callback(base::BindLambdaForTesting([&](int error, + sql::Statement* + statement) { + EXPECT_EQ(SQLITE_ERROR, error); + EXPECT_EQ(nullptr, statement); + EXPECT_FALSE(error_callback_called) + << "SQL compilation errors should call the error callback exactly once"; + error_callback_called = true; + })); + + { + sql::test::ScopedErrorExpecter expecter; + expecter.ExpectError(SQLITE_ERROR); + EXPECT_FALSE(db_->Execute("SELECT missing_column FROM missing_table")); + EXPECT_TRUE(expecter.SawExpectedErrors()); + } + + EXPECT_TRUE(error_callback_called) + << "SQL compilation errors should call the error callback"; +} + +TEST_P(SQLDatabaseTest, GetUniqueStatement_CompilationError) { + bool error_callback_called = false; + db_->set_error_callback(base::BindLambdaForTesting([&](int error, + sql::Statement* + statement) { + EXPECT_EQ(SQLITE_ERROR, error); + EXPECT_EQ(nullptr, statement); + EXPECT_FALSE(error_callback_called) + << "SQL compilation errors should call the error callback exactly once"; + error_callback_called = true; + })); + + { + sql::test::ScopedErrorExpecter expecter; + expecter.ExpectError(SQLITE_ERROR); + sql::Statement statement( + db_->GetUniqueStatement("SELECT missing_column FROM missing_table")); + EXPECT_FALSE(statement.is_valid()); + EXPECT_TRUE(expecter.SawExpectedErrors()); + } + + EXPECT_TRUE(error_callback_called) + << "SQL compilation errors should call the error callback"; +} + +TEST_P(SQLDatabaseTest, GetCachedStatement_CompilationError) { + bool error_callback_called = false; + db_->set_error_callback(base::BindLambdaForTesting([&](int error, + sql::Statement* + statement) { + EXPECT_EQ(SQLITE_ERROR, error); + EXPECT_EQ(nullptr, statement); + EXPECT_FALSE(error_callback_called) + << "SQL compilation errors should call the error callback exactly once"; + error_callback_called = true; + })); + + { + sql::test::ScopedErrorExpecter expecter; + expecter.ExpectError(SQLITE_ERROR); + sql::Statement statement(db_->GetCachedStatement( + SQL_FROM_HERE, "SELECT missing_column FROM missing_table")); + EXPECT_FALSE(statement.is_valid()); + EXPECT_TRUE(expecter.SawExpectedErrors()); + } + + EXPECT_TRUE(error_callback_called) + << "SQL compilation errors should call the error callback"; +} + // Test that Database::Raze() results in a database without the // tables from the original database. TEST_P(SQLDatabaseTest, Raze) { @@ -1407,20 +1481,6 @@ } } -// To prevent invalid SQL from accidentally shipping to production, prepared -// statements which fail to compile with SQLITE_ERROR call DLOG(DCHECK). This -// case cannot be suppressed with an error callback. -TEST_P(SQLDatabaseTest, CompileError) { -// DEATH tests not supported on Android, iOS, or Fuchsia. -#if !defined(OS_ANDROID) && !defined(OS_IOS) && !defined(OS_FUCHSIA) - if (DLOG_IS_ON(FATAL)) { - db_->set_error_callback(base::BindRepeating(&IgnoreErrorCallback)); - ASSERT_DEATH({ db_->GetUniqueStatement("SELECT x"); }, - "SQL compile error no such column: x"); - } -#endif // !defined(OS_ANDROID) && !defined(OS_IOS) && !defined(OS_FUCHSIA) -} - // WAL mode is currently not supported on Fuchsia. #if !defined(OS_FUCHSIA) INSTANTIATE_TEST_SUITE_P(JournalMode, SQLDatabaseTest, testing::Bool());
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 34514285..86de5f0 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -27300,7 +27300,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "absl_hardening_tests", "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" @@ -27312,7 +27312,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "accessibility_unittests", "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/" @@ -27327,7 +27327,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "angle_unittests", "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", @@ -27340,7 +27340,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "app_shell_unittests", "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/" @@ -27352,7 +27352,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "aura_unittests", "test_id_prefix": "ninja://ui/aura:aura_unittests/" @@ -27364,7 +27364,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/" @@ -27376,7 +27376,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "base_util_unittests", "test_id_prefix": "ninja://base/util:base_util_unittests/" @@ -27388,7 +27388,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" @@ -27400,7 +27400,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "blink_fuzzer_unittests", "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/" @@ -27412,7 +27412,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "blink_heap_unittests", "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" @@ -27424,7 +27424,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "blink_platform_unittests", "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" @@ -27437,7 +27437,7 @@ "name": "webkit_unit_tests", "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "blink_unittests", "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" @@ -27449,7 +27449,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "boringssl_crypto_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" @@ -27461,7 +27461,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "boringssl_ssl_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" @@ -27473,7 +27473,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "browser_switcher_bho_unittests", "test_id_prefix": "ninja://chrome/browser/browser_switcher/bho:browser_switcher_bho_unittests/" @@ -27485,7 +27485,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test": "browser_tests", @@ -27501,7 +27501,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "capture_unittests", "test_id_prefix": "ninja://media/capture:capture_unittests/" @@ -27513,7 +27513,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "cast_unittests", "test_id_prefix": "ninja://media/cast:cast_unittests/" @@ -27525,7 +27525,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "cc_unittests", "test_id_prefix": "ninja://cc:cc_unittests/" @@ -27537,7 +27537,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "chrome_app_unittests", "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/" @@ -27549,7 +27549,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "chrome_cleaner_unittests", "test_id_prefix": "ninja://chrome/chrome_cleaner:chrome_cleaner_unittests/" @@ -27561,7 +27561,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "chrome_elf_unittests", "test_id_prefix": "ninja://chrome/chrome_elf:chrome_elf_unittests/" @@ -27573,7 +27573,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "chromedriver_unittests", "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/" @@ -27585,7 +27585,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "color_unittests", "test_id_prefix": "ninja://ui/color:color_unittests/" @@ -27597,7 +27597,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" @@ -27609,7 +27609,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/" @@ -27621,7 +27621,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "compositor_unittests", "test_id_prefix": "ninja://ui/compositor:compositor_unittests/" @@ -27633,7 +27633,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 6 }, "test": "content_browsertests", @@ -27646,7 +27646,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", "test_id_prefix": "ninja://content/test:content_unittests/" @@ -27658,7 +27658,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "courgette_unittests", "test_id_prefix": "ninja://courgette:courgette_unittests/" @@ -27670,7 +27670,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "crashpad_tests", "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" @@ -27682,7 +27682,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "cronet_tests", "test_id_prefix": "ninja://components/cronet:cronet_tests/" @@ -27694,7 +27694,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "cronet_unittests", "test_id_prefix": "ninja://components/cronet:cronet_unittests/" @@ -27706,7 +27706,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" @@ -27718,7 +27718,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "delayloads_unittests", "test_id_prefix": "ninja://chrome/test:delayloads_unittests/" @@ -27730,7 +27730,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "device_unittests", "test_id_prefix": "ninja://device:device_unittests/" @@ -27742,7 +27742,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "display_unittests", "test_id_prefix": "ninja://ui/display:display_unittests/" @@ -27754,7 +27754,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "elevation_service_unittests", "test_id_prefix": "ninja://chrome/elevation_service:elevation_service_unittests/" @@ -27766,7 +27766,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "events_unittests", "test_id_prefix": "ninja://ui/events:events_unittests/" @@ -27778,7 +27778,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "extensions_browsertests", "test_id_prefix": "ninja://extensions:extensions_browsertests/" @@ -27790,7 +27790,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "extensions_unittests", "test_id_prefix": "ninja://extensions:extensions_unittests/" @@ -27802,7 +27802,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "filesystem_service_unittests", "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/" @@ -27814,7 +27814,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" @@ -27826,7 +27826,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gcp_unittests", "test_id_prefix": "ninja://chrome/credential_provider/test:gcp_unittests/" @@ -27838,7 +27838,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" @@ -27850,7 +27850,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gin_unittests", "test_id_prefix": "ninja://gin:gin_unittests/" @@ -27862,7 +27862,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "google_apis_unittests", "test_id_prefix": "ninja://google_apis:google_apis_unittests/" @@ -27874,7 +27874,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gpu_unittests", "test_id_prefix": "ninja://gpu:gpu_unittests/" @@ -27886,7 +27886,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gwp_asan_unittests", "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" @@ -27898,7 +27898,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "headless_browsertests", "test_id_prefix": "ninja://headless:headless_browsertests/" @@ -27910,7 +27910,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "headless_unittests", "test_id_prefix": "ninja://headless:headless_unittests/" @@ -27922,7 +27922,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "install_static_unittests", "test_id_prefix": "ninja://chrome/install_static:install_static_unittests/" @@ -27939,7 +27939,7 @@ "integrity": "high" } ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "installer_util_unittests", "test_id_prefix": "ninja://chrome/installer/util:installer_util_unittests/" @@ -27951,7 +27951,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test": "interactive_ui_tests", @@ -27964,7 +27964,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "ipc_tests", "test_id_prefix": "ninja://ipc:ipc_tests/" @@ -27976,7 +27976,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "jingle_unittests", "test_id_prefix": "ninja://jingle:jingle_unittests/" @@ -27988,7 +27988,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "latency_unittests", "test_id_prefix": "ninja://ui/latency:latency_unittests/" @@ -28000,7 +28000,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "libjingle_xmpp_unittests", "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" @@ -28012,7 +28012,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "liburlpattern_unittests", "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" @@ -28024,7 +28024,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "media_unittests", "test_id_prefix": "ninja://media:media_unittests/" @@ -28036,7 +28036,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "message_center_unittests", "test_id_prefix": "ninja://ui/message_center:message_center_unittests/" @@ -28048,7 +28048,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "midi_unittests", "test_id_prefix": "ninja://media/midi:midi_unittests/" @@ -28060,7 +28060,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "mojo_core_unittests", "test_id_prefix": "ninja://mojo/core:mojo_core_unittests/" @@ -28072,7 +28072,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "mojo_unittests", "test_id_prefix": "ninja://mojo:mojo_unittests/" @@ -28084,7 +28084,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "nacl_loader_unittests", "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/" @@ -28096,7 +28096,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "native_theme_unittests", "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/" @@ -28108,7 +28108,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "net_unittests", "test_id_prefix": "ninja://net:net_unittests/" @@ -28120,7 +28120,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "pdf_unittests", "test_id_prefix": "ninja://pdf:pdf_unittests/" @@ -28132,7 +28132,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "perfetto_unittests", "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" @@ -28144,7 +28144,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "ppapi_unittests", "test_id_prefix": "ninja://ppapi:ppapi_unittests/" @@ -28156,7 +28156,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "printing_unittests", "test_id_prefix": "ninja://printing:printing_unittests/" @@ -28168,7 +28168,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "remoting_unittests", "test_id_prefix": "ninja://remoting:remoting_unittests/" @@ -28185,7 +28185,7 @@ "integrity": "high" } ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "sbox_integration_tests", "test_id_prefix": "ninja://sandbox/win:sbox_integration_tests/" @@ -28197,7 +28197,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "sbox_unittests", "test_id_prefix": "ninja://sandbox/win:sbox_unittests/" @@ -28209,7 +28209,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "sbox_validation_tests", "test_id_prefix": "ninja://sandbox/win:sbox_validation_tests/" @@ -28221,7 +28221,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "service_manager_unittests", "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/" @@ -28233,7 +28233,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" @@ -28250,7 +28250,7 @@ "integrity": "high" } ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "setup_unittests", "test_id_prefix": "ninja://chrome/installer/setup:setup_unittests/" @@ -28262,7 +28262,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "shell_dialogs_unittests", "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" @@ -28274,7 +28274,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/" @@ -28286,7 +28286,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "snapshot_unittests", "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/" @@ -28298,7 +28298,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "sql_unittests", "test_id_prefix": "ninja://sql:sql_unittests/" @@ -28310,7 +28310,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "storage_unittests", "test_id_prefix": "ninja://storage:storage_unittests/" @@ -28322,7 +28322,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" @@ -28334,7 +28334,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "traffic_annotation_auditor_unittests", "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/" @@ -28346,7 +28346,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/" @@ -28358,7 +28358,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "ui_touch_selection_unittests", "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" @@ -28370,7 +28370,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "unit_tests", "test_id_prefix": "ninja://chrome/test:unit_tests/" @@ -28382,7 +28382,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "updater_tests", "test_id_prefix": "ninja://chrome/updater:updater_tests/" @@ -28394,7 +28394,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "url_unittests", "test_id_prefix": "ninja://url:url_unittests/" @@ -28406,7 +28406,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "views_unittests", "test_id_prefix": "ninja://ui/views:views_unittests/" @@ -28418,7 +28418,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/" @@ -28430,7 +28430,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "vr_common_unittests", "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/" @@ -28442,7 +28442,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "vr_pixeltests", "test_id_prefix": "ninja://chrome/browser/vr:vr_pixeltests/" @@ -28454,7 +28454,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "weblayer_browsertests", "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" @@ -28466,7 +28466,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "weblayer_unittests", "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" @@ -28478,7 +28478,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" @@ -28490,7 +28490,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "wtf_unittests", "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" @@ -28502,7 +28502,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "zlib_unittests", "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" @@ -28514,7 +28514,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "zucchini_unittests", "test_id_prefix": "ninja://components/zucchini:zucchini_unittests/" @@ -28532,7 +28532,7 @@ }, "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://chrome/test:chrome_sizes/" }, @@ -28550,7 +28550,7 @@ "integrity": "high" } ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://chrome/test/mini_installer:mini_installer_tests/" }, @@ -28564,7 +28564,7 @@ "name": "polymer_tools_python_unittests", "swarming": { "can_use_on_swarming_builders": true, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://tools/polymer:polymer_tools_python_unittests/" }
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index fc335f6..5126b7b 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -12323,6 +12323,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "absl_hardening_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "absl_hardening_tests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12374,6 +12425,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12425,6 +12527,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12476,6 +12629,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12527,6 +12731,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12578,6 +12833,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "boringssl_crypto_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "boringssl_crypto_tests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12629,6 +12935,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "boringssl_ssl_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "boringssl_ssl_tests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12680,6 +13037,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12731,6 +13139,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12782,6 +13241,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12833,6 +13343,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12884,6 +13445,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "crypto_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "crypto_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://crypto:crypto_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12935,6 +13547,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -12986,6 +13649,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13037,6 +13751,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13088,6 +13853,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13139,6 +13955,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "google_apis_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "google_apis_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13190,6 +14057,59 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_integration_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13243,6 +14163,58 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_signin_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13295,6 +14267,59 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_ui_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 5 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13348,6 +14373,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13399,6 +14475,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13450,6 +14577,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13501,6 +14679,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13552,6 +14781,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_components_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13603,6 +14883,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_net_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_net_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13654,6 +14985,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_remoting_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_remoting_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13705,6 +15087,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_testing_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_testing_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13756,6 +15189,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13807,6 +15291,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13858,6 +15393,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13909,6 +15495,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -13960,6 +15597,58 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_web_shell_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_shell_eg2tests_module_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14012,6 +15701,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14063,6 +15803,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14114,6 +15905,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14165,6 +16007,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14216,6 +16109,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14267,6 +16211,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14318,6 +16313,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14369,6 +16415,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14420,6 +16517,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14471,6 +16619,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14522,6 +16721,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14573,6 +16823,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14624,6 +16925,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "net_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "net_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://net:net_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14675,6 +17027,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "services_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "services_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://services:services_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14726,6 +17129,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14777,6 +17231,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14828,6 +17333,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14879,6 +17435,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14930,6 +17537,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "sql_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "sql_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://sql:sql_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -14981,6 +17639,57 @@ "--platform", "iPad Air 2", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests_iPad Air 2 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -15032,6 +17741,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -15083,6 +17843,57 @@ "--platform", "iPhone 6s Plus", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests_iPhone 6s Plus 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -15134,6 +17945,57 @@ "--platform", "iPhone SE (1st generation)", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests_iPhone SE (1st generation) 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -15185,6 +18047,57 @@ "--platform", "iPhone 6s", "--version", + "13.6", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12d4e", + "--xctest" + ], + "isolate_name": "url_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "url_unittests_iPhone 6s 13.6", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12d4e", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_13_6", + "path": "Runtime-ios-13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://url:url_unittests/" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", "14.4", "--out-dir", "${ISOLATED_OUTDIR}", @@ -17656,11 +20569,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "absl_hardening_tests", @@ -17668,7 +20581,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests_iPhone 6s 13.6", + "name": "absl_hardening_tests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -17689,12 +20602,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -17706,11 +20619,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "boringssl_crypto_tests", @@ -17718,7 +20631,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests_iPhone 6s 13.6", + "name": "boringssl_crypto_tests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -17739,12 +20652,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -17756,11 +20669,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "boringssl_ssl_tests", @@ -17768,7 +20681,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests_iPhone 6s 13.6", + "name": "boringssl_ssl_tests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -17789,12 +20702,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -17806,11 +20719,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "crypto_unittests", @@ -17818,7 +20731,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests_iPhone 6s 13.6", + "name": "crypto_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -17839,12 +20752,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -17856,11 +20769,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "google_apis_unittests", @@ -17868,7 +20781,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests_iPhone 6s 13.6", + "name": "google_apis_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -17889,12 +20802,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -17906,11 +20819,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -17919,7 +20832,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -17940,12 +20853,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -17957,11 +20870,11 @@ "--platform", "iPad Air 2", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -17970,7 +20883,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 13.6", + "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.0", "resultdb": { "enable": true }, @@ -17991,12 +20904,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18009,11 +20922,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18022,7 +20935,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18043,12 +20956,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18061,11 +20974,11 @@ "--platform", "iPhone 6s Plus", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18074,7 +20987,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPhone 6s Plus 13.6", + "name": "ios_chrome_integration_eg2tests_module_iPhone 6s Plus 15.0", "resultdb": { "enable": true }, @@ -18095,12 +21008,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18113,11 +21026,11 @@ "--platform", "iPhone SE (1st generation)", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18126,7 +21039,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPhone SE (1st generation) 13.6", + "name": "ios_chrome_integration_eg2tests_module_iPhone SE (1st generation) 15.0", "resultdb": { "enable": true }, @@ -18147,12 +21060,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18165,11 +21078,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18178,7 +21091,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_settings_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18199,12 +21112,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18217,11 +21130,11 @@ "--platform", "iPad Air 2", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18230,7 +21143,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 13.6", + "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.0", "resultdb": { "enable": true }, @@ -18251,12 +21164,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18268,11 +21181,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18281,7 +21194,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18302,12 +21215,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18319,11 +21232,11 @@ "--platform", "iPhone 6s Plus", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18332,7 +21245,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPhone 6s Plus 13.6", + "name": "ios_chrome_signin_eg2tests_module_iPhone 6s Plus 15.0", "resultdb": { "enable": true }, @@ -18353,12 +21266,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18370,11 +21283,11 @@ "--platform", "iPhone SE (1st generation)", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18383,7 +21296,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPhone SE (1st generation) 13.6", + "name": "ios_chrome_signin_eg2tests_module_iPhone SE (1st generation) 15.0", "resultdb": { "enable": true }, @@ -18404,12 +21317,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18421,11 +21334,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18434,7 +21347,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_smoke_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18455,12 +21368,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18472,11 +21385,11 @@ "--platform", "iPad Air 2", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18485,7 +21398,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 13.6", + "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.0", "resultdb": { "enable": true }, @@ -18506,12 +21419,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18524,11 +21437,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18537,7 +21450,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18558,12 +21471,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18576,11 +21489,11 @@ "--platform", "iPhone 6s Plus", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18589,7 +21502,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPhone 6s Plus 13.6", + "name": "ios_chrome_ui_eg2tests_module_iPhone 6s Plus 15.0", "resultdb": { "enable": true }, @@ -18610,12 +21523,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18628,11 +21541,11 @@ "--platform", "iPhone SE (1st generation)", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18641,7 +21554,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPhone SE (1st generation) 13.6", + "name": "ios_chrome_ui_eg2tests_module_iPhone SE (1st generation) 15.0", "resultdb": { "enable": true }, @@ -18662,12 +21575,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -18680,11 +21593,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18693,7 +21606,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPhone 6s 13.6", + "name": "ios_chrome_web_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18714,12 +21627,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18731,11 +21644,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "ios_components_unittests", @@ -18743,7 +21656,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests_iPhone 6s 13.6", + "name": "ios_components_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18764,12 +21677,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18781,11 +21694,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "ios_net_unittests", @@ -18793,7 +21706,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests_iPhone 6s 13.6", + "name": "ios_net_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18814,12 +21727,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18831,11 +21744,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "ios_remoting_unittests", @@ -18843,7 +21756,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests_iPhone 6s 13.6", + "name": "ios_remoting_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18864,12 +21777,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18881,11 +21794,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18894,7 +21807,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPhone 6s 13.6", + "name": "ios_showcase_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18915,12 +21828,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18932,11 +21845,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "ios_testing_unittests", @@ -18944,7 +21857,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests_iPhone 6s 13.6", + "name": "ios_testing_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -18965,12 +21878,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -18982,11 +21895,11 @@ "--platform", "iPad Air 2", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -18995,7 +21908,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPad Air 2 13.6", + "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.0", "resultdb": { "enable": true }, @@ -19016,12 +21929,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19033,11 +21946,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -19046,7 +21959,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPhone 6s 13.6", + "name": "ios_web_shell_eg2tests_module_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -19067,12 +21980,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19084,11 +21997,11 @@ "--platform", "iPhone 6s Plus", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -19097,7 +22010,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPhone 6s Plus 13.6", + "name": "ios_web_shell_eg2tests_module_iPhone 6s Plus 15.0", "resultdb": { "enable": true }, @@ -19118,12 +22031,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19135,11 +22048,11 @@ "--platform", "iPhone SE (1st generation)", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest", "--xcode-parallelization" ], @@ -19148,7 +22061,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPhone SE (1st generation) 13.6", + "name": "ios_web_shell_eg2tests_module_iPhone SE (1st generation) 15.0", "resultdb": { "enable": true }, @@ -19169,12 +22082,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19186,11 +22099,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "net_unittests", @@ -19198,7 +22111,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests_iPhone 6s 13.6", + "name": "net_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -19219,12 +22132,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19236,11 +22149,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "services_unittests", @@ -19248,7 +22161,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests_iPhone 6s 13.6", + "name": "services_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -19269,12 +22182,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19286,11 +22199,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "sql_unittests", @@ -19298,7 +22211,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests_iPhone 6s 13.6", + "name": "sql_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -19319,12 +22232,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -19336,11 +22249,11 @@ "--platform", "iPhone 6s", "--version", - "13.6", + "15.0", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12d4e", + "13a5155e", "--xctest" ], "isolate_name": "url_unittests", @@ -19348,7 +22261,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests_iPhone 6s 13.6", + "name": "url_unittests_iPhone 6s 15.0", "resultdb": { "enable": true }, @@ -19369,12 +22282,12 @@ ], "named_caches": [ { - "name": "xcode_ios_12d4e", + "name": "xcode_ios_13a5155e", "path": "Xcode.app" }, { - "name": "runtime_ios_13_6", - "path": "Runtime-ios-13.6" + "name": "runtime_ios_15_0", + "path": "Runtime-ios-15.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 49c4af3..4133489c 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -7140,29 +7140,25 @@ } }, - # This test suite takes the standard ios test suites, - # and removes failing ones from ios14-sdk-simulator. - # The result is test suites with certain tests removed, - # identified by *_noncq. 'ios_simulator_noncq_tests': { 'ios_common_tests': { 'variants': [ - 'SIM_IPHONE_6S_13_6', + 'SIM_IPHONE_6S_15_0', ] }, 'ios_eg2_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_6S_13_6', + 'SIM_IPHONE_6S_15_0', ] }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_6S_PLUS_13_6', - 'SIM_IPHONE_6S_13_6', - 'SIM_IPHONE_SE_1ST_GEN_13_6', - 'SIM_IPAD_AIR_2_13_6', + 'SIM_IPHONE_6S_PLUS_15_0', + 'SIM_IPHONE_6S_15_0', + 'SIM_IPHONE_SE_1ST_GEN_15_0', + 'SIM_IPAD_AIR_2_15_0', ] }, }, @@ -7172,16 +7168,22 @@ 'ios_common_tests': { 'variants': [ 'SIM_IPHONE_6S_14_4', + 'SIM_IPHONE_6S_13_6', ] }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ 'SIM_IPHONE_6S_14_4', + 'SIM_IPHONE_6S_13_6', ] }, 'ios_screen_size_dependent_tests': { 'variants': [ + 'SIM_IPHONE_6S_PLUS_13_6', + 'SIM_IPHONE_6S_13_6', + 'SIM_IPHONE_SE_1ST_GEN_13_6', + 'SIM_IPAD_AIR_2_13_6', 'SIM_IPHONE_6S_PLUS_14_4', 'SIM_IPHONE_6S_14_4', 'SIM_IPHONE_SE_1ST_GEN_14_4',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index ffb3024c..ba927d7 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1874,7 +1874,6 @@ ], }, 'ToTWin': { - 'mixins': ['chrome-tester-service-account'], 'test_suites': { 'gtest_tests': 'chromium_win_gtests', 'isolated_scripts': 'win_specific_isolated_scripts_and_sizes', @@ -5112,7 +5111,7 @@ 'mac_11_x64', 'mac_toolchain', 'out_dir_arg', - 'xcode_12d4e', + 'xcode_13_latest_beta', 'xctest', ], 'test_suites': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 7b9b0e9..2e44f9a 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -6108,6 +6108,25 @@ ] } ], + "PartitionAllocPCScanBrowserOnly": [ + { + "platforms": [ + "android", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PartitionAllocPCScanBrowserOnly" + ], + "disable_features": [ + "PartitionAllocPCScanImmediateFreeing" + ] + } + ] + } + ], "PartitionConnectionsByNetworkIsolationKey": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 65b8e71..b2ef916 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -239,11 +239,11 @@ // The feature is still used by virtual test suites exercising Plan B. const base::Feature kRTCUnifiedPlanByDefault{"RTCUnifiedPlanByDefault", base::FEATURE_ENABLED_BY_DEFAULT}; -// Prevents throwing an exception when the RTCPeerConnection is constructed with -// {sdpSemantics:"plan-b"} and the Deprecation Trial is not enabled. May be used -// as a kill-switch if necessary. -const base::Feature kRTCAllowPlanBOutsideDeprecationTrial{ - "RTCAllowPlanBOutsideDeprecationTrial", base::FEATURE_DISABLED_BY_DEFAULT}; +// When enabled, throw an exception when an RTCPeerConnection is constructed +// with {sdpSemantics:"plan-b"} and the Deprecation Trial is not enabled. +const base::Feature kRTCDisallowPlanBOutsideDeprecationTrial{ + "RTCDisallowPlanBOutsideDeprecationTrial", + base::FEATURE_DISABLED_BY_DEFAULT}; // Determines if the SDP attrbute extmap-allow-mixed should be offered by // default or not. The default value can be overridden by passing
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 73c6b7ee..2be1493 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -78,7 +78,7 @@ kRTCGetCurrentBrowsingContextMedia; BLINK_COMMON_EXPORT extern const base::Feature kRTCUnifiedPlanByDefault; BLINK_COMMON_EXPORT extern const base::Feature - kRTCAllowPlanBOutsideDeprecationTrial; + kRTCDisallowPlanBOutsideDeprecationTrial; BLINK_COMMON_EXPORT extern const base::Feature kRTCOfferExtmapAllowMixed; BLINK_COMMON_EXPORT extern const base::Feature kRTCGpuCodecSupportWaiter; BLINK_COMMON_EXPORT extern const base::FeatureParam<int>
diff --git a/third_party/blink/public/common/sms/webotp_service_outcome.h b/third_party/blink/public/common/sms/webotp_service_outcome.h index d9effc3..7912094dc 100644 --- a/third_party/blink/public/common/sms/webotp_service_outcome.h +++ b/third_party/blink/public/common/sms/webotp_service_outcome.h
@@ -19,7 +19,8 @@ kTimeout = 5, kUserCancelled = 6, kBackendNotAvailable = 7, - kMaxValue = kBackendNotAvailable + kCrossDeviceFailure = 8, + kMaxValue = kCrossDeviceFailure }; } // namespace blink
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index aff303c..976f062 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -6223,6 +6223,8 @@ optional FlexItemHighlightConfig flexItemHighlightConfig # The contrast algorithm to use for the contrast ratio (default: aa). optional ContrastAlgorithm contrastAlgorithm + # The container query container highlight configuration (default: all transparent). + optional ContainerQueryContainerHighlightConfig containerQueryContainerHighlightConfig type ColorFormat extends string enum @@ -6273,6 +6275,18 @@ # The content box highlight outline color (default: transparent). optional DOM.RGBA outlineColor + type ContainerQueryHighlightConfig extends object + properties + # A descriptor for the highlight appearance of container query containers. + ContainerQueryContainerHighlightConfig containerQueryContainerHighlightConfig + # Identifier of the container node to highlight. + DOM.NodeId nodeId + + type ContainerQueryContainerHighlightConfig extends object + properties + # The style of the container border + optional LineStyle containerBorder + type InspectMode extends string enum searchForNode @@ -6438,6 +6452,11 @@ # An array of node identifiers and descriptors for the highlight appearance. array of ScrollSnapHighlightConfig scrollSnapHighlightConfigs + command setShowContainerQueryOverlays + parameters + # An array of node identifiers and descriptors for the highlight appearance. + array of ContainerQueryHighlightConfig containerQueryHighlightConfigs + # Requests that backend shows paint rectangles command setShowPaintRects parameters
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index b4857d8..f2583d5 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -186,6 +186,7 @@ "speech/speech_recognizer.mojom", "speech/speech_synthesis.mojom", "storage_access/storage_access_automation.mojom", + "storage_key/storage_key.mojom", "timing/performance_mark_or_measure.mojom", "timing/resource_timing.mojom", "timing/worker_timing_container.mojom", @@ -817,6 +818,15 @@ "//device/fido", ] }, + { + types = [ + { + mojom = "blink.mojom.StorageKey" + cpp = "::blink::StorageKey" + }, + ] + traits_headers = [ "//third_party/blink/public/common/storage_key/storage_key_mojom_traits.h" ] + }, ] blink_cpp_typemaps = [ @@ -830,6 +840,15 @@ ] traits_headers = [ "//third_party/blink/renderer/platform/blob/serialized_blob_mojom_traits.h" ] }, + { + types = [ + { + mojom = "blink.mojom.StorageKey" + cpp = "::blink::BlinkStorageKey" + }, + ] + traits_headers = [ "//third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h" ] + }, ] export_class_attribute = "BLINK_COMMON_EXPORT" @@ -1047,16 +1066,12 @@ # to a type in renderer/modules. This also means these interfaces are not # available from renderer/platform or renderer/core. mojom("mojom_modules") { - sources = [ - "indexeddb/indexeddb.mojom", - "storage_key/storage_key.mojom", - ] + sources = [ "indexeddb/indexeddb.mojom" ] public_deps = [ ":android_mojo_bindings", ":mojom_core", "//mojo/public/mojom/base", - "//url/mojom:url_mojom_origin", ] overridden_deps_blink = [ @@ -1125,17 +1140,6 @@ ] traits_deps = [ "//third_party/blink/renderer/platform/wtf" ] }, - { - types = [ - { - mojom = "blink.mojom.StorageKey" - cpp = "::blink::BlinkStorageKey" - }, - ] - traits_headers = [ "//third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.h" ] - traits_public_deps = - [ "//third_party/blink/renderer/modules/storage:blink_storage_key" ] - }, ] cpp_typemaps = [ @@ -1185,15 +1189,6 @@ ] traits_private_headers = [ "//third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h" ] }, - { - types = [ - { - mojom = "blink.mojom.StorageKey" - cpp = "::blink::StorageKey" - }, - ] - traits_headers = [ "//third_party/blink/public/common/storage_key/storage_key_mojom_traits.h" ] - }, ] }
diff --git a/third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom b/third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom index 020af0f..db9f4f0 100644 --- a/third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom +++ b/third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom
@@ -13,6 +13,18 @@ import "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom"; import "third_party/blink/public/mojom/permissions/permission_status.mojom"; +// Representation of a file for an AccessHandle. +// `regular_file` is an OS-level file which provides direct read/write access. +// 'incognito_file_delegate' is used only in Incognito mode. It routes all file +// operations to the browser. +union FileSystemAccessAccessHandleFile { + mojo_base.mojom.File regular_file; + pending_remote<FileSystemAccessFileDelegateHost> incognito_file_delegate; +}; + +// TODO(crbug.com/1225653): Implement this. +interface FileSystemAccessFileDelegateHost {}; + // This interface represents a handle to a directory in the File System Access // API. interface FileSystemAccessFileHandle { @@ -36,8 +48,8 @@ // TODO(fivedots): Change the return type to a host object once the access // handle locking implementation is clearer. - // Returns an OS-level file. The file provides direct read/write access. - OpenAccessHandle() => (FileSystemAccessError result, mojo_base.mojom.File? file); + // Returns a file object which can be used initiate file operations from the renderer. + OpenAccessHandle() => (FileSystemAccessError result, FileSystemAccessAccessHandleFile? file); // Returns true if |other| represents the same file on disk as this handle. IsSameEntry(pending_remote<FileSystemAccessTransferToken> other) =>
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index c3f3b8b..350d0cf7 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3263,6 +3263,8 @@ kRTCPeerConnectionWithBlockingCsp = 3948, kSanitizerAPISanitizeFor = 3949, kSanitizerAPIElementSetSanitized = 3950, + kTextShadowInHighlightPseudo = 3951, + kTextShadowNotNoneInHighlightPseudo = 3952, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h index b8e40bd2..f94e5bcd 100644 --- a/third_party/blink/public/platform/web_runtime_features.h +++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -175,6 +175,7 @@ EnableWebBluetoothRemoteCharacteristicNewWriteValue(bool); BLINK_PLATFORM_EXPORT static void EnableWebBluetoothManufacturerDataFilter( bool); + BLINK_PLATFORM_EXPORT static void EnableWebGLDeveloperExtensions(bool); BLINK_PLATFORM_EXPORT static void EnableWebGLDraftExtensions(bool); BLINK_PLATFORM_EXPORT static void EnableWebGLImageChromium(bool); BLINK_PLATFORM_EXPORT static void EnableWebGPU(bool);
diff --git a/third_party/blink/renderer/bindings/BUILD.gn b/third_party/blink/renderer/bindings/BUILD.gn index cd7db8d..3001757 100644 --- a/third_party/blink/renderer/bindings/BUILD.gn +++ b/third_party/blink/renderer/bindings/BUILD.gn
@@ -15,6 +15,8 @@ visibility = [ "//third_party/blink/renderer/*" ] +bindings_gen_dir = get_path_info(".", "gen_dir") + template("collect_idl_files") { action_with_pydeps(target_name) { script = "${bindings_scripts_dir}/collect_idl_files.py" @@ -47,7 +49,7 @@ inputs = static_idl_files_in_core - output = "${bindings_output_dir}/web_idl_in_core.pickle" + output = "${bindings_gen_dir}/web_idl_in_core.pickle" } collect_idl_files("web_idl_in_core_for_testing") { @@ -66,7 +68,7 @@ "//third_party/blink/renderer/core:generated_testing_idls_settings", ] - output = "${bindings_output_dir}/web_idl_in_core_for_testing.pickle" + output = "${bindings_gen_dir}/web_idl_in_core_for_testing.pickle" } collect_idl_files("web_idl_in_extensions_chromeos") { @@ -74,7 +76,7 @@ inputs = static_idl_files_in_extensions_chromeos - output = "${bindings_output_dir}/web_idl_in_extensions_chromeos.pickle" + output = "${bindings_gen_dir}/web_idl_in_extensions_chromeos.pickle" } collect_idl_files("web_idl_in_modules") { @@ -82,7 +84,7 @@ inputs = static_idl_files_in_modules - output = "${bindings_output_dir}/web_idl_in_modules.pickle" + output = "${bindings_gen_dir}/web_idl_in_modules.pickle" } collect_idl_files("web_idl_in_modules_for_testing") { @@ -91,7 +93,7 @@ inputs = static_idl_files_in_modules_for_testing - output = "${bindings_output_dir}/web_idl_in_modules_for_testing.pickle" + output = "${bindings_gen_dir}/web_idl_in_modules_for_testing.pickle" } action_with_pydeps("web_idl_database") { @@ -153,16 +155,15 @@ "--root_gen_dir", rebase_path(root_gen_dir, root_build_dir), "--output_reldir", - "core=" + rebase_path("${bindings_output_dir}/core/v8/", root_gen_dir), + "core=" + rebase_path("${bindings_gen_dir}/core/v8/", root_gen_dir), "--output_reldir", - "modules=" + - rebase_path("${bindings_output_dir}/modules/v8/", root_gen_dir), + "modules=" + rebase_path("${bindings_gen_dir}/modules/v8/", root_gen_dir), ] if (use_blink_extensions_chromeos) { args += [ "--output_reldir", "extensions_chromeos=" + - rebase_path("${bindings_output_dir}/extensions_chromeos/v8/", + rebase_path("${bindings_gen_dir}/extensions_chromeos/v8/", root_gen_dir), ] } @@ -182,35 +183,27 @@ outputs = generated_enumeration_sources_in_core + generated_enumeration_sources_in_modules + generated_enumeration_sources_for_testing_in_core - if (use_blink_v8_binding_new_idl_callback_function) { - targets += [ "callback_function" ] - outputs += generated_callback_function_sources_in_core + - generated_callback_function_sources_in_modules + - generated_callback_function_sources_for_testing_in_core - } - if (use_blink_v8_binding_new_idl_callback_interface) { - targets += [ "callback_interface" ] - outputs += generated_callback_interface_sources_in_core + - generated_callback_interface_sources_in_modules - } - if (use_blink_v8_binding_new_idl_dictionary) { - targets += [ "dictionary" ] - outputs += generated_dictionary_sources_in_core + - generated_dictionary_sources_in_modules + - generated_dictionary_sources_for_testing_in_core - } - if (use_blink_v8_binding_new_idl_interface) { - targets += [ "interface" ] - outputs += generated_interface_sources_in_core + - generated_interface_sources_in_modules + - generated_interface_sources_for_testing_in_core + - generated_interface_sources_for_testing_in_modules - targets += [ "namespace" ] - outputs += generated_namespace_sources_in_core + - generated_namespace_sources_in_modules - if (use_blink_extensions_chromeos) { - outputs += generated_namespace_sources_in_extensions_chromeos - } + targets += [ "callback_function" ] + outputs += generated_callback_function_sources_in_core + + generated_callback_function_sources_in_modules + + generated_callback_function_sources_for_testing_in_core + targets += [ "callback_interface" ] + outputs += generated_callback_interface_sources_in_core + + generated_callback_interface_sources_in_modules + targets += [ "dictionary" ] + outputs += generated_dictionary_sources_in_core + + generated_dictionary_sources_in_modules + + generated_dictionary_sources_for_testing_in_core + targets += [ "interface" ] + outputs += generated_interface_sources_in_core + + generated_interface_sources_in_modules + + generated_interface_sources_for_testing_in_core + + generated_interface_sources_for_testing_in_modules + targets += [ "namespace" ] + outputs += generated_namespace_sources_in_core + + generated_namespace_sources_in_modules + if (use_blink_extensions_chromeos) { + outputs += generated_namespace_sources_in_extensions_chromeos } targets += [ "typedef" ] outputs += @@ -227,8 +220,7 @@ web_idl_database_outputs = get_target_outputs(":web_idl_database") web_idl_database = web_idl_database_outputs[0] idl_syntax_known_issues = "idl_syntax_known_issues.txt" - validate_web_idl_result = - "${bindings_output_dir}/validate_web_idl_results.txt" + validate_web_idl_result = "${bindings_gen_dir}/validate_web_idl_results.txt" inputs = [ web_idl_database,
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni index 0e366811..240500b 100644 --- a/third_party/blink/renderer/bindings/bindings.gni +++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -2,12 +2,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# All paths in this file should be absolute so it can be imported into -# different contexts. +# The database file produced by +# "//third_party/blink/renderer/bindings:web_idl_database". +web_idl_database_filepath = + get_path_info(".", "gen_dir") + "/web_idl_database.pickle" -import("//third_party/blink/renderer/bindings/modules/v8/v8.gni") - -bindings_core_v8_files = +# Source files to be part of +# "//third_party/blink/renderer/core:core". +blink_core_sources_bindings = get_path_info([ "core/v8/active_script_wrappable.cc", "core/v8/active_script_wrappable.h", @@ -173,14 +175,29 @@ ], "abspath") -bindings_dir = get_path_info(".", "abspath") -blink_output_dir = "$root_gen_dir/third_party/blink/renderer" -bindings_output_dir = "$root_gen_dir/third_party/blink/renderer/bindings" -bindings_core_v8_output_dir = "$bindings_output_dir/core/v8" -web_idl_database_filepath = "${bindings_output_dir}/web_idl_database.pickle" +# Source files to be part of +# "//third_party/blink/renderer/modules:modules". +blink_modules_sources_bindings = get_path_info( + [ + "modules/v8/module_bindings_initializer.cc", + "modules/v8/module_bindings_initializer.h", + "modules/v8/serialization/serialized_script_value_for_modules_factory.cc", + "modules/v8/serialization/serialized_script_value_for_modules_factory.h", + "modules/v8/serialization/v8_script_value_deserializer_for_modules.cc", + "modules/v8/serialization/v8_script_value_deserializer_for_modules.h", + "modules/v8/serialization/v8_script_value_serializer_for_modules.cc", + "modules/v8/serialization/v8_script_value_serializer_for_modules.h", + "modules/v8/to_v8_for_modules.h", + "modules/v8/v8_binding_for_modules.cc", + "modules/v8/v8_binding_for_modules.h", + "modules/v8/v8_context_snapshot_impl.cc", + "modules/v8/v8_context_snapshot_impl.h", + "modules/v8/webgl_any.cc", + "modules/v8/webgl_any.h", + ], + "abspath") -bindings_unittest_files = - get_path_info( +bindings_unittest_files = get_path_info( [ "core/v8/activity_logger_test.cc", "core/v8/binding_security_test.cc", @@ -214,6 +231,7 @@ "core/v8/v8_extras_test_utils.h", "core/v8/script_promise_tester.cc", "core/v8/script_promise_tester.h", + "modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc", + "modules/v8/v8_binding_for_modules_test.cc", ], "abspath") -bindings_unittest_files += bindings_modules_v8_unittest_files
diff --git a/third_party/blink/renderer/bindings/modules/v8/custom/custom.gni b/third_party/blink/renderer/bindings/modules/v8/custom/custom.gni deleted file mode 100644 index 2b8700c..0000000 --- a/third_party/blink/renderer/bindings/modules/v8/custom/custom.gni +++ /dev/null
@@ -1,6 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Make the files absolute so they can be imported to anywhere. -bindings_modules_v8_custom_files = get_path_info([], "abspath")
diff --git a/third_party/blink/renderer/bindings/modules/v8/v8.gni b/third_party/blink/renderer/bindings/modules/v8/v8.gni deleted file mode 100644 index fd32e66..0000000 --- a/third_party/blink/renderer/bindings/modules/v8/v8.gni +++ /dev/null
@@ -1,36 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/blink/renderer/config.gni") -import("custom/custom.gni") - -# Make the files absolute so they can be imported to anywhere. -bindings_modules_v8_files = - get_path_info( - [ - "module_bindings_initializer.cc", - "module_bindings_initializer.h", - "serialization/serialized_script_value_for_modules_factory.cc", - "serialization/serialized_script_value_for_modules_factory.h", - "serialization/v8_script_value_deserializer_for_modules.cc", - "serialization/v8_script_value_deserializer_for_modules.h", - "serialization/v8_script_value_serializer_for_modules.cc", - "serialization/v8_script_value_serializer_for_modules.h", - "to_v8_for_modules.h", - "v8_binding_for_modules.cc", - "v8_binding_for_modules.h", - "v8_context_snapshot_impl.cc", - "v8_context_snapshot_impl.h", - "webgl_any.cc", - "webgl_any.h", - ], - "abspath") + bindings_modules_v8_custom_files - -bindings_modules_v8_unittest_files = - get_path_info( - [ - "serialization/v8_script_value_serializer_for_modules_test.cc", - "v8_binding_for_modules_test.cc", - ], - "abspath")
diff --git a/third_party/blink/renderer/bindings/scripts/aggregate_generated_bindings.py b/third_party/blink/renderer/bindings/scripts/aggregate_generated_bindings.py deleted file mode 100755 index c1d66c0..0000000 --- a/third_party/blink/renderer/bindings/scripts/aggregate_generated_bindings.py +++ /dev/null
@@ -1,136 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2009 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Copyright (c) 2009 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. -"""Generates a .cpp file that includes all V8 binding .cpp files for interfaces. - -It is expected to preserve symbol space, and to be acceptable to make static -build on Windows. - -Usage: - $ aggregate_generated_bindings.py --component COMPONENT IDL_FILES_LIST OUTPUT_FILE - - COMPONENT is the relative directory of a component, e.g., 'core', 'modules'. - IDL_FILES_LIST is a text file containing the IDL file paths - OUTPUT_FILE is the filename of output file. - - Design doc: http://www.chromium.org/developers/design-documents/idl-build -""" - -from __future__ import print_function - -import errno -import optparse -import os -import re -import sys -from utilities import idl_filename_to_basename -from utilities import read_idl_files_list_from_file -from utilities import to_snake_case - -COPYRIGHT_TEMPLATE = """/* - * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT. - * - * This file was generated by the aggregate_generated_bindings.py script. - * - * Copyright (C) 2009 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -""" - - -def parse_options(): - parser = optparse.OptionParser() - parser.add_option('--component') - - options, args = parser.parse_args() - if len(args) < 2: - raise Exception( - 'Expected 2 filenames; one is for input, and the other is for output.' - ) - - return options, args - - -def generate_content(component, basenames): - # Add fixed content. - output = [COPYRIGHT_TEMPLATE, '#define NO_IMPLICIT_ATOMICSTRING\n\n'] - - basenames.sort() - output.extend( - '#include "third_party/blink/renderer/bindings/%s/v8/v8_%s.cc"\n' % - (component, to_snake_case(basename)) for basename in basenames) - return ''.join(output) - - -def write_content(content, output_file_name): - parent_path, file_name = os.path.split(output_file_name) - if not os.path.exists(parent_path): - print('Creating directory: %s' % parent_path) - os.makedirs(parent_path) - with open(output_file_name, 'w') as f: - f.write(content) - - -def main(): - options, filenames = parse_options() - component = options.component - idl_filenames = read_idl_files_list_from_file(filenames[0]) - basenames = [ - idl_filename_to_basename(file_path) for file_path in idl_filenames - ] - file_contents = generate_content(component, basenames) - write_content(file_contents, filenames[1]) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/code_generator.py b/third_party/blink/renderer/bindings/scripts/code_generator.py deleted file mode 100644 index 86e651da..0000000 --- a/third_party/blink/renderer/bindings/scripts/code_generator.py +++ /dev/null
@@ -1,265 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=import-error,print-statement,relative-import -"""Plumbing for a Jinja-based code generator, including CodeGeneratorBase, a base class for all generators.""" - -from __future__ import print_function - -import os -import posixpath -import re -import sys - -from idl_types import set_ancestors, IdlType -from itertools import groupby -from v8_globals import includes -from v8_interface import constant_filters -from v8_types import set_component_dirs -from v8_methods import method_filters -from v8_utilities import capitalize -from utilities import (idl_filename_to_component, - is_valid_component_dependency, format_remove_duplicates, - format_blink_cpp_source_code, to_snake_case, - normalize_path) -import v8_utilities - -# Path handling for libraries and templates -# Paths have to be normalized because Jinja uses the exact template path to -# determine the hash used in the cache filename, and we need a pre-caching step -# to be concurrency-safe. Use absolute path because __file__ is absolute if -# module is imported, and relative if executed directly. -# If paths differ between pre-caching and individual file compilation, the cache -# is regenerated, which causes a race condition and breaks concurrent build, -# since some compile processes will try to read the partially written cache. -MODULE_PATH, _ = os.path.split(os.path.realpath(__file__)) -THIRD_PARTY_DIR = os.path.normpath( - os.path.join(MODULE_PATH, os.pardir, os.pardir, os.pardir, os.pardir)) -TEMPLATES_DIR = os.path.normpath( - os.path.join(MODULE_PATH, os.pardir, 'templates')) - -# jinja2 is in chromium's third_party directory. -# Insert at 1 so at front to override system libraries, and -# after path[0] == invoking script dir -sys.path.insert(1, THIRD_PARTY_DIR) -import jinja2 -from jinja2.filters import make_attrgetter, environmentfilter - - -def generate_indented_conditional(code, conditional): - # Indent if statement to level of original code - indent = re.match(' *', code).group(0) - return ('%sif (%s) {\n' % (indent, conditional) + - ' %s\n' % '\n '.join(code.splitlines()) + '%s}\n' % indent) - - -# [Exposed] -def exposed_if(code, exposed_test): - if not exposed_test: - return code - return generate_indented_conditional( - code, 'execution_context && (%s)' % exposed_test) - - -# [CrossOriginIsolated] -def cross_origin_isolated_if(code, cross_origin_isolated_test): - if not cross_origin_isolated_test: - return code - return generate_indented_conditional( - code, 'execution_context && (%s)' % cross_origin_isolated_test) - - -# [DirectSocketEnabled] -def direct_socket_enabled_if(code, direct_socket_enabled_test): - if not direct_socket_enabled_test: - return code - return generate_indented_conditional( - code, 'execution_context && (%s)' % direct_socket_enabled_test) - - -# [SecureContext] -def secure_context_if(code, secure_context_test): - if secure_context_test is None: - return code - return generate_indented_conditional(code, secure_context_test) - - -# [RuntimeEnabled] -def origin_trial_enabled_if(code, - origin_trial_feature_name, - execution_context=None): - if not origin_trial_feature_name: - return code - - function = v8_utilities.origin_trial_function_call( - origin_trial_feature_name, execution_context) - return generate_indented_conditional(code, function) - - -# [RuntimeEnabled] -def runtime_enabled_if(code, name): - if not name: - return code - - function = v8_utilities.runtime_enabled_function(name) - return generate_indented_conditional(code, function) - - -@environmentfilter -def do_stringify_key_group_by(environment, value, attribute): - expr = make_attrgetter(environment, attribute) - key = lambda item: '' if expr(item) is None else str(expr(item)) - return groupby(sorted(value, key=key), expr) - - -def initialize_jinja_env(cache_dir): - jinja_env = jinja2.Environment( - loader=jinja2.FileSystemLoader(TEMPLATES_DIR), - # Bytecode cache is not concurrency-safe unless pre-cached: - # if pre-cached this is read-only, but writing creates a race condition. - bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir), - keep_trailing_newline=True, # newline-terminate generated files - lstrip_blocks=True, # so can indent control flow tags - trim_blocks=True) - jinja_env.filters.update({ - 'blink_capitalize': capitalize, - 'exposed': exposed_if, - 'format_blink_cpp_source_code': format_blink_cpp_source_code, - 'format_remove_duplicates': format_remove_duplicates, - 'origin_trial_enabled': origin_trial_enabled_if, - 'runtime_enabled': runtime_enabled_if, - 'runtime_enabled_function': v8_utilities.runtime_enabled_function, - 'cross_origin_isolated': cross_origin_isolated_if, - 'direct_socket_enabled': direct_socket_enabled_if, - 'secure_context': secure_context_if - }) - jinja_env.filters.update(constant_filters()) - jinja_env.filters.update(method_filters()) - jinja_env.filters["stringifykeygroupby"] = do_stringify_key_group_by - return jinja_env - - -_BLINK_RELATIVE_PATH_PREFIXES = ('bindings/', 'core/', 'modules/', 'platform/') - - -def normalize_and_sort_includes(include_paths): - normalized_include_paths = set() - for include_path in include_paths: - match = re.search(r'/gen/(third_party/blink/.*)$', - posixpath.abspath(include_path)) - if match: - include_path = match.group(1) - elif include_path.startswith(_BLINK_RELATIVE_PATH_PREFIXES): - include_path = 'third_party/blink/renderer/' + include_path - normalized_include_paths.add(include_path) - return sorted(normalized_include_paths) - - -def render_template(template, context): - filename = str(template.filename) - filename = filename[filename.rfind('third_party'):] - filename = normalize_path(filename) - - context['jinja_template_filename'] = filename - return template.render(context) - - -class CodeGeneratorBase(object): - """Base class for jinja-powered jinja template generation. - """ - - def __init__(self, generator_name, info_provider, cache_dir, output_dir): - self.generator_name = generator_name - self.info_provider = info_provider - self.jinja_env = initialize_jinja_env(cache_dir) - self.output_dir = output_dir - self.set_global_type_info() - - def should_generate_code(self, definitions): - return definitions.interfaces or definitions.dictionaries - - def set_global_type_info(self): - interfaces_info = self.info_provider.interfaces_info - set_ancestors(interfaces_info['ancestors']) - IdlType.set_callback_interfaces(interfaces_info['callback_interfaces']) - IdlType.set_dictionaries(interfaces_info['dictionaries']) - IdlType.set_enums(self.info_provider.enumerations) - IdlType.set_callback_functions(self.info_provider.callback_functions) - IdlType.set_implemented_as_interfaces( - interfaces_info['implemented_as_interfaces']) - IdlType.set_garbage_collected_types( - interfaces_info['garbage_collected_interfaces']) - IdlType.set_garbage_collected_types(interfaces_info['dictionaries']) - set_component_dirs(interfaces_info['component_dirs']) - - def render_templates(self, - include_paths, - header_template, - cpp_template, - context, - component=None): - context['code_generator'] = self.generator_name - - # Add includes for any dependencies - for include_path in include_paths: - if component: - dependency = idl_filename_to_component(include_path) - assert is_valid_component_dependency(component, dependency) - includes.add(include_path) - - context['header_forward_decls'] = sorted( - context.get('header_forward_decls', set())) - - cpp_includes = set(context.get('cpp_includes', [])) - context['cpp_includes'] = normalize_and_sort_includes(cpp_includes - | includes) - context['header_includes'] = normalize_and_sort_includes( - context['header_includes']) - - header_text = render_template(header_template, context) - cpp_text = render_template(cpp_template, context) - return header_text, cpp_text - - def generate_code(self, definitions, definition_name): - """Invokes code generation. The [definitions] argument is a list of definitions, - and the [definition_name] is the name of the definition - """ - # This should be implemented in subclasses. - raise NotImplementedError() - - def normalize_this_header_path(self, header_path): - header_path = normalize_path(header_path) - match = re.search('(third_party/blink/.*)$', header_path) - assert match, 'Unkown style of path to output: ' + header_path - return match.group(1) - - -def main(argv): - # If file itself executed, cache templates - try: - cache_dir = argv[1] - dummy_filename = argv[2] - except IndexError: - print('Usage: %s CACHE_DIR DUMMY_FILENAME' % argv[0]) - return 1 - - # Cache templates - jinja_env = initialize_jinja_env(cache_dir) - template_filenames = [ - filename for filename in os.listdir(TEMPLATES_DIR) - # Skip .svn, directories, etc. - if filename.endswith(('.tmpl', '.txt')) - ] - for template_filename in template_filenames: - jinja_env.get_template(template_filename) - - # Create a dummy file as output for the build system, - # since filenames of individual cache files are unpredictable and opaque - # (they are hashes of the template path, which varies based on environment) - with open(dummy_filename, 'w') as dummy_file: - pass # |open| creates or touches the file - - -if __name__ == '__main__': - sys.exit(main(sys.argv))
diff --git a/third_party/blink/renderer/bindings/scripts/code_generator_v8.py b/third_party/blink/renderer/bindings/scripts/code_generator_v8.py deleted file mode 100644 index f296d48..0000000 --- a/third_party/blink/renderer/bindings/scripts/code_generator_v8.py +++ /dev/null
@@ -1,453 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=import-error,print-statement,relative-import -"""Generate Blink V8 bindings (.h and .cpp files). - -If run itself, caches Jinja templates (and creates dummy file for build, -since cache filenames are unpredictable and opaque). - -This module is *not* concurrency-safe without care: bytecode caching creates -a race condition on cache *write* (crashes if one process tries to read a -partially-written cache). However, if you pre-cache the templates (by running -the module itself), then you can parallelize compiling individual files, since -cache *reading* is safe. - -Input: An object of class IdlDefinitions, containing an IDL interface X -Output: V8X.h and V8X.cpp - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -import os -import posixpath - -from code_generator import CodeGeneratorBase -from idl_definitions import Visitor -from idl_types import IdlType -import v8_callback_function -import v8_callback_interface -import v8_dictionary -from v8_globals import includes -import v8_interface -import v8_types -import v8_union -from v8_utilities import build_basename, cpp_name -from utilities import idl_filename_to_component, is_testing_target, shorten_union_name, to_header_guard, to_snake_case - -# Make sure extension is .py, not .pyc or .pyo, so doesn't depend on caching -MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py' - - -def depending_union_type(idl_type): - """Returns the union type name if the given idl_type depends on a - union type. - """ - - def find_base_type(current_type): - if current_type.is_array_or_sequence_type: - return find_base_type(current_type.element_type) - if current_type.is_record_type: - # IdlRecordType.key_type is always a string type, so we only need - # to looking into value_type. - return find_base_type(current_type.value_type) - if current_type.is_nullable: - return find_base_type(current_type.inner_type) - return current_type - - base_type = find_base_type(idl_type) - if base_type.is_union_type: - return base_type - return None - - -class TypedefResolver(Visitor): - def __init__(self, info_provider): - self.info_provider = info_provider - self.additional_header_includes = set() - self.typedefs = {} - - def resolve(self, definitions, definition_name): - """Traverse definitions and resolves typedefs with the actual types.""" - self.typedefs = {} - for name, typedef in self.info_provider.typedefs.items(): - self.typedefs[name] = typedef.idl_type - self.additional_header_includes = set() - definitions.accept(self) - self._update_dependencies_include_paths(definition_name) - - def _update_dependencies_include_paths(self, definition_name): - if definition_name not in self.info_provider.interfaces_info: - return - interface_info = self.info_provider.interfaces_info[definition_name] - interface_info['additional_header_includes'] = set( - self.additional_header_includes) - - def _resolve_typedefs(self, typed_object): - """Resolve typedefs to actual types in the object.""" - for attribute_name in typed_object.idl_type_attributes: - try: - idl_type = getattr(typed_object, attribute_name) - except AttributeError: - continue - if not idl_type: - continue - resolved_idl_type = idl_type.resolve_typedefs(self.typedefs) - # TODO(bashi): Dependency resolution shouldn't happen here. - # Move this into includes_for_type() families. - union_type = depending_union_type(resolved_idl_type) - if union_type: - self.additional_header_includes.add( - self.info_provider.include_path_for_union_types( - union_type)) - # Need to re-assign the attribute, not just mutate idl_type, since - # type(idl_type) may change. - setattr(typed_object, attribute_name, resolved_idl_type) - - def visit_typed_object(self, typed_object): - self._resolve_typedefs(typed_object) - - -class CodeGeneratorV8Base(CodeGeneratorBase): - """Base class for v8 bindings generator and IDL dictionary impl generator""" - - def __init__(self, info_provider, cache_dir, output_dir): - CodeGeneratorBase.__init__(self, MODULE_PYNAME, info_provider, - cache_dir, output_dir) - self.typedef_resolver = TypedefResolver(info_provider) - - def generate_code(self, definitions, definition_name): - """Returns .h/.cpp code as ((path, content)...).""" - # Set local type info - if not self.should_generate_code(definitions): - return set() - - # Resolve typedefs - self.typedef_resolver.resolve(definitions, definition_name) - return self.generate_code_internal(definitions, definition_name) - - def generate_code_internal(self, definitions, definition_name): - # This should be implemented in subclasses. - raise NotImplementedError() - - def get_output_filename(self, definition_name, ext, prefix=None): - return build_basename(definition_name, prefix=prefix) + ext - - -class CodeGeneratorV8(CodeGeneratorV8Base): - def __init__(self, info_provider, cache_dir, output_dir): - CodeGeneratorV8Base.__init__(self, info_provider, cache_dir, - output_dir) - - def output_paths(self, definition_name): - header_path = posixpath.join( - self.output_dir, - self.get_output_filename(definition_name, '.h', prefix='v8_')) - cpp_path = posixpath.join( - self.output_dir, - self.get_output_filename(definition_name, '.cc', prefix='v8_')) - return header_path, cpp_path - - def generate_code_internal(self, definitions, definition_name): - if definition_name in definitions.interfaces: - return self.generate_interface_code( - definitions, definition_name, - definitions.interfaces[definition_name]) - if definition_name in definitions.dictionaries: - return self.generate_dictionary_code( - definitions, definition_name, - definitions.dictionaries[definition_name]) - raise ValueError('%s is not in IDL definitions' % definition_name) - - def generate_interface_code(self, definitions, interface_name, interface): - interface_info = self.info_provider.interfaces_info[interface_name] - full_path = interface_info.get('full_path') - component = idl_filename_to_component(full_path) - include_paths = interface_info.get('dependencies_include_paths') - - # Select appropriate Jinja template and contents function - if interface.is_callback: - header_template_filename = 'callback_interface.h.tmpl' - cpp_template_filename = 'callback_interface.cc.tmpl' - interface_context = v8_callback_interface.callback_interface_context - elif interface.is_partial: - interface_context = v8_interface.interface_context - header_template_filename = 'partial_interface.h.tmpl' - cpp_template_filename = 'partial_interface.cc.tmpl' - interface_name += 'Partial' - assert component == 'core' - component = 'modules' - include_paths = interface_info.get( - 'dependencies_other_component_include_paths') - else: - header_template_filename = 'interface.h.tmpl' - cpp_template_filename = 'interface.cc.tmpl' - interface_context = v8_interface.interface_context - - component_info = self.info_provider.component_info - template_context = interface_context(interface, definitions.interfaces, - component_info) - includes.update( - interface_info.get('cpp_includes', {}).get(component, set())) - if not interface.is_partial and not is_testing_target(full_path): - template_context['header_includes'].add( - self.info_provider.include_path_for_export) - template_context['exported'] = \ - self.info_provider.specifier_for_export - # Add the include for interface itself - if IdlType(interface_name).is_typed_array: - template_context['header_includes'].add( - 'core/typed_arrays/dom_typed_array.h') - elif interface.is_callback: - pass - else: - template_context['header_includes'].add( - interface_info['include_path']) - template_context['header_includes'].update( - interface_info.get('additional_header_includes', [])) - header_path, cpp_path = self.output_paths(interface_name) - this_include_header_path = self.normalize_this_header_path(header_path) - template_context['this_include_header_path'] = this_include_header_path - template_context['header_guard'] = to_header_guard( - this_include_header_path) - header_template = self.jinja_env.get_template(header_template_filename) - cpp_template = self.jinja_env.get_template(cpp_template_filename) - header_text, cpp_text = self.render_templates( - include_paths, header_template, cpp_template, template_context, - component) - return ( - (header_path, header_text), - (cpp_path, cpp_text), - ) - - def generate_dictionary_code(self, definitions, dictionary_name, - dictionary): - # pylint: disable=unused-argument - interfaces_info = self.info_provider.interfaces_info - header_template = self.jinja_env.get_template('dictionary_v8.h.tmpl') - cpp_template = self.jinja_env.get_template('dictionary_v8.cc.tmpl') - interface_info = interfaces_info[dictionary_name] - component_info = self.info_provider.component_info - template_context = v8_dictionary.dictionary_context( - dictionary, interfaces_info, component_info) - include_paths = interface_info.get('dependencies_include_paths') - # Add the include for interface itself - template_context['header_includes'].add(interface_info['include_path']) - if not is_testing_target(interface_info.get('full_path')): - template_context['header_includes'].add( - self.info_provider.include_path_for_export) - template_context['exported'] = \ - self.info_provider.specifier_for_export - header_path, cpp_path = self.output_paths(dictionary_name) - this_include_header_path = self.normalize_this_header_path(header_path) - template_context['this_include_header_path'] = this_include_header_path - template_context['header_guard'] = to_header_guard( - this_include_header_path) - header_text, cpp_text = self.render_templates( - include_paths, header_template, cpp_template, template_context) - return ( - (header_path, header_text), - (cpp_path, cpp_text), - ) - - -class CodeGeneratorDictionaryImpl(CodeGeneratorV8Base): - def __init__(self, info_provider, cache_dir, output_dir): - CodeGeneratorV8Base.__init__(self, info_provider, cache_dir, - output_dir) - - def output_paths(self, definition_name, interface_info): - output_dir = posixpath.join(self.output_dir, - interface_info['relative_dir']) - header_path = posixpath.join( - output_dir, self.get_output_filename(definition_name, '.h')) - cpp_path = posixpath.join( - output_dir, self.get_output_filename(definition_name, '.cc')) - return header_path, cpp_path - - def generate_code_internal(self, definitions, definition_name): - if not definition_name in definitions.dictionaries: - raise ValueError('%s is not an IDL dictionary' % definition_name) - interfaces_info = self.info_provider.interfaces_info - dictionary = definitions.dictionaries[definition_name] - interface_info = interfaces_info[definition_name] - header_template = self.jinja_env.get_template('dictionary_impl.h.tmpl') - cpp_template = self.jinja_env.get_template('dictionary_impl.cc.tmpl') - template_context = v8_dictionary.dictionary_impl_context( - dictionary, interfaces_info) - include_paths = interface_info.get('dependencies_include_paths') - if not is_testing_target(interface_info.get('full_path')): - template_context['exported'] = \ - self.info_provider.specifier_for_export - template_context['header_includes'].add( - self.info_provider.include_path_for_export) - template_context['header_includes'].update( - interface_info.get('additional_header_includes', [])) - header_path, cpp_path = self.output_paths(definition_name, - interface_info) - this_include_header_path = self.normalize_this_header_path(header_path) - template_context['this_include_header_path'] = this_include_header_path - template_context['header_guard'] = to_header_guard( - this_include_header_path) - header_text, cpp_text = self.render_templates( - include_paths, header_template, cpp_template, template_context) - return ( - (header_path, header_text), - (cpp_path, cpp_text), - ) - - -class CodeGeneratorUnionType(CodeGeneratorBase): - """Generates union type container classes. - This generator is different from CodeGeneratorV8 and - CodeGeneratorDictionaryImpl. It assumes that all union types are already - collected. It doesn't process idl files directly. - """ - - def __init__(self, info_provider, cache_dir, output_dir, target_component): - CodeGeneratorBase.__init__(self, MODULE_PYNAME, info_provider, - cache_dir, output_dir) - self.target_component = target_component - # The code below duplicates parts of TypedefResolver. We do not use it - # directly because IdlUnionType is not a type defined in - # idl_definitions.py. What we do instead is to resolve typedefs in - # _generate_container_code() whenever a new union file is generated. - self.typedefs = {} - for name, typedef in self.info_provider.typedefs.items(): - self.typedefs[name] = typedef.idl_type - - def _generate_container_code(self, union_type): - includes.clear() - union_type = union_type.resolve_typedefs(self.typedefs) - header_template = self.jinja_env.get_template('union_container.h.tmpl') - cpp_template = self.jinja_env.get_template('union_container.cc.tmpl') - template_context = v8_union.container_context(union_type, - self.info_provider) - template_context['header_includes'].append( - self.info_provider.include_path_for_export) - template_context['exported'] = self.info_provider.specifier_for_export - snake_base_name = to_snake_case(shorten_union_name(union_type)) - header_path = posixpath.join(self.output_dir, '%s.h' % snake_base_name) - cpp_path = posixpath.join(self.output_dir, '%s.cc' % snake_base_name) - this_include_header_path = self.normalize_this_header_path(header_path) - template_context['this_include_header_path'] = this_include_header_path - template_context['header_guard'] = to_header_guard( - this_include_header_path) - header_text, cpp_text = self.render_templates( - [], header_template, cpp_template, template_context) - return ( - (header_path, header_text), - (cpp_path, cpp_text), - ) - - def _get_union_types_for_containers(self): - union_types = self.info_provider.union_types - if not union_types: - return None - # For container classes we strip nullable wrappers. For example, - # both (A or B)? and (A? or B) will become AOrB. This should be OK - # because container classes can handle null and it seems that - # distinguishing (A or B)? and (A? or B) doesn't make sense. - container_cpp_types = set() - union_types_for_containers = set() - for union_type in union_types: - cpp_type = union_type.cpp_type - if cpp_type not in container_cpp_types: - union_types_for_containers.add(union_type) - container_cpp_types.add(cpp_type) - return union_types_for_containers - - def generate_code(self): - union_types = self._get_union_types_for_containers() - if not union_types: - return () - outputs = set() - for union_type in union_types: - outputs.update(self._generate_container_code(union_type)) - return outputs - - -class CodeGeneratorCallbackFunction(CodeGeneratorBase): - def __init__(self, info_provider, cache_dir, output_dir, target_component): - CodeGeneratorBase.__init__(self, MODULE_PYNAME, info_provider, - cache_dir, output_dir) - self.target_component = target_component - self.typedef_resolver = TypedefResolver(info_provider) - - def generate_code_internal(self, callback_function, path): - self.typedef_resolver.resolve(callback_function, - callback_function.name) - header_template = self.jinja_env.get_template( - 'callback_function.h.tmpl') - cpp_template = self.jinja_env.get_template('callback_function.cc.tmpl') - template_context = v8_callback_function.callback_function_context( - callback_function) - if not is_testing_target(path): - template_context['exported'] = \ - self.info_provider.specifier_for_export - template_context['header_includes'].append( - self.info_provider.include_path_for_export) - - # TODO(bashi): Dependency resolution shouldn't happen here. - # Move this into includes_for_type() families. - for argument in callback_function.arguments: - if argument.idl_type.is_union_type: - template_context['header_includes'].append( - self.info_provider.include_path_for_union_types( - argument.idl_type)) - - snake_base_name = to_snake_case('V8%s' % callback_function.name) - header_path = posixpath.join(self.output_dir, '%s.h' % snake_base_name) - cpp_path = posixpath.join(self.output_dir, '%s.cc' % snake_base_name) - this_include_header_path = self.normalize_this_header_path(header_path) - template_context['this_include_header_path'] = this_include_header_path - template_context['header_guard'] = to_header_guard( - this_include_header_path) - header_text, cpp_text = self.render_templates( - [], header_template, cpp_template, template_context) - return ( - (header_path, header_text), - (cpp_path, cpp_text), - ) - - # pylint: disable=W0221 - def generate_code(self): - callback_functions = self.info_provider.callback_functions - if not callback_functions: - return () - outputs = set() - for callback_function_dict in callback_functions.values(): - if callback_function_dict['component_dir'] != self.target_component: - continue - callback_function = callback_function_dict['callback_function'] - if 'Custom' in callback_function.extended_attributes: - continue - path = callback_function_dict['full_path'] - outputs.update( - self.generate_code_internal(callback_function, path)) - return outputs
diff --git a/third_party/blink/renderer/bindings/scripts/compute_global_objects.py b/third_party/blink/renderer/bindings/scripts/compute_global_objects.py deleted file mode 100755 index fb889cdb..0000000 --- a/third_party/blink/renderer/bindings/scripts/compute_global_objects.py +++ /dev/null
@@ -1,109 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Compute global objects. - -Global objects are defined by interfaces with [Global] on -their definition: http://heycam.github.io/webidl/#Global - -Design document: http://www.chromium.org/developers/design-documents/idl-build -""" - -# pylint: disable=relative-import - -import optparse -import os -import sys - -from utilities import get_file_contents -from utilities import get_interface_extended_attributes_from_idl -from utilities import get_first_interface_name_from_idl -from utilities import read_file_to_list -from utilities import read_pickle_files -from utilities import write_pickle_file - - -def parse_options(): - usage = 'Usage: %prog [options] [GlobalObjects.pickle]' - parser = optparse.OptionParser(usage=usage) - parser.add_option('--idl-files-list', help='file listing IDL files') - parser.add_option( - '--global-objects-component-files', - action='append', - help='optionally preceeded input pickle filename.') - - options, args = parser.parse_args() - - if options.idl_files_list is None: - parser.error( - 'Must specify a file listing IDL files using --idl-files-list.') - if options.global_objects_component_files is None: - options.global_objects_component_files = [] - if len(args) != 1: - parser.error('Must specify an output pickle filename as an argument') - - return options, args - - -def dict_union(dicts): - return dict((k, v) for d in dicts for k, v in d.items()) - - -def idl_file_to_global_names(idl_filename): - """Returns global names, if any, for an IDL file. - - The identifier argument or identifier list argument the [Global] extended - attribute is declared with define the interface's global names - (http://heycam.github.io/webidl/#Global). - """ - full_path = os.path.realpath(idl_filename) - idl_file_contents = get_file_contents(full_path) - extended_attributes = get_interface_extended_attributes_from_idl( - idl_file_contents) - interface_name = get_first_interface_name_from_idl(idl_file_contents) - - if 'Global' not in extended_attributes: - return - global_value = extended_attributes['Global'] - if not global_value: - raise ValueError( - '[Global] must take an indentifier or an identifier list.\n' + - full_path) - return map(str.strip, global_value.strip('()').split(',')) - - -def idl_files_to_interface_name_global_names(idl_files): - """Yields pairs (interface_name, global_names) found in IDL files.""" - for idl_filename in idl_files: - interface_name = get_first_interface_name_from_idl( - get_file_contents(idl_filename)) - global_names = idl_file_to_global_names(idl_filename) - if global_names: - yield interface_name, global_names - - -################################################################################ - - -def main(): - options, args = parse_options() - output_global_objects_filename = args.pop() - interface_name_global_names = dict_union( - existing_interface_name_global_names - for existing_interface_name_global_names in read_pickle_files( - options.global_objects_component_files)) - - # File paths of input IDL files are passed in a file, which is generated at - # GN time. It is OK because the target IDL files themselves are static. - idl_files = read_file_to_list(options.idl_files_list) - interface_name_global_names.update( - idl_files_to_interface_name_global_names(idl_files)) - - write_pickle_file(output_global_objects_filename, - interface_name_global_names) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_individual.py b/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_individual.py deleted file mode 100755 index 9561fdc6..0000000 --- a/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_individual.py +++ /dev/null
@@ -1,410 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Compute global interface information for individual IDL files. - -Auxiliary module for compute_interfaces_info_overall, which consolidates -this individual information, computing info that spans multiple files -(dependencies and ancestry). - -This distinction is so that individual interface info can be computed -separately for each component (avoiding duplicated reading of individual -files), then consolidated using *only* the info visible to a given component. - -Design doc: http://www.chromium.org/developers/design-documents/idl-build -""" - -from collections import defaultdict -import optparse -import os -import posixpath -import sys - -from idl_definitions import Visitor -from idl_reader import IdlReader -from utilities import idl_filename_to_component -from utilities import idl_filename_to_basename -from utilities import merge_dict_recursively -from utilities import read_idl_files_list_from_file -from utilities import shorten_union_name -from utilities import to_snake_case -from utilities import read_pickle_file -from utilities import write_pickle_file - -module_path = os.path.dirname(__file__) -source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir)) -gen_path = os.path.join('gen', 'blink') - - -class IdlBadFilenameError(Exception): - """Raised if an IDL filename disagrees with the interface name in the file.""" - pass - - -def parse_options(): - usage = 'Usage: %prog [options]' - parser = optparse.OptionParser(usage=usage) - parser.add_option('--cache-directory', help='cache directory') - parser.add_option('--idl-files-list', help='file listing IDL files') - parser.add_option( - '--interfaces-info-file', help='interface info pickle file') - parser.add_option( - '--component-info-file', help='component wide info pickle file') - parser.add_option( - '--runtime-enabled-features-file', - help='runtime-enabled features pickle file') - - options, args = parser.parse_args() - if options.interfaces_info_file is None: - parser.error( - 'Must specify an output file using --interfaces-info-file.') - if options.idl_files_list is None: - parser.error( - 'Must specify a file listing IDL files using --idl-files-list.') - return options, args - - -################################################################################ -# Computations -################################################################################ - - -def relative_dir_posix(idl_filename, base_path): - """Returns relative path to the directory of idl_file in POSIX format.""" - relative_path_local = os.path.relpath(idl_filename, base_path) - relative_dir_local = os.path.dirname(relative_path_local) - return relative_dir_local.replace(os.path.sep, posixpath.sep) - - -def include_path(idl_filename, implemented_as=None): - """Returns relative path to header file in POSIX format; used in includes. - - POSIX format is used for consistency of output, so reference tests are - platform-independent. - """ - if idl_filename.startswith(gen_path): - relative_dir = relative_dir_posix(idl_filename, gen_path) - else: - relative_dir = relative_dir_posix(idl_filename, source_path) - - # IDL file basename is used even if only a partial interface file - output_file_basename = implemented_as or idl_filename_to_basename( - idl_filename) - output_file_basename = to_snake_case(output_file_basename) - return posixpath.join(relative_dir, output_file_basename + '.h') - - -def get_includes_from_definitions(definitions, definition_name): - interfaces = [] - mixins = [] - for include in definitions.includes: - if definition_name == include.interface: - mixins.append(include.mixin) - elif definition_name == include.mixin: - interfaces.append(include.interface) - else: - raise IdlBadFilenameError( - 'includes statement found in unrelated IDL file.\n' - 'Statement is:\n' - ' %s includes %s;\n' - 'but filename is unrelated "%s.idl"' % - (include.interface, include.mixin, definition_name)) - return interfaces, mixins - - -def get_put_forward_interfaces_from_definition(definition): - return sorted( - set(attribute.idl_type.base_type for attribute in definition.attributes - if 'PutForwards' in attribute.extended_attributes)) - - -def get_unforgeable_attributes_from_definition(definition): - return sorted(attribute for attribute in definition.attributes - if 'LegacyUnforgeable' in attribute.extended_attributes) - - -def collect_union_types_from_definitions(definitions): - """Traverse definitions and collect all union types.""" - - class UnionTypeCollector(Visitor): - def collect(self, definitions): - self._union_types = set() - definitions.accept(self) - return self._union_types - - def visit_typed_object(self, typed_object): - for attribute_name in typed_object.idl_type_attributes: - attribute = getattr(typed_object, attribute_name, None) - if not attribute: - continue - for idl_type in attribute.idl_types(): - if idl_type.is_union_type: - self._union_types.add(idl_type) - - return UnionTypeCollector().collect(definitions) - - -class InterfaceInfoCollector(object): - """A class that collects interface information from idl files.""" - - def __init__(self, cache_directory=None): - self.reader = IdlReader( - interfaces_info=None, outputdir=cache_directory) - self.interfaces_info = {} - self.partial_interface_files = defaultdict(lambda: { - 'full_paths': [], - 'include_paths': [], }) - self.enumerations = {} - self.union_types = set() - self.typedefs = {} - self.callback_functions = {} - - def add_paths_to_partials_dict(self, partial_interface_name, full_path, - include_paths): - paths_dict = self.partial_interface_files[partial_interface_name] - paths_dict['full_paths'].append(full_path) - paths_dict['include_paths'].extend(include_paths) - - def check_enum_consistency(self, enum): - existing_enum = self.enumerations.get(enum.name) - if not existing_enum: - return True - # TODO(bashi): Ideally we should not allow multiple enum declarations - # but we allow them to work around core/module separation. - if len(existing_enum.values) != len(enum.values): - return False - return all(value in existing_enum.values for value in enum.values) - - def collect_info(self, idl_filename): - """Reads an idl file and collects information which is required by the - binding code generation.""" - - def collect_unforgeable_attributes(definition, idl_filename): - """Collects [LegacyUnforgeable] attributes so that we can define - them on sub-interfaces later. The resulting structure is as - follows. - interfaces_info[interface_name] = { - 'unforgeable_attributes': [IdlAttribute, ...], - ... - } - """ - interface_info = {} - unforgeable_attributes = get_unforgeable_attributes_from_definition( - definition) - if not unforgeable_attributes: - return interface_info - - if definition.is_partial: - interface_basename = idl_filename_to_interface_name( - idl_filename) - # TODO(yukishiino): [PartialInterfaceImplementedAs] is treated - # in interface_dependency_resolver.transfer_extended_attributes. - # Come up with a better way to keep them consistent. - for attr in unforgeable_attributes: - attr.extended_attributes[ - 'PartialInterfaceImplementedAs'] = definition.extended_attributes.get( - 'ImplementedAs', interface_basename) - interface_info['unforgeable_attributes'] = unforgeable_attributes - return interface_info - - definitions = self.reader.read_idl_file(idl_filename) - - this_union_types = collect_union_types_from_definitions(definitions) - self.union_types.update(this_union_types) - self.typedefs.update(definitions.typedefs) - for callback_function_name, callback_function in \ - definitions.callback_functions.items(): - # Set 'component_dir' to specify a directory that callback function files belong to - self.callback_functions[callback_function_name] = { - 'callback_function': callback_function, - 'component_dir': idl_filename_to_component(idl_filename), - 'full_path': os.path.realpath(idl_filename), - } - # Check enum duplication. - for enum in definitions.enumerations.values(): - if not self.check_enum_consistency(enum): - raise Exception('Enumeration "%s" is defined more than once ' - 'with different valid values' % enum.name) - self.enumerations.update(definitions.enumerations) - - if definitions.interfaces: - definition = next(iter(definitions.interfaces.values())) - interface_info = { - 'is_callback_interface': - definition.is_callback, - 'is_dictionary': - False, - # Interfaces that are referenced (used as types) and that we - # introspect during code generation (beyond interface-level - # data ([ImplementedAs], is_callback_interface, ancestors, and - # inherited extended attributes): deep dependencies. - # These cause rebuilds of referrers, due to the dependency, - # so these should be minimized; currently only targets of - # [PutForwards]. - 'referenced_interfaces': - get_put_forward_interfaces_from_definition(definition), - } - elif definitions.dictionaries: - definition = next(iter(definitions.dictionaries.values())) - interface_info = { - 'is_callback_interface': False, - 'is_dictionary': True, - 'referenced_interfaces': None, - } - else: - return - - if definition.name not in self.interfaces_info: - self.interfaces_info[definition.name] = {} - - # Remember [LegacyUnforgeable] attributes. - if definitions.interfaces: - merge_dict_recursively( - self.interfaces_info[definition.name], - collect_unforgeable_attributes(definition, idl_filename)) - - component = idl_filename_to_component(idl_filename) - extended_attributes = definition.extended_attributes - implemented_as = extended_attributes.get('ImplementedAs') - full_path = os.path.realpath(idl_filename) - if interface_info['is_dictionary']: - this_include_path = include_path(idl_filename) - else: - this_include_path = include_path(idl_filename, implemented_as) - if definition.is_partial: - # We don't create interface_info for partial interfaces, but - # adds paths to another dict. - partial_include_paths = [] - if this_include_path: - partial_include_paths.append(this_include_path) - self.add_paths_to_partials_dict(definition.name, full_path, - partial_include_paths) - # Collects C++ header paths which should be included from generated - # .cpp files. The resulting structure is as follows. - # interfaces_info[interface_name] = { - # 'cpp_includes': { - # 'core': set(['core/foo/Foo.h', ...]), - # 'modules': set(['modules/bar/Bar.h', ...]), - # }, - # ... - # } - if this_include_path: - merge_dict_recursively( - self.interfaces_info[definition.name], - {'cpp_includes': { - component: set([this_include_path]) - }}) - return - - # 'includes' statements can be included in either the file for the - # interface (lhs of 'includes') or mixin (rhs of 'includes'). Store both - # for now, then merge to the interface later. - includes_interfaces, includes_mixins = get_includes_from_definitions( - definitions, definition.name) - - interface_info.update({ - 'extended_attributes': - extended_attributes, - 'full_path': - full_path, - 'union_types': - this_union_types, - 'implemented_as': - implemented_as, - 'included_by_interfaces': - includes_interfaces, - 'including_mixins': - includes_mixins, - 'include_path': - this_include_path, - # FIXME: temporary private field, while removing old - # treatement of 'implements': http://crbug.com/360435 - 'is_legacy_treat_as_partial_interface': - 'LegacyTreatAsPartialInterface' in extended_attributes, - 'parent': - definition.parent, - 'relative_dir': - relative_dir_posix(idl_filename, source_path), - }) - merge_dict_recursively(self.interfaces_info[definition.name], - interface_info) - - def get_info_as_dict(self): - """Returns info packaged as a dict.""" - return { - 'interfaces_info': self.interfaces_info, - # Can't pickle defaultdict, convert to dict - # FIXME: this should be included in get_component_info. - 'partial_interface_files': dict(self.partial_interface_files), - } - - def get_component_info_as_dict(self, runtime_enabled_features): - """Returns component wide information as a dict.""" - return { - 'callback_functions': - self.callback_functions, - 'enumerations': - dict((enum.name, enum.values) - for enum in self.enumerations.values()), - 'runtime_enabled_features': - runtime_enabled_features, - 'typedefs': - self.typedefs, - 'union_types': - self.union_types, - } - - -################################################################################ - - -def main(): - options, _ = parse_options() - - # IDL files are passed in a file, due to OS command line length limits - idl_files = read_idl_files_list_from_file(options.idl_files_list) - - # Compute information for individual files - # Information is stored in global variables interfaces_info and - # partial_interface_files. - info_collector = InterfaceInfoCollector(options.cache_directory) - for idl_filename in idl_files: - info_collector.collect_info(idl_filename) - - write_pickle_file(options.interfaces_info_file, - info_collector.get_info_as_dict()) - runtime_enabled_features = read_pickle_file( - options.runtime_enabled_features_file) - write_pickle_file( - options.component_info_file, - info_collector.get_component_info_as_dict(runtime_enabled_features)) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_overall.py b/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_overall.py deleted file mode 100755 index 474ee75..0000000 --- a/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_overall.py +++ /dev/null
@@ -1,338 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Compute global interface information, including public information, dependencies, and inheritance. - -Computed data is stored in a global variable, |interfaces_info|, and written as -output (concretely, exported as a pickle). This is then used by the IDL compiler -itself, so it does not need to compute global information itself, and so that -inter-IDL dependencies are clear, since they are all computed here. - -The |interfaces_info| pickle is a *global* dependency: any changes cause a full -rebuild. This is to avoid having to compute which public data is visible by -which IDL files on a file-by-file basis, which is very complex for little -benefit. -|interfaces_info| should thus only contain data about an interface that -contains paths or is needed by *other* interfaces, e.g., path data (to abstract -the compiler from OS-specific file paths) or public data (to avoid having to -read other interfaces unnecessarily). -It should *not* contain full information about an interface (e.g., all -extended attributes), as this would cause unnecessary rebuilds. - -|interfaces_info| is a dict, keyed by |interface_name|. - -Current keys are: -* dependencies: - 'including_mixins': targets of 'includes' statements - 'referenced_interfaces': reference interfaces that are introspected - (currently just targets of [PutForwards]) - -* inheritance: - 'ancestors': all ancestor interfaces - 'inherited_extended_attributes': inherited extended attributes - (all controlling memory management) - -* public: - 'is_callback_interface': bool, callback interface or not - 'implemented_as': value of [ImplementedAs=...] on interface (C++ class name) - -* paths: - 'full_path': path to the IDL file, so can lookup an IDL by interface name - 'include_path': path for use in C++ #include directives - 'dependencies_full_paths': paths to dependencies (for merging into main) - 'dependencies_include_paths': paths for use in C++ #include directives - 'dependencies_other_component_full_paths': - paths to dependencies (cannot merge because of other component) - 'dependencies_other_component_include_paths': - paths for use in C++ #include directives because of dependencies in - other component - -Note that all of these are stable information, unlikely to change without -moving or deleting files (hence requiring a full rebuild anyway) or significant -code changes (for inherited extended attributes). - -Design doc: http://www.chromium.org/developers/design-documents/idl-build -""" - -# pylint: disable=relative-import - -import optparse -import sys - -from collections import defaultdict -from utilities import idl_filename_to_component -from utilities import merge_dict_recursively -from utilities import read_pickle_files -from utilities import shorten_union_name -from utilities import write_pickle_file - -INHERITED_EXTENDED_ATTRIBUTES = set([ - 'ActiveScriptWrappable', - 'LegacyUnenumerableNamedProperties', -]) - -# Main variable (filled in and exported) -interfaces_info = {} - -# Auxiliary variables (not visible to future build steps) -partial_interface_files = defaultdict(lambda: { - 'full_paths': [], - 'include_paths': [], }) -parent_interfaces = {} - -# interface name -> extended attributes -inherited_extended_attributes_by_interface = {} - - -class IdlInterfaceFileNotFoundError(Exception): - """Raised if an IDL file that contains the mixin cannot be found.""" - pass - - -def parse_options(): - usage = 'Usage: %prog [input_info.pickle]... [output_info.pickle]' - parser = optparse.OptionParser(usage=usage) - - return parser.parse_args() - - -def dict_of_dicts_of_lists_update_or_append(existing, other): - """Updates an existing dict of dicts of lists, or appends to lists if key already present. - - Needed for merging partial_interface_files across components. - """ - for key, value in other.items(): - if key not in existing: - existing[key] = value - continue - existing_value = existing[key] - for inner_key, inner_value in value.items(): - existing_value[inner_key].extend(inner_value) - - -################################################################################ -# Computations -################################################################################ - - -def compute_inheritance_info(interface_name): - """Compute inheritance information, namely ancestors and inherited - extended attributes. - """ - - def generate_ancestors(interface_name): - while interface_name in parent_interfaces: - interface_name = parent_interfaces[interface_name] - yield interface_name - - ancestors = list(generate_ancestors(interface_name)) - inherited_extended_attributes = \ - inherited_extended_attributes_by_interface[interface_name] - for ancestor in ancestors: - # Ancestors may not be present, notably if an ancestor is a generated - # IDL file and we are running this script from run_bindings_tests.py, - # where we don't generate these files. - ancestor_extended_attributes = \ - inherited_extended_attributes_by_interface.get(ancestor, {}) - inherited_extended_attributes.update(ancestor_extended_attributes) - - interfaces_info[interface_name].update({ - 'ancestors': - ancestors, - 'inherited_extended_attributes': - inherited_extended_attributes, - }) - - -def compute_global_type_info(): - ancestors = {} - dictionaries = {} - component_dirs = {} - implemented_as_interfaces = {} - garbage_collected_interfaces = set() - callback_interfaces = set() - - for interface_name, interface_info in interfaces_info.items(): - component_dirs[interface_name] = idl_filename_to_component( - interface_info['full_path']) - - if interface_info['ancestors']: - ancestors[interface_name] = interface_info['ancestors'] - if interface_info['is_callback_interface']: - callback_interfaces.add(interface_name) - if interface_info['is_dictionary']: - dictionaries[interface_name] = interface_info['is_dictionary'] - if interface_info['implemented_as']: - implemented_as_interfaces[interface_name] = \ - interface_info['implemented_as'] - - inherited_extended_attributes = \ - interface_info['inherited_extended_attributes'] - garbage_collected_interfaces.add(interface_name) - - interfaces_info['ancestors'] = ancestors - interfaces_info['callback_interfaces'] = callback_interfaces - interfaces_info['dictionaries'] = dictionaries - interfaces_info['implemented_as_interfaces'] = implemented_as_interfaces - interfaces_info['garbage_collected_interfaces'] = \ - garbage_collected_interfaces - interfaces_info['component_dirs'] = component_dirs - - -def compute_interfaces_info_overall(info_individuals): - """Compute information about IDL files. - - Information is stored in global interfaces_info. - """ - for info in info_individuals: - merge_dict_recursively(interfaces_info, info['interfaces_info']) - # Interfaces in one component may have partial interfaces in - # another component. This is ok (not a layering violation), since - # partial interfaces are used to *extend* interfaces. - # We thus need to update or append if already present - dict_of_dicts_of_lists_update_or_append( - partial_interface_files, info['partial_interface_files']) - - # Record inheritance information individually - for interface_name, interface_info in interfaces_info.items(): - extended_attributes = interface_info['extended_attributes'] - inherited_extended_attributes_by_interface[interface_name] = dict( - (key, value) for key, value in extended_attributes.items() - if key in INHERITED_EXTENDED_ATTRIBUTES) - parent = interface_info['parent'] - if parent: - parent_interfaces[interface_name] = parent - - # Once all individual files handled, can compute inheritance information - # and dependencies - - # Compute inheritance info - for interface_name in interfaces_info: - compute_inheritance_info(interface_name) - - # Compute dependencies - # Move includes info from mixin (rhs of 'includes') to interface (lhs of - # 'includes'). - # Note that moving an 'includes' statement between files does not change the - # info itself (or hence cause a rebuild)! - for mixin_name, interface_info in interfaces_info.items(): - for interface_name in interface_info['included_by_interfaces']: - interfaces_info[interface_name]['including_mixins'].append( - mixin_name) - del interface_info['included_by_interfaces'] - - # An IDL file's dependencies are partial interface files that extend it, - # and files for other interfaces that this interfaces include. - for interface_name, interface_info in interfaces_info.items(): - partial_interface_paths = partial_interface_files[interface_name] - partial_interfaces_full_paths = partial_interface_paths['full_paths'] - # Partial interface definitions each need an include, as they are - # implemented in separate classes from the main interface. - partial_interfaces_include_paths = \ - partial_interface_paths['include_paths'] - - mixins = interface_info['including_mixins'] - try: - mixins_info = [interfaces_info[mixin] for mixin in mixins] - except KeyError as key_name: - raise IdlInterfaceFileNotFoundError( - 'Could not find the IDL file where the following mixin is defined: %s' - % key_name) - mixins_full_paths = [ - mixin_info['full_path'] for mixin_info in mixins_info - ] - # Mixins don't need include files, as this is handled in the Blink - # implementation (they are implemented on |impl| itself, hence header - # declaration is included in the interface class). - # However, they are needed for legacy mixins that are being treated as - # partial interfaces, until we remove these. - # https://crbug.com/360435 - mixins_include_paths = [ - mixin_info['include_path'] for mixin_info in mixins_info - if mixin_info['is_legacy_treat_as_partial_interface'] - ] - - dependencies_full_paths = mixins_full_paths - dependencies_include_paths = mixins_include_paths - dependencies_other_component_full_paths = [] - dependencies_other_component_include_paths = [] - - component = idl_filename_to_component(interface_info['full_path']) - for full_path in partial_interfaces_full_paths: - partial_interface_component = idl_filename_to_component(full_path) - if component == partial_interface_component: - dependencies_full_paths.append(full_path) - else: - dependencies_other_component_full_paths.append(full_path) - - for include_path in partial_interfaces_include_paths: - partial_interface_component = idl_filename_to_component( - include_path) - if component == partial_interface_component: - dependencies_include_paths.append(include_path) - else: - dependencies_other_component_include_paths.append(include_path) - - interface_info.update({ - 'dependencies_full_paths': - dependencies_full_paths, - 'dependencies_include_paths': - dependencies_include_paths, - 'dependencies_other_component_full_paths': - dependencies_other_component_full_paths, - 'dependencies_other_component_include_paths': - dependencies_other_component_include_paths, - }) - - # Clean up temporary private information - for interface_info in interfaces_info.values(): - del interface_info['extended_attributes'] - del interface_info['union_types'] - del interface_info['is_legacy_treat_as_partial_interface'] - - # Compute global_type_info to interfaces_info so that idl_compiler does - # not need to always calculate the info in __init__. - compute_global_type_info() - - -################################################################################ - - -def main(): - _, args = parse_options() - # args = Input1, Input2, ..., Output - interfaces_info_filename = args.pop() - info_individuals = read_pickle_files(args) - - compute_interfaces_info_overall(info_individuals) - write_pickle_file(interfaces_info_filename, interfaces_info) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/generate_global_constructors.py b/third_party/blink/renderer/bindings/scripts/generate_global_constructors.py deleted file mode 100755 index 8a571d5..0000000 --- a/third_party/blink/renderer/bindings/scripts/generate_global_constructors.py +++ /dev/null
@@ -1,220 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Generates interface properties on global objects. - -Concretely these are implemented as "constructor attributes", meaning -"attributes whose name ends with Constructor" (special-cased by code generator), -hence "global constructors" for short. - -For reference on global objects, see: -http://heycam.github.io/webidl/#Global -http://heycam.github.io/webidl/#Exposed - -Design document: http://www.chromium.org/developers/design-documents/idl-build -""" - -# pylint: disable=relative-import - -import itertools -import optparse -import os -import re -import sys - -from collections import defaultdict -from utilities import get_file_contents -from utilities import get_first_interface_name_from_idl -from utilities import get_interface_exposed_arguments -from utilities import get_interface_extended_attributes_from_idl -from utilities import is_non_legacy_callback_interface_from_idl -from utilities import is_interface_mixin_from_idl -from utilities import read_file_to_list -from utilities import read_pickle_file -from utilities import should_generate_impl_file_from_idl -from utilities import write_file -from v8_utilities import EXPOSED_EXECUTION_CONTEXT_METHOD - -interface_name_to_global_names = {} -global_name_to_constructors = defaultdict(list) - -HEADER_FORMAT = """// Stub header file for {{idl_basename}} -// Required because the IDL compiler assumes that a corresponding header -// file exists for each IDL file. -""" - - -def parse_options(): - parser = optparse.OptionParser() - parser.add_option('--idl-files-list', help='file listing IDL files') - parser.add_option( - '--global-objects-file', help='pickle file of global objects') - options, args = parser.parse_args() - - if options.idl_files_list is None: - parser.error( - 'Must specify a file listing IDL files using --idl-files-list.') - if options.global_objects_file is None: - parser.error( - 'Must specify a pickle file of global objects using --global-objects-file.' - ) - - return options, args - - -def flatten_list(iterable): - return list(itertools.chain.from_iterable(iterable)) - - -def interface_name_to_constructors(interface_name): - """Returns constructors for an interface.""" - global_names = interface_name_to_global_names[interface_name] - return flatten_list(global_name_to_constructors[global_name] - for global_name in global_names) - - -def record_global_constructors(idl_filename): - full_path = os.path.realpath(idl_filename) - idl_file_contents = get_file_contents(full_path) - extended_attributes = get_interface_extended_attributes_from_idl( - idl_file_contents) - interface_name = get_first_interface_name_from_idl(idl_file_contents) - - # An interface property is produced for every non-callback interface - # that does not have [LegacyNoInterfaceObject]. - # http://heycam.github.io/webidl/#es-interfaces - if (not should_generate_impl_file_from_idl(idl_file_contents) - or is_non_legacy_callback_interface_from_idl(idl_file_contents) - or is_interface_mixin_from_idl(idl_file_contents) - or 'LegacyNoInterfaceObject' in extended_attributes): - return - - exposed_arguments = get_interface_exposed_arguments(idl_file_contents) - if exposed_arguments: - # Exposed(Arguments) case - for argument in exposed_arguments: - if 'RuntimeEnabled' in extended_attributes: - raise ValueError( - 'RuntimeEnabled should not be used with Exposed(Arguments)' - ) - attributes = extended_attributes.copy() - attributes['RuntimeEnabled'] = argument['runtime_enabled'] - new_constructors_list = generate_global_constructors_list( - interface_name, attributes) - global_name_to_constructors[argument['exposed']].extend( - new_constructors_list) - elif 'Exposed' in extended_attributes: - # Exposed=env or Exposed=(env1,...) case - exposed_value = extended_attributes.get('Exposed') - exposed_global_names = map(str.strip, - exposed_value.strip('()').split(',')) - new_constructors_list = generate_global_constructors_list( - interface_name, extended_attributes) - for name in exposed_global_names: - global_name_to_constructors[name].extend(new_constructors_list) - - -def generate_global_constructors_list(interface_name, extended_attributes): - extended_attributes_list = [ - name + - (('=' + - extended_attributes[name]) if extended_attributes[name] else '') - for name in [ - 'RuntimeEnabled', 'ContextEnabled', 'CrossOriginIsolated', - 'DirectSocketEnabled', 'SecureContext' - ] if name in extended_attributes - ] - - # Getters for these Constructors are auto-generated and considered - # side-effect free w.r.t to V8. That is, executing the getter has no - # JavaScript observable effect. - extended_attributes_list.append('Affects=Nothing') - - extended_string = '[%s] ' % ', '.join(extended_attributes_list) - - attribute_string = 'attribute {interface_name}Constructor {interface_name}'.format( - interface_name=interface_name) - attributes_list = [extended_string + attribute_string] - - # In addition to the usual interface property, for every [NamedConstructor] - # extended attribute on an interface, a corresponding property MUST exist - # on the ECMAScript global object. - # http://heycam.github.io/webidl/#NamedConstructor - if 'NamedConstructor' in extended_attributes: - named_constructor = extended_attributes['NamedConstructor'] - # Extract function name, namely everything before opening '(' - constructor_name = re.sub(r'\(.*', '', named_constructor) - # Note the reduplicated 'ConstructorConstructor' - # FIXME: rename to NamedConstructor - attribute_string = 'attribute %sConstructorConstructor %s' % ( - interface_name, constructor_name) - attributes_list.append(extended_string + attribute_string) - - return attributes_list - - -def write_global_constructors_partial_interface(interface_name, idl_filename, - constructor_attributes_list): - idl_basename = os.path.basename(idl_filename) - basename = os.path.splitext(idl_basename)[0] - # FIXME: replace this with a simple Jinja template - lines = ([ - '[\n', - ' ImplementedAs=%s\n' % basename, - '] partial interface %s {\n' % interface_name - ] + [ - ' %s;\n' % constructor_attribute - # FIXME: sort by interface name (not first by extended attributes) - for constructor_attribute in sorted(constructor_attributes_list) - ] + ['};\n']) - write_file(''.join(lines), idl_filename) - header_filename = os.path.splitext(idl_filename)[0] + '.h' - write_file( - HEADER_FORMAT.format(idl_basename=idl_basename), header_filename) - - -################################################################################ - - -def main(): - options, args = parse_options() - - # File paths of input IDL files are passed in a file, which is generated at - # GN time. It is OK because the target IDL files are static. - idl_files = read_file_to_list(options.idl_files_list) - - # Output IDL files (to generate) are passed at the command line, since - # these are in the build directory, which is determined at build time, not - # GN time. - # These are passed as pairs of GlobalObjectName, global_object.idl - interface_name_idl_filename = [(args[i], args[i + 1]) - for i in range(0, len(args), 2)] - - interface_name_to_global_names.update( - read_pickle_file(options.global_objects_file)) - - for idl_filename in idl_files: - record_global_constructors(idl_filename) - - # Check for [Exposed] / [Global] mismatch. - known_global_names = EXPOSED_EXECUTION_CONTEXT_METHOD.keys() - exposed_global_names = frozenset(global_name_to_constructors) - if not exposed_global_names.issubset(known_global_names): - unknown_global_names = exposed_global_names.difference( - known_global_names) - raise ValueError('The following global names were used in ' - '[Exposed=xxx] but do not match any global names: %s' - % list(unknown_global_names)) - - # Write partial interfaces containing constructor attributes for each - # global interface. - for interface_name, idl_filename in interface_name_idl_filename: - constructors = interface_name_to_constructors(interface_name) - write_global_constructors_partial_interface(interface_name, - idl_filename, constructors) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/generate_init_partial_interfaces.py b/third_party/blink/renderer/bindings/scripts/generate_init_partial_interfaces.py deleted file mode 100755 index 91aa20b..0000000 --- a/third_party/blink/renderer/bindings/scripts/generate_init_partial_interfaces.py +++ /dev/null
@@ -1,115 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Generate initPartialInterfacesInModules(), which registers partial -interfaces in modules to core interfaces. -""" - -# pylint: disable=relative-import - -from __future__ import print_function - -from optparse import OptionParser -import os -import posixpath -import sys - -from utilities import get_file_contents -from utilities import get_first_interface_name_from_idl -from utilities import read_idl_files_list_from_file -from utilities import should_generate_impl_file_from_idl -from utilities import write_file -from v8_utilities import build_basename - -_COPYRIGHT = """// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -""" - -_INIT_PARTIAL_INTERFACE = """%s -%s - -namespace blink { - -void InitPartialInterfacesInModules() { -%s -} - -} // namespace blink -""" - - -def parse_options(): - usage = 'Usage: %prog [options]' - parser = OptionParser(usage=usage) - parser.add_option( - '--idl-files-list', - help='a text file containing the IDL file paths, so the command ' - 'line doesn\'t exceed OS length limits.') - parser.add_option('--output') - - options, args = parser.parse_args() - if options.output is None: - parser.error('Must specify output file using --output.') - if options.idl_files_list is None: - parser.error( - 'Must specify a list of IDL files using --idl-files-list.') - return options - - -def extract_meta_data(file_paths): - """Extracts interface name from each IDL file.""" - meta_data_list = [] - - for file_path in file_paths: - if not file_path.endswith('.idl'): - print('WARNING: non-IDL file passed: "%s"' % file_path) - continue - if not os.path.exists(file_path): - print('WARNING: file not found: "%s"' % file_path) - continue - - idl_file_contents = get_file_contents(file_path) - if not should_generate_impl_file_from_idl(idl_file_contents): - continue - - # Extract interface name from file content - basename = get_first_interface_name_from_idl(idl_file_contents) - - meta_data = { - 'basename': basename, - } - meta_data_list.append(meta_data) - - return meta_data_list - - -def main(): - options = parse_options() - - idl_file_names = read_idl_files_list_from_file(options.idl_files_list) - - meta_data_list = extract_meta_data(idl_file_names) - interface_names = [ - 'V8%sPartial' % meta_data['basename'] for meta_data in meta_data_list - ] - interface_names.sort() - - includes = [ - '#include "third_party/blink/renderer/bindings/modules/v8/%s.h"' % - build_basename(interface_name) for interface_name in interface_names - ] - initialize_calls = [ - ' %s::Initialize();' % interface_name - for interface_name in interface_names - ] - - content = _INIT_PARTIAL_INTERFACE % (_COPYRIGHT, '\n'.join(includes), - '\n'.join(initialize_calls)) - - write_file(content, options.output) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py b/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py deleted file mode 100755 index 3ab0820..0000000 --- a/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py +++ /dev/null
@@ -1,291 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This script reads the global interface data collected by -# compute_interfaces_info_overall.py, and writes out the code which adds -# bindings for origin-trial-enabled features at runtime. - -import optparse -import os -import posixpath -import sys -from collections import defaultdict, namedtuple - -from code_generator import (initialize_jinja_env, normalize_and_sort_includes, - render_template) -from idl_reader import IdlReader -from utilities import (create_component_info_provider, write_file, - idl_filename_to_component) -from v8_utilities import (binding_header_filename, v8_class_name, - v8_class_name_or_partial, origin_trial_feature_name) - -# Make sure extension is .py, not .pyc or .pyo, so doesn't depend on caching -MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py' - -OriginTrialInterfaceInfo = namedtuple( - 'OriginTrialInterfaceInfo', - ['name', 'v8_class', 'v8_class_or_partial', 'is_global']) - - -def get_install_functions(interfaces, feature_names): - """Construct a list of V8 bindings installation functions for each feature - on each interface. - - interfaces is a list of OriginTrialInterfaceInfo tuples - feature_names is a list of strings, containing names of features which can - be installed on those interfaces. - """ - return [{ - 'condition': - 'RuntimeEnabledFeatures::%sEnabled' % feature_name, - 'name': - feature_name, - 'install_method': - 'Install%s' % feature_name, - 'interface_is_global': - interface_info.is_global, - 'global_type_check_method': - interface_global_type_check_method(interface_info), - 'v8_class': - interface_info.v8_class, - 'v8_class_or_partial': - interface_info.v8_class_or_partial, - } for feature_name in feature_names for interface_info in interfaces] - - -def get_origin_trial_feature_names_from_interface(interface, runtime_features): - feature_names = set() - - def add_if_not_none(value): - if value: - feature_names.add(value) - - if interface.is_partial: - add_if_not_none(origin_trial_feature_name(interface, runtime_features)) - for operation in interface.operations: - add_if_not_none(origin_trial_feature_name(operation, runtime_features)) - for attribute in interface.attributes: - add_if_not_none(origin_trial_feature_name(attribute, runtime_features)) - return feature_names - - -def read_idl_file(reader, idl_filename): - definitions = reader.read_idl_file(idl_filename) - interfaces = definitions.interfaces - includes = definitions.includes - # There should only be a single interface defined in an IDL file. Return it. - assert len(interfaces) == 1, ( - "Expected one interface in file %r, found %d" % - (idl_filename, len(interfaces))) - return (list(interfaces.values())[0], includes) - - -def interface_is_global(interface): - return 'Global' in interface.extended_attributes - - -def interface_global_type_check_method(interface_info): - """Generate the name of the method on ExecutionContext used to check if the - context matches the type of the interface, which is a global. - - Returns None for non-global interfaces. - """ - if not interface_info.is_global: - return None - - return 'Is%s' % interface_info.name - - -def origin_trial_features_info(info_provider, reader, idl_filenames, - target_component): - """Read a set of IDL files and compile the mapping between interfaces and - the conditional features defined on them. - - Returns a tuple (features_for_type, types_for_feature, includes): - - features_for_type is a mapping of interface->feature - - types_for_feature is the reverse mapping: feature->interface - - includes is a set of header files which need to be included in the - generated implementation code. - """ - features_for_type = defaultdict(set) - types_for_feature = defaultdict(set) - include_files = set() - runtime_features = info_provider.component_info['runtime_enabled_features'] - - for idl_filename in idl_filenames: - interface, includes = read_idl_file(reader, idl_filename) - feature_names = get_origin_trial_feature_names_from_interface( - interface, runtime_features) - - # If this interface is a mixin, we don't generate V8 bindings code for - # it. - # TODO(crbug.com/1061995): This incorrectly ignores includes in the - # mixin idl like "SomeInterface includes MixinInterface". - if interface.is_mixin: - continue - - # If this interface include another one, - # it inherits any conditional features from it. - for include in includes: - assert include.interface == interface.name, ( - "'includes' interface identifier %r in file %r should be %r" % - (include.interface, idl_filename, interface.name)) - mixin, _ = read_idl_file( - reader, - info_provider.interfaces_info[include.mixin].get('full_path')) - feature_names |= get_origin_trial_feature_names_from_interface( - mixin, runtime_features) - - feature_names = list(feature_names) - if feature_names: - is_global = interface_is_global(interface) - if interface.is_partial: - # For partial interfaces, we need to generate different - # |include_files| if the parent interface is in a different - # component. - parent_interface_info = \ - info_provider.interfaces_info[interface.name] - parent_interface, _ = read_idl_file( - reader, parent_interface_info.get('full_path')) - is_global = is_global or interface_is_global(parent_interface) - parent_component = idl_filename_to_component( - parent_interface_info.get('full_path')) - if interface.is_partial and target_component != parent_component: - include_files.add('bindings/%s/v8/%s' % ( - parent_component, binding_header_filename(interface.name))) - include_files.add( - 'bindings/%s/v8/%s' % - (target_component, - binding_header_filename(interface.name + 'Partial'))) - else: - include_files.add('bindings/%s/v8/%s' % ( - target_component, binding_header_filename(interface.name))) - # If this is a partial interface in the same component as - # its parent, then treat it as a non-partial interface. - interface.is_partial = False - interface_info = OriginTrialInterfaceInfo( - interface.name, v8_class_name(interface), - v8_class_name_or_partial(interface), is_global) - for feature_name in feature_names: - features_for_type[interface_info].add(feature_name) - types_for_feature[feature_name].add(interface_info) - - return features_for_type, types_for_feature, include_files - - -def origin_trial_features_context(generator_name, feature_info): - context = {'code_generator': generator_name} - - # Unpack the feature info tuple. - features_for_type, types_for_feature, include_files = feature_info - - # Add includes needed for cpp code and normalize. - include_files.update([ - 'core/context_features/context_feature_settings.h', - 'core/execution_context/execution_context.h', - 'core/frame/frame.h', - 'core/origin_trials/origin_trials.h', - 'platform/bindings/origin_trial_features.h', - 'platform/bindings/script_state.h', - 'platform/bindings/v8_per_context_data.h', - 'platform/runtime_enabled_features.h', - # TODO(iclelland): Remove the need to explicitly include this; it is - # here because the ContextFeatureSettings code needs it. - 'bindings/core/v8/v8_window.h', - ]) - context['includes'] = normalize_and_sort_includes(include_files) - - # For each interface, collect a list of bindings installation functions to - # call, organized by conditional feature. - context['installers_by_interface'] = [{ - 'name': - interface_info.name, - 'is_global': - interface_info.is_global, - 'v8_class': - interface_info.v8_class, - 'installers': - get_install_functions([interface_info], feature_names) - } for interface_info, feature_names in features_for_type.items()] - context['installers_by_interface'].sort(key=lambda x: x['name']) - - # For each conditional feature, collect a list of bindings installation - # functions to call, organized by interface. - context['installers_by_feature'] = [{ - 'name': - feature_name, - 'name_constant': - 'OriginTrialFeature::k%s' % feature_name, - 'installers': - get_install_functions(interfaces, [feature_name]) - } for feature_name, interfaces in types_for_feature.items()] - context['installers_by_feature'].sort(key=lambda x: x['name']) - - return context - - -def parse_options(): - parser = optparse.OptionParser() - parser.add_option( - '--cache-directory', - help='cache directory, defaults to output directory') - parser.add_option('--output-directory') - parser.add_option('--info-dir') - parser.add_option( - '--target-component', - type='choice', - choices=['core', 'modules'], - help='target component to generate code') - parser.add_option('--idl-files-list') - - options, _ = parser.parse_args() - if options.output_directory is None: - parser.error('Must specify output directory using --output-directory.') - return options - - -def generate_origin_trial_features(info_provider, options, idl_filenames): - reader = IdlReader(info_provider.interfaces_info, options.cache_directory) - jinja_env = initialize_jinja_env(options.cache_directory) - - # Extract the bidirectional mapping of conditional features <-> interfaces - # from the global info provider and the supplied list of IDL files. - feature_info = origin_trial_features_info( - info_provider, reader, idl_filenames, options.target_component) - - # Convert that mapping into the context required for the Jinja2 templates. - template_context = origin_trial_features_context(MODULE_PYNAME, - feature_info) - - file_basename = 'origin_trial_features_for_%s' % options.target_component - - # Generate and write out the header file - header_text = render_template( - jinja_env.get_template(file_basename + '.h.tmpl'), template_context) - header_path = posixpath.join(options.output_directory, - file_basename + '.h') - write_file(header_text, header_path) - - # Generate and write out the implementation file - cpp_text = render_template( - jinja_env.get_template(file_basename + '.cc.tmpl'), template_context) - cpp_path = posixpath.join(options.output_directory, file_basename + '.cc') - write_file(cpp_text, cpp_path) - - -def main(): - options = parse_options() - - info_provider = create_component_info_provider( - os.path.normpath(options.info_dir), options.target_component) - idl_filenames = list(map(str.strip, open(options.idl_files_list))) - - generate_origin_trial_features(info_provider, options, idl_filenames) - return 0 - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/generate_v8_context_snapshot_external_references.py b/third_party/blink/renderer/bindings/scripts/generate_v8_context_snapshot_external_references.py deleted file mode 100644 index 4f23b29..0000000 --- a/third_party/blink/renderer/bindings/scripts/generate_v8_context_snapshot_external_references.py +++ /dev/null
@@ -1,277 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=relative-import - -import argparse -import os -import posixpath - -from code_generator import initialize_jinja_env -from idl_reader import IdlReader -from utilities import create_component_info_provider, write_file -import utilities -import v8_attributes -import v8_interface -import v8_types -import v8_utilities - -INCLUDES = frozenset([ - 'third_party/blink/renderer/bindings/core/v8/generated_code_helper.h', - 'third_party/blink/renderer/bindings/core/v8/v8_html_document.h', - 'third_party/blink/renderer/bindings/core/v8/v8_initializer.h', - 'third_party/blink/renderer/bindings/core/v8/v8_window.h', - 'third_party/blink/renderer/platform/bindings/v8_object_constructor.h', - 'v8/include/v8.h' -]) - -TEMPLATE_FILE = 'external_reference_table.cc.tmpl' - -SNAPSHOTTED_INTERFACES = frozenset([ - 'Window', - 'EventTarget', - 'HTMLDocument', - 'Document', - 'Node', -]) - - -def parse_args(): - parser = argparse.ArgumentParser() - parser.add_argument( - '--idl-files-list', - type=str, - required=True, - help='file listing IDL files') - parser.add_argument( - '--output', type=str, required=True, help='output file path') - parser.add_argument( - '--info-dir', - type=str, - required=True, - help='directory contains component info') - parser.add_argument( - '--cache-dir', type=str, required=True, help='cache directory') - parser.add_argument( - '--target-component', type=str, required=True, help='target component') - return parser.parse_known_args() - - -# This class creates a Jinja template context about an interface. -class InterfaceTemplateContextBuilder(object): - def __init__(self, opts, info_provider): - self._opts = opts - self._info_provider = info_provider - - def create_interface_context(self, interface, component, interfaces): - '''Creates a Jinja context which is based on an interface.''' - - assert component in ['core', 'modules'] - - name = '%s%s' % (v8_utilities.cpp_name(interface), - 'Partial' if interface.is_partial else '') - - # Constructors - has_constructor_callback = False - if not interface.is_partial: - constructors = any(constructor.name == 'Constructor' - for constructor in interface.constructors) - custom_constructors = interface.custom_constructors - html_constructor = 'HTMLConstructor' in interface.extended_attributes - has_constructor_callback = constructors or custom_constructors or html_constructor - - attributes = [] - methods = [] - has_cross_origin_indexed_getter = False - has_cross_origin_named_enum = False - has_cross_origin_named_getter = False - has_cross_origin_named_setter = False - has_security_check = False - indexed_property_getter = None - is_global = False - named_property_getter = None - component_info = self._info_provider.component_info - if interface.name in SNAPSHOTTED_INTERFACES: - attributes = [ - v8_attributes.attribute_context(interface, attribute, - interfaces, component_info) - for attribute in interface.attributes - ] - methods = v8_interface.methods_context(interface, - component_info)['methods'] - is_global = 'Global' in interface.extended_attributes - - named_property_getter = v8_interface.property_getter( - interface.named_property_getter, ['name']) - indexed_property_getter = v8_interface.property_getter( - interface.indexed_property_getter, ['index']) - - if not interface.is_partial: - has_security_check = ( - 'CheckSecurity' in interface.extended_attributes - and interface.name != 'EventTarget') - has_cross_origin_named_getter = ( - any(method['is_cross_origin'] for method in methods) - or any(attribute['has_cross_origin_getter'] - for attribute in attributes)) - has_cross_origin_named_setter = any( - attribute['has_cross_origin_setter'] - for attribute in attributes) - has_cross_origin_indexed_getter = ( - indexed_property_getter - and indexed_property_getter['is_cross_origin']) - has_cross_origin_named_enum = has_cross_origin_named_getter \ - or has_cross_origin_named_setter - if (named_property_getter - and named_property_getter['is_cross_origin']): - has_cross_origin_named_getter = True - - return { - 'attributes': - attributes, - 'component': - component, - 'has_constructor_callback': - has_constructor_callback, - 'has_cross_origin_named_getter': - has_cross_origin_named_getter, - 'has_cross_origin_named_setter': - has_cross_origin_named_setter, - 'has_cross_origin_named_enumerator': - has_cross_origin_named_enum, - 'has_cross_origin_indexed_getter': - has_cross_origin_indexed_getter, - 'has_security_check': - has_security_check, - 'indexed_property_getter': - indexed_property_getter, - 'indexed_property_setter': - v8_interface.property_setter(interface.indexed_property_setter, - interface), - 'indexed_property_deleter': - v8_interface.property_deleter(interface.indexed_property_deleter), - 'internal_namespace': - v8_interface.internal_namespace(interface), - 'is_partial': - interface.is_partial, - 'methods': - methods, - 'name': - name, - 'named_constructor': - v8_interface.named_constructor_context(interface), - 'named_property_getter': - named_property_getter, - 'named_property_setter': - v8_interface.property_setter(interface.named_property_setter, - interface), - 'named_property_deleter': - v8_interface.property_deleter(interface.named_property_deleter), - 'v8_class': - v8_utilities.v8_class_name_or_partial(interface), - } - - -# This class applies a Jinja template and creates a .cpp file for the external reference table. -class ExternalReferenceTableGenerator(object): - def __init__(self, opts, info_provider): - self._opts = opts - self._info_provider = info_provider - self._reader = IdlReader(info_provider.interfaces_info, opts.cache_dir) - self._interface_contexts = {} - self._include_files = set(INCLUDES) - v8_types.set_component_dirs( - info_provider.interfaces_info['component_dirs']) - - # Creates a Jinja context from an IDL file. - def process_idl_file(self, idl_filename): - definitions = self._reader.read_idl_definitions(idl_filename) - for component in definitions: - target_definitions = definitions[component] - interfaces = target_definitions.interfaces - first_name = target_definitions.first_name - if first_name in interfaces.keys(): - interface = interfaces[first_name] - self._process_interface(interface, component, interfaces) - - # Creates a Jinja context from an interface. Some interfaces are not used - # in V8 context snapshot, so we can skip them. - def _process_interface(self, interface, component, interfaces): - def has_impl(interface): - component_info = self._info_provider.component_info - runtime_features = component_info['runtime_enabled_features'] - # Non legacy callback interface does not provide V8 callbacks. - if interface.is_callback: - return len(interface.constants) > 0 - if v8_utilities.runtime_enabled_feature_name( - interface, runtime_features): - return False - if 'Exposed' not in interface.extended_attributes: - return True - return any( - exposure.exposed == 'Window' - and exposure.runtime_enabled is None - for exposure in interface.extended_attributes['Exposed']) - - if not has_impl(interface): - return - - context_builder = InterfaceTemplateContextBuilder( - self._opts, self._info_provider) - context = context_builder.create_interface_context( - interface, component, interfaces) - name = '%s%s' % (interface.name, - 'Partial' if interface.is_partial else '') - self._interface_contexts[name] = context - - # Do not include unnecessary header files. - if not context['attributes'] and not context['named_property_setter']: - return - - include_file = 'third_party/blink/renderer/bindings/%s/v8/%s.h' % ( - component, utilities.to_snake_case(context['v8_class'])) - self._include_files.add(include_file) - - # Gathers all interface-dependent information and returns as a Jinja template context. - def _create_template_context(self): - interfaces = [] - for name in sorted(self._interface_contexts): - interfaces.append(self._interface_contexts[name]) - header_path = 'third_party/blink/renderer/bindings/modules/v8/v8_context_snapshot_external_references.h' - include_files = list(self._include_files) - return { - 'class': 'V8ContextSnapshotExternalReferences', - 'interfaces': interfaces, - 'include_files': sorted(include_files), - 'this_include_header_path': header_path, - 'code_generator': os.path.basename(__file__), - 'jinja_template_filename': TEMPLATE_FILE - } - - # Applies a Jinja template on a context and generates a C++ code. - def generate(self): - jinja_env = initialize_jinja_env(self._opts.cache_dir) - context = self._create_template_context() - cpp_template = jinja_env.get_template(TEMPLATE_FILE) - cpp_text = cpp_template.render(context) - return cpp_text - - -def main(): - opts, _ = parse_args() - # TODO(peria): get rid of |info_provider| - info_provider = create_component_info_provider(opts.info_dir, - opts.target_component) - generator = ExternalReferenceTableGenerator(opts, info_provider) - - idl_files = utilities.read_idl_files_list_from_file(opts.idl_files_list) - for idl_file in idl_files: - generator.process_idl_file(idl_file) - output_code = generator.generate() - output_path = opts.output - write_file(output_code, output_path) - - -if __name__ == '__main__': - main()
diff --git a/third_party/blink/renderer/bindings/scripts/idl_compiler.py b/third_party/blink/renderer/bindings/scripts/idl_compiler.py deleted file mode 100755 index 22ac9c29..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_compiler.py +++ /dev/null
@@ -1,205 +0,0 @@ -#!/usr/bin/env python -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Compile an .idl file to Blink V8 bindings (.h and .cpp files). - -Design doc: https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLCompiler.md -""" - -import abc -from optparse import OptionParser -import os -import sys - -from code_generator_v8 import CodeGeneratorDictionaryImpl -from code_generator_v8 import CodeGeneratorV8 -from code_generator_v8 import CodeGeneratorUnionType -from code_generator_v8 import CodeGeneratorCallbackFunction -from idl_reader import IdlReader -from utilities import create_component_info_provider -from utilities import read_idl_files_list_from_file -from utilities import write_file - - -def parse_options(): - parser = OptionParser() - parser.add_option( - '--cache-directory', - help='cache directory, defaults to output directory') - parser.add_option('--generate-impl', action='store_true', default=False) - parser.add_option('--generate-impl-skip-callback-function', - action='store_true', - default=False) - parser.add_option( - '--read-idl-list-from-file', action='store_true', default=False) - parser.add_option('--output-directory') - parser.add_option('--impl-output-directory') - parser.add_option('--info-dir') - # FIXME: We should always explicitly specify --target-component and - # remove the default behavior. - parser.add_option( - '--target-component', - type='choice', - choices=['core', 'modules'], - help='target component to generate code, defaults to ' - 'component of input idl file') - # ensure output comes last, so command line easy to parse via regexes - parser.disable_interspersed_args() - - options, args = parser.parse_args() - if options.output_directory is None: - parser.error('Must specify output directory using --output-directory.') - if len(args) != 1: - parser.error( - 'Must specify exactly 1 input file as argument, but %d given.' % - len(args)) - idl_filename = os.path.realpath(args[0]) - return options, idl_filename - - -class IdlCompiler(object): - """The IDL Compiler. - - """ - __metaclass__ = abc.ABCMeta - - def __init__(self, - output_directory, - cache_directory=None, - code_generator_class=None, - info_provider=None, - target_component=None): - """ - Args: - output_directory: directory to put output files. - cache_directory: directory which contains PLY caches. - code_generator_class: code generator class to be used. - info_provider: component-specific information provider. - target_component: component to be processed. - """ - self.cache_directory = cache_directory - self.info_provider = info_provider - self.output_directory = output_directory - self.target_component = target_component - self.reader = IdlReader(info_provider.interfaces_info, cache_directory) - self.code_generator = code_generator_class( - self.info_provider, self.cache_directory, self.output_directory) - - def compile_and_write(self, idl_filename): - definitions = self.reader.read_idl_definitions(idl_filename) - target_definitions = definitions[self.target_component] - interface_name = target_definitions.first_name - output_code_list = self.code_generator.generate_code( - target_definitions, interface_name) - - # Generator may choose to omit the file. - if output_code_list is None: - return - - for output_path, output_code in output_code_list: - write_file(output_code, output_path) - - def compile_file(self, idl_filename): - self.compile_and_write(idl_filename) - - -def generate_bindings(code_generator_class, info_provider, options, - input_filenames): - idl_compiler = IdlCompiler( - output_directory=options.output_directory, - cache_directory=options.cache_directory, - code_generator_class=code_generator_class, - info_provider=info_provider, - target_component=options.target_component) - - for idl_filename in input_filenames: - idl_compiler.compile_file(idl_filename) - - -def generate_dictionary_impl(code_generator_class, info_provider, options, - input_filenames): - idl_compiler = IdlCompiler( - output_directory=options.impl_output_directory, - cache_directory=options.cache_directory, - code_generator_class=code_generator_class, - info_provider=info_provider, - target_component=options.target_component) - - for idl_filename in input_filenames: - idl_compiler.compile_file(idl_filename) - - -def generate_union_type_containers(code_generator_class, info_provider, - options): - generator = code_generator_class(info_provider, options.cache_directory, - options.output_directory, - options.target_component) - output_code_list = generator.generate_code() - for output_path, output_code in output_code_list: - write_file(output_code, output_path) - - -def generate_callback_function_impl(code_generator_class, info_provider, - options): - generator = code_generator_class(info_provider, options.cache_directory, - options.output_directory, - options.target_component) - output_code_list = generator.generate_code() - for output_path, output_code in output_code_list: - write_file(output_code, output_path) - - -def main(): - options, input_filename = parse_options() - info_provider = create_component_info_provider(options.info_dir, - options.target_component) - if options.generate_impl or options.read_idl_list_from_file: - # |input_filename| should be a file which contains a list of IDL - # dictionary paths. - input_filenames = read_idl_files_list_from_file(input_filename) - else: - input_filenames = [input_filename] - - if options.generate_impl: - if not info_provider.interfaces_info: - raise Exception('Interfaces info is required to generate ' - 'impl classes') - generate_dictionary_impl(CodeGeneratorDictionaryImpl, info_provider, - options, input_filenames) - generate_union_type_containers(CodeGeneratorUnionType, info_provider, - options) - if not options.generate_impl_skip_callback_function: - generate_callback_function_impl(CodeGeneratorCallbackFunction, - info_provider, options) - else: - generate_bindings(CodeGeneratorV8, info_provider, options, - input_filenames) - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/third_party/blink/renderer/bindings/scripts/idl_definitions.py b/third_party/blink/renderer/bindings/scripts/idl_definitions.py deleted file mode 100644 index 4ebf537..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_definitions.py +++ /dev/null
@@ -1,1251 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=relative-import -"""Blink IDL Intermediate Representation (IR) classes. - -Classes are primarily constructors, which build an IdlDefinitions object -(and various contained objects) from an AST (produced by blink_idl_parser). - -IR stores typedefs and they are resolved by the code generator. - -Typedef resolution uses some auxiliary classes and OOP techniques to make this -a generic call. See TypedefResolver class in code_generator_v8.py. - -Class hierarchy (mostly containment, '<' for inheritance): - -IdlDefinitions - IdlCallbackFunction < TypedObject - IdlEnum :: FIXME: remove, just use a dict for enums - IdlInterface - IdlAttribute < TypedObject - IdlConstant < TypedObject - IdlLiteral - IdlOperation < TypedObject - IdlArgument < TypedObject - IdlStringifier - IdlIterable < IdlIterableOrMaplikeOrSetlike - IdlMaplike < IdlIterableOrMaplikeOrSetlike - IdlSetlike < IdlIterableOrMaplikeOrSetlike - -TypedObject :: Object with one or more attributes that is a type. - -IdlArgument is 'picklable', as it is stored in interfaces_info. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -import abc - -from idl_types import IdlAnnotatedType -from idl_types import IdlFrozenArrayType -from idl_types import IdlNullableType -from idl_types import IdlRecordType -from idl_types import IdlSequenceType -from idl_types import IdlType -from idl_types import IdlUnionType - -SPECIAL_KEYWORD_LIST = ['GETTER', 'SETTER', 'DELETER'] - -################################################################################ -# TypedObject -################################################################################ - - -class TypedObject(object): - """Object with a type, such as an Attribute or Operation (return value). - - The type can be an actual type, or can be a typedef, which must be resolved - by the TypedefResolver before passing data to the code generator. - """ - __metaclass__ = abc.ABCMeta - idl_type_attributes = ('idl_type', ) - - -################################################################################ -# Definitions (main container class) -################################################################################ - - -class IdlDefinitions(object): - def __init__(self, node): - """Args: node: AST root node, class == 'File'""" - self.callback_functions = {} - self.dictionaries = {} - self.enumerations = {} - self.includes = [] - self.interfaces = {} - self.first_name = None - self.typedefs = {} - - node_class = node.GetClass() - if node_class != 'File': - raise ValueError('Unrecognized node class: %s' % node_class) - - children = node.GetChildren() - for child in children: - child_class = child.GetClass() - if child_class == 'Interface' or child_class == 'Namespace': - interface = IdlInterface(child) - self.interfaces[interface.name] = interface - if not self.first_name: - self.first_name = interface.name - elif child_class == 'Typedef': - typedef = IdlTypedef(child) - self.typedefs[typedef.name] = typedef - elif child_class == 'Enum': - enumeration = IdlEnum(child) - self.enumerations[enumeration.name] = enumeration - elif child_class == 'Callback': - callback_function = IdlCallbackFunction(child) - self.callback_functions[callback_function. - name] = callback_function - elif child_class == 'Includes': - self.includes.append(IdlIncludes(child)) - elif child_class == 'Dictionary': - dictionary = IdlDictionary(child) - self.dictionaries[dictionary.name] = dictionary - if not self.first_name: - self.first_name = dictionary.name - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - def accept(self, visitor): - visitor.visit_definitions(self) - for interface in self.interfaces.values(): - interface.accept(visitor) - for callback_function in self.callback_functions.values(): - callback_function.accept(visitor) - for dictionary in self.dictionaries.values(): - dictionary.accept(visitor) - for enumeration in self.enumerations.values(): - enumeration.accept(visitor) - for include in self.includes: - include.accept(visitor) - for typedef in self.typedefs.values(): - typedef.accept(visitor) - - def update(self, other): - """Update with additional IdlDefinitions.""" - for interface_name, new_interface in other.interfaces.items(): - if not new_interface.is_partial: - # Add as new interface - self.interfaces[interface_name] = new_interface - continue - - # Merge partial to existing interface - try: - self.interfaces[interface_name].merge(new_interface) - except KeyError: - raise Exception('Tried to merge partial interface for {0}, ' - 'but no existing interface by that name'. - format(interface_name)) - - # Merge callbacks and enumerations - self.enumerations.update(other.enumerations) - self.callback_functions.update(other.callback_functions) - - -################################################################################ -# Callback Functions -################################################################################ - - -class IdlCallbackFunction(TypedObject): - def __init__(self, node): - children = node.GetChildren() - num_children = len(children) - if num_children < 2 or num_children > 3: - raise ValueError('Expected 2 or 3 children, got %s' % num_children) - type_node = children[0] - arguments_node = children[1] - if num_children == 3: - ext_attributes_node = children[2] - self.extended_attributes = ( - ext_attributes_node_to_extended_attributes(ext_attributes_node) - ) - else: - self.extended_attributes = {} - arguments_node_class = arguments_node.GetClass() - if arguments_node_class != 'Arguments': - raise ValueError( - 'Expected Arguments node, got %s' % arguments_node_class) - - self.name = node.GetName() - self.idl_type = type_node_to_type(type_node) - self.arguments = arguments_node_to_arguments(arguments_node) - - def accept(self, visitor): - visitor.visit_callback_function(self) - for argument in self.arguments: - argument.accept(visitor) - - -################################################################################ -# Dictionary -################################################################################ - - -class IdlDictionary(object): - def __init__(self, node): - self.extended_attributes = {} - self.is_partial = bool(node.GetProperty('PARTIAL')) - self.name = node.GetName() - self.members = [] - self.parent = None - for child in node.GetChildren(): - child_class = child.GetClass() - if child_class == 'Inherit': - self.parent = child.GetName() - elif child_class == 'Key': - self.members.append(IdlDictionaryMember(child)) - elif child_class == 'ExtAttributes': - self.extended_attributes = ( - ext_attributes_node_to_extended_attributes(child)) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - def accept(self, visitor): - visitor.visit_dictionary(self) - for member in self.members: - member.accept(visitor) - - -class IdlDictionaryMember(TypedObject): - def __init__(self, node): - self.default_value = None - self.extended_attributes = {} - self.idl_type = None - self.is_required = bool(node.GetProperty('REQUIRED')) - self.name = node.GetName() - for child in node.GetChildren(): - child_class = child.GetClass() - if child_class == 'Type': - self.idl_type = type_node_to_type(child) - elif child_class == 'Default': - self.default_value = default_node_to_idl_literal(child) - elif child_class == 'ExtAttributes': - self.extended_attributes = ( - ext_attributes_node_to_extended_attributes(child)) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - def accept(self, visitor): - visitor.visit_dictionary_member(self) - - -################################################################################ -# Enumerations -################################################################################ - - -class IdlEnum(object): - def __init__(self, node): - self.name = node.GetName() - self.values = [] - for child in node.GetChildren(): - self.values.append(child.GetName()) - - def accept(self, visitor): - visitor.visit_enumeration(self) - - -################################################################################ -# Typedefs -################################################################################ - - -class IdlTypedef(object): - idl_type_attributes = ('idl_type', ) - - def __init__(self, node): - self.name = node.GetName() - self.idl_type = typedef_node_to_type(node) - - def accept(self, visitor): - visitor.visit_typedef(self) - - -################################################################################ -# Interfaces -################################################################################ - - -class IdlInterface(object): - def __init__(self, node): - self.attributes = [] - self.constants = [] - self.constructors = [] - self.custom_constructors = [] - self.extended_attributes = {} - self.operations = [] - self.parent = None - self.stringifier = None - self.iterable = None - self.has_indexed_elements = False - self.has_named_property_getter = False - self.maplike = None - self.setlike = None - self.original_interface = None - self.partial_interfaces = [] - - self.is_callback = bool(node.GetProperty('CALLBACK')) - self.is_partial = bool(node.GetProperty('PARTIAL')) - self.is_mixin = bool(node.GetProperty('MIXIN')) - self.name = node.GetName() - self.idl_type = IdlType(self.name) - - has_indexed_property_getter = False - has_integer_typed_length = False - - # These are used to support both constructor operations and old style - # [Constructor] extended attributes. Ideally we should do refactoring - # for constructor code generation but we will use a new code generator - # soon so this kind of workaround should be fine. - constructor_operations = [] - custom_constructor_operations = [] - constructor_operations_extended_attributes = {} - - def is_invalid_attribute_type(idl_type): - return idl_type.is_callback_function or \ - idl_type.is_dictionary or \ - idl_type.is_record_type or \ - idl_type.is_sequence_type - - children = node.GetChildren() - for child in children: - child_class = child.GetClass() - if child_class == 'Attribute': - attr = IdlAttribute(child) - if is_invalid_attribute_type(attr.idl_type): - raise ValueError( - 'Type "%s" cannot be used as an attribute.' % - attr.idl_type) - if attr.idl_type.is_integer_type and attr.name == 'length': - has_integer_typed_length = True - self.attributes.append(attr) - elif child_class == 'Const': - self.constants.append(IdlConstant(child)) - elif child_class == 'ExtAttributes': - extended_attributes = ext_attributes_node_to_extended_attributes( - child) - self.constructors, self.custom_constructors = ( - extended_attributes_to_constructors(extended_attributes)) - clear_constructor_attributes(extended_attributes) - self.extended_attributes = extended_attributes - elif child_class == 'Operation': - op = IdlOperation(child) - if 'getter' in op.specials: - if str(op.arguments[0].idl_type) == 'unsigned long': - has_indexed_property_getter = True - elif str(op.arguments[0].idl_type) == 'DOMString': - self.has_named_property_getter = True - self.operations.append(op) - elif child_class == 'Constructor': - operation = constructor_operation_from_node(child) - if operation.is_custom: - custom_constructor_operations.append(operation.constructor) - else: - # Check extended attributes consistency when we previously - # handle constructor operations. - if constructor_operations: - check_constructor_operations_extended_attributes( - constructor_operations_extended_attributes, - operation.extended_attributes) - constructor_operations.append(operation.constructor) - constructor_operations_extended_attributes.update( - operation.extended_attributes) - elif child_class == 'Inherit': - self.parent = child.GetName() - elif child_class == 'Stringifier': - self.stringifier = IdlStringifier(child) - self.process_stringifier() - elif child_class == 'Iterable': - self.iterable = IdlIterable(child) - elif child_class == 'AsyncIterable': - pass # 'async iterable' is not implemented. - elif child_class == 'Maplike': - self.maplike = IdlMaplike(child) - elif child_class == 'Setlike': - self.setlike = IdlSetlike(child) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - if len(list(filter(None, - [self.iterable, self.maplike, self.setlike]))) > 1: - raise ValueError( - 'Interface can only have one of iterable<>, maplike<> and setlike<>.' - ) - - # TODO(rakuco): This validation logic should be in v8_interface according to bashi@. - # At the moment, doing so does not work because several IDL files are partial Window - # interface definitions, and interface_dependency_resolver.py doesn't seem to have any logic - # to prevent these partial interfaces from resetting has_named_property to False. - if 'LegacyUnenumerableNamedProperties' in self.extended_attributes and \ - not self.has_named_property_getter: - raise ValueError( - '[LegacyUnenumerableNamedProperties] can be used only in interfaces ' - 'that support named properties.') - - if has_integer_typed_length and has_indexed_property_getter: - self.has_indexed_elements = True - else: - if self.iterable is not None and self.iterable.key_type is None: - raise ValueError( - 'Value iterators (iterable<V>) must be accompanied by an indexed ' - 'property getter and an integer-typed length attribute.') - - if 'LegacyUnforgeable' in self.extended_attributes: - raise ValueError( - '[LegacyUnforgeable] cannot appear on interfaces.') - - if constructor_operations or custom_constructor_operations: - if self.constructors or self.custom_constructors: - raise ValueError('Detected mixed [Constructor] and consructor ' - 'operations. Do not use both in a single ' - 'interface.') - extended_attributes = ( - convert_constructor_operations_extended_attributes( - constructor_operations_extended_attributes)) - if any(name in extended_attributes.keys() - for name in self.extended_attributes.keys()): - raise ValueError('Detected mixed extended attributes for ' - 'both [Constructor] and constructor ' - 'operations. Do not use both in a single ' - 'interface') - self.constructors = constructor_operations - self.custom_constructors = custom_constructor_operations - self.extended_attributes.update(extended_attributes) - - def accept(self, visitor): - visitor.visit_interface(self) - for attribute in self.attributes: - attribute.accept(visitor) - for constant in self.constants: - constant.accept(visitor) - for constructor in self.constructors: - constructor.accept(visitor) - for custom_constructor in self.custom_constructors: - custom_constructor.accept(visitor) - for operation in self.operations: - operation.accept(visitor) - if self.iterable: - self.iterable.accept(visitor) - elif self.maplike: - self.maplike.accept(visitor) - elif self.setlike: - self.setlike.accept(visitor) - - def process_stringifier(self): - """Add the stringifier's attribute or named operation child, if it has - one, as a regular attribute/operation of this interface.""" - if self.stringifier.attribute: - self.attributes.append(self.stringifier.attribute) - elif self.stringifier.operation: - self.operations.append(self.stringifier.operation) - - def merge(self, other): - """Merge in another interface's members (e.g., partial interface)""" - self.attributes.extend(other.attributes) - self.constants.extend(other.constants) - self.operations.extend(other.operations) - if self.stringifier is None: - self.stringifier = other.stringifier - - -################################################################################ -# Attributes -################################################################################ - - -class IdlAttribute(TypedObject): - def __init__(self, node=None): - self.is_read_only = bool( - node.GetProperty('READONLY')) if node else False - self.is_static = bool(node.GetProperty('STATIC')) if node else False - self.name = node.GetName() if node else None - self.idl_type = None - self.extended_attributes = {} - # In what interface the attribute is (originally) defined when the - # attribute is inherited from an ancestor interface. - self.defined_in = None - - if node: - children = node.GetChildren() - for child in children: - child_class = child.GetClass() - if child_class == 'Type': - self.idl_type = type_node_to_type(child) - elif child_class == 'ExtAttributes': - self.extended_attributes = ext_attributes_node_to_extended_attributes( - child) - else: - raise ValueError( - 'Unrecognized node class: %s' % child_class) - - if 'LegacyUnforgeable' in self.extended_attributes and self.is_static: - raise ValueError( - '[LegacyUnforgeable] cannot appear on static attributes.') - - def accept(self, visitor): - visitor.visit_attribute(self) - - def __lt__(self, other): - return self.name < other.name - - -################################################################################ -# Constants -################################################################################ - - -class IdlConstant(TypedObject): - def __init__(self, node): - children = node.GetChildren() - num_children = len(children) - if num_children < 2 or num_children > 3: - raise ValueError('Expected 2 or 3 children, got %s' % num_children) - type_node = children[0] - value_node = children[1] - value_node_class = value_node.GetClass() - if value_node_class != 'Value': - raise ValueError('Expected Value node, got %s' % value_node_class) - - self.name = node.GetName() - # ConstType is more limited than Type, so subtree is smaller and - # we don't use the full type_node_to_type function. - self.idl_type = type_node_inner_to_type(type_node) - self.value = value_node.GetProperty('VALUE') - # In what interface the attribute is (originally) defined when the - # attribute is inherited from an ancestor interface. - self.defined_in = None - - if num_children == 3: - ext_attributes_node = children[2] - self.extended_attributes = ext_attributes_node_to_extended_attributes( - ext_attributes_node) - else: - self.extended_attributes = {} - - def accept(self, visitor): - visitor.visit_constant(self) - - -################################################################################ -# Literals -################################################################################ - - -class IdlLiteral(object): - def __init__(self, idl_type, value): - self.idl_type = idl_type - self.value = value - self.is_null = False - - def __str__(self): - if self.idl_type == 'DOMString': - if self.value: - return '"%s"' % self.value - else: - return 'WTF::g_empty_string' - if self.idl_type == 'integer': - return '%d' % self.value - if self.idl_type == 'float': - return '%g' % self.value - if self.idl_type == 'boolean': - return 'true' if self.value else 'false' - if self.idl_type == 'dictionary': - return self.value - raise ValueError('Unsupported literal type: %s' % self.idl_type) - - -class IdlLiteralNull(IdlLiteral): - def __init__(self): - self.idl_type = 'NULL' - self.value = None - self.is_null = True - - def __str__(self): - return 'nullptr' - - -def default_node_to_idl_literal(node): - idl_type = node.GetProperty('TYPE') - value = node.GetProperty('VALUE') - if idl_type == 'DOMString': - if '"' in value or '\\' in value: - raise ValueError('Unsupported string value: %r' % value) - return IdlLiteral(idl_type, value) - if idl_type == 'integer': - return IdlLiteral(idl_type, int(value, base=0)) - if idl_type == 'float': - return IdlLiteral(idl_type, float(value)) - if idl_type in ['boolean', 'sequence']: - return IdlLiteral(idl_type, value) - if idl_type == 'NULL': - return IdlLiteralNull() - if idl_type == 'dictionary': - return IdlLiteral(idl_type, value) - raise ValueError('Unrecognized default value type: %s' % idl_type) - - -################################################################################ -# Operations -################################################################################ - - -class IdlOperation(TypedObject): - def __init__(self, node=None): - self.arguments = [] - self.extended_attributes = {} - self.specials = [] - self.is_constructor = False - self.idl_type = None - self.is_static = False - # In what interface the attribute is (originally) defined when the - # attribute is inherited from an ancestor interface. - self.defined_in = None - - if not node: - return - - self.name = node.GetName() - - self.is_static = bool(node.GetProperty('STATIC')) - property_dictionary = node.GetProperties() - for special_keyword in SPECIAL_KEYWORD_LIST: - if special_keyword in property_dictionary: - self.specials.append(special_keyword.lower()) - - children = node.GetChildren() - for child in children: - child_class = child.GetClass() - if child_class == 'Arguments': - self.arguments = arguments_node_to_arguments(child) - elif child_class == 'Type': - self.idl_type = type_node_to_type(child) - elif child_class == 'ExtAttributes': - self.extended_attributes = ext_attributes_node_to_extended_attributes( - child) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - if 'LegacyUnforgeable' in self.extended_attributes and self.is_static: - raise ValueError( - '[LegacyUnforgeable] cannot appear on static operations.') - - @classmethod - def constructor_from_arguments_node(cls, name, arguments_node): - constructor = cls() - constructor.name = name - constructor.arguments = arguments_node_to_arguments(arguments_node) - constructor.is_constructor = True - return constructor - - def accept(self, visitor): - visitor.visit_operation(self) - for argument in self.arguments: - argument.accept(visitor) - - -################################################################################ -# Arguments -################################################################################ - - -class IdlArgument(TypedObject): - def __init__(self, node=None): - self.extended_attributes = {} - self.idl_type = None - self.is_optional = False # syntax: (optional T) - self.is_variadic = False # syntax: (T...) - self.default_value = None - - if not node: - return - - self.is_optional = node.GetProperty('OPTIONAL') - self.name = node.GetName() - - children = node.GetChildren() - for child in children: - child_class = child.GetClass() - if child_class == 'Type': - self.idl_type = type_node_to_type(child) - elif child_class == 'ExtAttributes': - self.extended_attributes = ext_attributes_node_to_extended_attributes( - child) - elif child_class == 'Argument': - child_name = child.GetName() - if child_name != '...': - raise ValueError( - 'Unrecognized Argument node; expected "...", got "%s"' - % child_name) - self.is_variadic = bool(child.GetProperty('ELLIPSIS')) - elif child_class == 'Default': - self.default_value = default_node_to_idl_literal(child) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - def accept(self, visitor): - visitor.visit_argument(self) - - -def arguments_node_to_arguments(node): - # [Constructor] and [CustomConstructor] without arguments (the bare form) - # have None instead of an arguments node, but have the same meaning as using - # an empty argument list, [Constructor()], so special-case this. - # http://www.w3.org/TR/WebIDL/#Constructor - if node is None: - return [] - return [IdlArgument(argument_node) for argument_node in node.GetChildren()] - - -################################################################################ -# Stringifiers -################################################################################ - - -class IdlStringifier(object): - def __init__(self, node): - self.attribute = None - self.operation = None - self.extended_attributes = {} - - for child in node.GetChildren(): - child_class = child.GetClass() - if child_class == 'Attribute': - self.attribute = IdlAttribute(child) - elif child_class == 'Operation': - operation = IdlOperation(child) - if operation.name: - self.operation = operation - elif child_class == 'ExtAttributes': - self.extended_attributes = ext_attributes_node_to_extended_attributes( - child) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - # Copy the stringifier's extended attributes (such as [Unforgable]) onto - # the underlying attribute or operation, if there is one. - if self.attribute or self.operation: - (self.attribute or self.operation).extended_attributes.update( - self.extended_attributes) - - -################################################################################ -# Iterable, Maplike, Setlike -################################################################################ - - -class IdlIterableOrMaplikeOrSetlike(TypedObject): - def __init__(self, node): - self.extended_attributes = {} - self.type_children = [] - - for child in node.GetChildren(): - child_class = child.GetClass() - if child_class == 'ExtAttributes': - self.extended_attributes = ext_attributes_node_to_extended_attributes( - child) - elif child_class == 'Type': - self.type_children.append(child) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - -class IdlIterable(IdlIterableOrMaplikeOrSetlike): - idl_type_attributes = ('key_type', 'value_type') - - def __init__(self, node): - super(IdlIterable, self).__init__(node) - - if len(self.type_children) == 1: - self.key_type = None - self.value_type = type_node_to_type(self.type_children[0]) - elif len(self.type_children) == 2: - self.key_type = type_node_to_type(self.type_children[0]) - self.value_type = type_node_to_type(self.type_children[1]) - else: - raise ValueError('Unexpected number of type children: %d' % len( - self.type_children)) - del self.type_children - - def accept(self, visitor): - visitor.visit_iterable(self) - - -class IdlMaplike(IdlIterableOrMaplikeOrSetlike): - idl_type_attributes = ('key_type', 'value_type') - - def __init__(self, node): - super(IdlMaplike, self).__init__(node) - - self.is_read_only = bool(node.GetProperty('READONLY')) - - if len(self.type_children) == 2: - self.key_type = type_node_to_type(self.type_children[0]) - self.value_type = type_node_to_type(self.type_children[1]) - else: - raise ValueError( - 'Unexpected number of children: %d' % len(self.type_children)) - del self.type_children - - def accept(self, visitor): - visitor.visit_maplike(self) - - -class IdlSetlike(IdlIterableOrMaplikeOrSetlike): - idl_type_attributes = ('value_type', ) - - def __init__(self, node): - super(IdlSetlike, self).__init__(node) - - self.is_read_only = bool(node.GetProperty('READONLY')) - - if len(self.type_children) == 1: - self.value_type = type_node_to_type(self.type_children[0]) - else: - raise ValueError( - 'Unexpected number of children: %d' % len(self.type_children)) - del self.type_children - - def accept(self, visitor): - visitor.visit_setlike(self) - - -################################################################################ -# Includes statements -################################################################################ - - -class IdlIncludes(object): - def __init__(self, node): - self.interface = node.GetName() - self.mixin = node.GetProperty('REFERENCE') - - def accept(self, visitor): - visitor.visit_include(self) - - -################################################################################ -# Extended attributes -################################################################################ - - -class Exposure(object): - """An Exposure holds one Exposed or RuntimeEnabled condition. - Each exposure has two properties: exposed and runtime_enabled. - Exposure(e, r) corresponds to [Exposed(e r)]. Exposure(e) corresponds to - [Exposed=e]. - """ - - def __init__(self, exposed, runtime_enabled=None): - self.exposed = exposed - self.runtime_enabled = runtime_enabled - - -def ext_attributes_node_to_extended_attributes(node): - """ - Returns: - Dictionary of {ExtAttributeName: ExtAttributeValue}. - Value is usually a string, with these exceptions: - Constructors: value is a list of Arguments nodes, corresponding to - possible signatures of the constructor. - CustomConstructors: value is a list of Arguments nodes, corresponding to - possible signatures of the custom constructor. - NamedConstructor: value is a Call node, corresponding to the single - signature of the named constructor. - """ - # Primarily just make a dictionary from the children. - # The only complexity is handling various types of constructors: - # Constructors and Custom Constructors can have duplicate entries due to - # overloading, and thus are stored in temporary lists. - # However, Named Constructors cannot be overloaded, and thus do not have - # a list. - # TODO(bashi): Remove |constructors| and |custom_constructors|. - constructors = [] - custom_constructors = [] - extended_attributes = {} - - def child_node(extended_attribute_node): - children = extended_attribute_node.GetChildren() - if not children: - return None - if len(children) > 1: - raise ValueError( - 'ExtAttributes node with %s children, expected at most 1' % - len(children)) - return children[0] - - extended_attribute_node_list = node.GetChildren() - for extended_attribute_node in extended_attribute_node_list: - name = extended_attribute_node.GetName() - child = child_node(extended_attribute_node) - child_class = child and child.GetClass() - if name == 'Constructor': - raise ValueError('[Constructor] is deprecated. Use constructor ' - 'operations') - elif name == 'CustomConstructor': - raise ValueError('[CustomConstructor] is deprecated. Use ' - 'constructor operations with [Custom]') - elif name == 'NamedConstructor': - if child_class and child_class != 'Call': - raise ValueError( - '[NamedConstructor] only supports Call as child, but has child of class: %s' - % child_class) - extended_attributes[name] = child - elif name == 'Exposed': - if child_class and child_class != 'Arguments': - raise ValueError( - '[Exposed] only supports Arguments as child, but has child of class: %s' - % child_class) - exposures = [] - if child_class == 'Arguments': - exposures = [ - Exposure( - exposed=str(arg.idl_type), runtime_enabled=arg.name) - for arg in arguments_node_to_arguments(child) - ] - else: - value = extended_attribute_node.GetProperty('VALUE') - if type(value) is str: - exposures = [Exposure(exposed=value)] - else: - exposures = [Exposure(exposed=v) for v in value] - extended_attributes[name] = exposures - elif child: - raise ValueError( - 'ExtAttributes node with unexpected children: %s' % name) - else: - value = extended_attribute_node.GetProperty('VALUE') - extended_attributes[name] = value - - # Store constructors and custom constructors in special list attributes, - # which are deleted later. Note plural in key. - if constructors: - extended_attributes['Constructors'] = constructors - if custom_constructors: - extended_attributes['CustomConstructors'] = custom_constructors - - return extended_attributes - - -def extended_attributes_to_constructors(extended_attributes): - """Returns constructors and custom_constructors (lists of IdlOperations). - - Auxiliary function for IdlInterface.__init__. - """ - - # TODO(bashi): Remove 'Constructors' and 'CustomConstructors'. - - constructor_list = extended_attributes.get('Constructors', []) - constructors = [ - IdlOperation.constructor_from_arguments_node('Constructor', - arguments_node) - for arguments_node in constructor_list - ] - - custom_constructor_list = extended_attributes.get('CustomConstructors', []) - custom_constructors = [ - IdlOperation.constructor_from_arguments_node('CustomConstructor', - arguments_node) - for arguments_node in custom_constructor_list - ] - - if 'NamedConstructor' in extended_attributes: - # FIXME: support overloaded named constructors, and make homogeneous - name = 'NamedConstructor' - call_node = extended_attributes['NamedConstructor'] - extended_attributes['NamedConstructor'] = call_node.GetName() - children = call_node.GetChildren() - if len(children) != 1: - raise ValueError('NamedConstructor node expects 1 child, got %s.' % - len(children)) - arguments_node = children[0] - named_constructor = IdlOperation.constructor_from_arguments_node( - 'NamedConstructor', arguments_node) - # FIXME: should return named_constructor separately; appended for Perl - constructors.append(named_constructor) - - return constructors, custom_constructors - - -class ConstructorOperation(object): - """Represents a constructor operation. This is a tentative object used to - create constructors in IdlInterface. - """ - - def __init__(self, constructor, extended_attributes, is_custom): - self.constructor = constructor - self.extended_attributes = extended_attributes - self.is_custom = is_custom - - -def constructor_operation_from_node(node): - """Creates a ConstructorOperation from the given |node|. - """ - - arguments_node = None - extended_attributes = {} - - for child in node.GetChildren(): - child_class = child.GetClass() - if child_class == 'Arguments': - arguments_node = child - elif child_class == 'ExtAttributes': - extended_attributes = ext_attributes_node_to_extended_attributes( - child) - else: - raise ValueError('Unrecognized node class: %s' % child_class) - - if not arguments_node: - raise ValueError('Expected Arguments node for constructor operation') - - if 'Custom' in extended_attributes: - if extended_attributes['Custom']: - raise ValueError('[Custom] should not have a value on constructor ' - 'operations') - del extended_attributes['Custom'] - constructor = IdlOperation.constructor_from_arguments_node( - 'CustomConstructor', arguments_node) - return ConstructorOperation( - constructor, extended_attributes, is_custom=True) - else: - constructor = IdlOperation.constructor_from_arguments_node( - 'Constructor', arguments_node) - return ConstructorOperation( - constructor, extended_attributes, is_custom=False) - - -def check_constructor_operations_extended_attributes(current_attrs, new_attrs): - """Raises a ValueError if two extended attribute lists have different values - of constructor related attributes. - """ - - attrs_to_check = ['CallWith', 'RaisesException'] - for attr in attrs_to_check: - if current_attrs.get(attr) != new_attrs.get(attr): - raise ValueError('[{}] should have the same value on all ' - 'constructor operations'.format(attr)) - - -def convert_constructor_operations_extended_attributes(extended_attributes): - """Converts extended attributes specified on constructor operations to - extended attributes for an interface definition (e.g. [ConstructorCallWith]) - """ - - converted = {} - for name, value in extended_attributes.items(): - if name == "CallWith": - converted["ConstructorCallWith"] = value - elif name == "RaisesException": - if value: - raise ValueError( - '[RaisesException] should not have a value on ' - 'constructor operations') - converted["RaisesException"] = 'Constructor' - elif name == "MeasureAs": - converted["MeasureAs"] = value - elif name == "Measure": - converted["Measure"] = None - else: - raise ValueError( - '[{}] is not supported on constructor operations'.format(name)) - - return converted - - -def clear_constructor_attributes(extended_attributes): - # Deletes Constructor*s* (plural), sets Constructor (singular) - if 'Constructors' in extended_attributes: - del extended_attributes['Constructors'] - extended_attributes['Constructor'] = None - if 'CustomConstructors' in extended_attributes: - del extended_attributes['CustomConstructors'] - extended_attributes['CustomConstructor'] = None - - -################################################################################ -# Types -################################################################################ - - -def type_node_to_type(node): - children = node.GetChildren() - if len(children) != 1 and len(children) != 2: - raise ValueError( - 'Type node expects 1 or 2 child(ren), got %d.' % len(children)) - - base_type = type_node_inner_to_type(children[0]) - if len(children) == 2: - extended_attributes = ext_attributes_node_to_extended_attributes( - children[1]) - base_type = IdlAnnotatedType(base_type, extended_attributes) - - if node.GetProperty('NULLABLE'): - base_type = IdlNullableType(base_type) - - return base_type - - -def type_node_inner_to_type(node): - node_class = node.GetClass() - # Note Type*r*ef, not Typedef, meaning the type is an identifier, thus - # either a typedef shorthand (but not a Typedef declaration itself) or an - # interface type. We do not distinguish these, and just use the type name. - if node_class in ['PrimitiveType', 'StringType', 'Typeref']: - # unrestricted syntax: unrestricted double | unrestricted float - is_unrestricted = bool(node.GetProperty('UNRESTRICTED')) - return IdlType(node.GetName(), is_unrestricted=is_unrestricted) - elif node_class == 'Any': - return IdlType('any') - elif node_class in ['Sequence', 'FrozenArray']: - return sequence_node_to_type(node) - elif node_class == 'UnionType': - return union_type_node_to_idl_union_type(node) - elif node_class == 'Promise': - return IdlType('Promise') - elif node_class == 'Record': - return record_node_to_type(node) - raise ValueError('Unrecognized node class: %s' % node_class) - - -def record_node_to_type(node): - children = node.GetChildren() - if len(children) != 2: - raise ValueError('record<K,V> node expects exactly 2 children, got %d' - % (len(children))) - key_child = children[0] - value_child = children[1] - if key_child.GetClass() != 'StringType': - raise ValueError('Keys in record<K,V> nodes must be string types.') - if value_child.GetClass() != 'Type': - raise ValueError('Unrecognized node class for record<K,V> value: %s' % - value_child.GetClass()) - return IdlRecordType( - IdlType(key_child.GetName()), type_node_to_type(value_child)) - - -def sequence_node_to_type(node): - children = node.GetChildren() - class_name = node.GetClass() - if len(children) != 1: - raise ValueError('%s node expects exactly 1 child, got %s' % - (class_name, len(children))) - sequence_child = children[0] - sequence_child_class = sequence_child.GetClass() - if sequence_child_class != 'Type': - raise ValueError('Unrecognized node class: %s' % sequence_child_class) - element_type = type_node_to_type(sequence_child) - if class_name == 'Sequence': - sequence_type = IdlSequenceType(element_type) - elif class_name == 'FrozenArray': - sequence_type = IdlFrozenArrayType(element_type) - else: - raise ValueError('Unexpected node: %s' % class_name) - if node.GetProperty('NULLABLE'): - return IdlNullableType(sequence_type) - return sequence_type - - -def typedef_node_to_type(node): - children = node.GetChildren() - if len(children) != 1: - raise ValueError( - 'Typedef node with %s children, expected 1' % len(children)) - child = children[0] - child_class = child.GetClass() - if child_class != 'Type': - raise ValueError('Unrecognized node class: %s' % child_class) - return type_node_to_type(child) - - -def union_type_node_to_idl_union_type(node): - member_types = [ - type_node_to_type(member_type_node) - for member_type_node in node.GetChildren() - ] - return IdlUnionType(member_types) - - -################################################################################ -# Visitor -################################################################################ - - -class Visitor(object): - """Abstract visitor class for IDL definitions traverse.""" - - def visit_definitions(self, definitions): - pass - - def visit_typed_object(self, typed_object): - pass - - def visit_callback_function(self, callback_function): - self.visit_typed_object(callback_function) - - def visit_dictionary(self, dictionary): - pass - - def visit_dictionary_member(self, member): - self.visit_typed_object(member) - - def visit_enumeration(self, enumeration): - pass - - def visit_include(self, include): - pass - - def visit_interface(self, interface): - pass - - def visit_typedef(self, typedef): - self.visit_typed_object(typedef) - - def visit_attribute(self, attribute): - self.visit_typed_object(attribute) - - def visit_constant(self, constant): - self.visit_typed_object(constant) - - def visit_operation(self, operation): - self.visit_typed_object(operation) - - def visit_argument(self, argument): - self.visit_typed_object(argument) - - def visit_iterable(self, iterable): - self.visit_typed_object(iterable) - - def visit_maplike(self, maplike): - self.visit_typed_object(maplike) - - def visit_setlike(self, setlike): - self.visit_typed_object(setlike)
diff --git a/third_party/blink/renderer/bindings/scripts/idl_definitions_test.py b/third_party/blink/renderer/bindings/scripts/idl_definitions_test.py deleted file mode 100644 index e2a91843..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_definitions_test.py +++ /dev/null
@@ -1,19 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=import-error,print-statement,relative-import -"""Unit tests for idl_definitions.py.""" - -import unittest - -from idl_definitions import IdlAttribute - - -class IdlAttributeTest(unittest.TestCase): - def test_no_params(self): - try: - IdlAttribute() - except Exception as exception: # pylint: disable=broad-except - self.fail('Creating an IdlAttribute with no parameters raised' - 'an exception: {}.'.format(exception))
diff --git a/third_party/blink/renderer/bindings/scripts/idl_reader.py b/third_party/blink/renderer/bindings/scripts/idl_reader.py deleted file mode 100644 index b80eebd..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_reader.py +++ /dev/null
@@ -1,144 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Read an IDL file or complete IDL interface, producing an IdlDefinitions object. - -Design doc: -http://www.chromium.org/developers/design-documents/idl-compiler#TOC-Front-end -""" - -import os - -import blink_idl_parser -from blink_idl_parser import BlinkIDLParser -from idl_definitions import IdlDefinitions -from idl_validator import EXTENDED_ATTRIBUTES_RELATIVE_PATH, IDLInvalidExtendedAttributeError, IDLExtendedAttributeValidator -from interface_dependency_resolver import InterfaceDependencyResolver -from utilities import idl_filename_to_component -from utilities import to_snake_case - - -def validate_blink_idl_definitions(idl_filename, idl_file_basename, - definitions): - """Validate file contents with filename convention. - - The Blink IDL conventions are: - - If an IDL file defines an interface or a dictionary, - the IDL file must contain exactly one definition. The definition - name must agree with the file's basename, unless it is a partial - definition. (e.g., 'partial interface Foo' can be in FooBar.idl). - - An IDL file can contain typedefs and enums without having other - definitions. There is no filename convention in this case. - - Otherwise, an IDL file is invalid. - """ - targets = (list(definitions.interfaces.values()) + - list(definitions.dictionaries.values())) - number_of_targets = len(targets) - if number_of_targets > 1: - raise Exception( - 'Expected exactly 1 definition in file {0}, but found {1}'.format( - idl_filename, number_of_targets)) - if number_of_targets == 0: - number_of_definitions = (len(definitions.enumerations) + len( - definitions.typedefs) + len(definitions.callback_functions)) - if number_of_definitions == 0: - raise Exception('No definition found in %s. (Missing semicolon?)' % - idl_filename) - return - target = targets[0] - if target.is_partial: - return - if (target.name != idl_file_basename - and to_snake_case(target.name) != idl_file_basename): - raise Exception( - 'Definition name "{0}" disagrees with IDL file basename "{1}".'. - format(target.name, idl_file_basename)) - - -class IdlReader(object): - def __init__(self, interfaces_info=None, outputdir=''): - self.extended_attribute_validator = IDLExtendedAttributeValidator() - self.interfaces_info = interfaces_info - - if interfaces_info: - self.interface_dependency_resolver = InterfaceDependencyResolver( - interfaces_info, self) - else: - self.interface_dependency_resolver = None - - self.parser = BlinkIDLParser(outputdir=outputdir) - - def read_idl_definitions(self, idl_filename): - """Returns a dictionary whose key is component and value is an IdlDefinitions object for an IDL file, including all dependencies.""" - definitions = self.read_idl_file(idl_filename) - component = idl_filename_to_component(idl_filename) - - if not self.interface_dependency_resolver: - return {component: definitions} - - # This definitions should have a dictionary. No need to resolve any - # dependencies. - if not definitions.interfaces: - return {component: definitions} - - return self.interface_dependency_resolver.resolve_dependencies( - definitions, component) - - def read_idl_file(self, idl_filename): - """Returns an IdlDefinitions object for an IDL file, without any dependencies. - - The IdlDefinitions object is guaranteed to contain a single - IdlInterface; it may also contain other definitions, such as - callback functions and enumerations.""" - ast = blink_idl_parser.parse_file(self.parser, idl_filename) - if not ast: - raise Exception('Failed to parse %s' % idl_filename) - idl_file_basename, _ = os.path.splitext(os.path.basename(idl_filename)) - definitions = IdlDefinitions(ast) - - validate_blink_idl_definitions(idl_filename, idl_file_basename, - definitions) - - # Validate extended attributes - if not self.extended_attribute_validator: - return definitions - - try: - self.extended_attribute_validator.validate_extended_attributes( - definitions) - except IDLInvalidExtendedAttributeError as error: - raise IDLInvalidExtendedAttributeError(""" -IDL ATTRIBUTE ERROR in file: -%s: - %s -If you want to add a new IDL extended attribute, please add it to: - %s -and add an explanation to the Blink IDL documentation at: - http://www.chromium.org/blink/webidl/blink-idl-extended-attributes - """ % (idl_filename, str(error), EXTENDED_ATTRIBUTES_RELATIVE_PATH)) - - return definitions
diff --git a/third_party/blink/renderer/bindings/scripts/idl_types.py b/third_party/blink/renderer/bindings/scripts/idl_types.py deleted file mode 100644 index ab95e9c0..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_types.py +++ /dev/null
@@ -1,682 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""IDL type handling. - -Classes: -IdlTypeBase - IdlType - IdlUnionType - IdlArrayOrSequenceType - IdlSequenceType - IdlFrozenArrayType - IdlNullableType - IdlAnnotatedType - -IdlTypes are picklable because we store them in interfaces_info. -""" - -from collections import defaultdict - -################################################################################ -# IDL types -################################################################################ - -INTEGER_TYPES = frozenset([ - # http://www.w3.org/TR/WebIDL/#dfn-integer-type - 'byte', - 'octet', - 'short', - 'unsigned short', - # int and unsigned are not IDL types - 'long', - 'unsigned long', - 'long long', - 'unsigned long long', -]) -NUMERIC_TYPES = ( - INTEGER_TYPES | frozenset([ - # http://www.w3.org/TR/WebIDL/#dfn-numeric-type - 'float', - 'unrestricted float', - 'double', - 'unrestricted double', - ])) -# http://www.w3.org/TR/WebIDL/#dfn-primitive-type -PRIMITIVE_TYPES = (frozenset(['boolean']) | NUMERIC_TYPES) -BASIC_TYPES = ( - PRIMITIVE_TYPES | frozenset([ - # Built-in, non-composite, non-object data types - # http://heycam.github.io/webidl/#idl-types - 'DOMString', - 'ByteString', - 'USVString', - # http://heycam.github.io/webidl/#idl-types - 'void', - ])) -TYPE_NAMES = { - # http://heycam.github.io/webidl/#dfn-type-name - 'any': 'Any', - 'boolean': 'Boolean', - 'byte': 'Byte', - 'octet': 'Octet', - 'short': 'Short', - 'unsigned short': 'UnsignedShort', - 'long': 'Long', - 'unsigned long': 'UnsignedLong', - 'long long': 'LongLong', - 'unsigned long long': 'UnsignedLongLong', - 'float': 'Float', - 'unrestricted float': 'UnrestrictedFloat', - 'double': 'Double', - 'unrestricted double': 'UnrestrictedDouble', - 'DOMString': 'String', - 'ByteString': 'ByteString', - 'USVString': 'USVString', - 'object': 'Object', -} - -STRING_TYPES = frozenset([ - # http://heycam.github.io/webidl/#es-interface-call (step 10.11) - # (Interface object [[Call]] method's string types.) - 'String', - 'ByteString', - 'USVString', -]) - -EXTENDED_ATTRIBUTES_APPLICABLE_TO_TYPES = frozenset([ - 'AllowShared', - 'Clamp', - 'EnforceRange', - 'StringContext', - 'TreatNullAs', -]) - -################################################################################ -# Inheritance -################################################################################ - -ancestors = defaultdict(list) # interface_name -> ancestors - - -def inherits_interface(interface_name, ancestor_name): - return (interface_name == ancestor_name - or ancestor_name in ancestors[interface_name]) - - -def set_ancestors(new_ancestors): - ancestors.update(new_ancestors) - - -class IdlTypeBase(object): - """Base class for IdlType, IdlUnionType, IdlArrayOrSequenceType - and IdlNullableType. - """ - - def __str__(self): - raise NotImplementedError('__str__() should be defined in subclasses') - - def __getattr__(self, name): - # Default undefined attributes to None (analogous to Jinja variables). - # This allows us to not define default properties in the base class, and - # allows us to relay __getattr__ in IdlNullableType to the inner type. - return None - - def resolve_typedefs(self, typedefs): - raise NotImplementedError( - 'resolve_typedefs should be defined in subclasses') - - def idl_types(self): - """A generator which yields IdlTypes which are referenced from |self|, - including itself.""" - yield self - - -################################################################################ -# IdlType -################################################################################ - - -class IdlType(IdlTypeBase): - # FIXME: incorporate Nullable, etc. - # to support types like short?[] vs. short[]?, instead of treating these - # as orthogonal properties (via flags). - callback_functions = {} - callback_interfaces = set() - dictionaries = set() - enums = {} # name -> values - - def __init__(self, base_type, is_unrestricted=False): - super(IdlType, self).__init__() - if is_unrestricted: - self.base_type = 'unrestricted %s' % base_type - else: - self.base_type = base_type - - def __str__(self): - return self.base_type - - def __getstate__(self): - return { - 'base_type': self.base_type, - } - - def __setstate__(self, state): - self.base_type = state['base_type'] - - @property - def is_basic_type(self): - return self.base_type in BASIC_TYPES - - @property - def is_callback_function(self): # pylint: disable=C0103 - return self.base_type in IdlType.callback_functions - - @property - def is_custom_callback_function(self): - entry = IdlType.callback_functions.get(self.base_type) - callback_function = entry.get('callback_function') - if not callback_function: - return False - return 'Custom' in callback_function.extended_attributes - - @property - def is_callback_interface(self): - return self.base_type in IdlType.callback_interfaces - - @property - def is_dictionary(self): - return self.base_type in IdlType.dictionaries - - @property - def is_enum(self): - # FIXME: add an IdlEnumType class and a resolve_enums step - # at end of IdlDefinitions constructor - return self.name in IdlType.enums - - @property - def enum_values(self): - return IdlType.enums.get(self.name) - - @property - def enum_type(self): - return self.name if self.is_enum else None - - @property - def is_integer_type(self): - return self.base_type in INTEGER_TYPES - - @property - def is_void(self): - return self.base_type == 'void' - - @property - def is_numeric_type(self): - return self.base_type in NUMERIC_TYPES - - @property - def is_primitive_type(self): - return self.base_type in PRIMITIVE_TYPES - - @property - def is_interface_type(self): - # Anything that is not another type is an interface type. - # http://www.w3.org/TR/WebIDL/#idl-types - # http://www.w3.org/TR/WebIDL/#idl-interface - # In C++ these are RefPtr types. - return not (self.is_basic_type or self.is_callback_function - or self.is_dictionary or self.is_enum or self.name == 'Any' - or self.name == 'Object' or self.name == 'Promise' - ) # Promise will be basic in future - - @property - def is_string_type(self): - return self.name in STRING_TYPES - - @property - def name(self): - """Return type name - - http://heycam.github.io/webidl/#dfn-type-name - """ - base_type = self.base_type - return TYPE_NAMES.get(base_type, base_type) - - @classmethod - def set_callback_functions(cls, new_callback_functions): - cls.callback_functions.update(new_callback_functions) - - @classmethod - def set_callback_interfaces(cls, new_callback_interfaces): - cls.callback_interfaces.update(new_callback_interfaces) - - @classmethod - def set_dictionaries(cls, new_dictionaries): - cls.dictionaries.update(new_dictionaries) - - @classmethod - def set_enums(cls, new_enums): - cls.enums.update(new_enums) - - def resolve_typedefs(self, typedefs): - base_type = self.base_type - if base_type in typedefs: - resolved_type = typedefs[base_type] - if resolved_type.base_type in typedefs: - raise ValueError("We can't typedef a typedef'ed type.") - # For the case that the resolved type contains other typedef'ed - # type(s). - return resolved_type.resolve_typedefs(typedefs) - return self - - -################################################################################ -# IdlUnionType -################################################################################ - - -class IdlUnionType(IdlTypeBase): - # http://heycam.github.io/webidl/#idl-union - # IdlUnionType has __hash__() and __eq__() methods because they are stored - # in sets. - def __init__(self, member_types): - super(IdlUnionType, self).__init__() - self.member_types = member_types - - def __str__(self): - return '(' + ' or '.join( - str(member_type) for member_type in self.member_types) + ')' - - def __hash__(self): - return hash(self.name) - - def __eq__(self, rhs): - return self.name == rhs.name - - def __getstate__(self): - return { - 'member_types': self.member_types, - } - - def __setstate__(self, state): - self.member_types = state['member_types'] - - @property - def flattened_member_types(self): - """Returns the set of the union's flattened member types. - - https://heycam.github.io/webidl/#dfn-flattened-union-member-types - """ - # We cannot use a set directly because each member is an - # IdlTypeBase-derived class, and comparing two objects of the - # same type is not the same as comparing their names. - # In other words: - # x = IdlType('ByteString') - # y = IdlType('ByteString') - # x == y # False - # x.name == y.name # True - # |flattened_members|'s keys are type names, the values are type - # |objects|. - # We assume we can use two IDL objects of the same type interchangeably. - flattened_members = {} - for member in self.member_types: - if member.is_nullable: - member = member.inner_type - if member.is_union_type: - for inner_member in member.flattened_member_types: - flattened_members[inner_member.name] = inner_member - else: - flattened_members[member.name] = member - return set(flattened_members.values()) - - @property - def number_of_nullable_member_types(self): - """Returns the union's number of nullable types. - - http://heycam.github.io/webidl/#dfn-number-of-nullable-member-types - """ - count = 0 - for member in self.member_types: - if member.is_nullable: - count += 1 - member = member.inner_type - if member.is_union_type: - count += member.number_of_nullable_member_types - return count - - @property - def is_union_type(self): - return True - - def single_matching_member_type(self, predicate): - matching_types = list(filter(predicate, self.flattened_member_types)) - if len(matching_types) > 1: - raise ValueError('%s is ambiguous.' % self.name) - return matching_types[0] if matching_types else None - - @property - def string_member_type(self): - return self.single_matching_member_type( - lambda member_type: (member_type.is_string_type or member_type.is_enum) - ) - - @property - def numeric_member_type(self): - return self.single_matching_member_type( - lambda member_type: member_type.is_numeric_type) - - @property - def boolean_member_type(self): - return self.single_matching_member_type( - lambda member_type: member_type.base_type == 'boolean') - - @property - def sequence_member_type(self): - return self.single_matching_member_type( - lambda member_type: member_type.is_sequence_type) - - @property - def dictionary_member_type(self): - return self.single_matching_member_type( - lambda member_type: member_type.is_dictionary) - - @property - def as_union_type(self): - # Note: Use this to "look through" a possible IdlNullableType wrapper. - return self - - @property - def name(self): - """Return type name (or inner type name if nullable) - - http://heycam.github.io/webidl/#dfn-type-name - """ - return 'Or'.join(member_type.name for member_type in self.member_types) - - def resolve_typedefs(self, typedefs): - self.member_types = [ - member_type.resolve_typedefs(typedefs) - for member_type in self.member_types - ] - return self - - def idl_types(self): - yield self - for member_type in self.member_types: - for idl_type in member_type.idl_types(): - yield idl_type - - -################################################################################ -# IdlArrayOrSequenceType, IdlSequenceType, IdlFrozenArrayType -################################################################################ - - -# TODO(bashi): Rename this like "IdlArrayTypeBase" or something. -class IdlArrayOrSequenceType(IdlTypeBase): - """Base class for array-like types.""" - - def __init__(self, element_type): - super(IdlArrayOrSequenceType, self).__init__() - self.element_type = element_type - - def __getstate__(self): - return { - 'element_type': self.element_type, - } - - def __setstate__(self, state): - self.element_type = state['element_type'] - - def resolve_typedefs(self, typedefs): - self.element_type = self.element_type.resolve_typedefs(typedefs) - return self - - @property - def is_array_or_sequence_type(self): - return True - - @property - def is_sequence_type(self): - return False - - @property - def is_frozen_array(self): - return False - - @property - def enum_values(self): - return self.element_type.enum_values - - @property - def enum_type(self): - return self.element_type.enum_type - - def idl_types(self): - yield self - for idl_type in self.element_type.idl_types(): - yield idl_type - - -class IdlSequenceType(IdlArrayOrSequenceType): - def __init__(self, element_type): - super(IdlSequenceType, self).__init__(element_type) - - def __str__(self): - return 'sequence<%s>' % self.element_type - - @property - def name(self): - return self.element_type.name + 'Sequence' - - @property - def is_sequence_type(self): - return True - - -class IdlFrozenArrayType(IdlArrayOrSequenceType): - def __init__(self, element_type): - super(IdlFrozenArrayType, self).__init__(element_type) - - def __str__(self): - return 'FrozenArray<%s>' % self.element_type - - @property - def name(self): - return self.element_type.name + 'Array' - - @property - def is_frozen_array(self): - return True - - -################################################################################ -# IdlRecordType -################################################################################ - - -class IdlRecordType(IdlTypeBase): - def __init__(self, key_type, value_type): - super(IdlRecordType, self).__init__() - self.key_type = key_type - self.value_type = value_type - - def __str__(self): - return 'record<%s, %s>' % (self.key_type, self.value_type) - - def __getstate__(self): - return { - 'key_type': self.key_type, - 'value_type': self.value_type, - } - - def __setstate__(self, state): - self.key_type = state['key_type'] - self.value_type = state['value_type'] - - def idl_types(self): - yield self - for idl_type in self.key_type.idl_types(): - yield idl_type - for idl_type in self.value_type.idl_types(): - yield idl_type - - def resolve_typedefs(self, typedefs): - self.key_type = self.key_type.resolve_typedefs(typedefs) - self.value_type = self.value_type.resolve_typedefs(typedefs) - return self - - @property - def is_record_type(self): - return True - - @property - def name(self): - return self.key_type.name + self.value_type.name + 'Record' - - -################################################################################ -# IdlNullableType -################################################################################ - - -# https://heycam.github.io/webidl/#idl-nullable-type -class IdlNullableType(IdlTypeBase): - def __init__(self, inner_type): - super(IdlNullableType, self).__init__() - if inner_type.name == 'Any': - raise ValueError('Inner type of nullable type must not be any.') - if inner_type.name == 'Promise': - raise ValueError( - 'Inner type of nullable type must not be a promise.') - if inner_type.is_nullable: - raise ValueError( - 'Inner type of nullable type must not be a nullable type.') - if inner_type.is_union_type: - if inner_type.number_of_nullable_member_types > 0: - raise ValueError( - 'Inner type of nullable type must not be a union type that ' - 'itself includes a nullable type.') - if any(member.is_dictionary - for member in inner_type.flattened_member_types): - raise ValueError( - 'Inner type of nullable type must not be a union type that ' - 'has a dictionary type as its members.') - - self.inner_type = inner_type - - def __str__(self): - # FIXME: Dictionary::ConversionContext::setConversionType can't - # handle the '?' in nullable types (passes nullability separately). - # Update that function to handle nullability from the type name, - # simplifying its signature. - # return str(self.inner_type) + '?' - return str(self.inner_type) - - def __getattr__(self, name): - return getattr(self.inner_type, name) - - def __getstate__(self): - return { - 'inner_type': self.inner_type, - } - - def __setstate__(self, state): - self.inner_type = state['inner_type'] - - @property - def is_nullable(self): - return True - - @property - def name(self): - return self.inner_type.name + 'OrNull' - - @property - def enum_values(self): - # Nullable enums are handled by preprending a None value to the list of - # enum values. This None value is converted to nullptr on the C++ side, - # which matches the JavaScript 'null' in the enum parsing code. - inner_values = self.inner_type.enum_values - if inner_values: - return [None] + inner_values - return None - - def resolve_typedefs(self, typedefs): - self.inner_type = self.inner_type.resolve_typedefs(typedefs) - return self - - def idl_types(self): - yield self - for idl_type in self.inner_type.idl_types(): - yield idl_type - - -################################################################################ -# IdlAnnotatedType -################################################################################ - - -class IdlAnnotatedType(IdlTypeBase): - """IdlAnnoatedType represents an IDL type with extended attributes. - [Clamp], [EnforceRange], [StringContext], and [TreatNullAs] are applicable - to types. - https://heycam.github.io/webidl/#idl-annotated-types - """ - - def __init__(self, inner_type, extended_attributes): - super(IdlAnnotatedType, self).__init__() - self.inner_type = inner_type - self.extended_attributes = extended_attributes - - if any(key not in EXTENDED_ATTRIBUTES_APPLICABLE_TO_TYPES - for key in extended_attributes): - raise ValueError( - 'Extended attributes not applicable to types: %s' % self) - - if ('StringContext' in extended_attributes - and inner_type.base_type not in ['DOMString', 'USVString']): - raise ValueError( - 'StringContext is only applicable to string types.') - - def __str__(self): - annotation = ', '.join( - (key + ('' if val is None else '=' + val)) - for key, val in self.extended_attributes.items()) - return '[%s] %s' % (annotation, str(self.inner_type)) - - def __getattr__(self, name): - return getattr(self.inner_type, name) - - def __getstate__(self): - return { - 'inner_type': self.inner_type, - 'extended_attributes': self.extended_attributes, - } - - def __setstate__(self, state): - self.inner_type = state['inner_type'] - self.extended_attributes = state['extended_attributes'] - - @property - def is_annotated_type(self): - return True - - @property - def has_string_context(self): - return 'StringContext' in self.extended_attributes - - @property - def name(self): - annotation = ''.join( - (key + ('' if val is None else val)) - for key, val in sorted(self.extended_attributes.items())) - return self.inner_type.name + annotation - - def resolve_typedefs(self, typedefs): - self.inner_type = self.inner_type.resolve_typedefs(typedefs) - return self - - def idl_types(self): - yield self - yield self.inner_type
diff --git a/third_party/blink/renderer/bindings/scripts/idl_types_test.py b/third_party/blink/renderer/bindings/scripts/idl_types_test.py deleted file mode 100644 index 519fbcf..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_types_test.py +++ /dev/null
@@ -1,276 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=import-error,print-statement,relative-import -"""Unit tests for idl_types.py.""" - -import unittest - -from idl_types import IdlNullableType -from idl_types import IdlRecordType -from idl_types import IdlSequenceType -from idl_types import IdlType -from idl_types import IdlUnionType - - -class IdlTypeTest(unittest.TestCase): - def test_is_void(self): - idl_type = IdlType('void') - self.assertTrue(idl_type.is_void) - idl_type = IdlType('somethingElse') - self.assertFalse(idl_type.is_void) - - -class IdlRecordTypeTest(unittest.TestCase): - def test_idl_types(self): - idl_type = IdlRecordType(IdlType('USVString'), IdlType('long')) - idl_types = list(idl_type.idl_types()) - self.assertEqual(len(idl_types), 3) - self.assertIs(idl_types[0], idl_type) - self.assertEqual(idl_types[1].name, 'USVString') - self.assertEqual(idl_types[2].name, 'Long') - self.assertListEqual( - list(idl_type.idl_types()), - [idl_type, idl_type.key_type, idl_type.value_type]) - - idl_type = IdlRecordType( - IdlType('DOMString'), IdlSequenceType( - IdlType('unrestricted float'))) - idl_types = list(idl_type.idl_types()) - self.assertEqual(len(idl_types), 4) - self.assertIs(idl_types[0], idl_type) - self.assertEqual(idl_types[1].name, 'String') - self.assertEqual(idl_types[2].name, 'UnrestrictedFloatSequence') - self.assertEqual(idl_types[3].name, 'UnrestrictedFloat') - self.assertListEqual( - list(idl_type.idl_types()), [ - idl_type, idl_type.key_type, idl_type.value_type, - idl_type.value_type.element_type - ]) - - idl_type = IdlRecordType( - IdlType('ByteString'), - IdlRecordType(IdlType('DOMString'), IdlType('octet'))) - idl_types = list(idl_type.idl_types()) - self.assertEqual(len(idl_types), 5) - self.assertIs(idl_types[0], idl_type) - self.assertEqual(idl_types[1].name, 'ByteString') - self.assertEqual(idl_types[2].name, 'StringOctetRecord') - self.assertEqual(idl_types[3].name, 'String') - self.assertEqual(idl_types[4].name, 'Octet') - self.assertListEqual( - list(idl_type.idl_types()), [ - idl_type, idl_type.key_type, idl_type.value_type, - idl_type.value_type.key_type, idl_type.value_type.value_type - ]) - - def test_is_record(self): - idl_type = IdlType('USVString') - self.assertFalse(idl_type.is_record_type) - idl_type = IdlSequenceType( - IdlRecordType(IdlType('DOMString'), IdlType('byte'))) - self.assertFalse(idl_type.is_record_type) - idl_type = IdlRecordType(IdlType('USVString'), IdlType('long')) - self.assertTrue(idl_type.is_record_type) - idl_type = IdlRecordType( - IdlType('USVString'), IdlSequenceType(IdlType('boolean'))) - self.assertTrue(idl_type.is_record_type) - - def test_name(self): - idl_type = IdlRecordType(IdlType('ByteString'), IdlType('octet')) - self.assertEqual(idl_type.name, 'ByteStringOctetRecord') - idl_type = IdlRecordType( - IdlType('USVString'), IdlSequenceType(IdlType('double'))) - self.assertEqual(idl_type.name, 'USVStringDoubleSequenceRecord') - idl_type = IdlRecordType( - IdlType('DOMString'), - IdlRecordType( - IdlType('ByteString'), - IdlSequenceType(IdlType('unsigned short')))) - self.assertEqual(idl_type.name, - 'StringByteStringUnsignedShortSequenceRecordRecord') - - -class IdlUnionTypeTest(unittest.TestCase): - def test_flattened_member_types(self): - # We are only testing the algorithm here, so we do create some - # ambiguous union types. - - def compare_flattened_members(actual, expected): - """Compare a set of IDL types by name, as the objects - are different - """ - actual_names = set([member.name for member in actual]) - expected_names = set([member.name for member in expected]) - self.assertEqual(actual_names, expected_names) - - idl_type = IdlUnionType([IdlType('long'), IdlType('SomeInterface')]) - compare_flattened_members( - idl_type.flattened_member_types, - set([IdlType('long'), IdlType('SomeInterface')])) - - idl_type = IdlUnionType([ - IdlUnionType([IdlType('ByteString'), - IdlType('float')]), - IdlType('boolean') - ]) - compare_flattened_members( - idl_type.flattened_member_types, - set([IdlType('float'), - IdlType('boolean'), - IdlType('ByteString')])) - - idl_type = IdlUnionType([ - IdlUnionType([IdlType('ByteString'), - IdlType('DOMString')]), - IdlType('DOMString') - ]) - compare_flattened_members( - idl_type.flattened_member_types, - set([IdlType('DOMString'), - IdlType('ByteString')])) - - idl_type = IdlUnionType( - [IdlNullableType(IdlType('ByteString')), - IdlType('byte')]) - compare_flattened_members( - idl_type.flattened_member_types, - set([IdlType('ByteString'), IdlType('byte')])) - - idl_type = IdlUnionType([ - IdlNullableType(IdlType('ByteString')), - IdlType('byte'), - IdlUnionType([IdlType('ByteString'), - IdlType('float')]) - ]) - self.assertEqual(len(idl_type.flattened_member_types), 3) - compare_flattened_members( - idl_type.flattened_member_types, - set([IdlType('ByteString'), - IdlType('byte'), - IdlType('float')])) - - # From the example in the spec: "the flattened member types of the - # union type (Node or (sequence<long> or Event) or - # (XMLHttpRequest or DOMString)? or - # sequence<(sequence<double> or NodeList)>) are the six types Node, - # sequence<long>, Event, XMLHttpRequest, DOMString and - # sequence<(sequence<double> or NodeList)>" - idl_type = IdlUnionType([ - IdlType('Node'), - IdlUnionType([IdlSequenceType(IdlType('long')), - IdlType('Event')]), - IdlNullableType( - IdlUnionType([IdlType('XMLHttpRequest'), - IdlType('DOMString')])), - IdlSequenceType( - IdlUnionType( - [IdlSequenceType(IdlType('double')), - IdlType('NodeList')])) - ]) - self.assertEqual(len(idl_type.flattened_member_types), 6) - compare_flattened_members( - idl_type.flattened_member_types, - set([ - IdlType('Node'), - IdlSequenceType(IdlType('long')), - IdlType('Event'), - IdlType('XMLHttpRequest'), - IdlType('DOMString'), - IdlSequenceType( - IdlUnionType([ - IdlSequenceType(IdlType('double')), - IdlType('NodeList') - ])) - ])) - - def test_resolve_typedefs(self): - # This is a simplification of the typedef mechanism to avoid having to - # use idl_definitions and use actual nodes from //tools/idl_parser. - typedefs = { - 'Foo': IdlType('unsigned short'), - 'MyBooleanType': IdlType('boolean'), - 'SomeInterfaceT': IdlType('MyInterface'), - } - - # (long long or MyBooleanType) - union = IdlUnionType( - [IdlType('long long'), - IdlType('MyBooleanType')]).resolve_typedefs(typedefs) - self.assertEqual(union.name, 'LongLongOrBoolean') - self.assertEqual(union.member_types[0].name, 'LongLong') - self.assertEqual(union.member_types[1].name, 'Boolean') - - # (Foo or SomeInterfaceT) - union = IdlUnionType( - [IdlType('Foo'), - IdlType('SomeInterfaceT')]).resolve_typedefs(typedefs) - self.assertEqual(union.name, 'UnsignedShortOrMyInterface') - self.assertEqual(union.member_types[0].name, 'UnsignedShort') - self.assertEqual(union.member_types[1].name, 'MyInterface') - - # (Foo or sequence<(MyBooleanType or double)>) - union = IdlUnionType([ - IdlType('Foo'), - IdlSequenceType( - IdlUnionType([IdlType('MyBooleanType'), - IdlType('double')])) - ]).resolve_typedefs(typedefs) - self.assertEqual(union.name, 'UnsignedShortOrBooleanOrDoubleSequence') - self.assertEqual(union.member_types[0].name, 'UnsignedShort') - self.assertEqual(union.member_types[1].name, 'BooleanOrDoubleSequence') - self.assertEqual(union.member_types[1].element_type.name, - 'BooleanOrDouble') - self.assertEqual( - union.member_types[1].element_type.member_types[0].name, 'Boolean') - self.assertEqual( - union.member_types[1].element_type.member_types[1].name, 'Double') - self.assertEqual(2, len(union.flattened_member_types)) - - -class IdlNullableTypeTest(unittest.TestCase): - _TEST_DICTIONARY = 'TestDictionary' - - def setUp(self): - IdlType.dictionaries.add(self._TEST_DICTIONARY) - - def tearDown(self): - IdlType.dictionaries.remove(self._TEST_DICTIONARY) - - def test_valid_inner_type_basic(self): - inner_type = IdlType('long') - self.assertTrue(IdlNullableType(inner_type).is_nullable) - - def test_valid_inner_type_dictionary(self): - inner_type = IdlType(self._TEST_DICTIONARY) - self.assertTrue(IdlNullableType(inner_type).is_nullable) - - def test_valid_inner_type_union(self): - inner_type = IdlUnionType([IdlType('long')]) - self.assertTrue(IdlNullableType(inner_type).is_nullable) - - def test_invalid_inner_type_any(self): - inner_type = IdlType('any') - with self.assertRaises(ValueError): - IdlNullableType(inner_type) - - def test_invalid_inner_type_promise(self): - inner_type = IdlType('Promise') - with self.assertRaises(ValueError): - IdlNullableType(inner_type) - - def test_invalid_inner_type_nullable(self): - inner_type = IdlNullableType(IdlType('long')) - with self.assertRaises(ValueError): - IdlNullableType(inner_type) - - def test_invalid_inner_type_union_nullable_member(self): - inner_type = IdlUnionType([IdlNullableType(IdlType('long'))]) - with self.assertRaises(ValueError): - IdlNullableType(inner_type) - - def test_invalid_inner_type_union_dictionary_member(self): - inner_type = IdlUnionType([IdlType(self._TEST_DICTIONARY)]) - with self.assertRaises(ValueError): - IdlNullableType(inner_type)
diff --git a/third_party/blink/renderer/bindings/scripts/idl_validator.py b/third_party/blink/renderer/bindings/scripts/idl_validator.py deleted file mode 100644 index 64e84ef7d..0000000 --- a/third_party/blink/renderer/bindings/scripts/idl_validator.py +++ /dev/null
@@ -1,119 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Validate extended attributes. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler#TOC-Extended-attribute-validation -""" - -import os.path -import re - -module_path = os.path.dirname(__file__) -source_path = os.path.join(module_path, os.pardir, os.pardir) -EXTENDED_ATTRIBUTES_RELATIVE_PATH = os.path.join('bindings', - 'IDLExtendedAttributes.txt') -EXTENDED_ATTRIBUTES_FILENAME = os.path.join(source_path, - EXTENDED_ATTRIBUTES_RELATIVE_PATH) - - -class IDLInvalidExtendedAttributeError(Exception): - pass - - -class IDLExtendedAttributeValidator(object): - def __init__(self): - self.valid_extended_attributes = read_extended_attributes_file() - - def validate_extended_attributes(self, definitions): - # FIXME: this should be done when parsing the file, rather than after. - for interface in definitions.interfaces.values(): - self.validate_extended_attributes_node(interface) - for attribute in interface.attributes: - self.validate_extended_attributes_node(attribute) - for operation in interface.operations: - self.validate_extended_attributes_node(operation) - for argument in operation.arguments: - self.validate_extended_attributes_node(argument) - for dictionary in definitions.dictionaries.values(): - self.validate_extended_attributes_node(dictionary) - for member in dictionary.members: - self.validate_extended_attributes_node(member) - for callback_function in definitions.callback_functions.values(): - self.validate_extended_attributes_node(callback_function) - for argument in callback_function.arguments: - self.validate_extended_attributes_node(argument) - - def validate_extended_attributes_node(self, node): - for name, values_string in node.extended_attributes.items(): - self.validate_name_values_string(name, values_string) - - def validate_name_values_string(self, name, values_string): - if name not in self.valid_extended_attributes: - raise IDLInvalidExtendedAttributeError( - 'Unknown extended attribute [%s]' % name) - valid_values = self.valid_extended_attributes[name] - if values_string is None and None not in valid_values: - raise IDLInvalidExtendedAttributeError( - 'Missing required argument for extended attribute [%s]' % name) - if '*' in valid_values: # wildcard, any (non-empty) value ok - return - if values_string is None: - values = set([None]) - elif isinstance(values_string, list): - values = set(values_string) - else: - values = set([values_string]) - invalid_values = values - valid_values - if invalid_values: - invalid_value = invalid_values.pop() - raise IDLInvalidExtendedAttributeError( - 'Invalid value "%s" found in extended attribute [%s=%s]' % - (invalid_value, name, values_string)) - - -def read_extended_attributes_file(): - def extended_attribute_name_values(): - with open(EXTENDED_ATTRIBUTES_FILENAME) as extended_attributes_file: - for line in extended_attributes_file: - line = line.strip() - if not line or line.startswith('#'): - continue - name, _, values_string = map(str.strip, line.partition('=')) - value_list = [ - value.strip() for value in values_string.split('|') - ] - yield name, value_list - - valid_extended_attributes = {} - for name, value_list in extended_attribute_name_values(): - if not value_list: - valid_extended_attributes[name] = set([None]) - continue - valid_extended_attributes[name] = set( - [value if value else None for value in value_list]) - return valid_extended_attributes
diff --git a/third_party/blink/renderer/bindings/scripts/interface_dependency_resolver.py b/third_party/blink/renderer/bindings/scripts/interface_dependency_resolver.py deleted file mode 100644 index 8845480..0000000 --- a/third_party/blink/renderer/bindings/scripts/interface_dependency_resolver.py +++ /dev/null
@@ -1,386 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Resolve interface dependencies, producing a merged IdlDefinitions object. - -This library computes interface dependencies (partial interfaces and -includes), reads the dependency files, and merges them to the IdlDefinitions -for the main IDL file, producing an IdlDefinitions object representing the -entire interface. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler#TOC-Dependency-resolution -""" - -import os.path -from utilities import idl_filename_to_component, is_valid_component_dependency, merge_dict_recursively - -# The following extended attributes can be applied to a dependency interface, -# and are then applied to the individual members when merging. -# Note that this moves the extended attribute from the interface to the member, -# which changes the semantics and yields different code than the same extended -# attribute on the main interface. -DEPENDENCY_EXTENDED_ATTRIBUTES = frozenset([ - 'CrossOriginIsolated', - 'DirectSocketEnabled', - 'RuntimeEnabled', - 'SecureContext', -]) - - -class InterfaceDependencyResolver(object): - def __init__(self, interfaces_info, reader): - """Initialize dependency resolver. - - Args: - interfaces_info: - dict of interfaces information, from compute_dependencies.py - reader: - IdlReader, used for reading dependency files - """ - self.interfaces_info = interfaces_info - self.reader = reader - - def resolve_dependencies(self, definitions, component): - """Resolve dependencies, merging them into IDL definitions of main file. - - Dependencies consist of 'partial interface' for the same interface as - in the main file, and mixins that this interface 'includes'. - These are merged into the main IdlInterface, as the main IdlInterface - implements all these members. - - Partial interfaces and mixins are added to IdlDefinitions, but not - merged into the main IdlInterface, as these are only referenced (their - members are introspected, but not implemented in this interface). - - Inherited extended attributes are also added to the main IdlInterface. - - Modifies definitions in place by adding parsed dependencies. - - Args: - definitions: IdlDefinitions object, modified in place - component: - string, describing where the above definitions are defined, - 'core' or 'modules'. See KNOWN_COMPONENTS in utilities.py - - Returns: - A dictionary whose key is component and value is IdlDefinitions - object whose dependency is resolved. - - Raises: - Exception: - A given IdlDefinitions object doesn't have any interfaces, - or a given IdlDefinitions object has incorrect referenced - interfaces. - """ - # TODO(crbug.com/579896): we need to resolve dependency when we - # support partial dictionary. - if not definitions.interfaces: - raise Exception('No need to resolve any dependencies of ' - 'this definition: %s, because this should ' - 'have a dictionary.' % definitions.idl_name) - - target_interface = next(iter(definitions.interfaces.values())) - interface_name = target_interface.name - interface_info = self.interfaces_info[interface_name] - - if 'inherited_extended_attributes' in interface_info: - target_interface.extended_attributes.update( - interface_info['inherited_extended_attributes']) - - resolved_definitions = merge_interface_dependencies( - definitions, component, target_interface, - interface_info['dependencies_full_paths'] + - interface_info['dependencies_other_component_full_paths'], - self.reader) - - inherit_unforgeable_attributes(resolved_definitions, - self.interfaces_info) - - for referenced_interface_name in \ - interface_info['referenced_interfaces']: - referenced_definitions = self.reader.read_idl_definitions( - self.interfaces_info[referenced_interface_name]['full_path']) - - for referenced_component in referenced_definitions: - if not is_valid_component_dependency(component, - referenced_component): - raise Exception('This definitions: %s is defined in %s ' - 'but reference interface:%s is defined ' - 'in %s' % (definitions.idl_name, component, - referenced_interface_name, - referenced_component)) - - resolved_definitions[component].update( - referenced_definitions[component]) - - return resolved_definitions - - -def merge_interface_dependencies(definitions, component, target_interface, - dependency_idl_filenames, reader): - """Merge dependencies ('partial interface' and 'implements') in dependency_idl_filenames into target_interface. - - Args: - definitions: IdlDefinitions object, modified in place - component: - string, describing where the above definitions are defined, - 'core' or 'modules'. See KNOWN_COMPONENTS in utilities.py - target_interface: IdlInterface object, modified in place - dependency_idl_filenames: - Idl filenames which depend on the above definitions. - reader: IdlReader object. - Returns: - A dictionary whose key is component and value is IdlDefinitions - object whose dependency is resolved. - """ - resolved_definitions = {component: definitions} - # Sort so order consistent, so can compare output from run to run. - for dependency_idl_filename in sorted(dependency_idl_filenames): - dependency_definitions = reader.read_idl_file(dependency_idl_filename) - dependency_component = idl_filename_to_component( - dependency_idl_filename) - - dependency_interface = next( - iter(dependency_definitions.interfaces.values())) - - transfer_extended_attributes(dependency_interface, - dependency_idl_filename) - - # We need to use different checkdeps here for partial interface and - # inheritance. - if dependency_interface.is_partial: - # Case: dependency_interface is a partial interface of - # target_interface. - # So, - # - A partial interface defined in modules can update - # the original interface defined in core. - # However, - # - A partial interface defined in core cannot update - # the original interface defined in modules. - if not is_valid_component_dependency(dependency_component, - component): - raise Exception( - 'The partial interface:%s in %s cannot update ' - 'the original interface:%s in %s' % - (dependency_interface.name, dependency_component, - target_interface.name, component)) - - if dependency_component in resolved_definitions: - # When merging a new partial interfaces, should not overwrite - # ImpelemntedAs extended attributes in merged partial - # interface. - # See also the below "if 'ImplementedAs' not in ... " line's - # comment. - dependency_interface.extended_attributes.pop( - 'ImplementedAs', None) - resolved_definitions[dependency_component].update( - dependency_definitions) - continue - - dependency_interface.extended_attributes.update( - target_interface.extended_attributes) - assert target_interface == \ - definitions.interfaces[dependency_interface.name] - # A partial interface should use its original interface's - # ImplementedAs. If the original interface doesn't have, - # remove ImplementedAs defined in the partial interface. - # Because partial interface needs the original interface's - # cpp class to obtain partial interface's cpp class. - # e.g.. V8WindowPartial.cpp: - # DOMWindow* impl = V8Window::ToImpl(holder); - # DOMWindowQuota* cpp_value(DOMWindowQuota::webkitStorageInfo(impl)); - # TODO(tasak): remove ImplementedAs extended attributes - # from all partial interfaces. Instead, rename all cpp/header - # files correctly. ImplementedAs should not be allowed in - # partial interfaces. - if 'ImplementedAs' not in target_interface.extended_attributes: - dependency_interface.extended_attributes.pop( - 'ImplementedAs', None) - dependency_interface.original_interface = target_interface - target_interface.partial_interfaces.append(dependency_interface) - resolved_definitions[dependency_component] = dependency_definitions - else: - # Case: |target_interface| includes |dependency_interface| mixin. - # So, - # - An interface defined in modules can include any interface mixin - # defined in core. - # However, - # - An interface defined in core cannot include an interface mixin - # defined in modules. - if not dependency_interface.is_mixin: - raise Exception( - 'The interface:%s cannot include ' - 'the non-mixin interface: %s.' % - (target_interface.name, dependency_interface.name)) - - if not is_valid_component_dependency(component, - dependency_component): - raise Exception( - 'The interface:%s in %s cannot include ' - 'the interface mixin:%s in %s.' % - (target_interface.name, component, - dependency_interface.name, dependency_component)) - - # merges partial interfaces - resolved_definitions[component].update(dependency_definitions) - # Mixins are also merged into the target interface, so Code - # Generator can just iterate over one list (and not need to handle - # 'includes' itself). - target_interface.merge(dependency_interface) - - return resolved_definitions - - -def transfer_extended_attributes(dependency_interface, - dependency_idl_filename): - """Transfer extended attributes from dependency interface onto members. - - Merging consists of storing certain interface-level data in extended - attributes of the *members* (because there is no separate dependency - interface post-merging). - - The data storing consists of: - * moving certain extended attributes from the dependency interface - to its members (deleting the extended attribute from the interface) - * storing the C++ class of the implementation in an internal - extended attribute of each member, [PartialInterfaceImplementedAs] - - No return: modifies dependency_interface in place. - """ - merged_extended_attributes = {} - for key in DEPENDENCY_EXTENDED_ATTRIBUTES: - if key not in dependency_interface.extended_attributes: - continue - - merged_extended_attributes[key] = \ - dependency_interface.extended_attributes[key] - # Remove the merged attributes from the original dependency interface. - # This ensures that if other dependency interfaces are merged onto this - # one, its extended_attributes do not leak through - # (https://crbug.com/603782). - del dependency_interface.extended_attributes[key] - - # A partial interface's members are implemented as static member functions - # in a separate C++ class. This class name is stored in - # [PartialInterfaceImplementedAs] which is copied from [ImplementedAs] on - # the partial interface definition. - # - # Note that implemented interfaces do *not* need [ImplementedAs], since - # they are implemented on the C++ object |impl| itself, just like members of - # the main interface definition, so the bindings do not need to know in - # which class implemented interfaces are implemented. - # - # Currently [LegacyTreatAsPartialInterface] can be used to have partial - # interface behavior on mixins, but this is being removed as legacy cruft: - # http://crbug.com/360435 - # - # Note that [ImplementedAs] is used with different meanings on interfaces - # and members: - # for Blink class name and function name (or constant name), respectively. - # Thus we do not want to copy this from the interface to the member, but - # instead extract it and handle it separately. - if dependency_interface.is_partial: - if 'ImplementedAs' not in dependency_interface.extended_attributes: - raise ValueError('Partial interface in %s must have ImplementedAs.' - % dependency_idl_filename) - merged_extended_attributes['PartialInterfaceImplementedAs'] = \ - dependency_interface.extended_attributes.pop('ImplementedAs') - elif 'LegacyTreatAsPartialInterface' in \ - dependency_interface.extended_attributes: - merged_extended_attributes['PartialInterfaceImplementedAs'] = ( - dependency_interface.extended_attributes.pop( - 'ImplementedAs', dependency_interface.name)) - - def update_attributes(attributes, extras): - for key, value in extras.items(): - if key not in attributes: - attributes[key] = value - - for attribute in dependency_interface.attributes: - update_attributes(attribute.extended_attributes, - merged_extended_attributes) - for constant in dependency_interface.constants: - update_attributes(constant.extended_attributes, - merged_extended_attributes) - for operation in dependency_interface.operations: - update_attributes(operation.extended_attributes, - merged_extended_attributes) - - -def inherit_unforgeable_attributes(resolved_definitions, interfaces_info): - """Inherits [LegacyUnforgeable] attributes and updates the arguments - accordingly. - - For each interface in |resolved_definitions|, collects all - [LegacyUnforgeable] attributes in ancestor interfaces and adds them to the - interface. 'referenced_interfaces' and 'cpp_includes' in |interfaces_info| - are updated accordingly. - """ - - def collect_unforgeable_attributes_in_ancestors(interface_name, component): - if not interface_name: - # unforgeable_attributes, referenced_interfaces, cpp_includes - return [], [], set() - interface = interfaces_info[interface_name] - unforgeable_attributes, referenced_interfaces, cpp_includes = \ - collect_unforgeable_attributes_in_ancestors( - interface.get('parent'), component) - this_unforgeable = interface.get('unforgeable_attributes', []) - for attr in this_unforgeable: - if attr.defined_in is None: - attr.defined_in = interface_name - unforgeable_attributes.extend(this_unforgeable) - this_referenced = [ - attr.idl_type.base_type for attr in this_unforgeable - if attr.idl_type.base_type in interface.get( - 'referenced_interfaces', []) - ] - referenced_interfaces.extend(this_referenced) - cpp_includes.update( - interface.get('cpp_includes', {}).get(component, {})) - return unforgeable_attributes, referenced_interfaces, cpp_includes - - for component, definitions in resolved_definitions.items(): - for interface_name, interface in definitions.interfaces.items(): - interface_info = interfaces_info[interface_name] - inherited_unforgeable_attributes, referenced_interfaces, cpp_includes = \ - collect_unforgeable_attributes_in_ancestors( - interface_info.get('parent'), component) - # This loop may process the same interface many times, so it's - # possible that we're adding the same attributes twice or more. - # So check if there is a duplicate. - for attr in inherited_unforgeable_attributes: - if attr not in interface.attributes: - interface.attributes.append(attr) - referenced_interfaces.extend( - interface_info.get('referenced_interfaces', [])) - interface_info['referenced_interfaces'] = sorted( - set(referenced_interfaces)) - merge_dict_recursively(interface_info, - {'cpp_includes': { - component: cpp_includes - }})
diff --git a/third_party/blink/renderer/bindings/scripts/overload_set_algorithm.py b/third_party/blink/renderer/bindings/scripts/overload_set_algorithm.py deleted file mode 100644 index 309de69..0000000 --- a/third_party/blink/renderer/bindings/scripts/overload_set_algorithm.py +++ /dev/null
@@ -1,193 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# coding=utf-8 -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from collections import Counter -import itertools -from operator import itemgetter - - -def sort_and_groupby(list_to_sort, key=None): - """Returns a generator of (key, list), sorting and grouping list by key.""" - list_to_sort.sort(key=key) - return ((k, list(g)) for k, g in itertools.groupby(list_to_sort, key)) - - -def effective_overload_set(F): # pylint: disable=invalid-name - """Returns the effective overload set of an overloaded function. - - An effective overload set is the set of overloaded functions + signatures - derived from the set F by transforming it into the distinct permutations of - function invocations possible given the argument types. It is used by the - overload resolution algorithm. - - For example, given input: - [ - f1(DOMString a), - f2(Node a, DOMString b, double... c), - f3(), - f4(Event a, DOMString b, optional DOMString c, double... d) - ] - - The output is: - [ - (f1, [DOMString], [required]), - (f2, [Node, DOMString], [required, required]), - (f2, [Node, DOMString, double], [required, required, variadic]), - (f2, [Node, DOMString, double, double], [required, required, variadic, variadic]), - (f3, [], []), - (f4, [Event, DOMString], [required, required], - (f4, [Event, DOMString, DOMString], [required, required, optional]), - (f4, [Event, DOMString, DOMString, double], [required, required, optional, variadic]) - ] - - Spec: http://heycam.github.io/webidl/#dfn-effective-overload-set. - - Formally the input and output lists are sets, but methods are stored - internally as dicts, which can't be stored in a set because they are not - hashable, so we use lists instead. - - Arguments: - F: list of overloads for a given callable name. - - Returns: - S: list of tuples of the form: - (callable, tuple(type list), tuple(optionality list)). - """ - # Code closely follows the algorithm in the spec, for clarity and - # correctness, and hence is not very Pythonic. - - # 1. Let S be an ordered set. - # (We use a list because we can't use a set, as noted above.) - S = [] # pylint: disable=invalid-name - - # 2. Let F be an ordered set with items as follows, according to the kind of - # effective overload set: - # (Passed as argument, nothing to do.) - - # 3. Let maxarg be the maximum number of arguments the operations, - # constructor extended attributes or callback functions in F are declared - # to take. For variadic operations and constructor extended attributes, - # the argument on which the ellipsis appears counts as a single argument. - # Note: So void f(long x, long... y); is considered to be declared to take - # two arguments. - # X is the "callable". - maxarg = max([len(X['arguments']) for X in F]) - - # 4. Let max be max(maxarg, N). - # Per: https://github.com/heycam/webidl/issues/600. - - # The effective overload set as defined in the Web IDL spec is used at - # runtime as an input to the overload resolution algorithm. The runtime - # portion of the overload resolution algorithm includes coercing arguments - # into the proper type. To perform that coercion, the effective overload set - # must produce variadic entries in the type list to match the number of - # arguments supplied for the invocation (N) of the function. - - # Our use of the effective overload set, however, is limited to determining - # which function overload should handle the invocation. Coercion of - # arguments is a separate problem making N irrelevant and max always equal - # to maxarg. - - # 5. For each operation, extended attribute or callback function X in F: - for X in F: # pylint: disable=invalid-name - # 5.1. Let arguments be the list of arguments X is declared to take. - arguments = X['arguments'] # pylint: disable=invalid-name - # 5.2. Let n be the size of arguments. - n = len(arguments) # pylint: disable=invalid-name - # 5.3. Let types be a type list. - # 5.4. Let optionalityValues be an optionality list. - types, optionality_values = [], [] - - # 5.5. For each argument in arguments: - for argument in arguments: - # 5.5.1. Append the type of argument to types. - types.append(argument['idl_type_object']) - # 5.5.2. Append "variadic" to optionalityValues if argument is a - # final, variadic argument, "optional" if argument is optional, - # and "required" otherwise. - if argument['is_variadic']: - optionality_values.append('variadic') - elif argument['is_optional']: - optionality_values.append('optional') - else: - optionality_values.append('required') - - # 5.6. Append the tuple (X, types, optionalityValues) to S. - S.append((X, tuple(types), tuple(optionality_values))) - - # 5.7. If X is declared to be variadic, then: - if optionality_values and optionality_values[-1] == 'variadic': - # 5.7.1. For each i in the range n to max - 1, inclusive: - for i in range(n, maxarg): - # 5.7.1.1. Let t be a type list. - # 5.7.1.2. Let o be an optionality list. - type_list, optionality_list = [], [] - # 5.7.1.3. For each j in the range 0 to n-1, inclusive: - for j in range(0, n): - # 5.7.1.3.1. Append types[j] to t. - type_list.append(types[j]) - # 5.7.1.3.2. Append optionalityValues[j] to o. - optionality_list.append(optionality_values[j]) - # 5.7.1.4. For each j in the range n to i, inclusive: - for j in range(n, i + 1): - # 5.7.1.4.1. Append types[n - 1] to t. - type_list.append(types[n - 1]) - # 5.7.1.4.2. Append "variadic" to o. - optionality_list.append('variadic') - # 5.7.1.5. Append the tuple (X, t, o) to S. - S.append((X, tuple(type_list), tuple(optionality_list))) - # 5.8. Let i be n - 1. - i = n - 1 - - # 5.9. While i ≥ 0: - while i >= 0: - # 5.9.1. If arguments[i] is not optional (i.e., it is not marked as - # "optional" and is not a final, variadic argument), then break. - if optionality_values[i] == 'required': - break - - # 5.9.2. Let t be a type list. - # 5.9.3. Let o be an optionality list. - type_list, optionality_list = [], [] - # 5.9.4. For each j in the range 0 to i-1, inclusive: - for j in range(0, i): - # 5.9.4.1. Append types[j] to t. - type_list.append(types[j]) - # 5.9.4.2. Append optionalityValues[j] to o. - optionality_list.append(optionality_values[j]) - # 5.9.5. Append the tuple (X, t, o) to S. - # Note: if i is 0, this means to add to S the tuple (X, « », « »); - # (where "« »" represents an empty list). - S.append((X, tuple(type_list), tuple(optionality_list))) - # 5.9.6. Set i to i−1. - i = i - 1 - - # 6. Return S. - return S - - -def effective_overload_set_by_length(overloads): - def type_list_length(entry): - # Entries in the effective overload set are 3-tuples: - # (callable, type list, optionality list) - return len(entry[1]) - - effective_overloads = effective_overload_set(overloads) - return list(sort_and_groupby(effective_overloads, type_list_length)) - - -def method_overloads_by_name(methods): - """Returns generator of overloaded methods by name: [name, [method]]""" - # Filter to only methods that are actually overloaded - method_counts = Counter(method['name'] for method in methods) - overloaded_method_names = set( - name for name, count in method_counts.items() if count > 1) - overloaded_methods = [ - method for method in methods - if method['name'] in overloaded_method_names - ] - - # Group by name (generally will be defined together, but not necessarily) - return sort_and_groupby(overloaded_methods, itemgetter('name'))
diff --git a/third_party/blink/renderer/bindings/scripts/overload_set_algorithm_test.py b/third_party/blink/renderer/bindings/scripts/overload_set_algorithm_test.py deleted file mode 100644 index 3a94c06e..0000000 --- a/third_party/blink/renderer/bindings/scripts/overload_set_algorithm_test.py +++ /dev/null
@@ -1,339 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=import-error,print-statement,relative-import,protected-access -"""Unit tests for overload_set_algorithm.py.""" - -import unittest -from overload_set_algorithm import effective_overload_set - -# disabling yapf formating for complex data, see -# https://github.com/google/yapf#why-does-yapf-destroy-my-awesome-formatting -# yapf: disable - -class EffectiveOverloadSetTest(unittest.TestCase): - def test_example_in_comments(self): - operation_list = [ - # f1: f(optional long x) - {'arguments': [{'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}]}, - # f2: f(DOMString s) - {'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}]}] - - overload_set = [ - # <f1, (long), (optional)> - ({'arguments': [{'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}]}, - ('long',), - ('optional',)), - # <f1, (), ()> - ({'arguments': [{'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}]}, - (), - ()), - # <f2, (DOMString), (required)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}]}, - ('DOMString',), - ('required',))] - - self.assertEqual(effective_overload_set(operation_list), overload_set) - - def test_example_in_spec(self): - """Tests the example provided in Web IDL spec: - https://heycam.github.io/webidl/#dfn-effective-overload-set, - look for example right after the algorithm.""" - operation_list = [ - # f1: f(DOMString a) - {'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}]}, - # f2: f(Node a, DOMString b, double... c) - {'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - # f3: f() - {'arguments': []}, - # f4: f(Event a, DOMString b, optional DOMString c, double... d) - {'arguments': [{'idl_type_object': 'Event', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}] - - overload_set = [ - # <f1, (DOMString), (required)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}]}, - ('DOMString',), - ('required',)), - # <f2, (Node, DOMString, double), (required, required, variadic)> - ({'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - ('Node', 'DOMString', 'double'), - ('required', 'required', 'variadic')), - # <f2, (Node, DOMString, double, double), - # (required, required, variadic, variadic)> - ({'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - ('Node', 'DOMString', 'double', 'double'), - ('required', 'required', 'variadic', 'variadic')), - # <f2, (Node, DOMString), (required, required)> - ({'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - ('Node', 'DOMString'), - ('required', 'required')), - # <f3, (), ()> - ({'arguments': []}, - (), - ()), - # <f4, (Event, DOMString, DOMString, double), - # (required, required, optional, variadic)> - ({'arguments': [{'idl_type_object': 'Event', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - ('Event', 'DOMString', 'DOMString', 'double'), - ('required', 'required', 'optional', 'variadic')), - # <f4, (Event, DOMString, DOMString), - # (required, required, optional)> - ({'arguments': [{'idl_type_object': 'Event', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - ('Event', 'DOMString', 'DOMString'), - ('required', 'required', 'optional')), - # <f4, (Event, DOMString), (required, required)> - ({'arguments': [{'idl_type_object': 'Event', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'double', - 'is_optional': False, - 'is_variadic': True}]}, - ('Event', 'DOMString'), - ('required', 'required'))] - - self.assertEqual(effective_overload_set(operation_list), overload_set) - - def test_element_create_proposed_syntax(self): - """Tests the proposed syntax for the convenience method Element.create. - Github issue: https://github.com/whatwg/dom/issues/477""" - operation_list = [ - # f1: f(DOMString tag, Record<DOMString, DOMString> attrs, (Node or DOMString)... children) - {'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'record<DOMString, DOMString>', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}, - # f2: f(DOMString tag, (Node or DOMString)... children) - {'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}] - - overload_set = [ - # <f1, (DOMString, Record, NodeOrDOMString), (required, required, variadic)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'record<DOMString, DOMString>', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString', 'record<DOMString, DOMString>', 'NodeOrDOMString'), - ('required', 'required', 'variadic')), - # <f1, (DOMString, Record), (required, required)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'record<DOMString, DOMString>', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString', 'record<DOMString, DOMString>'), - ('required', 'required')), - # <f2, (DOMString, NodeOrDOMString), (required, variadic)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString', 'NodeOrDOMString'), - ('required', 'variadic')), - # <f2, (DOMString, NodeOrDOMString, NodeOrDOMString), (required, variadic, variadic)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString', 'NodeOrDOMString', 'NodeOrDOMString'), - ('required', 'variadic', 'variadic')), - # <f2, (DOMString), (required)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'NodeOrDOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString',), - ('required',))] - - self.assertEqual(effective_overload_set(operation_list), overload_set) - - def test_optional_preceding_variadic(self): - operation_list = [ - # f1: f(Node a, optional long b, DOMString... c) - {'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - # f2: f(DOMString... a) - {'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}] - - overload_set = [ - # <f1, (Node, long, DOMString), (required, optional, variadic)> - ({'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('Node', 'long', 'DOMString'), - ('required', 'optional', 'variadic')), - # <f1, (Node, long), (required, optional)> - ({'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('Node', 'long'), - ('required', 'optional')), - # <f1, (Node), (required)> - ({'arguments': [{'idl_type_object': 'Node', - 'is_optional': False, - 'is_variadic': False}, - {'idl_type_object': 'long', - 'is_optional': True, - 'is_variadic': False}, - {'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('Node',), - ('required',)), - # <f2, (DOMString), (variadic)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString',), - ('variadic',)), - # <f2, (DOMString, DOMString), (variadic, variadic)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString', 'DOMString'), - ('variadic', 'variadic')), - # <f2, (DOMString, DOMString, DOMString), (variadic, variadic, variadic)> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - ('DOMString', 'DOMString', 'DOMString'), - ('variadic', 'variadic', 'variadic')), - # <f2, (), ()> - ({'arguments': [{'idl_type_object': 'DOMString', - 'is_optional': False, - 'is_variadic': True}]}, - (), - ())] - - self.assertEqual(effective_overload_set(operation_list), overload_set) -# yapf: enable
diff --git a/third_party/blink/renderer/bindings/scripts/v8_attributes.py b/third_party/blink/renderer/bindings/scripts/v8_attributes.py deleted file mode 100644 index 3adf4eaf..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_attributes.py +++ /dev/null
@@ -1,812 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=relative-import -"""Generate template values for attributes. - -Extends IdlType with property |constructor_type_name|. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -import os -import sys - -sys.path.append( - os.path.join(os.path.dirname(__file__), '..', '..', 'build', 'scripts')) -from blinkbuild.name_style_converter import NameStyleConverter -import idl_types -from idl_types import inherits_interface -from v8_globals import includes -import v8_types -import v8_utilities -from v8_utilities import capitalize -from v8_utilities import cpp_encoded_property_name -from v8_utilities import cpp_name -from v8_utilities import extended_attribute_value_as_list -from v8_utilities import has_extended_attribute_value -from v8_utilities import is_unforgeable -from v8_utilities import scoped_name -from v8_utilities import strip_suffix -from v8_utilities import uncapitalize -from blinkbuild.name_style_converter import NameStyleConverter - - -def attribute_context(interface, attribute, interfaces, component_info): - """Creates a Jinja template context for an attribute of an interface. - - Args: - interface: An interface which |attribute| belongs to - attribute: An attribute to create the context for - interfaces: A dict which maps an interface name to the definition - which can be referred if needed - component_info: A dict containing component wide information - - Returns: - A Jinja template context for |attribute| - """ - - idl_type = attribute.idl_type - base_idl_type = idl_type.base_type - extended_attributes = attribute.extended_attributes - - idl_type.add_includes_for_type(extended_attributes) - if idl_type.enum_values: - includes.add('core/inspector/console_message.h') - includes.add('platform/heap/heap.h') - - # [CheckSecurity] - is_cross_origin = 'CrossOrigin' in extended_attributes - is_check_security_for_receiver = (has_extended_attribute_value( - interface, 'CheckSecurity', 'Receiver') and is_cross_origin) - is_check_security_for_return_value = (has_extended_attribute_value( - attribute, 'CheckSecurity', 'ReturnValue')) - if is_check_security_for_receiver or is_check_security_for_return_value: - includes.add('bindings/core/v8/binding_security.h') - if is_check_security_for_return_value: - includes.add('core/frame/web_feature.h') - includes.add('platform/instrumentation/use_counter.h') - # [CrossOrigin] - if has_extended_attribute_value(attribute, 'CrossOrigin', 'Setter'): - includes.add('platform/bindings/v8_cross_origin_callback_info.h') - # [Constructor] - # TODO(yukishiino): Constructors are much like methods although constructors - # are not methods. Constructors must be data-type properties, and we can - # support them as a kind of methods. - constructor_type = idl_type.constructor_type_name if is_constructor_attribute( - attribute) else None - # [CEReactions] - is_ce_reactions = 'CEReactions' in extended_attributes - if is_ce_reactions: - includes.add('core/html/custom/ce_reactions_scope.h') - # [Reflect] - is_reflect = 'Reflect' in extended_attributes - # [ReflectOnly] - reflect_only = extended_attribute_value_as_list(attribute, 'ReflectOnly') - if reflect_only: - reflect_only = map( - lambda v: cpp_content_attribute_value_name(interface, v), - reflect_only) - # [PerWorldBindings] - if 'PerWorldBindings' in extended_attributes: - assert idl_type.is_wrapper_type or 'LogActivity' in \ - extended_attributes, \ - '[PerWorldBindings] should only be used with wrapper types: %s.%s' % \ - (interface.name, attribute.name) - # [SaveSameObject] - is_save_same_object = ('SameObject' in attribute.extended_attributes and - 'SaveSameObject' in attribute.extended_attributes) - - # [StringContext] - if idl_type.has_string_context: - includes.add('bindings/core/v8/generated_code_helper.h') - - # [CachedAccessor] - is_cached_accessor = 'CachedAccessor' in extended_attributes - - # [LegacyLenientSetter] - is_lenient_setter = 'LegacyLenientSetter' in extended_attributes - - # [CachedAttribute] - cached_attribute_validation_method = extended_attributes.get( - 'CachedAttribute') - - keep_alive_for_gc = is_keep_alive_for_gc(interface, attribute) - - does_generate_getter = (not has_custom_getter(attribute) - and not constructor_type) - does_generate_setter = ( - has_setter(interface, attribute) - and not (has_custom_setter(attribute) or is_lenient_setter)) - - use_private_property_in_getter = (does_generate_getter - and (cached_attribute_validation_method - or is_save_same_object - or keep_alive_for_gc)) - use_private_property_in_setter = (does_generate_setter - and cached_attribute_validation_method) - private_property_is_shared_between_getter_and_setter = ( - use_private_property_in_getter and use_private_property_in_setter) - - does_use_private_property = (use_private_property_in_getter - or use_private_property_in_setter - or is_cached_accessor) - if does_use_private_property: - includes.add('platform/bindings/v8_private_property.h') - - # [LogActivity] - if 'LogActivity' in extended_attributes: - includes.add('platform/bindings/v8_per_context_data.h') - - # [DeprecateAs], [MeasureAs] - deprecate_as = v8_utilities.deprecate_as(attribute) - measure_as = v8_utilities.measure_as(attribute, interface) - - # [HighEntropy] - high_entropy = v8_utilities.high_entropy(attribute) - - is_lazy_data_attribute = \ - (constructor_type and not (measure_as or deprecate_as)) or \ - (str(idl_type) == 'Window' and attribute.name in ('frames', 'self', 'window')) - - runtime_features = component_info['runtime_enabled_features'] - - internal_name = cpp_encoded_property_name(attribute) - - cpp_type = idl_type.cpp_type - if idl_type.is_explicit_nullable: - cpp_type = v8_types.cpp_template_type('absl::optional', cpp_type) - - context = { - # [ActivityLogging] - 'activity_logging_world_list_for_getter': - v8_utilities.activity_logging_world_list(attribute, 'Getter'), - # [ActivityLogging] - 'activity_logging_world_list_for_setter': - v8_utilities.activity_logging_world_list(attribute, 'Setter'), - # [ActivityLogging] - 'activity_logging_world_check': - v8_utilities.activity_logging_world_check(attribute), - 'cached_accessor_name': - 'k%s%s' % (interface.name, attribute.name.capitalize()), - 'cached_attribute_validation_method': - cached_attribute_validation_method, - 'camel_case_name': - NameStyleConverter(internal_name).to_upper_camel_case(), - 'constructor_type': - constructor_type, - 'context_enabled_feature_name': - v8_utilities.context_enabled_feature_name(attribute), - 'cpp_name': cpp_name(attribute), - 'cpp_type': cpp_type, - 'cpp_type_initializer': idl_type.cpp_type_initializer, - 'deprecate_as': deprecate_as, - 'does_generate_getter': does_generate_getter, - 'does_generate_setter': does_generate_setter, - 'enum_type': idl_type.enum_type, - 'enum_values': idl_type.enum_values, - # [Exposed] - 'exposed_test': - v8_utilities.exposed(attribute, interface), - 'getter_has_no_side_effect': - has_extended_attribute_value(attribute, 'Affects', 'Nothing'), - 'has_cross_origin_getter': - has_extended_attribute_value(attribute, 'CrossOrigin', None) or - has_extended_attribute_value(attribute, 'CrossOrigin', 'Getter'), - 'has_cross_origin_setter': - has_extended_attribute_value(attribute, 'CrossOrigin', 'Setter'), - 'has_custom_getter': has_custom_getter(attribute), - 'has_custom_setter': has_custom_setter(attribute), - 'has_promise_type': idl_type.name == 'Promise', - 'has_setter': has_setter(interface, attribute), - 'high_entropy': high_entropy, - 'idl_type': str(idl_type), - 'is_cached_accessor': is_cached_accessor, - 'is_call_with_execution_context': - has_extended_attribute_value(attribute, 'CallWith', 'ExecutionContext'), - 'is_call_with_script_state': - has_extended_attribute_value(attribute, 'CallWith', 'ScriptState'), - 'is_ce_reactions': is_ce_reactions, - 'is_check_security_for_receiver': is_check_security_for_receiver, - 'is_check_security_for_return_value': - is_check_security_for_return_value, - # TODO(yukishiino): Make all DOM attributes accessor-type properties. - 'is_data_type_property': is_data_type_property(interface, attribute), - 'is_getter_raises_exception': # [RaisesException] - 'RaisesException' in extended_attributes and - extended_attributes['RaisesException'] in (None, 'Getter'), - 'is_keep_alive_for_gc': keep_alive_for_gc, - 'is_lazy_data_attribute': is_lazy_data_attribute, - 'is_lenient_setter': is_lenient_setter, - 'is_lenient_this': 'LegacyLenientThis' in extended_attributes, - 'is_nullable': idl_type.is_nullable, - 'is_explicit_nullable': idl_type.is_explicit_nullable, - 'is_named_constructor': is_named_constructor_attribute(attribute), - 'is_partial_interface_member': - 'PartialInterfaceImplementedAs' in extended_attributes, - 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, - 'is_put_forwards': 'PutForwards' in extended_attributes, - 'is_read_only': attribute.is_read_only, - 'is_reflect': is_reflect, - 'is_replaceable': 'Replaceable' in attribute.extended_attributes, - 'is_save_same_object': is_save_same_object, - 'is_static': attribute.is_static, - 'is_url': 'URL' in extended_attributes, - 'is_unforgeable': is_unforgeable(attribute), - 'measure_as': measure_as, - 'name': attribute.name, - 'on_instance': v8_utilities.on_instance(interface, attribute), - 'on_interface': v8_utilities.on_interface(interface, attribute), - 'on_prototype': v8_utilities.on_prototype(interface, attribute), - # [RuntimeEnabled] for origin trial - 'origin_trial_feature_name': - v8_utilities.origin_trial_feature_name(attribute, runtime_features), - 'private_property_is_shared_between_getter_and_setter': - private_property_is_shared_between_getter_and_setter, - 'property_attributes': property_attributes(interface, attribute), - 'reflect_empty': cpp_content_attribute_value_name( - interface, extended_attributes.get('ReflectEmpty')), - 'reflect_invalid': cpp_content_attribute_value_name( - interface, extended_attributes.get('ReflectInvalid', '')), - 'reflect_missing': cpp_content_attribute_value_name( - interface, extended_attributes.get('ReflectMissing')), - 'reflect_only': reflect_only, - # [RuntimeEnabled] if not in origin trial - 'runtime_enabled_feature_name': - v8_utilities.runtime_enabled_feature_name(attribute, runtime_features), - # [CrossOriginIsolated] - 'cross_origin_isolated_test': - v8_utilities.cross_origin_isolated(attribute, interface), - # [DirectSocketEnabled] - 'direct_socket_enabled_test': - v8_utilities.direct_socket_enabled(attribute, interface), - # [SecureContext] - 'secure_context_test': v8_utilities.secure_context(attribute, interface), - 'use_output_parameter_for_result': idl_type.use_output_parameter_for_result, - 'world_suffixes': ( - ['', 'ForMainWorld'] - if 'PerWorldBindings' in extended_attributes - else ['']), # [PerWorldBindings] - } - - if not has_custom_getter(attribute): - getter_context(interface, attribute, context) - if not has_custom_setter(attribute) and has_setter(interface, attribute): - setter_context(interface, attribute, interfaces, context) - - # [RuntimeCallStatsCounter] - runtime_call_stats_context(interface, attribute, context) - - # [CrossOrigin] is incompatible with a number of other attributes, so check - # for them here. - if is_cross_origin: - if context['has_cross_origin_setter'] and context['has_custom_setter']: - raise Exception( - '[CrossOrigin] and [Custom] are incompatible on the same setter: %s.%s', - interface.name, attribute.name) - if context['is_per_world_bindings']: - raise Exception( - '[CrossOrigin] and [PerWorldBindings] are incompatible: %s.%s', - interface.name, attribute.name) - if context['constructor_type']: - raise Exception( - '[CrossOrigin] cannot be used for constructors: %s.%s', - interface.name, attribute.name) - - return context - - -def runtime_call_stats_context(interface, attribute, context): - includes.add('platform/bindings/runtime_call_stats.h') - generic_counter_name = ( - 'Blink_' + v8_utilities.cpp_name(interface) + '_' + attribute.name) - (counter, extended_attribute_defined) = v8_utilities.rcs_counter_name( - attribute, generic_counter_name) - runtime_call_stats = { - 'extended_attribute_defined': - extended_attribute_defined, - 'getter_counter': - '%s_Getter' % counter, - 'setter_counter': - '%s_Setter' % counter, - 'constructor_getter_callback_counter': - '%s_ConstructorGetterCallback' % generic_counter_name, - } - context.update({'runtime_call_stats': runtime_call_stats}) - - -def is_origin_trial_enabled(attribute): - return bool(attribute['origin_trial_feature_name']) - - -def is_cross_origin_isolated(attribute): - return bool(attribute['cross_origin_isolated_test']) - - -def is_direct_socket_enabled(attribute): - return bool(attribute['direct_socket_enabled_test']) - - -def is_secure_context(attribute): - return bool(attribute['secure_context_test']) - - -def filter_accessors(attributes): - return [ - attribute for attribute in attributes if not ( - attribute['exposed_test'] or is_secure_context(attribute) - or is_cross_origin_isolated(attribute) or is_direct_socket_enabled( - attribute) or attribute['context_enabled_feature_name'] - or is_origin_trial_enabled(attribute) - or attribute['runtime_enabled_feature_name']) - and not attribute['is_data_type_property'] - ] - - -def is_data_attribute(attribute): - return (not (attribute['exposed_test'] or is_secure_context(attribute) - or is_cross_origin_isolated(attribute) - or is_direct_socket_enabled(attribute) - or attribute['context_enabled_feature_name'] - or is_origin_trial_enabled(attribute) - or attribute['runtime_enabled_feature_name']) - and attribute['is_data_type_property']) - - -def filter_data_attributes(attributes): - return [ - attribute for attribute in attributes if is_data_attribute(attribute) - ] - - -def filter_runtime_enabled(attributes): - return [ - attribute for attribute in attributes - if not (attribute['exposed_test'] or is_secure_context(attribute) - or is_cross_origin_isolated(attribute) - or is_direct_socket_enabled(attribute)) - and attribute['runtime_enabled_feature_name'] - ] - - -def filter_conditionally_enabled(attributes): - return [ - attribute for attribute in attributes if attribute['exposed_test'] or ( - (is_secure_context(attribute) or is_cross_origin_isolated( - attribute) or is_direct_socket_enabled(attribute)) - and not is_origin_trial_enabled(attribute)) - ] - - -################################################################################ -# Getter -################################################################################ - - -def getter_context(interface, attribute, context): - idl_type = attribute.idl_type - base_idl_type = idl_type.base_type - extended_attributes = attribute.extended_attributes - - cpp_value = getter_expression(interface, attribute, context) - # Normally we can inline the function call into the return statement to - # avoid the overhead of using a Ref<> temporary, but for some cases - # (nullable types, EventHandler, [CachedAttribute], or if there are - # exceptions), we need to use a local variable. - # FIXME: check if compilers are smart enough to inline this, and if so, - # always use a local variable (for readability and CG simplicity). - if (idl_type.is_explicit_nullable or base_idl_type == 'EventHandler' - or 'CachedAttribute' in extended_attributes - or 'ReflectOnly' in extended_attributes - or context['is_keep_alive_for_gc'] - or context['is_getter_raises_exception'] - or context['high_entropy'] == 'Direct'): - context['cpp_value_original'] = cpp_value - cpp_value = 'cpp_value' - - def v8_set_return_value_statement(for_main_world=False): - if (context['is_keep_alive_for_gc'] - or 'CachedAttribute' in extended_attributes): - return 'V8SetReturnValue(info, v8_value)' - if idl_type.is_explicit_nullable: - cpp_return_value = 'cpp_value.value()' - if idl_type.is_frozen_array: - cpp_return_value = 'FreezeV8Object(ToV8(cpp_value.value(), info.Holder(), info.GetIsolate()), info.GetIsolate())' - return 'V8SetReturnValue(info, {})'.format(cpp_return_value) - return idl_type.v8_set_return_value( - cpp_value, - extended_attributes=extended_attributes, - script_wrappable='impl', - for_main_world=for_main_world, - is_static=attribute.is_static) - - cpp_value_to_script_wrappable = cpp_value - if idl_type.is_array_buffer_view_or_typed_array: - cpp_value_to_script_wrappable += '.View()' - - context.update({ - 'cpp_value': - cpp_value, - 'cpp_value_to_script_wrappable': - cpp_value_to_script_wrappable, - 'cpp_value_to_v8_value': - idl_type.cpp_value_to_v8_value( - cpp_value=cpp_value, - creation_context='holder', - extended_attributes=extended_attributes), - 'is_getter_call_with_script_state': - has_extended_attribute_value(attribute, 'GetterCallWith', - 'ScriptState'), - 'v8_set_return_value_for_main_world': - v8_set_return_value_statement(for_main_world=True), - 'v8_set_return_value': - v8_set_return_value_statement(), - }) - - -def getter_expression(interface, attribute, context): - extra_arguments = [] - this_getter_base_name = getter_base_name(interface, attribute, - extra_arguments) - getter_name = scoped_name(interface, attribute, this_getter_base_name) - - arguments = v8_utilities.call_with_arguments( - attribute.extended_attributes.get('GetterCallWith') - or attribute.extended_attributes.get('CallWith')) - # Members of IDL partial interface definitions are implemented in C++ as - # static member functions, which for instance members (non-static members) - # take *impl as their first argument - if ('PartialInterfaceImplementedAs' in attribute.extended_attributes - and not attribute.is_static): - arguments.append('*impl') - arguments.extend(extra_arguments) - if context['is_getter_raises_exception']: - arguments.append('exception_state') - if attribute.idl_type.use_output_parameter_for_result: - arguments.append('result') - - expression = '%s(%s)' % (getter_name, ', '.join(arguments)) - # Needed to handle getter expressions returning Type& as the - # use site for |expression| expects Type*. - if (attribute.idl_type.is_interface_type and len(arguments) == 0 - and not attribute.idl_type.is_array_buffer_view_or_typed_array): - return 'WTF::GetPtr(%s)' % expression - return expression - - -CONTENT_ATTRIBUTE_GETTER_NAMES = { - 'boolean': 'FastHasAttribute', - 'long': 'GetIntegralAttribute', - 'unsigned long': 'GetUnsignedIntegralAttribute', - 'Element': 'GetElementAttribute', -} - - -def getter_base_name(interface, attribute, arguments): - extended_attributes = attribute.extended_attributes - - if 'Reflect' not in extended_attributes: - name = cpp_name(attribute) - return name if 'ImplementedAs' in extended_attributes \ - else uncapitalize(name) - - content_attribute_name = (extended_attributes['Reflect'] - or attribute.name.lower()) - if content_attribute_name in ['class', 'id', 'name']: - # Special-case for performance optimization. - return 'Get%sAttribute' % content_attribute_name.capitalize() - - arguments.append(scoped_content_attribute_name(interface, attribute)) - - base_idl_type = attribute.idl_type.base_type - if base_idl_type in CONTENT_ATTRIBUTE_GETTER_NAMES: - return CONTENT_ATTRIBUTE_GETTER_NAMES[base_idl_type] - if 'URL' in attribute.extended_attributes: - return 'GetURLAttribute' - idl_type = attribute.idl_type - if idl_type.is_frozen_array: - return 'Get%sArrayAttribute' % idl_type.element_type - return 'FastGetAttribute' - - -def is_keep_alive_for_gc(interface, attribute): - idl_type = attribute.idl_type - base_idl_type = idl_type.base_type - extended_attributes = attribute.extended_attributes - if attribute.is_static: - return False - if idl_type.is_array_buffer_or_view: - return False - return ( - # For readonly attributes, for performance reasons we keep the attribute - # wrapper alive while the owner wrapper is alive, because the attribute - # never changes. - ( - attribute.is_read_only and idl_type.is_wrapper_type and - # There are some exceptions, however: - not ( - # Node lifetime is managed by object grouping. - inherits_interface(interface.name, 'Node') - or inherits_interface(base_idl_type, 'Node') or - # A self-reference is unnecessary. - attribute.name == 'self' or - # FIXME: Remove these hard-coded hacks. - base_idl_type in ['EventTarget', 'Window'] - or base_idl_type.startswith(('HTML', 'SVG'))))) - - -################################################################################ -# Setter -################################################################################ - - -def setter_context(interface, attribute, interfaces, context): - if 'PutForwards' in attribute.extended_attributes: - # Make sure the target interface and attribute exist. - target_interface_name = attribute.idl_type.base_type - target_attribute_name = attribute.extended_attributes['PutForwards'] - interface = interfaces[target_interface_name] - try: - next(candidate for candidate in interface.attributes - if candidate.name == target_attribute_name) - except StopIteration: - raise Exception('[PutForward] target not found:\n' - 'Attribute "%s" is not present in interface "%s"' % - (target_attribute_name, target_interface_name)) - context['target_attribute_name'] = target_attribute_name - return - - if ('Replaceable' in attribute.extended_attributes): - # Create the property, and early-return if an exception is thrown. - # Subsequent cleanup code may not be prepared to handle a pending - # exception. - context['cpp_setter'] = ( - 'if (info.Holder()->CreateDataProperty(' + - 'info.GetIsolate()->GetCurrentContext(), ' + - 'property_name, v8_value).IsNothing())' + '\n return') - return - - extended_attributes = attribute.extended_attributes - idl_type = attribute.idl_type - - # [RaisesException], [RaisesException=Setter] - is_setter_raises_exception = ( - 'RaisesException' in extended_attributes - and extended_attributes['RaisesException'] in [None, 'Setter']) - - has_type_checking_interface = idl_type.is_wrapper_type - - use_common_reflection_setter = False - # Enable use_common_reflection_setter if - # * extended_attributes is [CEReactions, Reflect] or - # [CEReactions, Reflect, RuntimeEnabled], - # * the type is boolean, DOMString, or DOMString?, and - # * the interface inherits from 'Element'. - if ('Reflect' in extended_attributes - and 'CEReactions' in extended_attributes - and str(idl_type) in ('boolean', 'DOMString', 'DOMString?') - and inherits_interface(interface.name, 'Element')): - if (len(extended_attributes) == 2 - or (len(extended_attributes) == 3 - and 'RuntimeEnabled' in extended_attributes)): - use_common_reflection_setter = True - - context.update({ - 'has_setter_exception_state': - is_setter_raises_exception or has_type_checking_interface - or idl_type.v8_conversion_needs_exception_state, - 'has_type_checking_interface': - has_type_checking_interface, - 'is_setter_call_with_execution_context': - has_extended_attribute_value(attribute, 'SetterCallWith', - 'ExecutionContext'), - 'is_setter_call_with_script_state': - has_extended_attribute_value(attribute, 'SetterCallWith', - 'ScriptState'), - 'is_setter_raises_exception': - is_setter_raises_exception, - 'use_common_reflection_setter': - use_common_reflection_setter, - 'v8_value_to_local_cpp_value': - idl_type.v8_value_to_local_cpp_value( - extended_attributes, - 'v8_value', - 'cpp_value', - code_generation_target='attribute_set'), - }) - - # setter_expression() depends on context values we set above. - context['cpp_setter'] = setter_expression(interface, attribute, context) - - -def setter_expression(interface, attribute, context): - extended_attributes = attribute.extended_attributes - arguments = v8_utilities.call_with_arguments( - extended_attributes.get('SetterCallWith') - or extended_attributes.get('CallWith')) - - extra_arguments = [] - this_setter_base_name = setter_base_name(interface, attribute, - extra_arguments) - setter_name = scoped_name(interface, attribute, this_setter_base_name) - - # Members of IDL partial interface definitions are implemented in C++ as - # static member functions, which for instance members (non-static members) - # take *impl as their first argument - if ('PartialInterfaceImplementedAs' in extended_attributes - and not attribute.is_static): - arguments.append('*impl') - arguments.extend(extra_arguments) - idl_type = attribute.idl_type - if idl_type.base_type in ('EventHandler', 'OnBeforeUnloadEventHandler', - 'OnErrorEventHandler'): - if idl_type.base_type == 'EventHandler': - handler_type = 'kEventHandler' - elif idl_type.base_type == 'OnBeforeUnloadEventHandler': - handler_type = 'kOnBeforeUnloadEventHandler' - elif idl_type.base_type == 'OnErrorEventHandler': - handler_type = 'kOnErrorEventHandler' - arguments.append('JSEventHandler::CreateOrNull(' + 'v8_value, ' + - 'JSEventHandler::HandlerType::' + handler_type + ')') - else: - arguments.append('cpp_value') - if context['is_setter_raises_exception']: - arguments.append('exception_state') - if context['use_common_reflection_setter']: - attr_name = scoped_content_attribute_name(interface, attribute) - if idl_type.base_type == 'boolean': - setter_name = 'V8SetReflectedBooleanAttribute' - arguments = [ - 'info', - '"%s"' % interface.name, - '"%s"' % attribute.name, attr_name - ] - elif idl_type.base_type == 'DOMString': - if idl_type.is_nullable: - setter_name = 'V8SetReflectedNullableDOMStringAttribute' - else: - setter_name = 'V8SetReflectedDOMStringAttribute' - arguments = ['info', attr_name] - - return '%s(%s)' % (setter_name, ', '.join(arguments)) - - -CONTENT_ATTRIBUTE_SETTER_NAMES = { - 'boolean': 'SetBooleanAttribute', - 'long': 'SetIntegralAttribute', - 'unsigned long': 'SetUnsignedIntegralAttribute', - 'Element': 'SetElementAttribute', -} - - -def setter_base_name(interface, attribute, arguments): - if 'Reflect' not in attribute.extended_attributes: - return 'set%s' % capitalize(cpp_name(attribute)) - arguments.append(scoped_content_attribute_name(interface, attribute)) - - base_idl_type = attribute.idl_type.base_type - if base_idl_type in CONTENT_ATTRIBUTE_SETTER_NAMES: - return CONTENT_ATTRIBUTE_SETTER_NAMES[base_idl_type] - idl_type = attribute.idl_type - if idl_type.is_frozen_array: - return 'Set%sArrayAttribute' % idl_type.element_type - return 'setAttribute' - - -def scoped_content_attribute_name(interface, attribute): - content_attribute_name = (attribute.extended_attributes['Reflect'] - or attribute.name.lower()) - symbol_name = 'k' + NameStyleConverter( - content_attribute_name).to_upper_camel_case() - if interface.name.startswith('SVG'): - namespace = 'svg_names' - includes.add('core/svg_names.h') - else: - namespace = 'html_names' - includes.add('core/html_names.h') - return '%s::%sAttr' % (namespace, symbol_name) - - -def cpp_content_attribute_value_name(interface, value): - if value == '': - return 'g_empty_atom' - if not value: - return value - includes.add('core/keywords.h') - return 'keywords::' + NameStyleConverter(value).to_enum_value() - - -################################################################################ -# Attribute configuration -################################################################################ - - -# Property descriptor's {writable: boolean} -def is_writable(attribute): - return (not attribute.is_read_only or any( - keyword in attribute.extended_attributes - for keyword in ['PutForwards', 'Replaceable', 'LegacyLenientSetter'])) - - -def is_data_type_property(interface, attribute): - return (is_constructor_attribute(attribute) - or 'CrossOrigin' in attribute.extended_attributes) - - -# [PutForwards], [Replaceable], [LegacyLenientSetter] -def has_setter(interface, attribute): - if (is_data_type_property(interface, attribute) - and (is_constructor_attribute(attribute) - or 'Replaceable' in attribute.extended_attributes)): - return False - - return is_writable(attribute) - - -# [NotEnumerable], [LegacyUnforgeable] -def property_attributes(interface, attribute): - extended_attributes = attribute.extended_attributes - property_attributes_list = [] - if ('NotEnumerable' in extended_attributes - or is_constructor_attribute(attribute)): - property_attributes_list.append('v8::DontEnum') - if is_unforgeable(attribute): - property_attributes_list.append('v8::DontDelete') - if not is_writable(attribute): - property_attributes_list.append('v8::ReadOnly') - return property_attributes_list or ['v8::None'] - - -# [Custom], [Custom=Getter] -def has_custom_getter(attribute): - extended_attributes = attribute.extended_attributes - return ('Custom' in extended_attributes - and extended_attributes['Custom'] in [None, 'Getter']) - - -# [Custom], [Custom=Setter] -def has_custom_setter(attribute): - extended_attributes = attribute.extended_attributes - return (not attribute.is_read_only and 'Custom' in extended_attributes - and extended_attributes['Custom'] in [None, 'Setter']) - - -################################################################################ -# Constructors -################################################################################ - -idl_types.IdlType.constructor_type_name = property( - lambda self: strip_suffix(self.base_type, 'Constructor')) - - -def is_constructor_attribute(attribute): - return attribute.idl_type.name.endswith('Constructor') - - -def is_named_constructor_attribute(attribute): - return attribute.idl_type.name.endswith('ConstructorConstructor')
diff --git a/third_party/blink/renderer/bindings/scripts/v8_callback_function.py b/third_party/blink/renderer/bindings/scripts/v8_callback_function.py deleted file mode 100644 index a4a96543..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_callback_function.py +++ /dev/null
@@ -1,125 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Generate template values for a callback function. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -from v8_globals import includes -import v8_types - -CALLBACK_FUNCTION_H_INCLUDES = frozenset([ - 'platform/bindings/callback_function_base.h', - 'platform/bindings/v8_value_or_script_wrappable_adapter.h', - 'platform/wtf/forward.h', -]) -CALLBACK_FUNCTION_CPP_INCLUDES = frozenset([ - 'base/cxx17_backports.h', - 'bindings/core/v8/generated_code_helper.h', - 'bindings/core/v8/native_value_traits_impl.h', - 'bindings/core/v8/to_v8_for_core.h', - 'bindings/core/v8/v8_binding_for_core.h', - 'core/execution_context/execution_context.h', - 'platform/bindings/exception_messages.h', - 'platform/bindings/exception_state.h', - 'platform/bindings/script_forbidden_scope.h', -]) - - -def callback_function_context(callback_function): - includes.clear() - includes.update(CALLBACK_FUNCTION_CPP_INCLUDES) - idl_type = callback_function.idl_type - idl_type_str = str(idl_type) - - for argument in callback_function.arguments: - argument.idl_type.add_includes_for_type( - callback_function.extended_attributes) - - context = { - # While both |callback_function_name| and |cpp_class| are identical at - # the moment, the two are being defined because their values may change - # in the future (e.g. if we support [ImplementedAs=] in callback - # functions). - 'callback_function_name': - callback_function.name, - 'cpp_class': - 'V8%s' % callback_function.name, - 'cpp_includes': - sorted(includes), - 'forward_declarations': - sorted(forward_declarations(callback_function)), - 'header_includes': - sorted(CALLBACK_FUNCTION_H_INCLUDES), - 'idl_type': - idl_type_str, - 'is_treat_non_object_as_null': - 'LegacyTreatNonObjectAsNull' in callback_function.extended_attributes, - 'native_value_traits_tag': - v8_types.idl_type_to_native_value_traits_tag(idl_type), - 'return_cpp_type': - idl_type.cpp_type, - } - - context.update(arguments_context(callback_function.arguments)) - return context - - -def forward_declarations(callback_function): - def find_forward_declaration(idl_type): - if idl_type.is_interface_type or idl_type.is_dictionary: - return idl_type.implemented_as - elif idl_type.is_array_or_sequence_type: - return find_forward_declaration(idl_type.element_type) - return None - - declarations = set() - for argument in callback_function.arguments: - name = find_forward_declaration(argument.idl_type) - if name: - declarations.add(name) - return declarations - - -def arguments_context(arguments): - def argument_context(argument): - idl_type = argument.idl_type - return { - 'cpp_value_to_v8_value': - idl_type.cpp_value_to_v8_value( - argument.name, - isolate='GetIsolate()', - creation_context='argument_creation_context'), - 'enum_type': - idl_type.enum_type, - 'enum_values': - idl_type.enum_values, - 'is_variadic': - argument.is_variadic, - 'name': - argument.name, - 'v8_name': - 'v8_%s' % argument.name, - } - - def argument_cpp_type(argument): - if argument.idl_type.is_dictionary: - return 'const %s*' % argument.idl_type.implemented_as - - return argument.idl_type.cpp_type_args( - extended_attributes=argument.extended_attributes, - raw_type=False, - used_as_rvalue_type=True, - used_as_variadic_argument=argument.is_variadic) - - argument_declarations = [ - 'bindings::V8ValueOrScriptWrappableAdapter callback_this_value' - ] - argument_declarations.extend( - '%s %s' % (argument_cpp_type(argument), argument.name) - for argument in arguments) - return { - 'argument_declarations': argument_declarations, - 'arguments': [argument_context(argument) for argument in arguments], - }
diff --git a/third_party/blink/renderer/bindings/scripts/v8_callback_interface.py b/third_party/blink/renderer/bindings/scripts/v8_callback_interface.py deleted file mode 100644 index 33232bdb..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_callback_interface.py +++ /dev/null
@@ -1,190 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Generate template values for a callback interface. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -from idl_types import IdlTypeBase -from v8_globals import includes -from v8_interface import constant_context -import v8_types -import v8_utilities - -CALLBACK_INTERFACE_H_INCLUDES = frozenset([ - 'platform/bindings/callback_interface_base.h', - 'platform/bindings/v8_value_or_script_wrappable_adapter.h', -]) -CALLBACK_INTERFACE_CPP_INCLUDES = frozenset([ - 'bindings/core/v8/generated_code_helper.h', - 'bindings/core/v8/v8_binding_for_core.h', - 'core/execution_context/execution_context.h', - 'platform/bindings/exception_messages.h', - 'platform/bindings/script_forbidden_scope.h', -]) -LEGACY_CALLBACK_INTERFACE_H_INCLUDES = frozenset([ - 'platform/bindings/dom_wrapper_world.h', - 'platform/bindings/wrapper_type_info.h', -]) -LEGACY_CALLBACK_INTERFACE_CPP_INCLUDES = frozenset([ - 'bindings/core/v8/v8_dom_configuration.h', -]) - - -def callback_interface_context(callback_interface, _, component_info): - is_legacy_callback_interface = len(callback_interface.constants) > 0 - - includes.clear() - includes.update(CALLBACK_INTERFACE_CPP_INCLUDES) - if is_legacy_callback_interface: - includes.update(LEGACY_CALLBACK_INTERFACE_CPP_INCLUDES) - - header_includes = set(CALLBACK_INTERFACE_H_INCLUDES) - if is_legacy_callback_interface: - header_includes.update(LEGACY_CALLBACK_INTERFACE_H_INCLUDES) - - # https://heycam.github.io/webidl/#dfn-single-operation-callback-interface - is_single_operation = True - if (callback_interface.parent or len(callback_interface.attributes) > 0 - or len(callback_interface.operations) == 0): - is_single_operation = False - else: - operations = callback_interface.operations - basis = operations[0] - for op in operations[1:]: - if op.name != basis.name: - is_single_operation = False - break - - return { - 'constants': [ - constant_context(constant, callback_interface, component_info) - for constant in callback_interface.constants - ], - 'cpp_class': - callback_interface.name, - 'do_not_check_constants': - 'DoNotCheckConstants' in callback_interface.extended_attributes, - 'forward_declarations': - sorted(forward_declarations(callback_interface)), - 'header_includes': - header_includes, - 'interface_name': - callback_interface.name, - 'is_legacy_callback_interface': - is_legacy_callback_interface, - 'is_single_operation_callback_interface': - is_single_operation, - 'methods': [ - method_context(operation) - for operation in callback_interface.operations - ], - 'v8_class': - v8_utilities.v8_class_name(callback_interface), - } - - -def forward_declarations(callback_interface): - def find_forward_declaration(idl_type): - if idl_type.is_interface_type or idl_type.is_dictionary: - return idl_type.implemented_as - elif idl_type.is_array_or_sequence_type: - return find_forward_declaration(idl_type.element_type) - elif idl_type.is_nullable: - return find_forward_declaration(idl_type.inner_type) - return None - - declarations = set() - for operation in callback_interface.operations: - for argument in operation.arguments: - name = find_forward_declaration(argument.idl_type) - if name: - declarations.add(name) - return declarations - - -def add_includes_for_operation(operation): - operation.idl_type.add_includes_for_type() - for argument in operation.arguments: - argument.idl_type.add_includes_for_type() - - -def method_context(operation): - extended_attributes = operation.extended_attributes - idl_type = operation.idl_type - idl_type_str = str(idl_type) - - add_includes_for_operation(operation) - context = { - 'cpp_type': - idl_type.cpp_type, - 'idl_type': - idl_type_str, - 'name': - operation.name, - 'native_value_traits_tag': - v8_types.idl_type_to_native_value_traits_tag(idl_type), - } - context.update(arguments_context(operation.arguments)) - return context - - -def arguments_context(arguments): - def argument_context(argument): - return { - 'cpp_value_to_v8_value': - argument.idl_type.cpp_value_to_v8_value( - argument.name, - isolate='GetIsolate()', - creation_context='argument_creation_context'), - 'name': - argument.name, - 'v8_name': - 'v8_' + argument.name, - } - - def argument_cpp_type(argument): - if argument.idl_type.is_dictionary: - return 'const %s*' % argument.idl_type.implemented_as - - return argument.idl_type.cpp_type_args( - extended_attributes=argument.extended_attributes, - raw_type=False, - used_as_rvalue_type=True, - used_as_variadic_argument=argument.is_variadic) - - argument_declarations = [ - 'bindings::V8ValueOrScriptWrappableAdapter callback_this_value' - ] - argument_declarations.extend( - '%s %s' % (argument_cpp_type(argument), argument.name) - for argument in arguments) - return { - 'argument_declarations': argument_declarations, - 'arguments': [argument_context(argument) for argument in arguments], - }
diff --git a/third_party/blink/renderer/bindings/scripts/v8_dictionary.py b/third_party/blink/renderer/bindings/scripts/v8_dictionary.py deleted file mode 100644 index 5db4453..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_dictionary.py +++ /dev/null
@@ -1,379 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Generate template contexts of dictionaries for both v8 bindings and -implementation classes that are used by blink's core/modules. -""" - -from blinkbuild.name_style_converter import NameStyleConverter -from idl_types import IdlType -from utilities import to_snake_case -from v8_globals import includes -from v8_utilities import has_extended_attribute_value -import operator -import v8_types -import v8_utilities - -DICTIONARY_H_INCLUDES = frozenset([ - 'base/containers/span.h', - 'bindings/core/v8/native_value_traits.h', - 'bindings/core/v8/to_v8_for_core.h', - 'bindings/core/v8/v8_binding_for_core.h', - 'platform/heap/handle.h', -]) - -DICTIONARY_CPP_INCLUDES = frozenset([ - 'base/cxx17_backports.h', - 'platform/bindings/exception_state.h', -]) - - -def getter_name_for_dictionary_member(member): - name = v8_utilities.cpp_name(member) - return NameStyleConverter(name).to_lower_camel_case() - - -def non_null_getter_name_for_dictionary_member(member): - name = v8_utilities.cpp_name(member) - return NameStyleConverter('{}_non_null'.format(name)).to_lower_camel_case() - - -def setter_name_for_dictionary_member(member): - name = 'set_{}'.format(v8_utilities.cpp_name(member)) - return NameStyleConverter(name).to_lower_camel_case() - - -def null_setter_name_for_dictionary_member(member): - if member.idl_type.is_nullable: - name = 'set_{}_to_null'.format(v8_utilities.cpp_name(member)) - return NameStyleConverter(name).to_lower_camel_case() - return None - - -def has_method_name_for_dictionary_member(member): - name = NameStyleConverter('has_' + v8_utilities.cpp_name(member)) - return name.to_lower_camel_case() - - -def non_null_has_method_name_for_dictionary_member(member, for_non_null=False): - name = 'has_{}_non_null'.format(v8_utilities.cpp_name(member)) - return NameStyleConverter(name).to_lower_camel_case() - - -def unwrap_nullable_if_needed(idl_type): - if idl_type.is_nullable: - return idl_type.inner_type - return idl_type - - -# Context for V8 bindings - - -def dictionary_context(dictionary, interfaces_info, component_info): - includes.clear() - includes.update(DICTIONARY_CPP_INCLUDES) - - if 'RuntimeEnabled' in dictionary.extended_attributes: - raise Exception( - 'Dictionary cannot be RuntimeEnabled: %s' % dictionary.name) - - members = [ - member_context(dictionary, member, component_info) - for member in sorted( - dictionary.members, key=operator.attrgetter('name')) - ] - - for member in members: - if member['runtime_enabled_feature_name']: - includes.add('platform/runtime_enabled_features.h') - break - - has_origin_trial_members = False - for member in members: - if member['origin_trial_feature_name']: - has_origin_trial_members = True - includes.add('core/origin_trials/origin_trials.h') - includes.add('core/execution_context/execution_context.h') - break - - cpp_class = v8_utilities.cpp_name(dictionary) - context = { - 'cpp_class': - cpp_class, - 'has_origin_trial_members': - has_origin_trial_members, - 'header_includes': - set(DICTIONARY_H_INCLUDES), - 'members': - members, - 'required_member_names': - sorted([ - member.name for member in dictionary.members if member.is_required - ]), - 'use_permissive_dictionary_conversion': - 'PermissiveDictionaryConversion' in dictionary.extended_attributes, - 'v8_class': - v8_types.v8_type(cpp_class), - } - if dictionary.parent: - IdlType(dictionary.parent).add_includes_for_type() - parent_cpp_class = v8_utilities.cpp_name_from_interfaces_info( - dictionary.parent, interfaces_info) - context.update({ - 'parent_cpp_class': parent_cpp_class, - 'parent_v8_class': v8_types.v8_type(parent_cpp_class), - }) - return context - - -def member_context(_, member, component_info): - extended_attributes = member.extended_attributes - idl_type = member.idl_type - idl_type.add_includes_for_type(extended_attributes) - unwrapped_idl_type = unwrap_nullable_if_needed(idl_type) - - if member.is_required and member.default_value: - raise Exception( - 'Required member %s must not have a default value.' % member.name) - - if idl_type.is_nullable and idl_type.inner_type.is_dictionary: - raise Exception( - 'The inner type of nullable member %s must not be a dictionary.' % - member.name) - - # In most cases, we don't have to distinguish `null` and `not present`, - # and use null-states (e.g. nullptr, foo.IsUndefinedOrNull()) to show such - # states for some types for memory usage and performance. - # For types whose |has_explicit_presence| is True, we provide explicit - # states of presence. - has_explicit_presence = (idl_type.is_nullable - and idl_type.inner_type.is_interface_type) - - def default_values(): - if not member.default_value: - return None, None - if member.default_value.is_null: - return None, 'v8::Null(isolate)' - - cpp_default_value = unwrapped_idl_type.literal_cpp_value( - member.default_value) - v8_default_value = unwrapped_idl_type.cpp_value_to_v8_value( - cpp_value=cpp_default_value, - isolate='isolate', - creation_context='creationContext') - return cpp_default_value, v8_default_value - - cpp_default_value, v8_default_value = default_values() - snake_case_name = to_snake_case(member.name) - cpp_value = snake_case_name + "_cpp_value" - v8_value = snake_case_name + "_value" - has_value_or_default = snake_case_name + "_has_value_or_default" - getter_name = getter_name_for_dictionary_member(member) - runtime_features = component_info['runtime_enabled_features'] - - return { - 'cpp_default_value': - cpp_default_value, - 'cpp_type': - unwrapped_idl_type.cpp_type, - 'cpp_value': - cpp_value, - 'cpp_value_to_v8_value': - unwrapped_idl_type.cpp_value_to_v8_value( - cpp_value='impl->%s()' % getter_name, - isolate='isolate', - creation_context='creationContext', - extended_attributes=extended_attributes), - 'deprecate_as': - v8_utilities.deprecate_as(member), - 'enum_type': - idl_type.enum_type, - 'enum_values': - idl_type.enum_values, - 'getter_name': - getter_name, - 'has_explicit_presence': - has_explicit_presence, - 'has_method_name': - has_method_name_for_dictionary_member(member), - 'idl_type': - idl_type.base_type, - 'is_callback_function_type': - idl_type.is_callback_function, - 'is_interface_type': - idl_type.is_interface_type, - 'is_nullable': - idl_type.is_nullable, - 'is_object': - unwrapped_idl_type.name == 'Object', - 'is_string_type': - idl_type.preprocessed_type.is_string_type, - 'is_required': - member.is_required, - 'name': - member.name, - # [RuntimeEnabled] for origin trial - 'origin_trial_feature_name': - v8_utilities.origin_trial_feature_name(member, runtime_features), - # [RuntimeEnabled] if not in origin trial - 'runtime_enabled_feature_name': - v8_utilities.runtime_enabled_feature_name(member, runtime_features), - 'setter_name': - setter_name_for_dictionary_member(member), - 'has_value_or_default': - has_value_or_default, - 'null_setter_name': - null_setter_name_for_dictionary_member(member), - 'v8_default_value': - v8_default_value, - 'v8_value': - v8_value, - 'v8_value_to_local_cpp_value': - idl_type.v8_value_to_local_cpp_value( - extended_attributes, - v8_value, - cpp_value, - isolate='isolate', - use_exception_state=True), - } - - -# Context for implementation classes - - -def dictionary_impl_context(dictionary, interfaces_info): - def remove_duplicate_members(members): - # When [ImplementedAs] is used, cpp_name can conflict. For example, - # dictionary D { long foo; [ImplementedAs=foo, DeprecateAs=Foo] long oldFoo; }; - # This function removes such duplications, checking they have the same type. - members_dict = {} - for member in members: - cpp_name = member['cpp_name'] - duplicated_member = members_dict.get(cpp_name) - if duplicated_member and duplicated_member != member: - raise Exception('Member name conflict: %s' % cpp_name) - members_dict[cpp_name] = member - return sorted( - members_dict.values(), key=lambda member: member['cpp_name']) - - includes.clear() - header_forward_decls = set() - header_includes = set(['platform/heap/handle.h']) - members = [ - member_impl_context(member, interfaces_info, header_includes, - header_forward_decls) - for member in dictionary.members - ] - members = remove_duplicate_members(members) - context = { - 'header_forward_decls': header_forward_decls, - 'header_includes': header_includes, - 'cpp_class': v8_utilities.cpp_name(dictionary), - 'members': members, - } - if dictionary.parent: - context['parent_cpp_class'] = \ - v8_utilities.cpp_name_from_interfaces_info(dictionary.parent, - interfaces_info) - parent_interface_info = interfaces_info.get(dictionary.parent) - if parent_interface_info: - context['header_includes'].add( - parent_interface_info['include_path']) - else: - context['parent_cpp_class'] = 'IDLDictionaryBase' - context['header_includes'].add( - 'bindings/core/v8/idl_dictionary_base.h') - return context - - -def member_impl_context(member, interfaces_info, header_includes, - header_forward_decls): - idl_type = unwrap_nullable_if_needed(member.idl_type) - cpp_name = to_snake_case(v8_utilities.cpp_name(member)) - - # In most cases, we don't have to distinguish `null` and `not present`, - # and use null-states (e.g. nullptr, foo.IsUndefinedOrNull()) to show such - # states for some types for memory usage and performance. - # For types whose |has_explicit_presence| is True, we provide explicit - # states of presence. - has_explicit_presence = (member.idl_type.is_nullable - and member.idl_type.inner_type.is_interface_type) - - nullable_indicator_name = None - if not idl_type.cpp_type_has_null_value or has_explicit_presence: - nullable_indicator_name = 'has_' + cpp_name + '_' - - def has_method_expression(): - if nullable_indicator_name: - return nullable_indicator_name - if idl_type.is_union_type or idl_type.is_enum or idl_type.is_string_type: - return '!%s_.IsNull()' % cpp_name - if idl_type.name == 'Any': - return '!({0}_.IsEmpty() || {0}_.IsUndefined())'.format(cpp_name) - if idl_type.name == 'Object': - return '!({0}_.IsEmpty() || {0}_.IsNull() || {0}_.IsUndefined())'.format( - cpp_name) - return '!!%s_' % cpp_name - - cpp_default_value = None - if member.default_value: - if not member.default_value.is_null or has_explicit_presence: - cpp_default_value = idl_type.literal_cpp_value( - member.default_value) - - forward_decl_name = idl_type.impl_forward_declaration_name - if forward_decl_name: - includes.update(idl_type.impl_includes_for_type(interfaces_info)) - header_forward_decls.add(forward_decl_name) - else: - header_includes.update( - idl_type.impl_includes_for_type(interfaces_info)) - - setter_value = 'value' - non_null_type = idl_type.inner_type if idl_type.is_nullable else idl_type - setter_inline = 'inline ' if (non_null_type.is_basic_type - or non_null_type.is_enum - or non_null_type.is_wrapper_type) else '' - - extended_attributes = member.extended_attributes - - return { - 'cpp_default_value': - cpp_default_value, - 'cpp_name': - cpp_name, - 'has_explicit_presence': - has_explicit_presence, - 'getter_expression': - cpp_name + '_', - 'getter_name': - getter_name_for_dictionary_member(member), - 'has_method_expression': - has_method_expression(), - 'has_method_name': - has_method_name_for_dictionary_member(member), - 'is_nullable': - member.idl_type.is_nullable, - 'is_traceable': - idl_type.is_traceable, - 'member_cpp_type': - idl_type.cpp_type_args(used_in_cpp_sequence=True, - extended_attributes=extended_attributes), - 'non_null_getter_name': - non_null_getter_name_for_dictionary_member(member), - 'non_null_has_method_name': - non_null_has_method_name_for_dictionary_member(member), - 'null_setter_name': - null_setter_name_for_dictionary_member(member), - 'nullable_indicator_name': - nullable_indicator_name, - 'rvalue_cpp_type': - idl_type.cpp_type_args(used_as_rvalue_type=True, - extended_attributes=extended_attributes), - 'setter_inline': - setter_inline, - 'setter_name': - setter_name_for_dictionary_member(member), - 'setter_value': - setter_value, - }
diff --git a/third_party/blink/renderer/bindings/scripts/v8_globals.py b/third_party/blink/renderer/bindings/scripts/v8_globals.py deleted file mode 100644 index 49fb8615..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_globals.py +++ /dev/null
@@ -1,30 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Module to share global variables (includes and interfaces) across modules.""" - -includes = set()
diff --git a/third_party/blink/renderer/bindings/scripts/v8_interface.py b/third_party/blink/renderer/bindings/scripts/v8_interface.py deleted file mode 100644 index 60a1adb3..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_interface.py +++ /dev/null
@@ -1,1850 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# coding=utf-8 -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=relative-import -"""Generate template values for an interface. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" -import os -import sys -from operator import or_ - -sys.path.append( - os.path.join(os.path.dirname(__file__), '..', '..', 'build', 'scripts')) -from blinkbuild.name_style_converter import NameStyleConverter -from idl_definitions import IdlAttribute, IdlOperation, IdlArgument -from idl_types import IdlType, inherits_interface -from overload_set_algorithm import effective_overload_set_by_length -from overload_set_algorithm import method_overloads_by_name - -import v8_attributes -from v8_globals import includes -import v8_methods -import v8_types -import v8_utilities -from v8_utilities import ( - binding_header_filename, context_enabled_feature_name, cpp_name_or_partial, - cpp_name, has_extended_attribute_value, runtime_enabled_feature_name) - -INTERFACE_H_INCLUDES = frozenset([ - 'bindings/core/v8/generated_code_helper.h', - 'bindings/core/v8/native_value_traits.h', - 'platform/bindings/script_wrappable.h', - 'bindings/core/v8/to_v8_for_core.h', - 'bindings/core/v8/v8_binding_for_core.h', - 'platform/bindings/v8_dom_wrapper.h', - 'platform/bindings/wrapper_type_info.h', - 'platform/heap/handle.h', -]) -INTERFACE_CPP_INCLUDES = frozenset([ - 'base/memory/scoped_refptr.h', - 'bindings/core/v8/native_value_traits_impl.h', - 'bindings/core/v8/v8_dom_configuration.h', - 'core/execution_context/execution_context.h', - 'platform/scheduler/public/cooperative_scheduling_manager.h', - 'platform/bindings/exception_messages.h', - 'platform/bindings/exception_state.h', - 'platform/bindings/v8_object_constructor.h', - 'platform/wtf/get_ptr.h', -]) - - -def filter_has_constant_configuration(constants): - return [ - constant for constant in constants - if not constant['measure_as'] and not constant['deprecate_as'] - and not constant['runtime_enabled_feature_name'] - and not constant['origin_trial_feature_name'] - ] - - -def filter_has_special_getter(constants): - return [ - constant for constant in constants - if constant['measure_as'] or constant['deprecate_as'] - ] - - -def filter_runtime_enabled(constants): - return [ - constant for constant in constants - if constant['runtime_enabled_feature_name'] - ] - - -def filter_origin_trial_enabled(constants): - return [ - constant for constant in constants - if constant['origin_trial_feature_name'] - ] - - -def constant_filters(): - return { - 'has_constant_configuration': filter_has_constant_configuration, - 'has_special_getter': filter_has_special_getter, - 'runtime_enabled_constants': filter_runtime_enabled, - 'origin_trial_enabled_constants': filter_origin_trial_enabled - } - - -def origin_trial_features(interface, constants, attributes, methods): - """ Returns a list of the origin trial features used in this interface. - - Each element is a dictionary with keys 'name' and 'needs_instance'. - 'needs_instance' is true if any member associated with the interface needs - to be installed on every instance of the interface. This list is the union - of the sets of features used for constants, attributes and methods. - """ - KEY = 'origin_trial_feature_name' # pylint: disable=invalid-name - - def member_filter(members): - return sorted([member for member in members if member.get(KEY)]) - - def member_filter_by_name(members, name): - return [member for member in members if member[KEY] == name] - - # Collect all members visible on this interface with a defined origin trial - origin_trial_constants = member_filter(constants) - origin_trial_attributes = member_filter(attributes) - origin_trial_methods = member_filter([ - method for method in methods - if v8_methods.method_is_visible(method, interface.is_partial) - and not v8_methods.custom_registration(method) - ]) - - feature_names = set([ - member[KEY] for member in origin_trial_constants + - origin_trial_attributes + origin_trial_methods - ]) - - # Construct the list of dictionaries. 'needs_instance' will be true if any - # member for the feature has 'on_instance' defined as true. - features = [{ - 'name': - name, - 'constants': - member_filter_by_name(origin_trial_constants, name), - 'attributes': - member_filter_by_name(origin_trial_attributes, name), - 'methods': - member_filter_by_name(origin_trial_methods, name) - } for name in feature_names] - for feature in features: - members = feature['constants'] + feature['attributes'] + feature[ - 'methods'] - feature['needs_instance'] = any( - member.get('on_instance', False) for member in members) - # TODO(chasej): Need to handle method overloads? e.g. - # (method['overloads']['secure_context_test_all'] if 'overloads' in method else method['secure_context_test']) - feature['needs_secure_context'] = any( - member.get('secure_context_test', False) for member in members) - feature['needs_cross_origin_isolated'] = any( - member.get('cross_origin_isolated_test', False) - for member in members) - feature['needs_direct_socket_enabled'] = any( - member.get('direct_socket_enabled_test', False) - for member in members) - feature['needs_context'] = feature['needs_secure_context'] or feature[ - 'needs_cross_origin_isolated'] or feature[ - 'needs_direct_socket_enabled'] or any( - member.get('exposed_test', False) for member in members) - - if features: - includes.add('platform/bindings/script_state.h') - includes.add('platform/runtime_enabled_features.h') - includes.add('core/execution_context/execution_context.h') - - return features - - -def context_enabled_features(attributes): - """ Returns a list of context-enabled features from a set of attributes. - - Each element is a dictionary with the feature's |name| and lists of - |attributes| associated with the feature. - """ - KEY = 'context_enabled_feature_name' # pylint: disable=invalid-name - - def member_filter(members): - return sorted([ - member for member in members - if member.get(KEY) and not member.get('exposed_test') - ], key=lambda item: item['name']) - - def member_filter_by_name(members, name): - return [member for member in members if member[KEY] == name] - - # Collect all members visible on this interface with a defined origin trial - context_enabled_attributes = member_filter(attributes) - feature_names = set([member[KEY] for member in context_enabled_attributes]) - features = [{ - 'name': - name, - 'attributes': - member_filter_by_name(context_enabled_attributes, name), - 'needs_instance': - False - } for name in feature_names] - if features: - includes.add('platform/bindings/script_state.h') - return features - - -def runtime_call_stats_context(interface): - counter_prefix = 'Blink_' + v8_utilities.cpp_name(interface) + '_' - return { - 'constructor_counter': - counter_prefix + 'Constructor', - 'cross_origin_named_getter_counter': - counter_prefix + 'CrossOriginNamedGetter', - 'cross_origin_named_setter_counter': - counter_prefix + 'CrossOriginNamedSetter', - 'indexed_property_getter_counter': - counter_prefix + 'IndexedPropertyGetter', - 'named_property_getter_counter': - counter_prefix + 'NamedPropertyGetter', - 'named_property_query_counter': - counter_prefix + 'NamedPropertyQuery', - 'named_property_setter_counter': - counter_prefix + 'NamedPropertySetter', - } - - -def interface_context(interface, interfaces, component_info): - """Creates a Jinja template context for an interface. - - Args: - interface: An interface to create the context for - interfaces: A dict which maps an interface name to the definition - which can be referred if needed - component_info: A dict containing component wide information - - Returns: - A Jinja template context for |interface| - """ - - includes.clear() - includes.update(INTERFACE_CPP_INCLUDES) - header_includes = set(INTERFACE_H_INCLUDES) - - if interface.is_partial: - # A partial interface definition cannot specify that the interface - # inherits from another interface. Inheritance must be specified on - # the original interface definition. - parent_interface = None - is_event_target = False - # partial interface needs the definition of its original interface. - includes.add( - 'bindings/core/v8/%s' % binding_header_filename(interface.name)) - else: - parent_interface = interface.parent - if parent_interface: - header_includes.update( - v8_types.includes_for_interface(parent_interface)) - is_event_target = inherits_interface(interface.name, 'EventTarget') - - extended_attributes = interface.extended_attributes - - is_array_buffer_or_view = interface.idl_type.is_array_buffer_or_view - is_typed_array_type = interface.idl_type.is_typed_array - if is_array_buffer_or_view: - includes.update(('bindings/core/v8/v8_array_buffer.h', - 'bindings/core/v8/v8_shared_array_buffer.h')) - if interface.name == 'ArrayBufferView': - includes.update(('bindings/core/v8/v8_int8_array.h', - 'bindings/core/v8/v8_int16_array.h', - 'bindings/core/v8/v8_int32_array.h', - 'bindings/core/v8/v8_uint8_array.h', - 'bindings/core/v8/v8_uint8_clamped_array.h', - 'bindings/core/v8/v8_uint16_array.h', - 'bindings/core/v8/v8_uint32_array.h', - 'bindings/core/v8/v8_big_int_64_array.h', - 'bindings/core/v8/v8_big_uint_64_array.h', - 'bindings/core/v8/v8_float32_array.h', - 'bindings/core/v8/v8_float64_array.h', - 'bindings/core/v8/v8_data_view.h')) - - # [ActiveScriptWrappable] - active_scriptwrappable = 'ActiveScriptWrappable' in extended_attributes - - # [CheckSecurity] - is_check_security = 'CheckSecurity' in extended_attributes - if is_check_security: - includes.add('bindings/core/v8/binding_security.h') - includes.add('core/frame/local_dom_window.h') - - # [Global] - is_global = 'Global' in extended_attributes - - # [ImmutablePrototype] - # TODO(littledan): Is it possible to deduce this based on inheritance, - # as in the WebIDL spec? - is_immutable_prototype = is_global or 'ImmutablePrototype' in extended_attributes - - # interface mixin - assert not interface.is_mixin, ( - "Interface mixin {} must not be a direct target of bindings code generation." - .format(interface.name)) - - wrapper_class_id = ('kNodeClassId' if inherits_interface( - interface.name, 'Node') else 'kObjectClassId') - - # [LegacyUnenumerableNamedProperties] - # pylint: disable=C0103 - has_legacy_unenumerable_named_properties = ( - interface.has_named_property_getter - and 'LegacyUnenumerableNamedProperties' in extended_attributes) - - v8_class_name = v8_utilities.v8_class_name(interface) - cpp_class_name = cpp_name(interface) - cpp_class_name_or_partial = cpp_name_or_partial(interface) - v8_class_name_or_partial = v8_utilities.v8_class_name_or_partial(interface) - - # TODO(peria): Generate the target list from 'Window' and 'HTMLDocument'. - needs_runtime_enabled_installer = v8_class_name in [ - 'V8Window', 'V8HTMLDocument', 'V8Document', 'V8Node', 'V8EventTarget' - ] - - runtime_features = component_info['runtime_enabled_features'] - - context = { - 'active_scriptwrappable': - active_scriptwrappable, - 'context_enabled_feature_name': - context_enabled_feature_name(interface), # [ContextEnabled] - 'cpp_class': - cpp_class_name, - 'cpp_class_or_partial': - cpp_class_name_or_partial, - 'is_gc_type': - True, - # FIXME: Remove 'EventTarget' special handling, http://crbug.com/383699 - 'has_access_check_callbacks': (is_check_security - and interface.name != 'EventTarget'), - # [Custom=LegacyCallAsFunction] - 'has_custom_legacy_call_as_function': - has_extended_attribute_value(interface, 'Custom', - 'LegacyCallAsFunction'), - 'has_legacy_unenumerable_named_properties': - has_legacy_unenumerable_named_properties, - 'has_partial_interface': - len(interface.partial_interfaces) > 0, - 'header_includes': - header_includes, - 'interface_name': - interface.name, - 'internal_namespace': - internal_namespace(interface), - 'is_array_buffer_or_view': - is_array_buffer_or_view, - 'is_check_security': - is_check_security, - 'is_event_target': - is_event_target, - 'is_global': - is_global, - 'is_immutable_prototype': - is_immutable_prototype, - 'is_node': - inherits_interface(interface.name, 'Node'), - 'is_partial': - interface.is_partial, - 'is_typed_array_type': - is_typed_array_type, - # [MeasureAs] - 'measure_as': - v8_utilities.measure_as(interface, None), - 'needs_runtime_enabled_installer': - needs_runtime_enabled_installer, - 'origin_trial_feature_name': - v8_utilities.origin_trial_feature_name(interface, runtime_features), - 'parent_interface': - parent_interface, - 'pass_cpp_type': - cpp_name(interface) + '*', - 'runtime_call_stats': - runtime_call_stats_context(interface), - # [RuntimeEnabled] - 'runtime_enabled_feature_name': - runtime_enabled_feature_name(interface, runtime_features), - 'snake_case_v8_class': - NameStyleConverter(v8_class_name).to_snake_case(), - 'v8_class': - v8_class_name, - 'v8_class_or_partial': - v8_class_name_or_partial, - 'wrapper_class_id': - wrapper_class_id, - } - - # Constructors - constructors = [ - constructor_context(interface, constructor) - for constructor in interface.constructors - # FIXME: shouldn't put named constructors with constructors - # (currently needed for Perl compatibility) - # Handle named constructors separately - if constructor.name == 'Constructor' - ] - if len(constructors) > 1: - context['constructor_overloads'] = overloads_context( - interface, constructors) - - # [CustomConstructor] - custom_constructors = [{ # Only needed for computing interface length - 'number_of_required_arguments': - number_of_required_arguments(constructor), - } for constructor in interface.custom_constructors] - - # [HTMLConstructor] - has_html_constructor = 'HTMLConstructor' in extended_attributes - # https://html.spec.whatwg.org/C/#html-element-constructors - if has_html_constructor: - if ('Constructor' in extended_attributes - or 'LegacyNoInterfaceObject' in extended_attributes): - raise Exception( - '[HTMLConstructor] cannot be specified with ' - '[Constructor] or [LegacyNoInterfaceObject], or on ' - 'a mixin : %s' % interface.name) - includes.add('bindings/core/v8/v8_html_constructor.h') - - # [NamedConstructor] - named_constructor = named_constructor_context(interface) - - if constructors or custom_constructors or named_constructor: - if interface.is_partial: - raise Exception('[Constructor] and [NamedConstructor] MUST NOT be' - ' specified on partial interface definitions: ' - '%s' % interface.name) - if named_constructor: - includes.add('platform/bindings/v8_per_context_data.h') - includes.add('platform/bindings/v8_private_property.h') - - includes.add('platform/bindings/v8_object_constructor.h') - includes.add('core/frame/local_dom_window.h') - elif 'Measure' in extended_attributes or 'MeasureAs' in extended_attributes: - if not interface.is_partial: - raise Exception( - '[Measure] or [MeasureAs] specified for interface without a constructor: ' - '%s' % interface.name) - - # [ConstructorCallWith=Document] - if has_extended_attribute_value(interface, 'ConstructorCallWith', - 'Document'): - includes.add('core/dom/document.h') - - # [Unscopable] attributes and methods - unscopables = [] - for attribute in interface.attributes: - if 'Unscopable' in attribute.extended_attributes: - unscopables.append((attribute.name, - runtime_enabled_feature_name( - attribute, runtime_features))) - for method in interface.operations: - if 'Unscopable' in method.extended_attributes: - unscopables.append((method.name, - runtime_enabled_feature_name( - method, runtime_features))) - - # [CEReactions] - setter_or_deleters = ( - interface.indexed_property_setter, - interface.indexed_property_deleter, - interface.named_property_setter, - interface.named_property_deleter, - ) - has_ce_reactions = any( - setter_or_deleter - and 'CEReactions' in setter_or_deleter.extended_attributes - for setter_or_deleter in setter_or_deleters) - if has_ce_reactions: - includes.add('core/html/custom/ce_reactions_scope.h') - - context.update({ - 'constructors': - constructors, - 'has_custom_constructor': - bool(custom_constructors), - 'has_html_constructor': - has_html_constructor, - 'interface_length': - interface_length(constructors + custom_constructors), - # [RaisesException=Constructor] - 'is_constructor_raises_exception': - extended_attributes.get('RaisesException') == 'Constructor', - 'named_constructor': - named_constructor, - 'unscopables': - sorted(unscopables), - }) - - # Constants - context.update({ - 'constants': [ - constant_context(constant, interface, component_info) - for constant in interface.constants - ], - 'do_not_check_constants': - 'DoNotCheckConstants' in extended_attributes, - }) - - # Attributes - attributes = attributes_context(interface, interfaces, component_info) - - context.update({ - 'attributes': - attributes, - # Elements in attributes are broken in following members. - 'accessors': - v8_attributes.filter_accessors(attributes), - 'data_attributes': - v8_attributes.filter_data_attributes(attributes), - 'runtime_enabled_attributes': - v8_attributes.filter_runtime_enabled(attributes), - }) - - # Conditionally enabled attributes - conditionally_enabled_attributes = v8_attributes.filter_conditionally_enabled( - attributes) - conditional_attributes = [ - attr for attr in conditionally_enabled_attributes - if not attr['constructor_type'] - ] - conditional_interface_objects = [ - attr for attr in conditionally_enabled_attributes - if attr['constructor_type'] - ] - has_conditional_coi_attributes = any( # pylint: disable=invalid-name - v8_attributes.is_cross_origin_isolated(attr) - for attr in conditionally_enabled_attributes) - has_conditional_direct_socket_attributes = any( # pylint: disable=invalid-name - v8_attributes.is_direct_socket_enabled(attr) - for attr in conditionally_enabled_attributes) - has_conditional_secure_attributes = any( # pylint: disable=invalid-name - v8_attributes.is_secure_context(attr) - for attr in conditionally_enabled_attributes) - context.update({ - 'conditional_attributes': - conditional_attributes, - 'conditional_interface_objects': - conditional_interface_objects, - 'has_conditional_coi_attributes': - has_conditional_coi_attributes, - 'has_conditional_direct_socket_attributes': - has_conditional_direct_socket_attributes, - 'has_conditional_secure_attributes': - has_conditional_secure_attributes, - }) - - # Methods - context.update(methods_context(interface, component_info)) - methods = context['methods'] - - # Conditionally enabled methods - conditional_methods = v8_methods.filter_conditionally_enabled( - methods, interface.is_partial) - has_conditional_coi_methods = any( # pylint: disable=invalid-name - v8_methods.is_cross_origin_isolated(method) - for method in conditional_methods) - has_conditional_direct_socket_methods = any( # pylint: disable=invalid-name - v8_methods.is_direct_socket_enabled(method) - for method in conditional_methods) - has_conditional_secure_methods = any( # pylint: disable=invalid-name - v8_methods.is_secure_context(method) for method in conditional_methods) - context.update({ - 'has_conditional_coi_methods': has_conditional_coi_methods, - 'has_conditional_direct_socket_methods': - has_conditional_direct_socket_methods, - 'has_conditional_secure_methods': has_conditional_secure_methods, - 'conditional_methods': conditional_methods, - }) - - # Window.idl in Blink has indexed properties, but the spec says Window - # interface doesn't have indexed properties, instead the WindowProxy exotic - # object has indexed properties. Thus, Window interface must not support - # iterators. - has_array_iterator = (not interface.is_partial - and interface.has_indexed_elements - and interface.name != 'Window') - context.update({ - 'has_array_iterator': has_array_iterator, - 'iterable': interface.iterable, - }) - - # Conditionally enabled members - install_conditional_features_func = None # pylint: disable=invalid-name - if unscopables or conditional_interface_objects or conditional_attributes or conditional_methods: - install_conditional_features_func = ( # pylint: disable=invalid-name - v8_class_name_or_partial + '::InstallConditionalFeatures') - - context.update({ - 'install_conditional_features_func': - install_conditional_features_func, - }) - - context.update({ - 'indexed_property_getter': - property_getter(interface.indexed_property_getter, ['index']), - 'indexed_property_setter': - property_setter(interface.indexed_property_setter, interface), - 'indexed_property_deleter': - property_deleter(interface.indexed_property_deleter), - 'is_override_builtins': - 'LegacyOverrideBuiltIns' in extended_attributes, - 'named_property_getter': - property_getter(interface.named_property_getter, ['name']), - 'named_property_setter': - property_setter(interface.named_property_setter, interface), - 'named_property_deleter': - property_deleter(interface.named_property_deleter), - }) - context.update({ - 'has_named_properties_object': - is_global and context['named_property_getter'], - }) - - # Origin Trials and ContextEnabled features - context.update({ - 'optional_features': - sorted( - origin_trial_features(interface, context['constants'], - context['attributes'], context['methods']) + - context_enabled_features(context['attributes']), - key=lambda item: item['name']), - }) - if context['optional_features']: - includes.add('platform/bindings/v8_per_context_data.h') - - # Cross-origin interceptors - has_cross_origin_named_getter = False - has_cross_origin_named_setter = False - has_cross_origin_indexed_getter = False - - for attribute in attributes: - if attribute['has_cross_origin_getter']: - has_cross_origin_named_getter = True - if attribute['has_cross_origin_setter']: - has_cross_origin_named_setter = True - - # Methods are exposed as getter attributes on the interface: e.g. - # window.location gets the location attribute on the Window interface. For - # the cross-origin case, this attribute getter is guaranteed to only return - # a Function object, which the actual call is dispatched against. - for method in methods: - if method['is_cross_origin']: - has_cross_origin_named_getter = True - - has_cross_origin_named_enumerator = has_cross_origin_named_getter or has_cross_origin_named_setter # pylint: disable=invalid-name - - if (context['named_property_getter'] - and context['named_property_getter']['is_cross_origin']): - has_cross_origin_named_getter = True - - if context['indexed_property_getter'] and context[ - 'indexed_property_getter']['is_cross_origin']: - has_cross_origin_indexed_getter = True - - context.update({ - 'has_cross_origin_named_getter': - has_cross_origin_named_getter, - 'has_cross_origin_named_setter': - has_cross_origin_named_setter, - 'has_cross_origin_named_enumerator': - has_cross_origin_named_enumerator, - 'has_cross_origin_indexed_getter': - has_cross_origin_indexed_getter, - }) - - return context - - -def attributes_context(interface, interfaces, component_info): - """Creates a list of Jinja template contexts for attributes of an interface. - - Args: - interface: An interface to create contexts for - interfaces: A dict which maps an interface name to the definition - which can be referred if needed - - Returns: - A list of attribute contexts - """ - - attributes = [ - v8_attributes.attribute_context(interface, attribute, interfaces, - component_info) - for attribute in interface.attributes - ] - - has_conditional_attributes = any( - attribute['exposed_test'] for attribute in attributes) - if has_conditional_attributes and interface.is_partial: - raise Exception( - 'Conditional attributes between partial interfaces in modules ' - 'and the original interfaces(%s) in core are not allowed.' % - interface.name) - - # See also comment in methods_context. - if not interface.is_partial and (interface.maplike or interface.setlike): - if any(attribute['name'] == 'size' for attribute in attributes): - raise ValueError( - 'An interface cannot define an attribute called "size"; it is ' - 'implied by maplike/setlike in the IDL.') - size_attribute = IdlAttribute() - size_attribute.name = 'size' - size_attribute.idl_type = IdlType('unsigned long') - size_attribute.is_read_only = True - size_attribute.extended_attributes['NotEnumerable'] = None - attributes.append( - v8_attributes.attribute_context(interface, size_attribute, - interfaces, component_info)) - - return attributes - - -def methods_context(interface, component_info): - """Creates a list of Jinja template contexts for methods of an interface. - - Args: - interface: An interface to create contexts for - component_info: A dict containing component wide information - - Returns: - A dictionary with 3 keys: - 'iterator_method': An iterator context if available or None. - 'iterator_method_alias': A string that can also be used to refer to the - @@iterator symbol or None. - 'methods': A list of method contexts. - """ - - methods = [] - - if interface.original_interface: - methods.extend([ - v8_methods.method_context( - interface, operation, component_info, is_visible=False) - for operation in interface.original_interface.operations - if operation.name - ]) - methods.extend([ - v8_methods.method_context(interface, method, component_info) - for method in interface.operations if method.name - ]) # Skip anonymous special operations (methods) - if interface.partial_interfaces: - assert len(interface.partial_interfaces) == len( - set(interface.partial_interfaces)) - for partial_interface in interface.partial_interfaces: - methods.extend([ - v8_methods.method_context( - interface, operation, component_info, is_visible=False) - for operation in partial_interface.operations if operation.name - ]) - compute_method_overloads_context(interface, methods) - - def generated_method(return_type, - name, - arguments=None, - extended_attributes=None, - implemented_as=None): - operation = IdlOperation() - operation.idl_type = return_type - operation.name = name - if arguments: - operation.arguments = arguments - if extended_attributes: - operation.extended_attributes.update(extended_attributes) - if implemented_as is None: - implemented_as = name + 'ForBinding' - operation.extended_attributes['ImplementedAs'] = implemented_as - return v8_methods.method_context(interface, operation, component_info) - - def generated_argument(idl_type, - name, - is_optional=False, - extended_attributes=None): - argument = IdlArgument() - argument.idl_type = idl_type - argument.name = name - argument.is_optional = is_optional - if extended_attributes: - argument.extended_attributes.update(extended_attributes) - return argument - - # iterable<>, maplike<> and setlike<> - iterator_method = None - - # Depending on the declaration, @@iterator may be a synonym for e.g. - # 'entries' or 'values'. - iterator_method_alias = None - - # FIXME: support Iterable in partial interfaces. However, we don't - # need to support iterator overloads between interface and - # partial interface definitions. - # http://heycam.github.io/webidl/#idl-overloading - if (not interface.is_partial - and (interface.iterable or interface.maplike or interface.setlike - or interface.has_indexed_elements)): - - used_extended_attributes = {} - - if interface.iterable: - used_extended_attributes.update( - interface.iterable.extended_attributes) - elif interface.maplike: - used_extended_attributes.update( - interface.maplike.extended_attributes) - elif interface.setlike: - used_extended_attributes.update( - interface.setlike.extended_attributes) - - if 'RaisesException' in used_extended_attributes: - raise ValueError( - '[RaisesException] is implied for iterable<>/maplike<>/setlike<>' - ) - if 'CallWith' in used_extended_attributes: - raise ValueError( - '[CallWith=ScriptState] is implied for iterable<>/maplike<>/setlike<>' - ) - - used_extended_attributes.update({ - 'RaisesException': None, - 'CallWith': 'ScriptState', - }) - - forEach_extended_attributes = used_extended_attributes.copy() - forEach_extended_attributes.update({ - 'CallWith': ['ScriptState', 'ThisValue'], - }) - - def generated_iterator_method(name, implemented_as=None): - return generated_method( - return_type=IdlType('Iterator'), - name=name, - extended_attributes=used_extended_attributes, - implemented_as=implemented_as) - - if not interface.has_indexed_elements: - iterator_method = generated_iterator_method( - 'iterator', implemented_as='GetIterator') - - if interface.iterable or interface.maplike or interface.setlike: - non_overridable_methods = [] - overridable_methods = [] - - is_value_iterator = interface.iterable and interface.iterable.key_type is None - - # For value iterators, the |entries|, |forEach|, |keys| and |values| are originally set - # to corresponding properties in %ArrayPrototype%. - # For pair iterators and maplike declarations, |entries| is an alias for @@iterator - # itself. For setlike declarations, |values| is an alias for @@iterator. - if not is_value_iterator: - if not interface.setlike: - iterator_method_alias = 'entries' - entries_or_values_method = generated_iterator_method( - 'values') - else: - iterator_method_alias = 'values' - entries_or_values_method = generated_iterator_method( - 'entries') - - non_overridable_methods.extend([ - generated_iterator_method('keys'), - entries_or_values_method, - - # void forEach(ForEachIteratorCallback callback, [DefaultValue=Undefined] optional any thisArg) - generated_method( - IdlType('void'), - 'forEach', - arguments=[ - generated_argument( - IdlType('ForEachIteratorCallback'), - 'callback'), - generated_argument( - IdlType('any'), - 'thisArg', - is_optional=True, - extended_attributes={ - 'DefaultValue': 'Undefined' - }) - ], - extended_attributes=forEach_extended_attributes), - ]) - - if interface.maplike: - key_argument = generated_argument(interface.maplike.key_type, - 'key') - value_argument = generated_argument( - interface.maplike.value_type, 'value') - - non_overridable_methods.extend([ - generated_method( - IdlType('boolean'), - 'has', - arguments=[key_argument], - extended_attributes=used_extended_attributes), - generated_method( - IdlType('any'), - 'get', - arguments=[key_argument], - extended_attributes=used_extended_attributes), - ]) - - if not interface.maplike.is_read_only: - overridable_methods.extend([ - generated_method( - IdlType('void'), - 'clear', - extended_attributes=used_extended_attributes), - generated_method( - IdlType('boolean'), - 'delete', - arguments=[key_argument], - extended_attributes=used_extended_attributes), - generated_method( - IdlType(interface.name), - 'set', - arguments=[key_argument, value_argument], - extended_attributes=used_extended_attributes), - ]) - - if interface.setlike: - value_argument = generated_argument( - interface.setlike.value_type, 'value') - - non_overridable_methods.extend([ - generated_method( - IdlType('boolean'), - 'has', - arguments=[value_argument], - extended_attributes=used_extended_attributes), - ]) - - if not interface.setlike.is_read_only: - overridable_methods.extend([ - generated_method( - IdlType(interface.name), - 'add', - arguments=[value_argument], - extended_attributes=used_extended_attributes), - generated_method( - IdlType('void'), - 'clear', - extended_attributes=used_extended_attributes), - generated_method( - IdlType('boolean'), - 'delete', - arguments=[value_argument], - extended_attributes=used_extended_attributes), - ]) - - methods_by_name = {} - for method in methods: - methods_by_name.setdefault(method['name'], []).append(method) - - for non_overridable_method in non_overridable_methods: - if non_overridable_method['name'] in methods_by_name: - raise ValueError( - 'An interface cannot define an operation called "%s()", it ' - 'comes from the iterable, maplike or setlike declaration ' - 'in the IDL.' % non_overridable_method['name']) - methods.append(non_overridable_method) - - for overridable_method in overridable_methods: - if overridable_method['name'] in methods_by_name: - # FIXME: Check that the existing method is compatible. - continue - methods.append(overridable_method) - - # FIXME: maplike<> and setlike<> should also imply the presence of a - # 'size' attribute. - - # Stringifier - if interface.stringifier: - stringifier = interface.stringifier - stringifier_ext_attrs = stringifier.extended_attributes.copy() - if stringifier.attribute: - implemented_as = stringifier.attribute.name - elif stringifier.operation: - implemented_as = stringifier.operation.name - else: - implemented_as = 'toString' - methods.append( - generated_method( - return_type=IdlType('DOMString'), - name='toString', - extended_attributes=stringifier_ext_attrs, - implemented_as=implemented_as)) - - for method in methods: - # The value of the Function object’s “length” property is a Number - # determined as follows: - # 1. Let S be the effective overload set for regular operations (if the - # operation is a regular operation) or for static operations (if the - # operation is a static operation) with identifier id on interface I and - # with argument count 0. - # 2. Return the length of the shortest argument list of the entries in S. - # FIXME: This calculation doesn't take into account whether runtime - # enabled overloads are actually enabled, so length may be incorrect. - # E.g., [RuntimeEnabled=Foo] void f(); void f(long x); - # should have length 1 if Foo is not enabled, but length 0 if it is. - method['length'] = (method['overloads']['length'] - if 'overloads' in method else - method['number_of_required_arguments']) - - return { - 'iterator_method': iterator_method, - 'iterator_method_alias': iterator_method_alias, - 'methods': methods, - } - - -def reflected_name(constant_name): - """Returns the name to use for the matching constant name in blink code. - - Given an all-uppercase 'CONSTANT_NAME', returns a camel-case - 'kConstantName'. - """ - # Check for SHOUTY_CASE constants - if constant_name.upper() != constant_name: - return constant_name - return 'k' + ''.join(part.title() for part in constant_name.split('_')) - - -# [DeprecateAs], [Reflect], [RuntimeEnabled] -def constant_context(constant, interface, component_info): - extended_attributes = constant.extended_attributes - runtime_features = component_info['runtime_enabled_features'] - - return { - 'camel_case_name': - NameStyleConverter(constant.name).to_upper_camel_case(), - 'cpp_class': - extended_attributes.get('PartialInterfaceImplementedAs'), - 'cpp_type': - constant.idl_type.cpp_type, - 'deprecate_as': - v8_utilities.deprecate_as(constant), # [DeprecateAs] - 'idl_type': - constant.idl_type.name, - 'measure_as': - v8_utilities.measure_as(constant, interface), # [MeasureAs] - 'high_entropy': - v8_utilities.high_entropy(constant), # [HighEntropy] - 'name': - constant.name, - # [RuntimeEnabled] for origin trial - 'origin_trial_feature_name': - v8_utilities.origin_trial_feature_name(constant, runtime_features), - # FIXME: use 'reflected_name' as correct 'name' - 'rcs_counter': - 'Blink_' + v8_utilities.cpp_name(interface) + '_' + constant.name + - '_ConstantGetter', - 'reflected_name': - extended_attributes.get('Reflect', reflected_name(constant.name)), - # [RuntimeEnabled] if not in origin trial - 'runtime_enabled_feature_name': - runtime_enabled_feature_name(constant, runtime_features), - 'value': - constant.value, - } - - -################################################################################ -# Overloads -################################################################################ - - -def compute_method_overloads_context(interface, methods): - # Regular methods - compute_method_overloads_context_by_type( - interface, [method for method in methods if not method['is_static']]) - # Static methods - compute_method_overloads_context_by_type( - interface, [method for method in methods if method['is_static']]) - - -def compute_method_overloads_context_by_type(interface, methods): - """Computes |method.overload*| template values. - - Called separately for static and non-static (regular) methods, - as these are overloaded separately. - Modifies |method| in place for |method| in |methods|. - Doesn't change the |methods| list itself (only the values, i.e. individual - methods), so ok to treat these separately. - """ - # Add overload information only to overloaded methods, so template code can - # easily verify if a function is overloaded - for name, overloads in method_overloads_by_name(methods): - # Resolution function is generated after last overloaded function; - # package necessary information into |method.overloads| for that method. - overloads[-1]['overloads'] = overloads_context(interface, overloads) - overloads[-1]['overloads']['name'] = name - overloads[-1]['overloads']['camel_case_name'] = NameStyleConverter( - name).to_upper_camel_case() - - -def overloads_context(interface, overloads): - """Returns |overloads| template values for a single name. - - Sets |method.overload_index| in place for |method| in |overloads| - and returns dict of overall overload template values. - """ - assert len(overloads) > 1 # only apply to overloaded names - for index, method in enumerate(overloads, 1): - method['overload_index'] = index - - # [RuntimeEnabled] - if any(method.get('origin_trial_feature_name') for method in overloads): - raise Exception( - '[RuntimeEnabled] for origin trial cannot be specified on ' - 'overloaded methods: %s.%s' % (interface.name, - overloads[0]['name'])) - - effective_overloads_by_length = effective_overload_set_by_length(overloads) - lengths = [length for length, _ in effective_overloads_by_length] - name = overloads[0].get('name', '<constructor>') - camel_case_name = NameStyleConverter(name).to_upper_camel_case() - - runtime_determined_lengths = None - function_length = lengths[0] - runtime_determined_maxargs = None - maxarg = lengths[-1] - - # The special case handling below is not needed if all overloads are - # runtime enabled by the same feature. - if not common_value(overloads, 'runtime_enabled_feature_name'): - # Check if all overloads with the shortest acceptable arguments list are - # runtime enabled, in which case we need to have a runtime determined - # Function.length. - shortest_overloads = effective_overloads_by_length[0][1] - if (all( - method.get('runtime_enabled_feature_name') - for method, _, _ in shortest_overloads)): - # Generate a list of (length, runtime_enabled_feature_names) tuples. - runtime_determined_lengths = [] - for length, effective_overloads in effective_overloads_by_length: - runtime_enabled_feature_names = set( - method['runtime_enabled_feature_name'] - for method, _, _ in effective_overloads) - if None in runtime_enabled_feature_names: - # This "length" is unconditionally enabled, so stop here. - runtime_determined_lengths.append((length, [None])) - break - runtime_determined_lengths.append( - (length, sorted(runtime_enabled_feature_names))) - function_length = ('%s::%sMethodLength()' % ( - internal_namespace(interface), camel_case_name)) - - # Check if all overloads with the longest required arguments list are - # runtime enabled, in which case we need to have a runtime determined - # maximum distinguishing argument index. - longest_overloads = effective_overloads_by_length[-1][1] - if (not common_value(overloads, 'runtime_enabled_feature_name') - and all( - method.get('runtime_enabled_feature_name') - for method, _, _ in longest_overloads)): - # Generate a list of (length, runtime_enabled_feature_name) tuples. - runtime_determined_maxargs = [] - for length, effective_overloads in reversed( - effective_overloads_by_length): - runtime_enabled_feature_names = set( - method['runtime_enabled_feature_name'] - for method, _, _ in effective_overloads - if method.get('runtime_enabled_feature_name')) - if not runtime_enabled_feature_names: - # This "length" is unconditionally enabled, so stop here. - runtime_determined_maxargs.append((length, [None])) - break - runtime_determined_maxargs.append( - (length, sorted(runtime_enabled_feature_names))) - maxarg = ('%s::%sMethodMaxArg()' % (internal_namespace(interface), - camel_case_name)) - - # Check and fail if overloads disagree about whether the return type - # is a Promise or not. - promise_overload_count = sum( - 1 for method in overloads if method.get('returns_promise')) - if promise_overload_count not in (0, len(overloads)): - raise ValueError( - 'Overloads of %s have conflicting Promise/non-Promise types' % - (name)) - - has_overload_visible = False - has_overload_not_visible = False - for overload in overloads: - if overload.get('visible', True): - # If there exists an overload which is visible, need to generate - # overload_resolution, i.e. overlods_visible should be True. - has_overload_visible = True - else: - has_overload_not_visible = True - - # If some overloads are not visible and others are visible, - # the method is overloaded between core and modules. - has_partial_overloads = has_overload_visible and has_overload_not_visible - - return { - 'deprecate_all_as': - common_value(overloads, 'deprecate_as'), # [DeprecateAs] - 'exposed_test_all': - common_value(overloads, 'exposed_test'), # [Exposed] - 'length': - function_length, - 'length_tests_methods': - length_tests_methods(effective_overloads_by_length), - # 1. Let maxarg be the length of the longest type list of the - # entries in S. - 'maxarg': - maxarg, - 'measure_all_as': - common_value(overloads, 'measure_as'), # [MeasureAs] - 'returns_promise_all': - promise_overload_count > 0, - 'runtime_determined_lengths': - runtime_determined_lengths, - 'runtime_determined_maxargs': - runtime_determined_maxargs, - # [RuntimeEnabled] - 'runtime_enabled_all': - common_value(overloads, 'runtime_enabled_feature_name'), - # [CrossOriginIsolated] - 'cross_origin_isolated_test_all': - common_value(overloads, 'cross_origin_isolated_test'), - # [DirectSocketEnabled] - 'direct_socket_enabled_test_all': - common_value(overloads, 'direct_socket_enabled_test'), - # [SecureContext] - 'secure_context_test_all': - common_value(overloads, 'secure_context_test'), - 'valid_arities': ( - lengths - # Only need to report valid arities if there is a gap in the - # sequence of possible lengths, otherwise invalid length means - # "not enough arguments". - if lengths[-1] - lengths[0] != len(lengths) - 1 else None), - 'visible': - has_overload_visible, - 'has_partial_overloads': - has_partial_overloads, - } - - -def distinguishing_argument_index(entries): - """Returns the distinguishing argument index for a sequence of entries. - - Entries are elements of the effective overload set with the same number - of arguments (formally, same type list length), each a 3-tuple of the form - (callable, type list, optionality list). - - Spec: http://heycam.github.io/webidl/#dfn-distinguishing-argument-index - - If there is more than one entry in an effective overload set that has a - given type list length, then for those entries there must be an index i - such that for each pair of entries the types at index i are - distinguishable. - The lowest such index is termed the distinguishing argument index for the - entries of the effective overload set with the given type list length. - """ - # Only applicable “If there is more than one entry” - assert len(entries) > 1 - - def typename_without_nullable(idl_type): - if idl_type.is_nullable: - return idl_type.inner_type.name - return idl_type.name - - type_lists = [ - tuple(typename_without_nullable(idl_type) for idl_type in entry[1]) - for entry in entries - ] - type_list_length = len(type_lists[0]) - # Only applicable for entries that “[have] a given type list length” - assert all(len(type_list) == type_list_length for type_list in type_lists) - name = entries[0][0].get('name', 'Constructor') # for error reporting - - # The spec defines the distinguishing argument index by conditions it must - # satisfy, but does not give an algorithm. - # - # We compute the distinguishing argument index by first computing the - # minimum index where not all types are the same, and then checking that - # all types in this position are distinguishable (and the optionality lists - # up to this point are identical), since "minimum index where not all types - # are the same" is a *necessary* condition, and more direct to check than - # distinguishability. - types_by_index = (set(types) for types in zip(*type_lists)) - try: - # “In addition, for each index j, where j is less than the - # distinguishing argument index for a given type list length, the types - # at index j in all of the entries’ type lists must be the same” - index = next( - i for i, types in enumerate(types_by_index) if len(types) > 1) - except StopIteration: - raise ValueError('No distinguishing index found for %s, length %s:\n' - 'All entries have the same type list:\n' - '%s' % (name, type_list_length, type_lists[0])) - # Check optionality - # “and the booleans in the corresponding list indicating argument - # optionality must be the same.” - # FIXME: spec typo: optionality value is no longer a boolean - # https://www.w3.org/Bugs/Public/show_bug.cgi?id=25628 - initial_optionality_lists = set(entry[2][:index] for entry in entries) - if len(initial_optionality_lists) > 1: - raise ValueError( - 'Invalid optionality lists for %s, length %s:\n' - 'Optionality lists differ below distinguishing argument index %s:\n' - '%s' % (name, type_list_length, index, - set(initial_optionality_lists))) - - # Check distinguishability - # http://heycam.github.io/webidl/#dfn-distinguishable - # Use names to check for distinct types, since objects are distinct - # FIXME: check distinguishability more precisely, for validation - distinguishing_argument_type_names = [ - type_list[index] for type_list in type_lists - ] - if (len(set(distinguishing_argument_type_names)) != - len(distinguishing_argument_type_names)): - raise ValueError('Types in distinguishing argument are not distinct:\n' - '%s' % distinguishing_argument_type_names) - - return index - - -def length_tests_methods(effective_overloads_by_length): - """Returns sorted list of resolution tests and associated methods, by length. - - This builds the main data structure for the overload resolution loop. - For a given argument length, bindings test argument at distinguishing - argument index, in order given by spec: if it is compatible with - (optionality or) type required by an overloaded method, resolve to that - method. - - Returns: - [(length, [(test, method)])] - """ - return [(length, list(resolution_tests_methods(effective_overloads))) - for length, effective_overloads in effective_overloads_by_length] - - -def resolution_tests_methods(effective_overloads): - """Yields resolution test and associated method, in resolution order, for effective overloads of a given length. - - This is the heart of the resolution algorithm. - https://heycam.github.io/webidl/#dfn-overload-resolution-algorithm - - Note that a given method can be listed multiple times, with different tests! - This is to handle implicit type conversion. - - Returns: - [(test, method)] - """ - methods = [ - effective_overload[0] for effective_overload in effective_overloads - ] - if len(methods) == 1: - # If only one method with a given length, no test needed - yield 'true', methods[0] - return - - # 8. If there is more than one entry in S, then set d to be the - # distinguishing argument index for the entries of S. - index = distinguishing_argument_index(effective_overloads) - - # (11. is for handling |undefined| values for optional arguments - # before the distinguishing argument (as “missing”).) - # TODO(peria): We have to handle this step. Also in 15.4.2. - - # 12. If i = d, then: - # 12.1. Let V be args[i]. - cpp_value = 'info[%s]' % index - - # Extract argument and IDL type to simplify accessing these in each loop. - arguments = [method['arguments'][index] for method in methods] - arguments_methods = list(zip(arguments, methods)) - idl_types = [argument['idl_type_object'] for argument in arguments] - idl_types_methods = list(zip(idl_types, methods)) - - # We can’t do a single loop through all methods or simply sort them, because - # a method may be listed in multiple steps of the resolution algorithm, and - # which test to apply differs depending on the step. - # - # Instead, we need to go through all methods at each step, either finding - # first match (if only one test is allowed) or filtering to matches (if - # multiple tests are allowed), and generating an appropriate tests. - # - # In listing types, we put ellipsis (...) for shorthand nullable type(s), - # annotated type(s), and a (nullable/annotated) union type, which extend - # listed types. - # TODO(peria): Support handling general union types. https://crbug.com/838787 - - # 12.2. If V is undefined, and there is an entry in S whose list of - # optionality values has “optional” at index i, then remove from S all - # other entries. - try: - method = next(method for argument, method in arguments_methods - if argument['is_optional']) - test = '%s->IsUndefined()' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.3. Otherwise: if V is null or undefined, and there is an entry in S that - # has one of the following types at position i of its type list, - # • a nullable type - # • a dictionary type - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.is_nullable or idl_type.is_dictionary) - test = 'IsUndefinedOrNull(%s)' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.4. Otherwise: if V is a platform object, and there is an entry in S that - # has one of the following types at position i of its type list, - # • an interface type that V implements - # ... - for idl_type, method in idl_types_methods: - if idl_type.is_wrapper_type and not idl_type.is_array_buffer_or_view: - test = 'V8{idl_type}::HasInstance({cpp_value}, info.GetIsolate())'.format( - idl_type=idl_type.base_type, cpp_value=cpp_value) - yield test, method - - # 12.5. Otherwise: if V is a DOMException platform object and there is an entry - # in S that has one of the following types at position i of its type list, - # • DOMException - # • Error - # ... - # (DOMException is handled in 12.4, and we don't support Error type.) - - # 12.6. Otherwise: if Type(V) is Object, V has an [[ErrorData]] internal slot, - # and there is an entry in S that has one of the following types at position - # i of its type list, - # • Error - # ... - # (We don't support Error type.) - - # 12.7. Otherwise: if Type(V) is Object, V has an [[ArrayBufferData]] internal - # slot, and there is an entry in S that has one of the following types at - # position i of its type list, - # • ArrayBuffer - # ... - for idl_type, method in idl_types_methods: - if idl_type.is_array_buffer_or_view or idl_type.is_typed_array: - test = '{cpp_value}->Is{idl_type}()'.format( - idl_type=idl_type.base_type, cpp_value=cpp_value) - yield test, method - - # 12.8. Otherwise: if Type(V) is Object, V has a [[DataView]] internal slot, - # and there is an entry in S that has one of the following types at position - # i of its type list, - # • DataView - # ... - # (DataView is included in 12.7.) - - # 12.9. Otherwise: if Type(V) is Object, V has a [[TypedArrayName]] internal - # slot, and there is an entry in S that has one of the following types at - # position i of its type list, - # • a typed array type whose name is equal to the value of V’s - # [[TypedArrayName]] internal slot - # ... - # (TypedArrays are included in 12.7.) - - # 12.10. Otherwise: if IsCallable(V) is true, and there is an entry in S that - # has one of the following types at position i of its type list, - # • a callback function type - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.is_callback_function) - test = '%s->IsFunction()' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.11. Otherwise: if Type(V) is Object and there is an entry in S that has - # one of the following types at position i of its type list, - # • a sequence type - # • a frozen array type - # ... - # and after performing the following steps, - # 12.11.1. Let method be ? GetMethod(V, @@iterator). - # method is not undefined, then remove from S all other entries. - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.native_array_element_type) - # Either condition should be fulfilled to call this |method|. - test = '%s->IsArray()' % cpp_value - yield test, method - test = 'HasCallableIteratorSymbol(info.GetIsolate(), %s, exception_state)' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.12. Otherwise: if Type(V) is Object and there is an entry in S that has - # one of the following types at position i of its type list, - # • a callback interface type - # • a dictionary type - # • a record type - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.is_callback_interface - or idl_type.is_dictionary or idl_type.is_record_type) - test = '%s->IsObject()' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.13. Otherwise: if Type(V) is Boolean and there is an entry in S that has - # one of the following types at position i of its type list, - # • boolean - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.name == 'Boolean') - test = '%s->IsBoolean()' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.14. Otherwise: if Type(V) is Number and there is an entry in S that has - # one of the following types at position i of its type list, - # • a numeric type - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.is_numeric_type) - test = '%s->IsNumber()' % cpp_value - yield test, method - except StopIteration: - pass - - # 12.15. Otherwise: if there is an entry in S that has one of the following - # types at position i of its type list, - # • a string type - # ... - try: - method = next( - method for idl_type, method in idl_types_methods - if idl_type.is_string_type or idl_type.is_enum or ( - idl_type.is_union_type and idl_type.string_member_type)) - yield 'true', method - except StopIteration: - pass - - # 12.16. Otherwise: if there is an entry in S that has one of the following - # types at position i of its type list, - # • a numeric type - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.is_numeric_type) - yield 'true', method - except StopIteration: - pass - - # 12.17. Otherwise: if there is an entry in S that has one of the following - # types at position i of its type list, - # • boolean - # ... - try: - method = next(method for idl_type, method in idl_types_methods - if idl_type.name == 'Boolean') - yield 'true', method - except StopIteration: - pass - - -################################################################################ -# Utility functions -################################################################################ - - -def common(dicts, f): - """Returns common result of f across an iterable of dicts, or None. - - Call f for each dict and return its result if the same across all dicts. - """ - values = (f(d) for d in dicts) - first_value = next(values) - if all(value == first_value for value in values): - return first_value - return None - - -def common_key(dicts, key): - """Returns common presence of a key across an iterable of dicts, or None. - - True if all dicts have the key, False if none of the dicts have the key, - and None if some but not all dicts have the key. - """ - return common(dicts, lambda d: key in d) - - -def common_value(dicts, key): - """Returns common value of a key across an iterable of dicts, or None. - - Auxiliary function for overloads, so can consolidate an extended attribute - that appears with the same value on all items in an overload set. - """ - return common(dicts, lambda d: d.get(key)) - - -def internal_namespace(interface): - return (v8_utilities.to_snake_case(cpp_name_or_partial(interface)) + - '_v8_internal') - - -################################################################################ -# Constructors -################################################################################ - - -# [Constructor] -def constructor_context(interface, constructor): - # [RaisesException=Constructor] - is_constructor_raises_exception = \ - interface.extended_attributes.get('RaisesException') == 'Constructor' - - argument_contexts = [ - v8_methods.argument_context(interface, constructor, argument, index) - for index, argument in enumerate(constructor.arguments) - ] - - return { - 'arguments': - argument_contexts, - 'cpp_type': - cpp_name(interface) + '*', - 'cpp_value': - v8_methods.cpp_value(interface, constructor, - len(constructor.arguments)), - 'has_exception_state': - is_constructor_raises_exception - or any(argument for argument in constructor.arguments - if argument.idl_type.v8_conversion_needs_exception_state), - 'has_optional_argument_without_default_value': - any(True for argument_context in argument_contexts - if argument_context['is_optional_without_default_value']), - 'is_call_with_document': - # [ConstructorCallWith=Document] - has_extended_attribute_value(interface, 'ConstructorCallWith', - 'Document'), - 'is_call_with_execution_context': - # [ConstructorCallWith=ExecutionContext] - has_extended_attribute_value(interface, 'ConstructorCallWith', - 'ExecutionContext'), - 'is_call_with_script_state': - # [ConstructorCallWith=ScriptState] - has_extended_attribute_value(interface, 'ConstructorCallWith', - 'ScriptState'), - 'is_constructor': - True, - 'is_named_constructor': - False, - 'is_raises_exception': - is_constructor_raises_exception, - 'number_of_required_arguments': - number_of_required_arguments(constructor), - 'rcs_counter': - 'Blink_' + v8_utilities.cpp_name(interface) + '_ConstructorCallback' - } - - -# [NamedConstructor] -def named_constructor_context(interface): - extended_attributes = interface.extended_attributes - if 'NamedConstructor' not in extended_attributes: - return None - # FIXME: parser should return named constructor separately; - # included in constructors (and only name stored in extended attribute) - # for Perl compatibility - idl_constructor = interface.constructors[-1] - assert idl_constructor.name == 'NamedConstructor' - context = constructor_context(interface, idl_constructor) - context.update({ - 'name': extended_attributes['NamedConstructor'], - 'is_named_constructor': True, - }) - return context - - -def number_of_required_arguments(constructor): - return len([ - argument for argument in constructor.arguments - if not (argument.is_optional or argument.is_variadic) - ]) - - -def interface_length(constructors): - # Docs: http://heycam.github.io/webidl/#es-interface-call - if not constructors: - return 0 - return min(constructor['number_of_required_arguments'] - for constructor in constructors) - - -################################################################################ -# Special operations (methods) -# http://heycam.github.io/webidl/#idl-special-operations -################################################################################ - - -def property_getter(getter, cpp_arguments): - if not getter: - return None - - def is_null_expression(idl_type): - if idl_type.use_output_parameter_for_result or idl_type.is_string_type: - return 'result.IsNull()' - if idl_type.is_interface_type: - return '!result' - if idl_type.base_type in ('any', 'object'): - return 'result.IsEmpty()' - return '' - - extended_attributes = getter.extended_attributes - has_no_side_effect = v8_utilities.has_extended_attribute_value( - getter, 'Affects', 'Nothing') - idl_type = getter.idl_type - idl_type.add_includes_for_type(extended_attributes) - is_call_with_script_state = v8_utilities.has_extended_attribute_value( - getter, 'CallWith', 'ScriptState') - is_raises_exception = 'RaisesException' in extended_attributes - use_output_parameter_for_result = idl_type.use_output_parameter_for_result - - # FIXME: make more generic, so can use v8_methods.cpp_value - cpp_method_name = 'impl->%s' % cpp_name(getter) - - if is_call_with_script_state: - cpp_arguments.insert(0, 'script_state') - if is_raises_exception: - cpp_arguments.append('exception_state') - if use_output_parameter_for_result: - cpp_arguments.append('result') - - cpp_value = '%s(%s)' % (cpp_method_name, ', '.join(cpp_arguments)) - - return { - 'cpp_type': - idl_type.cpp_type, - 'cpp_value': - cpp_value, - 'has_no_side_effect': - has_no_side_effect, - 'is_call_with_script_state': - is_call_with_script_state, - 'is_cross_origin': - 'CrossOrigin' in extended_attributes, - 'is_custom': - 'Custom' in extended_attributes and - (not extended_attributes['Custom'] - or has_extended_attribute_value(getter, 'Custom', 'PropertyGetter')), - 'is_custom_property_enumerator': - has_extended_attribute_value(getter, 'Custom', 'PropertyEnumerator'), - 'is_custom_property_query': - has_extended_attribute_value(getter, 'Custom', 'PropertyQuery'), - # TODO(rakuco): [NotEnumerable] does not make sense here and is only - # used in non-standard IDL operations. We need to get rid of them. - 'is_enumerable': - 'NotEnumerable' not in extended_attributes, - 'is_null_expression': - is_null_expression(idl_type), - 'is_raises_exception': - is_raises_exception, - 'name': - cpp_name(getter), - 'use_output_parameter_for_result': - use_output_parameter_for_result, - 'v8_set_return_value': - idl_type.v8_set_return_value( - 'result', - extended_attributes=extended_attributes, - script_wrappable='impl'), - } - - -def property_setter(setter, interface): - if not setter: - return None - - extended_attributes = setter.extended_attributes - idl_type = setter.arguments[1].idl_type - idl_type.add_includes_for_type(extended_attributes) - is_call_with_script_state = v8_utilities.has_extended_attribute_value( - setter, 'CallWith', 'ScriptState') - is_raises_exception = 'RaisesException' in extended_attributes - is_ce_reactions = 'CEReactions' in extended_attributes - - has_type_checking_interface = idl_type.is_wrapper_type - - return { - 'has_exception_state': - (is_raises_exception or idl_type.v8_conversion_needs_exception_state), - 'has_type_checking_interface': - has_type_checking_interface, - 'idl_type': - idl_type.base_type, - 'is_call_with_script_state': - is_call_with_script_state, - 'is_ce_reactions': - is_ce_reactions, - 'is_custom': - 'Custom' in extended_attributes, - 'is_nullable': - idl_type.is_nullable, - 'is_raises_exception': - is_raises_exception, - 'name': - cpp_name(setter), - 'v8_value_to_local_cpp_value': - idl_type.v8_value_to_local_cpp_value(extended_attributes, 'v8_value', - 'property_value'), - } - - -def property_deleter(deleter): - if not deleter: - return None - - extended_attributes = deleter.extended_attributes - is_call_with_script_state = v8_utilities.has_extended_attribute_value( - deleter, 'CallWith', 'ScriptState') - is_ce_reactions = 'CEReactions' in extended_attributes - return { - 'is_call_with_script_state': is_call_with_script_state, - 'is_ce_reactions': is_ce_reactions, - 'is_custom': 'Custom' in extended_attributes, - 'is_raises_exception': 'RaisesException' in extended_attributes, - 'name': cpp_name(deleter), - }
diff --git a/third_party/blink/renderer/bindings/scripts/v8_methods.py b/third_party/blink/renderer/bindings/scripts/v8_methods.py deleted file mode 100644 index 7f5bf2c..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_methods.py +++ /dev/null
@@ -1,641 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Generate template values for methods. - -Extends IdlArgument with property |default_cpp_value|. -Extends IdlTypeBase and IdlUnionType with property |union_arguments|. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -import os -import sys - -sys.path.append( - os.path.join(os.path.dirname(__file__), '..', '..', 'build', 'scripts')) -from blinkbuild.name_style_converter import NameStyleConverter -from idl_definitions import IdlArgument, IdlOperation -from idl_types import IdlTypeBase, IdlUnionType, inherits_interface -from v8_globals import includes -import v8_types -import v8_utilities -from v8_utilities import (has_extended_attribute_value, is_unforgeable) - -# TODO(crbug.com/1174969): Remove this once Python2 is obsoleted. -if sys.version_info.major != 2: - basestring = str - - -def method_is_visible(method, interface_is_partial): - if 'overloads' in method: - return method['overloads']['visible'] and not ( - method['overloads']['has_partial_overloads'] - and interface_is_partial) - return method['visible'] and 'overload_index' not in method - - -def is_origin_trial_enabled(method): - return bool(method['origin_trial_feature_name']) - - -def is_cross_origin_isolated(method): - return bool( - method['overloads']['cross_origin_isolated_test_all'] if 'overloads' in - method else method['cross_origin_isolated_test']) - - -def is_direct_socket_enabled(method): - return bool( - method['overloads']['direct_socket_enabled_test_all'] if 'overloads' in - method else method['direct_socket_enabled_test']) - - -def is_secure_context(method): - return bool(method['overloads']['secure_context_test_all'] if 'overloads' - in method else method['secure_context_test']) - - -def is_conditionally_enabled(method): - exposed = method['overloads']['exposed_test_all'] \ - if 'overloads' in method else method['exposed_test'] - return exposed or is_secure_context(method) or is_cross_origin_isolated( - method) or is_direct_socket_enabled(method) - - -def filter_conditionally_enabled(methods, interface_is_partial): - return [ - method for method in methods - if (method_is_visible(method, interface_is_partial) - and is_conditionally_enabled(method) - and not is_origin_trial_enabled(method)) - ] - - -def custom_registration(method): - # TODO(dcheng): Currently, bindings must create a function object for each - # realm as a hack to support the incumbent realm. Remove the need for custom - # registration when Blink properly supports the incumbent realm. - if method['is_cross_origin']: - return True - if 'overloads' in method: - return (method['overloads']['runtime_determined_lengths'] - or (method['overloads']['runtime_enabled_all'] - and not is_conditionally_enabled(method))) - return method[ - 'runtime_enabled_feature_name'] and not is_conditionally_enabled( - method) - - -def filter_custom_registration(methods, interface_is_partial): - return [ - method for method in methods - if (method_is_visible(method, interface_is_partial) - and custom_registration(method)) - ] - - -def filter_method_configuration(methods, interface_is_partial): - return [ - method for method in methods - if method_is_visible(method, interface_is_partial) - and not is_origin_trial_enabled(method) - and not is_conditionally_enabled(method) - and not custom_registration(method) - ] - - -def method_filters(): - return { - 'custom_registration': filter_custom_registration, - 'has_method_configuration': filter_method_configuration - } - - -def use_local_result(method): - extended_attributes = method.extended_attributes - idl_type = method.idl_type - return (has_extended_attribute_value(method, 'CallWith', 'ScriptState') - or 'NewObject' in extended_attributes - or 'RaisesException' in extended_attributes - or idl_type.is_union_type or idl_type.is_dictionary - or idl_type.is_explicit_nullable - or v8_utilities.high_entropy(method) == 'Direct') - - -def runtime_call_stats_context(interface, method): - includes.add('platform/bindings/runtime_call_stats.h') - generic_counter_name = ( - 'Blink_' + v8_utilities.cpp_name(interface) + '_' + method.name) - (method_counter, extended_attribute_defined) = \ - v8_utilities.rcs_counter_name(method, generic_counter_name) - trace_event_name = interface.name + '.' + method.name - return { - 'extended_attribute_defined': - extended_attribute_defined, - 'method_counter': - method_counter, - 'origin_safe_method_getter_counter': - generic_counter_name + '_OriginSafeMethodGetter', - 'trace_event_name': - trace_event_name, - } - - -def method_context(interface, method, component_info, is_visible=True): - arguments = method.arguments - extended_attributes = method.extended_attributes - idl_type = method.idl_type - is_static = method.is_static - name = method.name - - if is_visible: - idl_type.add_includes_for_type(extended_attributes) - - this_cpp_value = cpp_value(interface, method, len(arguments)) - - is_call_with_script_state = has_extended_attribute_value( - method, 'CallWith', 'ScriptState') - is_call_with_this_value = has_extended_attribute_value( - method, 'CallWith', 'ThisValue') - if is_call_with_script_state or is_call_with_this_value: - includes.add('platform/bindings/script_state.h') - - # [CheckSecurity] - is_cross_origin = 'CrossOrigin' in extended_attributes - is_check_security_for_receiver = (has_extended_attribute_value( - interface, 'CheckSecurity', 'Receiver') and not is_cross_origin) - is_check_security_for_return_value = (has_extended_attribute_value( - method, 'CheckSecurity', 'ReturnValue')) - if is_check_security_for_receiver or is_check_security_for_return_value: - includes.add('bindings/core/v8/binding_security.h') - if is_check_security_for_return_value: - includes.add('core/frame/web_feature.h') - includes.add('platform/instrumentation/use_counter.h') - - is_ce_reactions = 'CEReactions' in extended_attributes - if is_ce_reactions: - includes.add('core/html/custom/ce_reactions_scope.h') - - is_raises_exception = 'RaisesException' in extended_attributes - - if 'LegacyLenientThis' in extended_attributes: - raise Exception('[LegacyLenientThis] is not supported for operations.') - - if has_extended_attribute_value(method, 'Affects', 'Nothing'): - side_effect_type = 'V8DOMConfiguration::kHasNoSideEffect' - else: - side_effect_type = 'V8DOMConfiguration::kHasSideEffect' - - # [LogActivity] - if 'LogActivity' in extended_attributes: - includes.add('platform/bindings/v8_per_context_data.h') - - argument_contexts = [ - argument_context( - interface, method, argument, index, is_visible=is_visible) - for index, argument in enumerate(arguments) - ] - - runtime_features = component_info['runtime_enabled_features'] - - return { - 'activity_logging_world_list': - v8_utilities.activity_logging_world_list(method), # [ActivityLogging] - 'arguments': - argument_contexts, - 'camel_case_name': - NameStyleConverter(name).to_upper_camel_case(), - 'cpp_type': - (v8_types.cpp_template_type('absl::optional', idl_type.cpp_type) - if idl_type.is_explicit_nullable else v8_types.cpp_type( - idl_type, extended_attributes=extended_attributes)), - 'cpp_value': - this_cpp_value, - 'cpp_type_initializer': - idl_type.cpp_type_initializer, - 'high_entropy': - v8_utilities.high_entropy(method), # [HighEntropy] - 'deprecate_as': - v8_utilities.deprecate_as(method), # [DeprecateAs] - 'do_not_test_new_object': - 'DoNotTestNewObject' in extended_attributes, - 'exposed_test': - v8_utilities.exposed(method, interface), # [Exposed] - 'has_exception_state': - is_raises_exception or is_check_security_for_receiver - or any(argument for argument in arguments - if argument_conversion_needs_exception_state(method, argument)), - 'has_optional_argument_without_default_value': - any(True for argument_context in argument_contexts - if argument_context['is_optional_without_default_value']), - 'idl_type': - idl_type.base_type, - 'is_call_with_execution_context': - has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), - 'is_call_with_script_state': - is_call_with_script_state, - 'is_call_with_this_value': - is_call_with_this_value, - 'is_ce_reactions': - is_ce_reactions, - 'is_check_security_for_receiver': - is_check_security_for_receiver, - 'is_check_security_for_return_value': - is_check_security_for_return_value, - 'is_cross_origin': - 'CrossOrigin' in extended_attributes, - 'is_custom': - 'Custom' in extended_attributes, - 'is_explicit_nullable': - idl_type.is_explicit_nullable, - 'is_new_object': - 'NewObject' in extended_attributes, - 'is_partial_interface_member': - 'PartialInterfaceImplementedAs' in extended_attributes, - 'is_per_world_bindings': - 'PerWorldBindings' in extended_attributes, - 'is_raises_exception': - is_raises_exception, - 'is_static': - is_static, - 'is_unforgeable': - is_unforgeable(method), - 'is_variadic': - arguments and arguments[-1].is_variadic, - 'measure_as': - v8_utilities.measure_as(method, interface), # [MeasureAs] - 'name': - name, - 'number_of_arguments': - len(arguments), - 'number_of_required_arguments': - len([ - argument for argument in arguments - if not (argument.is_optional or argument.is_variadic) - ]), - 'number_of_required_or_variadic_arguments': - len([argument for argument in arguments if not argument.is_optional]), - 'on_instance': - v8_utilities.on_instance(interface, method), - 'on_interface': - v8_utilities.on_interface(interface, method), - 'on_prototype': - v8_utilities.on_prototype(interface, method), - # [RuntimeEnabled] for origin trial - 'origin_trial_feature_name': - v8_utilities.origin_trial_feature_name(method, runtime_features), - 'property_attributes': - property_attributes(interface, method), - 'returns_promise': - method.returns_promise, - 'runtime_call_stats': - runtime_call_stats_context(interface, method), - # [RuntimeEnabled] if not in origin trial - 'runtime_enabled_feature_name': - v8_utilities.runtime_enabled_feature_name(method, runtime_features), - # [CrossOriginIsolated] - 'cross_origin_isolated_test': - v8_utilities.cross_origin_isolated(method, interface), - # [DirectSocketEnabled] - 'direct_socket_enabled_test': - v8_utilities.direct_socket_enabled(method, interface), - # [SecureContext] - 'secure_context_test': - v8_utilities.secure_context(method, interface), - # [Affects] - 'side_effect_type': - side_effect_type, - 'snake_case_name': - NameStyleConverter(name).to_snake_case(), - 'use_output_parameter_for_result': - idl_type.use_output_parameter_for_result, - 'use_local_result': - use_local_result(method), - 'v8_set_return_value': - v8_set_return_value(interface.name, method, this_cpp_value), - 'v8_set_return_value_for_main_world': - v8_set_return_value(interface.name, - method, - this_cpp_value, - for_main_world=True), - 'visible': - is_visible, - 'world_suffixes': - ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else - [''], # [PerWorldBindings], - } - - -def argument_context(interface, method, argument, index, is_visible=True): - extended_attributes = argument.extended_attributes - idl_type = argument.idl_type - if idl_type.has_string_context: - includes.add( - 'third_party/blink/renderer/bindings/core/v8/generated_code_helper.h' - ) - if is_visible: - idl_type.add_includes_for_type(extended_attributes) - this_cpp_value = cpp_value(interface, method, index) - is_variadic_wrapper_type = argument.is_variadic and idl_type.is_wrapper_type - - has_type_checking_interface = idl_type.is_wrapper_type - - set_default_value = argument.set_default_value - this_cpp_type = idl_type.cpp_type_args( - extended_attributes=extended_attributes, - raw_type=True, - used_as_variadic_argument=argument.is_variadic) - snake_case_name = NameStyleConverter(argument.name).to_snake_case() - context = { - 'cpp_type': (v8_types.cpp_template_type( - 'absl::optional', this_cpp_type) if idl_type.is_explicit_nullable - and not argument.is_variadic else this_cpp_type), - 'cpp_value': - this_cpp_value, - # FIXME: check that the default value's type is compatible with the argument's - 'enum_type': - idl_type.enum_type, - 'enum_values': - idl_type.enum_values, - 'handle': - '%s_handle' % snake_case_name, - # TODO(peria): remove once [DefaultValue] removed and just use - # argument.default_value. https://crbug.com/924419 - 'has_default': - 'DefaultValue' in extended_attributes or set_default_value, - 'has_type_checking_interface': - has_type_checking_interface, - # Dictionary is special-cased, but arrays and sequences shouldn't be - 'idl_type': - idl_type.base_type, - 'idl_type_object': - idl_type, - 'index': - index, - 'is_callback_function': - idl_type.is_callback_function, - 'is_callback_interface': - idl_type.is_callback_interface, - # FIXME: Remove generic 'Dictionary' special-casing - 'is_dictionary': - idl_type.is_dictionary, - 'is_explicit_nullable': - idl_type.is_explicit_nullable, - 'is_nullable': - idl_type.is_nullable, - 'is_optional': - argument.is_optional, - 'is_variadic': - argument.is_variadic, - 'is_variadic_wrapper_type': - is_variadic_wrapper_type, - 'is_wrapper_type': - idl_type.is_wrapper_type, - 'local_cpp_variable': - snake_case_name, - 'name': - argument.name, - 'set_default_value': - set_default_value, - 'use_permissive_dictionary_conversion': - 'PermissiveDictionaryConversion' in extended_attributes, - 'v8_set_return_value': - v8_set_return_value(interface.name, method, this_cpp_value), - 'v8_set_return_value_for_main_world': - v8_set_return_value( - interface.name, method, this_cpp_value, for_main_world=True), - 'v8_value_to_local_cpp_value': - v8_value_to_local_cpp_value(interface.name, method, argument, index), - } - context.update({ - 'is_optional_without_default_value': - context['is_optional'] and not context['has_default'] - and not context['is_dictionary'] - and not context['is_callback_interface'], - }) - return context - - -################################################################################ -# Value handling -################################################################################ - - -def cpp_value(interface, method, number_of_arguments): - # Truncate omitted optional arguments - arguments = method.arguments[:number_of_arguments] - cpp_arguments = [] - - if method.is_constructor: - call_with_values = interface.extended_attributes.get( - 'ConstructorCallWith') - else: - call_with_values = method.extended_attributes.get('CallWith') - cpp_arguments.extend(v8_utilities.call_with_arguments(call_with_values)) - - # Members of IDL partial interface definitions are implemented in C++ as - # static member functions, which for instance members (non-static members) - # take *impl as their first argument - if ('PartialInterfaceImplementedAs' in method.extended_attributes - and not method.is_static): - cpp_arguments.append('*impl') - for argument in arguments: - variable_name = NameStyleConverter(argument.name).to_snake_case() - cpp_arguments.append(variable_name) - - # If a method returns an IDL dictionary or union type, the return value is - # passed as an argument to impl classes. - idl_type = method.idl_type - if idl_type and idl_type.use_output_parameter_for_result: - cpp_arguments.append('result') - - if ('RaisesException' in method.extended_attributes - or (method.is_constructor and has_extended_attribute_value( - interface, 'RaisesException', 'Constructor'))): - cpp_arguments.append('exception_state') - - if method.name == 'Constructor': - base_name = 'Create' - elif method.name == 'NamedConstructor': - base_name = 'CreateForJSConstructor' - else: - base_name = v8_utilities.cpp_name(method) - - cpp_method_name = v8_utilities.scoped_name(interface, method, base_name) - return '%s(%s)' % (cpp_method_name, ', '.join(cpp_arguments)) - - -def v8_set_return_value(interface_name, - method, - cpp_value, - for_main_world=False): - idl_type = method.idl_type - extended_attributes = method.extended_attributes - if not idl_type or idl_type.name == 'void': - # Constructors and void methods don't have a return type - return None - - # [CallWith=ScriptState], [RaisesException] - if use_local_result(method): - if idl_type.is_explicit_nullable: - # result is of type absl::optional<T> - cpp_value = 'result.value()' - else: - cpp_value = 'result' - - script_wrappable = 'impl' if inherits_interface(interface_name, - 'Node') else '' - return idl_type.v8_set_return_value( - cpp_value, - extended_attributes, - script_wrappable=script_wrappable, - for_main_world=for_main_world, - is_static=method.is_static) - - -def v8_value_to_local_cpp_variadic_value(argument, - index, - for_constructor_callback=False): - assert argument.is_variadic - idl_type = v8_types.native_value_traits_type_name( - argument.idl_type, argument.extended_attributes, True) - execution_context_if_needed = '' - if argument.idl_type.has_string_context: - execution_context_if_needed = ', bindings::ExecutionContextFromV8Wrappable(impl)' - if for_constructor_callback: - execution_context_if_needed = ', CurrentExecutionContext(info.GetIsolate())' - assign_expression = 'ToImplArguments<%s>(info, %s, exception_state%s)' % ( - idl_type, index, execution_context_if_needed) - return { - 'assign_expression': assign_expression, - 'check_expression': 'exception_state.HadException()', - 'cpp_name': NameStyleConverter(argument.name).to_snake_case(), - 'declare_variable': False, - } - - -def v8_value_to_local_cpp_value(interface_name, method, argument, index): - extended_attributes = argument.extended_attributes - idl_type = argument.idl_type - name = NameStyleConverter(argument.name).to_snake_case() - v8_value = 'info[{index}]'.format(index=index) - for_constructor_callback = method.name == 'Constructor' - - if argument.is_variadic: - return v8_value_to_local_cpp_variadic_value( - argument, index, for_constructor_callback=for_constructor_callback) - return idl_type.v8_value_to_local_cpp_value( - extended_attributes, - v8_value, - name, - declare_variable=False, - use_exception_state=method.returns_promise, - for_constructor_callback=for_constructor_callback) - - -################################################################################ -# Auxiliary functions -################################################################################ - - -# [NotEnumerable], [LegacyUnforgeable] -def property_attributes(interface, method): - extended_attributes = method.extended_attributes - property_attributes_list = [] - if 'NotEnumerable' in extended_attributes: - property_attributes_list.append('v8::DontEnum') - if is_unforgeable(method): - property_attributes_list.append('v8::ReadOnly') - property_attributes_list.append('v8::DontDelete') - return property_attributes_list - - -def argument_set_default_value(argument): - idl_type = argument.idl_type - default_value = argument.default_value - variable_name = NameStyleConverter(argument.name).to_snake_case() - if not default_value: - return None - if idl_type.is_dictionary: - if argument.default_value.is_null: - return None - if argument.default_value.value == '{}': - return None - raise Exception('invalid default value for dictionary type') - if idl_type.is_array_or_sequence_type: - if default_value.value != '[]': - raise Exception('invalid default value for sequence type: %s' % - default_value.value) - # Nothing to do when we set an empty sequence as default value, but we - # need to return non-empty value so that we don't generate method calls - # without this argument. - return '/* Nothing to do */' - if idl_type.is_union_type: - if argument.default_value.is_null: - if not idl_type.includes_nullable_type: - raise Exception( - 'invalid default value for union type: null for %s' % - idl_type.name) - # Union container objects are "null" initially. - return '/* null default value */' - if default_value.value == "{}": - member_type = idl_type.dictionary_member_type - elif isinstance(default_value.value, basestring): - member_type = idl_type.string_member_type - elif isinstance(default_value.value, (int, float)): - member_type = idl_type.numeric_member_type - elif isinstance(default_value.value, bool): - member_type = idl_type.boolean_member_type - else: - member_type = None - if member_type is None: - raise Exception('invalid default value for union type: %r for %s' % - (default_value.value, idl_type.name)) - member_type_name = (member_type.inner_type.name - if member_type.is_nullable else member_type.name) - return '%s.Set%s(%s)' % (variable_name, member_type_name, - member_type.literal_cpp_value(default_value)) - return '%s = %s' % (variable_name, - idl_type.literal_cpp_value(default_value)) - - -IdlArgument.set_default_value = property(argument_set_default_value) - - -def method_returns_promise(method): - return method.idl_type and method.idl_type.name == 'Promise' - - -IdlOperation.returns_promise = property(method_returns_promise) - - -def argument_conversion_needs_exception_state(method, argument): - idl_type = argument.idl_type - return (idl_type.v8_conversion_needs_exception_state - or argument.is_variadic - or (method.returns_promise and idl_type.is_string_type))
diff --git a/third_party/blink/renderer/bindings/scripts/v8_types.py b/third_party/blink/renderer/bindings/scripts/v8_types.py deleted file mode 100644 index 9a14758..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_types.py +++ /dev/null
@@ -1,1348 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=relative-import -"""Functions for type handling and type conversion (Blink/C++ <-> V8/JS). - -Extends IdlType and IdlUnionType with V8-specific properties, methods, and -class methods. - -Spec: -http://www.w3.org/TR/WebIDL/#es-type-mapping - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -import posixpath - -from idl_types import IdlAnnotatedType -from idl_types import IdlArrayOrSequenceType -from idl_types import IdlNullableType -from idl_types import IdlRecordType -from idl_types import IdlType -from idl_types import IdlTypeBase -from idl_types import IdlUnionType -from utilities import to_snake_case -import v8_attributes # for IdlType.constructor_type_name -from v8_globals import includes -from v8_utilities import binding_header_filename, extended_attribute_value_contains - -################################################################################ -# V8-specific handling of IDL types -################################################################################ - -NON_WRAPPER_TYPES = frozenset([ - 'EventHandler', - 'NodeFilter', - 'OnBeforeUnloadEventHandler', - 'OnErrorEventHandler', -]) -TYPED_ARRAY_TYPES = frozenset([ - 'Float32Array', - 'Float64Array', - 'Int8Array', - 'Int16Array', - 'Int32Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'Uint16Array', - 'Uint32Array', - 'BigInt64Array', - 'BigUint64Array', -]) -ARRAY_BUFFER_VIEW_AND_TYPED_ARRAY_TYPES = TYPED_ARRAY_TYPES.union( - frozenset(['ArrayBufferView'])) -ARRAY_BUFFER_AND_VIEW_TYPES = TYPED_ARRAY_TYPES.union( - frozenset([ - 'ArrayBuffer', - 'ArrayBufferView', - 'DataView', - 'SharedArrayBuffer', - ])) -# We have an unfortunate hack that treats types whose name ends with -# 'Constructor' as aliases to IDL interface object. This list is used to disable -# the hack. -_CALLBACK_CONSTRUCTORS = frozenset(( - 'AnimatorConstructor', - 'BlinkAudioWorkletProcessorConstructor', - 'CustomElementConstructor', - 'NoArgumentConstructor', -)) - -IdlType.is_array_buffer_or_view = property( - lambda self: self.base_type in ARRAY_BUFFER_AND_VIEW_TYPES) - -IdlType.is_array_buffer_view_or_typed_array = property( - lambda self: self.base_type in ARRAY_BUFFER_VIEW_AND_TYPED_ARRAY_TYPES) - -IdlType.is_typed_array = property( - lambda self: self.base_type in TYPED_ARRAY_TYPES) - -IdlType.is_wrapper_type = property( - lambda self: (self.is_interface_type and not self.is_callback_interface and self.base_type not in NON_WRAPPER_TYPES) -) - -################################################################################ -# C++ types -################################################################################ - -CPP_TYPE_SAME_AS_IDL_TYPE = set([ - 'double', - 'float', -]) -CPP_INTEGER_CONVERSION_RULES = { - 'byte': 'int8_t', - 'octet': 'uint8_t', - 'short': 'int16_t', - 'unsigned short': 'uint16_t', - 'long': 'int32_t', - 'unsigned long': 'uint32_t', - 'long long': 'int64_t', - 'unsigned long long': 'uint64_t', -} -CPP_SPECIAL_CONVERSION_RULES = { - 'EventHandler': 'EventListener*', - 'OnBeforeUnloadEventHandler': 'EventListener*', - 'OnErrorEventHandler': 'EventListener*', - 'Promise': 'ScriptPromise', - 'ScriptValue': 'ScriptValue', - # FIXME: Eliminate custom bindings for XPathNSResolver http://crbug.com/345529 - 'XPathNSResolver': 'XPathNSResolver*', - 'boolean': 'bool', - 'object': 'ScriptValue', - 'unrestricted double': 'double', - 'unrestricted float': 'float', -} - - -def string_resource_mode(idl_type): - """Returns a V8StringResourceMode value corresponding to the IDL type. - - Args: - idl_type: - A string IdlType. - """ - if idl_type.is_nullable: - return 'kTreatNullAndUndefinedAsNullString' - if idl_type.is_annotated_type: - treat_null_as = idl_type.extended_attributes.get('TreatNullAs') - if treat_null_as == 'EmptyString': - return 'kTreatNullAsEmptyString' - elif treat_null_as: - raise ValueError( - 'Unknown value for [TreatNullAs]: %s' % treat_null_as) - return '' - - -def cpp_type(idl_type, - extended_attributes=None, - raw_type=False, - used_as_rvalue_type=False, - used_as_variadic_argument=False, - used_in_cpp_sequence=False): - """Returns C++ type corresponding to IDL type. - - |idl_type| argument is of type IdlType, while return value is a string - - Args: - idl_type: - IdlType - raw_type: - bool, True if idl_type's raw/primitive C++ type should be returned. - used_as_rvalue_type: - bool, True if the C++ type is used as an argument or the return - type of a method. - used_as_variadic_argument: - bool, True if the C++ type is used as a variadic argument of a method. - used_in_cpp_sequence: - bool, True if the C++ type is used as an element of a container. - Containers can be an array, a sequence, a dictionary or a record. - """ - - extended_attributes = extended_attributes or {} - idl_type = idl_type.preprocessed_type - - # Nullable types - def needs_optional_wrapper(): - if not idl_type.is_nullable or not used_in_cpp_sequence: - return False - # NativeValueTraits<T>::NullValue should exist in order to provide the - # implicit null value, if needed. - return not idl_type.inner_type.cpp_type_has_null_value - - if needs_optional_wrapper(): - inner_type = idl_type.inner_type - if inner_type.is_dictionary or inner_type.is_sequence or inner_type.is_record_type: - # TODO(jbroman, bashi): Implement this if needed. - # This is non-trivial to support because HeapVector refuses to hold - # absl::optional<>, and IDLDictionaryBase (and subclasses) have no - # integrated null state that can be distinguished from a present but - # empty dictionary. It's unclear whether this will ever come up in - # real spec WebIDL. - raise NotImplementedError( - 'Sequences of nullable dictionary, sequence or record types are not yet supported.' - ) - return 'absl::optional<%s>' % inner_type.cpp_type_args( - extended_attributes, raw_type, used_as_rvalue_type, - used_as_variadic_argument, used_in_cpp_sequence) - - # Array or sequence types - if used_as_variadic_argument: - native_array_element_type = idl_type - else: - native_array_element_type = idl_type.native_array_element_type - if native_array_element_type: - vector_type = cpp_ptr_type('Vector', 'HeapVector', - native_array_element_type.is_traceable) - vector_template_type = cpp_template_type( - vector_type, - native_array_element_type.cpp_type_args(used_in_cpp_sequence=True)) - if used_as_rvalue_type: - return 'const %s&' % vector_template_type - return vector_template_type - - # Record types. - if idl_type.is_record_type: - vector_type = cpp_ptr_type('Vector', 'HeapVector', - idl_type.value_type.is_traceable) - value_type = idl_type.value_type.cpp_type_args( - used_in_cpp_sequence=True) - vector_template_type = cpp_template_type( - vector_type, 'std::pair<String, %s>' % value_type) - if used_as_rvalue_type: - return 'const %s&' % vector_template_type - return vector_template_type - - # Simple types - base_idl_type = idl_type.base_type - - if base_idl_type in CPP_TYPE_SAME_AS_IDL_TYPE: - return base_idl_type - if base_idl_type in CPP_INTEGER_CONVERSION_RULES: - return CPP_INTEGER_CONVERSION_RULES[base_idl_type] - if base_idl_type in CPP_SPECIAL_CONVERSION_RULES: - return CPP_SPECIAL_CONVERSION_RULES[base_idl_type] - - if idl_type.is_string_type: - if idl_type.has_string_context: - return 'String' - if not raw_type: - return 'const String&' if used_as_rvalue_type else 'String' - return 'V8StringResource<%s>' % string_resource_mode(idl_type) - - if base_idl_type == 'ArrayBufferView' and 'FlexibleArrayBufferView' in extended_attributes: - return 'FlexibleArrayBufferView' - if base_idl_type in TYPED_ARRAY_TYPES and 'FlexibleArrayBufferView' in extended_attributes: - return 'Flexible' + base_idl_type - if base_idl_type in ARRAY_BUFFER_VIEW_AND_TYPED_ARRAY_TYPES or base_idl_type == 'DataView': - if 'AllowShared' in extended_attributes: - return cpp_template_type('MaybeShared', idl_type.implemented_as) - else: - return cpp_template_type('NotShared', idl_type.implemented_as) - if idl_type.is_interface_type or idl_type.is_dictionary: - implemented_as_class = idl_type.implemented_as - if raw_type or not used_in_cpp_sequence: - return implemented_as_class + '*' - if not used_in_cpp_sequence: - return implemented_as_class + '*' - if used_as_rvalue_type and idl_type.is_garbage_collected: - return 'const %s*' % implemented_as_class - return cpp_template_type('Member', implemented_as_class) - if idl_type.is_union_type: - # Avoid "AOrNullOrB" for cpp type of (A? or B) because we generate - # V8AOrBOrNull to handle nulle for (A? or B), (A or B?) and (A or B)? - def member_cpp_name(idl_type): - if idl_type.is_nullable: - return idl_type.inner_type.name - return idl_type.name - - idl_type_name = 'Or'.join( - member_cpp_name(member) for member in idl_type.member_types) - return 'const %s&' % idl_type_name if used_as_rvalue_type else idl_type_name - if idl_type.is_callback_function: - v8_type_name = 'V8' + base_idl_type - if idl_type.is_custom_callback_function: - return v8_type_name - if not used_in_cpp_sequence: - return v8_type_name + '*' - return cpp_template_type('Member', v8_type_name) - - if base_idl_type == 'void': - return base_idl_type - # Default, assume native type is a pointer with same type name as idl type - return base_idl_type + '*' - - -def cpp_type_initializer(idl_type): - """Returns a string containing a C++ initialization statement for the - corresponding type. - - |idl_type| argument is of type IdlType. - """ - - base_idl_type = idl_type.base_type - - if idl_type.native_array_element_type: - return '' - if idl_type.is_explicit_nullable: - return '' - if idl_type.is_numeric_type: - return ' = 0' - if base_idl_type == 'boolean': - return ' = false' - if (base_idl_type in NON_WRAPPER_TYPES - or base_idl_type in CPP_SPECIAL_CONVERSION_RULES - or base_idl_type == 'any' or idl_type.is_string_type - or idl_type.is_enum): - return '' - return ' = nullptr' - - -# Allow access as idl_type.cpp_type if no arguments -IdlTypeBase.cpp_type = property(cpp_type) -IdlTypeBase.cpp_type_initializer = property(cpp_type_initializer) -IdlTypeBase.cpp_type_args = cpp_type -IdlUnionType.cpp_type_initializer = '' - -IdlArrayOrSequenceType.native_array_element_type = property( - lambda self: self.element_type) - - -def cpp_template_type(template, inner_type): - """Returns C++ template specialized to type.""" - format_string = '{template}<{inner_type}>' - return format_string.format(template=template, inner_type=inner_type) - - -def cpp_ptr_type(old_type, new_type, is_gc_type): - if is_gc_type: - return new_type - return old_type - - -def v8_type(interface_name): - return 'V8' + interface_name - - -# [ImplementedAs] -# This handles [ImplementedAs] on interface types, not [ImplementedAs] in the -# interface being generated. e.g., given: -# Foo.idl: interface Foo {attribute Bar bar}; -# Bar.idl: [ImplementedAs=Zork] interface Bar {}; -# when generating bindings for Foo, the [ImplementedAs] on Bar is needed. -# This data is external to Foo.idl, and hence computed as global information in -# compute_interfaces_info.py to avoid having to parse IDLs of all used interfaces. -IdlType.implemented_as_interfaces = {} - - -def implemented_as(idl_type): - base_idl_type = idl_type.base_type - if base_idl_type in IdlType.implemented_as_interfaces: - return IdlType.implemented_as_interfaces[base_idl_type] - elif idl_type.is_callback_function or idl_type.is_callback_interface: - return 'V8%s' % base_idl_type - return base_idl_type - - -IdlType.implemented_as = property(implemented_as) - -IdlType.set_implemented_as_interfaces = classmethod( - lambda cls, new_implemented_as_interfaces: \ - cls.implemented_as_interfaces.update(new_implemented_as_interfaces) -) - -# [GarbageCollected] -IdlType.garbage_collected_types = set() - -IdlType.is_garbage_collected = property( - lambda self: self.base_type in IdlType.garbage_collected_types) - -IdlType.set_garbage_collected_types = classmethod( - lambda cls, new_garbage_collected_types: \ - cls.garbage_collected_types.update(new_garbage_collected_types) -) - - -def is_gc_type(idl_type): - return idl_type.is_garbage_collected or idl_type.is_union_type - - -IdlTypeBase.is_gc_type = property(is_gc_type) - - -def is_traceable(idl_type): - return (idl_type.is_garbage_collected or idl_type.is_callback_function - or idl_type.cpp_type in ('ScriptValue', 'ScriptPromise')) - - -IdlTypeBase.is_traceable = property(is_traceable) -IdlUnionType.is_traceable = property(lambda self: True) -IdlArrayOrSequenceType.is_traceable = property( - lambda self: self.element_type.is_traceable) -IdlRecordType.is_traceable = property( - lambda self: self.value_type.is_traceable) -IdlNullableType.is_traceable = property( - lambda self: self.inner_type.is_traceable) - -################################################################################ -# Includes -################################################################################ - -INCLUDES_FOR_TYPE = { - 'object': - set([ - 'bindings/core/v8/script_value.h', 'bindings/core/v8/idl_types.h', - 'bindings/core/v8/native_value_traits_impl.h' - ]), - 'ArrayBufferView': - set([ - 'bindings/core/v8/v8_array_buffer_view.h', - 'core/typed_arrays/array_buffer_view_helpers.h', - 'core/typed_arrays/flexible_array_buffer_view.h' - ]), - 'EventHandler': - set(['bindings/core/v8/js_event_handler.h']), - 'HTMLCollection': - set([ - 'bindings/core/v8/v8_html_collection.h', 'core/dom/class_collection.h', - 'core/dom/tag_collection.h', 'core/html/html_collection.h', - 'core/html/html_table_rows_collection.h', - 'core/html/forms/html_data_list_options_collection.h', - 'core/html/forms/html_form_controls_collection.h' - ]), - 'NodeList': - set([ - 'bindings/core/v8/v8_node_list.h', 'core/dom/name_node_list.h', - 'core/dom/node_list.h', 'core/dom/static_node_list.h', - 'core/html/forms/labels_node_list.h' - ]), - 'Promise': - set(['bindings/core/v8/script_promise.h']), - 'ScriptValue': - set(['bindings/core/v8/script_value.h']), -} - - -def includes_for_type(idl_type, extended_attributes=None): - idl_type = idl_type.preprocessed_type - extended_attributes = extended_attributes or {} - - # Simple types - base_idl_type = idl_type.base_type - if base_idl_type in INCLUDES_FOR_TYPE: - return INCLUDES_FOR_TYPE[base_idl_type] - if base_idl_type in TYPED_ARRAY_TYPES: - return INCLUDES_FOR_TYPE['ArrayBufferView'].union( - set([ - 'bindings/%s/v8/%s' % (component_dir[base_idl_type], - binding_header_filename(base_idl_type)) - ])) - if idl_type.is_basic_type: - return set([ - 'bindings/core/v8/idl_types.h', - 'bindings/core/v8/native_value_traits_impl.h' - ]) - if base_idl_type.endswith('ConstructorConstructor'): - # FIXME: rename to NamedConstructor - # FIXME: replace with a [NamedConstructorAttribute] extended attribute - # Ending with 'ConstructorConstructor' indicates a named constructor, - # and these do not have header files, as they are part of the generated - # bindings for the interface - return set() - if (base_idl_type.endswith('Constructor') - and base_idl_type not in _CALLBACK_CONSTRUCTORS): - # FIXME: replace with a [ConstructorAttribute] extended attribute - base_idl_type = idl_type.constructor_type_name - if idl_type.is_custom_callback_function: - return set() - if idl_type.is_callback_function: - component = IdlType.callback_functions[base_idl_type]['component_dir'] - return set([ - 'bindings/%s/v8/%s' % (component, - binding_header_filename(base_idl_type)) - ]) - if base_idl_type not in component_dir: - return set() - return set([ - 'bindings/%s/v8/%s' % (component_dir[base_idl_type], - binding_header_filename(base_idl_type)) - ]) - - -IdlType.includes_for_type = includes_for_type - - -def includes_for_union_type(idl_type, extended_attributes=None): - return set.union(*[ - member_type.includes_for_type(extended_attributes) - for member_type in idl_type.member_types - ]) - - -IdlUnionType.includes_for_type = includes_for_union_type - - -def includes_for_array_or_sequence_type(idl_type, extended_attributes=None): - return set.union( - set([ - 'bindings/core/v8/idl_types.h', - 'bindings/core/v8/native_value_traits_impl.h' - ]), idl_type.element_type.includes_for_type(extended_attributes)) - - -IdlArrayOrSequenceType.includes_for_type = includes_for_array_or_sequence_type - - -def includes_for_record_type(idl_type, extended_attributes=None): - return set.union( - idl_type.key_type.includes_for_type(extended_attributes), - idl_type.value_type.includes_for_type(extended_attributes)) - - -IdlRecordType.includes_for_type = includes_for_record_type - - -def add_includes_for_type(idl_type, extended_attributes=None): - includes.update(idl_type.includes_for_type(extended_attributes)) - - -IdlTypeBase.add_includes_for_type = add_includes_for_type - - -def includes_for_interface(interface_name): - return IdlType(interface_name).includes_for_type() - - -def add_includes_for_interface(interface_name): - includes.update(includes_for_interface(interface_name)) - - -def impl_includes_for_type(idl_type, interfaces_info): - includes_for_type = set() - - idl_type = idl_type.preprocessed_type - native_array_element_type = idl_type.native_array_element_type - if native_array_element_type: - includes_for_type.update( - impl_includes_for_type(native_array_element_type, interfaces_info)) - includes_for_type.add('platform/wtf/vector.h') - - base_idl_type = idl_type.base_type - if idl_type.is_string_type: - includes_for_type.add('platform/wtf/text/wtf_string.h') - if idl_type.is_record_type: - includes_for_type.update(impl_includes_for_type(idl_type.key_type, - interfaces_info)) - includes_for_type.update(impl_includes_for_type(idl_type.value_type, - interfaces_info)) - if idl_type.is_callback_function: - component = IdlType.callback_functions[base_idl_type]['component_dir'] - return set([ - 'bindings/%s/v8/%s' % (component, - binding_header_filename(base_idl_type)) - ]) - if base_idl_type in interfaces_info: - interface_info = interfaces_info[base_idl_type] - includes_for_type.add(interface_info['include_path']) - if base_idl_type in INCLUDES_FOR_TYPE: - includes_for_type.update(INCLUDES_FOR_TYPE[base_idl_type]) - if idl_type.is_array_buffer_view_or_typed_array: - return set([ - 'core/typed_arrays/dom_typed_array.h', - 'core/typed_arrays/array_buffer_view_helpers.h' - ]) - return includes_for_type - - -def impl_includes_for_type_union(idl_type, interfaces_info): - includes_for_type = set() - for member_type in idl_type.member_types: - includes_for_type.update( - member_type.impl_includes_for_type(interfaces_info)) - return includes_for_type - - -IdlTypeBase.impl_includes_for_type = impl_includes_for_type -IdlUnionType.impl_includes_for_type = impl_includes_for_type_union - - -def impl_forward_declaration_name(idl_type): - element_type = idl_type.native_array_element_type - if element_type: - return element_type.impl_forward_declaration_name - - if ((idl_type.is_wrapper_type - and not idl_type.is_array_buffer_view_or_typed_array) - or idl_type.is_dictionary): - return idl_type.implemented_as - return None - - -IdlTypeBase.impl_forward_declaration_name = property( - impl_forward_declaration_name) - -component_dir = {} - - -def set_component_dirs(new_component_dirs): - component_dir.update(new_component_dirs) - - -################################################################################ -# V8 -> C++ -################################################################################ - -# TODO(rakuco): Get rid of this definition altogether and move to NativeValueTraits<T>::nativeValue(). -# That requires not requiring ExceptionState where it is not used, and we must be careful not -# to introduce any performance regressions. -V8_VALUE_TO_CPP_VALUE = { - # Basic - 'DOMString': - '{v8_value}', - # Interface types - 'FlexibleArrayBufferView': - 'ToFlexibleArrayBufferView({isolate}, {v8_value}, {variable_name})', - 'Promise': - 'ScriptPromise::Cast(ScriptState::Current({isolate}), {v8_value})', - 'ScriptValue': - 'ScriptValue({isolate}, {v8_value})', - 'Window': - 'ToDOMWindow({isolate}, {v8_value})', - 'XPathNSResolver': - 'ToXPathNSResolver(ScriptState::Current({isolate}), {v8_value})', -} - - -def v8_conversion_needs_exception_state(idl_type): - return (idl_type.is_numeric_type or idl_type.is_enum - or idl_type.is_dictionary - or idl_type.is_array_buffer_view_or_typed_array - or idl_type.has_string_context or - idl_type.name in ('Boolean', 'ByteString', 'Object', 'USVString')) - - -IdlType.v8_conversion_needs_exception_state = property( - v8_conversion_needs_exception_state) -IdlAnnotatedType.v8_conversion_needs_exception_state = property( - v8_conversion_needs_exception_state) -IdlArrayOrSequenceType.v8_conversion_needs_exception_state = True -IdlRecordType.v8_conversion_needs_exception_state = True -IdlUnionType.v8_conversion_needs_exception_state = True - -TRIVIAL_CONVERSIONS = frozenset( - ['any', 'boolean', 'NodeFilter', 'XPathNSResolver', 'Promise']) - - -def v8_conversion_is_trivial(idl_type): - # The conversion is a simple expression that returns the converted value and - # cannot raise an exception. - return (idl_type.base_type in TRIVIAL_CONVERSIONS - or idl_type.is_wrapper_type) - - -IdlType.v8_conversion_is_trivial = property(v8_conversion_is_trivial) - - -def native_value_traits_type_name(idl_type, - extended_attributes, - in_sequence_or_record=False): - idl_type = idl_type.preprocessed_type - - if idl_type.is_string_type: - # Strings are handled separately because null and/or undefined are - # processed by V8StringResource due to the [TreatNullAs] extended - # attribute and nullable string types. - name = 'IDL%s' % idl_type.name - elif idl_type.is_nullable: - inner_type = idl_type.inner_type - inner_type_nvt_type = native_value_traits_type_name( - inner_type, extended_attributes) - # The IDL compiler has special cases to handle some nullable types in operation - # parameters, dictionary fields, etc. - if in_sequence_or_record or inner_type.name == 'Object': - name = 'IDLNullable<%s>' % inner_type_nvt_type - else: - name = inner_type_nvt_type - elif idl_type.native_array_element_type: - name = 'IDLSequence<%s>' % native_value_traits_type_name( - idl_type.native_array_element_type, extended_attributes, True) - elif idl_type.is_record_type: - name = 'IDLRecord<%s, %s>' % (native_value_traits_type_name( - idl_type.key_type, extended_attributes), - native_value_traits_type_name( - idl_type.value_type, - extended_attributes, True)) - elif idl_type.is_basic_type or idl_type.name in ['Object', 'Promise']: - name = 'IDL%s' % idl_type.name - elif idl_type.implemented_as is not None: - name = idl_type.implemented_as - else: - name = idl_type.name - return name - - -def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, - variable_name, isolate, for_constructor_callback): - if idl_type.name == 'void': - return '' - - # Simple types - idl_type = idl_type.preprocessed_type - base_idl_type = idl_type.as_union_type.name if idl_type.is_union_type else idl_type.base_type - - if 'FlexibleArrayBufferView' in extended_attributes: - if base_idl_type not in ARRAY_BUFFER_VIEW_AND_TYPED_ARRAY_TYPES: - raise ValueError( - 'Unrecognized base type for extended attribute "FlexibleArrayBufferView": %s' - % (idl_type.base_type)) - if 'AllowShared' not in extended_attributes: - raise ValueError( - '"FlexibleArrayBufferView" extended attribute requires "AllowShared" on %s' - % (idl_type.base_type)) - base_idl_type = 'FlexibleArrayBufferView' - - if 'AllowShared' in extended_attributes and not idl_type.is_array_buffer_view_or_typed_array: - raise ValueError( - 'Unrecognized base type for extended attribute "AllowShared": %s' % - (idl_type.base_type)) - - if idl_type.is_integer_type: - arguments = ', '.join([v8_value, 'exception_state']) - elif idl_type.v8_conversion_needs_exception_state: - arguments = ', '.join([v8_value, 'exception_state']) - else: - arguments = v8_value - - if idl_type.has_string_context: - execution_context = 'bindings::ExecutionContextFromV8Wrappable(impl)' - if for_constructor_callback: - execution_context = 'CurrentExecutionContext(info.GetIsolate())' - cpp_expression_format = 'NativeValueTraits<IDL%s>::NativeValue(%s, %s, exception_state, %s)' % ( - idl_type.name, isolate, v8_value, execution_context) - elif base_idl_type in V8_VALUE_TO_CPP_VALUE: - cpp_expression_format = V8_VALUE_TO_CPP_VALUE[base_idl_type] - elif idl_type.name == 'ArrayBuffer': - cpp_expression_format = ( - '{v8_value}->Is{idl_type}() ? ' - 'V8{idl_type}::ToImpl(v8::Local<v8::{idl_type}>::Cast({v8_value})) : 0' - ) - elif idl_type.is_array_buffer_view_or_typed_array or base_idl_type == 'DataView': - this_cpp_type = idl_type.cpp_type_args( - extended_attributes=extended_attributes) - if 'AllowShared' in extended_attributes: - cpp_expression_format = ( - 'ToMaybeShared<%s>({isolate}, {v8_value}, exception_state)' % - this_cpp_type) - else: - cpp_expression_format = ( - 'ToNotShared<%s>({isolate}, {v8_value}, exception_state)' % - this_cpp_type) - elif idl_type.is_union_type: - nullable = 'UnionTypeConversionMode::kNullable' if idl_type.includes_nullable_type \ - else 'UnionTypeConversionMode::kNotNullable' - # We need to consider the moving of the null through the union in order - # to generate the correct V8* class name. - this_cpp_type = idl_type.cpp_type_args( - extended_attributes=extended_attributes) - cpp_expression_format = '%s::ToImpl({isolate}, {v8_value}, {variable_name}, %s, exception_state)' % \ - (v8_type(this_cpp_type), nullable) - elif idl_type.use_output_parameter_for_result: - cpp_expression_format = 'V8{idl_type}::ToImpl({isolate}, {v8_value}, {variable_name}, exception_state)' - elif idl_type.is_callback_function: - cpp_expression_format = 'V8{idl_type}::Create({v8_value}.As<v8::Function>())' - elif idl_type.v8_conversion_needs_exception_state: - # Effectively, this if branch means everything with v8_conversion_needs_exception_state == True - # except for unions and dictionary interfaces. - base_idl_type = native_value_traits_type_name(idl_type, - extended_attributes) - cpp_expression_format = ( - 'NativeValueTraits<{idl_type}>::NativeValue({isolate}, {arguments})' - ) - else: - cpp_expression_format = ( - 'V8{idl_type}::ToImplWithTypeCheck({isolate}, {v8_value})') - - return cpp_expression_format.format( - arguments=arguments, - idl_type=base_idl_type, - v8_value=v8_value, - variable_name=variable_name, - isolate=isolate) - - -# FIXME: this function should be refactored, as this takes too many flags. -def v8_value_to_local_cpp_value(idl_type, - extended_attributes, - v8_value, - variable_name, - declare_variable=True, - isolate='info.GetIsolate()', - bailout_return_value=None, - use_exception_state=False, - code_generation_target=None, - for_constructor_callback=False): - """Returns an expression that converts a V8 value to a C++ value and stores it as a local value.""" - - this_cpp_type = idl_type.cpp_type_args( - extended_attributes=extended_attributes, raw_type=True) - idl_type = idl_type.preprocessed_type - - cpp_value = v8_value_to_cpp_value( - idl_type, - extended_attributes, - v8_value, - variable_name, - isolate, - for_constructor_callback=for_constructor_callback) - - # Optional expression that returns a value to be assigned to the local variable. - assign_expression = None - # Optional void expression executed unconditionally. - set_expression = None - # Optional expression that returns true if the conversion fails. - check_expression = None - # Optional expression used as the return value when returning. Only - # meaningful if 'check_expression' is not None. - return_expression = bailout_return_value - - if 'FlexibleArrayBufferView' in extended_attributes: - if idl_type.base_type not in ARRAY_BUFFER_VIEW_AND_TYPED_ARRAY_TYPES: - raise ValueError( - 'Unrecognized base type for extended attribute "FlexibleArrayBufferView": %s' - % (idl_type.base_type)) - set_expression = cpp_value - elif idl_type.is_string_type or idl_type.v8_conversion_needs_exception_state: - # Types for which conversion can fail and that need error handling. - - check_expression = 'exception_state.HadException()' - - if idl_type.is_union_type: - set_expression = cpp_value - else: - assign_expression = cpp_value - # Note: 'not idl_type.v8_conversion_needs_exception_state' implies - # 'idl_type.is_string_type', but there are types for which both are - # true (ByteString and USVString), so using idl_type.is_string_type - # as the condition here would be wrong. - if not idl_type.v8_conversion_needs_exception_state: - if use_exception_state: - check_expression = '!%s.Prepare(exception_state)' % variable_name - else: - check_expression = '!%s.Prepare()' % variable_name - elif not idl_type.v8_conversion_is_trivial and not idl_type.is_callback_function: - return { - 'error_message': - 'no V8 -> C++ conversion for IDL type: %s' % idl_type.name - } - else: - assign_expression = cpp_value - - # Types that don't need error handling, and simply assign a value to the - # local variable. - - if (idl_type.is_explicit_nullable - and code_generation_target == 'attribute_set'): - this_cpp_type = cpp_template_type('absl::optional', this_cpp_type) - expr = '{cpp_type}({expr})'.format( - cpp_type=this_cpp_type, expr=assign_expression) - assign_expression = ("is_null " - "? absl::nullopt " - ": {expr}".format(expr=expr)) - - return { - 'assign_expression': assign_expression, - 'check_expression': check_expression, - 'cpp_type': this_cpp_type, - 'cpp_name': variable_name, - 'declare_variable': declare_variable, - 'return_expression': return_expression, - 'set_expression': set_expression, - } - - -IdlTypeBase.v8_value_to_local_cpp_value = v8_value_to_local_cpp_value - - -def use_output_parameter_for_result(idl_type): - """True when methods/getters which return the given idl_type should - take the output argument. - """ - return idl_type.is_union_type - - -IdlTypeBase.use_output_parameter_for_result = property( - use_output_parameter_for_result) - -################################################################################ -# C++ -> V8 -################################################################################ - - -def preprocess_idl_type(idl_type): - if idl_type.is_nullable: - return IdlNullableType(idl_type.inner_type.preprocessed_type) - if idl_type.is_enum: - # Enumerations are internally DOMStrings - return IdlType('DOMString') - if idl_type.base_type == 'any' or idl_type.is_custom_callback_function: - return IdlType('ScriptValue') - if idl_type.is_callback_function: - return idl_type - return idl_type - - -IdlTypeBase.preprocessed_type = property(preprocess_idl_type) - - -def preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes): - """Returns IDL type and value, with preliminary type conversions applied.""" - idl_type = idl_type.preprocessed_type - if idl_type.name == 'Promise': - idl_type = IdlType('ScriptValue') - if idl_type.base_type in ['long long', 'unsigned long long']: - # long long and unsigned long long are not representable in ECMAScript; - # we represent them as doubles. - is_nullable = idl_type.is_nullable - idl_type = IdlType('double') - if is_nullable: - idl_type = IdlNullableType(idl_type) - cpp_value = 'static_cast<double>(%s)' % cpp_value - # HTML5 says that unsigned reflected attributes should be in the range - # [0, 2^31). When a value isn't in this range, a default value (or 0) - # should be returned instead. - extended_attributes = extended_attributes or {} - if ('Reflect' in extended_attributes - and idl_type.base_type in ['unsigned long', 'unsigned short']): - cpp_value = cpp_value.replace('GetUnsignedIntegralAttribute', - 'GetIntegralAttribute') - cpp_value = 'std::max(0, static_cast<int>(%s))' % cpp_value - return idl_type, cpp_value - - -def v8_conversion_type(idl_type, extended_attributes): - """Returns V8 conversion type, adding any additional includes. - - The V8 conversion type is used to select the C++ -> V8 conversion function - or V8SetReturnValue* function; it can be an idl_type, a cpp_type, or a - separate name for the type of conversion (e.g., 'DOMWrapper'). - """ - extended_attributes = extended_attributes or {} - - # Nullable dictionaries need to be handled differently than either - # non-nullable dictionaries or unions. - if idl_type.is_dictionary and idl_type.is_nullable: - return 'NullableDictionary' - - if idl_type.is_dictionary or idl_type.is_union_type: - return 'DictionaryOrUnion' - - # Array or sequence types - native_array_element_type = idl_type.native_array_element_type - if native_array_element_type: - return 'FrozenArray' if idl_type.is_frozen_array else 'sequence' - - # Record types. - if idl_type.is_record_type: - return 'Record' - - # Simple types - base_idl_type = idl_type.base_type - # Basic types, without additional includes - if base_idl_type in CPP_INTEGER_CONVERSION_RULES: - return CPP_INTEGER_CONVERSION_RULES[base_idl_type] - if idl_type.is_string_type: - if idl_type.is_nullable: - return 'StringOrNull' - return base_idl_type - if idl_type.is_basic_type: - return base_idl_type - if base_idl_type in ['object', 'ScriptValue']: - return 'ScriptValue' - - # Data type with potential additional includes - if base_idl_type in V8_SET_RETURN_VALUE: # Special V8SetReturnValue treatment - return base_idl_type - - # Pointer type - return 'DOMWrapper' - - -IdlTypeBase.v8_conversion_type = v8_conversion_type - -V8_SET_RETURN_VALUE = { - 'boolean': - 'V8SetReturnValueBool(info, {cpp_value})', - 'DOMString': - 'V8SetReturnValueString(info, {cpp_value}, info.GetIsolate())', - 'ByteString': - 'V8SetReturnValueString(info, {cpp_value}, info.GetIsolate())', - 'USVString': - 'V8SetReturnValueString(info, {cpp_value}, info.GetIsolate())', - 'StringOrNull': - 'V8SetReturnValueStringOrNull(info, {cpp_value}, info.GetIsolate())', - 'void': - '', - # All the int types below are converted to (u)int32_t in the V8SetReturnValue{Int,Unsigned}() calls. - # The 64-bit int types have already been converted to double when V8_SET_RETURN_VALUE is used, so they are not - # listed here. - 'int8_t': - 'V8SetReturnValueInt(info, {cpp_value})', - 'int16_t': - 'V8SetReturnValueInt(info, {cpp_value})', - 'int32_t': - 'V8SetReturnValueInt(info, {cpp_value})', - 'uint8_t': - 'V8SetReturnValueUnsigned(info, {cpp_value})', - 'uint16_t': - 'V8SetReturnValueUnsigned(info, {cpp_value})', - 'uint32_t': - 'V8SetReturnValueUnsigned(info, {cpp_value})', - # No special V8SetReturnValue* function (set value directly) - 'float': - 'V8SetReturnValue(info, {cpp_value})', - 'unrestricted float': - 'V8SetReturnValue(info, {cpp_value})', - 'double': - 'V8SetReturnValue(info, {cpp_value})', - 'unrestricted double': - 'V8SetReturnValue(info, {cpp_value})', - # No special V8SetReturnValue* function, but instead convert value to V8 - # and then use general V8SetReturnValue. - 'sequence': - 'V8SetReturnValue(info, {cpp_value})', - 'FrozenArray': - 'V8SetReturnValue(info, {cpp_value})', - 'EventHandler': - 'V8SetReturnValue(info, {cpp_value})', - 'NodeFilter': - 'V8SetReturnValue(info, {cpp_value})', - 'OnBeforeUnloadEventHandler': - 'V8SetReturnValue(info, {cpp_value})', - 'OnErrorEventHandler': - 'V8SetReturnValue(info, {cpp_value})', - 'ScriptValue': - 'V8SetReturnValue(info, {cpp_value})', - # Records. - 'Record': - 'V8SetReturnValue(info, ToV8({cpp_value}, info.Holder(), info.GetIsolate()))', - # DOMWrapper - 'DOMWrapperForMainWorld': - 'V8SetReturnValueForMainWorld(info, {cpp_value})', - 'DOMWrapperFast': - 'V8SetReturnValueFast(info, {cpp_value}, {script_wrappable})', - 'DOMWrapperDefault': - 'V8SetReturnValue(info, {cpp_value})', - # If [CheckSecurity=ReturnValue] is specified, the returned object must be - # wrapped in its own realm, which can be different from the realm of the - # receiver object. - # - # [CheckSecurity=ReturnValue] is used only for contentDocument and - # getSVGDocument attributes of HTML{IFrame,Frame,Object,Embed}Element, - # and Window.frameElement. Except for Window.frameElement, all interfaces - # support contentWindow(), so we create a new wrapper in the realm of - # contentWindow(). Note that DOMWindow* has its own realm and there is no - # need to pass |creationContext| in for ToV8(DOMWindow*). - # Window.frameElement is implemented with [Custom]. - 'DOMWrapperAcrossContext': - ('V8SetReturnValue(info, ToV8({cpp_value}, ' + - 'ToV8(impl->contentWindow(), v8::Local<v8::Object>(), ' + - 'info.GetIsolate()).As<v8::Object>(), info.GetIsolate()))'), - # Note that static attributes and operations do not check whether |this| is - # an instance of the interface nor |this|'s creation context is the same as - # the current context. So we must always use the current context as the - # creation context of the DOM wrapper for the return value. - 'DOMWrapperStatic': - 'V8SetReturnValue(info, {cpp_value}, info.GetIsolate()->GetCurrentContext()->Global())', - # Nullable dictionaries - 'NullableDictionary': - 'V8SetReturnValue(info, result)', - 'NullableDictionaryStatic': - 'V8SetReturnValue(info, result, info.GetIsolate()->GetCurrentContext()->Global())', - # Union types or dictionaries - 'DictionaryOrUnion': - 'V8SetReturnValue(info, result)', - 'DictionaryOrUnionStatic': - 'V8SetReturnValue(info, result, info.GetIsolate()->GetCurrentContext()->Global())', -} - - -def v8_set_return_value(idl_type, - cpp_value, - extended_attributes=None, - script_wrappable='', - for_main_world=False, - is_static=False): - """Returns a statement that converts a C++ value to a V8 value and sets it as a return value. - - """ - - def dom_wrapper_conversion_type(): - if ('CheckSecurity' in extended_attributes - and extended_attribute_value_contains( - extended_attributes['CheckSecurity'], 'ReturnValue')): - return 'DOMWrapperAcrossContext' - if is_static: - return 'DOMWrapperStatic' - if not script_wrappable: - return 'DOMWrapperDefault' - if for_main_world: - return 'DOMWrapperForMainWorld' - return 'DOMWrapperFast' - - idl_type, cpp_value = preprocess_idl_type_and_value( - idl_type, cpp_value, extended_attributes) - this_v8_conversion_type = idl_type.v8_conversion_type(extended_attributes) - # SetReturn-specific overrides - if this_v8_conversion_type in ('EventHandler', 'NodeFilter', - 'OnBeforeUnloadEventHandler', - 'OnErrorEventHandler', 'ScriptValue', - 'sequence', 'FrozenArray'): - # Convert value to V8 and then use general V8SetReturnValue - cpp_value = idl_type.cpp_value_to_v8_value( - cpp_value, extended_attributes=extended_attributes) - if this_v8_conversion_type == 'DOMWrapper': - this_v8_conversion_type = dom_wrapper_conversion_type() - if is_static and this_v8_conversion_type in ('NullableDictionary', - 'DictionaryOrUnion'): - this_v8_conversion_type += 'Static' - - format_string = V8_SET_RETURN_VALUE[this_v8_conversion_type] - statement = format_string.format( - cpp_value=cpp_value, script_wrappable=script_wrappable) - return statement - - -IdlTypeBase.v8_set_return_value = v8_set_return_value - -CPP_VALUE_TO_V8_VALUE = { - # Built-in types - 'DOMString': - 'V8String({isolate}, {cpp_value})', - 'ByteString': - 'V8String({isolate}, {cpp_value})', - 'USVString': - 'V8String({isolate}, {cpp_value})', - 'boolean': - 'v8::Boolean::New({isolate}, {cpp_value})', - # All the int types below are converted to (u)int32_t in the v8::Integer::New*() calls. - # The 64-bit int types have already been converted to double when CPP_VALUE_TO_V8_VALUE is used, so they are not - # listed here. - 'int8_t': - 'v8::Integer::New({isolate}, {cpp_value})', - 'int16_t': - 'v8::Integer::New({isolate}, {cpp_value})', - 'int32_t': - 'v8::Integer::New({isolate}, {cpp_value})', - 'uint8_t': - 'v8::Integer::NewFromUnsigned({isolate}, {cpp_value})', - 'uint16_t': - 'v8::Integer::NewFromUnsigned({isolate}, {cpp_value})', - 'uint32_t': - 'v8::Integer::NewFromUnsigned({isolate}, {cpp_value})', - 'float': - 'v8::Number::New({isolate}, {cpp_value})', - 'unrestricted float': - 'v8::Number::New({isolate}, {cpp_value})', - 'double': - 'v8::Number::New({isolate}, {cpp_value})', - 'unrestricted double': - 'v8::Number::New({isolate}, {cpp_value})', - 'StringOrNull': - ('({cpp_value}.IsNull() ? ' + 'v8::Null({isolate}).As<v8::Value>() : ' + - 'V8String({isolate}, {cpp_value}).As<v8::Value>())'), - # Special cases - 'EventHandler': - 'JSEventHandler::AsV8Value({isolate}, impl, {cpp_value})', - 'NodeFilter': - 'ToV8({cpp_value}, {creation_context}, {isolate})', - 'OnBeforeUnloadEventHandler': - 'JSEventHandler::AsV8Value({isolate}, impl, {cpp_value})', - 'OnErrorEventHandler': - 'JSEventHandler::AsV8Value({isolate}, impl, {cpp_value})', - 'Record': - 'ToV8({cpp_value}, {creation_context}, {isolate})', - 'ScriptValue': - '{cpp_value}.V8Value()', - # General - 'sequence': - 'ToV8({cpp_value}, {creation_context}, {isolate})', - 'FrozenArray': - 'FreezeV8Object(ToV8({cpp_value}, {creation_context}, {isolate}), {isolate})', - 'DOMWrapper': - 'ToV8({cpp_value}, {creation_context}, {isolate})', - # Passing nullable dictionaries isn't a pattern currently used - # anywhere in the web platform, and more work would be needed in - # the code generator to distinguish between passing null, and - # passing an object which happened to not contain any of the - # dictionary's defined attributes. For now, don't define - # NullableDictionary here, which will cause an exception to be - # thrown during code generation if an argument to a method is a - # nullable dictionary type. - # - # Union types or dictionaries - 'DictionaryOrUnion': - 'ToV8({cpp_value}, {creation_context}, {isolate})', -} - - -def cpp_value_to_v8_value(idl_type, - cpp_value, - isolate='info.GetIsolate()', - creation_context='info.Holder()', - extended_attributes=None): - """Returns an expression that converts a C++ value to a V8 value.""" - # the isolate parameter is needed for callback interfaces - idl_type, cpp_value = preprocess_idl_type_and_value( - idl_type, cpp_value, extended_attributes) - this_v8_conversion_type = idl_type.v8_conversion_type(extended_attributes) - format_string = CPP_VALUE_TO_V8_VALUE[this_v8_conversion_type] - statement = format_string.format( - cpp_value=cpp_value, - isolate=isolate, - creation_context=creation_context) - return statement - - -IdlTypeBase.cpp_value_to_v8_value = cpp_value_to_v8_value - - -def literal_cpp_value(idl_type, idl_literal): - """Converts an expression that is a valid C++ literal for this type.""" - # FIXME: add validation that idl_type and idl_literal are compatible - if idl_type.base_type in ('any', 'object') and idl_literal.is_null: - return 'ScriptValue::CreateNull(script_state->GetIsolate())' - literal_value = str(idl_literal) - if idl_type.base_type in ('octet', 'unsigned short', 'unsigned long'): - return literal_value + 'u' - if idl_type.is_dictionary and literal_value == '{}': - return 'MakeGarbageCollected<{}>()'.format(idl_type.base_type) - return literal_value - - -def union_literal_cpp_value(idl_type, idl_literal): - if idl_literal.is_null: - return idl_type.name + '()' - elif idl_literal.idl_type == 'DOMString': - member_type = idl_type.string_member_type - elif idl_literal.idl_type in ('integer', 'float'): - member_type = idl_type.numeric_member_type - elif idl_literal.idl_type == 'boolean': - member_type = idl_type.boolean_member_type - elif idl_literal.idl_type == 'sequence': - member_type = idl_type.sequence_member_type - elif idl_literal.idl_type == 'dictionary': - member_type = idl_type.dictionary_member_type - else: - raise ValueError('Unsupported literal type: ' + idl_literal.idl_type) - - return '%s::From%s(%s)' % (idl_type.cpp_type_args(), member_type.name, - member_type.literal_cpp_value(idl_literal)) - - -def array_or_sequence_literal_cpp_value(idl_type, idl_literal): - # Only support empty sequences. - if idl_literal.value == '[]': - return cpp_type(idl_type) + '()' - raise ValueError('Unsupported literal type: ' + idl_literal.idl_type) - - -IdlType.literal_cpp_value = literal_cpp_value -IdlUnionType.literal_cpp_value = union_literal_cpp_value -IdlArrayOrSequenceType.literal_cpp_value = array_or_sequence_literal_cpp_value - -_IDL_TYPE_TO_NATIVE_VALUE_TRAITS_TAG_MAP = { - 'DOMString': 'IDLString', - 'USVString': 'IDLUSVString', - 'DOMStringOrNull': 'IDLStringOrNull', - 'USVStringOrNull': 'IDLUSVStringOrNull', - 'any': 'ScriptValue', - 'boolean': 'IDLBoolean', - 'long': 'IDLLong', - 'sequence<DOMString>': 'IDLSequence<IDLString>', - 'unsigned short': 'IDLUnsignedShort', - 'void': None, -} - - -def idl_type_to_native_value_traits_tag(idl_type): - idl_type_str = str(idl_type) - if idl_type.is_nullable: - idl_type_str += "OrNull" - if idl_type_str in _IDL_TYPE_TO_NATIVE_VALUE_TRAITS_TAG_MAP: - return _IDL_TYPE_TO_NATIVE_VALUE_TRAITS_TAG_MAP[idl_type_str] - else: - raise Exception("Type `%s' is not supported." % idl_type_str) - - -################################################################################ -# Utility properties for nullable types -################################################################################ - - -def cpp_type_has_null_value(idl_type): - # - String types (String/AtomicString) represent null as a null string, - # i.e. one for which String::IsNull() returns true. - # - Enum types, as they are implemented as Strings. - # - Interface types and Dictionary types represent null as a null pointer. - # - Union types, as thier container classes can represent null value. - # - 'Object' and 'any' type. We use ScriptValue for object type. - return (idl_type.is_string_type or idl_type.is_enum - or idl_type.is_interface_type or idl_type.is_callback_interface - or idl_type.is_callback_function - or idl_type.is_custom_callback_function or idl_type.is_dictionary - or idl_type.is_union_type or idl_type.base_type == 'object' - or idl_type.base_type == 'any') - - -IdlTypeBase.cpp_type_has_null_value = property(cpp_type_has_null_value) - - -def is_implicit_nullable(idl_type): - # Nullable type where the corresponding C++ type supports a null value. - return idl_type.is_nullable and idl_type.cpp_type_has_null_value - - -def is_explicit_nullable(idl_type): - # Nullable type that isn't implicit nullable (see above.) For such types, - # we use absl::optional<T> or similar explicit ways to represent a null value. - return idl_type.is_nullable and not idl_type.is_implicit_nullable - - -IdlTypeBase.is_implicit_nullable = property(is_implicit_nullable) -IdlUnionType.is_implicit_nullable = False -IdlTypeBase.is_explicit_nullable = property(is_explicit_nullable) - - -def includes_nullable_type_union(idl_type): - # http://heycam.github.io/webidl/#dfn-includes-a-nullable-type - return idl_type.number_of_nullable_member_types == 1 - - -IdlTypeBase.includes_nullable_type = False -IdlNullableType.includes_nullable_type = True -IdlUnionType.includes_nullable_type = property(includes_nullable_type_union)
diff --git a/third_party/blink/renderer/bindings/scripts/v8_union.py b/third_party/blink/renderer/bindings/scripts/v8_union.py deleted file mode 100644 index dcce74ef..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_union.py +++ /dev/null
@@ -1,198 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from utilities import to_snake_case -import v8_types -import v8_utilities - -UNION_CPP_INCLUDES = frozenset([ - 'base/cxx17_backports.h', - 'bindings/core/v8/native_value_traits_impl.h', - 'bindings/core/v8/to_v8_for_core.h', -]) - -UNION_H_INCLUDES = frozenset([ - 'bindings/core/v8/dictionary.h', - 'bindings/core/v8/native_value_traits.h', - 'bindings/core/v8/v8_binding_for_core.h', - 'platform/bindings/exception_state.h', - 'platform/heap/handle.h', - 'third_party/abseil-cpp/absl/types/optional.h', -]) - -cpp_includes = set() -header_forward_decls = set() -header_includes = set() - - -def container_context(union_type, info_provider): - cpp_includes.clear() - header_forward_decls.clear() - header_includes.clear() - cpp_includes.update(UNION_CPP_INCLUDES) - header_includes.update(UNION_H_INCLUDES) - members = [] - - # These variables refer to member contexts if the given union type has - # corresponding types. They are used for V8 -> impl conversion. - array_buffer_type = None - array_buffer_view_type = None - array_or_sequence_type = None - boolean_type = None - dictionary_type = None - interface_types = [] - numeric_type = None - object_type = None - record_type = None - string_type = None - for member in sorted( - union_type.flattened_member_types, key=lambda m: m.name): - context = member_context(member, info_provider) - members.append(context) - if member.base_type == 'ArrayBuffer': - if array_buffer_type: - raise Exception('%s is ambiguous.' % union_type.name) - array_buffer_type = context - elif member.base_type == 'ArrayBufferView': - if array_buffer_view_type: - raise Exception('%s is ambiguous.' % union_type.name) - array_buffer_view_type = context - elif member.is_dictionary: - if dictionary_type: - raise Exception('%s is ambiguous.' % union_type.name) - dictionary_type = context - elif member.is_array_or_sequence_type: - if array_or_sequence_type: - raise Exception('%s is ambiguous.' % union_type.name) - array_or_sequence_type = context - elif member.base_type == 'object': - if object_type or record_type: - raise Exception('%s is ambiguous.' % union_type.name) - object_type = context - elif member.is_record_type: - if object_type or record_type: - raise Exception('%s is ambiguous.' % union_type.name) - record_type = context - elif member.is_interface_type: - interface_types.append(context) - elif member is union_type.boolean_member_type: - boolean_type = context - elif member is union_type.numeric_member_type: - numeric_type = context - elif member is union_type.string_member_type: - string_type = context - else: - raise Exception( - '%s is not supported as an union member.' % member.name) - - # Nullable restriction checks - nullable_members = union_type.number_of_nullable_member_types - if nullable_members > 1: - raise Exception( - '%s contains more than one nullable members' % union_type.name) - if dictionary_type and nullable_members == 1: - raise Exception( - '%s has a dictionary and a nullable member' % union_type.name) - - cpp_class = union_type.cpp_type - return { - 'array_buffer_type': array_buffer_type, - 'array_buffer_view_type': array_buffer_view_type, - 'array_or_sequence_type': array_or_sequence_type, - 'boolean_type': boolean_type, - 'cpp_class': cpp_class, - 'cpp_includes': sorted(cpp_includes), - 'dictionary_type': dictionary_type, - 'header_includes': sorted(header_includes), - 'header_forward_decls': sorted(header_forward_decls), - 'includes_nullable_type': union_type.includes_nullable_type, - 'interface_types': interface_types, - 'members': members, - 'numeric_type': numeric_type, - 'object_type': object_type, - 'record_type': record_type, - 'string_type': string_type, - 'type_string': str(union_type), - 'v8_class': v8_types.v8_type(cpp_class), - } - - -def _update_includes_and_forward_decls(member, info_provider): - interface_info = info_provider.interfaces_info.get(member.name, None) - if interface_info: - cpp_includes.update( - interface_info.get('dependencies_include_paths', [])) - # We need complete types for IDL dictionaries in union containers. - if member.is_dictionary or member.is_array_buffer_view_or_typed_array: - header_includes.update(member.includes_for_type()) - else: - cpp_includes.update(member.includes_for_type()) - header_forward_decls.add(member.implemented_as) - else: - if member.is_record_type: - _update_includes_and_forward_decls(member.key_type, info_provider) - _update_includes_and_forward_decls(member.value_type, - info_provider) - elif member.is_array_or_sequence_type: - _update_includes_and_forward_decls(member.element_type, - info_provider) - cpp_includes.add('bindings/core/v8/script_iterator.h') - elif member.is_union_type: - # Reaching this block means we have a union that is inside a - # record or sequence. - header_forward_decls.add(member.name) - cpp_includes.update( - [info_provider.include_path_for_union_types(member)]) - cpp_includes.update(member.includes_for_type()) - - -def member_context(member, info_provider): - _update_includes_and_forward_decls(member, info_provider) - if member.is_nullable: - member = member.inner_type - type_name = (member.inner_type - if member.is_annotated_type else member).name - # When converting a sequence or frozen array, we need to call the GetMethod(V, @@iterator) - # ES abstract operation and then use the result of that call to create a sequence from an - # iterable. For the purposes of this method, it means we need to pass |script_iterator| - # rather than |v8_value| in v8_value_to_local_cpp_value(). - if member.is_array_or_sequence_type: - v8_value_name = 'std::move(script_iterator)' - else: - v8_value_name = 'v8_value' - return { - 'cpp_name': - to_snake_case(v8_utilities.cpp_name(member)), - 'cpp_type': - member.cpp_type_args(used_in_cpp_sequence=True), - 'cpp_local_type': - member.cpp_type, - 'cpp_value_to_v8_value': - member.cpp_value_to_v8_value( - cpp_value='impl.GetAs%s()' % type_name, - isolate='isolate', - creation_context='creationContext'), - 'enum_type': - member.enum_type, - 'enum_values': - member.enum_values, - 'is_array_buffer_or_view_type': - member.is_array_buffer_or_view, - 'is_array_buffer_view_or_typed_array': - member.is_array_buffer_view_or_typed_array, - 'is_traceable': - member.is_traceable, - 'rvalue_cpp_type': - member.cpp_type_args(used_as_rvalue_type=True), - 'specific_type_enum': - 'k' + member.name, - 'type_name': - type_name, - 'v8_value_to_local_cpp_value': - member.v8_value_to_local_cpp_value({}, - v8_value_name, - 'cpp_value', - isolate='isolate', - use_exception_state=True) - }
diff --git a/third_party/blink/renderer/bindings/scripts/v8_utilities.py b/third_party/blink/renderer/bindings/scripts/v8_utilities.py deleted file mode 100644 index 7432ab4e..0000000 --- a/third_party/blink/renderer/bindings/scripts/v8_utilities.py +++ /dev/null
@@ -1,716 +0,0 @@ -# Copyright (C) 2013 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""Functions shared by various parts of the code generator. - -Design doc: http://www.chromium.org/developers/design-documents/idl-compiler -""" - -import os -import re -import sys - -from blinkbuild.name_style_converter import NameStyleConverter -from idl_types import IdlTypeBase -import idl_types -from idl_definitions import Exposure, IdlInterface, IdlAttribute -from utilities import to_snake_case -from v8_globals import includes - -ACRONYMS = [ - 'CSSOM', # must come *before* CSS to match full acronym - 'CSS', - 'HTML', - 'IME', - 'JS', - 'SMIL', - 'SVG', - 'URL', - 'WOFF', - 'XML', - 'XSLT', -] - -################################################################################ -# Extended attribute parsing -################################################################################ - - -def extended_attribute_value_contains(extended_attribute_value, key): - return (extended_attribute_value == key - or (isinstance(extended_attribute_value, list) - and key in extended_attribute_value)) - - -def has_extended_attribute(definition_or_member, extended_attribute_list): - return any(extended_attribute in definition_or_member.extended_attributes - for extended_attribute in extended_attribute_list) - - -def has_extended_attribute_value(definition_or_member, name, value): - extended_attributes = definition_or_member.extended_attributes - return (name in extended_attributes and extended_attribute_value_contains( - extended_attributes[name], value)) - - -def extended_attribute_value_as_list(definition_or_member, name): - extended_attributes = definition_or_member.extended_attributes - if name not in extended_attributes: - return None - value = extended_attributes[name] - if isinstance(value, list): - return value - return [value] - - -################################################################################ -# String handling -################################################################################ - - -def capitalize(name): - """Capitalize first letter or initial acronym (used in setter names).""" - for acronym in ACRONYMS: - if name.startswith(acronym.lower()): - return name.replace(acronym.lower(), acronym) - return name[0].upper() + name[1:] - - -def strip_suffix(string, suffix): - if not suffix or not string.endswith(suffix): - return string - return string[:-len(suffix)] - - -def uncapitalize(name): - """Uncapitalizes first letter or initial acronym (used in method names). - - E.g., 'SetURL' becomes 'setURL', but 'URLFoo' becomes 'urlFoo'. - """ - for acronym in ACRONYMS: - if name.startswith(acronym): - return name.replace(acronym, acronym.lower()) - return name[0].lower() + name[1:] - - -def runtime_enabled_function(name): - """Returns a function call of a runtime enabled feature.""" - return 'RuntimeEnabledFeatures::%sEnabled()' % name - - -################################################################################ -# C++ -################################################################################ - - -def scoped_name(interface, definition, base_name): - # partial interfaces are implemented as separate classes, with their members - # implemented as static member functions - partial_interface_implemented_as = definition.extended_attributes.get( - 'PartialInterfaceImplementedAs') - if partial_interface_implemented_as: - return '%s::%s' % (partial_interface_implemented_as, base_name) - if (definition.is_static - or definition.name in ('Constructor', 'NamedConstructor')): - return '%s::%s' % (cpp_name(interface), base_name) - return 'impl->%s' % base_name - - -def v8_class_name(interface): - return 'V8' + interface.name - - -def v8_class_name_or_partial(interface): - class_name = v8_class_name(interface) - if interface.is_partial: - return ''.join([class_name, 'Partial']) - return class_name - - -def build_basename(name, prefix=None): - basename = to_snake_case(name) - if prefix: - basename = prefix + basename - return basename - - -def binding_header_filename(name): - """Returns a binding header filename for the specified interface name. - - E.g. 'NodeList' -> 'v8_node_list.h' - """ - return build_basename(name, prefix='v8_') + '.h' - - -################################################################################ -# Specific extended attributes -################################################################################ - - -# [ActivityLogging] -def activity_logging_world_list(member, access_type=''): - """Returns a set of world suffixes for which a definition member has activity logging, for specified access type. - - access_type can be 'Getter' or 'Setter' if only checking getting or setting. - """ - extended_attributes = member.extended_attributes - if 'LogActivity' not in extended_attributes: - return set() - log_activity = extended_attributes['LogActivity'] - if log_activity and not log_activity.startswith(access_type): - return set() - - includes.add('platform/bindings/v8_dom_activity_logger.h') - if 'LogAllWorlds' in extended_attributes: - return set(['', 'ForMainWorld']) - return set(['']) # At minimum, include isolated worlds. - - -# [ActivityLogging] -def activity_logging_world_check(member): - """Returns if an isolated world check is required when generating activity - logging code. - - The check is required when there is no per-world binding code and logging is - required only for isolated world. - """ - extended_attributes = member.extended_attributes - if 'LogActivity' not in extended_attributes: - return False - if ('PerWorldBindings' not in extended_attributes - and 'LogAllWorlds' not in extended_attributes): - return True - return False - - -# [CallWith] -CALL_WITH_ARGUMENTS = { - 'Isolate': 'info.GetIsolate()', - 'ScriptState': 'script_state', - 'ExecutionContext': 'execution_context', - 'Document': 'document', - 'ThisValue': 'ScriptValue(info.GetIsolate(), info.Holder())', -} -# List because key order matters, as we want arguments in deterministic order -CALL_WITH_VALUES = [ - 'Isolate', - 'ScriptState', - 'ExecutionContext', - 'Document', - 'ThisValue', -] - - -def call_with_arguments(call_with_values): - if not call_with_values: - return [] - return [ - CALL_WITH_ARGUMENTS[value] for value in CALL_WITH_VALUES - if extended_attribute_value_contains(call_with_values, value) - ] - - -# [Constructor], [NamedConstructor] -def is_constructor_attribute(member): - # TODO(yukishiino): replace this with [Constructor] and [NamedConstructor] extended attribute - return (type(member) == IdlAttribute - and member.idl_type.name.endswith('Constructor')) - - -# [DeprecateAs] -def deprecate_as(member): - extended_attributes = member.extended_attributes - if 'DeprecateAs' not in extended_attributes: - return None - includes.add('core/frame/deprecation.h') - return extended_attributes['DeprecateAs'] - - -# [Exposed] -EXPOSED_EXECUTION_CONTEXT_METHOD = { - 'AnimationWorklet': 'IsAnimationWorkletGlobalScope', - 'AudioWorklet': 'IsAudioWorkletGlobalScope', - 'DedicatedWorker': 'IsDedicatedWorkerGlobalScope', - 'LayoutWorklet': 'IsLayoutWorkletGlobalScope', - 'PaintWorklet': 'IsPaintWorkletGlobalScope', - 'ServiceWorker': 'IsServiceWorkerGlobalScope', - 'SharedWorker': 'IsSharedWorkerGlobalScope', - 'Window': 'IsWindow', - 'Worker': 'IsWorkerGlobalScope', - 'Worklet': 'IsWorkletGlobalScope', -} - -EXPOSED_WORKERS = set([ - 'DedicatedWorker', - 'SharedWorker', - 'ServiceWorker', -]) - - -class ExposureSet(object): - """An ExposureSet is a collection of Exposure instructions.""" - - def __init__(self, exposures=None): - self.exposures = set(exposures) if exposures else set() - - def issubset(self, other): - """Returns true if |self|'s exposure set is a subset of - |other|'s exposure set. This function doesn't care about - RuntimeEnabled.""" - self_set = self._extended(set(e.exposed for e in self.exposures)) - other_set = self._extended(set(e.exposed for e in other.exposures)) - return self_set.issubset(other_set) - - @staticmethod - def _extended(target): - if EXPOSED_WORKERS.issubset(target): - return target | set(['Worker']) - elif 'Worker' in target: - return target | EXPOSED_WORKERS - return target - - def add(self, exposure): - self.exposures.add(exposure) - - def __len__(self): - return len(self.exposures) - - def __iter__(self): - return self.exposures.__iter__() - - @staticmethod - def _code(exposure): - condition = ('execution_context->%s()' % - EXPOSED_EXECUTION_CONTEXT_METHOD[exposure.exposed]) - if exposure.runtime_enabled is not None: - runtime_enabled = (runtime_enabled_function( - exposure.runtime_enabled)) - return '({0} && {1})'.format(condition, runtime_enabled) - return condition - - def code(self): - if len(self.exposures) == 0: - return None - # We use sorted here to deflake output. - return ' || '.join(sorted(self._code(e) for e in self.exposures)) - - -def exposed(member, interface): - """Returns a C++ code that checks if a method/attribute/etc is exposed. - - When the Exposed attribute contains RuntimeEnabledFeatures (i.e. - Exposed(Arguments) form is given), the code contains check for them as - well. - - EXAMPLE: [Exposed=Window, RuntimeEnabledFeature=Feature1] - => context->IsWindow() - - EXAMPLE: [Exposed(Window Feature1, Window Feature2)] - => context->IsWindow() && RuntimeEnabledFeatures::Feature1Enabled() || - context->IsWindow() && RuntimeEnabledFeatures::Feature2Enabled() - """ - exposure_set = ExposureSet( - extended_attribute_value_as_list(member, 'Exposed')) - interface_exposure_set = ExposureSet( - extended_attribute_value_as_list(interface, 'Exposed')) - for e in exposure_set: - if e.exposed not in EXPOSED_EXECUTION_CONTEXT_METHOD: - raise ValueError('Invalid execution context: %s' % e.exposed) - - # Methods must not be exposed to a broader scope than their interface. - if not exposure_set.issubset(interface_exposure_set): - raise ValueError( - 'Interface members\' exposure sets must be a subset of the interface\'s.' - ) - - return exposure_set.code() - - -# [CrossOriginIsolated] -def cross_origin_isolated(member, interface): - """Returns C++ code that checks whether an interface/method/attribute/etc. is exposed - to the current context. Requires that the surrounding code defines an |is_cross_origin_isolated| - variable prior to this check.""" - member_is_cross_origin_isolated = 'CrossOriginIsolated' in member.extended_attributes - interface_is_cross_origin_isolated = ( - (member.defined_in is None or member.defined_in == interface.name) - and 'CrossOriginIsolated' in interface.extended_attributes) - - if not (member_is_cross_origin_isolated - or interface_is_cross_origin_isolated): - return None - - return 'is_cross_origin_isolated' - - -# [DirectSocketEnabled] -def direct_socket_enabled(member, interface): - """Returns C++ code that checks whether an interface/method/attribute/etc. - is exposed to the current context. Requires that the surrounding code - defines an |is_direct_socket_enabled| variable prior to this check.""" - member_is_direct_socket_enabled = ( - 'DirectSocketEnabled' in member.extended_attributes) - interface_is_direct_socket_enabled = ( - (member.defined_in is None or member.defined_in == interface.name) - and 'DirectSocketEnabled' in interface.extended_attributes) - - if not (member_is_direct_socket_enabled - or interface_is_direct_socket_enabled): - return None - - return 'is_direct_socket_enabled' - - -# [SecureContext] -def secure_context(member, interface): - """Returns C++ code that checks whether an interface/method/attribute/etc. is exposed - to the current context. Requires that the surrounding code defines an |is_secure_context| - variable prior to this check.""" - member_is_secure_context = 'SecureContext' in member.extended_attributes - interface_is_secure_context = ( - (member.defined_in is None or member.defined_in == interface.name) - and 'SecureContext' in interface.extended_attributes) - - if not (member_is_secure_context or interface_is_secure_context): - return None - - conditions = ['is_secure_context'] - - if member_is_secure_context: - conditional = member.extended_attributes['SecureContext'] - if conditional: - conditions.append('!{}'.format( - runtime_enabled_function(conditional))) - - if interface_is_secure_context: - conditional = interface.extended_attributes['SecureContext'] - if conditional: - conditions.append('!{}'.format( - runtime_enabled_function(conditional))) - - return ' || '.join(conditions) - - -# [ImplementedAs] -def cpp_name(definition_or_member): - extended_attributes = definition_or_member.extended_attributes - if extended_attributes and 'ImplementedAs' in extended_attributes: - return extended_attributes['ImplementedAs'] - # WebIDL identifiers can contain hyphens[1], but C++ identifiers cannot. - # Therefore camelCase hyphen-containing identifiers. - # - # [1] https://heycam.github.io/webidl/#prod-identifier - if '-' in definition_or_member.name: - return NameStyleConverter( - definition_or_member.name).to_lower_camel_case() - return definition_or_member.name - - -def cpp_name_from_interfaces_info(name, interfaces_info): - return interfaces_info.get(name, {}).get('implemented_as') or name - - -def cpp_name_or_partial(interface): - cpp_class_name = cpp_name(interface) - if interface.is_partial: - return ''.join([cpp_class_name, 'Partial']) - return cpp_class_name - - -def cpp_encoded_property_name(member): - """ - Returns a property name that the bindings generator can use in generated - code internally. - - Note that Web IDL allows '-' (hyphen-minus) and '_' (low line) in - identifiers but C++ does not allow or recommend them. This function - encodes these characters. - """ - property_name = member.name - # We're optimistic about name conflict. It's highly unlikely that these - # replacements will cause a conflict. - assert "Dec45" not in property_name - assert "Dec95" not in property_name - property_name = property_name.replace("-", "Dec45") - property_name = property_name.replace("_", "Dec95") - return property_name - - -# [MeasureAs] -def measure_as(definition_or_member, interface): - extended_attributes = definition_or_member.extended_attributes - if 'MeasureAs' in extended_attributes: - includes.add('core/frame/web_feature.h') - includes.add('platform/instrumentation/use_counter.h') - return lambda suffix: extended_attributes['MeasureAs'] - if 'Measure' in extended_attributes: - includes.add('core/frame/web_feature.h') - includes.add('platform/instrumentation/use_counter.h') - measure_as_name = capitalize(definition_or_member.name) - if interface is not None: - measure_as_name = '%s_%s' % (capitalize(interface.name), - measure_as_name) - return lambda suffix: 'V8%s_%s' % (measure_as_name, suffix) - return None - - -# [HighEntropy] -def high_entropy(definition_or_member): - extended_attributes = definition_or_member.extended_attributes - if 'HighEntropy' in extended_attributes: - includes.add('core/frame/dactyloscoper.h') - if not ('Measure' in extended_attributes - or 'MeasureAs' in extended_attributes): - raise Exception( - '%s specified [HighEntropy], but does not include ' - 'either [Measure] or [MeasureAs]' % definition_or_member.name) - if extended_attributes['HighEntropy'] == 'Direct': - return 'Direct' - return True - return False - - -# [RuntimeEnabled] -def _is_origin_trial_feature(feature_name, runtime_features): - assert feature_name in runtime_features, feature_name + ' is not a runtime feature.' - feature = runtime_features[feature_name] - return feature['in_origin_trial'] - - -def origin_trial_feature_name(definition_or_member, runtime_features): - """ - Returns the name of the origin trial feature if found, None otherwise. - Looks for origin trial feature specified by the RuntimeEnabled attribute. - """ - extended_attributes = definition_or_member.extended_attributes - feature_name = extended_attributes.get('RuntimeEnabled') - if feature_name and _is_origin_trial_feature(feature_name, - runtime_features): - return feature_name - - -def origin_trial_function_call(feature_name, execution_context=None): - """Returns a function call to determine if an origin trial is enabled.""" - return 'RuntimeEnabledFeatures::{feature_name}Enabled({context})'.format( - feature_name=feature_name, - context=execution_context - if execution_context else "execution_context") - - -# [ContextEnabled] -def context_enabled_feature_name(definition_or_member): - return definition_or_member.extended_attributes.get('ContextEnabled') - - -# [RuntimeCallStatsCounter] -def rcs_counter_name(member, generic_counter_name): - extended_attribute_defined = 'RuntimeCallStatsCounter' in member.extended_attributes - if extended_attribute_defined: - counter = 'k' + member.extended_attributes['RuntimeCallStatsCounter'] - else: - counter = generic_counter_name - return (counter, extended_attribute_defined) - - -# [RuntimeEnabled] -def runtime_enabled_feature_name(definition_or_member, runtime_features): - extended_attributes = definition_or_member.extended_attributes - feature_name = extended_attributes.get('RuntimeEnabled') - if feature_name and not _is_origin_trial_feature(feature_name, - runtime_features): - includes.add('platform/runtime_enabled_features.h') - return feature_name - - -# [LegacyUnforgeable] -def is_unforgeable(member): - return 'LegacyUnforgeable' in member.extended_attributes - - -# [LegacyUnforgeable], [Global] -def on_instance(interface, member): - """Returns True if the interface's member needs to be defined on every - instance object. - - The following members must be defined on an instance object. - - [LegacyUnforgeable] members - - regular members of [Global] interfaces - """ - if member.is_static: - return False - - # TODO(yukishiino): Remove a hack for ToString once we support - # Symbol.ToStringTag. - if interface.name == 'Window' and member.name == 'ToString': - return False - - # TODO(yukishiino): Implement "interface object" and its [[Call]] method - # in a better way. Then we can get rid of this hack. - if is_constructor_attribute(member): - return True - - if ('Global' in interface.extended_attributes - or 'LegacyUnforgeable' in member.extended_attributes): - return True - return False - - -def on_prototype(interface, member): - """Returns True if the interface's member needs to be defined on the - prototype object. - - Most members are defined on the prototype object. Exceptions are as - follows. - - static members (optional) - - [LegacyUnforgeable] members - - members of [Global] interfaces - - named properties of [Global] interfaces - """ - if member.is_static: - return False - - # TODO(yukishiino): Remove a hack for toString once we support - # Symbol.toStringTag. - if (interface.name == 'Window' and member.name == 'toString'): - return True - - # TODO(yukishiino): Implement "interface object" and its [[Call]] method - # in a better way. Then we can get rid of this hack. - if is_constructor_attribute(member): - return False - - if ('Global' in interface.extended_attributes - or 'LegacyUnforgeable' in member.extended_attributes): - return False - return True - - -# static, const -def on_interface(interface, member): - """Returns True if the interface's member needs to be defined on the - interface object. - - The following members must be defiend on an interface object. - - static members - """ - if member.is_static: - return True - return False - - -################################################################################ -# Indexed properties -# http://heycam.github.io/webidl/#idl-indexed-properties -################################################################################ - - -def indexed_property_getter(interface): - try: - # Find indexed property getter, if present; has form: - # getter TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG1) - return next( - method for method in interface.operations - if ('getter' in method.specials and len(method.arguments) == 1 - and str(method.arguments[0].idl_type) == 'unsigned long')) - except StopIteration: - return None - - -def indexed_property_setter(interface): - try: - # Find indexed property setter, if present; has form: - # setter RETURN_TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG1, ARG_TYPE ARG2) - return next( - method for method in interface.operations - if ('setter' in method.specials and len(method.arguments) == 2 - and str(method.arguments[0].idl_type) == 'unsigned long')) - except StopIteration: - return None - - -def indexed_property_deleter(interface): - try: - # Find indexed property deleter, if present; has form: - # deleter TYPE [OPTIONAL_IDENTIFIER](unsigned long ARG) - return next( - method for method in interface.operations - if ('deleter' in method.specials and len(method.arguments) == 1 - and str(method.arguments[0].idl_type) == 'unsigned long')) - except StopIteration: - return None - - -################################################################################ -# Named properties -# http://heycam.github.io/webidl/#idl-named-properties -################################################################################ - - -def named_property_getter(interface): - try: - # Find named property getter, if present; has form: - # getter TYPE [OPTIONAL_IDENTIFIER](DOMString ARG1) - getter = next( - method for method in interface.operations - if ('getter' in method.specials and len(method.arguments) == 1 - and str(method.arguments[0].idl_type) == 'DOMString')) - getter.name = getter.name or 'AnonymousNamedGetter' - return getter - except StopIteration: - return None - - -def named_property_setter(interface): - try: - # Find named property setter, if present; has form: - # setter RETURN_TYPE [OPTIONAL_IDENTIFIER](DOMString ARG1, ARG_TYPE ARG2) - return next( - method for method in interface.operations - if ('setter' in method.specials and len(method.arguments) == 2 - and str(method.arguments[0].idl_type) == 'DOMString')) - except StopIteration: - return None - - -def named_property_deleter(interface): - try: - # Find named property deleter, if present; has form: - # deleter TYPE [OPTIONAL_IDENTIFIER](DOMString ARG) - return next( - method for method in interface.operations - if ('deleter' in method.specials and len(method.arguments) == 1 - and str(method.arguments[0].idl_type) == 'DOMString')) - except StopIteration: - return None - - -IdlInterface.indexed_property_getter = property(indexed_property_getter) -IdlInterface.indexed_property_setter = property(indexed_property_setter) -IdlInterface.indexed_property_deleter = property(indexed_property_deleter) -IdlInterface.named_property_getter = property(named_property_getter) -IdlInterface.named_property_setter = property(named_property_setter) -IdlInterface.named_property_deleter = property(named_property_deleter)
diff --git a/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl b/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl deleted file mode 100644 index 5286586..0000000 --- a/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl +++ /dev/null
@@ -1,725 +0,0 @@ -{% from 'utilities.cc.tmpl' import declare_enum_validation_variable, v8_value_to_local_cpp_value %} -{% from 'methods.cc.tmpl' import runtime_timer_scope, runtime_timer_scope_disabled_by_default %} - -{##############################################################################} -{% macro attribute_getter(attribute, world_suffix) %} -static void {{attribute.camel_case_name}}AttributeGetter{{world_suffix}}( -{%- if attribute.is_data_type_property %} -const v8::PropertyCallbackInfo<v8::Value>& info -{%- else %} -const v8::FunctionCallbackInfo<v8::Value>& info -{%- endif %}) { - {% filter format_remove_duplicates(['ExceptionState exception_state']) %} - {% set define_exception_state -%} - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kGetterContext, "{{interface_name}}", "{{attribute.name}}"); - {%- endset %} - - {% if attribute.is_lenient_this %} - // [LegacyLenientThis] - // Make sure that info.Holder() really points to an instance if [LegacyLenientThis]. - if (!{{v8_class}}::HasInstance(info.Holder(), info.GetIsolate())) - return; // Return silently because of [LegacyLenientThis]. - {% elif attribute.has_promise_type %} - // This attribute returns a Promise. - // Per https://heycam.github.io/webidl/#dfn-attribute-getter, all exceptions - // must be turned into a Promise rejection. - {{define_exception_state}} - ExceptionToRejectPromiseScope reject_promise_scope(info, exception_state); - - // Returning a Promise type requires us to disable some of V8's type checks, - // so we have to manually check that info.Holder() really points to an - // instance of the type. - if (!{{v8_class}}::HasInstance(info.Holder(), info.GetIsolate())) { - exception_state.ThrowTypeError("Illegal invocation"); - return; - } - {% endif %} - - {% if not attribute.is_static or attribute.is_save_same_object %} - v8::Local<v8::Object> holder = info.Holder(); - {% endif %} - - {% if attribute.is_save_same_object %} - // [SaveSameObject] - static const V8PrivateProperty::SymbolKey kSaveSameObjectKey; - auto private_same_object = - V8PrivateProperty::GetSymbol(info.GetIsolate(), kSaveSameObjectKey); - { - v8::Local<v8::Value> v8_value; - if (private_same_object.GetOrUndefined(holder).ToLocal(&v8_value) && !v8_value->IsUndefined()) { - V8SetReturnValue(info, v8_value); - return; - } - } - {% endif %} - - {% if not attribute.is_static %} - {% set local_dom_window_only = interface_name == 'Window' and not attribute.has_cross_origin_getter %} - {% if local_dom_window_only %} - {% if attribute.is_check_security_for_receiver %} - {{cpp_class}}* unchecked_impl = {{v8_class}}::ToImpl(holder); - {% else %} - // Same-origin attribute getters are never exposed via the cross-origin - // interceptors. Since same-origin access requires a LocalDOMWindow, it is - // safe to downcast here. - LocalDOMWindow* impl = To<LocalDOMWindow>({{v8_class}}::ToImpl(holder)); - {% endif %}{# attribute.is_check_security_for_receiver #} - {% else %} - {{cpp_class}}* impl = {{v8_class}}::ToImpl(holder); - {% endif %}{# local_dom_window_only #} - {% endif %}{# not attribute.is_static #} - - {% if interface_name == "Window" and attribute.has_cross_origin_getter %} - impl->ReportCoopAccess("{{attribute.name}}"); - {% endif %} - - {% if attribute.cached_attribute_validation_method %} - // [CachedAttribute] - {% if not attribute.private_property_is_shared_between_getter_and_setter %} - static const V8PrivateProperty::SymbolKey kPrivateProperty{{attribute.camel_case_name}}; - - {% endif %} - V8PrivateProperty::Symbol property_symbol = - V8PrivateProperty::GetSymbol(info.GetIsolate(), - kPrivateProperty{{attribute.camel_case_name}}); - if (!static_cast<const {{cpp_class}}*>(impl)->{{attribute.cached_attribute_validation_method}}()) { - v8::Local<v8::Value> v8_value; - if (property_symbol.GetOrUndefined(holder).ToLocal(&v8_value) && !v8_value->IsUndefined()) { - V8SetReturnValue(info, v8_value); - return; - } - } - {% endif %} - - {% if attribute.is_check_security_for_receiver and not attribute.is_data_type_property %} - // Perform a security check for the receiver object. - {{define_exception_state}} - {% if local_dom_window_only %} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), unchecked_impl, exception_state)) { - {% else %} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), impl, exception_state)) { - {% endif %}{# local_dom_window_only #} - V8SetReturnValueNull(info); - return; - } - {% if local_dom_window_only %} - LocalDOMWindow* impl = To<LocalDOMWindow>(unchecked_impl); - {% endif %}{# local_dom_window_only #} - {% endif %} - - {% if attribute.is_check_security_for_return_value %} - // Perform a security check for the returned object. - {{define_exception_state}} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), {{attribute.cpp_value}}, BindingSecurity::ErrorReportOption::kDoNotReport)) { - UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), - WebFeature::kCrossOrigin{{interface_name}}{{attribute.camel_case_name}}); - V8SetReturnValueNull(info); - return; - } - {% endif %} - - {% if attribute.is_call_with_execution_context or - attribute.high_entropy == 'Direct' %} - {% if attribute.is_static %} - ExecutionContext* execution_context = ExecutionContext::ForCurrentRealm(info); - {% else %} - ExecutionContext* execution_context = ExecutionContext::ForRelevantRealm(info); - {% endif %} - {% endif %} - - {% if attribute.is_call_with_script_state or - attribute.is_getter_call_with_script_state %} - {% if attribute.is_static %} - ScriptState* script_state = ScriptState::ForCurrentRealm(info); - {% else %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - {% endif %} - - {% if attribute.is_getter_raises_exception %} - {{define_exception_state}} - {% endif %} - - {% if attribute.cpp_value_original %} - {{attribute.cpp_type}} {{attribute.cpp_value}}({{attribute.cpp_value_original}}); - {% endif %} - - {% if attribute.high_entropy == 'Direct' %} - Dactyloscoper::RecordDirectSurface(execution_context, WebFeature::k{{attribute.measure_as('AttributeGetter')}}, {{attribute.cpp_value}}); - {% endif %} - - {% if attribute.use_output_parameter_for_result %} - {{attribute.cpp_type}} result; - {{attribute.cpp_value}}; - {% endif %} - - {% if attribute.is_getter_raises_exception %} - if (UNLIKELY(exception_state.HadException())) - return; - {% endif %} - - {% if attribute.reflect_only %} - {{release_only_check(attribute.reflect_only, attribute.reflect_missing, - attribute.reflect_invalid, attribute.reflect_empty, - attribute.cpp_value) - | trim | indent(2)}} - {% endif %} - - {% if attribute.is_explicit_nullable %} - if (!{{attribute.cpp_value}}.has_value()) { - {% if attribute.cached_attribute_validation_method %} - // [CachedAttribute] - property_symbol.Set(holder, v8::Null(info.GetIsolate())); - {% endif %} - V8SetReturnValueNull(info); - return; - } - {% endif %} - - {% if attribute.cached_attribute_validation_method %} - // [CachedAttribute] - v8::Local<v8::Value> v8_value({{attribute.cpp_value_to_v8_value}}); - property_symbol.Set(holder, v8_value); - {% endif %} - - {% if attribute.is_keep_alive_for_gc %} - // Keep the wrapper object for the return value alive as long as |this| - // object is alive in order to save creation time of the wrapper object. - if ({{attribute.cpp_value}} && DOMDataStore::SetReturnValue{{world_suffix}}(info.GetReturnValue(), {{attribute.cpp_value_to_script_wrappable}})) - return; - v8::Local<v8::Value> v8_value(ToV8({{attribute.cpp_value_to_script_wrappable}}, holder, info.GetIsolate())); - static const V8PrivateProperty::SymbolKey kKeepAliveKey; - V8PrivateProperty::GetSymbol(info.GetIsolate(), kKeepAliveKey) - .Set(holder, v8_value); - {% endif %} - - {% if world_suffix %} - {{attribute.v8_set_return_value_for_main_world}}; - {% else %} - {{attribute.v8_set_return_value}}; - {% endif %} - - {% if attribute.is_save_same_object %} - // [SaveSameObject] - private_same_object.Set(holder, info.GetReturnValue().Get()); - {% endif %} - {% endfilter %}{# format_remove_duplicates #} -} -{% endmacro %} - - -{######################################} -{% macro release_only_check(reflect_only_values, reflect_missing, - reflect_invalid, reflect_empty, cpp_value) %} -{# Attribute is limited to only known values: check that the attribute value is - one of those. If not, set it to the empty string. - http://www.whatwg.org/specs/web-apps/current-work/#limited-to-only-known-values #} -{% if reflect_only_values %} -AtomicString atomic_{{cpp_value}}({{cpp_value}}.LowerASCII()); -{% endif %} -{% if reflect_empty %} -if ({{cpp_value}}.IsNull()) { -{% if reflect_missing %} - {{cpp_value}} = {{reflect_missing}}; -{% else %} - ; -{% endif %} -} else if ({{cpp_value}}.IsEmpty()) { - {{cpp_value}} = {{reflect_empty}}; -{% else %} -if ({{cpp_value}}.IsEmpty()) { -{# FIXME: should use [ReflectEmpty] instead; need to change IDL files #} -{% if reflect_missing %} - {{cpp_value}} = {{reflect_missing}}; -{% else %} - ; -{% endif %} -{% endif %} -{% for value in reflect_only_values %} -} else if (atomic_{{cpp_value}} == {{value}}) { - {{cpp_value}} = {{value}}; -{% endfor %} -} else { - {{cpp_value}} = {{reflect_invalid}}; -} -{% endmacro %} - - -{##############################################################################} -{% macro attribute_getter_callback(attribute, world_suffix) %} -void {{v8_class_or_partial}}::{{attribute.camel_case_name}}AttributeGetterCallback{{world_suffix}}( -{%- if attribute.is_data_type_property %} -v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info -{%- else %} -const v8::FunctionCallbackInfo<v8::Value>& info -{%- endif %}) { - {% if attribute.runtime_call_stats.extended_attribute_defined %} - {{ runtime_timer_scope(attribute.runtime_call_stats.getter_counter) | trim | indent(2) }} - {% else %} - {{ runtime_timer_scope_disabled_by_default(attribute.runtime_call_stats.getter_counter) }} - {% endif %} - - {% if attribute.deprecate_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{attribute.deprecate_as}}); - {% endif %} - - {% if attribute.measure_as %} - ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate()); - UseCounter::Count(execution_context_for_measurement, WebFeature::k{{attribute.measure_as('AttributeGetter')}}); - {% if attribute.high_entropy %} - Dactyloscoper::Record(execution_context_for_measurement, WebFeature::k{{attribute.measure_as('AttributeGetter')}}); - {% endif %} - {% endif %} - - {% if world_suffix in attribute.activity_logging_world_list_for_getter %} - {% if attribute.is_static %} - ScriptState* script_state = ScriptState::ForCurrentRealm(info); - {% else %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - V8PerContextData* context_data = script_state->PerContextData(); - if ( - {%- if attribute.activity_logging_world_check -%} - script_state->World().IsIsolatedWorld() && {# one space at the end #} - {%- endif -%} - context_data && context_data->ActivityLogger()) { - context_data->ActivityLogger()->LogGetter("{{interface_name}}.{{attribute.name}}"); - } - {% endif %} - - {% if attribute.has_custom_getter %} - {{v8_class}}::{{attribute.camel_case_name}}AttributeGetterCustom(info); - {% else %} - {{internal_namespace}}::{{attribute.camel_case_name}}AttributeGetter{{world_suffix}}(info); - {% endif %} -} -{% endmacro %} - - -{##############################################################################} -{% macro constructor_getter_callback(attribute, world_suffix) %} -void {{v8_class_or_partial}}::{{attribute.camel_case_name}}ConstructorGetterCallback{{world_suffix}}( - v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(attribute.runtime_call_stats.constructor_getter_callback_counter) }} - {% if attribute.deprecate_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{attribute.deprecate_as}}); - {% endif %} - - {% if attribute.measure_as %} - ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate()); - UseCounter::Count(execution_context_for_measurement, WebFeature::k{{attribute.measure_as('ConstructorGetter')}}); - {% if attribute.high_entropy %} - Dactyloscoper::Record(execution_context_for_measurement, WebFeature::k{{attribute.measure_as('ConstructorGetter')}}); - {% endif %} - {% endif %} - - {% if attribute.is_named_constructor %} - V8{{attribute.constructor_type}}::NamedConstructorAttributeGetter(property, info); - {% else %} - V8ConstructorAttributeGetter(property, info, V8{{attribute.constructor_type}}::GetWrapperTypeInfo()); - {% endif %} -} -{% endmacro %} - - -{##############################################################################} -{% macro attribute_setter(attribute, world_suffix) %} -{% if not attribute.use_common_reflection_setter %} -static void {{attribute.camel_case_name}}AttributeSetter{{world_suffix}}( - {% if attribute.has_cross_origin_setter %} - v8::Local<v8::Value> v8_value, const V8CrossOriginCallbackInfo& info - {% elif attribute.is_data_type_property %} - v8::Local<v8::Value> v8_value, const v8::PropertyCallbackInfo<void>& info - {% else %} - v8::Local<v8::Value> v8_value, const v8::FunctionCallbackInfo<v8::Value>& info - {%- endif %}) { - {% filter format_remove_duplicates(['ExceptionState exception_state']) %} - v8::Isolate* isolate = info.GetIsolate(); - ALLOW_UNUSED_LOCAL(isolate); - - v8::Local<v8::Object> holder = info.Holder(); - ALLOW_UNUSED_LOCAL(holder); - - {% set define_exception_state -%} - ExceptionState exception_state(isolate, ExceptionState::kSetterContext, "{{interface_name}}", "{{attribute.name}}"); - {%- endset %} - - {% if attribute.is_lenient_this %} - // [LegacyLenientThis] - // Make sure that info.Holder() really points to an instance if [LegacyLenientThis]. - if (!{{v8_class}}::HasInstance(holder, isolate)) - return; // Return silently because of [LegacyLenientThis]. - {% endif %} - - {% if not attribute.is_static and not attribute.is_replaceable and not attribute.is_put_forwards %} - {% set local_dom_window_only = interface_name == 'Window' and not attribute.has_cross_origin_setter %} - {% if local_dom_window_only %} - {% if attribute.is_check_security_for_receiver %} - {{cpp_class}}* unchecked_impl = {{v8_class}}::ToImpl(holder); - {% else %} - // Same-origin attributes setters are never exposed via the cross-origin - // interceptors. Since same-origin access requires a LocalDOMWindow, it is - // safe to downcast here. - LocalDOMWindow* impl = To<LocalDOMWindow>({{v8_class}}::ToImpl(holder)); - {% endif %}{# attribute.is_check_security_for_receiver #} - {% else %} - {{cpp_class}}* impl = {{v8_class}}::ToImpl(holder); - {% endif %}{# local_dom_window_only #} - {% endif %} - - {% if attribute.is_check_security_for_receiver and not attribute.is_data_type_property %} - // Perform a security check for the receiver object. - {{define_exception_state}} - {% if local_dom_window_only %} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(isolate), unchecked_impl, exception_state)) { - {% else %} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(isolate), impl, exception_state)) { - {% endif %}{# local_dom_window_only #} - V8SetReturnValue(info, v8_value); - return; - } - {% if local_dom_window_only %} - LocalDOMWindow* impl = To<LocalDOMWindow>(unchecked_impl); - {% endif %}{# local_dom_window_only #} - {% endif %} - - {% if attribute.is_check_security_for_return_value %} -#error Attribute setter with the security check for the return value is not supported. Since the return value is the given value to be set, it\'s meaningless to perform the security check for the return value. - {% endif %} - - {% if attribute.is_put_forwards %} - // [PutForwards] => {{attribute.name}}.{{attribute.target_attribute_name}} - {{define_exception_state}} - v8::Local<v8::Value> target; - if (!holder->Get(isolate->GetCurrentContext(), V8AtomicString(isolate, "{{attribute.name}}")) - .ToLocal(&target)) { - return; - } - if (!target->IsObject()) { - exception_state.ThrowTypeError("The attribute value is not an object"); - return; - } - bool result; - if (!target.As<v8::Object>()->Set( - isolate->GetCurrentContext(), - V8AtomicString(isolate, "{{attribute.target_attribute_name}}"), - v8_value).To(&result)) { - return; - } - if (!result) - return; - {% else %}{# attribute.is_put_forwards #} - {% if attribute.has_setter_exception_state %} - {{define_exception_state}} - {% endif %} - {% if attribute.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - - {% if attribute.is_explicit_nullable %} - bool is_null = IsUndefinedOrNull(v8_value); - {% endif %} - - // Prepare the value to be set. - {% if attribute.idl_type != 'EventHandler' %} - {{v8_value_to_local_cpp_value(attribute) | trim | indent(2)}} - {% endif %} - - {% if attribute.has_type_checking_interface %} - // Type check per: http://heycam.github.io/webidl/#es-interface - if (!cpp_value{% if attribute.is_nullable %} && !IsUndefinedOrNull(v8_value){% endif %}) { - exception_state.ThrowTypeError("The provided value is not of type '{{attribute.idl_type}}'."); - return; - } - {% endif %} - - {% if attribute.enum_values %} - // Type check per: http://heycam.github.io/webidl/#dfn-attribute-setter - // Returns undefined without setting the value if the value is invalid. - DummyExceptionStateForTesting dummy_exception_state; - { - {{declare_enum_validation_variable(attribute.enum_values) | trim | indent(2)}} - if (!IsValidEnum(cpp_value, kValidValues, base::size(kValidValues), - "{{attribute.enum_type}}", dummy_exception_state)) { - ExecutionContext::ForCurrentRealm(info)->AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, - mojom::ConsoleMessageLevel::kWarning, - dummy_exception_state.Message())); - return; - } - } - {% endif %} - - {% if attribute.is_call_with_execution_context or - attribute.is_setter_call_with_execution_context %} - {% if attribute.is_static %} - ExecutionContext* execution_context = ExecutionContext::ForCurrentRealm(info); - {% else %} - ExecutionContext* execution_context = ExecutionContext::ForRelevantRealm(info); - {% endif %} - {% endif %} - - {% if attribute.is_call_with_script_state or - attribute.is_setter_call_with_script_state %} - {% if attribute.is_static %} - ScriptState* script_state = ScriptState::ForCurrentRealm(info); - {% else %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - {% endif %} - - {% if attribute.is_replaceable %} - v8::Local<v8::String> property_name = V8AtomicString(isolate, "{{attribute.name}}"); - {% endif %} - {{attribute.cpp_setter | indent(2)}}; - - {% if attribute.cached_attribute_validation_method %} - // [CachedAttribute] - // Invalidate the cached value. - V8PrivateProperty::GetSymbol( - isolate, - kPrivateProperty{{attribute.camel_case_name}}) - .DeleteProperty(holder); - {% endif %} - {% endif %}{# attribute.is_put_forwards #} - {% endfilter %}{# format_remove_duplicates #} -} -{% endif %} -{% endmacro %} - - -{##############################################################################} -{% macro attribute_setter_callback(attribute, world_suffix) %} -void {{v8_class_or_partial}}::{{attribute.camel_case_name}}AttributeSetterCallback{{world_suffix}}( - {% if attribute.is_data_type_property %} - v8::Local<v8::Name>, v8::Local<v8::Value> v8_value, const v8::PropertyCallbackInfo<void>& info - {% else %} - const v8::FunctionCallbackInfo<v8::Value>& info - {%- endif %}) { - {% if attribute.is_lenient_setter %} - // Setter for {{attribute.name}} is no-op because [LegacyLenientSetter] is specified. - {% else %} - {% if attribute.runtime_call_stats.extended_attribute_defined %} - {{ runtime_timer_scope(attribute.runtime_call_stats.setter_counter) | trim | indent(2) }} - {% else %} - {{ runtime_timer_scope_disabled_by_default(attribute.runtime_call_stats.setter_counter) }} - {% endif %} - - {% if not attribute.is_data_type_property and not attribute.use_common_reflection_setter %} - v8::Local<v8::Value> v8_value = info[0]; - {% endif %} - - {% if attribute.deprecate_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{attribute.deprecate_as}}); - {% endif %} - - {% if attribute.measure_as %} - UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{attribute.measure_as('AttributeSetter')}}); - {% endif %} - - {% if world_suffix in attribute.activity_logging_world_list_for_setter %} - {% if attribute.is_static %} - ScriptState* script_state = ScriptState::ForCurrentRealm(info); - {% else %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - V8PerContextData* context_data = script_state->PerContextData(); - if ( - {%- if attribute.activity_logging_world_check -%} - script_state->World().IsIsolatedWorld() && {# one space at the end #} - {%- endif -%} - context_data && context_data->ActivityLogger()) { - context_data->ActivityLogger()->LogSetter("{{interface_name}}.{{attribute.name}}", v8_value); - } - {% endif %} - - {% if attribute.has_custom_setter %} - {{v8_class}}::{{attribute.camel_case_name}}AttributeSetterCustom(v8_value, info); - {% elif attribute.has_cross_origin_setter %} - {{internal_namespace}}::{{attribute.camel_case_name}}AttributeSetter( - v8_value, V8CrossOriginCallbackInfo(info)); - {% elif attribute.use_common_reflection_setter %} - {{attribute.cpp_setter}}; - {% else %} - {{internal_namespace}}::{{attribute.camel_case_name}}AttributeSetter{{world_suffix}}(v8_value, info); - {% endif %} - {% endif %}{# attribute.is_lenient_setter #} -} -{% endmacro %} - - -{##############################################################################} -{% macro build_attribute_or_accessor_configuration(attribute, config_type) %} -{% from 'utilities.cc.tmpl' import property_location %} -{% if attribute.constructor_type %} - {% set getter_callback = '%s::%sConstructorGetterCallback' % (v8_class_or_partial, attribute.camel_case_name) %} - {% set setter_callback = 'nullptr' %} -{% else %}{# regular attributes #} - {% set getter_callback = '%s::%sAttributeGetterCallback' % (v8_class_or_partial, attribute.camel_case_name) %} - {% set setter_callback = '%s::%sAttributeSetterCallback' % (v8_class_or_partial, attribute.camel_case_name) - if attribute.has_setter else 'nullptr' %} -{% endif %} - -{% set property_attribute = 'static_cast<v8::PropertyAttribute>(%s)' % - ' | '.join(attribute.property_attributes) %} -{% set cached_property_key = 'V8PrivateProperty::CachedAccessor::' + - (attribute.cached_accessor_name if attribute.is_cached_accessor - else 'kNone') %} -{% set cached_property_key = 'static_cast<unsigned>(%s)' % cached_property_key %} -{% set holder_check = 'V8DOMConfiguration::kDoNotCheckHolder' - if attribute.is_lenient_this or attribute.has_promise_type - else 'V8DOMConfiguration::kCheckHolder' %} -{% set getter_side_effect_type = 'V8DOMConfiguration::kHasNoSideEffect' - if attribute.getter_has_no_side_effect else 'V8DOMConfiguration::kHasSideEffect' %} -{% set getter_behavior = 'V8DOMConfiguration::kAlwaysCallGetter' - if not attribute.is_lazy_data_attribute else 'V8DOMConfiguration::kReplaceWithDataProperty' %} -{% if attribute.is_per_world_bindings %} - {% set getter_callback_for_main_world = '%sForMainWorld' % getter_callback %} - {% set setter_callback_for_main_world = - '%sForMainWorld' % setter_callback if attribute.has_setter else 'nullptr' %} -{% endif %} -{% set world_dependent_config = { - 'main' : [ - '"%s"' % attribute.name, - getter_callback_for_main_world, - setter_callback_for_main_world, - ], - 'non_main' : [ - '"%s"' % attribute.name, - getter_callback, - setter_callback, - ], -} %} -{% if config_type == 'attribute' %} -{% set world_common_config = [ - property_attribute, - property_location(attribute), - holder_check, - getter_side_effect_type, - getter_behavior, -] %} -{% else %}{# config_type == 'accessor' #} -{% set world_common_config = [ - cached_property_key, - property_attribute, - property_location(attribute), - holder_check, - 'V8DOMConfiguration::kCheckAccess', - 'V8DOMConfiguration::kCheckAccess', - getter_side_effect_type, -] %} -{% endif %} - -{% if attribute.is_per_world_bindings %} - {% set main_config_list = world_dependent_config["main"] + - world_common_config + ['V8DOMConfiguration::kMainWorld'] %} - {% set non_main_config_list = world_dependent_config["non_main"] + - world_common_config + ['V8DOMConfiguration::kNonMainWorlds'] %} - {# Emit for main world then non-main.#} -{ {{main_config_list | join(', ')}} }, -{ {{non_main_config_list | join(', ')}} } -{%- else -%} - {% set all_worlds_config_list = world_dependent_config["non_main"] + - world_common_config + ['V8DOMConfiguration::kAllWorlds'] %} - {# Emit only for all worlds #} -{ {{all_worlds_config_list | join(', ')}} } -{%- endif -%} -{% endmacro %} - - -{##############################################################################} -{% macro attribute_configuration(attribute) %} -{{build_attribute_or_accessor_configuration(attribute, 'attribute')}} -{% endmacro %} - - -{##############################################################################} -{% macro accessor_configuration(attribute) %} -{{build_attribute_or_accessor_configuration(attribute, 'accessor')}} -{% endmacro %} - - -{##############################################################################} -{# This macro installs |attributes_to_install| conditionally based on Exposed, CrossOriginIsolated, DirectSocketEnabled, SecureContext, and RuntimeEnabled checks. #} -{% macro install_conditional_attributes(attributes_to_install) %} -{% for exposed_test, exposed_attribute_list in attributes_to_install | groupby('exposed_test') %} -{% filter exposed(exposed_test) %} -{% for cross_origin_isolated_test, cross_origin_isolated_attribute_list in exposed_attribute_list | groupby('cross_origin_isolated_test') %} -{% filter cross_origin_isolated(cross_origin_isolated_test) %} -{% for direct_socket_enabled_test, direct_socket_enabled_attribute_list in cross_origin_isolated_attribute_list | groupby('direct_socket_enabled_test') %} -{% filter direct_socket_enabled(direct_socket_enabled_test) %} -{% for secure_context_test, secure_context_attribute_list in direct_socket_enabled_isolated_attribute_list | groupby('secure_context_test') %} -{% filter secure_context(secure_context_test) %} -{% for feature_name, attribute_list in secure_context_attribute_list | groupby('runtime_enabled_feature_name') %} -{% filter runtime_enabled(feature_name) %} -{{install_attributes(attribute_list | sort, 'instance_object', 'prototype_object', 'interface_object')}} -{% endfilter %}{# runtime_enabled #} -{% endfor %}{# secure_context_attribute_list grouped by runtime_enabled #} -{% endfilter %}{# secure_context #} -{% endfor %}{# direct_socket_isolated_attribute_list grouped by secure_context_text #} -{% endfilter %}{# direct_socket_enabled #} -{% endfor %}{# cross_origin_isolated_attribute_list grouped by direct_socket_enabled_test #} -{% endfilter %}{# cross_origin_isolated #} -{% endfor %}{# exposed_attribute_list grouped by cross_origin_isolation_test #} -{% endfilter %}{# exposed #} -{% endfor %}{# attributes grouped by exposed_test #} -{% endmacro %} - - -{##############################################################################} -{# This macro installs |attributes_to_install| unconditionally. #} -{% macro install_attributes(attributes_to_install, instance_variable, prototype_variable, interface_variable) %} -static constexpr V8DOMConfiguration::AccessorConfiguration -kAccessorConfigurations[] = { - {% for attribute in attributes_to_install %} - {{accessor_configuration(attribute) | trim | indent(4)}}, - {% endfor %} -}; -V8DOMConfiguration::InstallAccessors( - isolate, world, {{instance_variable}}, {{prototype_variable}}, {{interface_variable}}, - signature, kAccessorConfigurations, - base::size(kAccessorConfigurations)); -{% endmacro %} - - -{##############################################################################} -{# This macro installs |attributes_to_install| conditionally based on Exposed, CrossOriginIsolated, DirectSocketEnabled, SecureContext, and RuntimeEnabled checks. #} -{% macro install_conditional_interface_objects(attributes_to_install) %} -{% for exposed_test, exposed_attribute_list in attributes_to_install | groupby('exposed_test') %} -{% filter exposed(exposed_test) %} -{% for cross_origin_isolated_test, cross_origin_isolated_attribute_list in exposed_attribute_list | groupby('cross_origin_isolated_test') %} -{% filter cross_origin_isolated(cross_origin_isolated_test) %} -{% for direct_socket_enabled_test, direct_socket_enabled_attribute_list in cross_origin_isolated_attribute_list | groupby('direct_socket_enabled_test') %} -{% filter direct_socket_enabled(direct_socket_enabled_test) %} -{% for secure_context_test, secure_context_attribute_list in direct_socket_enabled_attribute_list | groupby('secure_context_test') %} -{% filter secure_context(secure_context_test) %} -{% for feature_name, attribute_list in secure_context_attribute_list | groupby('runtime_enabled_feature_name') %} -{% filter runtime_enabled(feature_name) %} -{{install_interface_objects(attribute_list | sort, 'instance_object', 'prototype_object')}} -{% endfilter %}{# runtime_enabled #} -{% endfor %}{# secure_context_attribute_list grouped by runtime_enabled #} -{% endfilter %}{# secure_context #} -{% endfor %}{# direct_socket_isolated_attribute_list grouped by secure_context_text #} -{% endfilter %}{# direct_socket_enabled #} -{% endfor %}{# cross_origin_isolated_attribute_list grouped by direct_socket_enabled_test #} -{% endfilter %}{# cross_origin_isolated #} -{% endfor %}{# exposed_attribute_list grouped by cross_origin_isolation_test #} -{% endfilter %}{# exposed #} -{% endfor %}{# attributes grouped by exposed_test #} -{% endmacro %} - - -{##############################################################################} -{# This macro installs |attributes_to_install| unconditionally. #} -{% macro install_interface_objects(attributes_to_install, instance_variable, prototype_variable) %} -static constexpr V8DOMConfiguration::AttributeConfiguration -kAttributeConfigurations[] = { - {% for attribute in attributes_to_install %} - {{attribute_configuration(attribute) | trim | indent(4)}}, - {% endfor %} -}; -V8DOMConfiguration::InstallAttributes( - isolate, world, {{instance_variable}}, {{prototype_variable}}, - kAttributeConfigurations, base::size(kAttributeConfigurations)); -{% endmacro %}
diff --git a/third_party/blink/renderer/bindings/templates/callback_function.cc.tmpl b/third_party/blink/renderer/bindings/templates/callback_function.cc.tmpl deleted file mode 100644 index 42fa4af..0000000 --- a/third_party/blink/renderer/bindings/templates/callback_function.cc.tmpl +++ /dev/null
@@ -1,90 +0,0 @@ -{% from 'callback_invoke.cc.tmpl' import callback_invoke %} -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} - -#include "{{this_include_header_path}}" - -{% for filename in cpp_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -const char* {{cpp_class}}::NameInHeapSnapshot() const { - return "{{cpp_class}}"; -} - -v8::Maybe<{{return_cpp_type}}> {{cpp_class}}::Invoke({{argument_declarations | join(', ')}}) { -{{callback_invoke( - 'callback function', 'invoke', - return_cpp_type, native_value_traits_tag, arguments, - is_treat_non_object_as_null, False, - callback_function_name, 'invoke')}} -} - -{% if idl_type == 'any' %} -v8::Maybe<{{return_cpp_type}}> {{cpp_class}}::Construct({{argument_declarations[1:] | join(', ')}}) { -{{callback_invoke( - 'callback function', 'construct', - return_cpp_type, native_value_traits_tag, arguments, - is_treat_non_object_as_null, False, - callback_function_name, 'construct')}} -} -{% endif %} - -{% if idl_type == 'void' or callback_function_name == 'Function' %} -void {{cpp_class}}::InvokeAndReportException({{argument_declarations | join(', ')}}) { - v8::TryCatch try_catch(GetIsolate()); - try_catch.SetVerbose(true); - - v8::Maybe<{{return_cpp_type}}> maybe_result = - Invoke({{ - (['callback_this_value'] + - (arguments|map(attribute='name')|list) - )|join(', ') - }}); - // An exception if any is killed with the v8::TryCatch above. - ALLOW_UNUSED_LOCAL(maybe_result); -} -{% endif %} - -{% if callback_function_name == 'EventHandlerNonNull' %} -bool {{cpp_class}}::IsRunnableOrThrowException(IgnorePause ignore_pause) { - ScriptState* callback_relevant_script_state = - CallbackRelevantScriptState(); - - bool is_runnable = - ignore_pause == IgnorePause::kIgnore ? - IsCallbackFunctionRunnableIgnoringPause( - callback_relevant_script_state, IncumbentScriptState()) : - IsCallbackFunctionRunnable( - callback_relevant_script_state, IncumbentScriptState()); - if (is_runnable) - return true; - - // Wrapper-tracing for the callback function makes the function object and - // its creation context alive. Thus it's safe to use the creation context - // of the callback function here. - ScriptState::Scope scope(callback_relevant_script_state); - V8ThrowException::ThrowError( - GetIsolate(), - ExceptionMessages::FailedToExecute( - "invoke", - "{{callback_function_name}}", - "The provided callback is no longer runnable.")); - return false; -} - -v8::Maybe<{{return_cpp_type}}> {{cpp_class}}::InvokeWithoutRunnabilityCheck({{argument_declarations | join(', ')}}) { -{{callback_invoke( - 'callback function', 'invoke', - return_cpp_type, native_value_traits_tag, arguments, - is_treat_non_object_as_null, True, - callback_function_name, 'invoke')}} -} -{% endif %} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl b/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl deleted file mode 100644 index d32ed1b..0000000 --- a/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl +++ /dev/null
@@ -1,74 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% for forward_declaration in forward_declarations %} -class {{forward_declaration}}; -{% endfor %} - -class {{exported}}{{cpp_class}} final : public CallbackFunctionBase { - public: - static {{cpp_class}}* Create( - {%- if is_treat_non_object_as_null %}v8::Local<v8::Object> - {%- else %}v8::Local<v8::Function>{% endif %} callback_function) { - return MakeGarbageCollected<{{cpp_class}}>(callback_function); - } - - explicit {{cpp_class}}( - {%- if is_treat_non_object_as_null %}v8::Local<v8::Object> - {%- else %}v8::Local<v8::Function>{% endif %} callback_function) - : CallbackFunctionBase(callback_function) {} - ~{{cpp_class}}() override = default; - - // NameClient overrides: - const char* NameInHeapSnapshot() const override; - - // Performs "invoke". - // https://heycam.github.io/webidl/#es-invoking-callback-functions - v8::Maybe<{{return_cpp_type}}> Invoke({{argument_declarations | join(', ')}}) WARN_UNUSED_RESULT; - -{# Web IDL does not distinguish callback constructors from callback functions. - If the return type is 'any', then it\'s likely to be used as a callback - constructor. #} -{% if idl_type == 'any' %} - // Performs "construct". - // https://heycam.github.io/webidl/#construct-a-callback-function - v8::Maybe<{{return_cpp_type}}> Construct({{argument_declarations[1:] | join(', ')}}) WARN_UNUSED_RESULT; -{% endif %} - -{# Type Function is often used as a sort of wild cards, and its return value is - often discarded. So, this provides some convenience. #} -{% if idl_type == 'void' or callback_function_name == 'Function' %} - // Performs "invoke", and then reports an exception, if any, to the global - // error handler such as DevTools' console. - void InvokeAndReportException({{argument_declarations | join(', ')}}); -{% endif %} - -{% if callback_function_name == 'EventHandlerNonNull' %} - // Returns true if the callback is runnable, otherwise returns false and - // throws an exception. 'beforeunload' event need to have priority over pause - // of execution contexts. - enum class IgnorePause { kDontIgnore, kIgnore }; - bool IsRunnableOrThrowException(IgnorePause); - - // Performs "invoke" without checking the runnability check, which must be - // done prior to this call by |IsRunnableOrThrowException|. - // https://heycam.github.io/webidl/#es-invoking-callback-functions - // This function may throw unlike InvokeAndReportException. - v8::Maybe<{{return_cpp_type}}> InvokeWithoutRunnabilityCheck({{argument_declarations | join(', ')}}) WARN_UNUSED_RESULT; -{% endif %} -}; - -} // namespace blink - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/callback_interface.cc.tmpl b/third_party/blink/renderer/bindings/templates/callback_interface.cc.tmpl deleted file mode 100644 index 180c7eef..0000000 --- a/third_party/blink/renderer/bindings/templates/callback_interface.cc.tmpl +++ /dev/null
@@ -1,137 +0,0 @@ -{% from 'callback_invoke.cc.tmpl' import callback_invoke %} -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} - -#include "{{this_include_header_path}}" - -{% for filename in cpp_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% if is_legacy_callback_interface %} -// Support of "legacy callback interface" - -// Suppress warning: global constructors, because struct WrapperTypeInfo is -// trivial and does not depend on another global objects. -#if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wglobal-constructors" -#endif -const WrapperTypeInfo {{snake_case_v8_class}}_wrapper_type_info = { - gin::kEmbedderBlink, - {{v8_class}}::DomTemplate, - nullptr, - "{{interface_name}}", - nullptr, - WrapperTypeInfo::kWrapperTypeNoPrototype, - WrapperTypeInfo::kObjectClassId, - WrapperTypeInfo::kNotInheritFromActiveScriptWrappable, -}; -#if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__) -#pragma clang diagnostic pop -#endif - -{% from 'constants.cc.tmpl' import install_constants with context %} -static void Install{{v8_class}}Template(v8::Isolate* isolate, const DOMWrapperWorld& world, v8::Local<v8::FunctionTemplate> interface_template) { - // Legacy callback interface must not have a prototype object. - interface_template->RemovePrototype(); - - // Initialize the interface object's template. - V8DOMConfiguration::InitializeDOMInterfaceTemplate( - isolate, interface_template, - {{v8_class}}::GetWrapperTypeInfo()->interface_name, - v8::Local<v8::FunctionTemplate>(), - kV8DefaultWrapperInternalFieldCount); - interface_template->SetLength(0); - - // Register IDL constants. - {# |install_constants| requires |interface_template| and |prototype_template|. #} - v8::Local<v8::ObjectTemplate> prototype_template = - interface_template->PrototypeTemplate(); - {{install_constants() | trim | indent(2)}} -} - -// static -v8::Local<v8::FunctionTemplate> {{v8_class}}::DomTemplate(v8::Isolate* isolate, const DOMWrapperWorld& world) { - return V8DOMConfiguration::DomClassTemplate( - isolate, - world, - const_cast<WrapperTypeInfo*>(GetWrapperTypeInfo()), - Install{{v8_class}}Template); -} -{% endif %}{# is_legacy_callback_interface #} - -const char* {{v8_class}}::NameInHeapSnapshot() const { - return "{{v8_class}}"; -} - -{% for method in methods %} - -v8::Maybe<{{method.cpp_type}}> {{v8_class}}::{{method.name}}({{method.argument_declarations | join(', ')}}) { -{{callback_invoke( - 'callback interface', None, - method.cpp_type, method.native_value_traits_tag, method.arguments, - False, False, - interface_name, method.name)}} -} - -{% endfor %} - -{% if methods|length == 1 and methods[0].idl_type == 'void' %} -void {{v8_class}}::InvokeAndReportException({{methods[0].argument_declarations | join(', ')}}) { - v8::TryCatch try_catch(GetIsolate()); - try_catch.SetVerbose(true); - - v8::Maybe<void> maybe_result = - {{methods[0].name}}({{ - (['callback_this_value'] + - (methods[0].arguments|map(attribute='name')|list) - )|join(', ') - }}); - // An exception if any is killed with the v8::TryCatch above. - ALLOW_UNUSED_LOCAL(maybe_result); -} -{% endif %} - -{% if interface_name == 'EventListener' %} -bool {{v8_class}}::IsRunnableOrThrowException(IgnorePause ignore_pause) { - ScriptState* callback_relevant_script_state = - CallbackRelevantScriptState(); - - bool is_runnable = - ignore_pause == IgnorePause::kIgnore ? - IsCallbackFunctionRunnableIgnoringPause( - callback_relevant_script_state, IncumbentScriptState()) : - IsCallbackFunctionRunnable( - callback_relevant_script_state, IncumbentScriptState()); - if (is_runnable) - return true; - - // Wrapper-tracing for the callback function makes the function object and - // its creation context alive. Thus it's safe to use the creation context - // of the callback function here. - ScriptState::Scope scope(callback_relevant_script_state); - V8ThrowException::ThrowError( - GetIsolate(), - ExceptionMessages::FailedToExecute( - "{{methods[0].name}}", - "{{interface_name}}", - "The provided callback is no longer runnable.")); - return false; -} - -v8::Maybe<{{methods[0].cpp_type}}> {{v8_class}}::InvokeWithoutRunnabilityCheck({{methods[0].argument_declarations | join(', ')}}) { -{{callback_invoke( - 'callback interface', None, - methods[0].cpp_type, methods[0].native_value_traits_tag, methods[0].arguments, - False, True, - interface_name, methods[0].name)}} -} -{% endif %} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl b/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl deleted file mode 100644 index dd35f4922..0000000 --- a/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl +++ /dev/null
@@ -1,84 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% for forward_declaration in forward_declarations %} -class {{forward_declaration}}; -{% endfor %} - -{% if is_legacy_callback_interface %} -{{exported}}extern const WrapperTypeInfo {{snake_case_v8_class}}_wrapper_type_info; -{% endif %} - -class {{exported}}{{v8_class}} final : public CallbackInterfaceBase { - public: -{% if is_legacy_callback_interface %} - // Support of "legacy callback interface" - static v8::Local<v8::FunctionTemplate> DomTemplate(v8::Isolate*, const DOMWrapperWorld&); - static constexpr const WrapperTypeInfo* GetWrapperTypeInfo() { - return &{{snake_case_v8_class}}_wrapper_type_info; - } - - // Constants -{% for constant in constants %} - static constexpr {{constant.cpp_type}} {{constant.name}} = {{constant.value}}; -{% endfor %} - -{% endif %} - static {{v8_class}}* Create(v8::Local<v8::Object> callback_object) { - return MakeGarbageCollected<{{v8_class}}>(callback_object); - } - -{% set single_operation_enum_value = - 'kSingleOperation' if is_single_operation_callback_interface else - 'kNotSingleOperation' %} - explicit {{v8_class}}(v8::Local<v8::Object> callback_object) - : CallbackInterfaceBase(callback_object, - {{single_operation_enum_value}}) {} - ~{{v8_class}}() override = default; - - // NameClient overrides: - const char* NameInHeapSnapshot() const override; - -{% for method in methods %} - // Performs "call a user object's operation". - // https://heycam.github.io/webidl/#call-a-user-objects-operation - v8::Maybe<{{method.cpp_type}}> {{method.name}}({{method.argument_declarations | join(', ')}}) WARN_UNUSED_RESULT; - -{% endfor %} - -{% if methods|length == 1 and methods[0].idl_type == 'void' %} - // Performs "call a user object's operation", and then reports an exception, - // if any, to the global error handler such as DevTools' console. - void InvokeAndReportException({{methods[0].argument_declarations | join(', ')}}); -{% endif %} - -{% if interface_name == 'EventListener' %} - // Returns true if the callback is runnable, otherwise returns false and - // throws an exception. 'beforeunload' event need to have priority over pause - // of execution contexts. - enum class IgnorePause { kDontIgnore, kIgnore }; - bool IsRunnableOrThrowException(IgnorePause); - - // Performs "call a user object's operation" for '{{methods[0].name}}' without - // checking the runnability check, which must be done prior to this call by - // |IsRunnableOrThrowException|. - // https://heycam.github.io/webidl/#call-a-user-objects-operation - // This function may throw unlike InvokeAndReportException. - v8::Maybe<{{methods[0].cpp_type}}> InvokeWithoutRunnabilityCheck({{methods[0].argument_declarations | join(', ')}}) WARN_UNUSED_RESULT; -{% endif %} -}; - -} // namespace blink - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/callback_invoke.cc.tmpl b/third_party/blink/renderer/bindings/templates/callback_invoke.cc.tmpl deleted file mode 100644 index bfe419f..0000000 --- a/third_party/blink/renderer/bindings/templates/callback_invoke.cc.tmpl +++ /dev/null
@@ -1,277 +0,0 @@ -{% from 'utilities.cc.tmpl' import declare_enum_validation_variable %} - -{# Implements callback interface\'s "call a user object's operation", or - callback function\'s "invoke" and/or "construct". - https://heycam.github.io/webidl/#call-a-user-objects-operation - https://heycam.github.io/webidl/#es-invoking-callback-functions - - Args: - interface_or_function = 'callback interface' or 'callback function' - invoke_or_construct = 'invoke', 'construct', or None - return_cpp_type = Blink (C++) return type - return_native_value_traits_tag = tag of NativeValueTraits for return type - arguments = dict of arguments\' info - is_treat_non_object_as_null = True if [LegacyTreatNonObjectAsNull] - bypass_runnability_check = Skip IsCallbackFunctionRunnable check if True - interface_name = interface name used for exception - operation_name = interface name used for exception and property lookup -#} -{% macro callback_invoke( - interface_or_function, invoke_or_construct, - return_cpp_type, return_native_value_traits_tag, arguments, - is_treat_non_object_as_null, bypass_runnability_check, - interface_name, operation_name) %} - ScriptState* callback_relevant_script_state = - CallbackRelevantScriptStateOrThrowException( - "{{interface_name}}", - "{{operation_name}}"); - if (!callback_relevant_script_state) { - return v8::Nothing<{{return_cpp_type}}>(); - } - - {% if not bypass_runnability_check %} - if (!IsCallbackFunctionRunnable(callback_relevant_script_state, - IncumbentScriptState())) { - // Wrapper-tracing for the callback function makes the function object and - // its creation context alive. Thus it's safe to use the creation context - // of the callback function here. - v8::HandleScope handle_scope(GetIsolate()); - v8::Local<v8::Object> callback_object = CallbackObject(); - CHECK(!callback_object.IsEmpty()); - v8::Context::Scope context_scope(callback_object->CreationContext()); - V8ThrowException::ThrowError( - GetIsolate(), - ExceptionMessages::FailedToExecute( - "{{operation_name}}", - "{{interface_name}}", - "The provided callback is no longer runnable.")); - return v8::Nothing<{{return_cpp_type}}>(); - } - {% endif %} - - // step: Prepare to run script with relevant settings. - ScriptState::Scope callback_relevant_context_scope( - callback_relevant_script_state); - // step: Prepare to run a callback with stored settings. - v8::Context::BackupIncumbentScope backup_incumbent_scope( - IncumbentScriptState()->GetContext()); - - if (UNLIKELY(ScriptForbiddenScope::IsScriptForbidden())) { - ScriptForbiddenScope::ThrowScriptForbiddenException(GetIsolate()); - return v8::Nothing<{{return_cpp_type}}>(); - } - - {% if invoke_or_construct == 'construct' %} - // step 3. If ! IsConstructor(F) is false, throw a TypeError exception. - // - // Note that step 7. and 8. are side effect free (except for a very rare - // exception due to no incumbent realm), so it's okay to put step 3. after - // step 7. and 8. - if (!IsConstructor()) { - V8ThrowException::ThrowTypeError( - GetIsolate(), - ExceptionMessages::FailedToExecute( - "{{operation_name}}", - "{{interface_name}}", - "The provided callback is not a constructor.")); - return v8::Nothing<{{return_cpp_type}}>(); - } - {% endif %} - - v8::Local<v8::Function> function; - {# Fill |function|. #} - {% if interface_or_function == 'callback function' %} - // callback function's invoke: - // step 4. If ! IsCallable(F) is false: - {% if is_treat_non_object_as_null %} - if (!CallbackObject()->IsFunction()) { - // Handle the special case of [LegacyTreatNonObjectAsNull]. - // - {% if return_cpp_type == 'void' %} - // step 4.1. If the callback function's return type is void, return. - return v8::JustVoid(); - {% else %} - // step 4.2. Return the result of converting undefined to the callback - // function's return type. - ExceptionState exception_state(GetIsolate(), - ExceptionState::kExecutionContext, - "{{interface_name}}", - "{{operation_name}}"); - auto native_result = - NativeValueTraits<{{return_native_value_traits_tag}}>::NativeValue( - GetIsolate(), v8::Undefined(GetIsolate()), exception_state); - if (exception_state.HadException()) - return v8::Nothing<{{return_cpp_type}}>(); - else - return v8::Just<{{return_cpp_type}}>(native_result); - {% endif %}{# if return_cpp_type == 'void' #} - } - {% else %} - // - // No [LegacyTreatNonObjectAsNull] presents. Must be always callable. - DCHECK(CallbackObject()->IsFunction()); - {% endif %} - function = CallbackFunction(); - {% else %} - if (IsCallbackObjectCallable()) { - // step 9.1. If value's interface is a single operation callback interface - // and !IsCallable(O) is true, then set X to O. - function = CallbackObject().As<v8::Function>(); - } else { - // step 9.2.1. Let getResult be Get(O, opName). - // step 9.2.2. If getResult is an abrupt completion, set completion to - // getResult and jump to the step labeled return. - v8::Local<v8::Value> value; - if (!CallbackObject()->Get(callback_relevant_script_state->GetContext(), - V8String(GetIsolate(), "{{operation_name}}")) - .ToLocal(&value)) { - return v8::Nothing<{{return_cpp_type}}>(); - } - // step 10. If !IsCallable(X) is false, then set completion to a new - // Completion{[[Type]]: throw, [[Value]]: a newly created TypeError - // object, [[Target]]: empty}, and jump to the step labeled return. - if (!value->IsFunction()) { - V8ThrowException::ThrowTypeError( - GetIsolate(), - ExceptionMessages::FailedToExecute( - "{{operation_name}}", - "{{interface_name}}", - "The provided callback is not callable.")); - return v8::Nothing<{{return_cpp_type}}>(); - } - function = value.As<v8::Function>(); - } - {% endif %} - - {% if invoke_or_construct != 'construct' %} - v8::Local<v8::Value> this_arg; - {% endif %} - {# Fill |this_arg|. #} - {% if invoke_or_construct == 'invoke' %} - if (callback_this_value.IsEmpty()) { - // step 2. If thisArg was not given, let thisArg be undefined. - this_arg = v8::Undefined(GetIsolate()); - } else { - this_arg = callback_this_value.V8Value(callback_relevant_script_state); - } - {% elif interface_or_function == 'callback interface' %} - if (!IsCallbackObjectCallable()) { - // step 11. If value's interface is not a single operation callback - // interface, or if !IsCallable(O) is false, set thisArg to O (overriding - // the provided value). - this_arg = CallbackObject(); - } else if (callback_this_value.IsEmpty()) { - // step 2. If thisArg was not given, let thisArg be undefined. - this_arg = v8::Undefined(GetIsolate()); - } else { - this_arg = callback_this_value.V8Value(callback_relevant_script_state); - } - {% endif %} - - {% for argument in arguments if argument.enum_values %} - // Enum values provided by Blink must be valid, otherwise typo. -#if DCHECK_IS_ON() - { - {% set valid_enum_variables = 'kValid' + argument.name[0].upper() + argument.name[1:] + 'Values' %} - {{declare_enum_validation_variable(argument.enum_values, valid_enum_variables) | trim | indent(4)}} - ExceptionState exception_state(GetIsolate(), - ExceptionState::kExecutionContext, - "{{interface_name}}", - "{{operation_name}}"); - if (!IsValidEnum({{argument.name}}, {{valid_enum_variables}}, base::size({{valid_enum_variables}}), "{{argument.enum_type}}", exception_state)) { // - NOTREACHED(); - return v8::Nothing<{{return_cpp_type}}>(); - } - } -#endif - {% endfor %} - - // step: Let esArgs be the result of converting args to an ECMAScript - // arguments list. If this throws an exception, set completion to the - // completion value representing the thrown exception and jump to the step - // labeled return. - {% if arguments %} - v8::Local<v8::Object> argument_creation_context = - callback_relevant_script_state->GetContext()->Global(); - ALLOW_UNUSED_LOCAL(argument_creation_context); - {% set has_variadic_argument = arguments[-1].is_variadic %} - {% set non_variadic_arguments = arguments | rejectattr('is_variadic') | list %} - {% set variadic_argument = arguments[-1] if has_variadic_argument else None %} - {% for argument in non_variadic_arguments %} - v8::Local<v8::Value> {{argument.v8_name}} = {{argument.cpp_value_to_v8_value}}; - {% endfor %} - {% if has_variadic_argument %} - // Secure one element at least in |argv| to avoid the following restriction. - // - // C++14 8.3.4 Arrays - // If the constant-expression (5.19) is present, it shall be a converted - // constant expression of type std::size_t and its value shall be greater than - // zero. - const int argc = {{non_variadic_arguments|length}} + {{variadic_argument.name}}.size(); - v8::Local<v8::Value> argv[std::max(1, argc)]; - {% for argument in non_variadic_arguments %} - argv[{{loop.index0}}] = {{argument.v8_name}}; - {% endfor %} - for (wtf_size_t i = 0; i < {{variadic_argument.name}}.size(); ++i) { - argv[{{non_variadic_arguments|length}} + i] = ToV8({{variadic_argument.name}}[i], argument_creation_context, GetIsolate()); - } - {% else %}{# if has_variadic_argument #} - constexpr int argc = {{non_variadic_arguments|length}}; - v8::Local<v8::Value> argv[] = { {{non_variadic_arguments | join(', ', 'v8_name')}} }; - static_assert(static_cast<size_t>(argc) == base::size(argv), "size mismatch"); - {% endif %} - {% else %}{# if arguments #} - const int argc = 0; - {# Zero-length arrays are ill-formed in C++. #} - v8::Local<v8::Value> *argv = nullptr; - {% endif %} - - v8::Local<v8::Value> call_result; - {# Fill |call_result|. #} - {% if invoke_or_construct == 'construct' %} - if (!V8ScriptRunner::CallAsConstructor( - GetIsolate(), - function, - ExecutionContext::From(callback_relevant_script_state), - argc, - argv).ToLocal(&call_result)) { - // step 11. If callResult is an abrupt completion, set completion to - // callResult and jump to the step labeled return. - return v8::Nothing<{{return_cpp_type}}>(); - } - {% else %} - // step: Let callResult be Call(X, thisArg, esArgs). - if (!V8ScriptRunner::CallFunction( - function, - ExecutionContext::From(callback_relevant_script_state), - this_arg, - argc, - argv, - GetIsolate()).ToLocal(&call_result)) { - // step: If callResult is an abrupt completion, set completion to callResult - // and jump to the step labeled return. - return v8::Nothing<{{return_cpp_type}}>(); - } - {% endif %} - - - // step: Set completion to the result of converting callResult.[[Value]] to - // an IDL value of the same type as the operation's return type. - {% if return_cpp_type == 'void' %} - return v8::JustVoid(); - {% else %} - { - ExceptionState exception_state(GetIsolate(), - ExceptionState::kExecutionContext, - "{{interface_name}}", - "{{operation_name}}"); - auto native_result = - NativeValueTraits<{{return_native_value_traits_tag}}>::NativeValue( - GetIsolate(), call_result, exception_state); - if (exception_state.HadException()) - return v8::Nothing<{{return_cpp_type}}>(); - else - return v8::Just<{{return_cpp_type}}>(native_result); - } - {% endif %} -{% endmacro %}
diff --git a/third_party/blink/renderer/bindings/templates/constants.cc.tmpl b/third_party/blink/renderer/bindings/templates/constants.cc.tmpl deleted file mode 100644 index 2ba625e..0000000 --- a/third_party/blink/renderer/bindings/templates/constants.cc.tmpl +++ /dev/null
@@ -1,71 +0,0 @@ -{% from 'methods.cc.tmpl' import runtime_timer_scope_disabled_by_default %} - -{##############################################################################} -{% macro constant_getter_callback(constant) %} -void {{v8_class_or_partial}}::{{constant.camel_case_name}}ConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(constant.rcs_counter) }} - {% if constant.deprecate_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{constant.deprecate_as}}); - {% endif %} - {% if constant.measure_as %} - ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate()); - UseCounter::Count(execution_context_for_measurement, WebFeature::k{{constant.measure_as('ConstantGetter')}}); - {% if constant.high_entropy %} - Dactyloscoper::Record(execution_context_for_measurement, WebFeature::k{{constant.measure_as('ConstantGetter')}}); - {% endif %} - {% endif %} - {% if constant.idl_type in ('Double', 'Float') %} - V8SetReturnValue(info, {{constant.value}}); - {% elif constant.idl_type == 'String' %} - V8SetReturnValueString(info, "{{constant.value}}"); - {% else %} - V8SetReturnValueInt(info, {{constant.value}}); - {% endif %} -} -{% endmacro %} - - -{######################################} -{% macro install_constants() %} -{% if constants | has_constant_configuration %} -{# Normal constants #} -{ - static constexpr V8DOMConfiguration::ConstantConfiguration kConstants[] = { - {% for constant in constants | has_constant_configuration %} - {{constant_configuration(constant)}}, - {% endfor %} - }; - V8DOMConfiguration::InstallConstants( - isolate, interface_template, prototype_template, - kConstants, base::size(kConstants)); -} -{% endif %} -{# Constants with [DeprecateAs] or [MeasureAs] #} -{% for constant in constants | has_special_getter %} -V8DOMConfiguration::InstallConstantWithGetter( - isolate, interface_template, prototype_template, - "{{constant.name}}", {{v8_class_or_partial}}::{{constant.camel_case_name}}ConstantGetterCallback); -{% endfor %} -{# Check constants #} -{% if not do_not_check_constants %} -{% for constant in constants %} -{% if constant.idl_type not in ('Double', 'Float', 'String') %} -{% set constant_cpp_class = constant.cpp_class or cpp_class %} -static_assert({{constant.value}} == {{constant_cpp_class}}::{{constant.reflected_name}}, "the value of {{cpp_class}}_{{constant.reflected_name}} does not match with implementation"); -{% endif %} -{% endfor %} -{% endif %} -{% endmacro %} - - -{######################################} -{%- macro constant_configuration(constant) %} -{# Explicitly select the correct overload to populate the union. #} -{% if constant.idl_type in ('Double', 'Float') %} - {% set value = 'static_cast<double>(%s)' % constant.value %} -{% else %} - {# 'Short', 'Long' etc. #} - {% set value = 'static_cast<int>(%s)' % constant.value %} -{% endif %} -{"{{constant.name}}", V8DOMConfiguration::kConstantType{{constant.idl_type}}, {{value}}} -{%- endmacro %}
diff --git a/third_party/blink/renderer/bindings/templates/copyright_block.txt b/third_party/blink/renderer/bindings/templates/copyright_block.txt deleted file mode 100644 index 2271083..0000000 --- a/third_party/blink/renderer/bindings/templates/copyright_block.txt +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file has been auto-generated from the Jinja2 template -// {{jinja_template_filename}} -// by the script {{code_generator}}. -// DO NOT MODIFY! - -// clang-format off
diff --git a/third_party/blink/renderer/bindings/templates/dictionary_impl.cc.tmpl b/third_party/blink/renderer/bindings/templates/dictionary_impl.cc.tmpl deleted file mode 100644 index 14c6a2c6..0000000 --- a/third_party/blink/renderer/bindings/templates/dictionary_impl.cc.tmpl +++ /dev/null
@@ -1,41 +0,0 @@ -{% from 'dictionary_impl_common.cc.tmpl' import dictionary_setter_impl with context %} -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#include "{{this_include_header_path}}" - -{% for filename in cpp_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{# Constructor #} -{{cpp_class}}::{{cpp_class}}() { - {% for member in members if member.cpp_default_value %} - {% if member.is_default_value_null and member.null_setter_name %} - {{member.null_setter_name}}(); - {% else %} - {{member.setter_name}}({{member.cpp_default_value}}); - {% endif %} - {% endfor %} -} - -{{cpp_class}}::~{{cpp_class}}() = default; - -{% for member in members if not member.setter_inline %} -{{dictionary_setter_impl(member)}} -{% endfor %} - -void {{cpp_class}}::Trace(Visitor* visitor) const { - {% for member in members if member.is_traceable %} - visitor->Trace({{member.cpp_name}}_); - {% endfor %} - {% if parent_cpp_class %} - {{parent_cpp_class}}::Trace(visitor); - {% endif %} -} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/dictionary_impl.h.tmpl b/third_party/blink/renderer/bindings/templates/dictionary_impl.h.tmpl deleted file mode 100644 index b5e295a2..0000000 --- a/third_party/blink/renderer/bindings/templates/dictionary_impl.h.tmpl +++ /dev/null
@@ -1,78 +0,0 @@ -{% from 'dictionary_impl_common.cc.tmpl' import dictionary_setter_impl with context %} -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% for decl in header_forward_decls %} -class {{decl}}; -{% endfor %} - -{# FIXME: Add "final" if this class doesn\'t have subclasses #} -class {{exported}}{{cpp_class}} : public {{parent_cpp_class}} { - public: - static {{cpp_class}}* Create() { return MakeGarbageCollected<{{cpp_class}}>(); } - static {{cpp_class}}* Create(v8::Isolate* isolate) { - return MakeGarbageCollected<{{cpp_class}}>(); - } - - {{cpp_class}}(); - ~{{cpp_class}}() override; - - {% for member in members %} - bool {{member.has_method_name}}() const { return {{member.has_method_expression}}; } - {{member.rvalue_cpp_type}} {{member.getter_name}}() const { - {% if member.nullable_indicator_name and not member.has_explicit_presence %} - DCHECK({{member.nullable_indicator_name}}); - {% endif %} - return {{member.getter_expression}}; - } - {{member.setter_inline}}void {{member.setter_name}}({{member.rvalue_cpp_type}}); - {% if member.null_setter_name %} - {{member.setter_inline}}void {{member.null_setter_name}}(); - {% endif %} - {% if member.is_nullable %} - // Migration adapters - // Returns true iff this member has a non-null value. Returns false if the - // value is missing or a null value. - bool {{member.non_null_has_method_name}}() const { return {{member.has_method_expression}}; } - // Returns the value if this member has a non-null value. Call - // |{{member.non_null_has_method_name}}| in advance to check the condition. - {{member.rvalue_cpp_type}} {{member.non_null_getter_name}}() const { - DCHECK({{member.non_null_has_method_name}}()); - return {{member.getter_expression}}; - } - {% endif %} - - {% endfor %} - v8::Local<v8::Value> ToV8Impl(v8::Local<v8::Object>, v8::Isolate*) const override; - void Trace(Visitor*) const override; - - private: - {% for member in members if member.nullable_indicator_name %} - bool {{member.nullable_indicator_name}} = false; - {% endfor %} - - {% for member in members %} - {{member.member_cpp_type}} {{member.cpp_name}}_; - {% endfor %} - - friend class V8{{cpp_class}}; -}; - -{% for member in members if member.setter_inline %} -{{dictionary_setter_impl(member)}} -{% endfor %} - -} // namespace blink - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/dictionary_impl_common.cc.tmpl b/third_party/blink/renderer/bindings/templates/dictionary_impl_common.cc.tmpl deleted file mode 100644 index d4cf49b..0000000 --- a/third_party/blink/renderer/bindings/templates/dictionary_impl_common.cc.tmpl +++ /dev/null
@@ -1,21 +0,0 @@ -{% macro dictionary_setter_impl(member) %} -void {{cpp_class}}::{{member.setter_name}}({{member.rvalue_cpp_type}} value) { - {{member.cpp_name}}_ = {{member.setter_value}}; - {% if member.nullable_indicator_name %} - {{member.nullable_indicator_name}} = true; - {% endif %} -} - -{% if member.null_setter_name %} -void {{cpp_class}}::{{member.null_setter_name}}() { - {% if member.has_explicit_presence %} - {{member.cpp_name}}_ = {{member.member_cpp_type}}(); - {{member.nullable_indicator_name}} = true; - {% elif member.nullable_indicator_name %} - {{member.nullable_indicator_name}} = false; - {% else %} - {{member.cpp_name}}_ = {{member.member_cpp_type}}(); - {% endif %} -} -{% endif %} -{%- endmacro %}
diff --git a/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl b/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl deleted file mode 100644 index dc910f6d..0000000 --- a/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl +++ /dev/null
@@ -1,203 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% from 'utilities.cc.tmpl' import declare_enum_validation_variable %} -{% include 'copyright_block.txt' %} -#include "{{this_include_header_path}}" - -{% for filename in cpp_includes if filename != '%s.h' % v8_class %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% if members %} -static const base::span<const v8::Eternal<v8::Name>> -eternal{{v8_class}}Keys(v8::Isolate* isolate) { - static const char* const kKeys[] = { - {% for member in members %} - "{{member.name}}", - {% endfor %} - }; - return V8PerIsolateData::From(isolate)->FindOrCreateEternalNameCache(kKeys, kKeys); -} -{% endif %} - -{% from 'utilities.cc.tmpl' import v8_value_to_local_cpp_value %} -void {{v8_class}}::ToImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8_value, {{cpp_class}}* impl, ExceptionState& exception_state) { - if (IsUndefinedOrNull(v8_value)) { - {% if required_member_names %} - exception_state.ThrowTypeError("Missing required member(s): {{required_member_names|join(', ')}}."); - {% endif %} - return; - } - if (!v8_value->IsObject()) { - {% if use_permissive_dictionary_conversion %} - // Do nothing. - return; - {% else %} - exception_state.ThrowTypeError("cannot convert to dictionary."); - return; - {% endif %} - } - v8::Local<v8::Object> v8Object = v8_value.As<v8::Object>(); - ALLOW_UNUSED_LOCAL(v8Object); - - {% if parent_v8_class %} - {{parent_v8_class}}::ToImpl(isolate, v8_value, impl, exception_state); - if (exception_state.HadException()) - return; - - {% endif %} - - {# Declare local variables only when the dictionary has members to avoid unused variable warnings. #} - {% if members %} - const auto* keys = eternal{{v8_class}}Keys(isolate).data(); - v8::TryCatch block(isolate); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - {% if has_origin_trial_members %} - ExecutionContext* executionContext = ToExecutionContext(context); - DCHECK(executionContext); - {% endif %}{# has_origin_trial_members #} - {% endif %}{# members #} - {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %} - {% filter origin_trial_enabled(origin_trial_test, "executionContext") %} - {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {% for member in member_list %} - v8::Local<v8::Value> {{member.v8_value}}; - if (!v8Object->Get(context, keys[{{members.index(member)}}].Get(isolate)).ToLocal(&{{member.v8_value}})) { - exception_state.RethrowV8Exception(block.Exception()); - return; - } - if ({{member.v8_value}}.IsEmpty() || {{member.v8_value}}->IsUndefined()) { - {% if member.is_required %} - exception_state.ThrowTypeError("required member {{member.name}} is undefined."); - return; - {% else %} - // Do nothing. - {% endif %} - {% if member.is_nullable and not member.is_string_type %}{# String types handle null via V8StringResource #} - } else if ({{member.v8_value}}->IsNull()) { - impl->{{member.null_setter_name}}(); - {% endif %} - } else { - {% if member.deprecate_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(isolate), WebFeature::k{{member.deprecate_as}}); - {% endif %} - {% if member.is_callback_function_type %} - if (!{{member.v8_value}}->IsFunction()) { - exception_state.ThrowTypeError("member {{member.name}} is not a function."); - return; - } - {% endif %} - {{v8_value_to_local_cpp_value(member) | trim | indent}} - {% if member.is_interface_type %} - if (!{{member.cpp_value}}) { - exception_state.ThrowTypeError("member {{member.name}} is not of type {{member.idl_type}}."); - return; - } - {% endif %} - {% if member.enum_values %} - {{declare_enum_validation_variable(member.enum_values) | trim | indent}} - if (!IsValidEnum({{member.cpp_value}}, kValidValues, base::size(kValidValues), "{{member.enum_type}}", exception_state)) - return; - {% endif %} - impl->{{member.setter_name}}({{member.cpp_value}}); - } - - {% endfor %} - {% endfilter %}{# runtime_enabled #} - - {% endfor %}{# origin_trial_member_list grouped by runtime_enabled #} - {% endfilter %}{# origin_trial_enabled #} - - {% endfor %}{# members grouped by origin_trial_enabled #} -} - -v8::Local<v8::Value> {{cpp_class}}::ToV8Impl(v8::Local<v8::Object> creationContext, v8::Isolate* isolate) const { - v8::Local<v8::Object> v8Object = v8::Object::New(isolate); - if (!toV8{{cpp_class}}(this, v8Object, creationContext, isolate)) - return v8::Undefined(isolate); - return v8Object; -} - -bool toV8{{cpp_class}}(const {{cpp_class}}* impl, v8::Local<v8::Object> dictionary, v8::Local<v8::Object> creationContext, v8::Isolate* isolate) { - {% if parent_v8_class %} - if (!toV8{{parent_cpp_class}}(impl, dictionary, creationContext, isolate)) - return false; - - {% endif %} - {% if members %} - const auto* keys = eternal{{v8_class}}Keys(isolate).data(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - - auto create_property = [dictionary, context, keys, isolate]( - size_t key_index, v8::Local<v8::Value> value) { - bool added_property; - v8::Local<v8::Name> key = keys[key_index].Get(isolate); - if (!dictionary->CreateDataProperty(context, key, value) - .To(&added_property)) { - return false; - } - return added_property; - }; - - {% if has_origin_trial_members %} - ExecutionContext* executionContext = ToExecutionContext(context); - DCHECK(executionContext); - {% endif %}{# has_origin_trial_members #} - {% endif %}{# members #} - {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %} - {% filter origin_trial_enabled(origin_trial_test, "executionContext") %} - {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {% for member in member_list %} - v8::Local<v8::Value> {{member.v8_value}}; - bool {{member.has_value_or_default}} = false; - if (impl->{{member.has_method_name}}()) { - {% if member.is_object %} - DCHECK(impl->{{member.getter_name}}().IsObject()); - {% endif %} - {{member.v8_value}} = {{member.cpp_value_to_v8_value}}; - {{member.has_value_or_default}} = true; - {% if member.v8_default_value %} - } else { - {{member.v8_value}} = {{member.v8_default_value}}; - {{member.has_value_or_default}} = true; - {% elif member.is_nullable and not member.has_explicit_presence %} - } else { - {{member.v8_value}} = v8::Null(isolate); - {{member.has_value_or_default}} = true; - {% elif member.is_required %} - } else { - NOTREACHED(); - {% endif %} - } - {# The _has_value_or_default variable will be optimized out. - If there is a default value, the compiler will notice that all branches set it to true. - If there is not, then the compiler will inline this call into the only branch that sets it to true. - Either way, the code is efficient and the variable is completely elided. #} - if ({{member.has_value_or_default}} && - !create_property({{members.index(member)}}, {{member.v8_value}})) { - return false; - } - - {% endfor %} - {% endfilter %}{# runtime_enabled #} - - {% endfor %}{# origin_trial_member_list grouped by runtime_enabled #} - {% endfilter %}{# origin_trial_enabled #} - - {% endfor %}{# members grouped by origin_trial_enabled #} - return true; -} - -{{cpp_class}}* NativeValueTraits<{{cpp_class}}>::NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { - {{cpp_class}}* impl = MakeGarbageCollected<{{cpp_class}}>(); - {{v8_class}}::ToImpl(isolate, value, impl, exception_state); - return impl; -} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/dictionary_v8.h.tmpl b/third_party/blink/renderer/bindings/templates/dictionary_v8.h.tmpl deleted file mode 100644 index 6b0b2a7..0000000 --- a/third_party/blink/renderer/bindings/templates/dictionary_v8.h.tmpl +++ /dev/null
@@ -1,46 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -class ExceptionState; - -class {{v8_class}} { - public: - {{exported}}static void ToImpl(v8::Isolate*, v8::Local<v8::Value>, {{cpp_class}}* impl, ExceptionState&); -}; - -{{exported}}bool toV8{{cpp_class}}(const {{cpp_class}}*, v8::Local<v8::Object> dictionary, v8::Local<v8::Object> creationContext, v8::Isolate*); - -template <class CallbackInfo> -inline void V8SetReturnValue(const CallbackInfo& callbackInfo, {{cpp_class}}* impl) { - V8SetReturnValue(callbackInfo, ToV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate())); -} - -template <class CallbackInfo> -inline void V8SetReturnValue(const CallbackInfo& callbackInfo, {{cpp_class}}* impl, v8::Local<v8::Object> creationContext) { - V8SetReturnValue(callbackInfo, ToV8(impl, creationContext, callbackInfo.GetIsolate())); -} - -template <> -struct NativeValueTraits<{{cpp_class}}> : public NativeValueTraitsBase<{{cpp_class}}*> { - {{exported}}static {{cpp_class}}* NativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&); -}; - -template <> -struct V8TypeOf<{{cpp_class}}> { - typedef {{v8_class}} Type; -}; - -} // namespace blink - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/external_reference_table.cc.tmpl b/third_party/blink/renderer/bindings/templates/external_reference_table.cc.tmpl deleted file mode 100644 index 3097b0d..0000000 --- a/third_party/blink/renderer/bindings/templates/external_reference_table.cc.tmpl +++ /dev/null
@@ -1,119 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} - -#include "{{this_include_header_path}}" - -#include <cstdint> - -{% for include_file in include_files %} -#include "{{include_file}}" -{% endfor %} - -namespace blink { - -// We use forward declaration instead of include for faster compile time here. -{% for interface in interfaces %} -{% if interface.has_constructor_callback %} -namespace {{interface.internal_namespace}} { -{{interface.component|upper}}_EXPORT void ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>&); -} // namespace {{interface.internal_namespace}} - -{% endif %} -{% endfor %} - -const intptr_t* {{class}}::GetTable() { - static const intptr_t kReferenceTable[] = { -#if defined(USE_V8_CONTEXT_SNAPSHOT) - // Android is sensitive on its APK size, and this table improves it. - // So we drop the table entries until the V8 context snapshot feature - // is released on Android. - {% for interface in interfaces %} - {% set v8_class = interface.v8_class %} - {# Attributes #} - {%- for attribute in interface.attributes %} - {%- for world_suffix in attribute.world_suffixes %} - {% if not attribute.constructor_type %} - reinterpret_cast<intptr_t>({{v8_class}}::{{attribute.camel_case_name}}AttributeGetterCallback{{world_suffix}}), - {% else %} - reinterpret_cast<intptr_t>({{v8_class}}::{{attribute.camel_case_name}}ConstructorGetterCallback{{world_suffix}}), - {% endif %} - {% if attribute.has_setter %} - reinterpret_cast<intptr_t>({{v8_class}}::{{attribute.camel_case_name}}AttributeSetterCallback{{world_suffix}}), - {% endif %} - {%- endfor %}{# world_suffix #} - {%- endfor %}{# attributes #} - {# Methods / Operations #} - {% for method in interface.methods %} - {%- for world_suffix in method.world_suffixes %} - {% if not method.overload_index or method.overloads %} - {% if (method.overloads and method.overloads.visible and - (not method.overloads.has_partial_overloads or not interface.is_partial)) or - (not method.overloads and method.visible) %} - reinterpret_cast<intptr_t>({{v8_class}}::{{method.camel_case_name}}MethodCallback{{world_suffix}}), - {% endif %} - {% endif %} - {% if method.is_cross_origin and method.visible and not method.overloads %} - reinterpret_cast<intptr_t>({{v8_class}}::{{method.camel_case_name}}OriginSafeMethodGetterCallback{{world_suffix}}), - {% endif%} - {% endfor %} - {% endfor %}{# method #} - {% if interface.has_cross_origin_named_getter %} - reinterpret_cast<intptr_t>({{v8_class}}::CrossOriginNamedGetter), - {% endif %} - {% if interface.has_cross_origin_named_setter %} - reinterpret_cast<intptr_t>({{v8_class}}::CrossOriginNamedSetter), - {% endif %} - {% if interface.has_cross_origin_named_enumerator %} - reinterpret_cast<intptr_t>({{v8_class}}::CrossOriginNamedEnumerator), - {% endif %} - {% if interface.has_cross_origin_indexed_getter %} - reinterpret_cast<intptr_t>({{v8_class}}::CrossOriginIndexedGetter), - {% endif %} - {% if interface.has_security_check %} - reinterpret_cast<intptr_t>({{v8_class}}::SecurityCheck), - reinterpret_cast<intptr_t>({{v8_class}}::GetWrapperTypeInfo()), - {% endif %} - {# Other properties #} - {% if interface.has_constructor_callback %} - reinterpret_cast<intptr_t>({{interface.internal_namespace}}::ConstructorCallback), - {% endif %} - {% if interface.named_property_getter %} - reinterpret_cast<intptr_t>({{v8_class}}::NamedPropertyGetterCallback), - {% endif %} - {% if interface.named_property_setter %} - reinterpret_cast<intptr_t>({{v8_class}}::NamedPropertySetterCallback), - {% endif %} - {% if interface.named_property_deleter %} - reinterpret_cast<intptr_t>({{v8_class}}::NamedPropertyDeleterCallback), - {% endif %} - {% if interface.named_property_getter and interface.named_property_getter.is_enumerable %} - reinterpret_cast<intptr_t>({{v8_class}}::NamedPropertyQueryCallback), - reinterpret_cast<intptr_t>({{v8_class}}::NamedPropertyEnumeratorCallback), - {% endif %} - {% if interface.indexed_property_getter %} - reinterpret_cast<intptr_t>({{v8_class}}::IndexedPropertyGetterCallback), - reinterpret_cast<intptr_t>({{v8_class}}::IndexedPropertyDefinerCallback), - reinterpret_cast<intptr_t>({{v8_class}}::IndexedPropertyDescriptorCallback), - {% endif %} - {% if interface.indexed_property_getter or interface.named_property_setter %} - reinterpret_cast<intptr_t>({{v8_class}}::IndexedPropertySetterCallback), - {% endif %} - {% if interface.indexed_property_deleter %} - reinterpret_cast<intptr_t>({{v8_class}}::IndexedPropertyDeleterCallback), - {% endif %} - {% if interface.has_security_check_function %} - reinterpret_cast<intptr_t>({{v8_class}}::SecurityCheck), - {% endif %} - {% endfor %}{# interfaces #} - reinterpret_cast<intptr_t>(V8ObjectConstructor::IsValidConstructorMode), -#endif // USE_V8_CONTEXT_SNAPSHOT - 0 // terminate with a null - }; - - return kReferenceTable; -} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/interface.cc.tmpl b/third_party/blink/renderer/bindings/templates/interface.cc.tmpl deleted file mode 100644 index 36cb832b..0000000 --- a/third_party/blink/renderer/bindings/templates/interface.cc.tmpl +++ /dev/null
@@ -1,1256 +0,0 @@ -{% extends 'interface_base.cc.tmpl' %} - -{% from 'methods.cc.tmpl' import runtime_timer_scope, runtime_timer_scope_disabled_by_default %} - -{##############################################################################} -{% block indexed_property_getter %} -{% if indexed_property_getter and not indexed_property_getter.is_custom %} -{% set getter = indexed_property_getter %} -static void IndexedPropertyGetter( - uint32_t index, - const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if getter.is_raises_exception %} - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kIndexedGetterContext, "{{interface_name}}"); - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - - // We assume that all the implementations support length() method, although - // the spec doesn't require that length() must exist. It's okay that - // the interface does not have length attribute as long as the - // implementation supports length() member function. - if (index >= impl->length()) - return; // Returns undefined due to out-of-range. - - {% set getter_name = getter.name or 'AnonymousIndexedGetter' %} - {% set getter_arguments = ['index'] %} - {% if getter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% set getter_arguments = ['script_state'] + getter_arguments %} - {% endif %} - {% if getter.is_raises_exception %} - {% set getter_arguments = getter_arguments + ['exception_state'] %} - {% endif %} - {{getter.cpp_type}} result = impl->{{getter_name}}({{getter_arguments | join(', ')}}); - {{getter.v8_set_return_value}}; -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_getter_callback %} -{% if indexed_property_getter or named_property_getter %} -{% set getter = indexed_property_getter or named_property_getter %} -void {{v8_class_or_partial}}::IndexedPropertyGetterCallback( - uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.indexed_property_getter_counter) }} - {% if indexed_property_getter %} - - {% if getter.is_custom %} - {{v8_class}}::IndexedPropertyGetterCustom(index, info); - {% else %} - {{internal_namespace}}::IndexedPropertyGetter(index, info); - {% endif %} - - {% else %}{# otherwise, named property #} - - const AtomicString& property_name = AtomicString::Number(index); - - {% if getter.is_custom %} - {{v8_class}}::NamedPropertyGetterCustom(property_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyGetter(property_name, info); - {% endif %} - - {% endif %}{# indexed_property_getter #} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_setter %} -{% from 'utilities.cc.tmpl' import v8_value_to_local_cpp_value %} -{% if indexed_property_setter and not indexed_property_setter.is_custom %} -{% set setter = indexed_property_setter %} -static void IndexedPropertySetter( - uint32_t index, - v8::Local<v8::Value> v8_value, - const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if setter.has_exception_state %} - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kIndexedSetterContext, - "{{interface_name}}"); - {% endif %} - {% if setter.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - {{v8_value_to_local_cpp_value(setter) | trim | indent(2)}} - {% if setter.has_type_checking_interface %} - {# Type checking for interface types (if interface not implemented, throw - TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} - if (!property_value{% if setter.is_nullable %} && !IsUndefinedOrNull(v8_value){% endif %}) { - exception_state.ThrowTypeError("The provided value is not of type '{{setter.idl_type}}'."); - return; - } - {% endif %} - - {% set setter_name = setter.name or 'AnonymousIndexedSetter' %} - {% set setter_arguments = ['index', 'property_value'] %} - {% if setter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% set setter_arguments = ['script_state'] + setter_arguments %} - {% endif %} - {% if setter.is_raises_exception %} - {% set setter_arguments = setter_arguments + ['exception_state'] %} - {% endif %} - IndexedPropertySetterResult result = impl->{{setter_name}}({{setter_arguments | join(', ')}}); - {% if setter.is_raises_exception %} - if (exception_state.HadException()) - return; - {% endif %} - if (result == IndexedPropertySetterResult::kDidNotIntercept) - return; - V8SetReturnValue(info, v8_value); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_setter_callback %} -{% if indexed_property_getter or named_property_setter %} -{% set setter = indexed_property_setter or named_property_setter %} -void {{v8_class_or_partial}}::IndexedPropertySetterCallback( - uint32_t index, - v8::Local<v8::Value> v8_value, - const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if indexed_property_setter %} - - {% if setter.is_custom %} - {{v8_class}}::IndexedPropertySetterCustom(index, v8_value, info); - {% else %} - {{internal_namespace}}::IndexedPropertySetter(index, v8_value, info); - {% endif %} - - {% elif not indexed_property_getter and named_property_setter %} - - const AtomicString& property_name = AtomicString::Number(index); - - {% if setter.is_custom %} - {{v8_class}}::NamedPropertySetterCustom(property_name, v8_value, info); - {% else %} - {{internal_namespace}}::NamedPropertySetter(property_name, v8_value, info); - {% endif %} - - {% else %}{# neither of indexed_property_setter nor named_property_setter #} - - // No indexed property setter defined. Do not fall back to the default - // setter. - V8SetReturnValue(info, v8::Null(info.GetIsolate())); - if (info.ShouldThrowOnError()) { - ExceptionState exception_state(info.GetIsolate(), - ExceptionState::kIndexedSetterContext, - "{{interface_name}}"); - {% if setter.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - exception_state.ThrowTypeError("Index property setter is not supported."); - } - - {% endif %}{# indexed/named_property_setter #} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_descriptor %} -{% if indexed_property_getter %} -static void IndexedPropertyDescriptor( - uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { - // https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty - // Steps 1.1 to 1.2.4 are covered here: we rely on indexedPropertyGetter() to - // call the getter function and check that |index| is a valid property index, - // in which case it will have set info.GetReturnValue() to something other - // than undefined. - {{v8_class_or_partial}}::IndexedPropertyGetterCallback(index, info); - v8::Local<v8::Value> getter_value = info.GetReturnValue().Get(); - if (!getter_value->IsUndefined()) { - // 1.2.5. Let |desc| be a newly created Property Descriptor with no fields. - // 1.2.6. Set desc.[[Value]] to the result of converting value to an - // ECMAScript value. - // 1.2.7. If O implements an interface with an indexed property setter, - // then set desc.[[Writable]] to true, otherwise set it to false. - v8::PropertyDescriptor desc(getter_value, {% if indexed_property_setter %}true{% else %}false{% endif %}); - // 1.2.8. Set desc.[[Enumerable]] and desc.[[Configurable]] to true. - desc.set_enumerable(true); - desc.set_configurable(true); - // 1.2.9. Return |desc|. - V8SetReturnValue(info, desc); - } -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_descriptor %} -{% if not indexed_property_getter and named_property_getter %} -static void NamedPropertyDescriptor( - uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { - // This function is called when an IDL interface supports named properties - // but not indexed properties. When a numeric property is queried, V8 calls - // indexedPropertyDescriptorCallback(), which calls this function. - - {% if named_property_getter.is_enumerable %} - // Since we initialize our indexed and named property handlers differently - // (the former use descriptors and definers, the latter uses a query - // callback), we need to inefficiently call the query callback and convert - // the v8::PropertyAttribute integer it returns into a v8::PropertyDescriptor - // expected by a descriptor callback. - // TODO(rakuco): remove this hack once we switch named property handlers to - // using descriptor and definer callbacks (bug 764633). - const AtomicString& index_as_name = AtomicString::Number(index); - {% if named_property_getter.is_custom_property_query %} - {{v8_class}}::NamedPropertyQueryCustom(index_as_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyQuery(index_as_name, info); - {% endif %} - v8::Local<v8::Value> getter_value = info.GetReturnValue().Get(); - if (!getter_value->IsUndefined()) { - DCHECK(getter_value->IsInt32()); - const int32_t props = - getter_value->ToInt32(info.GetIsolate()->GetCurrentContext()) - .ToLocalChecked() - ->Value(); - v8::PropertyDescriptor desc(V8String(info.GetIsolate(), index_as_name), - !(props & v8::ReadOnly)); - desc.set_enumerable(!(props & v8::DontEnum)); - desc.set_configurable(!(props & v8::DontDelete)); - V8SetReturnValue(info, desc); - } - {% else %}{# TODO(rakuco): drop this once we remove [NotEnumerable] getters #} - // This IDL interface defines a [NotEnumerable] getter. We need to do - // something similar to indexedPropertyDescriptor(): call - // indexedPropertyGetterCallback, let it end up calling the named property - // getter and, if all goes well, we create a v8::PropertyDescriptor with the - // right values. - {{v8_class_or_partial}}::IndexedPropertyGetterCallback(index, info); - v8::Local<v8::Value> getter_value = info.GetReturnValue().Get(); - if (!getter_value->IsUndefined()) { - v8::PropertyDescriptor desc(getter_value, {% if named_property_setter %}true{% else %}false{% endif %}); - desc.set_enumerable(false); - desc.set_configurable(true); - V8SetReturnValue(info, desc); - } - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_descriptor_callback %} -{% if indexed_property_getter or named_property_getter %} -void {{v8_class_or_partial}}::IndexedPropertyDescriptorCallback( - uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if indexed_property_getter %} - {{internal_namespace}}::IndexedPropertyDescriptor(index, info); - {% else %}{# The interface only supports named properties. #} - {{internal_namespace}}::NamedPropertyDescriptor(index, info); - {% endif %}{# indexed_property_getter #} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_deleter %} -{% if indexed_property_deleter and not indexed_property_deleter.is_custom %} -{% set deleter = indexed_property_deleter %} -static void IndexedPropertyDeleter( - uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) { - {% if deleter.is_raises_exception %} - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kIndexedDeletionContext, - "{{interface_name}}"); - {% endif %} - {% if deleter.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - - {% set deleter_name = deleter.name or 'AnonymousIndexedDeleter' %} - {% set deleter_arguments = ['index'] %} - {% if deleter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% set deleter_arguments = ['script_state'] + deleter_arguments %} - {% endif %} - {% if deleter.is_raises_exception %} - {% set deleter_arguments = deleter_arguments + ['exception_state'] %} - {% endif %} - NamedPropertyDeleterResult result = impl->{{deleter_name}}({{deleter_arguments | join(', ')}}); - {% if deleter.is_raises_exception %} - if (exception_state.HadException()) - return; - {% endif %} - if (result == NamedPropertyDeleterResult::kDidNotIntercept) - return; - V8SetReturnValue(info, result == NamedPropertyDeleterResult::kDeleted); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_deleter_callback %} -{% if indexed_property_deleter or named_property_deleter %} -{% set deleter = indexed_property_deleter or named_property_deleter %} -void {{v8_class_or_partial}}::IndexedPropertyDeleterCallback( - uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) { - {% if indexed_property_deleter %} - - {% if deleter.is_custom %} - {{v8_class}}::IndexedPropertyDeleterCustom(index, info); - {% else %} - {{internal_namespace}}::IndexedPropertyDeleter(index, info); - {% endif %} - - {% else %}{# otherwise, named property #} - - const AtomicString& property_name = AtomicString::Number(index); - - {% if deleter.is_custom %} - {{v8_class}}::NamedPropertyDeleterCustom(property_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyDeleter(property_name, info); - {% endif %} - - {% endif %}{# indexed_property_deleter #} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block indexed_property_definer_callback %} -{% if indexed_property_getter %} -void {{v8_class_or_partial}}::IndexedPropertyDefinerCallback( - uint32_t index, - const v8::PropertyDescriptor& desc, - const v8::PropertyCallbackInfo<v8::Value>& info) { -{% if indexed_property_setter %} - // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty - // 3.9.3. [[DefineOwnProperty]] - // step 1.1. If the result of calling IsDataDescriptor(Desc) is false, then - // return false. - if (desc.has_get() || desc.has_set()) { - V8SetReturnValue(info, v8::Null(info.GetIsolate())); - if (info.ShouldThrowOnError()) { - ExceptionState exception_state(info.GetIsolate(), - ExceptionState::kIndexedSetterContext, - "{{interface_name}}"); - exception_state.ThrowTypeError("Accessor properties are not allowed."); - } - return; - } - - // Return nothing and fall back to indexedPropertySetterCallback. -{% else %}{# indexed_property_setter #} - // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty - // 3.9.3. [[DefineOwnProperty]] - // step 1.2. If O does not implement an interface with an indexed property - // setter, then return false. - // - // https://html.spec.whatwg.org/C/window-object.html#windowproxy-defineownproperty - // 7.4.6 [[DefineOwnProperty]] (P, Desc) - // step 2.1. If P is an array index property name, return false. - V8SetReturnValue(info, v8::Null(info.GetIsolate())); - if (info.ShouldThrowOnError()) { - ExceptionState exception_state(info.GetIsolate(), - ExceptionState::kIndexedSetterContext, - "{{interface_name}}"); - exception_state.ThrowTypeError("Index property setter is not supported."); - } -{% endif %}{# indexed_property_setter #} -} - -{% endif %}{# indexed_property_getter #} -{% endblock %} - - -{##############################################################################} -{% block named_property_getter %} -{% if named_property_getter and not named_property_getter.is_custom %} -{% set getter = named_property_getter %} -static void NamedPropertyGetter(const AtomicString& name, - const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if getter.is_raises_exception %} - const std::string& name_in_utf8 = name.Utf8(); - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kGetterContext, - "{{interface_name}}", - name_in_utf8.c_str()); - {% endif %} - {% if getter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - {% if getter.use_output_parameter_for_result %} - {{getter.cpp_type}} result; - {{getter.cpp_value}}; - {% else %} - {{getter.cpp_type}} result = {{getter.cpp_value}}; - {% endif %} - if ({{getter.is_null_expression}}) - return; - {{getter.v8_set_return_value}}; -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_getter_callback %} -{% if named_property_getter %} -{% set getter = named_property_getter %} -void {{v8_class_or_partial}}::NamedPropertyGetterCallback( - v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.named_property_getter_counter) }} - if (!name->IsString()) - return; - const AtomicString& property_name = ToCoreAtomicString(name.As<v8::String>()); - - {% if getter.is_custom %} - {{v8_class}}::NamedPropertyGetterCustom(property_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyGetter(property_name, info); - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_setter %} -{% from 'utilities.cc.tmpl' import v8_value_to_local_cpp_value %} -{% if named_property_setter and not named_property_setter.is_custom %} -{% set setter = named_property_setter %} -static void NamedPropertySetter( - const AtomicString& name, - v8::Local<v8::Value> v8_value, - const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if setter.has_exception_state %} - const std::string& name_in_utf8 = name.Utf8(); - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kSetterContext, - "{{interface_name}}", - name_in_utf8.c_str()); - {% endif %} - {% if setter.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - {% if setter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - {{v8_value_to_local_cpp_value(setter) | trim | indent(2)}} - {% if setter.has_type_checking_interface %} - {# Type checking for interface types (if interface not implemented, throw - TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} - if (!property_value{% if setter.is_nullable %} && !IsUndefinedOrNull(v8_value){% endif %}) { - exception_state.ThrowTypeError("The provided value is not of type '{{setter.idl_type}}'."); - return; - } - {% endif %} - - {% set setter_name = setter.name or 'AnonymousNamedSetter' %} - {% set setter_arguments = ['name', 'property_value'] %} - {% if setter.is_call_with_script_state %} - {% set setter_arguments = ['script_state'] + setter_arguments %} - {% endif %} - {% if setter.is_raises_exception %} - {% set setter_arguments = setter_arguments + ['exception_state'] %} - {% endif %} - NamedPropertySetterResult result = impl->{{setter_name}}({{setter_arguments | join(', ')}}); - {% if setter.is_raises_exception %} - if (exception_state.HadException()) - return; - {% endif %} - if (result == NamedPropertySetterResult::kDidNotIntercept) - return; - V8SetReturnValue(info, v8_value); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_setter_callback %} -{% if named_property_setter %} -{% set setter = named_property_setter %} -void {{v8_class_or_partial}}::NamedPropertySetterCallback( - v8::Local<v8::Name> name, - v8::Local<v8::Value> v8_value, - const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.named_property_setter_counter) }} - if (!name->IsString()) - return; - const AtomicString& property_name = ToCoreAtomicString(name.As<v8::String>()); - - {% if setter.is_custom %} - {{v8_class}}::NamedPropertySetterCustom(property_name, v8_value, info); - {% else %} - {{internal_namespace}}::NamedPropertySetter(property_name, v8_value, info); - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_deleter %} -{% if named_property_deleter and not named_property_deleter.is_custom %} -{% set deleter = named_property_deleter %} -static void NamedPropertyDeleter( - const AtomicString& name, const v8::PropertyCallbackInfo<v8::Boolean>& info) { - {% if deleter.is_raises_exception %} - const std::string& name_in_utf8 = name.Utf8(); - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kDeletionContext, - "{{interface_name}}", - name_in_utf8.c_str()); - {% endif %} - {% if deleter.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - {% if deleter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - - {% set deleter_name = deleter.name or 'AnonymousNamedDeleter' %} - {% set deleter_arguments = ['name'] %} - {% if deleter.is_call_with_script_state %} - {% set deleter_arguments = ['script_state'] + deleter_arguments %} - {% endif %} - {% if deleter.is_raises_exception %} - {% set deleter_arguments = deleter_arguments + ['exception_state'] %} - {% endif %} - NamedPropertyDeleterResult result = impl->{{deleter_name}}({{deleter_arguments | join(', ')}}); - {% if deleter.is_raises_exception %} - if (exception_state.HadException()) - return; - {% endif %} - if (result == NamedPropertyDeleterResult::kDidNotIntercept) - return; - V8SetReturnValue(info, result == NamedPropertyDeleterResult::kDeleted); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_deleter_callback %} -{% if named_property_deleter %} -{% set deleter = named_property_deleter %} -void {{v8_class_or_partial}}::NamedPropertyDeleterCallback( - v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) { - if (!name->IsString()) - return; - const AtomicString& property_name = ToCoreAtomicString(name.As<v8::String>()); - - {% if deleter.is_custom %} - {{v8_class}}::NamedPropertyDeleterCustom(property_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyDeleter(property_name, info); - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_query %} -{% if named_property_getter and named_property_getter.is_enumerable and - not named_property_getter.is_custom_property_query %} -{% set getter = named_property_getter %} -{# If there is an enumerator, there MUST be a query method to properly - communicate property attributes. #} -{% if indexed_property_getter %} -static void NamedPropertyQuery( - const AtomicString& name, const v8::PropertyCallbackInfo<v8::Integer>& info) { -{% else %} -{# If we do not have an indexed property getter, this function is called #} -{# from namedPropertyDescriptor(), whose v8::PropertyCallbackInfo has a #} -{# v8::Value instead of a v8::Integer. We use this template trick to make #} -{# the compiler accept the call. #} -{# TODO(rakuco): remove this hack once we switch named property handlers to #} -{# using descriptor and definer callbacks (bug 764633). #} -template <typename T> -static void NamedPropertyQuery( - const AtomicString& name, const v8::PropertyCallbackInfo<T>& info) { -{% endif %} - const std::string& name_in_utf8 = name.Utf8(); - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kGetterContext, - "{{interface_name}}", - name_in_utf8.c_str()); - {% if getter.is_call_with_script_state %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - - {% set getter_arguments = ['name', 'exception_state'] %} - {% if getter.is_call_with_script_state %} - {% set getter_arguments = ['script_state'] + getter_arguments %} - {% endif %} - bool result = impl->NamedPropertyQuery({{getter_arguments | join(', ')}}); - if (!result) - return; - // https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty - // 2.7. If |O| implements an interface with a named property setter, then set - // desc.[[Writable]] to true, otherwise set it to false. - // 2.8. If |O| implements an interface with the - // [LegacyUnenumerableNamedProperties] extended attribute, then set - // desc.[[Enumerable]] to false, otherwise set it to true. - {% if named_property_setter %} - {% set desc_properties = ['v8::None'] %} - {% else %} - {% set desc_properties = ['v8::ReadOnly'] %} - {% endif %} - {% if has_legacy_unenumerable_named_properties %} - {% set desc_properties = ['v8::DontEnum'] + desc_properties %} - {% endif %} - V8SetReturnValueInt(info, {{desc_properties | join(' | ')}}); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_query_callback %} -{% if named_property_getter and named_property_getter.is_enumerable %} -{% set getter = named_property_getter %} -void {{v8_class_or_partial}}::NamedPropertyQueryCallback( - v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.named_property_query_counter) }} - if (!name->IsString()) - return; - const AtomicString& property_name = ToCoreAtomicString(name.As<v8::String>()); - - {% if getter.is_custom_property_query %} - {{v8_class}}::NamedPropertyQueryCustom(property_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyQuery(property_name, info); - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_enumerator %} -{% if named_property_getter and named_property_getter.is_enumerable and - not named_property_getter.is_custom_property_enumerator %} -static void NamedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { - ExceptionState exception_state( - info.GetIsolate(), - ExceptionState::kEnumerationContext, - "{{interface_name}}"); - - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - - Vector<String> names; - impl->NamedPropertyEnumerator(names, exception_state); - if (exception_state.HadException()) - return; - V8SetReturnValue(info, ToV8(names, info.Holder(), info.GetIsolate()).As<v8::Array>()); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_property_enumerator_callback %} -{% if named_property_getter and named_property_getter.is_enumerable %} -{% set getter = named_property_getter %} -void {{v8_class_or_partial}}::NamedPropertyEnumeratorCallback( - const v8::PropertyCallbackInfo<v8::Array>& info) { - {% if getter.is_custom_property_enumerator %} - {{v8_class}}::NamedPropertyEnumeratorCustom(info); - {% else %} - {{internal_namespace}}::NamedPropertyEnumerator(info); - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block named_constructor %} -{% from 'methods.cc.tmpl' import generate_constructor with context %} -{% if named_constructor %} -{% set active_scriptwrappable_inheritance = - 'kInheritFromActiveScriptWrappable' - if active_scriptwrappable else - 'kNotInheritFromActiveScriptWrappable' %} -// Suppress warning: global constructors, because struct WrapperTypeInfo is trivial -// and does not depend on another global objects. -#if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wglobal-constructors" -#endif -const WrapperTypeInfo {{snake_case_v8_class}}_constructor_wrapper_type_info = { - gin::kEmbedderBlink, - {{v8_class}}Constructor::DomTemplate, - {{install_conditional_features_func or 'nullptr'}}, - "{{interface_name}}", - nullptr, - WrapperTypeInfo::kWrapperTypeObjectPrototype, - WrapperTypeInfo::{{wrapper_class_id}}, - WrapperTypeInfo::{{active_scriptwrappable_inheritance}}, -}; -#if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__) -#pragma clang diagnostic pop -#endif - -{{generate_constructor(named_constructor)}} -v8::Local<v8::FunctionTemplate> {{v8_class}}Constructor::DomTemplate( - v8::Isolate* isolate, const DOMWrapperWorld& world) { - static int dom_template_key; // This address is used for a key to look up the dom template. - V8PerIsolateData* data = V8PerIsolateData::From(isolate); - v8::Local<v8::FunctionTemplate> result = - data->FindInterfaceTemplate(world, &dom_template_key); - if (!result.IsEmpty()) - return result; - - result = v8::FunctionTemplate::New(isolate, {{v8_class}}ConstructorCallback); - v8::Local<v8::ObjectTemplate> instance_template = result->InstanceTemplate(); - instance_template->SetInternalFieldCount({{v8_class}}::kInternalFieldCount); - result->SetClassName(V8AtomicString(isolate, "{{named_constructor.name}}")); - result->Inherit({{v8_class}}::DomTemplate(isolate, world)); - data->SetInterfaceTemplate(world, &dom_template_key, result); - return result; -} - -void {{v8_class}}Constructor::NamedConstructorAttributeGetter( - v8::Local<v8::Name> property_name, - const v8::PropertyCallbackInfo<v8::Value>& info) { - v8::Local<v8::Context> creationContext = info.Holder()->CreationContext(); - V8PerContextData* per_context_data = V8PerContextData::From(creationContext); - if (!per_context_data) { - // TODO(yukishiino): Return a valid named constructor even after the context is detached - return; - } - - v8::Local<v8::Function> named_constructor = - per_context_data->ConstructorForType({{v8_class}}Constructor::GetWrapperTypeInfo()); - - // Set the prototype of named constructors to the regular constructor. - static const V8PrivateProperty::SymbolKey kPrivatePropertyInitialized; - auto private_property = - V8PrivateProperty::GetSymbol( - info.GetIsolate(), kPrivatePropertyInitialized); - v8::Local<v8::Context> current_context = info.GetIsolate()->GetCurrentContext(); - v8::Local<v8::Value> private_value; - - if (!private_property.GetOrUndefined(named_constructor).ToLocal(&private_value) || - private_value->IsUndefined()) { - v8::Local<v8::Function> interface = - per_context_data->ConstructorForType({{v8_class}}::GetWrapperTypeInfo()); - v8::Local<v8::Value> interface_prototype = - interface->Get(current_context, V8AtomicString(info.GetIsolate(), "prototype")) - .ToLocalChecked(); - // https://heycam.github.io/webidl/#named-constructors - // 8. Perform ! DefinePropertyOrThrow(F, "prototype", - // PropertyDescriptor{[[Value]]: proto, [[Writable]]: false, - // [[Enumerable]]: false, - // [Configurable]]: false}). - const v8::PropertyAttribute prototype_attributes = - static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontEnum | v8::DontDelete); - bool result = named_constructor->DefineOwnProperty( - current_context, V8AtomicString(info.GetIsolate(), "prototype"), - interface_prototype, prototype_attributes).ToChecked(); - CHECK(result); - private_property.Set(named_constructor, v8::True(info.GetIsolate())); - } - - V8SetReturnValue(info, named_constructor); -} - -{% endif %} -{% endblock %} - -{##############################################################################} -{% block overloaded_constructor %} -{% if constructor_overloads %} -static void Constructor(const v8::FunctionCallbackInfo<v8::Value>& info) { - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kConstructionContext, "{{interface_name}}"); - {# This follows the overload resolution algorithm. #} - {# https://heycam.github.io/webidl/#dfn-overload-resolution-algorithm #} - {# 3. Initialize argcount to be min(maxarg, n). #} - switch (std::min({{constructor_overloads.maxarg}}, info.Length())) { - {# 4. Remove from S all entries whose type list is not of length argcount. #} - {% for length, tests_constructors in constructor_overloads.length_tests_methods %} - {# 12. If i = d, then: #} - case {{length}}: - {# Then resolve by testing argument #} - {% for test, constructor in tests_constructors %} - if ({{test}}) { - {{internal_namespace}}::Constructor{{constructor.overload_index}}(info); - return; - } - {% if "exception_state" in test %} - if (exception_state.HadException()) { - exception_state.RethrowV8Exception(exception_state.GetException()); - return; - } - {% endif %} - {% endfor %} - break; - {% endfor %} - default: - {# Invalid arity, throw error #} - {# Report full list of valid arities if gaps and above minimum #} - {% if constructor_overloads.valid_arities %} - if (info.Length() >= {{constructor_overloads.length}}) { - exception_state.ThrowTypeError(ExceptionMessages::InvalidArity("{{constructor_overloads.valid_arities}}", info.Length())); - return; - } - {% endif %} - {# Otherwise just report "not enough arguments" #} - exception_state.ThrowTypeError(ExceptionMessages::NotEnoughArguments({{constructor_overloads.length}}, info.Length())); - return; - } - {# No match, throw error #} - exception_state.ThrowTypeError("No matching constructor signature."); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block constructor_callback %} -{% if constructors or has_custom_constructor or has_html_constructor %} -{{exported}}void ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.constructor_counter) }} - {% if measure_as %} - ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate()); - UseCounter::Count(execution_context_for_measurement, WebFeature::k{{measure_as('Constructor')}}); - {% if high_entropy %} - Dactyloscoper::Record(execution_context_for_measurement, WebFeature::k{{measure_as('Constructor')}}); - {% endif %} - {% endif %} - if (!info.IsConstructCall()) { - V8ThrowException::ThrowTypeError( - info.GetIsolate(), - ExceptionMessages::ConstructorNotCallableAsFunction("{{interface_name}}")); - return; - } - - if (ConstructorMode::Current(info.GetIsolate()) == ConstructorMode::kWrapExistingObject) { - V8SetReturnValue(info, info.Holder()); - return; - } - - {% if has_custom_constructor %} - {{v8_class}}::ConstructorCustom(info); - {% elif has_html_constructor %} - V8HTMLConstructor::HtmlConstructor( - info, *{{v8_class}}::GetWrapperTypeInfo(), HTMLElementType::k{{interface_name}}); - {% else %} - {{internal_namespace}}::Constructor(info); - {% endif %} -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% macro install_origin_safe_method(method, instance_template, prototype_template, interface_template, signature) %} -{% from 'utilities.cc.tmpl' import property_location %} -{# TODO(dcheng): Currently, bindings must create a function object for each - realm as a hack to support the incumbent realm. Clean this up when Blink - properly supports the incumbent realm. #} -{% set function_callback = - '%s::%sMethodCallback' % (v8_class_or_partial, method.camel_case_name) %} -{% set property_attribute = - 'static_cast<v8::PropertyAttribute>(%s)' % - ' | '.join(method.property_attributes or ['v8::None']) %} -{% set holder_check = 'V8DOMConfiguration::kCheckHolder' %} -static const V8DOMConfiguration::MethodConfiguration k{{method.camel_case_name}}OriginSafeMethodConfiguration[] = { -{% if method.is_per_world_bindings %} -{% set function_callback_for_main_world = '%sForMainWorld' % function_callback %} - { - "{{method.name}}", - {{function_callback_for_main_world}}, - {{method.length}}, - {{property_attribute}}, - {{property_location(method)}}, - {{holder_check}}, - V8DOMConfiguration::kCheckAccess, - V8DOMConfiguration::kHasSideEffect, - V8DOMConfiguration::MainWorld, - }, - { - "{{method.name}}", - {{function_callback}}, - {{method.length}}, - {{property_attribute}}, - {{property_location(method)}}, - {{holder_check}}, - V8DOMConfiguration::kCheckAccess, - V8DOMConfiguration::kHasSideEffect, - V8DOMConfiguration::NonMainWorlds, - } -{% else %} - { - "{{method.name}}", - {{function_callback}}, - {{method.length}}, - {{property_attribute}}, - {{property_location(method)}}, - {{holder_check}}, - V8DOMConfiguration::kCheckAccess, - V8DOMConfiguration::kHasSideEffect, - V8DOMConfiguration::kAllWorlds, - } -{% endif %} -}; -for (const auto& method_config : k{{method.camel_case_name}}OriginSafeMethodConfiguration) - V8DOMConfiguration::InstallMethod(isolate, world, {{instance_template}}, {{prototype_template}}, {{interface_template}}, {{signature}}, method_config); -{%- endmacro %} - - -{##############################################################################} -{% macro install_indexed_property_handler(target) %} -{% set indexed_property_getter_callback = - '%s::IndexedPropertyGetterCallback' % v8_class_or_partial %} -{% set indexed_property_setter_callback = - '%s::IndexedPropertySetterCallback' % v8_class_or_partial - if indexed_property_getter or named_property_setter else 'nullptr' %} -{% set indexed_property_descriptor_callback = - '%s::IndexedPropertyDescriptorCallback' % v8_class_or_partial - if indexed_property_getter or named_property_getter else 'nullptr' %} -{% set indexed_property_deleter_callback = - '%s::IndexedPropertyDeleterCallback' % v8_class_or_partial - if indexed_property_deleter or named_property_deleter else 'nullptr' %} -{% set indexed_property_enumerator_callback = - 'IndexedPropertyEnumerator<%s>' % cpp_class - if indexed_property_getter.is_enumerable else 'nullptr' %} -{% set indexed_property_definer_callback = - '%s::IndexedPropertyDefinerCallback' % v8_class_or_partial - if indexed_property_getter else 'nullptr' %} -{% set property_handler_flags = - 'v8::PropertyHandlerFlags::kHasNoSideEffect' - if indexed_property_getter.has_no_side_effect else 'v8::PropertyHandlerFlags::kNone' %} -v8::IndexedPropertyHandlerConfiguration indexedPropertyHandlerConfig( - {{indexed_property_getter_callback}}, - {{indexed_property_setter_callback}}, - {{indexed_property_descriptor_callback}}, - {{indexed_property_deleter_callback}}, - {{indexed_property_enumerator_callback}}, - {{indexed_property_definer_callback}}, - v8::Local<v8::Value>(), - {{property_handler_flags}}); -{{target}}->SetHandler(indexedPropertyHandlerConfig); -{%- endmacro %} - - -{##############################################################################} -{% macro install_named_property_handler(target) %} -{% set named_property_getter_callback = - '%s::NamedPropertyGetterCallback' % v8_class_or_partial %} -{% set named_property_setter_callback = - '%s::NamedPropertySetterCallback' % v8_class_or_partial - if named_property_setter else 'nullptr' %} -{% set named_property_query_callback = - '%s::NamedPropertyQueryCallback' % v8_class_or_partial - if named_property_getter.is_enumerable else 'nullptr' %} -{% set named_property_deleter_callback = - '%s::NamedPropertyDeleterCallback' % v8_class_or_partial - if named_property_deleter else 'nullptr' %} -{% set named_property_enumerator_callback = - '%s::NamedPropertyEnumeratorCallback' % v8_class_or_partial - if named_property_getter.is_enumerable else 'nullptr' %} -{% set property_handler_flags_list = - ['int(v8::PropertyHandlerFlags::kOnlyInterceptStrings)'] %} -{% if not is_override_builtins %} -{% set property_handler_flags_list = - property_handler_flags_list + ['int(v8::PropertyHandlerFlags::kNonMasking)'] %} -{% endif %} -{% if named_property_getter.has_no_side_effect %} -{% set property_handler_flags_list = - property_handler_flags_list + ['int(v8::PropertyHandlerFlags::kHasNoSideEffect)'] %} -{% endif %} -{% set property_handler_flags = - 'static_cast<v8::PropertyHandlerFlags>(%s)' % - ' | '.join(property_handler_flags_list) %} -v8::NamedPropertyHandlerConfiguration namedPropertyHandlerConfig({{named_property_getter_callback}}, {{named_property_setter_callback}}, {{named_property_query_callback}}, {{named_property_deleter_callback}}, {{named_property_enumerator_callback}}, v8::Local<v8::Value>(), {{property_handler_flags}}); -{{target}}->SetHandler(namedPropertyHandlerConfig); -{%- endmacro %} - - -{##############################################################################} -{% block get_dom_template %} -{% if not is_array_buffer_or_view %} -v8::Local<v8::FunctionTemplate> {{v8_class}}::DomTemplate( - v8::Isolate* isolate, const DOMWrapperWorld& world) { - {% set install_template_function = '%s::install_%s_template_function_' % (v8_class, snake_case_v8_class) if has_partial_interface else 'Install%sTemplate' % v8_class %} - return V8DOMConfiguration::DomClassTemplate( - isolate, world, const_cast<WrapperTypeInfo*>({{v8_class}}::GetWrapperTypeInfo()), - {{install_template_function}}); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block get_dom_template_for_named_properties_object %} -{% if has_named_properties_object %} -v8::Local<v8::FunctionTemplate> -{{v8_class}}::DomTemplateForNamedPropertiesObject( - v8::Isolate* isolate, const DOMWrapperWorld& world) { - v8::Local<v8::FunctionTemplate> parentTemplate = - V8{{parent_interface}}::DomTemplate(isolate, world); - - v8::Local<v8::FunctionTemplate> named_properties_function_template = - v8::FunctionTemplate::New(isolate, - V8ObjectConstructor::IsValidConstructorMode); - named_properties_function_template->SetClassName( - V8AtomicString(isolate, "{{interface_name}}Properties")); - named_properties_function_template->Inherit(parentTemplate); - - v8::Local<v8::ObjectTemplate> named_properties_object_template = - named_properties_function_template->PrototypeTemplate(); - named_properties_object_template->SetInternalFieldCount( - {{v8_class}}::kInternalFieldCount); - // Named Properties object has SetPrototype method of Immutable Prototype Exotic Objects - named_properties_object_template->SetImmutableProto(); - V8DOMConfiguration::SetClassString( - isolate, named_properties_object_template, "{{interface_name}}Properties"); - {{install_named_property_handler('named_properties_object_template') | trim | indent(2)}} - - return named_properties_function_template; -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block has_instance %} -{% if not is_array_buffer_or_view %} - -bool {{v8_class}}::HasInstance(v8::Local<v8::Value> v8_value, v8::Isolate* isolate) { - return V8PerIsolateData::From(isolate)->HasInstance({{v8_class}}::GetWrapperTypeInfo(), v8_value); -} - -v8::Local<v8::Object> {{v8_class}}::FindInstanceInPrototypeChain( - v8::Local<v8::Value> v8_value, v8::Isolate* isolate) { - return V8PerIsolateData::From(isolate)->FindInstanceInPrototypeChain( - {{v8_class}}::GetWrapperTypeInfo(), v8_value); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block to_impl %} -{% if interface_name == 'ArrayBuffer' or interface_name == 'SharedArrayBuffer' %} -{{cpp_class}}* V8{{interface_name}}::ToImpl(v8::Local<v8::Object> object) { - DCHECK(object->Is{{interface_name}}()); - v8::Local<v8::{{interface_name}}> v8buffer = object.As<v8::{{interface_name}}>(); - if (auto script_wrappable = ToScriptWrappable(object)) { - const WrapperTypeInfo* wrapper_type = ToWrapperTypeInfo(object); - CHECK(wrapper_type); - CHECK_EQ(wrapper_type->gin_embedder, gin::kEmbedderBlink); - return script_wrappable->ToImpl<{{cpp_class}}>(); - } - - // Transfer the ownership of the allocated memory to an {{interface_name}} without - // copying. - ArrayBufferContents contents(v8buffer->GetBackingStore()); - {{cpp_class}}* buffer = {{cpp_class}}::Create(contents); - v8::Local<v8::Object> associatedWrapper = buffer->AssociateWithWrapper(v8::Isolate::GetCurrent(), buffer->GetWrapperTypeInfo(), object); - DCHECK(associatedWrapper == object); - - return buffer; -} - -{% elif interface_name == 'ArrayBufferView' %} -{{cpp_class}}* V8ArrayBufferView::ToImpl(v8::Local<v8::Object> object) { - DCHECK(object->IsArrayBufferView()); - ScriptWrappable* script_wrappable = ToScriptWrappable(object); - if (script_wrappable) - return script_wrappable->ToImpl<{{cpp_class}}>(); - - if (object->IsInt8Array()) - return V8Int8Array::ToImpl(object); - if (object->IsInt16Array()) - return V8Int16Array::ToImpl(object); - if (object->IsInt32Array()) - return V8Int32Array::ToImpl(object); - if (object->IsUint8Array()) - return V8Uint8Array::ToImpl(object); - if (object->IsUint8ClampedArray()) - return V8Uint8ClampedArray::ToImpl(object); - if (object->IsUint16Array()) - return V8Uint16Array::ToImpl(object); - if (object->IsUint32Array()) - return V8Uint32Array::ToImpl(object); - if (object->IsBigInt64Array()) - return V8BigInt64Array::ToImpl(object); - if (object->IsBigUint64Array()) - return V8BigUint64Array::ToImpl(object); - if (object->IsFloat32Array()) - return V8Float32Array::ToImpl(object); - if (object->IsFloat64Array()) - return V8Float64Array::ToImpl(object); - if (object->IsDataView()) - return V8DataView::ToImpl(object); - - NOTREACHED(); - return nullptr; -} - -{% elif is_array_buffer_or_view %} -{{cpp_class}}* {{v8_class}}::ToImpl(v8::Local<v8::Object> object) { - DCHECK(object->Is{{interface_name}}()); - ScriptWrappable* script_wrappable = ToScriptWrappable(object); - if (script_wrappable) - return script_wrappable->ToImpl<{{cpp_class}}>(); - - v8::Local<v8::{{interface_name}}> v8_view = object.As<v8::{{interface_name}}>(); - v8::Local<v8::Object> array_buffer = v8_view->Buffer(); - {{cpp_class}}* typed_array = nullptr; - if (array_buffer->IsArrayBuffer()) { - typed_array = {{cpp_class}}::Create( - V8ArrayBuffer::ToImpl(array_buffer), - v8_view->ByteOffset(), - v8_view->{% if interface_name == 'DataView' %}Byte{% endif %}Length()); - } else if (array_buffer->IsSharedArrayBuffer()) { - typed_array = {{cpp_class}}::Create( - V8SharedArrayBuffer::ToImpl(array_buffer), - v8_view->ByteOffset(), - v8_view->{% if interface_name == 'DataView' %}Byte{% endif %}Length()); - } else { - NOTREACHED(); - } - v8::Local<v8::Object> associated_wrapper = - typed_array->AssociateWithWrapper( - v8::Isolate::GetCurrent(), typed_array->GetWrapperTypeInfo(), object); - DCHECK(associated_wrapper == object); - - return typed_array->ToImpl<{{cpp_class}}>(); -} - -{% endif %} -{% endblock %} - - -{##############################################################################} -{% block to_impl_with_type_check %} -{{cpp_class}}* {{v8_class}}::ToImplWithTypeCheck( - v8::Isolate* isolate, v8::Local<v8::Value> value) { -{% if is_array_buffer_or_view %} - return value->Is{{interface_name}}() ? ToImpl(v8::Local<v8::Object>::Cast(value)) : nullptr; -{% else %} - return HasInstance(value, isolate) ? ToImpl(v8::Local<v8::Object>::Cast(value)) : nullptr; -{% endif %} -} - -{% endblock %} - - -{##############################################################################} -{% block partial_interface %} -{% if has_partial_interface %} -{% if needs_runtime_enabled_installer %} -InstallRuntimeEnabledFeaturesFunction -{{v8_class}}::install_runtime_enabled_features_function_ = - &{{v8_class}}::InstallRuntimeEnabledFeaturesImpl; -{% endif %} -{% if not is_array_buffer_or_view %} -InstallRuntimeEnabledFeaturesOnTemplateFunction -{{v8_class}}::install_runtime_enabled_features_on_template_function_ = - &{{v8_class}}::InstallRuntimeEnabledFeaturesOnTemplate; -{% endif %} - -InstallTemplateFunction -{{v8_class}}::install_{{snake_case_v8_class}}_template_function_ = - &{{v8_class}}::Install{{v8_class}}Template; - -void {{v8_class}}::UpdateWrapperTypeInfo( - InstallTemplateFunction install_template_function, - InstallRuntimeEnabledFeaturesFunction install_runtime_enabled_features_function, - InstallRuntimeEnabledFeaturesOnTemplateFunction install_runtime_enabled_features_on_template_function, - InstallConditionalFeaturesFunction install_conditional_features_function) { - {{v8_class}}::install_{{snake_case_v8_class}}_template_function_ = - install_template_function; - - {% if needs_runtime_enabled_installer %} - CHECK(install_runtime_enabled_features_function); - {{v8_class}}::install_runtime_enabled_features_function_ = - install_runtime_enabled_features_function; - - {% endif %} - {% if not is_array_buffer_or_view %} - CHECK(install_runtime_enabled_features_on_template_function); - {{v8_class}}::install_runtime_enabled_features_on_template_function_ = - install_runtime_enabled_features_on_template_function; - {% endif %} - - if (install_conditional_features_function) { - {{v8_class}}::GetWrapperTypeInfo()->install_conditional_features_function = - install_conditional_features_function; - } -} - -{% for method in methods if method.overloads and method.overloads.has_partial_overloads %} -void {{v8_class}}::Register{{method.camel_case_name}}MethodForPartialInterface(void (*method)(const v8::FunctionCallbackInfo<v8::Value>&)) { - {{internal_namespace}}::{{method.name}}MethodForPartialInterface = method; -} - -{% endfor %} -{% endif %}{# has_partial_interface #} -{% endblock %}
diff --git a/third_party/blink/renderer/bindings/templates/interface.h.tmpl b/third_party/blink/renderer/bindings/templates/interface.h.tmpl deleted file mode 100644 index a38f8a5..0000000 --- a/third_party/blink/renderer/bindings/templates/interface.h.tmpl +++ /dev/null
@@ -1,325 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% if optional_features %} -class ScriptState; -{% endif %} -{% if named_constructor %} - -extern const WrapperTypeInfo {{snake_case_v8_class}}_constructor_wrapper_type_info; - -class {{v8_class}}Constructor { - STATIC_ONLY({{v8_class}}Constructor); - public: - static v8::Local<v8::FunctionTemplate> DomTemplate(v8::Isolate*, const DOMWrapperWorld&); - static void NamedConstructorAttributeGetter(v8::Local<v8::Name> property_name, const v8::PropertyCallbackInfo<v8::Value>& info); - static constexpr const WrapperTypeInfo* GetWrapperTypeInfo() { - return &{{snake_case_v8_class}}_constructor_wrapper_type_info; - } -}; - -{% endif %} - -{% if has_partial_interface %} -{{exported}}extern WrapperTypeInfo {{snake_case_v8_class}}_wrapper_type_info; -{% else %} -{{exported}}extern const WrapperTypeInfo {{snake_case_v8_class}}_wrapper_type_info; -{% endif %} - -class {{v8_class}} { - STATIC_ONLY({{v8_class}}); - public: - {% if is_array_buffer_or_view %} - // Migration adapter - {{exported}}static bool HasInstance(v8::Isolate*, v8::Local<v8::Value> value) { - return value->Is{{interface_name}}(); - } - - {{exported}}static {{cpp_class}}* ToImpl(v8::Local<v8::Object> object); - {% else %} - {{exported}}static bool HasInstance(v8::Local<v8::Value>, v8::Isolate*); - static v8::Local<v8::Object> FindInstanceInPrototypeChain(v8::Local<v8::Value>, v8::Isolate*); - {{exported}}static v8::Local<v8::FunctionTemplate> DomTemplate(v8::Isolate*, const DOMWrapperWorld&); - {% if has_named_properties_object %} - {{exported}}static v8::Local<v8::FunctionTemplate> DomTemplateForNamedPropertiesObject(v8::Isolate*, const DOMWrapperWorld&); - {% endif %} - static {{cpp_class}}* ToImpl(v8::Local<v8::Object> object) { - return ToScriptWrappable(object)->ToImpl<{{cpp_class}}>(); - } - {% endif %} - {{exported}}static {{cpp_class}}* ToImplWithTypeCheck(v8::Isolate*, v8::Local<v8::Value>); - - {% if is_array_buffer_or_view %} - {{exported}}static const WrapperTypeInfo* GetWrapperTypeInfo() { - {% elif has_partial_interface %} - {{exported}}static constexpr WrapperTypeInfo* GetWrapperTypeInfo() { - {% else %} - {{exported}}static constexpr const WrapperTypeInfo* GetWrapperTypeInfo() { - {% endif %} - {% if is_array_buffer_or_view %} - return {{cpp_class}}::GetStaticWrapperTypeInfo(); - {% else %} - return &{{snake_case_v8_class}}_wrapper_type_info; - {% endif %} - } - - {% for method in methods %} - {% if method.is_custom %} - static void {{method.camel_case_name}}MethodCustom(const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - {% endfor %} - {% if has_custom_constructor %} - static void ConstructorCustom(const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - {% for attribute in attributes %} - {% if attribute.has_custom_getter %}{# FIXME: and not attribute.implemented_by #} - {% if attribute.is_data_type_property %} - static void {{attribute.camel_case_name}}AttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>&); - {% else %} - static void {{attribute.camel_case_name}}AttributeGetterCustom(const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - {% endif %} - {% if attribute.has_custom_setter %}{# FIXME: and not attribute.implemented_by #} - {% if attribute.is_data_type_property %} - static void {{attribute.camel_case_name}}AttributeSetterCustom(v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>&); - {% else %} - static void {{attribute.camel_case_name}}AttributeSetterCustom(v8::Local<v8::Value>, const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - {% endif %} - {% endfor %} - {# Custom special operations #} - {% if indexed_property_getter and indexed_property_getter.is_custom %} - static void IndexedPropertyGetterCustom(uint32_t, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if indexed_property_setter and indexed_property_setter.is_custom %} - static void IndexedPropertySetterCustom(uint32_t, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if indexed_property_deleter and indexed_property_deleter.is_custom %} - static void IndexedPropertyDeleterCustom(uint32_t, const v8::PropertyCallbackInfo<v8::Boolean>&); - {% endif %} - {% if named_property_getter and named_property_getter.is_custom %} - static void NamedPropertyGetterCustom(const AtomicString&, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if named_property_setter and named_property_setter.is_custom %} - static void NamedPropertySetterCustom(const AtomicString&, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if named_property_getter and named_property_getter.is_custom_property_query %} - static void NamedPropertyQueryCustom(const AtomicString&, const v8::PropertyCallbackInfo<v8::Integer>&); - {% endif %} - {% if named_property_deleter and named_property_deleter.is_custom %} - static void NamedPropertyDeleterCustom(const AtomicString&, const v8::PropertyCallbackInfo<v8::Boolean>&); - {% endif %} - {% if named_property_getter and named_property_getter.is_custom_property_enumerator %} - static void NamedPropertyEnumeratorCustom(const v8::PropertyCallbackInfo<v8::Array>&); - {% endif %} - {# END custom special operations #} - {% if has_custom_legacy_call_as_function %} - static void LegacyCallCustom(const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - {# Custom internal fields #} - {# persistentHandleIndex must be the last field, if it is present. - Detailed explanation: https://codereview.chromium.org/139173012 - FIXME: Remove this internal field, and share one field for either: - * a persistent handle (if the object is in oilpan) or - * a C++ pointer to the DOM object (if the object is not in oilpan) #} - static constexpr int kInternalFieldCount = kV8DefaultWrapperInternalFieldCount; - {# End custom internal fields #} - - {% if install_conditional_features_func %} - {{exported}}static void InstallConditionalFeatures( - v8::Local<v8::Context>, - const DOMWrapperWorld&, - v8::Local<v8::Object> instance_object, - v8::Local<v8::Object> prototype_object, - v8::Local<v8::Function> interface_object, - v8::Local<v8::FunctionTemplate> interface_template); - {% elif has_partial_interface %} - {{exported}}static void InstallConditionalFeatures( - v8::Local<v8::Context>, - const DOMWrapperWorld&, - v8::Local<v8::Object> instance_object, - v8::Local<v8::Object> prototype_object, - v8::Local<v8::Function> interface_object, - v8::Local<v8::FunctionTemplate> interface_template) {} - {% endif %} - - {% if has_partial_interface %} - {{exported}}static void UpdateWrapperTypeInfo( - InstallTemplateFunction, - InstallRuntimeEnabledFeaturesFunction, - InstallRuntimeEnabledFeaturesOnTemplateFunction, - InstallConditionalFeaturesFunction); - {{exported}}static void Install{{v8_class}}Template(v8::Isolate*, const DOMWrapperWorld&, v8::Local<v8::FunctionTemplate> interface_template); - {% for method in methods if method.overloads and method.overloads.has_partial_overloads %} - {{exported}}static void Register{{method.camel_case_name}}MethodForPartialInterface(void (*)(const v8::FunctionCallbackInfo<v8::Value>&)); - {% endfor %} - {% endif %} - - {% for feature in optional_features %} - - static void Install{{feature.name}}(v8::Isolate*, const DOMWrapperWorld&, v8::Local<v8::Object> instance, v8::Local<v8::Object> prototype, v8::Local<v8::Function> interface); - static void Install{{feature.name}}(ScriptState*, v8::Local<v8::Object> instance); - {% if not feature.needs_instance %} - static void Install{{feature.name}}(ScriptState*); - {% endif %} - {% endfor %} - - // Callback functions - {% for constant in constants | has_special_getter %} - {{exported}}static void {{constant.camel_case_name}}ConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endfor %} - - {% for attribute in attributes %} - {% if attribute.is_cached_accessor %} - {{exported}}static v8::Local<v8::Private> {{attribute.camel_case_name}}CachedPropertyKey(v8::Isolate*); - {% endif %} - {% for world_suffix in attribute.world_suffixes %} - {% if not attribute.constructor_type %} - {{exported}}static void {{attribute.camel_case_name}}AttributeGetterCallback{{world_suffix}}( - {%- if attribute.is_data_type_property -%} - v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& - {%- else -%} - const v8::FunctionCallbackInfo<v8::Value>& - {%- endif -%}); - {% else %} - {{exported}}static void {{attribute.camel_case_name}}ConstructorGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if attribute.has_setter %} - {{exported}}static void {{attribute.camel_case_name}}AttributeSetterCallback{{world_suffix}}( - {%- if attribute.is_data_type_property -%} - v8::Local<v8::Name>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>& - {%- else -%} - const v8::FunctionCallbackInfo<v8::Value>& - {%- endif -%}); - {% endif %} - {% endfor %} - {% endfor %} - - {% for method in methods %} - {% for world_suffix in method.world_suffixes %} - {% if not method.overload_index or method.overloads %} - {# Document about the following condition: #} - {# https://docs.google.com/document/d/1qBC7Therp437Jbt_QYAtNYMZs6zQ_7_tnMkNUG_ACqs/edit?usp=sharing #} - {% if (method.overloads and method.overloads.visible and - (not method.overloads.has_partial_overloads or not is_partial)) or - (not method.overloads and method.visible) %} - {# A single callback is generated for overloaded methods #} - {# with considering partial overloads #} - {{exported}}static void {{method.camel_case_name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - {% if method.is_cross_origin and method.visible %} - {{exported}}static void {{method.camel_case_name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% endif %} - {% endfor %} - {% endfor %} - {% if iterator_method %} - {{exported}}static void {{iterator_method.camel_case_name}}MethodCallback(const v8::FunctionCallbackInfo<v8::Value>&); - {% endif %} - - {% if has_access_check_callbacks and not is_partial %} - {{exported}}static bool SecurityCheck(v8::Local<v8::Context>, v8::Local<v8::Object>, v8::Local<v8::Value>); - {% if has_cross_origin_named_getter %} - {{exported}}static void CrossOriginNamedGetter(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if has_cross_origin_named_setter %} - {{exported}}static void CrossOriginNamedSetter(v8::Local<v8::Name>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if has_cross_origin_named_enumerator %} - {{exported}}static void CrossOriginNamedEnumerator(const v8::PropertyCallbackInfo<v8::Array>&); - {% endif %} - {% if has_cross_origin_indexed_getter %} - {{exported}}static void CrossOriginIndexedGetter(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% endif %} - - {% if named_property_getter %} - {{exported}}static void NamedPropertyGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if named_property_setter %} - {{exported}}static void NamedPropertySetterCallback(v8::Local<v8::Name>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if named_property_deleter %} - {{exported}}static void NamedPropertyDeleterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Boolean>&); - {% endif %} - {% if named_property_getter and named_property_getter.is_enumerable %} - {{exported}}static void NamedPropertyQueryCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Integer>&); - {% endif %} - {% if named_property_getter and named_property_getter.is_enumerable %} - {{exported}}static void NamedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>&); - {% endif %} - {% if indexed_property_getter or named_property_getter %} - {{exported}}static void IndexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if indexed_property_getter or named_property_setter %} - {{exported}}static void IndexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if indexed_property_getter or named_property_getter %} - {{exported}}static void IndexedPropertyDescriptorCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if indexed_property_deleter or named_property_deleter %} - {{exported}}static void IndexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>&); - {% endif %} - {% if indexed_property_getter %} - {{exported}}static void IndexedPropertyDefinerCallback(uint32_t index, const v8::PropertyDescriptor&, const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - - {% if needs_runtime_enabled_installer %} - {{exported if has_partial_interface else ''}}static void InstallRuntimeEnabledFeatures( - v8::Isolate*, - const DOMWrapperWorld& world, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface); - {% endif %}{# needs_runtime_enabled_installer #} - - {% if not is_array_buffer_or_view %} - {{exported if has_partial_interface else ''}}static void InstallRuntimeEnabledFeaturesOnTemplate( - v8::Isolate*, - const DOMWrapperWorld&, - v8::Local<v8::FunctionTemplate> interface_template); - {% if has_partial_interface %} - static InstallRuntimeEnabledFeaturesOnTemplateFunction - install_runtime_enabled_features_on_template_function_; - {% endif %} - {% endif %}{# not is_array_buffer_or_view #} - - {% if needs_runtime_enabled_installer or has_partial_interface %} - private: - {% if needs_runtime_enabled_installer %} - static void InstallRuntimeEnabledFeaturesImpl( - v8::Isolate*, - const DOMWrapperWorld& world, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface); - {% endif %}{# needs_runtime_enabled_installer #} - {% if has_partial_interface %} - static InstallTemplateFunction install_{{snake_case_v8_class}}_template_function_; - {% if needs_runtime_enabled_installer %} - static InstallRuntimeEnabledFeaturesFunction - install_runtime_enabled_features_function_; - {% endif %} - {% endif %}{# has_partial_interface #} - {% endif %} -}; - -template <> -struct V8TypeOf<{{cpp_class}}> { - typedef {{v8_class}} Type; -}; - -} // namespace blink - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl b/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl deleted file mode 100644 index a9b0aa3..0000000 --- a/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl +++ /dev/null
@@ -1,1060 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#include "{{this_include_header_path}}" - -#include <algorithm> - -{% for filename in cpp_includes if filename != '%s.h' % cpp_class_or_partial %} -#include "{{filename}}" -{% endfor %} - -namespace blink { -{% set dom_template = '%s::DomTemplate' % v8_class if not is_array_buffer_or_view else 'nullptr' %} -{% set parent_wrapper_type_info = 'V8%s::GetWrapperTypeInfo()' % parent_interface - if parent_interface else 'nullptr' %} -{% set active_scriptwrappable_inheritance = - 'kInheritFromActiveScriptWrappable' - if active_scriptwrappable else - 'kNotInheritFromActiveScriptWrappable' %} - -{% set wrapper_type_info_const = '' if has_partial_interface else 'const ' %} -{% if not is_partial %} -{% if not is_array_buffer_or_view %} -// Suppress warning: global constructors, because struct WrapperTypeInfo is trivial -// and does not depend on another global objects. -#if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wglobal-constructors" -#endif -{{wrapper_type_info_const}}WrapperTypeInfo {{snake_case_v8_class}}_wrapper_type_info = { - gin::kEmbedderBlink, - {{dom_template}}, - {{install_conditional_features_func or 'nullptr'}}, - "{{interface_name}}", - {{parent_wrapper_type_info}}, - WrapperTypeInfo::kWrapperTypeObjectPrototype, - WrapperTypeInfo::{{wrapper_class_id}}, - WrapperTypeInfo::{{active_scriptwrappable_inheritance}}, -}; -#if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__) -#pragma clang diagnostic pop -#endif - -{% if not is_typed_array_type %} -// This static member must be declared by DEFINE_WRAPPERTYPEINFO in {{cpp_class}}.h. -// For details, see the comment of DEFINE_WRAPPERTYPEINFO in -// platform/bindings/ScriptWrappable.h. -const WrapperTypeInfo& {{cpp_class}}::wrapper_type_info_ = {{snake_case_v8_class}}_wrapper_type_info; -{% endif %} -{% endif %}{# not is_array_buffer_or_view #} - -{% if active_scriptwrappable %} -// [ActiveScriptWrappable] -static_assert( - std::is_base_of<ActiveScriptWrappableBase, {{cpp_class}}>::value, - "{{cpp_class}} does not inherit from ActiveScriptWrappable<>, but specifying " - "[ActiveScriptWrappable] extended attribute in the IDL file. " - "Be consistent."); -static_assert( - !std::is_same<decltype(&{{cpp_class}}::HasPendingActivity), - decltype(&ScriptWrappable::HasPendingActivity)>::value, - "{{cpp_class}} is not overriding hasPendingActivity(), but is specifying " - "[ActiveScriptWrappable] extended attribute in the IDL file. " - "Be consistent."); -{% else %} -// not [ActiveScriptWrappable] -static_assert( - !std::is_base_of<ActiveScriptWrappableBase, {{cpp_class}}>::value, - "{{cpp_class}} inherits from ActiveScriptWrappable<>, but is not specifying " - "[ActiveScriptWrappable] extended attribute in the IDL file. " - "Be consistent."); -static_assert( - std::is_same<decltype(&{{cpp_class}}::HasPendingActivity), - decltype(&ScriptWrappable::HasPendingActivity)>::value, - "{{cpp_class}} is overriding hasPendingActivity(), but is not specifying " - "[ActiveScriptWrappable] extended attribute in the IDL file. " - "Be consistent."); -{% endif %} - -{% endif %}{# not is_partial #} -{% if not is_array_buffer_or_view %} -namespace {{internal_namespace}} { -{% if has_partial_interface %} -{% for method in methods if method.overloads and method.overloads.has_partial_overloads %} -static void (*{{method.name}}MethodForPartialInterface)(const v8::FunctionCallbackInfo<v8::Value>&) = 0; -{% endfor %} -{% endif %} - -{##############################################################################} -{# Attributes #} -{% from 'attributes.cc.tmpl' import attribute_getter, attribute_setter, - with context %} -{% for attribute in attributes %} -{% for world_suffix in attribute.world_suffixes %} -{% if attribute.private_property_is_shared_between_getter_and_setter %} -// Define a private property key shared between getter and setter. -static const V8PrivateProperty::SymbolKey kPrivateProperty{{attribute.camel_case_name}}; -{% endif %} - -{% if attribute.does_generate_getter %} -{{attribute_getter(attribute, world_suffix)}} -{% endif %} -{% if attribute.does_generate_setter %} -{{attribute_setter(attribute, world_suffix)}} -{% endif %} -{% endfor %} -{% endfor %} -{##############################################################################} -{# Methods #} -{% from 'methods.cc.tmpl' import generate_method, overload_resolution_method, - origin_safe_method_getter, generate_constructor, - runtime_determined_length_method, runtime_determined_maxarg_method - with context %} -{% for method in methods %} -{% for world_suffix in method.world_suffixes %} -{% if not method.is_custom and method.visible %} -{{generate_method(method, world_suffix)}} -{% endif %} -{% if method.overloads and method.overloads.visible %} -{% if method.overloads.runtime_determined_lengths %} -{{runtime_determined_length_method(method.overloads)}} -{% endif %} -{% if method.overloads.runtime_determined_maxargs %} -{{runtime_determined_maxarg_method(method.overloads)}} -{% endif %} -{{overload_resolution_method(method.overloads, world_suffix)}} -{% endif %} -{% if method.is_cross_origin and method.visible and - (not method.overload_index or method.overloads) %} -{{origin_safe_method_getter(method, world_suffix)}} -{% endif %} -{% endfor %} -{% endfor %} -{% if iterator_method %} -{{generate_method(iterator_method)}} -{% endif %} -{# Constructors #} -{% for constructor in constructors %} -{{generate_constructor(constructor)}} -{% endfor %} -{% block overloaded_constructor %}{% endblock %} -{% block constructor_callback %}{% endblock %} -{# Special operations (methods) #} -{% block named_property_getter %}{% endblock %} -{% block named_property_setter %}{% endblock %} -{% block named_property_deleter %}{% endblock %} -{% block named_property_query %}{% endblock %} -{% block named_property_descriptor %}{% endblock %} -{% block named_property_enumerator %}{% endblock %} -{% block indexed_property_getter %}{% endblock %} -{% block indexed_property_descriptor %}{% endblock %} -{% block indexed_property_setter %}{% endblock %} -{% block indexed_property_deleter %}{% endblock %} -{##############################################################################} -{% if has_access_check_callbacks and not is_partial and has_cross_origin_named_enumerator %} -static const struct { - using GetterCallback = void(*)(const v8::PropertyCallbackInfo<v8::Value>&); - using SetterCallback = void(*)(v8::Local<v8::Value>, const V8CrossOriginCallbackInfo&); - - const char* const name; - const GetterCallback getter; - const SetterCallback setter; -} kCrossOriginAttributeTable[] = { - {% for attribute in attributes if attribute.has_cross_origin_getter or attribute.has_cross_origin_setter %} - { - "{{attribute.name}}", - {% if attribute.has_cross_origin_getter %} - {% if attribute.has_custom_getter %} - {{v8_class}}::{{attribute.camel_case_name}}AttributeGetterCustom, - {% else %} - {{internal_namespace}}::{{attribute.camel_case_name}}AttributeGetter, - {% endif %} - {% else %} - nullptr, - {% endif %} - {%+ if attribute.has_cross_origin_setter %}&{{internal_namespace}}::{{attribute.camel_case_name}}AttributeSetter{% else %}nullptr{% endif %}, - }, - {% endfor %} -}; - -static const struct { - using ValueCallback = void(*)(const v8::PropertyCallbackInfo<v8::Value>&); - - const char* const name; - const ValueCallback value; -} kCrossOriginOperationTable[] = { - {% for method in methods if method.is_cross_origin and - (not method.overload_index or method.overloads) %} - {"{{method.name}}", &{{internal_namespace}}::{{method.camel_case_name}}OriginSafeMethodGetter}, - {% endfor %} -}; -{% endif %} -{##############################################################################} -} // namespace {{internal_namespace}} - -{# Constants #} -{% from 'constants.cc.tmpl' import constant_getter_callback with context %} -{% for constant in constants | has_special_getter %} -{{constant_getter_callback(constant)}} -{% endfor %} - -{# Attributes #} -{% from 'attributes.cc.tmpl' import constructor_getter_callback, - attribute_getter_callback, attribute_setter_callback with context %} -{% for attribute in attributes %} -{% for world_suffix in attribute.world_suffixes %} -{% if not attribute.constructor_type %} -{{attribute_getter_callback(attribute, world_suffix)}} -{% else %} -{{constructor_getter_callback(attribute, world_suffix)}} -{% endif %} -{% if attribute.has_setter %} -{{attribute_setter_callback(attribute, world_suffix)}} -{% endif %} -{% endfor %} -{% endfor %} - -{# Methods #} -{% from 'methods.cc.tmpl' import origin_safe_method_getter_callback, - method_callback with context %} -{% for method in methods %} -{% for world_suffix in method.world_suffixes %} -{% if not method.overload_index or method.overloads %} -{# Document about the following condition: #} -{# https://docs.google.com/document/d/1qBC7Therp437Jbt_QYAtNYMZs6zQ_7_tnMkNUG_ACqs/edit?usp=sharing #} -{% if (method.overloads and method.overloads.visible and - (not method.overloads.has_partial_overloads or not is_partial)) or - (not method.overloads and method.visible) %} -{# A single callback is generated for overloaded methods #} -{# with considering partial overloads #} -{{method_callback(method, world_suffix)}} -{% endif %} -{% endif %} -{% if method.is_cross_origin and method.visible and - (not method.overload_index or method.overloads) %} -{{origin_safe_method_getter_callback(method, world_suffix)}} -{% endif %} -{% endfor %} -{% endfor %} -{% if iterator_method %} -{{method_callback(iterator_method)}} -{% endif %} -{# Special operations (methods) #} -{% block named_property_getter_callback %}{% endblock %} -{% block named_property_setter_callback %}{% endblock %} -{% block named_property_deleter_callback %}{% endblock %} -{% block named_property_query_callback %}{% endblock %} -{% block named_property_enumerator_callback %}{% endblock %} -{% block indexed_property_getter_callback %}{% endblock %} -{% block indexed_property_descriptor_callback %}{% endblock %} -{% block indexed_property_setter_callback %}{% endblock %} -{% block indexed_property_deleter_callback %}{% endblock %} -{% block indexed_property_definer_callback %}{% endblock %} - -{% if has_access_check_callbacks and not is_partial %} -bool {{v8_class_or_partial}}::SecurityCheck(v8::Local<v8::Context> accessing_context, v8::Local<v8::Object> accessed_object, v8::Local<v8::Value> data) { - {% if interface_name == 'Window' %} - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::Local<v8::Object> window = V8Window::FindInstanceInPrototypeChain(accessed_object, isolate); - if (window.IsEmpty()) - return false; // the frame is gone. - - const DOMWindow* target_window = V8Window::ToImpl(window); - return BindingSecurity::ShouldAllowAccessTo(ToLocalDOMWindow(accessing_context), target_window, BindingSecurity::ErrorReportOption::kDoNotReport); - {% elif interface_name == 'Location' %} - {{cpp_class}}* impl = {{v8_class}}::ToImpl(accessed_object); - return BindingSecurity::ShouldAllowAccessTo(ToLocalDOMWindow(accessing_context), impl, BindingSecurity::ErrorReportOption::kDoNotReport); - {% else %} - #error "Unexpected security check for interface {{interface_name}}" - {% endif %} -} - -{% if has_cross_origin_named_getter %} -void {{v8_class_or_partial}}::CrossOriginNamedGetter(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.cross_origin_named_getter_counter) }} - if (!name->IsString()) - return; - const AtomicString& property_name = ToCoreAtomicString(name.As<v8::String>()); - - for (const auto& attribute : {{internal_namespace}}::kCrossOriginAttributeTable) { - if (property_name == attribute.name && attribute.getter) { - attribute.getter(info); - return; - } - } - for (const auto& operation : {{internal_namespace}}::kCrossOriginOperationTable) { - if (property_name == operation.name) { - operation.value(info); - return; - } - } - - {% if named_property_getter and named_property_getter.is_cross_origin %} - {% if named_property_getter.is_custom %} - {{v8_class}}::NamedPropertyGetterCustom(property_name, info); - {% else %} - {{internal_namespace}}::NamedPropertyGetter(property_name, info); - {% endif %} - {% else %} - // HTML 7.2.3.3 CrossOriginGetOwnPropertyHelper ( O, P ) - // https://html.spec.whatwg.org/C/#crossorigingetownpropertyhelper-(-o,-p-) - // step 3. If P is "then", @@toStringTag, @@hasInstance, or - // @@isConcatSpreadable, then return PropertyDescriptor{ [[Value]]: - // undefined, [[Writable]]: false, [[Enumerable]]: false, - // [[Configurable]]: true }. - if (property_name == "then") { - V8SetReturnValue(info, v8::Undefined(info.GetIsolate())); - return; - } - - BindingSecurity::FailedAccessCheckFor( - info.GetIsolate(), - {{v8_class}}::GetWrapperTypeInfo(), - info.Holder()); - {% endif %} -} -{% endif %} - -{% if has_cross_origin_named_setter %} -void {{v8_class_or_partial}}::CrossOriginNamedSetter(v8::Local<v8::Name> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.cross_origin_named_setter_counter) }} - if (!name->IsString()) - return; - const AtomicString& property_name = ToCoreAtomicString(name.As<v8::String>()); - - for (const auto& attribute : {{internal_namespace}}::kCrossOriginAttributeTable) { - if (property_name == attribute.name && attribute.setter) { - attribute.setter(value, V8CrossOriginCallbackInfo(info)); - return; - } - } - - {# If there were no matches in the cross-origin attribute table, consider it - an access check failure: there are no custom named setters that are - accessible from a cross-origin context. #} - - BindingSecurity::FailedAccessCheckFor( - info.GetIsolate(), - {{v8_class}}::GetWrapperTypeInfo(), - info.Holder()); -} -{% endif %} - -{% if has_cross_origin_named_enumerator %} -void {{v8_class_or_partial}}::CrossOriginNamedEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { - Vector<String> names; - for (const auto& attribute : {{internal_namespace}}::kCrossOriginAttributeTable) - names.push_back(attribute.name); - for (const auto& operation : {{internal_namespace}}::kCrossOriginOperationTable) - names.push_back(operation.name); - - // Use the current context as the creation context, as a cross-origin access - // may involve an object that does not have a creation context. - V8SetReturnValue(info, - ToV8(names, info.GetIsolate()->GetCurrentContext()->Global(), - info.GetIsolate()).As<v8::Array>()); -} -{% endif %} - -{% if has_cross_origin_indexed_getter %} -void {{v8_class_or_partial}}::CrossOriginIndexedGetter(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { - {% if indexed_property_getter.is_custom %} - {{v8_class}}::IndexedPropertyGetterCustom(index, info); - {% else %} - {{internal_namespace}}::IndexedPropertyGetter(index, info); - {% endif %} -} -{% endif %} -{% endif %}{# has_access_check_callbacks #} - -{% block visit_dom_wrapper %}{% endblock %} -{##############################################################################} -{% block install_methods %} -{% from 'methods.cc.tmpl' import method_configuration with context %} -{% if methods | has_method_configuration(is_partial) %} -static constexpr V8DOMConfiguration::MethodConfiguration k{{v8_class}}Methods[] = { - {% for method in methods | has_method_configuration(is_partial) %} - {{method_configuration(method) | trim | indent(4)}}, - {% endfor %} -}; - -{% endif %} -{% endblock %} -{% endif %}{# not is_array_buffer_or_view #} -{##############################################################################} -{% block named_constructor %}{% endblock %} -{##############################################################################} -{% block install_dom_template %} -{% if not is_array_buffer_or_view %} -{% from 'methods.cc.tmpl' import install_custom_signature, - method_configuration with context %} -{% from 'attributes.cc.tmpl' import accessor_configuration, - attribute_configuration, install_attributes, install_interface_objects, - with context %} -{% from 'constants.cc.tmpl' import install_constants, - constant_configuration with context %} -{% if has_partial_interface or is_partial %} -void {{v8_class_or_partial}}::Install{{v8_class}}Template( - v8::Isolate* isolate, - const DOMWrapperWorld& world, - v8::Local<v8::FunctionTemplate> interface_template) { -{% else %} -static void Install{{v8_class}}Template( - v8::Isolate* isolate, - const DOMWrapperWorld& world, - v8::Local<v8::FunctionTemplate> interface_template) { -{% endif %} - // Initialize the interface object's template. - {% if is_partial %} - {{v8_class}}::Install{{v8_class}}Template(isolate, world, interface_template); - {% else %} - {% set parent_interface_template = - '%s::DomTemplateForNamedPropertiesObject(isolate, world)' % v8_class - if has_named_properties_object else - 'V8%s::DomTemplate(isolate, world)' % parent_interface - if parent_interface else - 'v8::Local<v8::FunctionTemplate>()' %} - V8DOMConfiguration::InitializeDOMInterfaceTemplate(isolate, interface_template, {{v8_class}}::GetWrapperTypeInfo()->interface_name, {{parent_interface_template}}, {{v8_class}}::kInternalFieldCount); - {% if constructors or has_custom_constructor or has_html_constructor %} - interface_template->SetCallHandler({{internal_namespace}}::ConstructorCallback); - interface_template->SetLength({{interface_length}}); - {% endif %} - {% endif %}{# is_partial #} - - {% if runtime_enabled_feature_name and not context_enabled_feature_name %} - if (!{{runtime_enabled_feature_name | runtime_enabled_function}}) { - return; - } - {% endif %} - - v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interface_template); - ALLOW_UNUSED_LOCAL(signature); - v8::Local<v8::ObjectTemplate> instance_template = interface_template->InstanceTemplate(); - ALLOW_UNUSED_LOCAL(instance_template); - v8::Local<v8::ObjectTemplate> prototype_template = interface_template->PrototypeTemplate(); - ALLOW_UNUSED_LOCAL(prototype_template); - - {% if interface_name == 'Window' and not is_partial %} - prototype_template->SetInternalFieldCount(V8Window::kInternalFieldCount); - {% endif %} - - {% if is_immutable_prototype %} - // Global object prototype chain consists of Immutable Prototype Exotic Objects - prototype_template->SetImmutableProto(); - {% endif %} - - {% if is_global %} - // Global objects are Immutable Prototype Exotic Objects - instance_template->SetImmutableProto(); - {% endif %} - - // Register IDL constants, attributes and operations. - {% if constants %} - {{install_constants() | trim | indent(2)}} - {% endif %} - {% if data_attributes %} - {{install_interface_objects(data_attributes, 'instance_template', 'prototype_template') | trim | indent(2)}} - {% endif %} - {% if accessors %} - {{install_attributes(accessors, 'instance_template', 'prototype_template', 'interface_template') | trim | indent(2)}} - {% endif %} - {% if methods | has_method_configuration(is_partial) %} - V8DOMConfiguration::InstallMethods( - isolate, world, instance_template, prototype_template, interface_template, - signature, k{{v8_class}}Methods, base::size(k{{v8_class}}Methods)); - {% endif %} - - {% if has_access_check_callbacks and not is_partial %} - // Cross-origin access check - {% set cross_origin_named_getter = '%s::CrossOriginNamedGetter' % v8_class_or_partial if has_cross_origin_named_getter else 'nullptr' %} - {% set cross_origin_named_setter = '%s::CrossOriginNamedSetter' % v8_class_or_partial if has_cross_origin_named_setter else 'nullptr' %} - {% set cross_origin_named_enumerator = '%s::CrossOriginNamedEnumerator' % v8_class_or_partial if has_cross_origin_named_enumerator else 'nullptr' %} - {% set cross_origin_indexed_getter = '%s::CrossOriginIndexedGetter' % v8_class_or_partial if has_cross_origin_indexed_getter else 'nullptr' %} - instance_template->SetAccessCheckCallbackAndHandler( - {{v8_class_or_partial}}::SecurityCheck, - v8::NamedPropertyHandlerConfiguration( - {{cross_origin_named_getter}}, - {{cross_origin_named_setter}}, - nullptr, - nullptr, - {{cross_origin_named_enumerator}}), - v8::IndexedPropertyHandlerConfiguration({{cross_origin_indexed_getter}}), - v8::External::New(isolate, const_cast<WrapperTypeInfo*>({{v8_class}}::GetWrapperTypeInfo()))); - {% endif %} - - {% if (indexed_property_getter or named_property_getter) and not is_partial %} - // Indexed properties - {{install_indexed_property_handler('instance_template') | trim | indent(2)}} - {% endif %} - {% if named_property_getter and not is_partial and not has_named_properties_object %} - // Named properties - {{install_named_property_handler('instance_template') | trim | indent(2)}} - {% endif %} - - {% if has_array_iterator and not is_partial %} - // Array iterator (@@iterator) - {%+ if is_global %}instance_template{% else %}prototype_template{% endif %}->SetIntrinsicDataProperty(v8::Symbol::GetIterator(isolate), v8::kArrayProto_values, v8::DontEnum); - {% if iterable %} - {% if is_global %} -#error "iterable<V> on [Global] is currently unsupported." - {% endif %} - // For value iterators, the properties below must originally be set to the corresponding ones in %ArrayPrototype%. - // See https://heycam.github.io/webidl/#es-iterators. - prototype_template->SetIntrinsicDataProperty(V8AtomicString(isolate, "entries"), v8::kArrayProto_entries); - prototype_template->SetIntrinsicDataProperty(V8AtomicString(isolate, "forEach"), v8::kArrayProto_forEach); - prototype_template->SetIntrinsicDataProperty(V8AtomicString(isolate, "keys"), v8::kArrayProto_keys); - prototype_template->SetIntrinsicDataProperty(V8AtomicString(isolate, "values"), v8::kArrayProto_values); - {% endif %} - {% endif %} - - {% if iterator_method and not iterator_method.runtime_enabled_feature_name %} - {% filter exposed(iterator_method.exposed_test) %} - {% set symbol_alias = '"%s"' % iterator_method_alias - if iterator_method_alias else 'nullptr' %} - // Iterator (@@iterator) - static const V8DOMConfiguration::SymbolKeyedMethodConfiguration - kSymbolKeyedIteratorConfiguration = { - v8::Symbol::GetIterator, - {{symbol_alias}}, - {{v8_class_or_partial}}::IteratorMethodCallback, - 0, - v8::DontEnum, - V8DOMConfiguration::kOnPrototype, - V8DOMConfiguration::kCheckHolder, - V8DOMConfiguration::kDoNotCheckAccess, - V8DOMConfiguration::kHasSideEffect - }; - V8DOMConfiguration::InstallMethod( - isolate, world, prototype_template, signature, - kSymbolKeyedIteratorConfiguration); - {% endfilter %} - {% endif %} - - {% if interface_name == 'FileSystemDirectoryHandle' %} - // Temporary @@asyncIterator support for FileSystemDirectoryHandle - // TODO(https://crbug.com/1087157): Replace with proper bindings support. - static const V8DOMConfiguration::SymbolKeyedMethodConfiguration - kSymbolKeyedIteratorConfiguration = { - v8::Symbol::GetAsyncIterator, - "entries", - V8FileSystemDirectoryHandle::EntriesMethodCallback, - 0, - v8::DontEnum, - V8DOMConfiguration::kOnPrototype, - V8DOMConfiguration::kCheckHolder, - V8DOMConfiguration::kDoNotCheckAccess, - V8DOMConfiguration::kHasSideEffect - }; - V8DOMConfiguration::InstallMethod( - isolate, world, prototype_template, signature, - kSymbolKeyedIteratorConfiguration); - {% endif %} - - {% if interface_name == 'Iterator' %} - // The WebIDL spec says when an interface has pair iterators the iterators it - // returns must be instances of the "default iterator object" whose - // [[Prototype]] points to an "iterator prototype object" whose - // [[Prototype]], on its turn, points to %IteratorPrototype%. next() must be - // implemented in the "iterator prototype object", while %IteratorPrototype% - // provides @@iterator. - // References: - // https://heycam.github.io/webidl/#es-default-iterator-object - // https://heycam.github.io/webidl/#es-iterator-prototype-object - // - // The iterators we return from interfaces that have pair interators adhere - // to the above by: - // - Adding the "next()" property to its prototype object. - // - Making the prototype object inherit from %IteratorPrototype% with the - // hack below, which creates another function template with no prototype - // and sets the "prototype" property of its function object. - // When |interface_template|'s function object is created, its - // prototype.__proto__ will point to the value of the "prototype" property - // of |intrinsic_iterator_prototype_interface_template|, which is exactly - // what we want. - // - // Finally, creating a FunctionTemplate here might look expensive since they - // have the same lifetime as their context, but: - // - |interface_template| is cached in V8PerIsolateData, so we create only one - // FunctionTemplate per interface. - // - There is only one Iterator interface that creates this FunctionTemplate, - // so there is no need to reuse this FunctionTemplate and register it in - // V8PerIsolateData. - v8::Local<v8::FunctionTemplate> intrinsic_iterator_prototype_interface_template = - v8::FunctionTemplate::New(isolate, nullptr, v8::Local<v8::Value>(), - v8::Local<v8::Signature>(), 0, - v8::ConstructorBehavior::kThrow); - intrinsic_iterator_prototype_interface_template->SetIntrinsicDataProperty( - V8AtomicString(isolate, "prototype"), v8::kIteratorPrototype); - interface_template->Inherit(intrinsic_iterator_prototype_interface_template); - {% endif %} - - {% if interface_name == 'FileSystemDirectoryIterator' %} - // Temporary @@asyncIterator support for FileSystemDirectoryHandle - // TODO(https://crbug.com/1087157): Replace with proper bindings support. - v8::Local<v8::FunctionTemplate> intrinsic_iterator_prototype_interface_template = - v8::FunctionTemplate::New(isolate, nullptr, v8::Local<v8::Value>(), - v8::Local<v8::Signature>(), 0, - v8::ConstructorBehavior::kThrow); - intrinsic_iterator_prototype_interface_template->SetIntrinsicDataProperty( - V8AtomicString(isolate, "prototype"), v8::kAsyncIteratorPrototype); - interface_template->Inherit(intrinsic_iterator_prototype_interface_template); - {% endif %} - - {% if interface_name == 'DOMException' %} - // The WebIDL spec states that DOMException objects have a few peculiarities. - // One of them is similar to what it mandates for Iterator objects when it - // comes to the inheritance chain. Instead of - // DOMException -> prototype -> %ObjectPrototype% - // we have - // DOMException -> prototype -> %ErrorPrototype% -> %ObjectPrototype% - // so that DOMException objects "inherit" toString() and a few properties - // from %ErrorPrototype%. - // See https://heycam.github.io/webidl/#es-DOMException-specialness. - // - // We achieve this with the same hack we use for Iterators: create a new - // function template with no prototype, set its "prototype" property to - // %ErrorPrototype% and make |interface_template| inherit from it. When - // |interface_template| is instantiated, its prototype.__proto__ will point to - // |intrinsic_error_prototype_interface_template|'s "prototype" property. - v8::Local<v8::FunctionTemplate> intrinsic_error_prototype_interface_template = - v8::FunctionTemplate::New(isolate, nullptr, v8::Local<v8::Value>(), - v8::Local<v8::Signature>(), 0, - v8::ConstructorBehavior::kThrow); - intrinsic_error_prototype_interface_template->SetIntrinsicDataProperty( - V8AtomicString(isolate, "prototype"), v8::kErrorPrototype); - interface_template->Inherit(intrinsic_error_prototype_interface_template); - {% endif %} - - {% if interface_name == 'Location' %} - // Symbol.toPrimitive - // Prevent author scripts to inject Symbol.toPrimitive property into location - // objects, also prevent the look-up of Symbol.toPrimitive through the - // prototype chain. - instance_template->Set(v8::Symbol::GetToPrimitive(isolate), - v8::Undefined(isolate), - static_cast<v8::PropertyAttribute>( - v8::ReadOnly | v8::DontEnum | v8::DontDelete)); - {% endif %} - - {% if has_custom_legacy_call_as_function and not is_partial %} - instance_template->SetCallAsFunctionHandler({{v8_class}}::LegacyCallCustom); - {% endif %} - - {% if interface_name == 'HTMLAllCollection' and not is_partial %} - // Needed for legacy support of document.all - instance_template->MarkAsUndetectable(); - {% endif %} - - // Custom signature - {% for method in methods | custom_registration(is_partial) %} - {% filter exposed(method.overloads.exposed_test_all - if method.overloads else method.exposed_test) %} - {% set feature_name = method.overloads.runtime_enabled_all - if method.overloads else method.runtime_enabled_feature_name %} - {% if not feature_name %} - {% if method.is_cross_origin %} - {{install_origin_safe_method(method, 'instance_template', 'prototype_template', 'interface_template', 'signature') | trim | indent(2)}} - {% else %} - {{install_custom_signature(method, 'instance_template', 'prototype_template', 'interface_template', 'signature') | trim | indent(2)}} - {% endif %} - {% endif %} - {% endfilter %} - {% endfor %} - {% if not has_partial_interface %} - - {{v8_class_or_partial}}::InstallRuntimeEnabledFeaturesOnTemplate( - isolate, world, interface_template); - {% endif %} -} - -void {{v8_class_or_partial}}::InstallRuntimeEnabledFeaturesOnTemplate( - v8::Isolate* isolate, - const DOMWrapperWorld& world, - v8::Local<v8::FunctionTemplate> interface_template) { - {% if runtime_enabled_feature_name and not context_enabled_feature_name %} - if (!{{runtime_enabled_feature_name | runtime_enabled_function}}) { - return; - } - {% endif %} - - {% if is_partial %} - {{v8_class}}::InstallRuntimeEnabledFeaturesOnTemplate(isolate, world, interface_template); - {% endif %} - - v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interface_template); - ALLOW_UNUSED_LOCAL(signature); - v8::Local<v8::ObjectTemplate> instance_template = interface_template->InstanceTemplate(); - ALLOW_UNUSED_LOCAL(instance_template); - v8::Local<v8::ObjectTemplate> prototype_template = interface_template->PrototypeTemplate(); - ALLOW_UNUSED_LOCAL(prototype_template); - - // Register IDL constants, attributes and operations. - {% for feature_name, constants_list in constants | selectattr('runtime_enabled_feature_name') | groupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - static constexpr V8DOMConfiguration::ConstantConfiguration kConfigurations[] = { - {% for constant in constants_list %} - {{constant_configuration(constant) | trim | indent(6)}}, - {% endfor %} - }; - V8DOMConfiguration::InstallConstants( - isolate, interface_template, prototype_template, - kConfigurations, base::size(kConfigurations)); - {% endfilter %} - {% endfor %} - - {% for feature_name, attribute_list in runtime_enabled_attributes | selectattr('is_data_type_property') | groupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {{install_interface_objects(attribute_list | sort, 'instance_template', 'prototype_template') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - - {% for feature_name, attribute_list in runtime_enabled_attributes | selectattr('is_data_type_property', 'equalto', False) | groupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {{install_attributes(attribute_list | sort, 'instance_template', 'prototype_template', 'interface_template') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - - {% if iterator_method and iterator_method.runtime_enabled_feature_name %} - {% filter exposed(iterator_method.exposed_test) %} - {% filter runtime_enabled(iterator_method.runtime_enabled_feature_name) %} - {% set symbol_alias = '"%s"' % iterator_method_alias - if iterator_method_alias else 'nullptr' %} - // Iterator (@@iterator) - static constexpr V8DOMConfiguration::SymbolKeyedMethodConfiguration - kSymbolKeyedIteratorConfiguration = { - v8::Symbol::GetIterator, - {{symbol_alias}}, - {{v8_class_or_partial}}::IteratorMethodCallback, - 0, - v8::DontEnum, - V8DOMConfiguration::kOnPrototype, - V8DOMConfiguration::kCheckHolder, - V8DOMConfiguration::kDoNotCheckAccess, - V8DOMConfiguration::kHasSideEffect - }; - V8DOMConfiguration::InstallMethod( - isolate, world, prototype_template, signature, - kSymbolKeyedIteratorConfiguration); - {% endfilter %} - {% endfilter %} - {% endif %} - - // Custom signature - {% for method in methods | custom_registration(is_partial) %} - {% filter exposed(method.overloads.exposed_test_all - if method.overloads else method.exposed_test) %} - {% set feature_name = method.overloads.runtime_enabled_all - if method.overloads else method.runtime_enabled_feature_name %} - {% if feature_name %} - {% filter runtime_enabled(feature_name) %} - {% if method.is_cross_origin %} - {{install_origin_safe_method(method, 'instance_template', 'prototype_template') | trim | indent(2)}} - {% else %} - {{install_custom_signature(method, 'instance_template', 'prototype_template', 'interface_template', 'signature') | trim | indent(2)}} - {% endif %} - {% endfilter %} - {% endif %} - {% endfilter %} - {% endfor %} -} - -{% endif %}{# not is_array_buffer_or_view #} -{% endblock %} -{##############################################################################} -{% block install_runtime_enabled %} -{% if needs_runtime_enabled_installer %} -{% from 'attributes.cc.tmpl' import accessor_configuration, - attribute_configuration, install_attributes, install_interface_objects, - with context %} -{% from 'methods.cc.tmpl' import install_custom_signature with context %} -{% if not is_partial %} -void {{v8_class}}::InstallRuntimeEnabledFeatures( - v8::Isolate* isolate, - const DOMWrapperWorld& world, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface) { - {% if runtime_enabled_feature_name %} -#error "We don't expect a runtime enabled interface {{v8_class_or_partial}} to have InstallRuntimeEnabledFeatures()." - {% endif %} - - InstallRuntimeEnabledFeaturesImpl(isolate, world, instance, prototype, interface); - {% if has_partial_interface %} - - // Call partial interface's installer. - install_runtime_enabled_features_function_(isolate, world, instance, prototype, interface); - {% endif %} -} -{% endif %}{# not is_partial #} - -void {{v8_class_or_partial}}::InstallRuntimeEnabledFeaturesImpl( - v8::Isolate* isolate, - const DOMWrapperWorld& world, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface) { - {% if runtime_enabled_feature_name %} -#error "We don't expect a runtime enabled interface {{v8_class_or_partial}} to have InstallRuntimeEnabledFeatures()." - {% endif %} - - v8::Local<v8::FunctionTemplate> interface_template = {{v8_class}}::GetWrapperTypeInfo()->DomTemplate(isolate, world); - v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interface_template); - ALLOW_UNUSED_LOCAL(signature); - - {# TODO(peria): Generate code to install constants. It depends on runtime_enabled_feaure of this interface. #} - - {% for feature_name, attrs in runtime_enabled_attributes | selectattr('is_data_type_property') | groupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {{install_interface_objects(attrs | sort, 'instance', 'prototype')}} - {% endfilter %} - {% endfor %} - - {% for feature_name, attrs in runtime_enabled_attributes | selectattr('is_data_type_property', 'equalto', False) | groupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {{install_attributes(attrs | sort, 'instance', 'prototype', 'interface') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - - {% if iterator_method and iterator_method.runtime_enabled_feature_name %} -#error "{{v8_class_or_partial}} should not have runtime enabled iterator (@@iterator)." - {% endif %} - - {% if methods | custom_registration(is_partial) %} - {% for method in methods | custom_registration(is_partial) %} - {% filter exposed(method.overloads.exposed_test_all - if method.overloads else method.exposed_test) %} - {% set feature_name = (method.overloads.runtime_enabled_all - if method.overloads else method.runtime_enabled_feature_name) %} - {% if feature_name %} - {% filter runtime_enabled(feature_name) %} - {% if method.is_cross_origin %} -#error "{{v8_class_or_partial}} should not have runtime enabled and cross origin methods." - {% else %} - {{install_custom_signature(method, 'instance', 'prototype', 'interface', 'signature') | trim | indent(2)}} - {% endif %} - {% endfilter %} - {% endif %} - {% endfilter %} - {% endfor %} - {% endif %} -} - -{% endif %}{# needs_runtime_enabled_installer #} -{% endblock %} -{##############################################################################} -{% block origin_trials %} -{% from 'attributes.cc.tmpl' import accessor_configuration, - attribute_configuration, install_attributes, install_interface_objects, - with context %} -{% from 'constants.cc.tmpl' import constant_configuration with context %} -{% from 'methods.cc.tmpl' import method_configuration with context %} -{% for feature in optional_features %} -void {{v8_class_or_partial}}::Install{{feature.name}}( - v8::Isolate* isolate, - const DOMWrapperWorld& world, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface) { - {% if feature.attributes or feature.methods %} - v8::Local<v8::FunctionTemplate> interface_template = - {{v8_class}}::GetWrapperTypeInfo()->DomTemplate(isolate, world); - v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interface_template); - ALLOW_UNUSED_LOCAL(signature); - {% endif %} - {% if feature.needs_context %} - ExecutionContext* execution_context = ToExecutionContext(isolate->GetCurrentContext()); - {% endif %}{# needs context #} - {% if feature.needs_cross_origin_isolated %} - bool is_cross_origin_isolated = (execution_context && execution_context->CrossOriginIsolatedCapability()); - {% endif %}{# needs cross-origin isolated #} - {% if feature.needs_direct_socket_enabled %} - bool is_direct_socket_enabled = (execution_context && execution_context->DirectSocketCapability()); - {% endif %}{# needs direct socket enabled #} - {% if feature.needs_secure_context %} - bool is_secure_context = (execution_context && execution_context->IsSecureContext()); - {% endif %}{# needs secure context #} - {# Origin-Trial-enabled attributes #} - {% for cross_origin_isolated_test, attribute_list in feature.attributes | selectattr('is_data_type_property') | groupby('cross_origin_isolated_test') %} - {% filter cross_origin_isolated(cross_origin_isolated_test) %} - {{install_interface_objects(attribute_list, 'instance', 'prototype') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - {% for cross_origin_isolated_test, attribute_list in feature.attributes | rejectattr('is_data_type_property') | groupby('cross_origin_isolated_test') %} - {% filter cross_origin_isolated(cross_origin_isolated_test) %} - {{install_interface_objects(attribute_list, 'instance', 'prototype') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - {% for direct_socket_enabled_test, attribute_list in feature.attributes | selectattr('is_data_type_property') | groupby('direct_socket_enabled_test') %} - {% filter direct_socket_enabled(direct_socket_enabled_test) %} - {{install_interface_objects(attribute_list, 'instance', 'prototype') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - {% for direct_socket_enabled_test, attribute_list in feature.attributes | rejectattr('is_data_type_property') | groupby('direct_socket_enabled_test') %} - {% filter direct_socket_enabled(direct_socket_enabled_test) %} - {{install_interface_objects(attribute_list, 'instance', 'prototype') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - {% for secure_context_test, attribute_list in feature.attributes | selectattr('is_data_type_property') | groupby('secure_context_test') %} - {% filter secure_context(secure_context_test) %} - {{install_interface_objects(attribute_list, 'instance', 'prototype') | trim | indent(2)}} - {% endfilter %} - {% endfor %} - {% for secure_context_test, attribute_list in feature.attributes | rejectattr('is_data_type_property') | groupby('secure_context_test') %} - {% filter secure_context(secure_context_test) %} - {{install_attributes(attribute_list, 'instance', 'prototype', 'interface') | trim | indent(2)}} - {% endfilter %}{# secure_context #} - {% endfor %} - {# Origin-Trial-enabled constants #} - {% for constant in feature.constants %} - {% set constant_name = constant.camel_case_name %} - static constexpr V8DOMConfiguration::ConstantConfiguration - k{{constant_name}}Configuration = {{constant_configuration(constant)}}; - V8DOMConfiguration::InstallConstant( - isolate, interface, prototype, k{{constant_name}}Configuration); - {% endfor %} - {# Origin-Trial-enabled methods (no overloads) #} - {% for method in feature.methods %} - {% filter exposed(method.exposed_test) %} - {% filter secure_context(method.secure_context_test) %} - {% filter cross_origin_isolated(method.cross_origin_isolated_test) %} - {% filter direct_socket_enabled(method.direct_socket_enabled_test) %} - static constexpr V8DOMConfiguration::MethodConfiguration - k{{method.camel_case_name}}Configurations[] = { - {{method_configuration(method) | trim | indent(6)}} - }; - for (const auto& config : k{{method.camel_case_name}}Configurations) { - V8DOMConfiguration::InstallMethod( - isolate, world, instance, prototype, - interface, signature, config); - } - {% endfilter %}{# direct_socket_enabled #} - {% endfilter %}{# cross_origin_isolated #} - {% endfilter %}{# secure_context #} - {% endfilter %}{# exposed_test #} - {% endfor %} -} - -void {{v8_class_or_partial}}::Install{{feature.name}}( - ScriptState* script_state, v8::Local<v8::Object> instance) { - V8PerContextData* per_context_data = script_state->PerContextData(); - v8::Local<v8::Object> prototype = per_context_data->PrototypeForType( - {{v8_class}}::GetWrapperTypeInfo()); - v8::Local<v8::Function> interface = per_context_data->ConstructorForType( - {{v8_class}}::GetWrapperTypeInfo()); - ALLOW_UNUSED_LOCAL(interface); - Install{{feature.name}}(script_state->GetIsolate(), script_state->World(), instance, prototype, interface); -} -{% if not feature.needs_instance %} - -void {{v8_class_or_partial}}::Install{{feature.name}}(ScriptState* script_state) { - Install{{feature.name}}(script_state, v8::Local<v8::Object>()); -} -{% endif %} - -{% endfor %}{# feature #} -{% endblock %} -{##############################################################################} -{% block get_dom_template %}{% endblock %} -{% block get_dom_template_for_named_properties_object %}{% endblock %} -{% block has_instance %}{% endblock %} -{% block to_impl %}{% endblock %} -{% block to_impl_with_type_check %}{% endblock %} -{##############################################################################} -{% block install_conditional_features %} -{% from 'attributes.cc.tmpl' import install_conditional_attributes, - install_conditional_interface_objects with context %} -{% from 'methods.cc.tmpl' import install_conditional_methods with context %} -{% if install_conditional_features_func %} -void {{v8_class_or_partial}}::InstallConditionalFeatures( - v8::Local<v8::Context> context, - const DOMWrapperWorld& world, - v8::Local<v8::Object> instance_object, - v8::Local<v8::Object> prototype_object, - v8::Local<v8::Function> interface_object, - v8::Local<v8::FunctionTemplate> interface_template) { - CHECK(!interface_template.IsEmpty()); - DCHECK((!prototype_object.IsEmpty() && !interface_object.IsEmpty()) || - !instance_object.IsEmpty()); - {% if is_partial %} - {{v8_class}}::InstallConditionalFeatures( - context, world, instance_object, prototype_object, interface_object, interface_template); - {% endif %} - - v8::Isolate* isolate = context->GetIsolate(); - - {% if unscopables %} - if (!prototype_object.IsEmpty()) { - v8::Local<v8::Name> unscopables_symbol(v8::Symbol::GetUnscopables(isolate)); - v8::Local<v8::Object> unscopables; - bool has_unscopables; - if (prototype_object->HasOwnProperty(context, unscopables_symbol) - .To(&has_unscopables) && has_unscopables) { - unscopables = prototype_object->Get(context, unscopables_symbol) - .ToLocalChecked().As<v8::Object>(); - } else { - // Web IDL 3.6.3. Interface prototype object - // https://heycam.github.io/webidl/#create-an-interface-prototype-object - // step 8.1. Let unscopableObject be the result of performing - // ! ObjectCreate(null). - unscopables = v8::Object::New(isolate); - unscopables->SetPrototype(context, v8::Null(isolate)).ToChecked(); - } - {% for name, runtime_enabled_feature_name in unscopables %} - {% filter runtime_enabled(runtime_enabled_feature_name) %} - unscopables->CreateDataProperty( - context, V8AtomicString(isolate, "{{name}}"), v8::True(isolate)) - .FromJust(); - {% endfilter %} - {% endfor %} - prototype_object->CreateDataProperty( - context, unscopables_symbol, unscopables).FromJust(); - } - {% endif %}{# unscopables #} - - {% if conditional_attributes or conditional_methods %} - v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interface_template); - {% endif %} - {% if conditional_attributes or conditional_methods or conditional_interface_objects %} - ExecutionContext* execution_context = ToExecutionContext(context); - DCHECK(execution_context); - {% if has_conditional_secure_attributes or has_conditional_secure_methods %} - bool is_secure_context = (execution_context && execution_context->IsSecureContext()); - {% endif %} - {% if has_conditional_coi_attributes or has_conditional_coi_methods %} - bool is_cross_origin_isolated = (execution_context && execution_context->CrossOriginIsolatedCapability()); - {% endif %} - {% if has_conditional_direct_socket_attributes or has_conditional_direct_socket_methods %} - bool is_direct_socket_enabled = (execution_context && execution_context->DirectSocketCapability()); - {% endif %} - - {% set attributes_on_instance = conditional_attributes | selectattr('on_instance') | list %} - {% set methods_on_instance = conditional_methods | selectattr('on_instance') | list %} - {% if attributes_on_instance or conditional_interface_objects or methods_on_instance %} - if (!instance_object.IsEmpty()) { - {{install_conditional_attributes(attributes_on_instance) | trim | indent(4)}} - {{install_conditional_interface_objects(conditional_interface_objects) | trim | indent(4)}} - {{install_conditional_methods(methods_on_instance) | trim | indent(4)}} - } - {% endif %} - - {% set attributes_on_prototype = conditional_attributes | selectattr('on_prototype') | list %} - {% set attributes_on_interface = conditional_attributes | selectattr('on_interface') | list %} - {% set methods_on_prototype = conditional_methods | selectattr('on_prototype') | list %} - {% set methods_on_interface = conditional_methods | selectattr('on_interface') | list %} - {% if attributes_on_prototype or attributes_on_interface or methods_on_prototype or methods_on_interface %} - if (!prototype_object.IsEmpty() || !interface_object.IsEmpty()) { - {{install_conditional_attributes(attributes_on_prototype + attributes_on_interface) | trim | indent(4)}} - {{install_conditional_methods(methods_on_prototype + methods_on_interface) | trim | indent(4)}} - } - {% endif %} - {% endif %}{# conditional_attributes or conditional_methods #} -} -{% endif %} - -{% endblock %}{# install_conditional_features #} -{##############################################################################} -{% block partial_interface %}{% endblock %} -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/methods.cc.tmpl b/third_party/blink/renderer/bindings/templates/methods.cc.tmpl deleted file mode 100644 index 02c4fd66..0000000 --- a/third_party/blink/renderer/bindings/templates/methods.cc.tmpl +++ /dev/null
@@ -1,654 +0,0 @@ -{% from 'utilities.cc.tmpl' import declare_enum_validation_variable, v8_value_to_local_cpp_value %} - -{##############################################################################} -{% macro runtime_timer_scope(counter) %} -RUNTIME_CALL_TIMER_SCOPE(info.GetIsolate(), RuntimeCallStats::CounterId::{{counter}}); -{% endmacro %} - -{% macro runtime_timer_scope_disabled_by_default(counter) %} -RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "{{counter}}"); -{% endmacro %} - -{% macro trace_event(name) %} -BLINK_BINDINGS_TRACE_EVENT("{{name}}"); -{% endmacro %} - -{% macro generate_method(method, world_suffix) %} -static void {{method.camel_case_name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) { - {% filter format_remove_duplicates([ - 'ExceptionState exception_state', - 'ScriptState* script_state = ']) %} - {% set define_exception_state -%} - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kExecutionContext, "{{interface_name}}", "{{method.name}}"); - {%- endset %} - - {% set function_call = func_call_with_prep_of_args(method, world_suffix) %} - - {% if 'exception_state' in function_call or - (method.returns_promise and not method.is_static) %} - {{define_exception_state}} - {% if method.returns_promise %} - ExceptionToRejectPromiseScope reject_promise_scope(info, exception_state); - {% endif %} - {% endif %} - {% if method.is_ce_reactions %} - CEReactionsScope ce_reactions_scope; - {% endif %} - - {% if not method.is_static %} - {% if method.returns_promise %} - // V8DOMConfiguration::kDoNotCheckHolder - // Make sure that info.Holder() really points to an instance of the type. - if (!{{v8_class}}::HasInstance(info.Holder(), info.GetIsolate())) { - {{throw_type_error(method, '"Illegal invocation"')}} - return; - } - {% endif %} - {% if interface_name == 'Window' and not method.is_cross_origin %} - // Same-origin methods are never exposed via the cross-origin interceptors. - // Since same-origin access requires a LocalDOMWindow, it is safe to downcast - // here. - LocalDOMWindow* impl = To<LocalDOMWindow>({{v8_class}}::ToImpl(info.Holder())); - {% else %} - {{cpp_class}}* impl = {{v8_class}}::ToImpl(info.Holder()); - {% endif %}{# interface_name == 'Window' and not method.is_cross_origin #} - {% endif %}{# not method.is_static #} - - {% if interface_name == "Window" and method.is_cross_origin %} - impl->ReportCoopAccess("{{method.name}}"); - {% endif %} - - {# Security checks #} - {% if method.is_check_security_for_return_value %} - {{define_exception_state}} - if (!BindingSecurity::ShouldAllowAccessTo( - CurrentDOMWindow(info.GetIsolate()), {{method.cpp_value}}, - BindingSecurity::ErrorReportOption::kDoNotReport)) { - UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), - WebFeature::kCrossOrigin{{interface_name}}{{method.camel_case_name}}); - V8SetReturnValueNull(info); - return; - } - {% endif %} - - {% if 'script_state' in function_call %} - {% if method.is_static %} - ScriptState* script_state = ScriptState::ForCurrentRealm(info); - {% else %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - {% endif %} - - {{function_call | trim | indent(2)}} -} -{% endfilter %} -{% endmacro %} - - -{######################################} -{% macro func_call_with_prep_of_args(method, world_suffix) %} -{{generate_arguments(method, world_suffix)}} -{% if world_suffix %} -{{cpp_method_call(method, method.v8_set_return_value_for_main_world, method.cpp_value)}} -{% else %} -{{cpp_method_call(method, method.v8_set_return_value, method.cpp_value)}} -{% endif %} -{% endmacro %} - - -{######################################} -{% macro generate_arguments(method, world_suffix) %} -{% if method.arguments %} - -{# Overloaded methods/constructors have length checked during overload resolution #} -{% if method.number_of_required_arguments and not method.overload_index %} -if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { - {{throw_type_error(method, - 'ExceptionMessages::NotEnoughArguments(%(expected)d, info.Length())' - | format(expected=method.number_of_required_arguments))}} - return; -} -{% endif %} - -{% for argument in method.arguments %} -{{argument.cpp_type}} {{argument.local_cpp_variable}}; -{% endfor %} -{% if method.has_optional_argument_without_default_value %} -{# Count the effective number of arguments. (arg1, arg2, undefined) is - interpreted as two arguments are passed and (arg1, undefined, arg3) is - interpreted as three arguments are passed. #} -int num_args_passed = info.Length(); -while (num_args_passed > 0) { - if (!info[num_args_passed - 1]->IsUndefined()) - break; - --num_args_passed; -} -{% endif %} -{% for argument in method.arguments %} -{% if argument.set_default_value %} -if (!info[{{argument.index}}]->IsUndefined()) { - {{generate_argument(method, argument, world_suffix) | trim | indent(2)}} -} else { - {{argument.set_default_value | trim | indent(2)}}; -} -{% else %} -{{generate_argument(method, argument, world_suffix)}} -{% endif %} -{% endfor %} - -{% endif %}{# method.arguments #} -{% endmacro %} - - -{######################################} -{% macro generate_argument(method, argument, world_suffix) %} -{% if argument.is_optional_without_default_value %} -{# Optional arguments without a default value generate an early call with - fewer arguments if they are omitted. - Optional Dictionary arguments default to empty dictionary. #} -if (UNLIKELY(num_args_passed <= {{argument.index}})) { - {% if world_suffix %} - {{cpp_method_call(method, argument.v8_set_return_value_for_main_world, argument.cpp_value) | trim | indent(2)}} - {% else %} - {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | trim | indent(2)}} - {% endif %} - return; -} -{% endif %} -{% if argument.is_callback_interface %} -if (info[{{argument.index}}]->IsObject()) { - {{argument.local_cpp_variable}} = V8{{argument.idl_type}}::Create(info[{{argument.index}}].As<v8::Object>()); -{% if argument.is_nullable %} -} else if (info[{{argument.index}}]->IsNullOrUndefined()) { - {{argument.local_cpp_variable}} = nullptr; -{% elif argument.is_optional %} -} else if (info[{{argument.index}}]->IsUndefined()) { - {{argument.local_cpp_variable}} = nullptr; -{% endif %} -} else { - {{throw_argument_error(method, argument, "The callback provided as parameter %(index)d is not an object.")}} - return; -} -{% elif argument.is_callback_function %} -if (info[{{argument.index}}]->IsFunction()) { - {{v8_value_to_local_cpp_value(argument)}} -{% if argument.is_nullable %} -} else if (info[{{argument.index}}]->IsNullOrUndefined()) { - {{argument.local_cpp_variable}} = nullptr; -{% elif argument.is_optional %} -} else if (info[{{argument.index}}]->IsUndefined()) { - {{argument.local_cpp_variable}} = nullptr; -{% endif %} -} else { - {{throw_argument_error(method, argument, "The callback provided as parameter %(index)d is not a function.")}} - return; -} -{% elif argument.is_variadic_wrapper_type %} -for (int i = {{argument.index}}; i < info.Length(); ++i) { - if (!V8{{argument.idl_type}}::HasInstance(info[i], info.GetIsolate())) { - {{throw_type_error(method, "ExceptionMessages::ArgumentNotOfType(%(index)d, \"%(type)s\")" | format(index=argument.index, type=argument.idl_type))}} - return; - } - {{argument.local_cpp_variable}}.push_back(V8{{argument.idl_type}}::ToImpl(v8::Local<v8::Object>::Cast(info[i]))); -} -{% elif argument.is_dictionary %} -{% if not argument.use_permissive_dictionary_conversion %} -{# Dictionaries must have type Undefined, Null or Object: - http://heycam.github.io/webidl/#es-dictionary #} -if (!info[{{argument.index}}]->IsNullOrUndefined() && !info[{{argument.index}}]->IsObject()) { - {{throw_argument_error(method, argument, "parameter %(index)d ('%(name)s') is not an object.")}} - return; -} -{% endif %}{# not argument.use_permissive_dictionary_conversion #} -{{v8_value_to_local_cpp_value(argument)}} -{% elif argument.is_explicit_nullable %} -if (!info[{{argument.index}}]->IsNullOrUndefined()) { - {{v8_value_to_local_cpp_value(argument) | trim | indent(2)}} -} -{% else %}{# argument is something else #} -{{v8_value_to_local_cpp_value(argument)}} -{% endif %}{# end of the dispatch by the argument type #} -{# Type checking, possibly throw a TypeError, per: - http://www.w3.org/TR/WebIDL/#es-type-mapping #} -{% if argument.has_type_checking_interface and not argument.is_variadic_wrapper_type %} -{# Type checking for wrapper interface types (if interface not implemented, - throw a TypeError), per http://www.w3.org/TR/WebIDL/#es-interface - Note: for variadic arguments, the type checking is done for each matched - argument instead; see argument.is_variadic_wrapper_type code-path above. #} -if (!{{argument.local_cpp_variable}}{% if argument.is_nullable %} && !IsUndefinedOrNull(info[{{argument.index}}]){% endif %}) { - {{throw_type_error(method, "ExceptionMessages::ArgumentNotOfType(%(index)d, \"%(type)s\")" | format(index=argument.index, type=argument.idl_type))}} - return; -} -{% elif argument.enum_values %} -{# Invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #} -{% set enum_variable = 'kValid' + argument.name[0].upper() + argument.name[1:] + 'Values' %} -{{declare_enum_validation_variable(argument.enum_values, enum_variable)}} -if (!IsValidEnum({{argument.local_cpp_variable}}, {{enum_variable}}, base::size({{enum_variable}}), "{{argument.enum_type}}", exception_state)) { - return; -} -{% elif argument.idl_type == 'Promise' %} -{# We require this for our implementation of promises, though not in spec: -http://heycam.github.io/webidl/#es-promise #} -if (!{{argument.local_cpp_variable}}.IsUndefinedOrNull() && !{{argument.local_cpp_variable}}.IsObject()) { - {{throw_argument_error(method, argument, "parameter %(index)d ('%(name)s') is not an object.")}} - return; -} -{% endif %} -{% endmacro %} - - -{######################################} -{% macro cpp_method_call(method, v8_set_return_value, cpp_value) %} -{# Local variables #} -{% if method.is_call_with_execution_context or method.high_entropy == 'Direct' %} -{# [ConstructorCallWith=ExecutionContext] or [CallWith=ExecutionContext] #} -{% if method.is_constructor %} -ExecutionContext* execution_context = ToExecutionContext( - info.NewTarget().As<v8::Object>()->CreationContext()); -{% elif method.is_static %} -ExecutionContext* execution_context = ExecutionContext::ForCurrentRealm(info); -{% else %} -ExecutionContext* execution_context = ExecutionContext::ForRelevantRealm(info); -{% endif %} -{% endif %} -{% if method.is_call_with_document %} -{# [ConstructorCallWith=Document] #} -Document& document = *ToLocalDOMWindow( - info.NewTarget().As<v8::Object>()->CreationContext())->document(); -{% endif %} -{# Call #} -{% if method.idl_type == 'void' %} -{{cpp_value}}; -{% elif method.use_output_parameter_for_result %} -{{method.cpp_type}} result; -{{cpp_value}}; -{% elif method.is_constructor %} -{{method.cpp_type}} impl = {{cpp_value}}; -{% elif method.use_local_result %} -{{method.cpp_type}} result = {{cpp_value}}; -{% if method.high_entropy == 'Direct' %} -Dactyloscoper::RecordDirectSurface(execution_context, WebFeature::k{{method.measure_as('Method')}}, result); -{% endif %} -{% endif %} -{# Post-call #} -{% if method.is_raises_exception %} -if (exception_state.HadException()) { - return; -} -{% endif %} -{# Set return value #} -{% if method.is_new_object and not method.do_not_test_new_object %} -{% if not method.returns_promise %} -{# We currently only add the DCHECK for IDL interfaces. Even though #} -{# [NewObject] also applies to promises, there is nothing for us to check at #} -{# the moment. #} -// [NewObject] must always create a new wrapper. Check that a wrapper -// does not exist yet. -DCHECK(!result || DOMDataStore::GetWrapper(result, info.GetIsolate()).IsEmpty()); -{% endif %}{# not method.returns_promise #} -{% endif %} -{% if method.is_constructor %} -{{generate_constructor_wrapper(method)}} -{%- elif v8_set_return_value %} -{% if method.is_explicit_nullable %} -if (!result) - V8SetReturnValueNull(info); -else - {{v8_set_return_value}}; -{% else %} -{{v8_set_return_value}}; -{% endif %} -{%- endif %}{# None for void #} -{% endmacro %} - - -{##############################################################################} -{% macro throw_type_error(method, error_message) %} -{% if method.has_exception_state or method.returns_promise %} -exception_state.ThrowTypeError({{error_message}}); -{%- elif method.is_constructor %} -V8ThrowException::ThrowTypeError(info.GetIsolate(), ExceptionMessages::FailedToConstruct("{{interface_name}}", {{error_message}})); -{%- else %} -V8ThrowException::ThrowTypeError(info.GetIsolate(), ExceptionMessages::FailedToExecute("{{method.name}}", "{{interface_name}}", {{error_message}})); -{%- endif %} -{%- endmacro %} - - -{##############################################################################} -{% macro throw_argument_error(method, argument, error_message) %} -{% set quoted_message = '"%s"' % (error_message | replace('\"', '\\\"')) %} -{{throw_type_error(method, quoted_message | format(index=(argument.index + 1), name=argument.name, type=argument.idl_type))}} -{%- endmacro %} - - -{##############################################################################} -{% macro runtime_determined_length_method(overloads) %} -static int {{overloads.camel_case_name}}MethodLength() { - {% for length, runtime_enabled_features in overloads.runtime_determined_lengths %} - {% for runtime_enabled_feature in runtime_enabled_features %} - {% filter runtime_enabled(runtime_enabled_feature) %} - return {{length}}; - {% endfilter %} - {% endfor %} - {% endfor %} -} -{% endmacro %} - - -{##############################################################################} -{% macro runtime_determined_maxarg_method(overloads) %} -static int {{overloads.camel_case_name}}MethodMaxArg() { - {% for length, runtime_enabled_features in overloads.runtime_determined_maxargs %} - {% for name in runtime_enabled_features %} - {% filter runtime_enabled(name) %} - return {{length}}; - {% endfilter %} - {% endfor %} - {% endfor %} -} -{% endmacro %} - - -{##############################################################################} -{% macro overload_resolution_method(overloads, world_suffix) %} -static void {{overloads.camel_case_name}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) { - scheduler::CooperativeSchedulingManager::Instance()->Safepoint(); - - {% set fall_through_to_partial_overloads = not is_partial and overloads.has_partial_overloads %} - - {% if overloads.measure_all_as %} - UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{overloads.measure_all_as}}); - {% endif %} - {% if overloads.deprecate_all_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{overloads.deprecate_all_as}}); - {% endif %} - - {# First resolve by length #} - {% if not fall_through_to_partial_overloads %} - bool is_arity_error = false; - {% endif %} - - {# This follows the overload resolution algorithm. #} - {# https://heycam.github.io/webidl/#dfn-overload-resolution-algorithm #} - {# 3. Initialize argcount to be min(maxarg, n). #} - switch (std::min({{overloads.maxarg}}, info.Length())) { - {# 4. Remove from S all entries whose type list is not of length argcount. #} - {% for length, tests_methods in overloads.length_tests_methods %} - {# 12. If i = d, then: #} - case {{length}}: - {# Then resolve by testing argument #} - {% for test, method in tests_methods %} - {% if method.visible %} - {% filter runtime_enabled(not overloads.runtime_enabled_all and method.runtime_enabled_feature_name) %} - {% if "exception_state" in test %} - { - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kExecutionContext, - "{{interface_name}}", "{{overloads.name}}"); - {{ test_and_call_overloaded_method(test, method, overloads, world_suffix) | trim | indent(8) }} - if (exception_state.HadException()) { - exception_state.RethrowV8Exception(exception_state.GetException()); - return; - } - } - {% else %}{# exception_state #} - {{ test_and_call_overloaded_method(test, method, overloads, world_suffix) | trim | indent(6) }} - {% endif %}{# exception_state #} - {% endfilter %} - {% endif %} - {% endfor %} - break; - {% endfor %}{# length, tests_methods #} - {% if not fall_through_to_partial_overloads %} - default: - {# 12.19. Otherwise: throw a TypeError. #} - is_arity_error = true; - {% endif %} - } - - {% if fall_through_to_partial_overloads %} - DCHECK({{overloads.name}}MethodForPartialInterface); - ({{overloads.name}}MethodForPartialInterface)(info); - {% else %}{# fall_through_to_partial_overloads #} - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kExecutionContext, "{{interface_name}}", "{{overloads.name}}"); - {% if overloads.returns_promise_all %} - ExceptionToRejectPromiseScope reject_promise_scope(info, exception_state); - {% endif %} - if (is_arity_error) { - {% if overloads.length != 0 %} - if (info.Length() < {{overloads.length}}) { - exception_state.ThrowTypeError(ExceptionMessages::NotEnoughArguments({{overloads.length}}, info.Length())); - return; - } - {% endif %} - {% if overloads.valid_arities %} - if (info.Length() >= {{overloads.length}}) { - exception_state.ThrowTypeError(ExceptionMessages::InvalidArity("{{overloads.valid_arities}}", info.Length())); - return; - } - {% endif %} - } - exception_state.ThrowTypeError("No function was found that matched the signature provided."); - {% endif %}{# fall_through_to_partial_overloads #} -} -{% endmacro %} - -{% macro test_and_call_overloaded_method(test, method, overloads, world_suffix) %} -if ({{test}}) { - {% if method.measure_as and not overloads.measure_all_as %} - ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate()); - UseCounter::Count(execution_context_for_measurement, WebFeature::k{{method.measure_as('Method')}}); - {% if method.high_entropy %} - Dactyloscoper::Record(execution_context_for_measurement, WebFeature::k{{method.measure_as('Method')}}); - {% endif %} - {% endif %} - {% if method.deprecate_as and not overloads.deprecate_all_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{method.deprecate_as}}); - {% endif %} - {{method.camel_case_name}}{{method.overload_index}}Method{{world_suffix}}(info); - return; -} -{% endmacro %} - - - -{##############################################################################} -{% macro method_callback(method, world_suffix) %} -void {{v8_class_or_partial}}::{{method.camel_case_name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) { - {{ trace_event(method.runtime_call_stats.trace_event_name) | trim | indent(2) }} - {% if method.runtime_call_stats.extended_attribute_defined %} - {{ runtime_timer_scope(method.runtime_call_stats.method_counter) | trim | indent(2) }} - {% else %} - {{ runtime_timer_scope_disabled_by_default(method.runtime_call_stats.method_counter) }} - {% endif %} - {% if not method.overloads %}{# Overloaded methods are measured in overload_resolution_method() #} - {% if method.measure_as %} - ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate()); - UseCounter::Count(execution_context_for_measurement, WebFeature::k{{method.measure_as('Method')}}); - {% if method.high_entropy %} - Dactyloscoper::Record(execution_context_for_measurement, WebFeature::k{{method.measure_as('Method')}}); - {% endif %} - {% endif %} - {% if method.deprecate_as %} - Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{method.deprecate_as}}); - {% endif %} - {% endif %}{# not method.overloads #} - {% if world_suffix in method.activity_logging_world_list %} - {% if method.is_static %} - ScriptState* script_state = ScriptState::ForCurrentRealm(info); - {% else %} - ScriptState* script_state = ScriptState::ForRelevantRealm(info); - {% endif %} - V8PerContextData* context_data = script_state->PerContextData(); - if (context_data && context_data->ActivityLogger()) { - context_data->ActivityLogger()->LogMethod("{{interface_name}}.{{method.name}}", info); - } - {% endif %} - {% if method.is_custom %} - {{v8_class}}::{{method.camel_case_name}}MethodCustom(info); - {% else %} - {{internal_namespace}}::{{method.camel_case_name}}Method{{world_suffix}}(info); - {% endif %} -} -{% endmacro %} - - -{##############################################################################} -{% macro origin_safe_method_getter(method, world_suffix) %} -static void {{method.camel_case_name}}OriginSafeMethodGetter{{world_suffix}}(const v8::PropertyCallbackInfo<v8::Value>& info) { - v8::Isolate* isolate = info.GetIsolate(); - V8PerIsolateData* data = V8PerIsolateData::From(isolate); - const DOMWrapperWorld& world = - DOMWrapperWorld::World(isolate->GetCurrentContext()); - v8::Local<v8::FunctionTemplate> interface_template = - data->FindInterfaceTemplate(world, {{v8_class}}::GetWrapperTypeInfo()); - v8::Local<v8::Signature> signature = - v8::Signature::New(isolate, interface_template); - - static int dom_template_key; // This address is used for a key to look up the dom template. - v8::Local<v8::FunctionTemplate> method_template = - data->FindOrCreateOperationTemplate( - world, - &dom_template_key, - {{v8_class_or_partial}}::{{method.camel_case_name}}MethodCallback{{world_suffix}}, - v8::Local<v8::Value>(), - signature, - {{method.length}}); - - V8SetReturnValue( - info, - method_template->GetFunction( - isolate->GetCurrentContext()).ToLocalChecked()); -} -{% endmacro %} - -{% macro origin_safe_method_getter_callback(method, world_suffix) %} -void {{v8_class_or_partial}}::{{method.camel_case_name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(method.runtime_call_stats.origin_safe_method_getter_counter) }} - {{internal_namespace}}::{{method.camel_case_name}}OriginSafeMethodGetter{{world_suffix}}(info); -} -{% endmacro %} - - -{##############################################################################} -{% macro generate_constructor(constructor) %} -{% set name = '%sConstructorCallback' % v8_class - if constructor.is_named_constructor else - 'Constructor%s' % (constructor.overload_index or '') %} -static void {{name}}(const v8::FunctionCallbackInfo<v8::Value>& info) { - {{ runtime_timer_scope_disabled_by_default(constructor.rcs_counter) }} - {% set function_call = func_call_with_prep_of_args(constructor) %} - - {% if constructor.is_named_constructor %} - if (!info.IsConstructCall()) { - V8ThrowException::ThrowTypeError(info.GetIsolate(), ExceptionMessages::ConstructorNotCallableAsFunction("{{constructor.name}}")); - return; - } - - if (ConstructorMode::Current(info.GetIsolate()) == ConstructorMode::kWrapExistingObject) { - V8SetReturnValue(info, info.Holder()); - return; - } - {% endif %} - - {% if 'exception_state' in function_call %} - ExceptionState exception_state(info.GetIsolate(), ExceptionState::kConstructionContext, "{{interface_name}}"); - {% endif %} - {% if 'script_state' in function_call %} - ScriptState* script_state = ScriptState::From( - info.NewTarget().As<v8::Object>()->CreationContext()); - {% endif %} - - {{function_call | trim | indent(2)}} -} -{% endmacro %} - - -{##############################################################################} -{% macro generate_constructor_wrapper(constructor) %} -{% set constructor_class = v8_class + ('Constructor' - if constructor.is_named_constructor else - '') %} -v8::Local<v8::Object> wrapper = info.Holder(); -wrapper = impl->AssociateWithWrapper(info.GetIsolate(), {{constructor_class}}::GetWrapperTypeInfo(), wrapper); -V8SetReturnValue(info, wrapper); -{% endmacro %} - - -{##############################################################################} -{% macro method_configuration(method) %} -{% from 'utilities.cc.tmpl' import property_location %} -{% set method_callback = - '%s::%sMethodCallback' % (v8_class_or_partial, method.camel_case_name) %} -{% set method_callback_for_main_world = - '%s::%sMethodCallbackForMainWorld' % (v8_class_or_partial, method.camel_case_name) - if method.is_per_world_bindings else 'nullptr' %} -{% set property_attribute = - 'static_cast<v8::PropertyAttribute>(%s)' % ' | '.join(method.property_attributes) - if method.property_attributes else 'v8::None' %} -{% set holder_check = 'V8DOMConfiguration::kDoNotCheckHolder' - if method.returns_promise else 'V8DOMConfiguration::kCheckHolder' %} -{% set access_check = 'V8DOMConfiguration::kCheckAccess' - if method.is_check_security_for_receiver else 'V8DOMConfiguration::kDoNotCheckAccess' %} -{% if method.is_per_world_bindings %} -{% set method_callback_for_main_world = - '%s::%sMethodCallbackForMainWorld' % (v8_class_or_partial, method.camel_case_name) %} -{"{{method.name}}", {{method_callback_for_main_world}}, {{method.length}}, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, {{access_check}}, {{method.side_effect_type}}, V8DOMConfiguration::kMainWorld}, -{"{{method.name}}", {{method_callback}}, {{method.length}}, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, {{access_check}}, {{method.side_effect_type}}, V8DOMConfiguration::kNonMainWorlds} -{%- else %} -{"{{method.name}}", {{method_callback}}, {{method.length}}, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, {{access_check}}, {{method.side_effect_type}}, V8DOMConfiguration::kAllWorlds} -{%- endif %} -{%- endmacro %} - - -{######################################} -{% macro install_custom_signature(method, instance_template, prototype_template, interface_template, signature) %} -{ - // Install {{method.name}} configuration - constexpr V8DOMConfiguration::MethodConfiguration kConfigurations[] = { - {{method_configuration(method) | trim | indent(4)}} - }; - for (const auto& config : kConfigurations) { - V8DOMConfiguration::InstallMethod( - isolate, world, {{instance_template}}, {{prototype_template}}, - {{interface_template}}, {{signature}}, config); - } -} -{%- endmacro %} - - -{######################################} -{% macro install_conditional_methods(methods_to_install) %} -{% for method in methods_to_install %} -{% filter cross_origin_isolated(method.overloads.cross_origin_isolated_test_all - if method.overloads else - method.cross_origin_isolated_test) %} -{% filter direct_socket_enabled(method.overloads.direct_socket_enabled_test_all - if method.overloads else - method.direct_socket_enabled_test) %} -{% filter secure_context(method.overloads.secure_context_test_all - if method.overloads else - method.secure_context_test) %} -{% filter exposed(method.overloads.exposed_test_all - if method.overloads else - method.exposed_test) %} -{% filter runtime_enabled(method.overloads.runtime_enabled_all - if method.overloads else - method.runtime_enabled_feature_name) %} -{ - // Install {{method.name}} configuration - const V8DOMConfiguration::MethodConfiguration kConfigurations[] = { - {{method_configuration(method) | trim | indent(4)}} - }; - for (const auto& config : kConfigurations) { - V8DOMConfiguration::InstallMethod( - isolate, world, instance_object, prototype_object, - interface_object, signature, config); - } -} -{% endfilter %}{# runtime_enabled() #} -{% endfilter %}{# exposed() #} -{% endfilter %}{# secure_context() #} -{% endfilter %}{# direct_socket_enabled() #} -{% endfilter %}{# cross_origin_isolated() #} -{% endfor %} -{%- endmacro %}
diff --git a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_core.cc.tmpl b/third_party/blink/renderer/bindings/templates/origin_trial_features_for_core.cc.tmpl deleted file mode 100644 index 57f28d7..0000000 --- a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_core.cc.tmpl +++ /dev/null
@@ -1,118 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} - -#include "third_party/blink/renderer/bindings/core/v8/origin_trial_features_for_core.h" - -{% for include in includes %} -#include "{{include}}" -{% endfor %} - -namespace blink { - -namespace { -InstallOriginTrialFeaturesFunction g_old_install_origin_trial_features_function = - nullptr; -InstallPendingOriginTrialFeatureFunction - g_old_install_pending_origin_trial_feature_function = nullptr; - -void InstallOriginTrialFeaturesForCore( - const WrapperTypeInfo* wrapper_type_info, - const ScriptState* script_state, - v8::Local<v8::Object> prototype_object, - v8::Local<v8::Function> interface_object) { - (*g_old_install_origin_trial_features_function)( - wrapper_type_info, script_state, prototype_object, interface_object); - - ExecutionContext* execution_context = ExecutionContext::From(script_state); - if (!execution_context) - return; - v8::Isolate* isolate = script_state->GetIsolate(); - const DOMWrapperWorld& world = script_state->World(); - // TODO(iclelland): Unify ContextFeatureSettings with the rest of the - // conditional features. - if (wrapper_type_info == V8Window::GetWrapperTypeInfo()) { - auto* settings = ContextFeatureSettings::From( - execution_context, - ContextFeatureSettings::CreationMode::kDontCreateIfNotExists); - if (settings && settings->isMojoJSEnabled()) { - v8::Local<v8::Object> instance_object = - script_state->GetContext()->Global(); - V8Window::InstallMojoJS(isolate, world, instance_object, prototype_object, - interface_object); - } - } - // TODO(iclelland): Extract this common code out of OriginTrialFeaturesForCore - // and OriginTrialFeaturesForModules into a block. - {% for interface in installers_by_interface %} - if (wrapper_type_info == {{interface.v8_class}}::GetWrapperTypeInfo()) { - {% if interface.is_global %} - v8::Local<v8::Object> instance_object = - script_state->GetContext()->Global(); - {% endif %} - {% for installer in interface.installers %} - if ({{installer.condition}}(execution_context)) { - {{installer.v8_class_or_partial}}::{{installer.install_method}}( - isolate, world, {% if interface.is_global %}instance_object{% else %}v8::Local<v8::Object>(){% endif %}, prototype_object, interface_object); - } - {% endfor %} - } - {% endfor %} -} - -void InstallPendingOriginTrialFeatureForCore(OriginTrialFeature feature, - const ScriptState* script_state) { - (*g_old_install_pending_origin_trial_feature_function)(feature, script_state); - - // TODO(iclelland): Extract this common code out of OriginTrialFeaturesForCore - // and OriginTrialFeaturesForModules into a block. - {% if installers_by_feature %} - v8::Local<v8::Object> prototype_object; - v8::Local<v8::Function> interface_object; - v8::Isolate* isolate = script_state->GetIsolate(); - const DOMWrapperWorld& world = script_state->World(); - V8PerContextData* context_data = script_state->PerContextData(); - v8::Local<v8::Context> current_context = script_state->GetContext(); - v8::Local<v8::Object> global_object = current_context->Global(); - ALLOW_UNUSED_LOCAL(global_object); - ExecutionContext* execution_context = ToExecutionContext(current_context); - ALLOW_UNUSED_LOCAL(execution_context); - switch (feature) { - {% for feature in installers_by_feature %} - case {{feature.name_constant}}: { - {% for installer in feature.installers %} - {% if installer.interface_is_global %} - if (execution_context && execution_context->{{installer.global_type_check_method}}()) { - {{installer.v8_class_or_partial}}::{{installer.install_method}}( - isolate, world, global_object, v8::Local<v8::Object>(), v8::Local<v8::Function>()); - } - {% else %} - if (context_data->GetExistingConstructorAndPrototypeForType( - {{installer.v8_class}}::GetWrapperTypeInfo(), &prototype_object, &interface_object)) { - {{installer.v8_class_or_partial}}::{{installer.install_method}}( - isolate, world, v8::Local<v8::Object>(), prototype_object, interface_object); - } - {% endif %} - {% endfor %} - break; - } - {% endfor %} - default: - break; - } - {% endif %} -} - -} // namespace - -void RegisterInstallOriginTrialFeaturesForCore() { - g_old_install_origin_trial_features_function = - SetInstallOriginTrialFeaturesFunction(&InstallOriginTrialFeaturesForCore); - g_old_install_pending_origin_trial_feature_function = - SetInstallPendingOriginTrialFeatureFunction( - &InstallPendingOriginTrialFeatureForCore); -} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_core.h.tmpl b/third_party/blink/renderer/bindings/templates/origin_trial_features_for_core.h.tmpl deleted file mode 100644 index a4963503..0000000 --- a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_core.h.tmpl +++ /dev/null
@@ -1,17 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef THIRD_PARTY_BLINK_BINDINGS_CORE_V8_ORIGIN_TRIAL_FEATURES_FOR_CORE_H_ -#define THIRD_PARTY_BLINK_BINDINGS_CORE_V8_ORIGIN_TRIAL_FEATURES_FOR_CORE_H_ - -#include "third_party/blink/renderer/core/core_export.h" - -namespace blink { - -CORE_EXPORT void RegisterInstallOriginTrialFeaturesForCore(); - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_BINDINGS_CORE_V8_ORIGIN_TRIAL_FEATURES_FOR_CORE_H_ - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_modules.cc.tmpl b/third_party/blink/renderer/bindings/templates/origin_trial_features_for_modules.cc.tmpl deleted file mode 100644 index e61bd06..0000000 --- a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_modules.cc.tmpl +++ /dev/null
@@ -1,112 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} - -#include "third_party/blink/renderer/bindings/modules/v8/origin_trial_features_for_modules.h" - -#include "third_party/blink/renderer/bindings/core/v8/origin_trial_features_for_core.h" -{% for include in includes %} -#include "{{include}}" -{% endfor %} - -namespace blink { - -namespace { -InstallOriginTrialFeaturesFunction - g_original_install_origin_trial_features_function = nullptr; -InstallPendingOriginTrialFeatureFunction - g_original_install_pending_origin_trial_feature_function = nullptr; - -void InstallOriginTrialFeaturesForModules( - const WrapperTypeInfo* wrapper_type_info, - const ScriptState* script_state, - v8::Local<v8::Object> prototype_object, - v8::Local<v8::Function> interface_object) { - (*g_original_install_origin_trial_features_function)( - wrapper_type_info, script_state, prototype_object, interface_object); - - {% if installers_by_interface %} - ExecutionContext* execution_context = ExecutionContext::From(script_state); - if (!execution_context) - return; - v8::Isolate* isolate = script_state->GetIsolate(); - const DOMWrapperWorld& world = script_state->World(); - // TODO(iclelland): Extract this common code out of OriginTrialFeaturesForCore - // and OriginTrialFeaturesForModules into a block. - {% for interface in installers_by_interface %} - if (wrapper_type_info == {{interface.v8_class}}::GetWrapperTypeInfo()) { - {% if interface.is_global %} - v8::Local<v8::Object> instance_object = - script_state->GetContext()->Global(); - {% endif %} - {% for installer in interface.installers %} - if ({{installer.condition}}(execution_context)) { - {{installer.v8_class_or_partial}}::{{installer.install_method}}( - isolate, world, {% if interface.is_global %}instance_object{% else %}v8::Local<v8::Object>(){% endif %}, prototype_object, interface_object); - } - {% endfor %} - } - {% endfor %} - {% endif %} -} - -void InstallPendingOriginTrialFeatureForModules( - OriginTrialFeature feature, - const ScriptState* script_state) { - (*g_original_install_pending_origin_trial_feature_function)(feature, - script_state); - - // TODO(iclelland): Extract this common code out of OriginTrialFeaturesForCore - // and OriginTrialFeaturesForModules into a block. - {% if installers_by_feature %} - v8::Local<v8::Object> prototype_object; - v8::Local<v8::Function> interface_object; - v8::Isolate* isolate = script_state->GetIsolate(); - const DOMWrapperWorld& world = script_state->World(); - V8PerContextData* context_data = script_state->PerContextData(); - v8::Local<v8::Context> current_context = script_state->GetContext(); - v8::Local<v8::Object> global_object = current_context->Global(); - ALLOW_UNUSED_LOCAL(global_object); - ExecutionContext* execution_context = ToExecutionContext(current_context); - ALLOW_UNUSED_LOCAL(execution_context); - switch (feature) { - {% for feature in installers_by_feature %} - case {{feature.name_constant}}: { - {% for installer in feature.installers %} - {% if installer.interface_is_global %} - if (execution_context && execution_context->{{installer.global_type_check_method}}()) { - {{installer.v8_class_or_partial}}::{{installer.install_method}}( - isolate, world, global_object, v8::Local<v8::Object>(), v8::Local<v8::Function>()); - } - {% else %} - if (context_data->GetExistingConstructorAndPrototypeForType( - {{installer.v8_class}}::GetWrapperTypeInfo(), &prototype_object, &interface_object)) { - {{installer.v8_class_or_partial}}::{{installer.install_method}}( - isolate, world, v8::Local<v8::Object>(), prototype_object, interface_object); - } - {% endif %} - {% endfor %} - break; - } - {% endfor %} - default: - break; - } - {% endif %} -} - -} // namespace - -void RegisterInstallOriginTrialFeaturesForModules() { - RegisterInstallOriginTrialFeaturesForCore(); - g_original_install_origin_trial_features_function = - SetInstallOriginTrialFeaturesFunction( - &InstallOriginTrialFeaturesForModules); - g_original_install_pending_origin_trial_feature_function = - SetInstallPendingOriginTrialFeatureFunction( - &InstallPendingOriginTrialFeatureForModules); -} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_modules.h.tmpl b/third_party/blink/renderer/bindings/templates/origin_trial_features_for_modules.h.tmpl deleted file mode 100644 index bac0cf1..0000000 --- a/third_party/blink/renderer/bindings/templates/origin_trial_features_for_modules.h.tmpl +++ /dev/null
@@ -1,15 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef THIRD_PARTY_BLINK_BINDINGS_MODULES_V8_ORIGIN_TRIAL_FEATURES_FOR_MODULES_H_ -#define THIRD_PARTY_BLINK_BINDINGS_MODULES_V8_ORIGIN_TRIAL_FEATURES_FOR_MODULES_H_ - -namespace blink { - -void RegisterInstallOriginTrialFeaturesForModules(); - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_BINDINGS_MODULES_V8_ORIGIN_TRIAL_FEATURES_FOR_MODULES_H_ - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/partial_interface.cc.tmpl b/third_party/blink/renderer/bindings/templates/partial_interface.cc.tmpl deleted file mode 100644 index 3ca4e95..0000000 --- a/third_party/blink/renderer/bindings/templates/partial_interface.cc.tmpl +++ /dev/null
@@ -1,23 +0,0 @@ -{% extends 'interface_base.cc.tmpl' %} - -{##############################################################################} -{% block partial_interface %} -void {{v8_class_or_partial}}::Initialize() { - // Should be invoked from ModulesInitializer. - {{v8_class}}::UpdateWrapperTypeInfo( - &{{v8_class_or_partial}}::Install{{v8_class}}Template, - {% if needs_runtime_enabled_installer %} - &{{v8_class_or_partial}}::InstallRuntimeEnabledFeaturesImpl, - {% else %} - nullptr, - {% endif %} - &{{v8_class_or_partial}}::InstallRuntimeEnabledFeaturesOnTemplate, - {{install_conditional_features_func or 'nullptr'}}); - {% for method in methods %} - {% if method.overloads and method.overloads.has_partial_overloads %} - {{v8_class}}::Register{{method.camel_case_name}}MethodForPartialInterface(&{{internal_namespace}}::{{method.camel_case_name}}Method); - {% endif %} - {% endfor %} -} - -{% endblock %}
diff --git a/third_party/blink/renderer/bindings/templates/partial_interface.h.tmpl b/third_party/blink/renderer/bindings/templates/partial_interface.h.tmpl deleted file mode 100644 index 41b235f..0000000 --- a/third_party/blink/renderer/bindings/templates/partial_interface.h.tmpl +++ /dev/null
@@ -1,121 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% if optional_features %} -class ScriptState; -{% endif %} - -class {{v8_class_or_partial}} { - STATIC_ONLY({{v8_class_or_partial}}); - public: - static void Initialize(); - {% for method in methods if method.is_custom %} - static void {{method.camel_case_name}}MethodCustom(const v8::FunctionCallbackInfo<v8::Value>&); - {% endfor %} - {% for attribute in attributes %} - {% if attribute.has_custom_getter %}{# FIXME: and not attribute.implemented_by #} - static void {{attribute.camel_case_name}}AttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>&); - {% endif %} - {% if attribute.has_custom_setter %}{# FIXME: and not attribute.implemented_by #} - static void {{attribute.camel_case_name}}AttributeSetterCustom(v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>&); - {% endif %} - {% endfor %} - {% if install_conditional_features_func %} - static void InstallConditionalFeatures( - v8::Local<v8::Context>, - const DOMWrapperWorld&, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface, - v8::Local<v8::FunctionTemplate> interface_template); - {% endif %} - - {% for feature in optional_features %} - static void Install{{feature.name}}(ScriptState*, v8::Local<v8::Object> instance); - static void Install{{feature.name}}(v8::Isolate*, const DOMWrapperWorld&, v8::Local<v8::Object> instance, v8::Local<v8::Object> prototype, v8::Local<v8::Function> interface); - {% if not feature.needs_instance %} - static void Install{{feature.name}}(ScriptState*); - {% endif %} - {% endfor %} - - static void InstallRuntimeEnabledFeaturesOnTemplate( - v8::Isolate*, - const DOMWrapperWorld&, - v8::Local<v8::FunctionTemplate> interface_template); - - // Callback functions - {% for attribute in attributes %} - {% if attribute.is_cached_accessor %} - {{exported}}static v8::Local<v8::Private> {{attribute.camel_case_name}}CachedPropertyKey(v8::Isolate* isolate); - {% endif %} - {% for world_suffix in attribute.world_suffixes %} - {% if not attribute.constructor_type %} - {{exported}}static void {{attribute.camel_case_name}}AttributeGetterCallback{{world_suffix}}( - {%- if attribute.is_data_type_property %} - v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info - {%- else %} - const v8::FunctionCallbackInfo<v8::Value>& info - {%- endif %}); - {% else %} - {{exported}}static void {{attribute.camel_case_name}}ConstructorGetterCallback{{world_suffix}}(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info); - {% endif %} - {% if attribute.has_setter %} - {{exported}}static void {{attribute.camel_case_name}}AttributeSetterCallback{{world_suffix}}( - {%- if attribute.is_data_type_property %} - v8::Local<v8::Name>, v8::Local<v8::Value> v8_value, const v8::PropertyCallbackInfo<void>& info - {%- else %} - const v8::FunctionCallbackInfo<v8::Value>& info - {%- endif %}); - {% endif %} - {% endfor %} - {% endfor %} - - {% for method in methods %} - {% for world_suffix in method.world_suffixes %} - {% if not method.overload_index or method.overloads %} - {# Document about the following condition: #} - {# https://docs.google.com/document/d/1qBC7Therp437Jbt_QYAtNYMZs6zQ_7_tnMkNUG_ACqs/edit?usp=sharing #} - {% if (method.overloads and method.overloads.visible and - (not method.overloads.has_partial_overloads or not is_partial)) or - (not method.overloads and method.visible) %} - {# A single callback is generated for overloaded methods #} - {# with considering partial overloads #} - {{exported}}static void {{method.camel_case_name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info); - {% endif %} - {% endif %} - {% if method.is_cross_origin and method.visible %} - {{exported}}static void {{method.camel_case_name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info); - {% endif %} - {% endfor %} - {% endfor %} - {% if iterator_method %} - {{exported}}static void {{iterator_method.camel_case_name}}MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info); - {% endif %} - - private: - {% if needs_runtime_enabled_installer %} - static void InstallRuntimeEnabledFeaturesImpl( - v8::Isolate*, - const DOMWrapperWorld&, - v8::Local<v8::Object> instance, - v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface); - - {% endif %} - static void Install{{v8_class}}Template(v8::Isolate*, const DOMWrapperWorld&, v8::Local<v8::FunctionTemplate> interface_template); -}; - -} // namespace blink - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/templates.gni b/third_party/blink/renderer/bindings/templates/templates.gni deleted file mode 100644 index b30d2112..0000000 --- a/third_party/blink/renderer/bindings/templates/templates.gni +++ /dev/null
@@ -1,32 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Paths should be absolute so this file can be imported from anywhere. -code_generator_template_files = - get_path_info([ - "attributes.cc.tmpl", - "callback_function.cc.tmpl", - "callback_function.h.tmpl", - "callback_interface.cc.tmpl", - "callback_interface.h.tmpl", - "callback_invoke.cc.tmpl", - "constants.cc.tmpl", - "copyright_block.txt", - "dictionary_impl.cc.tmpl", - "dictionary_impl.h.tmpl", - "dictionary_impl_common.cc.tmpl", - "dictionary_v8.cc.tmpl", - "dictionary_v8.h.tmpl", - "external_reference_table.cc.tmpl", - "interface.cc.tmpl", - "interface.h.tmpl", - "interface_base.cc.tmpl", - "methods.cc.tmpl", - "partial_interface.cc.tmpl", - "partial_interface.h.tmpl", - "union_container.cc.tmpl", - "union_container.h.tmpl", - "utilities.cc.tmpl", - ], - "abspath")
diff --git a/third_party/blink/renderer/bindings/templates/union_container.cc.tmpl b/third_party/blink/renderer/bindings/templates/union_container.cc.tmpl deleted file mode 100644 index 90e1e25f..0000000 --- a/third_party/blink/renderer/bindings/templates/union_container.cc.tmpl +++ /dev/null
@@ -1,238 +0,0 @@ -{% from 'utilities.cc.tmpl' import declare_enum_validation_variable %} -{% from 'utilities.cc.tmpl' import v8_value_to_local_cpp_value %} -{#############################################################################} -{% macro assign_and_return_if_hasinstance(member) %} -{% if member.is_array_buffer_or_view_type %} -if (v8_value->Is{{member.type_name}}()) { -{% else %} -if (V8{{member.type_name}}::HasInstance(v8_value, isolate)) { -{% endif %} -{% if member.is_array_buffer_view_or_typed_array %} - {{member.cpp_local_type}} cpp_value = ToNotShared<{{member.cpp_local_type}}>(isolate, v8_value, exception_state); - if (exception_state.HadException()) - return; -{% else %} - {{member.cpp_local_type}} cpp_value = V8{{member.type_name}}::ToImpl(v8::Local<v8::Object>::Cast(v8_value)); -{% endif %} - impl.Set{{member.type_name}}(cpp_value); - return; -} -{% endmacro %} -{#############################################################################} -{% filter format_blink_cpp_source_code %} -{% include 'copyright_block.txt' %} -#include "{{this_include_header_path}}" - -{% for filename in cpp_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{{cpp_class}}::{{cpp_class}}() : type_(SpecificType::kNone) {} - -{% for member in members %} -{{member.rvalue_cpp_type}} {{cpp_class}}::GetAs{{member.type_name}}() const { - DCHECK(Is{{member.type_name}}()); - return {{member.cpp_name}}_; -} - -void {{cpp_class}}::Set{{member.type_name}}({{member.rvalue_cpp_type}} value) { - DCHECK(IsNull()); - {% if member.enum_values %} - NonThrowableExceptionState exception_state; - {{declare_enum_validation_variable(member.enum_values) | trim | indent(2)}} - if (!IsValidEnum(value, kValidValues, base::size(kValidValues), "{{member.enum_type}}", exception_state)) { - NOTREACHED(); - return; - } - {% endif %} - {{member.cpp_name}}_ = value; - type_ = SpecificType::{{member.specific_type_enum}}; -} - -{{cpp_class}} {{cpp_class}}::From{{member.type_name}}({{member.rvalue_cpp_type}} value) { - {{cpp_class}} container; - container.Set{{member.type_name}}(value); - return container; -} - -{% endfor %} -{{cpp_class}}::{{cpp_class}}(const {{cpp_class}}&) = default; -{{cpp_class}}::~{{cpp_class}}() = default; -{{cpp_class}}& {{cpp_class}}::operator=(const {{cpp_class}}&) = default; - -void {{cpp_class}}::Trace(Visitor* visitor) const { - {% for member in members if member.is_traceable %} - visitor->Trace({{member.cpp_name}}_); - {% endfor %} -} - -void {{v8_class}}::ToImpl( - v8::Isolate* isolate, - v8::Local<v8::Value> v8_value, - {{cpp_class}}& impl, - UnionTypeConversionMode conversion_mode, - ExceptionState& exception_state) { - if (v8_value.IsEmpty()) - return; - - {# The numbers in the following comments refer to the steps described in - http://heycam.github.io/webidl/#es-union #} - {# 1. null or undefined #} - if (conversion_mode == UnionTypeConversionMode::kNullable && IsUndefinedOrNull(v8_value)) - return; - - {% if dictionary_type %} - {# 3. Dictionaries for null or undefined #} - if (IsUndefinedOrNull(v8_value)) { - {{v8_value_to_local_cpp_value(dictionary_type) | trim | indent}} - impl.Set{{dictionary_type.type_name}}(cpp_value); - return; - } - - {% endif %} - {# 4. Platform objects (interfaces) #} - {% for interface in interface_types %} - {{assign_and_return_if_hasinstance(interface) | trim | indent(2)}} - - {% endfor %} - {# 8. ArrayBuffer #} - {% if array_buffer_type %} - {{assign_and_return_if_hasinstance(array_buffer_type) | trim | indent(2)}} - - {% endif %} - {# 9., 10. ArrayBufferView #} - {# FIXME: Individual typed arrays (e.g. Uint8Array) aren\'t supported yet. #} - {% if array_buffer_view_type %} - {{assign_and_return_if_hasinstance(array_buffer_view_type) | trim | indent(2)}} - - {% endif %} - {% if array_or_sequence_type %} - {# 11.1, 11.2. Sequences and frozen arrays #} - if (v8_value->IsObject()) { - ScriptIterator script_iterator = ScriptIterator::FromIterable( - isolate, v8_value.As<v8::Object>(), exception_state); - if (exception_state.HadException()) - return; - if (!script_iterator.IsNull()) { - {{v8_value_to_local_cpp_value(array_or_sequence_type) | trim | indent(6)}} - {% if array_or_sequence_type.enum_values %} - {{declare_enum_validation_variable(array_or_sequence_type.enum_values) | trim | indent(6)}} - if (!IsValidEnum(cpp_value, kValidValues, base::size(kValidValues), - "{{array_or_sequence_type.enum_type}}", exception_state)) - return; - {% endif %} - impl.Set{{array_or_sequence_type.type_name}}(cpp_value); - return; - } - } - - {% endif %} - {% if dictionary_type %} - {# 11.3. Dictionaries #} - if (v8_value->IsObject()) { - {{v8_value_to_local_cpp_value(dictionary_type) | trim | indent}} - impl.Set{{dictionary_type.type_name}}(cpp_value); - return; - } - - {% endif %} - {# 11.4. Records #} - {% if record_type %} - if (v8_value->IsObject()) { - {{v8_value_to_local_cpp_value(record_type) | trim | indent}} - impl.Set{{record_type.type_name}}(cpp_value); - return; - } - - {% endif %} - {# TODO(bashi): Support 11.5 Callback interface when we need it #} - {# 11.6. Objects #} - {% if object_type %} - if (IsUndefinedOrNull(v8_value) || v8_value->IsObject()) { - {{v8_value_to_local_cpp_value(object_type) | trim | indent}} - impl.Set{{object_type.type_name}}(cpp_value); - return; - } - - {% endif %} - {# FIXME: In some cases, we can omit boolean and numeric type checks because - we have fallback conversions. (step 16 and 17) #} - {% if boolean_type %} - {# 12. Boolean #} - if (v8_value->IsBoolean()) { - impl.SetBoolean(v8_value.As<v8::Boolean>()->Value()); - return; - } - - {% endif %} - {% if numeric_type %} - {# 13. Number #} - if (v8_value->IsNumber()) { - {{v8_value_to_local_cpp_value(numeric_type) | trim | indent}} - impl.Set{{numeric_type.type_name}}(cpp_value); - return; - } - - {% endif %} - {% if string_type %} - {# 14. String #} - { - {{v8_value_to_local_cpp_value(string_type) | trim | indent}} - {% if string_type.enum_values %} - {{declare_enum_validation_variable(string_type.enum_values) | trim | indent}} - if (!IsValidEnum(cpp_value, kValidValues, base::size(kValidValues), "{{string_type.enum_type}}", exception_state)) - return; - {% endif %} - impl.Set{{string_type.type_name}}(cpp_value); - return; - } - - {# 15. Number (fallback) #} - {% elif numeric_type %} - { - {{v8_value_to_local_cpp_value(numeric_type) | trim | indent}} - impl.Set{{numeric_type.type_name}}(cpp_value); - return; - } - - {# 16. Boolean (fallback) #} - {% elif boolean_type %} - { - impl.SetBoolean(v8_value->BooleanValue(isolate)); - return; - } - - {% else %} - {# 17. TypeError #} - exception_state.ThrowTypeError("The provided value is not of type '{{type_string}}'"); - {% endif %} -} - -v8::Local<v8::Value> ToV8(const {{cpp_class}}& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate) { - switch (impl.type_) { - case {{cpp_class}}::SpecificType::kNone: - {# FIXME: We might want to return undefined in some cases #} - return v8::Null(isolate); - {% for member in members %} - case {{cpp_class}}::SpecificType::{{member.specific_type_enum}}: - return {{member.cpp_value_to_v8_value}}; - {% endfor %} - default: - NOTREACHED(); - } - return v8::Local<v8::Value>(); -} - -{{cpp_class}} NativeValueTraits<{{cpp_class}}>::NativeValue( - v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { - {{cpp_class}} impl; - {{v8_class}}::ToImpl(isolate, value, impl, UnionTypeConversionMode::kNotNullable, exception_state); - return impl; -} - -} // namespace blink - -{% endfilter %}{# format_blink_cpp_source_code #} -
diff --git a/third_party/blink/renderer/bindings/templates/union_container.h.tmpl b/third_party/blink/renderer/bindings/templates/union_container.h.tmpl deleted file mode 100644 index 374868f..0000000 --- a/third_party/blink/renderer/bindings/templates/union_container.h.tmpl +++ /dev/null
@@ -1,89 +0,0 @@ -{% filter format_blink_cpp_source_code %} - -{% include 'copyright_block.txt' %} -#ifndef {{header_guard}} -#define {{header_guard}} - -{% for filename in header_includes %} -#include "{{filename}}" -{% endfor %} - -namespace blink { - -{% for decl in header_forward_decls %} -class {{decl}}; -{% endfor %} - -class {{exported}}{{cpp_class}} final { - DISALLOW_NEW(); - public: - {{cpp_class}}(); - bool IsNull() const { return type_ == SpecificType::kNone; } - - {% for member in members %} - bool Is{{member.type_name}}() const { return type_ == SpecificType::{{member.specific_type_enum}}; } - {{member.rvalue_cpp_type}} GetAs{{member.type_name}}() const; - void Set{{member.type_name}}({{member.rvalue_cpp_type}}); - static {{cpp_class}} From{{member.type_name}}({{member.rvalue_cpp_type}}); - - {% endfor %} - {{cpp_class}}(const {{cpp_class}}&); - ~{{cpp_class}}(); - {{cpp_class}}& operator=(const {{cpp_class}}&); - void Trace(Visitor*) const; - - private: - enum class SpecificType { - kNone, - {% for member in members %} - {{member.specific_type_enum}}, - {% endfor %} - }; - SpecificType type_; - - {% for member in members %} - {{member.cpp_type}} {{member.cpp_name}}_; - {% endfor %} - - friend {{exported}}v8::Local<v8::Value> ToV8(const {{cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*); -}; - -class {{v8_class}} final { - public: - {{exported}}static void ToImpl(v8::Isolate*, v8::Local<v8::Value>, {{cpp_class}}&, UnionTypeConversionMode, ExceptionState&); -}; - -{{exported}}v8::Local<v8::Value> ToV8(const {{cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*); - -template <class CallbackInfo> -inline void V8SetReturnValue(const CallbackInfo& callbackInfo, {{cpp_class}}& impl) { - V8SetReturnValue(callbackInfo, ToV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate())); -} - -template <class CallbackInfo> -inline void V8SetReturnValue(const CallbackInfo& callbackInfo, {{cpp_class}}& impl, v8::Local<v8::Object> creationContext) { - V8SetReturnValue(callbackInfo, ToV8(impl, creationContext, callbackInfo.GetIsolate())); -} - -template <> -struct NativeValueTraits<{{cpp_class}}> : public NativeValueTraitsBase<{{cpp_class}}> { - {{exported}}static {{cpp_class}} NativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&); - {{exported}}static {{cpp_class}} NullValue() { return {{cpp_class}}(); } -}; - -template <> -struct V8TypeOf<{{cpp_class}}> { - typedef {{v8_class}} Type; -}; - -} // namespace blink - -// We need to set canInitializeWithMemset=true because HeapVector supports -// items that can initialize with memset or have a vtable. It is safe to -// set canInitializeWithMemset=true for a union type object in practice. -// See https://codereview.chromium.org/1118993002/#msg5 for more details. -WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::{{cpp_class}}) - -#endif // {{header_guard}} - -{% endfilter %}{# format_blink_cpp_source_code #}
diff --git a/third_party/blink/renderer/bindings/templates/utilities.cc.tmpl b/third_party/blink/renderer/bindings/templates/utilities.cc.tmpl deleted file mode 100644 index 1a81c99..0000000 --- a/third_party/blink/renderer/bindings/templates/utilities.cc.tmpl +++ /dev/null
@@ -1,59 +0,0 @@ -{% macro v8_value_to_local_cpp_value(thing) %} -{# This indirection is just to avoid spurious white-space lines. #} -{{generate_v8_value_to_local_cpp_value(thing) | trim}} -{%- endmacro %} - - -{% macro generate_v8_value_to_local_cpp_value(thing) %} -{% set item = thing.v8_value_to_local_cpp_value or thing %} -{% if item.error_message %} -/* {{item.error_message}} */ -{% else %} -{% if item.declare_variable %} -{% if item.assign_expression %} -{{item.cpp_type}} {{item.cpp_name}}{ {{item.assign_expression}} }; -{% else %} -{{item.cpp_type}} {{item.cpp_name}}; -{% endif %} -{% else %}{# item.declare_variable #} -{% if item.assign_expression %} -{{item.cpp_name}} = {{item.assign_expression}}; -{% endif %} -{% endif %}{# item.declare_variable #} -{% if item.set_expression %} -{{item.set_expression}}; -{% endif %} -{% if item.check_expression %} -if ({{item.check_expression}}) - return{% if item.return_expression %} {{item.return_expression}}{% endif %}; -{% endif %}{# item.check_expression #} -{% endif %}{# item.error_message #} -{% endmacro %} - - -{% macro declare_enum_validation_variable(enum_values, enum_variable='kValidValues') %} -const char* const {{enum_variable}}[] = { -{% for enum_value in enum_values %} -{% if enum_value is none %} - nullptr, -{% else %} - "{{enum_value}}", -{% endif %} -{% endfor %} -}; -{%-endmacro %} - - -{% macro property_location(member) %} -{% set property_location_list = [] %} -{% if member.on_instance %} -{% set property_location_list = property_location_list + ['V8DOMConfiguration::kOnInstance'] %} -{% endif %} -{% if member.on_prototype %} -{% set property_location_list = property_location_list + ['V8DOMConfiguration::kOnPrototype'] %} -{% endif %} -{% if member.on_interface %} -{% set property_location_list = property_location_list + ['V8DOMConfiguration::kOnInterface'] %} -{% endif %} -{{property_location_list | join(' | ')}} -{%- endmacro %}
diff --git a/third_party/blink/renderer/config.gni b/third_party/blink/renderer/config.gni index 1cd55f13..b9b4411 100644 --- a/third_party/blink/renderer/config.gni +++ b/third_party/blink/renderer/config.gni
@@ -42,26 +42,6 @@ # If true, ffmpeg will be used for computing FFTs for WebAudio use_webaudio_ffmpeg = !is_mac && !is_android && !use_webaudio_pffft - # If true, the new implementation (experimental) of Blink-V8 bindings - # (of IDL callback function) is used. - use_blink_v8_binding_new_idl_callback_function = true - - # If true, the new implementation (experimental) of Blink-V8 bindings - # (of IDL callback interface) is used. - use_blink_v8_binding_new_idl_callback_interface = true - - # If true, the new implementation (experimental) of Blink-V8 bindings - # (of IDL dictionary) is used. - use_blink_v8_binding_new_idl_dictionary = true - - # If true, the new implementation (experimental) of Blink-V8 bindings - # (of IDL interface) is used. - use_blink_v8_binding_new_idl_interface = true - - # If true, the new implementation (experimental) of Blink-V8 bindings - # (of IDL union) is used. - use_blink_v8_binding_new_idl_union = true - # If true, the experimental renderer extensions library will be used. use_blink_extensions_chromeos = false } @@ -82,18 +62,6 @@ feature_defines_list += [ "WTF_USE_WEBAUDIO_PFFFT=1" ] } -if (use_blink_v8_binding_new_idl_dictionary) { - feature_defines_list += [ "USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY" ] -} - -if (use_blink_v8_binding_new_idl_interface) { - feature_defines_list += [ "USE_BLINK_V8_BINDING_NEW_IDL_INTERFACE" ] -} - -if (use_blink_v8_binding_new_idl_union) { - feature_defines_list += [ "USE_BLINK_V8_BINDING_NEW_IDL_UNION" ] -} - if (blink_symbol_level == 2) { blink_symbols_config = [ "//build/config/compiler:symbols" ] } else if (blink_symbol_level == 1) {
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 98795571..db1ce8e 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -61,6 +61,7 @@ import("//third_party/blink/renderer/core/timezone/build.gni") import("//third_party/blink/renderer/core/timing/build.gni") import("//third_party/blink/renderer/core/trustedtypes/build.gni") +import("//third_party/blink/renderer/core/typed_arrays/build.gni") import("//third_party/blink/renderer/core/url/build.gni") import("//third_party/blink/renderer/core/workers/build.gni") import("//third_party/blink/renderer/core/xml/build.gni") @@ -172,6 +173,8 @@ "core_initializer.h", ] + sources += blink_core_sources_bindings + # If you create a new subdirectory 'foo', make 'foo/build.gni' to define # blink_core_sources_foo, and include it here. Add any dependencies in the # deps section below. For unit tests, do the same thing in the "unit_tests" @@ -237,6 +240,7 @@ sources += rebase_path(blink_core_sources_timezone, "", "timezone") sources += rebase_path(blink_core_sources_timing, "", "timing") sources += rebase_path(blink_core_sources_trustedtypes, "", "trustedtypes") + sources += rebase_path(blink_core_sources_typed_arrays, "", "typed_arrays") sources += rebase_path(blink_core_sources_url, "", "url") sources += rebase_path(blink_core_sources_workers, "", "workers") sources += rebase_path(blink_core_sources_xml, "", "xml") @@ -245,6 +249,7 @@ configs -= core_config_remove configs += core_config_add + configs += [ "//tools/v8_context_snapshot:use_v8_context_snapshot" ] public_deps = [ ":core_generated", @@ -258,7 +263,6 @@ "//third_party/blink/renderer/core/animation", "//third_party/blink/renderer/core/exported", "//third_party/blink/renderer/core/probe", - "//third_party/blink/renderer/core/typed_arrays", "//third_party/blink/renderer/core/xml:xpath_generated", "//third_party/blink/renderer/platform", "//third_party/blink/renderer/platform/wtf", @@ -294,7 +298,6 @@ "//third_party/blink/public/common", "//third_party/blink/public/mojom:web_feature_mojo_bindings", "//third_party/blink/public/strings", - "//third_party/blink/renderer/core/typed_arrays:typed_arrays", "//ui/base/cursor:cursor_base", "//ui/base/cursor/mojom:cursor_type_blink", "//ui/base/dragdrop/mojom:mojom_blink", @@ -1116,9 +1119,8 @@ } target(core_generated_target_type, "core_generated") { - sources = bindings_core_v8_files - # Add all sources generated by the targets above. + sources = [] foreach(current, targets_generating_sources) { sources += get_target_outputs(current) } @@ -1150,10 +1152,7 @@ allow_circular_includes_from = [ "//third_party/blink/renderer/core/probe:probe" ] - configs += [ - ":core_include_dirs", - "//tools/v8_context_snapshot:use_v8_context_snapshot", - ] + configs += [ ":core_include_dirs" ] cflags = [] defines = []
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index 0597f39..f92e692 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -1098,14 +1098,24 @@ // Lazy evaluation of the before change style. We only need to update where // we are transitioning from if the final destination is changing. if (!state.before_change_style) { - // By calling GetBaseComputedStyleOrThis, we're using the style from the - // previous frame if no base style is found. Elements that have not been - // animated will not have a base style. Elements that were previously - // animated, but where all previously running animations have stopped may - // also be missing a base style. In both cases, the old style is equivalent - // to the base computed style. - state.before_change_style = CalculateBeforeChangeStyle( - state.animating_element, *state.old_style.GetBaseComputedStyleOrThis()); + ElementAnimations* element_animations = + state.animating_element.GetElementAnimations(); + if (element_animations) { + const ComputedStyle* base_style = element_animations->BaseComputedStyle(); + if (base_style) { + state.before_change_style = + CalculateBeforeChangeStyle(state.animating_element, *base_style); + } + } + // Use the style from the previous frame if no base style is found. + // Elements that have not been animated will not have a base style. + // Elements that were previously animated, but where all previously running + // animations have stopped may also be missing a base style. In both cases, + // the old style is equivalent to the base computed style. + if (!state.before_change_style) { + state.before_change_style = + CalculateBeforeChangeStyle(state.animating_element, state.old_style); + } } if (ComputedValuesEqual(property, *state.before_change_style, state.style)) {
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc index 7447df77..fa1b980 100644 --- a/third_party/blink/renderer/core/animation/element_animations.cc +++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -124,6 +124,29 @@ visitor->Trace(worklet_animations_); } +const ComputedStyle* ElementAnimations::BaseComputedStyle() const { + return base_computed_style_.get(); +} + +const CSSBitset* ElementAnimations::BaseImportantSet() const { + if (IsAnimationStyleChange()) + return base_important_set_.get(); + return nullptr; +} + +void ElementAnimations::UpdateBaseComputedStyle( + const ComputedStyle* computed_style, + std::unique_ptr<CSSBitset> base_important_set) { + DCHECK(computed_style); + base_computed_style_ = ComputedStyle::Clone(*computed_style); + base_important_set_ = std::move(base_important_set); +} + +void ElementAnimations::ClearBaseComputedStyle() { + base_computed_style_ = nullptr; + base_important_set_ = nullptr; +} + bool ElementAnimations::UpdateBoxSizeAndCheckTransformAxisAlignment( const FloatSize& box_size) { bool preserves_axis_alignment = true;
diff --git a/third_party/blink/renderer/core/animation/element_animations.h b/third_party/blink/renderer/core/animation/element_animations.h index e6e2cf4..debe9bc 100644 --- a/third_party/blink/renderer/core/animation/element_animations.h +++ b/third_party/blink/renderer/core/animation/element_animations.h
@@ -83,6 +83,12 @@ } bool IsAnimationStyleChange() const { return animation_style_change_; } + const ComputedStyle* BaseComputedStyle() const; + const CSSBitset* BaseImportantSet() const; + void UpdateBaseComputedStyle(const ComputedStyle*, + std::unique_ptr<CSSBitset> base_important_set); + void ClearBaseComputedStyle(); + bool UpdateBoxSizeAndCheckTransformAxisAlignment(const FloatSize& box_size); bool IsIdentityOrTranslation() const; @@ -100,9 +106,22 @@ // style, we store a cached value of the 'base' computed style (e.g. with no // change from the running animations) and use that during style recalc, // applying only the animation changes on top of it. - // - // See also StyleBaseData. bool animation_style_change_; + scoped_refptr<ComputedStyle> base_computed_style_; + // Keeps track of the !important declarations used to build the base + // computed style. These declarations must not be overwritten by animation + // effects, hence we have to disable the base computed style optimization when + // !important declarations conflict with active animations. + // + // If there were no !important declarations in the base style, this field + // will be nullptr. + // + // TODO(andruud): We should be able to simply skip applying the animation + // for properties in this set instead of disabling the optimization. + // However, we currently need the cascade to handle the case where + // an !important declaration appears in a :visited selector. + // See https://crbug.com/1062217. + std::unique_ptr<CSSBitset> base_important_set_; FRIEND_TEST_ALL_PREFIXES(StyleEngineTest, PseudoElementBaseComputedStyle); };
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index 01e3ab4..848d80db 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -140,12 +140,6 @@ state.GetAnimatingElement()->HasAnimations()); } -bool IsAnimationStyleChange(Element& element) { - if (auto* element_animations = element.GetElementAnimations()) - return element_animations->IsAnimationStyleChange(); - return false; -} - bool ShouldComputeBaseComputedStyle(const ComputedStyle* base_computed_style) { #if DCHECK_IS_ON() // The invariant in the base computed style optimization is that as long as @@ -216,25 +210,6 @@ #endif // DCHECK_IS_ON() } -void PreserveTextAutosizingMultiplierIfNeeded( - StyleResolverState& state, - const StyleRequest& style_request) { - const ComputedStyle* old_style = state.GetElement().GetComputedStyle(); - if (!style_request.IsPseudoStyleRequest() && old_style) { - state.Style()->SetTextAutosizingMultiplier( - old_style->TextAutosizingMultiplier()); - } -} - -bool TextAutosizingMultiplierChanged(const StyleResolverState& state, - const ComputedStyle& base_computed_style) { - // Note that |old_style| can be a style replaced by - // TextAutosizer::ApplyMultiplier. - const ComputedStyle* old_style = state.GetElement().GetComputedStyle(); - return old_style && (old_style->TextAutosizingMultiplier() != - base_computed_style.TextAutosizingMultiplier()); -} - } // namespace static CSSPropertyValueSet* LeftToRightDeclaration() { @@ -726,19 +701,40 @@ return state.GetAnimatingElement()->GetElementAnimations(); } -static StyleBaseData* GetBaseData(const StyleResolverState& state) { - Element* animating_element = state.GetAnimatingElement(); - if (!animating_element) - return nullptr; - auto* old_style = animating_element->GetComputedStyle(); - return old_style ? old_style->BaseData().get() : nullptr; -} - static const ComputedStyle* CachedAnimationBaseComputedStyle( StyleResolverState& state) { - if (auto* base_data = GetBaseData(state)) - return base_data->GetBaseComputedStyle(); - return nullptr; + ElementAnimations* element_animations = GetElementAnimations(state); + if (!element_animations) + return nullptr; + + return element_animations->BaseComputedStyle(); +} + +static void UpdateAnimationBaseComputedStyle(StyleResolverState& state, + StyleCascade& cascade, + bool forced_update) { + if (!state.GetAnimatingElement()) + return; + + if (!state.CanCacheBaseStyle()) + return; + + if (forced_update) + state.GetAnimatingElement()->EnsureElementAnimations(); + + ElementAnimations* element_animations = + state.GetAnimatingElement()->GetElementAnimations(); + if (!element_animations) + return; + + if (element_animations->IsAnimationStyleChange() && + element_animations->BaseComputedStyle()) { + return; + } + + std::unique_ptr<CSSBitset> important_set = cascade.GetImportantSet(); + element_animations->UpdateBaseComputedStyle(state.Style(), + std::move(important_set)); } static void IncrementResolvedStyleCounters(const StyleRequest& style_request, @@ -797,6 +793,22 @@ if (element->IsMathMLElement()) ApplyMathMLCustomStyleProperties(element, state); + } else if (IsHighlightPseudoElement(style_request.pseudo_id)) { + if (element->GetComputedStyle() && + element->GetComputedStyle()->TextShadow() != + state.Style()->TextShadow()) { + // This counts the usage of text-shadow in CSS highlight pseudos. + UseCounter::Count(GetDocument(), + WebFeature::kTextShadowInHighlightPseudo); + if (state.Style()->TextShadow()) { + // This counts the cases in which text-shadow is not "none" in CSS + // highlight pseudos, as the most common use case is using it to disable + // text-shadow, and that won't be need once some painting issues related + // to highlight pseudos are fixed. + UseCounter::Count(GetDocument(), + WebFeature::kTextShadowNotNoneInHighlightPseudo); + } + } } if (Element* animating_element = state.GetAnimatingElement()) @@ -973,11 +985,16 @@ return; } - // Preserve the text autosizing multiplier on style recalc. Autosizer will - // update it during layout if needed. - // NOTE: This must occur before CascadeAndApplyMatchedProperties for correct - // computation of font-relative lengths. - PreserveTextAutosizingMultiplierIfNeeded(state, style_request); + if (!style_request.IsPseudoStyleRequest() && element->GetComputedStyle() && + element->GetComputedStyle()->TextAutosizingMultiplier() != + state.Style()->TextAutosizingMultiplier()) { + // Preserve the text autosizing multiplier on style recalc. Autosizer will + // update it during layout if needed. + // NOTE: this must occur before ApplyMatchedProperties for correct + // computation of font-relative lengths. + state.Style()->SetTextAutosizingMultiplier( + element->GetComputedStyle()->TextAutosizingMultiplier()); + } CascadeAndApplyMatchedProperties(state, cascade); @@ -999,8 +1016,6 @@ if (base_is_usable) { DCHECK(animation_base_computed_style); state.SetStyle(ComputedStyle::Clone(*animation_base_computed_style)); - state.StyleRef().SetBaseData( - scoped_refptr<StyleBaseData>(GetBaseData(state))); state.Style()->SetStyleType(style_request.pseudo_id); if (!state.ParentStyle()) { state.SetParentStyle(InitialStyleForElement()); @@ -1253,13 +1268,12 @@ DCHECK(animating_element == &element || animating_element->ParentOrShadowHostElement() == element); - if (!HasAnimationsOrTransitions(state)) + if (!HasAnimationsOrTransitions(state)) { + // Ensure that the base computed style is not stale even if not currently + // running an animation or transition. This ensures that any new transitions + // use the correct starting point based on the "before change" style. + UpdateAnimationBaseComputedStyle(state, cascade, false); return false; - - if (!IsAnimationStyleChange(*animating_element) || - !state.StyleRef().BaseData()) { - state.StyleRef().SetBaseData(StyleBaseData::Create( - ComputedStyle::Clone(state.StyleRef()), cascade.GetImportantSet())); } CSSAnimations::CalculateAnimationUpdate( @@ -1274,7 +1288,10 @@ CSSAnimations::SnapshotCompositorKeyframes( element, state.AnimationUpdate(), *state.Style(), state.ParentStyle()); - if (state.AnimationUpdate().IsEmpty()) + bool has_update = !state.AnimationUpdate().IsEmpty(); + UpdateAnimationBaseComputedStyle(state, cascade, has_update); + + if (!has_update) return false; const ActiveInterpolationsMap& animations = @@ -1446,11 +1463,10 @@ return false; ElementAnimations* element_animations = GetElementAnimations(state); - if (!element_animations || !element_animations->IsAnimationStyleChange()) + if (!element_animations || !element_animations->BaseComputedStyle()) return false; - StyleBaseData* base_data = GetBaseData(state); - if (!base_data || !base_data->GetBaseComputedStyle()) + if (!element_animations->IsAnimationStyleChange()) return false; // Animating a custom property can have side effects on other properties @@ -1468,8 +1484,10 @@ // animation. We cannot use the base computed style optimization in such // cases. if (CSSAnimations::IsAnimatingFontAffectingProperties(element_animations)) { - if (base_data->GetBaseComputedStyle()->HasFontRelativeUnits()) + if (element_animations->BaseComputedStyle() && + element_animations->BaseComputedStyle()->HasFontRelativeUnits()) { return false; + } } // Normally, we apply all active animation effects on top of the style created @@ -1479,16 +1497,11 @@ // style, we disable the base computed style optimization. // [1] https://drafts.csswg.org/css-cascade-4/#cascade-origin if (CSSAnimations::IsAnimatingStandardProperties( - element_animations, base_data->GetBaseImportantSet(), + element_animations, element_animations->BaseImportantSet(), KeyframeEffect::kDefaultPriority)) { return false; } - if (TextAutosizingMultiplierChanged(state, - *base_data->GetBaseComputedStyle())) { - return false; - } - return true; }
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc index 3c4f41f..a169fdd 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
@@ -88,14 +88,13 @@ animations.SetAnimationStyleChange(true); StyleResolver& resolver = GetStyleEngine().GetStyleResolver(); - auto style1 = resolver.ResolveStyle(div, StyleRecalcContext()); - ASSERT_TRUE(style1); - EXPECT_EQ(20, style1->FontSize()); - ASSERT_TRUE(style1->GetBaseComputedStyle()); - EXPECT_EQ(20, style1->GetBaseComputedStyle()->FontSize()); + ASSERT_TRUE(resolver.ResolveStyle(div, StyleRecalcContext())); + EXPECT_EQ(20, resolver.ResolveStyle(div, StyleRecalcContext())->FontSize()); + ASSERT_TRUE(animations.BaseComputedStyle()); + EXPECT_EQ(20, animations.BaseComputedStyle()->FontSize()); - // Getting style with customized parent style should not affect previously - // produced animation base computed style. + // Getting style with customized parent style should not affect cached + // animation base computed style. const ComputedStyle* parent_style = GetDocument().documentElement()->GetComputedStyle(); StyleRequest style_request; @@ -103,8 +102,8 @@ style_request.layout_parent_override = parent_style; EXPECT_EQ(10, resolver.ResolveStyle(div, StyleRecalcContext(), style_request) ->FontSize()); - ASSERT_TRUE(style1->GetBaseComputedStyle()); - EXPECT_EQ(20, style1->GetBaseComputedStyle()->FontSize()); + ASSERT_TRUE(animations.BaseComputedStyle()); + EXPECT_EQ(20, animations.BaseComputedStyle()->FontSize()); EXPECT_EQ(20, resolver.ResolveStyle(div, StyleRecalcContext())->FontSize()); } @@ -135,6 +134,9 @@ GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); StyleForId("div"); + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); + StyleResolverState state(GetDocument(), *div); EXPECT_TRUE(StyleResolver::CanReuseBaseComputedStyle(state)); } @@ -162,12 +164,13 @@ div->SetNeedsAnimationStyleRecalc(); GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); - auto style = StyleForId("div"); + StyleForId("div"); - const CSSBitset* bitset = style->GetBaseImportantSet(); + ASSERT_TRUE(div->GetElementAnimations()); + const CSSBitset* bitset = div->GetElementAnimations()->BaseImportantSet(); EXPECT_FALSE(CSSAnimations::IsAnimatingStandardProperties( div->GetElementAnimations(), bitset, KeyframeEffect::kDefaultPriority)); - EXPECT_TRUE(style->GetBaseComputedStyle()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); EXPECT_FALSE(bitset && bitset->Has(CSSPropertyID::kWidth)); EXPECT_TRUE(bitset && bitset->Has(CSSPropertyID::kHeight)); } @@ -232,10 +235,11 @@ div->SetNeedsAnimationStyleRecalc(); GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); - auto style = StyleForId("div"); + StyleForId("div"); - EXPECT_TRUE(style->GetBaseComputedStyle()); - EXPECT_TRUE(style->GetBaseImportantSet()); + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); + EXPECT_TRUE(div->GetElementAnimations()->BaseImportantSet()); StyleResolverState state(GetDocument(), *div); EXPECT_FALSE(StyleResolver::CanReuseBaseComputedStyle(state)); @@ -290,6 +294,53 @@ ComputedValue("font-size", *StyleForId("target"))); } +TEST_F(StyleResolverTest, NonCachableStyleCheckDoesNotAffectBaseComputedStyle) { + GetDocument().documentElement()->setInnerHTML(R"HTML( + <style> + .adjust { color: rgb(0, 0, 0); } + </style> + <div> + <div style="color: rgb(0, 128, 0)"> + <div id="target" style="transition: color 1s linear"></div> + </div> + </div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById("target"); + + EXPECT_EQ("rgb(0, 128, 0)", ComputedValue("color", *StyleForId("target"))); + + // Trigger a transition on an inherited property. + target->setAttribute(html_names::kClassAttr, "adjust"); + UpdateAllLifecyclePhasesForTest(); + ElementAnimations* element_animations = target->GetElementAnimations(); + EXPECT_TRUE(element_animations); + Animation* transition = (*element_animations->Animations().begin()).key; + EXPECT_TRUE(transition); + + // Advance to the midpoint of the transition. + transition->setCurrentTime(MakeGarbageCollected<V8CSSNumberish>(500), + ASSERT_NO_EXCEPTION); + UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ("rgb(0, 64, 0)", ComputedValue("color", *StyleForId("target"))); + EXPECT_TRUE(element_animations->BaseComputedStyle()); + + element_animations->ClearBaseComputedStyle(); + + // Perform a non-cacheable style resolution, and ensure that the base computed + // style is not updated. + StyleRequest style_request; + style_request.matching_behavior = kMatchAllRulesExcludingSMIL; + GetStyleEngine().GetStyleResolver().ResolveStyle(target, StyleRecalcContext(), + style_request); + EXPECT_FALSE(element_animations->BaseComputedStyle()); + + // Computing the style with default args updates the base computed style. + EXPECT_EQ("rgb(0, 64, 0)", ComputedValue("color", *StyleForId("target"))); + EXPECT_TRUE(element_animations->BaseComputedStyle()); +} + class StyleResolverFontRelativeUnitTest : public testing::WithParamInterface<const char*>, public StyleResolverTest {}; @@ -312,7 +363,8 @@ auto computed_style = StyleForId("div"); EXPECT_TRUE(computed_style->HasFontRelativeUnits()); - EXPECT_TRUE(computed_style->GetBaseComputedStyle()); + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); StyleResolverState state(GetDocument(), *div); EXPECT_FALSE(StyleResolver::CanReuseBaseComputedStyle(state)); @@ -336,7 +388,8 @@ auto computed_style = StyleForId("div"); EXPECT_TRUE(computed_style->HasFontRelativeUnits()); - EXPECT_TRUE(computed_style->GetBaseComputedStyle()); + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); StyleResolverState state(GetDocument(), *div); EXPECT_TRUE(StyleResolver::CanReuseBaseComputedStyle(state)); @@ -1059,6 +1112,196 @@ << "-webkit-mask-image is fetched"; } +TEST_F(StyleResolverTest, TextShadowInHighlightPseudoNotCounted1) { + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + * { + text-shadow: 5px 5px green; + } + </style> + <div id="target">target</div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById("target"); + ASSERT_TRUE(target); + const auto* element_style = target->GetComputedStyle(); + ASSERT_TRUE(element_style); + + StyleRequest pseudo_style_request; + pseudo_style_request.parent_override = element_style; + pseudo_style_request.layout_parent_override = element_style; + pseudo_style_request.pseudo_id = kPseudoIdSelection; + scoped_refptr<ComputedStyle> selection_style = + GetDocument().GetStyleResolver().ResolveStyle( + target, StyleRecalcContext(), pseudo_style_request); + ASSERT_FALSE(selection_style); + + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); +} + +TEST_F(StyleResolverTest, TextShadowInHighlightPseudoNotCounted2) { + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + * { + text-shadow: 5px 5px green; + } + ::selection { + color: white; + background: blue; + } + </style> + <div id="target">target</div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById("target"); + ASSERT_TRUE(target); + const auto* element_style = target->GetComputedStyle(); + ASSERT_TRUE(element_style); + + StyleRequest pseudo_style_request; + pseudo_style_request.parent_override = element_style; + pseudo_style_request.layout_parent_override = element_style; + pseudo_style_request.pseudo_id = kPseudoIdSelection; + scoped_refptr<ComputedStyle> selection_style = + GetDocument().GetStyleResolver().ResolveStyle( + target, StyleRecalcContext(), pseudo_style_request); + ASSERT_TRUE(selection_style); + + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); +} + +TEST_F(StyleResolverTest, TextShadowInHighlightPseudotNone) { + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + * { + text-shadow: 5px 5px green; + } + ::selection { + text-shadow: none; + } + </style> + <div id="target">target</div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById("target"); + ASSERT_TRUE(target); + const auto* element_style = target->GetComputedStyle(); + ASSERT_TRUE(element_style); + + StyleRequest pseudo_style_request; + pseudo_style_request.parent_override = element_style; + pseudo_style_request.layout_parent_override = element_style; + pseudo_style_request.pseudo_id = kPseudoIdSelection; + scoped_refptr<ComputedStyle> selection_style = + GetDocument().GetStyleResolver().ResolveStyle( + target, StyleRecalcContext(), pseudo_style_request); + ASSERT_TRUE(selection_style); + + EXPECT_TRUE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); +} + +TEST_F(StyleResolverTest, TextShadowInHighlightPseudoNotNone1) { + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + ::selection { + text-shadow: 5px 5px green; + } + </style> + <div id="target">target</div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById("target"); + ASSERT_TRUE(target); + const auto* element_style = target->GetComputedStyle(); + ASSERT_TRUE(element_style); + + StyleRequest pseudo_style_request; + pseudo_style_request.parent_override = element_style; + pseudo_style_request.layout_parent_override = element_style; + pseudo_style_request.pseudo_id = kPseudoIdSelection; + scoped_refptr<ComputedStyle> selection_style = + GetDocument().GetStyleResolver().ResolveStyle( + target, StyleRecalcContext(), pseudo_style_request); + ASSERT_TRUE(selection_style); + + EXPECT_TRUE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_TRUE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); +} + +TEST_F(StyleResolverTest, TextShadowInHighlightPseudoNotNone2) { + EXPECT_FALSE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + * { + text-shadow: 5px 5px green; + } + ::selection { + text-shadow: 5px 5px green; + } + </style> + <div id="target">target</div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById("target"); + ASSERT_TRUE(target); + const auto* element_style = target->GetComputedStyle(); + ASSERT_TRUE(element_style); + + StyleRequest pseudo_style_request; + pseudo_style_request.parent_override = element_style; + pseudo_style_request.layout_parent_override = element_style; + pseudo_style_request.pseudo_id = kPseudoIdSelection; + scoped_refptr<ComputedStyle> selection_style = + GetDocument().GetStyleResolver().ResolveStyle( + target, StyleRecalcContext(), pseudo_style_request); + ASSERT_TRUE(selection_style); + + EXPECT_TRUE( + GetDocument().IsUseCounted(WebFeature::kTextShadowInHighlightPseudo)); + EXPECT_TRUE(GetDocument().IsUseCounted( + WebFeature::kTextShadowNotNoneInHighlightPseudo)); +} + TEST_F(StyleResolverTestCQ, DependsOnContainerQueries) { GetDocument().documentElement()->setInnerHTML(R"HTML( <style>
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index e2cf015..fd36ed7 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -2534,21 +2534,18 @@ before->SetNeedsAnimationStyleRecalc(); UpdateAllLifecyclePhases(); - ASSERT_TRUE(before->GetComputedStyle()); - const ComputedStyle* base_computed_style = - before->GetComputedStyle()->GetBaseComputedStyle(); + scoped_refptr<ComputedStyle> base_computed_style = + animations->base_computed_style_; EXPECT_TRUE(base_computed_style); before->SetNeedsAnimationStyleRecalc(); UpdateAllLifecyclePhases(); - ASSERT_TRUE(before->GetComputedStyle()); - EXPECT_TRUE(before->GetComputedStyle()->GetBaseComputedStyle()); + EXPECT_TRUE(animations->base_computed_style_); #if !DCHECK_IS_ON() // When DCHECK is enabled, BaseComputedStyle() returns null and we repeatedly // create new instances which means the pointers will be different here. - EXPECT_EQ(base_computed_style, - before->GetComputedStyle()->GetBaseComputedStyle()); + EXPECT_EQ(base_computed_style, animations->base_computed_style_); #endif }
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc b/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc index 7e964ee..d7349c6b 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/document_transition/document_transition_supplement.h" +#include "cc/document_transition/document_transition_request.h" #include "third_party/blink/renderer/core/document_transition/document_transition.h" #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 2377822..f937c8a 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2781,6 +2781,7 @@ element_animations->CssAnimations().Cancel(); element_animations->SetAnimationStyleChange(false); } + element_animations->ClearBaseComputedStyle(); } }
diff --git a/third_party/blink/renderer/core/exported/BUILD.gn b/third_party/blink/renderer/core/exported/BUILD.gn index a5be18f..b8bca80 100644 --- a/third_party/blink/renderer/core/exported/BUILD.gn +++ b/third_party/blink/renderer/core/exported/BUILD.gn
@@ -101,7 +101,6 @@ "//build:chromeos_buildflags", "//third_party/blink/renderer/core:core_generated", "//third_party/blink/renderer/core/probe", - "//third_party/blink/renderer/core/typed_arrays:typed_arrays", "//ui/base/cursor:cursor_base", "//ui/base/cursor/mojom:cursor_type_blink", ]
diff --git a/third_party/blink/renderer/core/frame/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation.cc index ffa854c9..51edda2 100644 --- a/third_party/blink/renderer/core/frame/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation.cc
@@ -578,7 +578,9 @@ "format, \"unified-plan\", has been used by default since M72 " "(January, 2019). Dropping support for Plan B is targeted for " "M93. See https://www.chromestatus.com/feature/5823036655665152 " - "for more details."}; + "for more details, including the possibility of registering for " + "a Deprecation Trial in order to extend the Plan B deprecation " + "deadline for a limited amount of time."}; case WebFeature::kRTCPeerConnectionSdpSemanticsPlanBWithReverseOriginTrial: return {"RTCPeerConnectionSdpSemanticsPlanBWithReverseOriginTrial", kM96,
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.cc b/third_party/blink/renderer/core/inspector/inspect_tools.cc index cef38f08..9db014a 100644 --- a/third_party/blink/renderer/core/inspector/inspect_tools.cc +++ b/third_party/blink/renderer/core/inspector/inspect_tools.cc
@@ -434,7 +434,7 @@ bool PersistentTool::IsEmpty() { return !grid_node_highlights_.size() && !flex_container_configs_.size() && - !scroll_snap_configs_.size(); + !scroll_snap_configs_.size() && !container_query_configs_.size(); } void PersistentTool::SetGridConfigs(GridConfigs configs) { @@ -449,6 +449,10 @@ scroll_snap_configs_ = std::move(configs); } +void PersistentTool::SetContainerQueryConfigs(ContainerQueryConfigs configs) { + container_query_configs_ = std::move(configs); +} + bool PersistentTool::ForwardEventsToOverlay() { return false; } @@ -485,6 +489,14 @@ overlay_->EvaluateInOverlay("drawScrollSnapHighlight", std::move(highlight)); } + for (auto& entry : container_query_configs_) { + std::unique_ptr<protocol::Value> highlight = + InspectorContainerQueryHighlight(entry.first.Get(), *(entry.second)); + if (!highlight) + continue; + overlay_->EvaluateInOverlay("drawContainerQueryHighlight", + std::move(highlight)); + } } std::unique_ptr<protocol::DictionaryValue>
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.h b/third_party/blink/renderer/core/inspector/inspect_tools.h index 066a2a3..3c9d885 100644 --- a/third_party/blink/renderer/core/inspector/inspect_tools.h +++ b/third_party/blink/renderer/core/inspector/inspect_tools.h
@@ -154,6 +154,10 @@ std::pair<Member<Node>, std::unique_ptr<InspectorScrollSnapContainerHighlightConfig>>>; +using ContainerQueryConfigs = Vector<std::pair< + Member<Node>, + std::unique_ptr<InspectorContainerQueryContainerHighlightConfig>>>; + class PersistentTool : public InspectTool { using InspectTool::InspectTool; @@ -166,6 +170,7 @@ void SetGridConfigs(GridConfigs); void SetFlexContainerConfigs(FlexContainerConfigs); void SetScrollSnapConfigs(ScrollSnapConfigs); + void SetContainerQueryConfigs(ContainerQueryConfigs); std::unique_ptr<protocol::DictionaryValue> GetGridInspectorHighlightsAsJson() const; @@ -179,6 +184,7 @@ GridConfigs grid_node_highlights_; FlexContainerConfigs flex_container_configs_; ScrollSnapConfigs scroll_snap_configs_; + ContainerQueryConfigs container_query_configs_; }; // -----------------------------------------------------------------------------
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc index 901c89a..233992b6 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc +++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -524,6 +524,18 @@ return grid_config_info; } +std::unique_ptr<protocol::DictionaryValue> +BuildContainerQueryContainerHighlightConfigInfo( + const InspectorContainerQueryContainerHighlightConfig& container_config) { + std::unique_ptr<protocol::DictionaryValue> container_config_info = + protocol::DictionaryValue::create(); + + AppendLineStyleConfig(container_config.container_border, + container_config_info, "containerBorder"); + + return container_config_info; +} + // Swaps |left| and |top| of an offset. PhysicalOffset Transpose(PhysicalOffset& offset) { return PhysicalOffset(offset.top, offset.left); @@ -1841,6 +1853,13 @@ node, *(highlight_config.flex_item_highlight_config), scale_)); } } + + if (highlight_config.container_query_container_highlight_config) { + container_query_container_info_ = protocol::ListValue::create(); + container_query_container_info_->pushValue(BuildContainerQueryContainerInfo( + node, *(highlight_config.container_query_container_highlight_config), + scale_)); + } } std::unique_ptr<protocol::DictionaryValue> InspectorHighlight::AsProtocolValue() @@ -1890,6 +1909,11 @@ object->setValue("flexInfo", flex_container_info_->clone()); if (flex_item_info_ && flex_item_info_->size() > 0) object->setValue("flexItemInfo", flex_item_info_->clone()); + if (container_query_container_info_ && + container_query_container_info_->size() > 0) { + object->setValue("containerQueryInfo", + container_query_container_info_->clone()); + } return object; } @@ -2162,6 +2186,58 @@ return scroll_snap_info; } +std::unique_ptr<protocol::DictionaryValue> BuildContainerQueryContainerInfo( + Node* node, + const InspectorContainerQueryContainerHighlightConfig& + container_query_container_highlight_config, + float scale) { + if (!node) + return nullptr; + + LayoutBox* layout_box = node->GetLayoutBox(); + if (!layout_box) + return nullptr; + + LocalFrameView* containing_view = node->GetDocument().View(); + if (!containing_view) + return nullptr; + + std::unique_ptr<protocol::DictionaryValue> container_query_container_info = + protocol::DictionaryValue::create(); + + PathBuilder container_builder; + auto content_box = layout_box->PhysicalContentBoxRect(); + FloatQuad content_quad = layout_box->LocalRectToAbsoluteQuad(content_box); + FrameQuadToViewport(containing_view, content_quad); + container_builder.AppendPath(QuadToPath(content_quad), scale); + container_query_container_info->setValue("containerBorder", + container_builder.Release()); + + container_query_container_info->setValue( + "containerQueryContainerHighlightConfig", + BuildContainerQueryContainerHighlightConfigInfo( + container_query_container_highlight_config)); + + return container_query_container_info; +} + +std::unique_ptr<protocol::DictionaryValue> InspectorContainerQueryHighlight( + Node* node, + const InspectorContainerQueryContainerHighlightConfig& config) { + LocalFrameView* frame_view = node->GetDocument().View(); + if (!frame_view) + return nullptr; + + std::unique_ptr<protocol::DictionaryValue> container_query_container_info = + BuildContainerQueryContainerInfo(node, config, + DeviceScaleFromFrameView(frame_view)); + + if (!container_query_container_info) + return nullptr; + + return container_query_container_info; +} + // static InspectorHighlightConfig InspectorHighlight::DefaultConfig() { InspectorHighlightConfig config;
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.h b/third_party/blink/renderer/core/inspector/inspector_highlight.h index 5fa97abd..a721ed2 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight.h +++ b/third_party/blink/renderer/core/inspector/inspector_highlight.h
@@ -115,6 +115,15 @@ Color scroll_padding_color; }; +struct CORE_EXPORT InspectorContainerQueryContainerHighlightConfig { + USING_FAST_MALLOC(InspectorContainerQueryContainerHighlightConfig); + + public: + InspectorContainerQueryContainerHighlightConfig() = default; + + absl::optional<LineStyle> container_border; +}; + struct CORE_EXPORT InspectorFlexItemHighlightConfig { USING_FAST_MALLOC(InspectorFlexItemHighlightConfig); @@ -156,6 +165,8 @@ std::unique_ptr<InspectorFlexContainerHighlightConfig> flex_container_highlight_config; std::unique_ptr<InspectorFlexItemHighlightConfig> flex_item_highlight_config; + std::unique_ptr<InspectorContainerQueryContainerHighlightConfig> + container_query_container_highlight_config; }; struct InspectorHighlightContrastInfo { @@ -252,6 +263,7 @@ std::unique_ptr<protocol::ListValue> grid_info_; std::unique_ptr<protocol::ListValue> flex_container_info_; std::unique_ptr<protocol::ListValue> flex_item_info_; + std::unique_ptr<protocol::ListValue> container_query_container_info_; bool show_rulers_; bool show_extension_lines_; bool show_accessibility_info_; @@ -270,10 +282,21 @@ Node* node, const InspectorScrollSnapContainerHighlightConfig& config); -// CORE_EXPORT is required to make the function available for unit tests. +std::unique_ptr<protocol::DictionaryValue> InspectorContainerQueryHighlight( + Node* node, + const InspectorContainerQueryContainerHighlightConfig& config); + +// CORE_EXPORT is required to make these functions available for unit tests. std::unique_ptr<protocol::DictionaryValue> CORE_EXPORT BuildSnapContainerInfo(Node* node); +std::unique_ptr<protocol::DictionaryValue> CORE_EXPORT +BuildContainerQueryContainerInfo( + Node* node, + const InspectorContainerQueryContainerHighlightConfig& + container_query_container_highlight_config, + float scale); + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_HIGHLIGHT_H_
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight_test.cc b/third_party/blink/renderer/core/inspector/inspector_highlight_test.cc index 74232f6..98aacfc 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight_test.cc +++ b/third_party/blink/renderer/core/inspector/inspector_highlight_test.cc
@@ -151,4 +151,33 @@ expected_container); } +TEST_F(InspectorHighlightTest, + BuildContainerQueryContainerInfoWithoutChildren) { + GetDocument().body()->setInnerHTML(R"HTML( + <style> + #container { + width: 400px; + height: 500px; + } + </style> + <div id="container"></div> + )HTML"); + GetDocument().View()->UpdateAllLifecyclePhasesForTest(); + Element* container = GetDocument().getElementById("container"); + auto info = BuildContainerQueryContainerInfo( + container, InspectorContainerQueryContainerHighlightConfig(), 1.0f); + EXPECT_TRUE(info); + + protocol::ErrorSupport errors; + std::string expected_container = R"JSON( + { + "containerBorder":["M",8,8,"L",408,8,"L",408,508,"L",8,508,"Z"], + "containerQueryContainerHighlightConfig": {} + } + )JSON"; + AssertValueEqualsJSON(protocol::ValueConversions<protocol::Value>::fromValue( + info.get(), &errors), + expected_container); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index 56bd71f..2e9710f 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -785,6 +785,38 @@ return Response::Success(); } +Response InspectorOverlayAgent::setShowContainerQueryOverlays( + std::unique_ptr< + protocol::Array<protocol::Overlay::ContainerQueryHighlightConfig>> + container_query_highlight_configs) { + if (!persistent_tool_) { + persistent_tool_ = + MakeGarbageCollected<PersistentTool>(this, GetFrontend()); + } + + Vector<std::pair< + Member<Node>, + std::unique_ptr<InspectorContainerQueryContainerHighlightConfig>>> + configs; + + for (std::unique_ptr<protocol::Overlay::ContainerQueryHighlightConfig>& + config : *container_query_highlight_configs) { + Node* node = nullptr; + Response response = dom_agent_->AssertNode(config->getNodeId(), node); + if (!response.IsSuccess()) + return response; + configs.push_back(std::make_pair( + node, InspectorOverlayAgent::ToContainerQueryContainerHighlightConfig( + config->getContainerQueryContainerHighlightConfig()))); + } + + persistent_tool_->SetContainerQueryConfigs(std::move(configs)); + + PickTheRightTool(); + + return Response::Success(); +} + Response InspectorOverlayAgent::highlightSourceOrder( std::unique_ptr<protocol::Overlay::SourceOrderConfig> source_order_inspector_object, @@ -1624,6 +1656,22 @@ } // static +std::unique_ptr<InspectorContainerQueryContainerHighlightConfig> +InspectorOverlayAgent::ToContainerQueryContainerHighlightConfig( + protocol::Overlay::ContainerQueryContainerHighlightConfig* config) { + if (!config) { + return nullptr; + } + std::unique_ptr<InspectorContainerQueryContainerHighlightConfig> + highlight_config = + std::make_unique<InspectorContainerQueryContainerHighlightConfig>(); + highlight_config->container_border = + InspectorOverlayAgent::ToLineStyle(config->getContainerBorder(nullptr)); + + return highlight_config; +} + +// static std::unique_ptr<InspectorFlexItemHighlightConfig> InspectorOverlayAgent::ToFlexItemHighlightConfig( protocol::Overlay::FlexItemHighlightConfig* config) { @@ -1739,6 +1787,10 @@ InspectorOverlayAgent::ToFlexItemHighlightConfig( config->getFlexItemHighlightConfig(nullptr)); + highlight_config->container_query_container_highlight_config = + InspectorOverlayAgent::ToContainerQueryContainerHighlightConfig( + config->getContainerQueryContainerHighlightConfig(nullptr)); + return highlight_config; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h index 19c6dee9..0461b82 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
@@ -152,6 +152,9 @@ static std::unique_ptr<InspectorScrollSnapContainerHighlightConfig> ToScrollSnapContainerHighlightConfig( protocol::Overlay::ScrollSnapContainerHighlightConfig*); + static std::unique_ptr<InspectorContainerQueryContainerHighlightConfig> + ToContainerQueryContainerHighlightConfig( + protocol::Overlay::ContainerQueryContainerHighlightConfig*); static std::unique_ptr<InspectorFlexItemHighlightConfig> ToFlexItemHighlightConfig(protocol::Overlay::FlexItemHighlightConfig*); static absl::optional<LineStyle> ToLineStyle(protocol::Overlay::LineStyle*); @@ -238,6 +241,10 @@ std::unique_ptr< protocol::Array<protocol::Overlay::ScrollSnapHighlightConfig>> scroll_snap_highlight_configs) override; + protocol::Response setShowContainerQueryOverlays( + std::unique_ptr< + protocol::Array<protocol::Overlay::ContainerQueryHighlightConfig>> + container_query_highlight_configs) override; // InspectorBaseAgent overrides. void Restore() override;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index f61bb8e0..62f8d164 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2813,6 +2813,16 @@ } } +void LayoutObject::ClearBaseComputedStyle() { + NOT_DESTROYED(); + auto* element = DynamicTo<Element>(GetNode()); + if (!element) + return; + + if (ElementAnimations* animations = element->GetElementAnimations()) + animations->ClearBaseComputedStyle(); +} + static bool AreNonIdenticalCursorListsEqual(const ComputedStyle* a, const ComputedStyle* b) { DCHECK_NE(a->Cursors(), b->Cursors());
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 930ce9f..0b8f195 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2272,6 +2272,8 @@ void SetModifiedStyleOutsideStyleRecalc(scoped_refptr<const ComputedStyle>, ApplyStyleChanges); + void ClearBaseComputedStyle(); + // This function returns an enclosing non-anonymous LayoutBlock for this // element. This function is not always returning the containing block as // defined by CSS. In particular:
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.cc b/third_party/blink/renderer/core/layout/text_autosizer.cc index 0f2f89c6..c37fd886 100644 --- a/third_party/blink/renderer/core/layout/text_autosizer.cc +++ b/third_party/blink/renderer/core/layout/text_autosizer.cc
@@ -1266,6 +1266,8 @@ if (multiplier != 1) page_info_.has_autosized_ = true; + + layout_object->ClearBaseComputedStyle(); } bool TextAutosizer::IsWiderOrNarrowerDescendant(Cluster* cluster) {
diff --git a/third_party/blink/renderer/core/style/build.gni b/third_party/blink/renderer/core/style/build.gni index 667c628..424a49fc 100644 --- a/third_party/blink/renderer/core/style/build.gni +++ b/third_party/blink/renderer/core/style/build.gni
@@ -60,8 +60,6 @@ "shape_clip_path_operation.h", "shape_value.h", "style_aspect_ratio.h", - "style_base_data.h", - "style_base_data.cc", "style_cached_data.h", "style_content_alignment_data.h", "style_crossfade_image.cc", @@ -94,6 +92,8 @@ "style_ray.h", "style_reflection.h", "style_self_alignment_data.h", + "style_svg_resource.cc", + "style_svg_resource.h", "style_variables.cc", "style_variables.h", "svg_dash_array.cc",
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index 0aab0ada..2c2a14d 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -594,18 +594,6 @@ cached_data_->pseudo_element_styles_->clear(); } -const ComputedStyle* ComputedStyle::GetBaseComputedStyle() const { - if (auto* base_data = BaseData().get()) - return base_data->GetBaseComputedStyle(); - return nullptr; -} - -const CSSBitset* ComputedStyle::GetBaseImportantSet() const { - if (auto* base_data = BaseData().get()) - return base_data->GetBaseImportantSet(); - return nullptr; -} - bool ComputedStyle::InheritedEqual(const ComputedStyle& other) const { return IndependentInheritedEqual(other) && NonIndependentInheritedEqual(other); @@ -2114,9 +2102,6 @@ } void ComputedStyle::SetTextAutosizingMultiplier(float multiplier) { - if (TextAutosizingMultiplier() == multiplier) - return; - SetTextAutosizingMultiplierInternal(multiplier); float size = SpecifiedFontSize();
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index eea8a243..8273271 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -31,7 +31,6 @@ #include "base/types/pass_key.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_property_names.h" -#include "third_party/blink/renderer/core/css/properties/css_bitset.h" #include "third_party/blink/renderer/core/css/properties/css_property.h" #include "third_party/blink/renderer/core/css/style_auto_color.h" #include "third_party/blink/renderer/core/css/style_color.h" @@ -397,22 +396,6 @@ scoped_refptr<const ComputedStyle>) const; void ClearCachedPseudoElementStyles() const; - // If this ComputedStyle is affected by animation/transitions, then the - // unanimated "base" style can be retrieved with this function. - // - // If this function returns nullptr, then this ComputedStyle is not - // affected by animations, and *is* the base style. - CORE_EXPORT const ComputedStyle* GetBaseComputedStyle() const; - - // Indicates which properties are !important in the base style. - CORE_EXPORT const CSSBitset* GetBaseImportantSet() const; - - CORE_EXPORT const ComputedStyle* GetBaseComputedStyleOrThis() const { - if (auto* base = GetBaseComputedStyle()) - return base; - return this; - } - /** * ComputedStyle properties *
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 index e7ed32a..0100388f 100644 --- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 +++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -1113,17 +1113,5 @@ field_group: "*", default_value: "false", }, - { - name: "BaseData", - inherited: false, - field_group: "*", - field_template: "external", - type_name: "StyleBaseData", - include_paths: ["third_party/blink/renderer/core/style/style_base_data.h"], - default_value: "nullptr", - wrapper_pointer_name: "scoped_refptr", - custom_compare: true, - custom_copy: true, - }, ], }
diff --git a/third_party/blink/renderer/core/style/style_base_data.cc b/third_party/blink/renderer/core/style/style_base_data.cc deleted file mode 100644 index 476b3a4..0000000 --- a/third_party/blink/renderer/core/style/style_base_data.cc +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/style/style_base_data.h" -#include "third_party/blink/renderer/core/style/computed_style.h" - -namespace blink { - -StyleBaseData::StyleBaseData(scoped_refptr<const ComputedStyle> style, - std::unique_ptr<CSSBitset> set) - : computed_style_(style), important_set_(std::move(set)) {} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/style/style_base_data.h b/third_party/blink/renderer/core/style/style_base_data.h deleted file mode 100644 index eb547b19..0000000 --- a/third_party/blink/renderer/core/style/style_base_data.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_STYLE_BASE_DATA_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_STYLE_BASE_DATA_H_ - -#include "third_party/blink/renderer/core/css/properties/css_bitset.h" -#include "third_party/blink/renderer/platform/wtf/forward.h" -#include "third_party/blink/renderer/platform/wtf/ref_counted.h" - -namespace blink { - -class ComputedStyle; - -class CORE_EXPORT StyleBaseData : public RefCounted<StyleBaseData> { - USING_FAST_MALLOC(StyleBaseData); - - public: - static scoped_refptr<StyleBaseData> Create( - scoped_refptr<const ComputedStyle> style, - std::unique_ptr<CSSBitset> important_set) { - return base::AdoptRef(new StyleBaseData(style, std::move(important_set))); - } - - const ComputedStyle* GetBaseComputedStyle() const { - return computed_style_.get(); - } - const CSSBitset* GetBaseImportantSet() const { return important_set_.get(); } - - private: - StyleBaseData(scoped_refptr<const ComputedStyle>, std::unique_ptr<CSSBitset>); - - scoped_refptr<const ComputedStyle> computed_style_; - - // Keeps track of the !important declarations used to build the base - // computed style. These declarations must not be overwritten by animation - // effects, hence we have to disable the base computed style optimization when - // !important declarations conflict with active animations. - // - // If there were no !important declarations in the base style, this field - // will be nullptr. - // - // TODO(andruud): We should be able to simply skip applying the animation - // for properties in this set instead of disabling the optimization. - // However, we currently need the cascade to handle the case where - // an !important declaration appears in a :visited selector. - // See https://crbug.com/1062217. - std::unique_ptr<CSSBitset> important_set_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_STYLE_BASE_DATA_H_
diff --git a/third_party/blink/renderer/core/style/style_svg_resource.cc b/third_party/blink/renderer/core/style/style_svg_resource.cc new file mode 100644 index 0000000..55ea5c4 --- /dev/null +++ b/third_party/blink/renderer/core/style/style_svg_resource.cc
@@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/style/style_svg_resource.h" + +#include "third_party/blink/renderer/core/svg/svg_resource.h" + +namespace blink { + +StyleSVGResource::StyleSVGResource(SVGResource* resource, + const AtomicString& url) + : resource_(resource), url_(url) {} + +StyleSVGResource::~StyleSVGResource() = default; + +void StyleSVGResource::AddClient(SVGResourceClient& client) { + if (resource_) + resource_->AddClient(client); +} + +void StyleSVGResource::RemoveClient(SVGResourceClient& client) { + if (resource_) + resource_->RemoveClient(client); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/style/style_svg_resource.h b/third_party/blink/renderer/core/style/style_svg_resource.h index ec1a91f..18eab55 100644 --- a/third_party/blink/renderer/core/style/style_svg_resource.h +++ b/third_party/blink/renderer/core/style/style_svg_resource.h
@@ -6,13 +6,16 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_STYLE_SVG_RESOURCE_H_ #include "base/memory/scoped_refptr.h" -#include "third_party/blink/renderer/core/svg/svg_resource.h" +#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace blink { +class SVGResource; +class SVGResourceClient; + class StyleSVGResource : public RefCounted<StyleSVGResource> { USING_FAST_MALLOC(StyleSVGResource); @@ -21,26 +24,20 @@ const AtomicString& url) { return base::AdoptRef(new StyleSVGResource(resource, url)); } + CORE_EXPORT ~StyleSVGResource(); bool operator==(const StyleSVGResource& other) const { return resource_.Get() == other.resource_.Get(); } - void AddClient(SVGResourceClient& client) { - if (resource_) - resource_->AddClient(client); - } - void RemoveClient(SVGResourceClient& client) { - if (resource_) - resource_->RemoveClient(client); - } + void AddClient(SVGResourceClient& client); + void RemoveClient(SVGResourceClient& client); SVGResource* Resource() const { return resource_; } const AtomicString& Url() const { return url_; } private: - StyleSVGResource(SVGResource* resource, const AtomicString& url) - : resource_(resource), url_(url) {} + StyleSVGResource(SVGResource* resource, const AtomicString& url); Persistent<SVGResource> resource_; const AtomicString url_;
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc index b23ad21..ff2bf69b 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
@@ -851,12 +851,15 @@ // SVG Images are transparent. frame->View()->SetBaseBackgroundColor(Color::kTransparent); - page_ = page; - TRACE_EVENT0("blink", "SVGImage::dataChanged::load"); frame->ForceSynchronousDocumentInstall("image/svg+xml", Data()); + // Set up our Page reference after installing our document. This avoids + // tripping on a non-existing (null) Document if a GC is triggered during the + // set up and ends up collecting the last owner/observer of this image. + page_ = page; + // Intrinsic sizing relies on computed style (e.g. font-size and // writing-mode). frame->GetDocument()->UpdateStyleAndLayoutTree();
diff --git a/third_party/blink/renderer/core/typed_arrays/BUILD.gn b/third_party/blink/renderer/core/typed_arrays/BUILD.gn deleted file mode 100644 index 5ae3432..0000000 --- a/third_party/blink/renderer/core/typed_arrays/BUILD.gn +++ /dev/null
@@ -1,35 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/blink/renderer/core/core.gni") - -blink_core_sources("typed_arrays") { - configs += [ "//build/config/compiler:noshadowing" ] - - sources = [ - "array_buffer/array_buffer_contents.cc", - "array_buffer/array_buffer_contents.h", - "array_buffer_view_helpers.h", - "dom_array_buffer.cc", - "dom_array_buffer.h", - "dom_array_buffer_base.h", - "dom_array_buffer_view.cc", - "dom_array_buffer_view.h", - "dom_array_piece.cc", - "dom_array_piece.h", - "dom_data_view.cc", - "dom_data_view.h", - "dom_shared_array_buffer.cc", - "dom_shared_array_buffer.h", - "dom_typed_array.cc", - "dom_typed_array.h", - "flexible_array_buffer_view.h", - "typed_flexible_array_buffer_view.h", - ] - - deps = [ "//third_party/blink/renderer/core:core_generated" ] - - allow_circular_includes_from = - [ "//third_party/blink/renderer/core:core_generated" ] -}
diff --git a/third_party/blink/renderer/core/typed_arrays/build.gni b/third_party/blink/renderer/core/typed_arrays/build.gni new file mode 100644 index 0000000..39ef7d7 --- /dev/null +++ b/third_party/blink/renderer/core/typed_arrays/build.gni
@@ -0,0 +1,24 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +blink_core_sources_typed_arrays = [ + "array_buffer/array_buffer_contents.cc", + "array_buffer/array_buffer_contents.h", + "array_buffer_view_helpers.h", + "dom_array_buffer.cc", + "dom_array_buffer.h", + "dom_array_buffer_base.h", + "dom_array_buffer_view.cc", + "dom_array_buffer_view.h", + "dom_array_piece.cc", + "dom_array_piece.h", + "dom_data_view.cc", + "dom_data_view.h", + "dom_shared_array_buffer.cc", + "dom_shared_array_buffer.h", + "dom_typed_array.cc", + "dom_typed_array.h", + "flexible_array_buffer_view.h", + "typed_flexible_array_buffer_view.h", +]
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn index f6e59cf..26cc3459 100644 --- a/third_party/blink/renderer/modules/BUILD.gn +++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -5,7 +5,6 @@ import("//build/config/chromecast_build.gni") import("//testing/libfuzzer/fuzzer_test.gni") import("//third_party/blink/renderer/bindings/bindings.gni") -import("//third_party/blink/renderer/bindings/modules/v8/v8.gni") import("//third_party/blink/renderer/bindings/scripts/scripts.gni") import("//third_party/blink/renderer/build/scripts/scripts.gni") import("//third_party/blink/renderer/modules/modules.gni") @@ -36,7 +35,7 @@ "modules_initializer.h", ] - sources += bindings_modules_v8_files + sources += blink_modules_sources_bindings configs += [ ":modules_implementation",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 0d164be0..00caad3 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -3812,10 +3812,6 @@ return AXObject::AncestorsIterator(); } -AXObject::InOrderTraversalIterator AXObject::GetInOrderTraversalIterator() { - return InOrderTraversalIterator(*this); -} - int AXObject::ChildCountIncludingIgnored() const { return static_cast<int>(ChildrenIncludingIgnored().size()); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index 7dc6b1c..623847d4 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -176,98 +176,6 @@ public: typedef HeapVector<Member<AXObject>> AXObjectVector; - // Iterator for doing an in-order traversal of the accessibility tree. - // - // Includes objects that are ignored but included in the accessibility tree in - // the traversal. - class MODULES_EXPORT InOrderTraversalIterator final - : public GarbageCollected<InOrderTraversalIterator> { - public: - ~InOrderTraversalIterator() = default; - - InOrderTraversalIterator(const InOrderTraversalIterator& other) - : current_(other.current_), previous_(other.previous_) {} - - InOrderTraversalIterator& operator=(const InOrderTraversalIterator& other) { - current_ = other.current_; - previous_ = other.previous_; - return *this; - } - - InOrderTraversalIterator& operator++() { - previous_ = current_; - current_ = (current_ && !current_->IsDetached()) - ? current_->NextInPreOrderIncludingIgnored() - : nullptr; - return *this; - } - - InOrderTraversalIterator operator++(int) { - InOrderTraversalIterator ret = *this; - ++*this; - return ret; - } - - InOrderTraversalIterator& operator--() { - current_ = previous_; - previous_ = (current_ && !current_->IsDetached()) - ? current_->PreviousInPreOrderIncludingIgnored() - : nullptr; - return *this; - } - - InOrderTraversalIterator operator--(int) { - InOrderTraversalIterator ret = *this; - --*this; - return ret; - } - - AXObject& operator*() const { - DCHECK(current_); - return *current_; - } - - AXObject* operator->() const { - DCHECK(current_); - return static_cast<AXObject*>(current_); - } - - void Trace(Visitor* visitor) const { - visitor->Trace(current_); - visitor->Trace(previous_); - } - - MODULES_EXPORT friend void swap(InOrderTraversalIterator& left, - InOrderTraversalIterator& right) { - std::swap(left.current_, right.current_); - std::swap(left.previous_, right.previous_); - } - - MODULES_EXPORT friend bool operator==( - const InOrderTraversalIterator& left, - const InOrderTraversalIterator& right) { - return left.current_ == right.current_; - } - - MODULES_EXPORT friend bool operator!=( - const InOrderTraversalIterator& left, - const InOrderTraversalIterator& right) { - return !(left == right); - } - - private: - InOrderTraversalIterator() = default; - - explicit InOrderTraversalIterator(AXObject& current) - : current_(¤t), previous_(nullptr) {} - - friend class AXObject; - friend class AXObjectCacheImpl; - - Member<AXObject> current_; - Member<AXObject> previous_; - }; - // Iterator for the ancestors of an |AXObject|. // Walks through all the unignored parents of the object up to the root. // Does not include the object itself in the list of ancestors. @@ -953,12 +861,6 @@ AncestorsIterator UnignoredAncestorsBegin() const; AncestorsIterator UnignoredAncestorsEnd() const; - // Iterator for doing an in-order traversal of the accessibility tree. - // - // Includes nodes that are accessibility ignored but "included in tree" in the - // traversal. - InOrderTraversalIterator GetInOrderTraversalIterator(); - // Returns the number of children, including children that are included in the // accessibility tree but are accessibility ignored. //
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 4ea0187..1295b25 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1509,17 +1509,6 @@ return nullptr; } -AXObject::InOrderTraversalIterator AXObjectCacheImpl::InOrderTraversalBegin() { - AXObject* root = Root(); - if (root) - return AXObject::InOrderTraversalIterator(*root); - return InOrderTraversalEnd(); -} - -AXObject::InOrderTraversalIterator AXObjectCacheImpl::InOrderTraversalEnd() { - return AXObject::InOrderTraversalIterator(); -} - void AXObjectCacheImpl::UpdateNumTreeUpdatesQueuedBeforeLayoutHistogram() { UMA_HISTOGRAM_COUNTS_100000( "Blink.Accessibility.NumTreeUpdatesQueuedBeforeLayout",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index d6ff495..c001ba2 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -88,9 +88,6 @@ // Iterators. // - AXObject::InOrderTraversalIterator InOrderTraversalBegin(); - AXObject::InOrderTraversalIterator InOrderTraversalEnd(); - void SelectionChanged(Node*) override; void UpdateReverseRelations(const AXObject* relation_source, const Vector<String>& target_ids);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_test.cc index 9ce980be..379d4f8 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_test.cc
@@ -704,31 +704,6 @@ EXPECT_EQ(br->UnignoredAncestorsEnd(), ++iter); } -TEST_F(AccessibilityTest, AXObjectInOrderTraversalIterator) { - SetBodyInnerHTML(R"HTML(<input type="checkbox" id="checkbox">)HTML"); - - AXObject* root = GetAXRootObject(); - ASSERT_NE(nullptr, root); - AXObject* body = GetAXBodyObject(); - ASSERT_NE(nullptr, root); - AXObject* checkbox = GetAXObjectByElementId("checkbox"); - ASSERT_NE(nullptr, checkbox); - - AXObject::InOrderTraversalIterator iter = body->GetInOrderTraversalIterator(); - EXPECT_EQ(*body, *iter); - EXPECT_NE(GetAXObjectCache().InOrderTraversalEnd(), iter); - EXPECT_EQ(*checkbox, *++iter); - EXPECT_EQ(ax::mojom::Role::kCheckBox, iter->RoleValue()); - EXPECT_EQ(*checkbox, *iter++); - EXPECT_EQ(GetAXObjectCache().InOrderTraversalEnd(), iter); - EXPECT_EQ(*checkbox, *--iter); - EXPECT_EQ(*checkbox, *iter--); - --iter; // Skip the BODY element. - --iter; // Skip the HTML element. - EXPECT_EQ(ax::mojom::Role::kRootWebArea, iter->RoleValue()); - EXPECT_EQ(GetAXObjectCache().InOrderTraversalBegin(), iter); -} - TEST_F(AccessibilityTest, AxNodeObjectContainsHtmlAnchorElementUrl) { SetBodyInnerHTML(R"HTML(<a id="anchor" href="http://test.com">link</a>)HTML");
diff --git a/third_party/blink/renderer/modules/file_system_access/BUILD.gn b/third_party/blink/renderer/modules/file_system_access/BUILD.gn index e272321e..d416279 100644 --- a/third_party/blink/renderer/modules/file_system_access/BUILD.gn +++ b/third_party/blink/renderer/modules/file_system_access/BUILD.gn
@@ -10,6 +10,11 @@ "data_transfer_item_file_system_access.h", "file_system_access_error.cc", "file_system_access_error.h", + "file_system_access_file_delegate.h", + "file_system_access_incognito_file_delegate.cc", + "file_system_access_incognito_file_delegate.h", + "file_system_access_regular_file_delegate.cc", + "file_system_access_regular_file_delegate.h", "file_system_directory_handle.cc", "file_system_directory_handle.h", "file_system_directory_iterator.cc",
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h new file mode 100644 index 0000000..c884478 --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h
@@ -0,0 +1,35 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_FILE_DELEGATE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_FILE_DELEGATE_H_ + +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom-blink.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/platform/heap/handle.h" +namespace blink { + +class FileSystemAccessFileDelegate + : public GarbageCollected<FileSystemAccessFileDelegate> { + public: + virtual ~FileSystemAccessFileDelegate() = default; + + static FileSystemAccessFileDelegate* Create(base::File backing_file); + static FileSystemAccessFileDelegate* CreateForIncognito( + ExecutionContext* context, + mojo::PendingRemote<mojom::blink::FileSystemAccessFileDelegateHost> + incognito_file_remote); + + // TODO(crbug.com/1225653): Add file operation methods here. + + virtual bool IsValid() const = 0; + + // GarbageCollected + virtual void Trace(Visitor* visitor) const {} +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_FILE_DELEGATE_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc new file mode 100644 index 0000000..c17df70 --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
@@ -0,0 +1,39 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h" + +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h" +#include "third_party/blink/renderer/platform/heap/handle.h" + +namespace blink { + +FileSystemAccessFileDelegate* FileSystemAccessFileDelegate::CreateForIncognito( + ExecutionContext* context, + mojo::PendingRemote<mojom::blink::FileSystemAccessFileDelegateHost> + incognito_file_remote) { + return MakeGarbageCollected<FileSystemAccessIncognitoFileDelegate>( + context, std::move(incognito_file_remote), + base::PassKey<FileSystemAccessFileDelegate>()); +} + +FileSystemAccessIncognitoFileDelegate::FileSystemAccessIncognitoFileDelegate( + ExecutionContext* context, + mojo::PendingRemote<mojom::blink::FileSystemAccessFileDelegateHost> + incognito_file_remote, + base::PassKey<FileSystemAccessFileDelegate>) + : mojo_ptr_(context) { + mojo_ptr_.Bind(std::move(incognito_file_remote), + context->GetTaskRunner(TaskType::kMiscPlatformAPI)); + DCHECK(mojo_ptr_.is_bound()); +} + +void FileSystemAccessIncognitoFileDelegate::Trace(Visitor* visitor) const { + visitor->Trace(mojo_ptr_); + FileSystemAccessFileDelegate::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h new file mode 100644 index 0000000..958478a --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h
@@ -0,0 +1,44 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_INCOGNITO_FILE_DELEGATE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_INCOGNITO_FILE_DELEGATE_H_ + +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom-blink.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h" +#include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" + +namespace blink { + +class FileSystemAccessIncognitoFileDelegate final + : public FileSystemAccessFileDelegate { + public: + // Instances should only be constructed via + // `FileSystemAccessFileDelegate::CreateForIncognito()` + explicit FileSystemAccessIncognitoFileDelegate( + ExecutionContext* context, + mojo::PendingRemote<mojom::blink::FileSystemAccessFileDelegateHost> + incognito_file_remote, + base::PassKey<FileSystemAccessFileDelegate>); + + FileSystemAccessIncognitoFileDelegate( + const FileSystemAccessIncognitoFileDelegate&) = delete; + FileSystemAccessIncognitoFileDelegate& operator=( + const FileSystemAccessIncognitoFileDelegate&) = delete; + + bool IsValid() const override { return mojo_ptr_.is_bound(); } + + void Trace(Visitor*) const override; + + private: + // Used to route file operations to the browser. + HeapMojoRemote<mojom::blink::FileSystemAccessFileDelegateHost> mojo_ptr_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_INCOGNITO_FILE_DELEGATE_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc new file mode 100644 index 0000000..b4ea7f2 --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h" + +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "third_party/blink/renderer/platform/heap/handle.h" + +namespace blink { + +FileSystemAccessFileDelegate* FileSystemAccessFileDelegate::Create( + base::File backing_file) { + return MakeGarbageCollected<FileSystemAccessRegularFileDelegate>( + std::move(backing_file), base::PassKey<FileSystemAccessFileDelegate>()); +} + +FileSystemAccessRegularFileDelegate::FileSystemAccessRegularFileDelegate( + base::File backing_file, + base::PassKey<FileSystemAccessFileDelegate>) + : backing_file_(std::move(backing_file)) {} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h new file mode 100644 index 0000000..e3664d3 --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h
@@ -0,0 +1,39 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_REGULAR_FILE_DELEGATE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_REGULAR_FILE_DELEGATE_H_ + +#include "base/types/pass_key.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom-blink.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h" +#include "third_party/blink/renderer/platform/heap/handle.h" + +namespace blink { + +class FileSystemAccessRegularFileDelegate final + : public FileSystemAccessFileDelegate { + public: + // Instances should only be constructed via + // `FileSystemAccessFileDelegate::Create()` + explicit FileSystemAccessRegularFileDelegate( + base::File backing_file, + base::PassKey<FileSystemAccessFileDelegate>); + + FileSystemAccessRegularFileDelegate( + const FileSystemAccessRegularFileDelegate&) = delete; + FileSystemAccessRegularFileDelegate& operator=( + const FileSystemAccessRegularFileDelegate&) = delete; + + bool IsValid() const override { return backing_file_.IsValid(); } + + private: + // The file on disk backing the parent FileSystemFileHandle. + base::File backing_file_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_REGULAR_FILE_DELEGATE_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc index 50b8709..df7a886 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom-blink.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom-blink.h" @@ -13,6 +14,7 @@ #include "third_party/blink/renderer/core/fileapi/file.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" #include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h" #include "third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h" #include "third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -109,15 +111,35 @@ mojo_ptr_->OpenAccessHandle(WTF::Bind( [](ScriptPromiseResolver* resolver, FileSystemAccessErrorPtr result, - base::File file) { + mojom::blink::FileSystemAccessAccessHandleFilePtr file) { if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { file_system_access_error::Reject(resolver, *result); return; } - DCHECK(file.IsValid()) << "File should be valid when result is OK"; + DCHECK(!file.is_null()); - resolver->Resolve( - MakeGarbageCollected<FileSystemSyncAccessHandle>(std::move(file))); + FileSystemAccessFileDelegate* file_delegate = nullptr; + if (file->is_regular_file()) { + file_delegate = FileSystemAccessFileDelegate::Create( + std::move(file->get_regular_file())); + } else if (file->is_incognito_file_delegate()) { + ExecutionContext* context = resolver->GetExecutionContext(); + if (!context) + return; + file_delegate = FileSystemAccessFileDelegate::CreateForIncognito( + context, std::move(file->get_incognito_file_delegate())); + } + + if (!file_delegate || !file_delegate->IsValid()) { + file_system_access_error::Reject( + resolver, + *mojom::blink::FileSystemAccessError::New( + mojom::blink::FileSystemAccessStatus::kFileError, + base::File::Error::FILE_ERROR_FAILED, "File not valid")); + return; + } + resolver->Resolve(MakeGarbageCollected<FileSystemSyncAccessHandle>( + std::move(file_delegate))); }, WrapPersistent(resolver)));
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc index deab45f..03a1446 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
@@ -6,11 +6,13 @@ namespace blink { -FileSystemSyncAccessHandle::FileSystemSyncAccessHandle(base::File backing_file) - : backing_file_(std::move(backing_file)) {} +FileSystemSyncAccessHandle::FileSystemSyncAccessHandle( + FileSystemAccessFileDelegate* file_delegate) + : file_delegate_(file_delegate) {} void FileSystemSyncAccessHandle::Trace(Visitor* visitor) const { ScriptWrappable::Trace(visitor); + visitor->Trace(file_delegate_); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h index 14b080a..c752e79 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_SYNC_ACCESS_HANDLE_H_ #include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom-blink.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" namespace blink { @@ -14,7 +15,8 @@ DEFINE_WRAPPERTYPEINFO(); public: - explicit FileSystemSyncAccessHandle(base::File backing_file); + explicit FileSystemSyncAccessHandle( + FileSystemAccessFileDelegate* file_delegate); FileSystemSyncAccessHandle(const FileSystemSyncAccessHandle&) = delete; FileSystemSyncAccessHandle& operator=(const FileSystemSyncAccessHandle&) = @@ -24,8 +26,7 @@ void Trace(Visitor* visitor) const override; private: - // The file on disk backing the parent FileSystemFileHandle. - base::File backing_file_; + Member<FileSystemAccessFileDelegate> file_delegate_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc index b0d5dae..5a1e99ea 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -330,11 +330,10 @@ WebFeature:: kRTCPeerConnectionSdpSemanticsPlanBWithReverseOriginTrial); } else { - // The deadline is not being extended (e.g. Deprecation Trial is not - // active). In this case, throw an exception unless the kill switch is - // enabled. - if (!base::FeatureList::IsEnabled( - features::kRTCAllowPlanBOutsideDeprecationTrial)) { + // The Deprecation Trial is not active. In this case, throw an exception + // if RTCDisallowPlanBOutsideDeprecationTrial is enabled. + if (base::FeatureList::IsEnabled( + features::kRTCDisallowPlanBOutsideDeprecationTrial)) { // Throw Plan B exception! UseCounter::Count( context, WebFeature::kRTCPeerConnectionPlanBThrewAnException); @@ -344,11 +343,11 @@ "Description Protocol that has severe compatibility issues on " "modern browsers and is no longer supported. See " "https://www.chromestatus.com/feature/5823036655665152 for more " - "details, including the possibility of registering to a " + "details, including the possibility of registering for a " "Deprecation Trial in order to extend the Plan B deprecation " "deadline for a limited amount of time."); } else { - // The kill-switch prevented throwing. + // Throwing is not enabled, so just show a deprecation warning. Deprecation::CountDeprecation( context, WebFeature::kRTCPeerConnectionSdpSemanticsPlanB); }
diff --git a/third_party/blink/renderer/modules/storage/BUILD.gn b/third_party/blink/renderer/modules/storage/BUILD.gn index b2236f54..01d50276 100644 --- a/third_party/blink/renderer/modules/storage/BUILD.gn +++ b/third_party/blink/renderer/modules/storage/BUILD.gn
@@ -27,33 +27,9 @@ ] } -component("blink_storage_key") { - visibility = [ - ":*", - "//third_party/blink/public/mojom:mojom_modules_blink", - ] - - sources = [ - "blink_storage_key.cc", - "blink_storage_key.h", - "blink_storage_key_mojom_traits.cc", - "blink_storage_key_mojom_traits.h", - ] - - defines = [ "IS_MODULES_STORAGE_BLINK_STORAGE_KEY_IMPL" ] - - deps = [ - "//third_party/blink/public/mojom:mojom_modules_shared", - "//third_party/blink/renderer/platform", - "//url/mojom:url_mojom_origin", - ] -} - source_set("unit_tests") { testonly = true sources = [ - "blink_storage_key_mojom_traits_test.cc", - "blink_storage_key_test.cc", "cached_storage_area_test.cc", "storage_area_map_test.cc", "storage_controller_test.cc", @@ -70,8 +46,6 @@ ] deps = [ - ":blink_storage_key", - "//mojo/public/cpp/test_support:test_utils", "//testing/gmock", "//testing/gtest", "//third_party/blink/public:test_headers",
diff --git a/third_party/blink/renderer/modules/webgl/DEPS b/third_party/blink/renderer/modules/webgl/DEPS index 4e7a58f..f890dcc 100644 --- a/third_party/blink/renderer/modules/webgl/DEPS +++ b/third_party/blink/renderer/modules/webgl/DEPS
@@ -5,6 +5,7 @@ "+gpu/command_buffer/client/gles2_interface.h", "+gpu/command_buffer/client/raster_interface.h", "+gpu/command_buffer/common/capabilities.h", + "+gpu/config/gpu_driver_bug_workaround_type.h", "+gpu/config/gpu_feature_info.h", "+media/base/video_frame.h", "+media/base/wait_and_replace_sync_token_client.h",
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc index 0abf045..b3ea0f1c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
@@ -147,7 +147,9 @@ // Register extensions. RegisterExtension(ext_color_buffer_float_); RegisterExtension(ext_color_buffer_half_float_); - RegisterExtension(ext_disjoint_timer_query_web_gl2_); + RegisterExtension( + ext_disjoint_timer_query_web_gl2_, + TimerQueryExtensionsEnabled() ? kApprovedExtension : kDeveloperExtension); RegisterExtension(ext_float_blend_); RegisterExtension(ext_texture_compression_bptc_); RegisterExtension(ext_texture_compression_rgtc_);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc index c3ac9ab..befbb40a 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
@@ -177,7 +177,9 @@ RegisterExtension(angle_instanced_arrays_); RegisterExtension(ext_blend_min_max_); RegisterExtension(ext_color_buffer_half_float_); - RegisterExtension(ext_disjoint_timer_query_); + RegisterExtension(ext_disjoint_timer_query_, TimerQueryExtensionsEnabled() + ? kApprovedExtension + : kDeveloperExtension); RegisterExtension(ext_float_blend_); RegisterExtension(ext_frag_depth_); RegisterExtension(ext_shader_texture_lod_);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 37c50c8..4b6c92a 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -35,6 +35,7 @@ #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/common/capabilities.h" +#include "gpu/config/gpu_driver_bug_workaround_type.h" #include "gpu/config/gpu_feature_info.h" #include "media/base/video_frame.h" #include "media/renderers/paint_canvas_video_renderer.h" @@ -3122,6 +3123,9 @@ if (tracker->Draft() && !RuntimeEnabledFeatures::WebGLDraftExtensionsEnabled()) return false; + if (tracker->Developer() && + !RuntimeEnabledFeatures::WebGLDeveloperExtensionsEnabled()) + return false; if (!tracker->Supported(this)) return false; if (disabled_extensions_.Contains(String(tracker->ExtensionName()))) @@ -3129,6 +3133,13 @@ return true; } +bool WebGLRenderingContextBase::TimerQueryExtensionsEnabled() { + return (drawing_buffer_ && drawing_buffer_->ContextProvider() && + drawing_buffer_->ContextProvider() + ->GetGpuFeatureInfo() + .IsWorkaroundEnabled(gpu::ENABLE_WEBGL_TIMER_QUERY_EXTENSIONS)); +} + ScriptValue WebGLRenderingContextBase::getExtension(ScriptState* script_state, const String& name) { WebGLExtension* extension = nullptr;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index a6b145c..d092a3e3 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -912,16 +912,22 @@ kApprovedExtension = 0x00, // Extension that is behind the draft extensions runtime flag: kDraftExtension = 0x01, + // Extension that is intended for development rather than + // deployment time. + kDeveloperExtension = 0x02, }; class ExtensionTracker : public GarbageCollected<ExtensionTracker>, public NameClient { public: ExtensionTracker(ExtensionFlags flags, const char* const* prefixes) - : draft_(flags & kDraftExtension), prefixes_(prefixes) {} + : draft_(flags & kDraftExtension), + developer_(flags & kDeveloperExtension), + prefixes_(prefixes) {} ~ExtensionTracker() override = default; bool Draft() const { return draft_; } + bool Developer() const { return developer_; } const char* const* Prefixes() const; bool MatchesNameWithPrefixes(const String&) const; @@ -941,6 +947,7 @@ private: bool draft_; + bool developer_; const char* const* prefixes_; }; @@ -1010,6 +1017,8 @@ return extension_enabled_[name]; } + bool TimerQueryExtensionsEnabled(); + // ScopedDrawingBufferBinder is used for // ReadPixels/CopyTexImage2D/CopySubImage2D to read from a multisampled // DrawingBuffer. In this situation, we need to blit to a single sampled
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index e824121..32eafdaf 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1373,6 +1373,9 @@ "resolution_units.h", "search_engine_utils.cc", "search_engine_utils.h", + "storage/blink_storage_key.cc", + "storage/blink_storage_key.h", + "storage/blink_storage_key_mojom_traits.cc", "supplementable.cc", "supplementable.h", "text/bidi_character_run.h", @@ -2167,6 +2170,8 @@ "peerconnection/webrtc_encoding_info_handler_test.cc", "peerconnection/webrtc_video_track_source_test.cc", "runtime_enabled_features_test.cc", + "storage/blink_storage_key_mojom_traits_test.cc", + "storage/blink_storage_key_test.cc", "text/bidi_resolver_test.cc", "text/bidi_test_harness.h", "text/capitalize_test.cc",
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc index 73d71b20..d4ab107 100644 --- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc +++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -348,6 +348,10 @@ RuntimeEnabledFeatures::SetScrollUnificationEnabled(enable); } +void WebRuntimeFeatures::EnableWebGLDeveloperExtensions(bool enable) { + RuntimeEnabledFeatures::SetWebGLDeveloperExtensionsEnabled(enable); +} + void WebRuntimeFeatures::EnableWebGLDraftExtensions(bool enable) { RuntimeEnabledFeatures::SetWebGLDraftExtensionsEnabled(enable); }
diff --git a/third_party/blink/renderer/platform/heap/test/blink_gc_memory_dump_provider_test.cc b/third_party/blink/renderer/platform/heap/test/blink_gc_memory_dump_provider_test.cc index 641087c5..812801e 100644 --- a/third_party/blink/renderer/platform/heap/test/blink_gc_memory_dump_provider_test.cc +++ b/third_party/blink/renderer/platform/heap/test/blink_gc_memory_dump_provider_test.cc
@@ -118,7 +118,7 @@ size_t workers_found = 0; for (const auto& kvp : dump->allocator_dumps()) { - if (kvp.first.find("blink_gc/workers/heap") != std::string::npos) { + if (kvp.first.find("blink_gc/workers/") != std::string::npos) { workers_found++; CheckBasicHeapDumpStructure(dump->GetAllocatorDump(kvp.first)); } @@ -137,13 +137,18 @@ BlinkGCMemoryDumpProvider::HeapType::kBlinkWorkerThread)); dump_provider->OnMemoryDump(args, dump.get()); - // There should be no main thread heap dump available. - ASSERT_EQ(nullptr, dump->GetAllocatorDump("blink_gc/main/heap")); +#if BUILDFLAG(USE_V8_OILPAN) + const std::string worker_path_prefix = "blink_gc/workers"; + const std::string worker_path_suffix = "/heap"; +#else // !USE_V8_OILPAN + const std::string worker_path_prefix = "blink_gc/workers/heap"; + const std::string worker_path_suffix = ""; +#endif // !USE_V8_OILPAN // Find worker suffix. std::string worker_suffix; for (const auto& kvp : dump->allocator_dumps()) { - if (kvp.first.find("blink_gc/workers/heap/worker_0x") != + if (kvp.first.find(worker_path_prefix + "/worker_0x") != std::string::npos) { auto start_pos = kvp.first.find("_0x"); auto end_pos = kvp.first.find("/", start_pos); @@ -151,7 +156,7 @@ } } std::string worker_base_path = - "blink_gc/workers/heap/worker_" + worker_suffix; + worker_path_prefix + "/worker_" + worker_suffix + worker_path_suffix; CheckBasicHeapDumpStructure(dump->GetAllocatorDump(worker_base_path)); IterateMemoryDumps(*dump, worker_base_path + "/",
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index e9e6fc75..df172112 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2384,6 +2384,10 @@ status: "experimental", }, { + name: "WebGLDeveloperExtensions", + status: "experimental", + }, + { name: "WebGLDraftExtensions", status: "experimental", },
diff --git a/third_party/blink/renderer/platform/scheduler/common/features.h b/third_party/blink/renderer/platform/scheduler/common/features.h index 53ce0ff..94a5883c 100644 --- a/third_party/blink/renderer/platform/scheduler/common/features.h +++ b/third_party/blink/renderer/platform/scheduler/common/features.h
@@ -201,6 +201,11 @@ "MbiCompositorTaskRunnerPerAgentSchedulingGroup", base::FEATURE_DISABLED_BY_DEFAULT}; +// If enabled, Javascript timers are throttled to 1 wake up per 100ms on +// foreground pages. +const base::Feature kThrottleForegroundTimers{ + "ThrottleForegroundTimers", base::FEATURE_DISABLED_BY_DEFAULT}; + // Deprioritizes JS timer tasks during a particular phase of page loading. PLATFORM_EXPORT extern const base::Feature kDeprioritizeDOMTimersDuringPageLoading;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc index efb242b..8e7744f6 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -290,8 +290,36 @@ task_queue->GetTaskQueue()); } - parent_page_scheduler_->RemoveQueueFromWakeUpBudgetPool( - task_queue, frame_origin_type_, &lazy_now); + parent_page_scheduler_->RemoveQueueFromWakeUpBudgetPool(task_queue, + &lazy_now); +} + +void FrameSchedulerImpl::MoveTaskQueuesToCorrectWakeUpBudgetPool() { + base::sequence_manager::LazyNow lazy_now( + main_thread_scheduler_->tick_clock()); + + // The WakeUpBudgetPool is selected based on origin state, frame visibility + // and page background state. + // + // For each throttled queue, check if it should be in a different + // WakeUpBudgetPool and make the necessary adjustments. + for (const auto& task_queue_and_voter : + frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { + auto* task_queue = task_queue_and_voter.first; + if (!task_queue->CanBeThrottled()) + continue; + + auto* new_wake_up_budget_pool = parent_page_scheduler_->GetWakeUpBudgetPool( + task_queue, frame_origin_type_, frame_visible_); + if (task_queue->GetWakeUpBudgetPool() == new_wake_up_budget_pool) { + continue; + } + + parent_page_scheduler_->RemoveQueueFromWakeUpBudgetPool(task_queue, + &lazy_now); + parent_page_scheduler_->AddQueueToWakeUpBudgetPool( + task_queue, frame_origin_type_, frame_visible_, &lazy_now); + } } void FrameSchedulerImpl::SetFrameVisible(bool frame_visible) { @@ -300,6 +328,8 @@ return; UMA_HISTOGRAM_BOOLEAN("RendererScheduler.IPC.FrameVisibility", frame_visible); frame_visible_ = frame_visible; + + MoveTaskQueuesToCorrectWakeUpBudgetPool(); UpdatePolicy(); } @@ -314,39 +344,13 @@ return; } - base::sequence_manager::LazyNow lazy_now( - main_thread_scheduler_->tick_clock()); - - // Remove throttleable TaskQueues from their current WakeUpBudgetPool. - // - // The WakeUpBudgetPool is selected based on origin. TaskQueues are reinserted - // in the appropriate WakeUpBudgetPool at the end of this method, after the - // |frame_origin_type_| is updated. - for (const auto& task_queue_and_voter : - frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { - if (task_queue_and_voter.first->CanBeThrottled()) { - parent_page_scheduler_->RemoveQueueFromWakeUpBudgetPool( - task_queue_and_voter.first, frame_origin_type_, &lazy_now); - } - } - - // Update the FrameOriginType. if (cross_origin) { frame_origin_type_ = FrameOriginType::kCrossOriginToMainFrame; } else { frame_origin_type_ = FrameOriginType::kSameOriginToMainFrame; } - // Add throttleable TaskQueues to WakeUpBudgetPool that corresponds to the - // updated |frame_origin_type_|. - for (const auto& task_queue_and_voter : - frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { - if (task_queue_and_voter.first->CanBeThrottled()) { - parent_page_scheduler_->AddQueueToWakeUpBudgetPool( - task_queue_and_voter.first, frame_origin_type_, &lazy_now); - } - } - + MoveTaskQueuesToCorrectWakeUpBudgetPool(); UpdatePolicy(); } @@ -1012,6 +1016,8 @@ bool FrameSchedulerImpl::ShouldThrottleTaskQueues() const { DCHECK(parent_page_scheduler_); + if (parent_page_scheduler_->ThrottleForegroundTimers()) + return true; if (!RuntimeEnabledFeatures::TimerThrottlingForBackgroundTabsEnabled()) return false; if (parent_page_scheduler_->IsAudioPlaying()) @@ -1268,7 +1274,7 @@ } parent_page_scheduler_->AddQueueToWakeUpBudgetPool( - task_queue, frame_origin_type_, &lazy_now); + task_queue, frame_origin_type_, frame_visible_, &lazy_now); if (task_queues_throttled_) { MainThreadTaskQueue::ThrottleHandle handle = task_queue->Throttle();
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h index c56bc1f..0298205 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h
@@ -296,6 +296,8 @@ void NotifyDelegateAboutFeaturesAfterCurrentTask(); + void MoveTaskQueuesToCorrectWakeUpBudgetPool(); + // Create QueueTraits for the default (non-finch) task queues. static MainThreadTaskQueue::QueueTraits ThrottleableTaskQueueTraits(); static MainThreadTaskQueue::QueueTraits DeferrableTaskQueueTraits();
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc index 6786c77..76f3c563 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
@@ -3919,6 +3919,176 @@ EXPECT_THAT(run_times, testing::ElementsAre(start)); } +class FrameSchedulerImplThrottleForegroundTimersEnabledTest + : public FrameSchedulerImplTest { + public: + FrameSchedulerImplThrottleForegroundTimersEnabledTest() + : FrameSchedulerImplTest({kThrottleForegroundTimers}, {}) {} +}; + +TEST_F(FrameSchedulerImplThrottleForegroundTimersEnabledTest, + ForegroundPageTimerThrottling) { + page_scheduler_->SetPageVisible(true); + + // Snap the time to a multiple of 1 second. + FastForwardToAlignedTime(base::TimeDelta::FromSeconds(1)); + const base::TimeTicks start = base::TimeTicks::Now(); + + std::vector<base::TimeTicks> run_times; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner = + frame_scheduler_->GetTaskRunner( + TaskType::kJavascriptTimerDelayedLowNesting); + + for (int i = 0; i < 5; i++) { + task_runner->PostDelayedTask(FROM_HERE, + base::BindOnce(&RecordRunTime, &run_times), + base::TimeDelta::FromMilliseconds(50) * i); + } + + // Make posted tasks run. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(5)); + + EXPECT_THAT(run_times, + testing::ElementsAre( + start, start + base::TimeDelta::FromMilliseconds(100), + start + base::TimeDelta::FromMilliseconds(100), + start + base::TimeDelta::FromMilliseconds(200), + start + base::TimeDelta::FromMilliseconds(200))); +} + +// Make sure the normal throttling (1 wake up per second) is applied when the +// page becomes non-visible +TEST_F(FrameSchedulerImplThrottleForegroundTimersEnabledTest, + BackgroundPageTimerThrottling) { + page_scheduler_->SetPageVisible(false); + + // Snap the time to a multiple of 1 second. + FastForwardToAlignedTime(base::TimeDelta::FromSeconds(1)); + const base::TimeTicks start = base::TimeTicks::Now(); + + std::vector<base::TimeTicks> run_times; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner = + frame_scheduler_->GetTaskRunner( + TaskType::kJavascriptTimerDelayedLowNesting); + + for (int i = 0; i < 5; i++) { + task_runner->PostDelayedTask(FROM_HERE, + base::BindOnce(&RecordRunTime, &run_times), + base::TimeDelta::FromMilliseconds(50) * i); + } + + // Make posted tasks run. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(5)); + + EXPECT_THAT(run_times, + testing::ElementsAre( + start, start + base::TimeDelta::FromMilliseconds(1000), + start + base::TimeDelta::FromMilliseconds(1000), + start + base::TimeDelta::FromMilliseconds(1000), + start + base::TimeDelta::FromMilliseconds(1000))); +} + +TEST_F(FrameSchedulerImplThrottleForegroundTimersEnabledTest, + HiddenAudiblePageimerThrottling) { + page_scheduler_->SetPageVisible(false); + page_scheduler_->AudioStateChanged(/*is_audio_playing=*/true); + + // Snap the time to a multiple of 1 second. + FastForwardToAlignedTime(base::TimeDelta::FromSeconds(1)); + const base::TimeTicks start = base::TimeTicks::Now(); + + std::vector<base::TimeTicks> run_times; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner = + frame_scheduler_->GetTaskRunner( + TaskType::kJavascriptTimerDelayedLowNesting); + + for (int i = 0; i < 5; i++) { + task_runner->PostDelayedTask(FROM_HERE, + base::BindOnce(&RecordRunTime, &run_times), + base::TimeDelta::FromMilliseconds(50) * i); + } + + // Make posted tasks run. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(5)); + + EXPECT_THAT(run_times, + testing::ElementsAre( + start, start + base::TimeDelta::FromMilliseconds(100), + start + base::TimeDelta::FromMilliseconds(100), + start + base::TimeDelta::FromMilliseconds(200), + start + base::TimeDelta::FromMilliseconds(200))); +} + +TEST_F(FrameSchedulerImplThrottleForegroundTimersEnabledTest, + VisibleCrossOriginFrameThrottling) { + std::unique_ptr<FrameSchedulerImpl> cross_origin_frame_scheduler = + CreateFrameScheduler(page_scheduler_.get(), + frame_scheduler_delegate_.get(), nullptr, + FrameScheduler::FrameType::kSubframe); + page_scheduler_->SetPageVisible(true); + cross_origin_frame_scheduler->SetCrossOriginToMainFrame(true); + const scoped_refptr<base::SingleThreadTaskRunner> cross_origin_task_runner = + cross_origin_frame_scheduler->GetTaskRunner( + TaskType::kJavascriptTimerDelayedLowNesting); + + cross_origin_frame_scheduler->SetFrameVisible(true); + // Snap the time to a multiple of 1 second. + FastForwardToAlignedTime(base::TimeDelta::FromSeconds(1)); + const base::TimeTicks start = base::TimeTicks::Now(); + + std::vector<base::TimeTicks> run_times; + for (int i = 0; i < 5; i++) { + cross_origin_task_runner->PostDelayedTask( + FROM_HERE, base::BindOnce(&RecordRunTime, &run_times), + base::TimeDelta::FromMilliseconds(50) * i); + } + + // Make posted tasks run. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(5)); + + EXPECT_THAT(run_times, + testing::ElementsAre( + start, start + base::TimeDelta::FromMilliseconds(100), + start + base::TimeDelta::FromMilliseconds(100), + start + base::TimeDelta::FromMilliseconds(200), + start + base::TimeDelta::FromMilliseconds(200))); +} + +TEST_F(FrameSchedulerImplThrottleForegroundTimersEnabledTest, + HiddenCrossOriginFrameThrottling) { + std::unique_ptr<FrameSchedulerImpl> cross_origin_frame_scheduler = + CreateFrameScheduler(page_scheduler_.get(), + frame_scheduler_delegate_.get(), nullptr, + FrameScheduler::FrameType::kSubframe); + page_scheduler_->SetPageVisible(true); + cross_origin_frame_scheduler->SetCrossOriginToMainFrame(true); + const scoped_refptr<base::SingleThreadTaskRunner> cross_origin_task_runner = + cross_origin_frame_scheduler->GetTaskRunner( + TaskType::kJavascriptTimerDelayedLowNesting); + + cross_origin_frame_scheduler->SetFrameVisible(false); + // Snap the time to a multiple of 1 second. + FastForwardToAlignedTime(base::TimeDelta::FromSeconds(1)); + const base::TimeTicks start = base::TimeTicks::Now(); + + std::vector<base::TimeTicks> run_times; + for (int i = 0; i < 5; i++) { + cross_origin_task_runner->PostDelayedTask( + FROM_HERE, base::BindOnce(&RecordRunTime, &run_times), + base::TimeDelta::FromMilliseconds(50) * i); + } + + // Make posted tasks run. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(5)); + + EXPECT_THAT(run_times, + testing::ElementsAre( + start, start + base::TimeDelta::FromMilliseconds(1000), + start + base::TimeDelta::FromMilliseconds(1000), + start + base::TimeDelta::FromMilliseconds(1000), + start + base::TimeDelta::FromMilliseconds(1000))); +} + } // namespace frame_scheduler_impl_unittest } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc index eed8a8c6..b96b998 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.cc
@@ -128,7 +128,9 @@ } } -MainThreadTaskQueue::~MainThreadTaskQueue() = default; +MainThreadTaskQueue::~MainThreadTaskQueue() { + DCHECK(!wake_up_budget_pool_); +} void MainThreadTaskQueue::OnTaskStarted( const base::sequence_manager::Task& task, @@ -290,6 +292,11 @@ } } +void MainThreadTaskQueue::SetWakeUpBudgetPool( + WakeUpBudgetPool* wake_up_budget_pool) { + wake_up_budget_pool_ = wake_up_budget_pool; +} + void MainThreadTaskQueue::WriteIntoTrace(perfetto::TracedValue context) const { auto dict = std::move(context).WriteDictionary(); dict.Add("type", queue_type_);
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h index 76b6985..f2c0ba4 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h
@@ -491,6 +491,9 @@ // notify the throttler that this queue should wake immediately. void SetImmediateWakeUpForTest(); + void SetWakeUpBudgetPool(WakeUpBudgetPool* wake_up_budget_pool); + WakeUpBudgetPool* GetWakeUpBudgetPool() const { return wake_up_budget_pool_; } + base::WeakPtr<MainThreadTaskQueue> AsWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } @@ -558,6 +561,9 @@ // be set to a different value afterwards (except in tests). FrameSchedulerImpl* frame_scheduler_; // NOT OWNED + // The WakeUpBudgetPool for this TaskQueue, if any. + WakeUpBudgetPool* wake_up_budget_pool_{nullptr}; // NOT OWNED + base::WeakPtrFactory<MainThreadTaskQueue> weak_ptr_factory_{this}; };
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc index 4068d09..ce611e0c 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -174,6 +174,8 @@ constexpr base::TimeDelta PageSchedulerImpl::kDefaultThrottledWakeUpInterval; constexpr base::TimeDelta PageSchedulerImpl::kIntensiveThrottledWakeUpInterval; +constexpr base::TimeDelta + PageSchedulerImpl::kForegroundPagesThrottledWakeUpInterval; PageSchedulerImpl::PageSchedulerImpl( PageScheduler::Delegate* delegate, @@ -199,7 +201,9 @@ freeze_on_network_idle_enabled_(base::FeatureList::IsEnabled( blink::features::kFreezeBackgroundTabOnNetworkIdle)), delay_for_background_and_network_idle_tab_freezing_( - GetDelayForBackgroundAndNetworkIdleTabFreezing()) { + GetDelayForBackgroundAndNetworkIdleTabFreezing()), + throttle_foreground_timers_( + base::FeatureList::IsEnabled(kThrottleForegroundTimers)) { page_lifecycle_state_tracker_ = std::make_unique<PageLifecycleStateTracker>( this, kDefaultPageVisibility == PageVisibilityState::kVisible ? PageLifecycleState::kActive @@ -277,6 +281,7 @@ for (FrameSchedulerImpl* frame_scheduler : frame_schedulers_) frame_scheduler->SetPageVisibilityForTracing(page_visibility_); + MoveTaskQueuesToCorrectWakeUpBudgetPoolAndUpdate(); UpdatePolicyOnVisibilityChange(NotificationPolicy::kDoNotNotifyFrames); NotifyFrames(); @@ -500,6 +505,7 @@ SetPageFrozenImpl(false, NotificationPolicy::kDoNotNotifyFrames); NotifyFrames(); main_thread_scheduler_->OnAudioStateChanged(); + MoveTaskQueuesToCorrectWakeUpBudgetPoolAndUpdate(); } else { if (audio_state_ != AudioState::kAudible) return; @@ -522,6 +528,7 @@ if (IsBackgrounded()) { page_lifecycle_state_tracker_->SetPageLifecycleState( PageLifecycleState::kHiddenBackgrounded); + MoveTaskQueuesToCorrectWakeUpBudgetPoolAndUpdate(); } if (ShouldFreezePage()) { main_thread_scheduler_->ControlTaskRunner()->PostDelayedTask( @@ -635,35 +642,49 @@ void PageSchedulerImpl::AddQueueToWakeUpBudgetPool( MainThreadTaskQueue* task_queue, FrameOriginType frame_origin_type, + bool frame_visible, base::sequence_manager::LazyNow* lazy_now) { - task_queue->AddToBudgetPool( - lazy_now->Now(), GetWakeUpBudgetPool(task_queue, frame_origin_type)); + DCHECK(!task_queue->GetWakeUpBudgetPool()); + WakeUpBudgetPool* wake_up_budget_pool = + GetWakeUpBudgetPool(task_queue, frame_origin_type, frame_visible); + task_queue->AddToBudgetPool(lazy_now->Now(), wake_up_budget_pool); + task_queue->SetWakeUpBudgetPool(wake_up_budget_pool); } void PageSchedulerImpl::RemoveQueueFromWakeUpBudgetPool( MainThreadTaskQueue* task_queue, - FrameOriginType frame_origin_type, base::sequence_manager::LazyNow* lazy_now) { - task_queue->RemoveFromBudgetPool( - lazy_now->Now(), GetWakeUpBudgetPool(task_queue, frame_origin_type)); + if (!task_queue->GetWakeUpBudgetPool()) + return; + task_queue->RemoveFromBudgetPool(lazy_now->Now(), + task_queue->GetWakeUpBudgetPool()); + task_queue->SetWakeUpBudgetPool(nullptr); } WakeUpBudgetPool* PageSchedulerImpl::GetWakeUpBudgetPool( MainThreadTaskQueue* task_queue, - FrameOriginType frame_origin_type) { - if (!task_queue->CanBeIntensivelyThrottled()) - return normal_wake_up_budget_pool_; + FrameOriginType frame_origin_type, + bool frame_visible) { + const bool can_be_intensively_throttled = + task_queue->CanBeIntensivelyThrottled(); + const bool is_same_origin = + frame_origin_type == FrameOriginType::kMainFrame || + frame_origin_type == FrameOriginType::kSameOriginToMainFrame; - switch (frame_origin_type) { - case FrameOriginType::kMainFrame: - case FrameOriginType::kSameOriginToMainFrame: - return same_origin_intensive_wake_up_budget_pool_; - case FrameOriginType::kCrossOriginToMainFrame: - return cross_origin_intensive_wake_up_budget_pool_; - case FrameOriginType::kCount: - NOTREACHED(); - return nullptr; + if (IsBackgrounded()) { + if (can_be_intensively_throttled) { + if (is_same_origin) + return same_origin_intensive_wake_up_budget_pool_; + else + return cross_origin_intensive_wake_up_budget_pool_; + } + return normal_wake_up_budget_pool_; } + + if (!is_same_origin && !frame_visible) + return cross_origin_hidden_normal_wake_up_budget_pool_; + + return normal_wake_up_budget_pool_; } CPUTimeBudgetPool* PageSchedulerImpl::background_cpu_time_budget_pool() { @@ -708,6 +729,10 @@ normal_wake_up_budget_pool_ = main_thread_scheduler_->task_queue_throttler()->CreateWakeUpBudgetPool( "Page - Normal Wake Up Throttling"); + cross_origin_hidden_normal_wake_up_budget_pool_ = + main_thread_scheduler_->task_queue_throttler()->CreateWakeUpBudgetPool( + "Page - Normal Wake Up Throttling - Hidden & Crosss-Origin to Main " + "Frame"); same_origin_intensive_wake_up_budget_pool_ = main_thread_scheduler_->task_queue_throttler()->CreateWakeUpBudgetPool( "Page - Intensive Wake Up Throttling - Same-Origin as Main Frame"); @@ -759,7 +784,6 @@ are_wake_ups_intensively_throttled_ = false; do_intensively_throttle_wake_ups_callback_.Cancel(); - UpdateWakeUpBudgetPools(&lazy_now); } else { if (cpu_time_budget_pool_) { main_thread_scheduler_->ControlTaskRunner()->PostDelayedTask( @@ -839,8 +863,8 @@ NotifyFrames(); } -base::TimeDelta PageSchedulerImpl::GetIntensiveWakeUpThrottlingDuration( - bool is_same_origin) { +base::TimeDelta PageSchedulerImpl::GetIntensiveWakeUpThrottlingInterval( + bool is_same_origin) const { // Title and favicon changes only affect the same_origin wake up budget pool. if (is_same_origin && had_recent_title_or_favicon_update_) return kDefaultThrottledWakeUpInterval; @@ -857,10 +881,16 @@ if (!same_origin_intensive_wake_up_budget_pool_) return; + normal_wake_up_budget_pool_->SetWakeUpInterval( + lazy_now->Now(), IsBackgrounded() + ? kDefaultThrottledWakeUpInterval + : kForegroundPagesThrottledWakeUpInterval); + cross_origin_hidden_normal_wake_up_budget_pool_->SetWakeUpInterval( + lazy_now->Now(), kDefaultThrottledWakeUpInterval); same_origin_intensive_wake_up_budget_pool_->SetWakeUpInterval( - lazy_now->Now(), GetIntensiveWakeUpThrottlingDuration(true)); + lazy_now->Now(), GetIntensiveWakeUpThrottlingInterval(true)); cross_origin_intensive_wake_up_budget_pool_->SetWakeUpInterval( - lazy_now->Now(), GetIntensiveWakeUpThrottlingDuration(false)); + lazy_now->Now(), GetIntensiveWakeUpThrottlingInterval(false)); } void PageSchedulerImpl::NotifyFrames() { @@ -1049,6 +1079,8 @@ bool PageSchedulerImpl::HasWakeUpBudgetPools() const { // All WakeUpBudgetPools should be initialized together. DCHECK_EQ(!!normal_wake_up_budget_pool_, + !!cross_origin_hidden_normal_wake_up_budget_pool_); + DCHECK_EQ(!!normal_wake_up_budget_pool_, !!same_origin_intensive_wake_up_budget_pool_); DCHECK_EQ(!!normal_wake_up_budget_pool_, !!cross_origin_intensive_wake_up_budget_pool_); @@ -1056,9 +1088,21 @@ return !!normal_wake_up_budget_pool_; } +void PageSchedulerImpl::MoveTaskQueuesToCorrectWakeUpBudgetPoolAndUpdate() { + for (FrameSchedulerImpl* frame_scheduler : frame_schedulers_) + frame_scheduler->MoveTaskQueuesToCorrectWakeUpBudgetPool(); + + // Update the WakeUpBudgetPools' interval everytime task queues change their + // attached WakeUpBudgetPools + base::sequence_manager::LazyNow lazy_now( + main_thread_scheduler_->tick_clock()); + UpdateWakeUpBudgetPools(&lazy_now); +} + std::array<WakeUpBudgetPool*, PageSchedulerImpl::kNumWakeUpBudgetPools> PageSchedulerImpl::AllWakeUpBudgetPools() { return {normal_wake_up_budget_pool_, + cross_origin_hidden_normal_wake_up_budget_pool_, same_origin_intensive_wake_up_budget_pool_, cross_origin_intensive_wake_up_budget_pool_}; }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h index 5d38ce41..cce7d18f 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
@@ -56,6 +56,10 @@ static constexpr base::TimeDelta kIntensiveThrottledWakeUpInterval = base::TimeDelta::FromMinutes(1); + // Interval between throttled wake ups on a foreground page. + static constexpr base::TimeDelta kForegroundPagesThrottledWakeUpInterval = + base::TimeDelta::FromMilliseconds(100); + PageSchedulerImpl(PageScheduler::Delegate*, AgentGroupSchedulerImpl&); PageSchedulerImpl(const PageSchedulerImpl&) = delete; PageSchedulerImpl& operator=(const PageSchedulerImpl&) = delete; @@ -153,6 +157,8 @@ // frame it not a local one. FrameSchedulerImpl* SelectFrameForUkmAttribution(); + bool ThrottleForegroundTimers() const { return throttle_foreground_timers_; } + void WriteIntoTrace(perfetto::TracedValue context) const; base::WeakPtr<PageSchedulerImpl> GetWeakPtr() { @@ -235,22 +241,22 @@ // a part of foregrounding the page. void SetPageFrozenImpl(bool frozen, NotificationPolicy notification_policy); - // Adds or removes a |task_queue| from the WakeUpBudgetPool associated with - // |frame_origin_type|. When the FrameOriginType of a FrameScheduler changes, - // it should remove all its TaskQueues from their current WakeUpBudgetPool and - // add them back to the WakeUpBudgetPool appropriate for the new - // FrameOriginType. + // Adds or removes a |task_queue| from the WakeUpBudgetPool. When the + // FrameOriginType or visibility of a FrameScheduler changes, it should remove + // all its TaskQueues from their current WakeUpBudgetPool and add them back to + // the appropriate WakeUpBudgetPool. void AddQueueToWakeUpBudgetPool(MainThreadTaskQueue* task_queue, FrameOriginType frame_origin_type, + bool frame_visible, base::sequence_manager::LazyNow* lazy_now); void RemoveQueueFromWakeUpBudgetPool( MainThreadTaskQueue* task_queue, - FrameOriginType frame_origin_type, base::sequence_manager::LazyNow* lazy_now); // Returns the WakeUpBudgetPool to use for |task_queue| which belongs to a - // frame with |frame_origin_type|. + // frame with |frame_origin_type| and visibility |frame_visible|. WakeUpBudgetPool* GetWakeUpBudgetPool(MainThreadTaskQueue* task_queue, - FrameOriginType frame_origin_type); + FrameOriginType frame_origin_type, + bool frame_visible); // Initializes WakeUpBudgetPools, if not already initialized. void MaybeInitializeWakeUpBudgetPools( base::sequence_manager::LazyNow* lazy_now); @@ -268,7 +274,8 @@ // Adjusts settings of budget pools depending on current state of the page. void UpdateCPUTimeBudgetPool(base::sequence_manager::LazyNow* lazy_now); void UpdateWakeUpBudgetPools(base::sequence_manager::LazyNow* lazy_now); - base::TimeDelta GetIntensiveWakeUpThrottlingDuration(bool is_same_origin); + base::TimeDelta GetIntensiveWakeUpThrottlingInterval( + bool is_same_origin) const; // Callback for marking page is silent after a delay since last audible // signal. @@ -301,8 +308,12 @@ // Returns true if WakeUpBudgetPools were initialized. bool HasWakeUpBudgetPools() const; + // Notify frames to move their task queues to the appropriate + // WakeUpBudgetPool. + void MoveTaskQueuesToCorrectWakeUpBudgetPoolAndUpdate(); + // Returns all WakeUpBudgetPools owned by this PageSchedulerImpl. - static constexpr int kNumWakeUpBudgetPools = 3; + static constexpr int kNumWakeUpBudgetPools = 4; std::array<WakeUpBudgetPool*, kNumWakeUpBudgetPools> AllWakeUpBudgetPools(); TraceableVariableController tracing_controller_; @@ -326,17 +337,32 @@ // Wake up budget pools for each throttling scenario: // - // Same-origin frame Cross-origin frame - // Normal throttling only 1 1 - // Normal and intensive throttling 2 3 + // For background pages: + // Same-origin frame Cross-origin frame + // Normal throttling only 1 1 + // Normal and intensive throttling 3 4 // - // 1: This pool allows 1-second aligned wake ups. + // For foreground pages: + // Same-origin frame 1 + // Visible cross-origin frame 1 + // Hidden cross-origin frame 2 + // + // Task queues attched to these pools will be updated when: + // * Page background state changes + // * Frame visibility changes + // * Frame origin changes + // + // 1: This pool allows 1-second aligned wake ups when the page is backgrounded + // or 100ms aligned wake ups when the page is foregrounded. WakeUpBudgetPool* normal_wake_up_budget_pool_ = nullptr; - // 2: This pool allows 1-second aligned wake ups if the page is not + // 2: This pool allows 1-second aligned wake ups for hidden frames in + // foreground pages. + WakeUpBudgetPool* cross_origin_hidden_normal_wake_up_budget_pool_ = nullptr; + // 3: This pool allows 1-second aligned wake ups if the page is not // intensively throttled of if there hasn't been a wake up in the last // minute. Otherwise, it allows 1-minute aligned wake ups. WakeUpBudgetPool* same_origin_intensive_wake_up_budget_pool_ = nullptr; - // 3: This pool allows 1-second aligned wake ups if the page is not + // 4: This pool allows 1-second aligned wake ups if the page is not // intensively throttled. Otherwise, it allows 1-minute aligned wake ups. // // Unlike |same_origin_intensive_wake_up_budget_pool_|, this pool does not @@ -362,6 +388,9 @@ // Delay after which a background page can be frozen if network is idle. const base::TimeDelta delay_for_background_and_network_idle_tab_freezing_; + // Whether foreground timers should be always throttled. + const bool throttle_foreground_timers_; + bool is_stored_in_back_forward_cache_ = false; TaskHandle set_ipc_posted_handler_task_; base::TimeTicks stored_in_back_forward_cache_timestamp_;
diff --git a/third_party/blink/renderer/platform/storage/OWNERS b/third_party/blink/renderer/platform/storage/OWNERS new file mode 100644 index 0000000..24d6d7b1 --- /dev/null +++ b/third_party/blink/renderer/platform/storage/OWNERS
@@ -0,0 +1,9 @@ +# Primary: +mek@chromium.org + +# Secondary: +jsbell@chromium.org +pwnall@chromium.org + +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/renderer/modules/storage/blink_storage_key.cc b/third_party/blink/renderer/platform/storage/blink_storage_key.cc similarity index 92% rename from third_party/blink/renderer/modules/storage/blink_storage_key.cc rename to third_party/blink/renderer/platform/storage/blink_storage_key.cc index eaf825e..ff3765b 100644 --- a/third_party/blink/renderer/modules/storage/blink_storage_key.cc +++ b/third_party/blink/renderer/platform/storage/blink_storage_key.cc
@@ -4,7 +4,7 @@ #include <ostream> -#include "third_party/blink/renderer/modules/storage/blink_storage_key.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/storage/blink_storage_key.h b/third_party/blink/renderer/platform/storage/blink_storage_key.h similarity index 77% rename from third_party/blink/renderer/modules/storage/blink_storage_key.h rename to third_party/blink/renderer/platform/storage/blink_storage_key.h index 7700941..3de162d 100644 --- a/third_party/blink/renderer/modules/storage/blink_storage_key.h +++ b/third_party/blink/renderer/platform/storage/blink_storage_key.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_BLINK_STORAGE_KEY_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_BLINK_STORAGE_KEY_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_STORAGE_BLINK_STORAGE_KEY_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_STORAGE_BLINK_STORAGE_KEY_H_ #include <iosfwd> -#include "base/component_export.h" #include "base/memory/scoped_refptr.h" +#include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -19,7 +19,7 @@ // CachedStorageAreas. // It is typemapped to blink.mojom.StorageKey, and should stay in sync with // blink::StorageKey (third_party/blink/public/common/storage_key/storage_key.h) -class COMPONENT_EXPORT(MODULES_STORAGE_BLINK_STORAGE_KEY) BlinkStorageKey { +class PLATFORM_EXPORT BlinkStorageKey { DISALLOW_NEW(); public: @@ -47,13 +47,13 @@ scoped_refptr<const SecurityOrigin> origin_; }; -COMPONENT_EXPORT(MODULES_STORAGE_BLINK_STORAGE_KEY) +PLATFORM_EXPORT bool operator==(const BlinkStorageKey&, const BlinkStorageKey&); -COMPONENT_EXPORT(MODULES_STORAGE_BLINK_STORAGE_KEY) +PLATFORM_EXPORT bool operator!=(const BlinkStorageKey&, const BlinkStorageKey&); -COMPONENT_EXPORT(MODULES_STORAGE_BLINK_STORAGE_KEY) +PLATFORM_EXPORT std::ostream& operator<<(std::ostream&, const BlinkStorageKey&); } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_BLINK_STORAGE_KEY_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_STORAGE_BLINK_STORAGE_KEY_H_
diff --git a/third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.cc b/third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.cc similarity index 87% rename from third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.cc rename to third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.cc index 9bd84ec..6f6fefb 100644 --- a/third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.cc +++ b/third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.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 "third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h" #include "third_party/blink/renderer/platform/mojo/security_origin_mojom_traits.h"
diff --git a/third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.h b/third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h similarity index 60% rename from third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.h rename to third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h index 462da81..11a19099 100644 --- a/third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits.h +++ b/third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h
@@ -2,17 +2,17 @@ // 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_MODULES_STORAGE_BLINK_STORAGE_KEY_MOJOM_TRAITS_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_BLINK_STORAGE_KEY_MOJOM_TRAITS_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_STORAGE_BLINK_STORAGE_KEY_MOJOM_TRAITS_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_STORAGE_BLINK_STORAGE_KEY_MOJOM_TRAITS_H_ -#include "base/component_export.h" #include "third_party/blink/public/mojom/storage_key/storage_key.mojom-shared.h" -#include "third_party/blink/renderer/modules/storage/blink_storage_key.h" +#include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key.h" namespace mojo { template <> -struct COMPONENT_EXPORT(MODULES_STORAGE_BLINK_STORAGE_KEY) +struct PLATFORM_EXPORT StructTraits<blink::mojom::StorageKeyDataView, blink::BlinkStorageKey> { static const scoped_refptr<const blink::SecurityOrigin>& origin( const blink::BlinkStorageKey& input) { @@ -25,4 +25,4 @@ } // namespace mojo -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_BLINK_STORAGE_KEY_MOJOM_TRAITS_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_STORAGE_BLINK_STORAGE_KEY_MOJOM_TRAITS_H_
diff --git a/third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits_test.cc b/third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits_test.cc similarity index 96% rename from third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits_test.cc rename to third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits_test.cc index 39a9084..fec6abbf 100644 --- a/third_party/blink/renderer/modules/storage/blink_storage_key_mojom_traits_test.cc +++ b/third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits_test.cc
@@ -2,14 +2,14 @@ // 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/modules/storage/blink_storage_key_mojom_traits.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/common/storage_key/storage_key_mojom_traits.h" #include "third_party/blink/public/mojom/storage_key/storage_key.mojom-blink.h" -#include "third_party/blink/renderer/modules/storage/blink_storage_key.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/vector.h" #include "url/gurl.h"
diff --git a/third_party/blink/renderer/modules/storage/blink_storage_key_test.cc b/third_party/blink/renderer/platform/storage/blink_storage_key_test.cc similarity index 96% rename from third_party/blink/renderer/modules/storage/blink_storage_key_test.cc rename to third_party/blink/renderer/platform/storage/blink_storage_key_test.cc index fb51bd7b..8f70311d 100644 --- a/third_party/blink/renderer/modules/storage/blink_storage_key_test.cc +++ b/third_party/blink/renderer/platform/storage/blink_storage_key_test.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 "third_party/blink/renderer/modules/storage/blink_storage_key.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
diff --git a/third_party/blink/renderer/platform/text/hyphenation.h b/third_party/blink/renderer/platform/text/hyphenation.h index 0e778a2..0d9e78a 100644 --- a/third_party/blink/renderer/platform/text/hyphenation.h +++ b/third_party/blink/renderer/platform/text/hyphenation.h
@@ -38,6 +38,8 @@ protected: bool ShouldHyphenateWord(const StringView& word) const { + if (word.IsEmpty()) + return false; // Avoid hyphenating capitalized words. return hyphenate_capitalized_word_ || !WTF::unicode::IsUpper(word[0]); }
diff --git a/third_party/blink/renderer/platform/text/hyphenation_test.cc b/third_party/blink/renderer/platform/text/hyphenation_test.cc index 207104f..c4ea5976 100644 --- a/third_party/blink/renderer/platform/text/hyphenation_test.cc +++ b/third_party/blink/renderer/platform/text/hyphenation_test.cc
@@ -204,6 +204,23 @@ EXPECT_EQ(0u, hyphenation->LastHyphenLocation(only_spaces, 3)); } +TEST_F(HyphenationTest, NonLetters) { + scoped_refptr<Hyphenation> hyphenation = GetHyphenation("en-us"); +#if defined(OS_ANDROID) + // Hyphenation is available only for Android M MR1 or later. + if (!hyphenation) + return; +#endif + + String non_letters("**********"); + EXPECT_EQ(0u, + hyphenation->LastHyphenLocation(non_letters, non_letters.length())); + + non_letters.Ensure16Bit(); + EXPECT_EQ(0u, + hyphenation->LastHyphenLocation(non_letters, non_letters.length())); +} + TEST_F(HyphenationTest, English) { scoped_refptr<Hyphenation> hyphenation = GetHyphenation("en-us"); #if defined(OS_ANDROID)
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 beb125f0..7dfa831 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
@@ -979,6 +979,15 @@ }, { 'paths': [ + 'third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc', + ], + # This class needs access to a GPU driver bug workaround entry. + 'allowed': [ + 'gpu::ENABLE_WEBGL_TIMER_QUERY_EXTENSIONS', + ], + }, + { + 'paths': [ 'third_party/blink/renderer/core/html/media/', ], # This module needs access to the following for media's base::Feature
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index cd2f8ff..9026c89 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1213,8 +1213,6 @@ # ====== MathMLCore-only tests from here ====== -crbug.com/626703 external/wpt/mathml/presentation-markup/fractions/frac-invalid-2.html [ Failure ] -crbug.com/626703 external/wpt/mathml/presentation-markup/fractions/frac-invalid-3.html [ Failure ] crbug.com/6606 external/wpt/mathml/presentation-markup/direction/direction-006.html [ Failure ] crbug.com/6606 external/wpt/mathml/presentation-markup/direction/direction-009.html [ Failure ] crbug.com/6606 external/wpt/mathml/presentation-markup/direction/direction.html [ Failure ] @@ -1733,16 +1731,13 @@ # crbug.com/1095379: These fail with a timeout, even when they're given extra time (via SlowTests) crbug.com/846656 external/wpt/css/selectors/focus-visible-002.html [ Pass Timeout ] -crbug.com/1135405 http/tests/devtools/sources/debugger-pause/debugger-pause-infinite-loop.js [ Pass Timeout ] crbug.com/1097094 external/wpt/window-segments/getWindowSegments-iframes.tentative.sub.html [ Pass Timeout ] crbug.com/1018064 [ Mac ] virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Pass Timeout ] crbug.com/1034789 [ Mac ] http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html [ Pass Timeout ] crbug.com/1105957 [ Debug Linux ] fast/dom/cssTarget-crash.html [ Pass Timeout ] crbug.com/915903 http/tests/security/inactive-document-with-empty-security-origin.html [ Pass Timeout ] -crbug.com/1146221 [ Linux ] http/tests/devtools/sources/debugger-ui/debugger-inline-values.js [ Pass Timeout ] crbug.com/987138 [ Linux ] media/controls/doubletap-to-jump-forwards.html [ Pass Timeout ] crbug.com/987138 [ Win ] media/controls/doubletap-to-jump-forwards.html [ Pass Timeout ] -crbug.com/1122742 http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations.js [ Pass Timeout ] crbug.com/867532 [ Linux ] http/tests/workers/worker-usecounter.html [ Pass Timeout ] crbug.com/1002377 external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Pass Timeout ] crbug.com/805756 external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Pass Timeout ] @@ -4324,11 +4319,6 @@ crbug.com/716320 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success-and-failure.https.html [ Failure Timeout ] -# Test timing out when SharedArrayBuffer is disabled by default. -# See https://crbug.com/1194557 -crbug.com/1194557 http/tests/devtools/sources/debugger-breakpoints/set-breakpoint-while-blocking-main-thread.js [ Timeout ] -crbug.com/1194557 virtual/shared_array_buffer_on_desktop/http/tests/devtools/sources/debugger-breakpoints/set-breakpoint-while-blocking-main-thread.js [ Pass ] - # Test output varies depending on the bot. A single expectation file doesn't # work. crbug.com/1194557 fast/beacon/beacon-basic.html [ Failure Pass ] @@ -4687,9 +4677,6 @@ crbug.com/794338 media/video-rotation.html [ Failure Pass ] crbug.com/811605 media/video-poster-after-loadedmetadata.html [ Failure Pass ] -crbug.com/806645 [ Win7 ] http/tests/devtools/elements/elements-panel-rewrite-href.js [ Failure Pass ] -crbug.com/806645 [ Mac ] http/tests/devtools/elements/elements-panel-rewrite-href.js [ Failure Pass ] - # MHT works only when loaded from local FS (file://..). crbug.com/778467 [ Fuchsia ] mhtml/mhtml_in_iframe.html [ Failure ] @@ -4743,6 +4730,266 @@ # Sheriff 2018-04-11 crbug.com/831796 fast/events/autoscroll-in-textfield.html [ Failure Pass ] +# DevTools underscore migration +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-scripts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/worker-debugging.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-minified-variables-evalution.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/async-callstack-network-initiator.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/pause-in-removed-frame.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-suspend-active-dom-objects.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-scope-resolve-this.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/mutation-observer-suspend-while-paused.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-reload-on-pause.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-scripts-reload.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/source-frame-breakpoint-decorations.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-scope-minified-variables.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-autocontinue-on-syntax-error.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/dynamic-script-tag.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/live-edit.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-compile-and-run.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-completions-on-call-frame.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-prototype-property.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/worker-debugging-script-mapping.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/script-failed-to-parse.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/live-edit-original-content.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/sources-panel-content-scripts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/source-map-http-header.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-scope-resolve-identifiers.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-return-value.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/async-callstack-fetch.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/rethrow-error-from-bindings-crash.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/script-collected.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations.js [ Pass Failure Timeout ] +crbug.com/1207342 http/tests/devtools/sources/debugger/dynamic-scripts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger/debugger-cyclic-reference.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/dont-diverge-script-evaluated-twice.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/reveal-not-skipped.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/script-snippet-model.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-2.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/debugger-save-to-temp-var.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/async-call-stack-async-function.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/monitor-console-command.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/break-on-set-timeout-with-syntax-error.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/watch-expressions-panel-switch.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/source-url-comment.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/source-frame.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/async-call-stack-url.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/script-formatter-search.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/function-generator-details.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/popover-for-spread-operator.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/debugger-expand-scope.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-3.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/scripts-sorting.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/debugger-inline-values.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/switch-file.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/watch-expressions-preserve-expansion.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/copy-stack-trace.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/custom-element-lifecycle-events.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/scripts-panel.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/break-on-empty-event-listener.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/callstack-placards-discarded.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/selected-call-frame-after-formatting-source.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/async-call-stack-worker.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/function-details.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-ui/last-execution-context.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/no-pause-on-disabled-breakpoint.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/inline-breakpoint-with-sourcemap.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/debugger-disable-add-breakpoint.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints-reload.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-script-first-stmt.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/xhr-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/provisional-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/set-logpoint.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/set-breakpoint-while-blocking-main-thread.js [ Pass Failure Timeout ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/breakpoint-manager-listeners-count.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-xhr.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-anonymous-script-with-two-targets.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-after-suspension.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-webaudio.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/debugger-breakpoints-not-activated-on-reload.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/set-conditional-breakpoint.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/picture-in-picture-event-listener-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/possible-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-breakpoints/debugger-set-breakpoint-regex.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-post-message.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-web-sql.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-reload-no-crash.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await1.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await2.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await3.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-await/async-pause-on-exception.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-mutation-observer.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-scripted-scroll.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-xhrs.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-get-as-string.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-in-console.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-promises.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-middle-run.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-indexed-db.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-set-interval.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-async/async-callstack-events.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/inline-script-with-source-map.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-into-event-listener.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-out-across-timeouts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-through-promises.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-over-document-write.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-out.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-over-inlined-scripts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-out-custom-element-callbacks.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-in.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-out-event-listener.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-into-inlined-scripts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-over-across-timeouts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-in-ignore-injected-script.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-into-custom-element-callbacks.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/step-through-event-listeners.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-into-document-write.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-over.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-step/debugger-step-into-across-timeouts.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-console/step-into-async-fetch.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-console/debug-console-command.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/sources-panel-extension-names.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-on-debugger-statement.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-on-failed-assertion.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-on-exception.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused-throws.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-mute-exception.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-change-variable.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-resume-button-in-overlay.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/pause-on-elements-panel.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/set-return-value.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/skip-pauses-until-reload.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/function-name-in-callstack.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-on-promise-rejection.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/pause-in-internal-script.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/eval-on-pause-blocked.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-no-nested-pause.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/pause-in-inline-script.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-in-internal.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-in-eval-script.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-with-overrides.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/event-listener-breakpoints-script-fst-stmt-for-module.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-jquery.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-ignore-list-by-source-code.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-with-worker.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-step-in.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-with-async-callstack.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-exceptions.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-steppings.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-break-program.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-frameworks/frameworks-step-into-skips-setTimeout.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/console/console-api-on-call-frame.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/console/worker-eval-contains-stack.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/console/nested-worker-eval-contains-stack.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/console/console-error-on-call-frame.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/console/console-context-selector.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/indexeddb/live-update-indexeddb-content.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/compiler-source-mapping-debug.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/parse-form-data.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/network-choose-preview-view.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/network-update-calculator-for-all-requests.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/network-filter-updated-requests.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/request-name-path.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/json-preview.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/network/from-disk-cache-timing.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/service-workers/service-worker-pause.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/a11y-axe-core/sources/threads-a11y-test.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-entry-deletion.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-names.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-deletion.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-data.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-live-update-list.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-live-update-cache-content.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/cache-storage/cache-track-valid-origin.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/oopif/oopif-elements-nesting-error-page.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/oopif/oopif-elements-nesting.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/oopif/oopif-elements-navigate-out.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/tracing/timeline-network/timeline-network-resource-navigation.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/tracing/timeline-network/timeline-network-resource-navigation-sgx.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/tracing/user-timing.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/runtime/evaluate-without-side-effects.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/runtime/evaluate-timeout.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/resource-har-conversion.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/bindings/ignore-listed-sourcemap-detach.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/domdebugger/domdebugger-getEventListeners.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/modify-cross-domain-rule.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/search/search-in-script.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/resource-har-headers.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/profiler/cpu-profiler-calculate-time.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/resource-tree/resource-request-content-while-loading.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/resource-tree/resource-tree-events.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/resource-tree/resource-tree-crafted-frame-add.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/persistence/persistence-do-not-overwrite-css.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/styles-1/css-live-edit.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/styles-2/nested-pseudo-elements.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/iframe-load-event.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/event-listener-sidebar-jquery2.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-js-path.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-hide-html-comments.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-panel-limited-children.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-css-path.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/insert-node.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/attribute-modified-ns.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/expand-recursively.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/user-properties.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-panel-correct-case.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/inspect-limited-children.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-iframe-base-url.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/event-listener-sidebar-remove.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/styles/original-content-provider.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/styles/xsl-transformed.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/modify-chardata.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-panel-structure.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/event-listeners-about-blank.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/event-listener-sidebar.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/shadow/shadow-host-display-modes.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/shadow/create-shadow-root.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/shadow/update-shadowdom.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/shadow/shadow-distribution.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/shadow/shadow-root.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/move-node.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-child-node-count-mismatch.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/set-attribute.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/remove-node.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/undo-dom-edits.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/edit-dom-actions-3.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/shadow-dom-modify-chardata.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/delete-from-document.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/undo-dom-edits-2.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/perform-undo-undo.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/edit/insert-node-collapsed.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/bidi-dom-tree.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/elements-panel-rewrite-href.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/event-listeners-framework-with-service-worker.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/elements/node-xpath.js [ Pass Failure ] +crbug.com/1207342 http/tests/inspector-protocol/cpu-profiler/record-cpu-profile-with-cpu-throttling.js [ Pass Failure ] +crbug.com/1207342 http/tests/inspector-protocol/page/frameScheduledNavigation.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/persistence/persistence-external-change-breakpoints.js [ Pass Failure ] +crbug.com/1207342 http/tests/devtools/sources/debugger-pause/debugger-pause-infinite-loop.js [ Pass Failure ] + # Sheriff 2018-04-13 crbug.com/833655 [ Linux ] media/controls/closed-captions-dynamic-update.html [ Skip ] crbug.com/833658 media/video-controls-focus-movement-on-hide.html [ Failure Pass ] @@ -4882,9 +5129,6 @@ # Sheriff 2018-12-06 crbug.com/912793 crbug.com/899087 virtual/android/fullscreen/full-screen-iframe-allowed-video.html [ Crash Failure Pass Timeout ] -# Sheriff 2018-12-07 -crbug.com/912821 [ Mac ] http/tests/devtools/tracing/user-timing.js [ Failure Pass ] - # Sheriff 2018-12-13 crbug.com/910452 media/controls/buttons-after-reset.html [ Failure Pass ] @@ -5128,7 +5372,6 @@ crbug.com/535738 external/wpt/media-source/mediasource-changetype-play-negative.html [ Failure ] crbug.com/535738 external/wpt/media-source/mediasource-changetype-play-without-codecs-parameter.html [ Failure ] -crbug.com/974675 http/tests/devtools/sources/debugger-frameworks/frameworks-jquery.js [ Crash Pass ] # Sheriff 2019-06-26 crbug.com/978966 [ Mac ] paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers.html [ Failure Pass ] @@ -5898,7 +6141,6 @@ crbug.com/1126709 [ Win ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-local-time-null-1.https.html [ Failure Pass ] # Sheriff 2020-09-17 -crbug.com/1129347 [ Debug Mac10.13 ] http/tests/devtools/persistence/persistence-external-change-breakpoints.js [ Failure Pass ] ### virtual/scroll-unification/fast/scrolling/scrollbars/ virtual/scroll-unification/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html [ Failure ] virtual/scroll-unification/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Failure ] @@ -6022,7 +6264,6 @@ crbug.com/1130020 virtual/threaded-prefer-compositing/fast/scrolling/scrollbars/scrollbar-mousedown-move-mouseup.html [ Failure Pass Timeout ] # Sheriff 2020-11-16 -crbug.com/1149734 http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames.js [ Failure Pass Timeout ] crbug.com/1149734 http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Failure Pass Timeout ] crbug.com/1149987 external/wpt/websockets/Create-blocked-port.any.html [ Pass Timeout ] crbug.com/1149987 external/wpt/websockets/Create-blocked-port.any.worker.html [ Pass Timeout ] @@ -6095,9 +6336,6 @@ # Wpt importer sheriff 2021-01-05 crbug.com/1163175 external/wpt/css/css-pseudo/first-letter-punctuation-and-space.html [ Failure ] -# Sheriff 2020-12-14 -crbug.com/1046784 http/tests/devtools/console/console-context-selector.js [ Pass Timeout ] - # COOP flaky test (timeout) crbug.com/1161244 external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html [ Pass Timeout ] @@ -6202,9 +6440,6 @@ crbug.com/1179461 external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_incorrectUsage.https.html [ Failure ] crbug.com/1179461 external/wpt/webxr/depth-sensing/gpu/depth_sensing_gpu_staleView.https.html [ Failure ] -# Sheriff 2021-02-17 -crbug.com/1179117 [ Linux ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Pass Timeout ] - # Ecosystem-Infra Sheriff 2021-02-17 crbug.com/1179219 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-currentSrc.html [ Failure ] @@ -6814,13 +7049,11 @@ # Do not retry slow tests that also timeouts crbug.com/1210687 [ Mac10.15 ] fast/events/open-window-from-another-frame.html [ Pass Timeout ] -crbug.com/1210687 [ Mac10.15 ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Pass Timeout ] crbug.com/1210687 [ Mac10.15 ] http/tests/permissions/chromium/test-request-worker.html [ Pass Timeout ] crbug.com/1210687 [ Mac10.15 ] storage/websql/sql-error-codes.html [ Pass Timeout ] crbug.com/1210687 [ Mac10.15 ] external/wpt/html/user-activation/propagation-crossorigin.sub.tentative.html [ Pass Timeout ] crbug.com/1210687 [ Win ] virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-dispatch.js [ Pass Timeout ] crbug.com/1210687 [ Win ] virtual/split-http-cache-not-site-per-process/http/tests/devtools/isolated-code-cache/stale-revalidation-test.js [ Pass Timeout ] -crbug.com/1210687 [ Win ] virtual/shared_array_buffer_on_desktop/http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Pass Timeout ] # Sheriff 2021-06-02 crbug.com/1215575 [ Mac11.0 ] fast/peerconnection/RTCPeerConnection-applyConstraints-remoteVideoTrack.html [ Pass Timeout ] @@ -7007,6 +7240,14 @@ crbug.com/1222097 svg/css/alignment-baseline.html [ Failure Pass ] +# Temporarily disable to unblock a WebRTC roll +crbug.com/webrtc/8199 [ Win ] external/wpt/webrtc-stats/supported-stats.html [ Pass Failure ] +crbug.com/webrtc/8199 [ Linux ] external/wpt/webrtc-stats/supported-stats.html [ Pass Failure ] +crbug.com/webrtc/8199 [ Mac10.15 ] external/wpt/webrtc-stats/supported-stats.html [ Pass Failure ] +crbug.com/webrtc/8199 [ Mac10.14 ] external/wpt/webrtc-stats/supported-stats.html [ Pass Failure ] +crbug.com/webrtc/8199 [ Mac10.13 ] external/wpt/webrtc-stats/supported-stats.html [ Pass Failure ] +crbug.com/webrtc/8199 [ Mac10.12 ] external/wpt/webrtc-stats/supported-stats.html [ Pass Failure ] + # Sheriff crbug.com/1223276 external/wpt/layout-instability/input-timestamp.html [ Skip ] crbug.com/1223327 wpt_internal/prerender/unload.html [ Pass Timeout ] @@ -7059,6 +7300,7 @@ crbug.com/1223391 http/tests/devtools/security/interstitial-sidebar.js [ Skip ] crbug.com/1223391 http/tests/devtools/security/mixed-content-sidebar.js [ Skip ] crbug.com/1223391 http/tests/devtools/security/origin-view-then-interstitial.js [ Skip ] +crbug.com/1215068 http/tests/devtools/tracing/tracing-timeline-load.js [ Skip ] # Sheriff 2021-07-07 crbug.com/1227092 [ Win ] virtual/scroll-unification/fast/events/selection-autoscroll-borderbelt.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-2-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-2-ref.html index 5b1960d..d57c2090 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-2-ref.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-2-ref.html
@@ -7,7 +7,7 @@ <body> <p>This test passes if you see a single rectangle.</p> <math> - <mrow> + <mrow style="padding-inline-start: 1px; padding-inline-end: 1px;"> <mspace width="200px" height="200px" style="background: green"></mspace> </mrow> </math>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-3-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-3-ref.html index 7cb95aca..703e4ae 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-3-ref.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-3-ref.html
@@ -7,7 +7,7 @@ <body> <p>This test passes if you see a single rectangle.</p> <math> - <mrow> + <mrow style="padding-inline-start: 1px; padding-inline-end: 1px;"> <mspace width="50px" height="200px" style="background: green"></mspace> <mspace width="50px" height="200px" style="background: green"></mspace> <mspace width="100px" height="200px" style="background: green"></mspace>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-ref.html index e1c44fe..beb3024 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-ref.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-invalid-ref.html
@@ -7,7 +7,7 @@ <body> <p>This test passes if mfrac renders nothing.</p> <math> - <mrow> + <mrow style="padding-inline-start: 1px; padding-inline-end: 1px;"> </mrow> </math> </body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/tracing-timeline-load.js b/third_party/blink/web_tests/http/tests/devtools/tracing/tracing-timeline-load.js index a358ceb6..0a87f2e 100644 --- a/third_party/blink/web_tests/http/tests/devtools/tracing/tracing-timeline-load.js +++ b/third_party/blink/web_tests/http/tests/devtools/tracing/tracing-timeline-load.js
@@ -55,7 +55,7 @@ var blob = new Blob([input], {type: 'text/pain'}); var loader = Timeline.TimelineLoader.loadFromFile(blob, client); var model = await client.modelPromise(); - TestRunner.addResult('Model is empty: ' + (!model || (!model.minimumRecordTime() && !model.maximumRecordTime()))); + TestRunner.addResult('Model is empty: ' + (!model || (model.minimumRecordTime() === Infinity && model.maximumRecordTime() === -Infinity))); callback(); }
diff --git a/third_party/blink/web_tests/inspector-protocol/overlay/overlay-container-query-expected.txt b/third_party/blink/web_tests/inspector-protocol/overlay/overlay-container-query-expected.txt new file mode 100644 index 0000000..a0b523d --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/overlay/overlay-container-query-expected.txt
@@ -0,0 +1,57 @@ +Verifies that Overlay.setShowContainerQueryOverlays works. +Overlay not rendered: + +Overlay rendered: +{ + "name": "drawContainerQueryHighlight", + "data": { + "containerBorder": [ + "M", + 8, + 8, + "L", + 408, + 8, + "L", + 408, + 508, + "L", + 8, + 508, + "Z" + ], + "containerQueryContainerHighlightConfig": { + "containerBorder": { + "color": "#000000", + "pattern": "solid" + } + } + } +} +Overlay rendered: +[ + { + "containerBorder": [ + "M", + 8, + 8, + "L", + 408, + 8, + "L", + 408, + 508, + "L", + 8, + 508, + "Z" + ], + "containerQueryContainerHighlightConfig": { + "containerBorder": { + "color": "#000000", + "pattern": "solid" + } + } + } +] +
diff --git a/third_party/blink/web_tests/inspector-protocol/overlay/overlay-container-query.js b/third_party/blink/web_tests/inspector-protocol/overlay/overlay-container-query.js new file mode 100644 index 0000000..56cc1de4 --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/overlay/overlay-container-query.js
@@ -0,0 +1,103 @@ +(async function(testRunner) { + const {session, dp} = await testRunner.startHTML(` + <style> + #container { + width: 400px; + height: 500px; + } + </style> + <div id="container"></div> + `, 'Verifies that Overlay.setShowContainerQueryOverlays works.'); + + await dp.DOM.enable(); + await dp.Overlay.enable(); + + const documentNodeId = (await dp.DOM.getDocument()).result.root.nodeId; + const {result: {nodeId}} = await dp.DOM.querySelector({nodeId: documentNodeId, selector: '#container'}); + + async function waitForAnimationFrame() { + await session.evaluateAsync(() => { + return new Promise(resolve => requestAnimationFrame(resolve)); + }); + } + + async function getDrawContainerQueryHighlightCommands() { + await waitForAnimationFrame(); + return await session.evaluate(() => { + return internals.evaluateInInspectorOverlay(`(function () { + // Multiple frames could be rendered but they should to be identical. + const commands = window.commands; + window.commands = []; + return JSON.stringify(commands.filter(command => command.name === 'drawContainerQueryHighlight').shift(), null, 2); + })()`); + }); + } + + async function getHighlightNodeCommands() { + await waitForAnimationFrame(); + return await session.evaluate(() => { + return internals.evaluateInInspectorOverlay(`(function () { + // Multiple frames could be rendered but they should to be identical. + const commands = window.commands; + window.commands = []; + return JSON.stringify(commands + .filter(command => command.name === 'drawHighlight') + .shift().data.containerQueryInfo, null, 2); + })()`); + }); + } + + await dp.Overlay.setInspectMode({ + mode: 'searchForNode', + highlightConfig: {}, + }); + + await session.evaluate(() => { + return internals.evaluateInInspectorOverlay(`(function () { + window.commands = []; + window.dispatch = ([name, data]) => { + window.commands.push({name, data}); + }; + })()`); + }); + + testRunner.log('Overlay not rendered:'); + testRunner.log(await getDrawContainerQueryHighlightCommands()); + + const black = { + r: 0, + g: 0, + b: 0, + a: 1, + }; + await dp.Overlay.setShowContainerQueryOverlays({ + containerQueryHighlightConfigs: [{ + nodeId, + containerQueryContainerHighlightConfig: { + containerBorder: { + color: black, + }, + }, + }] + }); + + testRunner.log('Overlay rendered:'); + testRunner.log(await getDrawContainerQueryHighlightCommands()); + + await dp.Overlay.highlightNode({ + highlightConfig: { + containerQueryContainerHighlightConfig: { + containerBorder: { + color: black, + patten: 'dashed', + }, + }, + }, + nodeId, + }); + + testRunner.log('Overlay rendered:'); + testRunner.log(await getHighlightNodeCommands()); + + testRunner.completeTest(); +});
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py index 7234723..d320530 100755 --- a/tools/clang/scripts/package.py +++ b/tools/clang/scripts/package.py
@@ -11,6 +11,7 @@ import argparse import fnmatch import itertools +import multiprocessing.dummy import os import platform import shutil @@ -129,31 +130,34 @@ sys.path.insert(0, os.path.join(CHROMIUM_DIR, 'tools', 'symsrc')) import img_fingerprint, pdb_fingerprint_from_img + files = [] for binary_path in binaries: binary_path = os.path.join(LLVM_RELEASE_DIR, binary_path) binary_id = img_fingerprint.GetImgFingerprint(binary_path) (pdb_id, pdb_path) = pdb_fingerprint_from_img.GetPDBInfoFromImg(binary_path) + files += [(binary_path, binary_id), (pdb_path, pdb_id)] # The build process builds clang.exe and then copies it to clang-cl.exe # (both are the same binary and they behave differently on what their # filename is). Hence, the pdb is at clang.pdb, not at clang-cl.pdb. # Likewise, lld-link.exe's PDB file is called lld.pdb. - # Compress and upload. - for f, f_id in ((binary_path, binary_id), (pdb_path, pdb_id)): - subprocess.check_call( - ['makecab', '/D', 'CompressionType=LZX', '/D', 'CompressionMemory=21', - f, '/L', os.path.dirname(f)], stdout=open(os.devnull, 'w')) - f_cab = f[:-1] + '_' - - dest = '%s/%s/%s' % (os.path.basename(f), f_id, os.path.basename(f_cab)) - print('Uploading %s to Google Cloud Storage...' % dest) - gsutil_args = ['cp', '-n', '-a', 'public-read', f_cab, - 'gs://chromium-browser-symsrv/' + dest] - exit_code = RunGsutil(gsutil_args) - if exit_code != 0: - print("gsutil failed, exit_code: %s" % exit_code) - sys.exit(exit_code) + # Compress and upload. + def compress(t): + subprocess.check_call( + ['makecab', '/D', 'CompressionType=LZX', '/D', 'CompressionMemory=21', + t[0], '/L', os.path.dirname(t[0])], stdout=open(os.devnull, 'w')) + multiprocessing.dummy.Pool().map(compress, files) + for f, f_id in files: + f_cab = f[:-1] + '_' + dest = '%s/%s/%s' % (os.path.basename(f), f_id, os.path.basename(f_cab)) + print('Uploading %s to Google Cloud Storage...' % dest) + gsutil_args = ['cp', '-n', '-a', 'public-read', f_cab, + 'gs://chromium-browser-symsrv/' + dest] + exit_code = RunGsutil(gsutil_args) + if exit_code != 0: + print("gsutil failed, exit_code: %s" % exit_code) + sys.exit(exit_code) def main():
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 341d992..8b607e6 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -33899,6 +33899,8 @@ <int value="3948" label="RTCPeerConnectionWithBlockingCsp"/> <int value="3949" label="SanitizerAPISanitizeFor"/> <int value="3950" label="SanitizerAPIElementSetSanitized"/> + <int value="3951" label="TextShadowInHighlightPseudo"/> + <int value="3952" label="TextShadowNotNoneInHighlightPseudo"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -49024,6 +49026,7 @@ <int value="330439654" label="SyncPseudoUSSExtensions:enabled"/> <int value="330653520" label="ChromeShareHighlightsAndroid:enabled"/> <int value="331770879" label="CrostiniAppSearch:disabled"/> + <int value="331845034" label="enable-webgl-developer-extensions"/> <int value="332391072" label="cs-contextual-cards-bar-integration"/> <int value="332960119" label="PdfXfaSupport:disabled"/> <int value="333019109" label="PrivacyReview:enabled"/> @@ -85420,6 +85423,16 @@ <int value="3" label="API not available"/> </enum> +<enum name="WebOTPCrossDeviceFailure"> + <int value="0" label="No failure"/> + <int value="1" label="Feature disabled"/> + <int value="2" label="No remote device"/> + <int value="3" label="No sharing service"/> + <int value="4" label="Sharing message failure"/> + <int value="5" label="API failure on Android"/> + <int value="6" label="Android to Android not supported"/> +</enum> + <enum name="WebOTPServiceDestroyedReason"> <int value="0" label="Navigated to new page"/> <int value="1" label="Navigated to existing page"/> @@ -85440,6 +85453,7 @@ <int value="5" label="Timeout"/> <int value="6" label="UserCancelled"/> <int value="7" label="BackendNotAvailable"/> + <int value="8" label="Cross device failure"/> </enum> <enum name="WebpDecodedFormat">
diff --git a/tools/metrics/histograms/histograms_xml/blink/histograms.xml b/tools/metrics/histograms/histograms_xml/blink/histograms.xml index 0199554..7051b8d 100644 --- a/tools/metrics/histograms/histograms_xml/blink/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/blink/histograms.xml
@@ -2531,6 +2531,16 @@ </summary> </histogram> +<histogram name="Blink.Sms.Receive.CrossDeviceFailure" + enum="WebOTPCrossDeviceFailure" expires_after="2021-12-12"> + <owner>yigu@chromium.org</owner> + <owner>web-identity@google.com</owner> + <summary> + Records the reason why using the WebOTP API on desktop failed on the sharing + path. It records one sample per invocation of the API. + </summary> +</histogram> + <histogram name="Blink.Sms.Receive.DestroyedReason" enum="WebOTPServiceDestroyedReason" expires_after="2021-12-12"> <owner>yigu@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/gpu/histograms.xml b/tools/metrics/histograms/histograms_xml/gpu/histograms.xml index e905e7cb..20bfe13 100644 --- a/tools/metrics/histograms/histograms_xml/gpu/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/gpu/histograms.xml
@@ -442,7 +442,10 @@ </histogram> <histogram name="GPU.DirectComposition.CreateVideoProcessorEnumerator" - enum="Hresult" expires_after="2021-08-01"> + enum="Hresult" expires_after="2021-07-09"> + <obsolete> + Removed 07/09/2021. CreateVideoProcessorEnumerator rarely fails. + </obsolete> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -473,7 +476,7 @@ </histogram> <histogram base="true" name="GPU.DirectComposition.DCLayerResult.Video" - enum="DCLayerResult" expires_after="2021-08-01"> + enum="DCLayerResult" expires_after="2022-02-01"> <!-- Name completed by histogram_suffixes name="GPU.ProtectedVideoType" --> <owner>magchen@chromium.org</owner> @@ -616,7 +619,10 @@ </histogram> <histogram name="GPU.DirectComposition.UploadVideoImages.CreateCopyTexture" - enum="Hresult" expires_after="2021-08-01"> + enum="Hresult" expires_after="2021-07-09"> + <obsolete> + Removed 07/09/2021. CreateTexture2D for a copy texture rarely fails. + </obsolete> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -626,7 +632,10 @@ </histogram> <histogram name="GPU.DirectComposition.UploadVideoImages.CreateStagingTexture" - enum="Hresult" expires_after="2021-08-01"> + enum="Hresult" expires_after="2021-07-09"> + <obsolete> + Removed 07/09/2021. CreateTexture2D for a staging texture rarely fails. + </obsolete> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -636,7 +645,10 @@ </histogram> <histogram name="GPU.DirectComposition.VideoDeviceCreateVideoProcessor" - enum="Hresult" expires_after="2021-08-01"> + enum="Hresult" expires_after="2021-07-09"> + <obsolete> + Removed 07/09/2021. CreateVideoProcessor rarely fails. + </obsolete> <owner>magchen@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/net/histograms.xml b/tools/metrics/histograms/histograms_xml/net/histograms.xml index 7645975..0bb07d4b 100644 --- a/tools/metrics/histograms/histograms_xml/net/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/net/histograms.xml
@@ -1289,6 +1289,9 @@ <histogram name="Net.DNS.Request.Failure.HostSafetyStatus" enum="HostSafetyStatus" expires_after="2021-08-30"> + <obsolete> + Removed from code 2021-07. + </obsolete> <owner>mmenke@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -1299,6 +1302,9 @@ <histogram name="Net.DNS.Request.Success.HostSafetyStatus" enum="HostSafetyStatus" expires_after="2021-08-30"> + <obsolete> + Removed from code 2021-07. + </obsolete> <owner>mmenke@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -1776,6 +1782,9 @@ <histogram name="Net.File.Request.Failure.HostSafetyStatus" enum="HostSafetyStatus" expires_after="2021-08-30"> + <obsolete> + Removed from code 2021-07. + </obsolete> <owner>mmenke@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -1786,6 +1795,9 @@ <histogram name="Net.File.Request.Success.HostSafetyStatus" enum="HostSafetyStatus" expires_after="2021-08-30"> + <obsolete> + Removed from code 2021-07. + </obsolete> <owner>mmenke@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -5584,6 +5596,9 @@ <histogram name="Net.Url.HostSafetyStatus" enum="HostSafetyStatus" expires_after="2021-08-30"> + <obsolete> + Removed from code 2021-07. + </obsolete> <owner>mmenke@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/sync/histograms.xml b/tools/metrics/histograms/histograms_xml/sync/histograms.xml index 8c3500c..a6971b3 100644 --- a/tools/metrics/histograms/histograms_xml/sync/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/sync/histograms.xml
@@ -1412,6 +1412,19 @@ </summary> </histogram> +<histogram name="Sync.TrustedVaultRecoverabilityDegradedOnStartup" + enum="Boolean" expires_after="2021-11-01"> + <owner>mmoskvitin@google.com</owner> + <owner>mastiz@chromium.org</owner> + <component>Services>Sync</component> + <summary> + Records whether user action was required to improve the recoverability of + trusted vault keys. Recorded only if trusted vault passphrase type is used, + when keys are locally available and at most once per browser/profile + lifetime. + </summary> +</histogram> + <histogram name="Sync.TypedURLDatabaseError" enum="SyncTypedUrlDatabaseError" expires_after="2021-12-20"> <owner>jkrcal@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 4678e0f..c644b62 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@ { "trace_processor_shell": { "win": { - "hash": "a517575f7a3131da2838899a7f9d72b01be7341a", - "remote_path": "perfetto_binaries/trace_processor_shell/win/cc178a3f172732fa9b107cda5281c98c1ac9fead/trace_processor_shell.exe" + "hash": "8b4b619cf0b64565b5392c457a68b1b0fe278165", + "remote_path": "perfetto_binaries/trace_processor_shell/win/583e3b55bc9badcd5817f889265adeaa67a7f547/trace_processor_shell.exe" }, "mac": { "hash": "e9c26d8ab8a0a60c936bfbd07de9074b2470b392", "remote_path": "perfetto_binaries/trace_processor_shell/mac/ca06eb435506f54cf6a7c013a6c545726532f2b3/trace_processor_shell" }, "linux": { - "hash": "81aad5d60c5ed2f7b1a7ff926de7e6a06fe1d097", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/cc178a3f172732fa9b107cda5281c98c1ac9fead/trace_processor_shell" + "hash": "9a988c4bed7a5b5bd001104bcf7f38a185b715ba", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/583e3b55bc9badcd5817f889265adeaa67a7f547/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index a367711..fc4a66ff 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -73,9 +73,6 @@ # Benchmark: dromaeo crbug.com/1050065 [ android-pixel-2 ] dromaeo/http://dromaeo.com?dom-modify [ Skip ] -# Benchmark: desktop_ui -crbug.com/1226867 [ win ] desktop_ui/tab_search:100_recently_closed [ Skip ] - # Benchmark: blink_perf.svg crbug.com/736817 [ android-nexus-5x ] blink_perf.svg/SvgCubics.html [ Skip ] crbug.com/736817 [ android-nexus-5x ] blink_perf.svg/Debian.html [ Skip ]
diff --git a/tools/privacy_budget/blink_apis/BUILD.gn b/tools/privacy_budget/blink_apis/BUILD.gn index e2db625..31d2bc2 100644 --- a/tools/privacy_budget/blink_apis/BUILD.gn +++ b/tools/privacy_budget/blink_apis/BUILD.gn
@@ -19,6 +19,7 @@ inputs = [ web_idl_database_filepath, + "//third_party/blink/renderer/build/scripts/blinkbuild/name_style_converter.py", "blink_api_proto.py", "generate_blink_api_db.py", "web_feature.py",
diff --git a/tools/privacy_budget/blink_apis/blink_api_proto.py b/tools/privacy_budget/blink_apis/blink_api_proto.py index e3ed7060..d74cabb 100644 --- a/tools/privacy_budget/blink_apis/blink_api_proto.py +++ b/tools/privacy_budget/blink_apis/blink_api_proto.py
@@ -4,7 +4,7 @@ from __future__ import print_function -from v8_utilities import capitalize +from blinkbuild import name_style_converter from google.protobuf.text_format import MessageToString import web_idl import blink_apis_pb2 as pb @@ -78,10 +78,14 @@ return None if parent is not None: - prefix = '%s_%s' % (capitalize( - parent.identifier), capitalize(member.identifier)) + prefix = '{}_{}'.format( + name_style_converter.NameStyleConverter( + parent.identifier).to_upper_camel_case(), + name_style_converter.NameStyleConverter( + member.identifier).to_upper_camel_case()) else: - prefix = capitalize(member.identifier) + prefix = name_style_converter.NameStyleConverter( + member.identifier).to_upper_camel_case() suffix = "" if isinstance(member, web_idl.FunctionLike):
diff --git a/ui/android/java/res/values/attrs.xml b/ui/android/java/res/values/attrs.xml index 29af8f9..9a656c4 100644 --- a/ui/android/java/res/values/attrs.xml +++ b/ui/android/java/res/values/attrs.xml
@@ -11,7 +11,6 @@ <!-- Material roles currently only used in downstream. Define them here so public builds do not complain the attribute is not found. Removal tracked in https://crbug.com/1216204. --> - <attr name="colorOnPrimaryContainer" format="color"/> <attr name="colorOnSurfaceVariant" format="color"/> <attr name="colorOnSurfaceInverse" format="color"/> <attr name="elevationOverlayAccentColor" format="color"/>
diff --git a/ui/android/java/res/values/color_palette.xml b/ui/android/java/res/values/color_palette.xml index 54a25a3..691686d 100644 --- a/ui/android/java/res/values/color_palette.xml +++ b/ui/android/java/res/values/color_palette.xml
@@ -10,14 +10,12 @@ <color name="baseline_primary_200">#A8C7FA</color> <color name="baseline_primary_600">#0B57D0</color> <color name="baseline_primary_800">#062E6F</color> - <color name="baseline_primary_900">#041E49</color> <color name="baseline_neutral_100">#E3E3E3</color> <color name="baseline_neutral_100_alpha_12">#1EE3E3E3</color> <color name="baseline_neutral_900_alpha_12">#1E1F1F1F</color> <color name="baseline_neutral_900_with_neutral_100_alpha_38">#696969</color> <color name="baseline_neutral_variant_100">#E1E3E1</color> <color name="baseline_neutral_variant_200">#C4C7C5</color> - <color name="baseline_neutral_variant_200_alpha_15">#26C4C7C5</color> <color name="baseline_neutral_variant_400">#8E918F</color> <color name="baseline_neutral_900_with_neutral_200_alpha_12_with_primary_200_alpha_2">#353637</color>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index 3a6e38fe..d012fd0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -907,7 +907,7 @@ <translation id="9099674669267916096">பக்க எண்ணிக்கை</translation> <translation id="9100610230175265781">கடவுச்சொற்றொடர் தேவை</translation> <translation id="9110990317705400362">உங்கள் உலாவலைத் பாதுகாப்பாக்கும் வழிகளைத் தொடர்ந்து தேடுகிறோம். முன்னர், எந்த இணையதளமும் நீட்டிப்பை உங்கள் உலாவியில் சேர்க்கக் கேட்கலாம். சமீபத்திய Google Chrome பதிப்புகளில், நீட்டிப்புகள் பக்கம் வழியாக அவற்றைச் சேர்ப்பதன் மூலம், இந்த நீட்டிப்புகளை நிறுவ விரும்புகிறீர்களா என்பதை வெளிப்படையாக Chromeக்குக் கூற வேண்டும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> -<translation id="9111102763498581341">பூட்டைத் திற</translation> +<translation id="9111102763498581341">அன்லாக் செய்</translation> <translation id="912419004897138677">கோடெக்</translation> <translation id="9129931661813833980">கோப்புறையைப் பின் செய்</translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' இன் உறுப்பினர்கள் இந்தக் கோப்புகளுக்கான அணுகலைப் பெறுவார்கள்.</translation>
diff --git a/ui/gl/dc_layer_tree.cc b/ui/gl/dc_layer_tree.cc index 3cb753a..3dc6f605 100644 --- a/ui/gl/dc_layer_tree.cc +++ b/ui/gl/dc_layer_tree.cc
@@ -125,8 +125,6 @@ HRESULT hr = video_processor_wrapper.video_device->CreateVideoProcessorEnumerator( &desc, &video_processor_wrapper.video_processor_enumerator); - base::UmaHistogramSparse( - "GPU.DirectComposition.CreateVideoProcessorEnumerator", hr); if (FAILED(hr)) { DLOG(ERROR) << "CreateVideoProcessorEnumerator failed with error 0x" << std::hex << hr; @@ -138,8 +136,6 @@ hr = video_processor_wrapper.video_device->CreateVideoProcessor( video_processor_wrapper.video_processor_enumerator.Get(), 0, &video_processor_wrapper.video_processor); - base::UmaHistogramSparse( - "GPU.DirectComposition.VideoDeviceCreateVideoProcessor", hr); if (FAILED(hr)) { DLOG(ERROR) << "CreateVideoProcessor failed with error 0x" << std::hex << hr;
diff --git a/ui/gl/swap_chain_presenter.cc b/ui/gl/swap_chain_presenter.cc index 51551bef..6e2da6c3 100644 --- a/ui/gl/swap_chain_presenter.cc +++ b/ui/gl/swap_chain_presenter.cc
@@ -340,8 +340,6 @@ copy_texture_.Reset(); HRESULT hr = d3d11_device_->CreateTexture2D(&desc, nullptr, &staging_texture_); - base::UmaHistogramSparse( - "GPU.DirectComposition.UploadVideoImages.CreateStagingTexture", hr); if (FAILED(hr)) { DLOG(ERROR) << "Creating D3D11 video staging texture failed: " << std::hex << hr; @@ -400,8 +398,6 @@ desc.BindFlags = D3D11_BIND_DECODER; desc.CPUAccessFlags = 0; HRESULT hr = d3d11_device_->CreateTexture2D(&desc, nullptr, ©_texture_); - base::UmaHistogramSparse( - "GPU.DirectComposition.UploadVideoImages.CreateCopyTexture", hr); if (FAILED(hr)) { DLOG(ERROR) << "Creating D3D11 video upload texture failed: " << std::hex << hr;
diff --git a/url/BUILD.gn b/url/BUILD.gn index 2440c8b..ac173661 100644 --- a/url/BUILD.gn +++ b/url/BUILD.gn
@@ -211,10 +211,6 @@ "//testing/gtest", ] - if (!is_ios) { - sources += [ "mojom/url_gurl_mojom_traits_unittest.cc" ] - } - if (use_platform_icu_alternatives) { # Unit tests that are not supported by the current ICU alternatives on Android. if (is_android) { @@ -239,8 +235,10 @@ } if (!is_ios) { + sources += [ "mojom/url_gurl_mojom_traits_unittest.cc" ] deps += [ "//mojo/core/embedder", + "//url/ipc:url_ipc_unittests", "//url/mojom:test_url_mojom_gurl", ] }
diff --git a/url/ipc/BUILD.gn b/url/ipc/BUILD.gn index 9b3d9db..7b34349d 100644 --- a/url/ipc/BUILD.gn +++ b/url/ipc/BUILD.gn
@@ -22,13 +22,14 @@ # IPC unit tests aren't build on iOS. if (!is_ios) { - test("url_ipc_unittests") { + source_set("url_ipc_unittests") { + testonly = true + sources = [ "url_param_traits_unittest.cc" ] deps = [ ":url_ipc", "//base", - "//base/test:run_all_unittests", "//ipc:test_support", "//testing/gtest", "//url:url",
diff --git a/url/ipc/url_param_traits_unittest.cc b/url/ipc/url_param_traits_unittest.cc index 79b5b43..7115394 100644 --- a/url/ipc/url_param_traits_unittest.cc +++ b/url/ipc/url_param_traits_unittest.cc
@@ -118,20 +118,19 @@ ExpectSerializationRoundtrips(url1_with_replaced_path); #endif - // On Windows, `url1_with_replaced_path` will round-trip as `url2`. (There is - // nothing wrong with `url2` - its serialization round-trips just fine; the - // test assertions below just help explain the lack of round-tripping of - // `url1_with_replaced_path` above.) - GURL url2("file://hostname/C:/dir/file.txt"); - ExpectSerializationRoundtrips(url2); + // On Windows, IPC will serialize/deserialze `url1_with_replaced_path` as + // `url2` (i.e. it won't round-trip the URL spec). The test assertions below + // help illustrate why we can't assert ExpectSerializationRoundtrips above (on + // Windows). + EXPECT_EQ("file://hostname/C:/dir/file.txt", url1_with_replaced_path.spec()); + GURL url2(url1_with_replaced_path.spec()); #ifdef WIN32 - EXPECT_EQ(url2.spec(), url1_with_replaced_path.spec()); - EXPECT_EQ(url2.path(), url1_with_replaced_path.path()); - EXPECT_EQ(url2.host(), url1_with_replaced_path.host()); - EXPECT_EQ("/C:/dir/file.txt", url2.path()); + EXPECT_NE(url2.spec(), url1_with_replaced_path.spec()); EXPECT_EQ("", url2.host()); #else - EXPECT_EQ("/C:/dir/file.txt", url2.path()); + EXPECT_EQ(url2.spec(), url1_with_replaced_path.spec()); EXPECT_EQ("hostname", url2.host()); #endif + EXPECT_EQ(url2.path(), url1_with_replaced_path.path()); + ExpectSerializationRoundtrips(url2); }
diff --git a/url/url_canon_host.cc b/url/url_canon_host.cc index 0d178c7..dc867b8 100644 --- a/url/url_canon_host.cc +++ b/url/url_canon_host.cc
@@ -3,10 +3,8 @@ // found in the LICENSE file. #include "base/check.h" -#include "base/metrics/histogram_macros.h" #include "url/url_canon.h" #include "url/url_canon_internal.h" -#include "url/url_canon_ip.h" namespace url { @@ -379,16 +377,6 @@ if (host_info->IsIPAddress()) { output->set_length(output_begin); output->Append(canon_ip.data(), canon_ip.length()); - } else if (host_info->family == CanonHostInfo::NEUTRAL) { - // Only need to call CheckHostnameSafety() for valid hosts that aren't IP - // addresses and aren't broken. - HostSafetyStatus host_safety_status = CheckHostnameSafety(spec, host); - // Don't record kOK. Ratio of OK to not-OK statuses is not meaningful at - // this layer, and hostnames are canonicalized a lot. - if (host_safety_status != HostSafetyStatus::kOk) { - UMA_HISTOGRAM_ENUMERATION("Net.Url.HostSafetyStatus", - host_safety_status); - } } } else { // Canonicalization failed. Set BROKEN to notify the caller.
diff --git a/url/url_canon_ip.cc b/url/url_canon_ip.cc index 10e776d..132f8d5 100644 --- a/url/url_canon_ip.cc +++ b/url/url_canon_ip.cc
@@ -9,8 +9,6 @@ #include <limits> #include "base/check.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_util.h" #include "url/url_canon_internal.h" namespace url { @@ -595,105 +593,6 @@ return true; } -// Method to check if something looks like a number. Used instead of -// IPv4ComponentToNumber() so that it counts things that look like bad base-8 -// (e.g. 09). -// -// TODO(https://crbug.com/1149194): Remove this once the bug is fixed. -template <typename CHAR> -bool LooksLikeANumber(const CHAR* spec, const Component& component) { - // Empty components don't look like numbers. - if (!component.is_nonempty()) - return false; - - SharedCharTypes base = CHAR_DEC; - size_t start = component.begin; - if (component.len >= 2 && spec[start] == '0' && - (spec[start + 1] == 'x' || spec[start + 1] == 'X')) { - base = CHAR_HEX; - start += 2; - } - for (int i = start; i < component.end(); i++) { - if (!IsCharOfType(spec[i], base)) - return false; - } - return true; -} - -// Calculates the "HostSafetyStatus" of the provided hostname. -// -// TODO(https://crbug.com/1149194): Remove this once the bug is fixed. -template <typename CHAR> -HostSafetyStatus DoCheckHostnameSafety(const CHAR* spec, - const Component& host) { - if (!host.is_nonempty()) - return HostSafetyStatus::kOk; - - // Find the last two components. - - // Number of identified components. Stops after second component. Does not - // include the empty terminal component, if the host ends with a dot. - int existing_components = 0; - // Parsed component values. Populated last component first. - Component components[2]; - - // Index of the character after the end of the current component. - int cur_component_end = host.end(); - - // Ignore terminal dot, if there is one. - if (spec[cur_component_end - 1] == '.') { - cur_component_end--; - // Nothing else to do if the host is just a dot. - if (host.begin == cur_component_end) - return HostSafetyStatus::kOk; - } - - for (int i = cur_component_end; /* nothing */; i--) { - DCHECK_GE(i, host.begin); - - // If `i` is not the first character of the component, continue. - if (i != host.begin && spec[i - 1] != '.') - continue; - - // Otherwise, i is the index of the the start of a component. - components[existing_components] = Component(i, cur_component_end - i); - existing_components++; - - // Finished parsing last component. - if (i == host.begin) - break; - - // If there's anything left to parse after the 2th component, nothing more - // to do. - if (existing_components == 2) - break; - - // The next component ends before the dot at spec[i]. `i` will be - // decremented when restarting the loop, so no need to modify it. - cur_component_end = i - 1; - } - - // If the last value doesn't look like a number, no need to do more work, as - // IPv6 and hostnames with non-numeric final components are all considered OK. - if (!LooksLikeANumber(spec, components[0])) - return HostSafetyStatus::kOk; - - url::RawCanonOutputT<char> ignored_output; - CanonHostInfo host_info; - CanonicalizeIPAddress(spec, host, &ignored_output, &host_info); - // Ignore valid IPv4 addresses, and hostnames considered invalid by the IPv4 - // and IPv6 parsers. The IPv6 check doesn't provide a whole lot, but does mean - // things like "].6" will correctly be considered already invalid, so will - // return kOk. - if (host_info.family != CanonHostInfo::NEUTRAL) - return HostSafetyStatus::kOk; - - if (LooksLikeANumber(spec, components[1])) - return HostSafetyStatus::kTwoHighestLevelDomainsAreNumeric; - - return HostSafetyStatus::kTopLevelDomainIsNumeric; -} - } // namespace void AppendIPv4Address(const unsigned char address[4], CanonOutput* output) { @@ -808,13 +707,4 @@ return DoIPv6AddressToNumber<char16_t, char16_t>(spec, host, address); } -HostSafetyStatus CheckHostnameSafety(const char* spec, const Component& host) { - return DoCheckHostnameSafety(spec, host); -} - -HostSafetyStatus CheckHostnameSafety(const char16_t* spec, - const Component& host) { - return DoCheckHostnameSafety(spec, host); -} - } // namespace url
diff --git a/url/url_canon_ip.h b/url/url_canon_ip.h index 719aa45f..4b4716a3 100644 --- a/url/url_canon_ip.h +++ b/url/url_canon_ip.h
@@ -6,7 +6,6 @@ #define URL_URL_CANON_IP_H_ #include "base/component_export.h" -#include "base/strings/string_piece_forward.h" #include "url/third_party/mozilla/url_parse.h" #include "url/url_canon.h" @@ -83,48 +82,6 @@ const Component& host, unsigned char address[16]); -// Temporary enum for collecting histograms at the DNS and URL level about -// hostname validity, for potentially updating the URL spec. -// -// This is used in histograms, so old values should not be reused, and new -// values should be added at the bottom. -// -// TODO(https://crbug.com/1149194): Remove this once the bug is fixed. -enum class HostSafetyStatus { - // Any canonical hostname that doesn't fit into any other class. IPv4 - // hostnames, hostnames that don't have numeric eTLDs, etc. Hostnames that are - // broken are also considered OK. - kOk = 0, - - // The top level domain looks numeric. This is basically means it either - // parses as a number per the URL spec, or is entirely numeric ("09" doesn't - // currently parse as a number, since the leading "0" indicates an octal - // value). - kTopLevelDomainIsNumeric = 1, - - // Both the top level domain and the next level domain look like a number, - // using the above definition. This is the case that is actually concerning - - // for these domains, the eTLD+1 is purely numeric, which means putting it as - // the hostname of a URL will potentially result in an IPv4 hostname. This is - // logically a subset of kTopLevelDomainIsNumeric, but when both apply, this - // label will be returned instead. - kTwoHighestLevelDomainsAreNumeric = 2, - - kMaxValue = kTwoHighestLevelDomainsAreNumeric, -}; - -// Calculates the HostSafetyStatus of a hostname. Hostname should have been -// canonicalized. This function is only intended to be temporary, to inform -// decisions around tightening up what the URL parser considers valid hostnames. -// -// TODO(https://crbug.com/1149194): Remove this once the bug is fixed. -COMPONENT_EXPORT(URL) -HostSafetyStatus CheckHostnameSafety(const char* hostname, - const Component& host); -COMPONENT_EXPORT(URL) -HostSafetyStatus CheckHostnameSafety(const char16_t* hostname, - const Component& host); - } // namespace url #endif // URL_URL_CANON_IP_H_
diff --git a/url/url_canon_unittest.cc b/url/url_canon_unittest.cc index 84d4067..67057a3 100644 --- a/url/url_canon_unittest.cc +++ b/url/url_canon_unittest.cc
@@ -12,7 +12,6 @@ #include "url/third_party/mozilla/url_parse.h" #include "url/url_canon.h" #include "url/url_canon_internal.h" -#include "url/url_canon_ip.h" #include "url/url_canon_stdstring.h" #include "url/url_test_utils.h" @@ -2529,115 +2528,4 @@ output.set_length(0); } -TEST(URLCanonTest, URLSafetyStatus) { - const struct { - const char* host; - HostSafetyStatus expected_safety_status; - } kTestCases[] = { - // Empty components are ok. - {"", HostSafetyStatus::kOk}, - {".", HostSafetyStatus::kOk}, - {"..", HostSafetyStatus::kOk}, - - // Hostnames with purely non-numeric components are ok. - {"com", HostSafetyStatus::kOk}, - {"a.com", HostSafetyStatus::kOk}, - {"a.b.com", HostSafetyStatus::kOk}, - - // Hostnames with components with letters and numbers are ok. - {"1com", HostSafetyStatus::kOk}, - {"0a.0com", HostSafetyStatus::kOk}, - {"0xa.0xb.0xcom", HostSafetyStatus::kOk}, - {"com1", HostSafetyStatus::kOk}, - {"a1.com1", HostSafetyStatus::kOk}, - {"a1.b1.com1", HostSafetyStatus::kOk}, - - // Hostnames components that are numbers that are before a final - // non-numeric component are ok. - {"1.com", HostSafetyStatus::kOk}, - {"0.1.2com", HostSafetyStatus::kOk}, - - // Invalid hostnames are ok. - {"[", HostSafetyStatus::kOk}, - - // IPv6 hostnames are ok. - {"[::]", HostSafetyStatus::kOk}, - {"[2001:db8::1]", HostSafetyStatus::kOk}, - - // IPv4 hostnames are ok. - {"1.2.3.4", HostSafetyStatus::kOk}, - // IPv4 hostnames with creative representations are ok. - {"01.02.03.04", HostSafetyStatus::kOk}, - {"0x1.0x2.0x3.0x4", HostSafetyStatus::kOk}, - {"1.2", HostSafetyStatus::kOk}, - {"1.2.3", HostSafetyStatus::kOk}, - {"0", HostSafetyStatus::kOk}, - {"0x0", HostSafetyStatus::kOk}, - {"07", HostSafetyStatus::kOk}, - - // Hostnames with a final problematic top level domain. - {"a.0", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.123", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.123456", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.999999999999999999", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.0x1", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.0xabcdef", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.0XABCDEF", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.07", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a.09", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {".0", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"foo.bar.0", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"1.bar.0", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"a..0", HostSafetyStatus::kTopLevelDomainIsNumeric}, - {"1..0", HostSafetyStatus::kTopLevelDomainIsNumeric}, - - // Hostnames with problematic two highest level domains. - {"a.1.2", HostSafetyStatus::kTwoHighestLevelDomainsAreNumeric}, - {"a.0x1.0x2f", HostSafetyStatus::kTwoHighestLevelDomainsAreNumeric}, - {"a.06.09", HostSafetyStatus::kTwoHighestLevelDomainsAreNumeric}, - }; - - for (const auto& test_case : kTestCases) { - // Test with ASCII. - SCOPED_TRACE(test_case.host); - EXPECT_EQ(test_case.expected_safety_status, - CheckHostnameSafety(test_case.host, - Component(0, strlen(test_case.host)))); - - // Test with ASCII and terminal dot, which shouldn't affect results for - // anything that doesn't already end in a dot (or anything that only has - // dots). - std::string host_with_dot = test_case.host; - host_with_dot += "."; - EXPECT_EQ(test_case.expected_safety_status, - CheckHostnameSafety(host_with_dot.c_str(), - Component(0, host_with_dot.size()))); - - // Test with ASCII and characters that are not part of the component. - std::string host_with_bonus_characters = test_case.host; - host_with_bonus_characters = "00" + host_with_bonus_characters + "00"; - EXPECT_EQ(test_case.expected_safety_status, - CheckHostnameSafety(host_with_bonus_characters.c_str(), - Component(2, strlen(test_case.host)))); - - // Test with UTF-16. - std::u16string utf16 = base::UTF8ToUTF16(test_case.host); - EXPECT_EQ(test_case.expected_safety_status, - CheckHostnameSafety(utf16.c_str(), Component(0, utf16.size()))); - - // Test with UTF-16 and terminal dot. - std::u16string utf16_with_dot = base::UTF8ToUTF16(host_with_dot); - EXPECT_EQ(test_case.expected_safety_status, - CheckHostnameSafety(utf16_with_dot.c_str(), - Component(0, utf16_with_dot.size()))); - - // Test with UTF-16 and characters that are not part of the component. - std::u16string utf16_with_bonus_characters = - base::UTF8ToUTF16(host_with_bonus_characters); - EXPECT_EQ(test_case.expected_safety_status, - CheckHostnameSafety(utf16_with_bonus_characters.c_str(), - Component(2, utf16.size()))); - } -} - } // namespace url
diff --git a/weblayer/browser/browser_context_impl.cc b/weblayer/browser/browser_context_impl.cc index 0c91e66..01a9d26 100644 --- a/weblayer/browser/browser_context_impl.cc +++ b/weblayer/browser/browser_context_impl.cc
@@ -54,6 +54,8 @@ #include "components/permissions/contexts/geolocation_permission_context_android.h" #include "components/unified_consent/pref_names.h" #elif defined(OS_WIN) +#include <windows.h> + #include <KnownFolders.h> #include <shlobj.h> #include "base/win/scoped_co_mem.h"
diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc index ceac83a..f33ce3c 100644 --- a/weblayer/browser/content_browser_client_impl.cc +++ b/weblayer/browser/content_browser_client_impl.cc
@@ -854,9 +854,12 @@ handle)); } - throttles.push_back( - navigation_interception::InterceptNavigationDelegate::CreateThrottleFor( - handle, navigation_interception::SynchronyMode::kAsync)); + std::unique_ptr<content::NavigationThrottle> intercept_navigation_throttle = + navigation_interception::InterceptNavigationDelegate:: + MaybeCreateThrottleFor( + handle, navigation_interception::SynchronyMode::kAsync); + if (intercept_navigation_throttle) + throttles.push_back(std::move(intercept_navigation_throttle)); } #endif return throttles;