diff --git a/DEPS b/DEPS index f8c364a..5055891 100644 --- a/DEPS +++ b/DEPS
@@ -142,11 +142,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '10dea84f8dfc007114fa953fb00cb721afd98e69', + 'v8_revision': '82e7e7a361135770eeec51bdc7b329b414e9ba44', # 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. - 'swarming_revision': '779c4f0f8488c64587b75dbb001d18c3c0c4cda9', + 'swarming_revision': '9b1b0ed1f31dd42b128ae88ce50c2ab1f87ebaeb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -158,7 +158,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '40ec586a32ab67d9eea71acf0ea476a8d3cdd836', + 'pdfium_revision': 'a8f7a450950b845a9356b5d20e995f41cdcd53ed', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -189,7 +189,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': 'e13c1f46dc1afb1b2287849be5fa74ef70e0607b', + 'freetype_revision': 'c949ab0757a2514cd3a37b3e1e8390fd662a025b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. @@ -201,7 +201,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'dd7a2ceeb49ed46f23f9048b0b7fbecfb84461db', + 'catapult_revision': 'd944a1a52fef27d25c7220dd36ad93f8e38dd61b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -257,7 +257,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'spv_tools_revision': '620197bd65359b9d82c4e53e4f00d40b78b2e361', + 'spv_tools_revision': '4a00a80c40484a6f6f72f48c9d34943cf8f180d4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # 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 feed # and whatever else without interference from each other. - 'shaderc_revision': '63ab5ac953733e16f0ec7cff8a636f35619cf06e', + 'shaderc_revision': '7425820dcc76fb3818fb240e032c9fb912fa0789', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -477,7 +477,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '8d01645e5411e1368934b50b7affcb4bba8897ca', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '08c3cc4722becd9233d8160356adb5cb423c5ee5', 'condition': 'checkout_ios', }, @@ -807,7 +807,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '9dff8a1040512c53b6840304167e5cc25ff2c765', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'e77dbf6003584c55a7da1fa1ab4fecec032e17bf', 'condition': 'checkout_linux', }, @@ -832,7 +832,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '71c6bc07e67f3a09b9e03d672a154c3b638103a2', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'd2f31cc65deac117d0fc5926768630ee2be27115', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -1187,7 +1187,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'fc15cad3689508822ab2d0bb0200509ff35dbc8c', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f80d2d4f0a64cfa3a19b772b83adfdfcda1aaa19', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1396,7 +1396,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@002d0e113a3bba7a05d2c0205a90231b5d7a025f', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fbfc92ef153862c79dd860ef8cbe6b9e0ce4b669', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/ui/translations/aw_strings_am.xtb b/android_webview/ui/translations/aw_strings_am.xtb index 5bdb55e3..5527ea8 100644 --- a/android_webview/ui/translations/aw_strings_am.xtb +++ b/android_webview/ui/translations/aw_strings_am.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">በ<ph name="PAGE" /> ላይ ያለው ድረ-ገፅ ለጊዜው ተበላሽቶ ሊሆን ይችላል ወይም በቋሚነት ወደ አዲስ የድር አድራሻ ተንቀሳቅሶ ሊሆን ይችላል።</translation> <translation id="6312113039770857350">ድረ-ገጽ አይገኝም</translation> <translation id="8681531050781943054">በ<ph name="PAGE" /> ላይ ያለው ድረ-ገጽ ሊጫን አልቻለም ምክንያቱም፦</translation> -<translation id="8882178685025065378">ውይ! <ph name="PAGE" />ን ለመጎብኘት ችግር የሌለው ለመሆኑ ወላጅዎን ማስፈቀድ አለብዎት።</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />አስተያየቶች፦<ph name="MARKUP_2" /> የውሂብ ግንኙነት እንዳለዎት እርግጠኛ ይሁኑ<ph name="MARKUP_3" />ይህንን ድረ-ገጽ ቆይተው ዳግም ይጫኑት<ph name="MARKUP_4" /> ያስገቡትን አድራሻ ይፈትሹ<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ar.xtb b/android_webview/ui/translations/aw_strings_ar.xtb index 971ab61..1930f3e 100644 --- a/android_webview/ui/translations/aw_strings_ar.xtb +++ b/android_webview/ui/translations/aw_strings_ar.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">قد تكون صفحة الويب على <ph name="PAGE" /> غير متاحة مؤقتًا أو تم نقلها نهائيًا إلى عنوان ويب جديد.</translation> <translation id="6312113039770857350">صفحة الويب غير متاحة</translation> <translation id="8681531050781943054">تعذر تحميل صفحة الويب على <ph name="PAGE" /> لأن:</translation> -<translation id="8882178685025065378">عفوًا، عليك أن تسأل والديك ما إذا كان مناسبًا لك زيارة <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />اقتراحات:<ph name="MARKUP_2" />التأكد من أن لديك اتصال بيانات<ph name="MARKUP_3" />إعادة تحميل صفحة الويب هذه لاحقًا<ph name="MARKUP_4" />التحقق من العنوان الذي أدخلته<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_bg.xtb b/android_webview/ui/translations/aw_strings_bg.xtb index 9d42ccba..8ba9d45 100644 --- a/android_webview/ui/translations/aw_strings_bg.xtb +++ b/android_webview/ui/translations/aw_strings_bg.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Уеб страницата на адрес <ph name="PAGE" /> може временно да не е налице или да е била преместена на нов уеб адрес.</translation> <translation id="6312113039770857350">Уеб страницата не е налице</translation> <translation id="8681531050781943054">Уеб страницата на адрес <ph name="PAGE" /> не можа да бъде заредена, защото:</translation> -<translation id="8882178685025065378">Ами сега! Трябва да попитате родителите си дали може да посетите <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Предложения:<ph name="MARKUP_2" />Уверете се, че имате връзка за данни.<ph name="MARKUP_3" />Презаредете тази уеб страница по-късно.<ph name="MARKUP_4" />Проверете въведения от вас адрес.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_bn.xtb b/android_webview/ui/translations/aw_strings_bn.xtb index 006d3770..eae0b37 100644 --- a/android_webview/ui/translations/aw_strings_bn.xtb +++ b/android_webview/ui/translations/aw_strings_bn.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" />-এ ওয়েবপৃষ্ঠাটি অস্থায়ীভাবে ডাউন হয়ে থাকতে পারে অথবা এটি হয়ত একটি নতুন ওয়েব ঠিকানায় স্থায়ীভাবে সরানো হয়েছে।</translation> <translation id="6312113039770857350">Webpage not available</translation> <translation id="8681531050781943054"><ph name="PAGE" />-এ ওয়েবপৃষ্ঠাটি লোড করা যায়নি কারণ:</translation> -<translation id="8882178685025065378">ওহো! <ph name="PAGE" /> পৃষ্ঠাটি দেখা ঠিক হবে কিনা তা আপনার অভিভাবককে জিজ্ঞাসা করা প্রয়োজন৷</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />পরামর্শগুলি:<ph name="MARKUP_2" />নিশ্চিত হোন যে আপনার একটি ডেটা কানেকশন আছে<ph name="MARKUP_3" />পরবর্তীতে এই ওয়েব পৃষ্ঠাটি পুনরায় লোড করুন<ph name="MARKUP_4" />আপনার লেখা ঠিকানাটি পরীক্ষা করুন<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ca.xtb b/android_webview/ui/translations/aw_strings_ca.xtb index ab057ba..b9fb5b4 100644 --- a/android_webview/ui/translations/aw_strings_ca.xtb +++ b/android_webview/ui/translations/aw_strings_ca.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">És possible que la pàgina web <ph name="PAGE" /> estigui temporalment fora de servei o s'hagi traslladat permanentment a una adreça web nova.</translation> <translation id="6312113039770857350">La pàgina web no està disponible</translation> <translation id="8681531050781943054">La pàgina web <ph name="PAGE" /> no s'ha pogut carregar pels motius següents:</translation> -<translation id="8882178685025065378">Cal que preguntis als pares si pots visitar la pàgina <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Suggeriments:<ph name="MARKUP_2" />Assegureu-vos que teniu connexió de dades<ph name="MARKUP_3" />Torneu a carregar aquesta pàgina web més tard<ph name="MARKUP_4" />Comproveu l'adreça que heu introduït<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_cs.xtb b/android_webview/ui/translations/aw_strings_cs.xtb index 1d2847b..b2ba6ec 100644 --- a/android_webview/ui/translations/aw_strings_cs.xtb +++ b/android_webview/ui/translations/aw_strings_cs.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Webová stránka <ph name="PAGE" /> může být dočasně nefunkční nebo mohla být trvale přesunuta na novou webovou adresu.</translation> <translation id="6312113039770857350">Webová stránka není k dispozici</translation> <translation id="8681531050781943054">Webovou stránku <ph name="PAGE" /> nelze načíst, protože:</translation> -<translation id="8882178685025065378">Jejda! Budeš muset požádat rodiče, aby ti návštěvu stránky <ph name="PAGE" /> povolili.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Návrhy:<ph name="MARKUP_2" />Zkontrolujte, zda máte datové připojení.<ph name="MARKUP_3" />Načtěte tuto webovou stránku znovu později.<ph name="MARKUP_4" />Zkontrolujte zadanou adresu.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_da.xtb b/android_webview/ui/translations/aw_strings_da.xtb index afc40e78..be9a5de3 100644 --- a/android_webview/ui/translations/aw_strings_da.xtb +++ b/android_webview/ui/translations/aw_strings_da.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Websiden på <ph name="PAGE" /> kan være midlertidigt nede, eller også er den permanent flyttet til en ny webadresse.</translation> <translation id="6312113039770857350">Websiden er ikke tilgængelig</translation> <translation id="8681531050781943054">Websiden på <ph name="PAGE" /> kunne ikke indlæses, fordi:</translation> -<translation id="8882178685025065378">Ups! Du skal spørge en af dine forældre, om det er i orden at besøge <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Forslag:<ph name="MARKUP_2" />Kontrollér, at du har en dataforbindelse<ph name="MARKUP_3" />Genindlæs denne webside senere<ph name="MARKUP_4" />Kontrollér den indtastede adresse<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_de.xtb b/android_webview/ui/translations/aw_strings_de.xtb index adf9dba9..29f6acc 100644 --- a/android_webview/ui/translations/aw_strings_de.xtb +++ b/android_webview/ui/translations/aw_strings_de.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Die Webseite unter <ph name="PAGE" /> ist möglicherweise vorübergehend nicht verfügbar oder ist jetzt unter einer neuen Webadresse aufrufbar.</translation> <translation id="6312113039770857350">Webseite nicht verfügbar</translation> <translation id="8681531050781943054">Die Website unter <ph name="PAGE" /> konnte nicht geladen, weil:</translation> -<translation id="8882178685025065378">Hoppla! Du musst deine Eltern fragen, ob du <ph name="PAGE" /> besuchen darfst.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Vorschläge:<ph name="MARKUP_2" />Vergewissern Sie sich, dass Sie über eine Datenverbindung verfügen.<ph name="MARKUP_3" />Laden Sie diese Webseite später neu.<ph name="MARKUP_4" />Überprüfen Sie die von Ihnen eingegebene Adresse.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_el.xtb b/android_webview/ui/translations/aw_strings_el.xtb index f474f99..416b367 100644 --- a/android_webview/ui/translations/aw_strings_el.xtb +++ b/android_webview/ui/translations/aw_strings_el.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Η ιστοσελίδα στη διεύθυνση <ph name="PAGE" /> μπορεί να βρίσκεται προσωρινά εκτός λειτουργίας ή ίσως έχει μεταφερθεί μόνιμα σε μια νέα διεύθυνση ιστού.</translation> <translation id="6312113039770857350">Η ιστοσελίδα δεν είναι διαθέσιμη</translation> <translation id="8681531050781943054">Η φόρτωση της ιστοσελίδας στη διεύθυνση <ph name="PAGE" /> δεν ήταν δυνατή επειδή:</translation> -<translation id="8882178685025065378">Θα πρέπει να ζητήσετε την άδεια του γονέα σας για να επισκεφτείτε τη σελίδα <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Προτάσεις:<ph name="MARKUP_2" />Βεβαιωθείτε ότι έχετε μια σύνδεση δεδομένων<ph name="MARKUP_3" />Επαναλάβετε τη φόρτωση αυτής της ιστοσελίδας αργότερα<ph name="MARKUP_4" />Ελέγξτε τη διεύθυνση που έχετε εισαγάγει<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_en-GB.xtb b/android_webview/ui/translations/aw_strings_en-GB.xtb index 04b9854..985092a1 100644 --- a/android_webview/ui/translations/aw_strings_en-GB.xtb +++ b/android_webview/ui/translations/aw_strings_en-GB.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">The web page at <ph name="PAGE" /> might be temporarily down or it may have moved permanently to a new web address.</translation> <translation id="6312113039770857350">Web page not available</translation> <translation id="8681531050781943054">The web page at <ph name="PAGE" /> could not be loaded because:</translation> -<translation id="8882178685025065378">Oops! You need to ask your parent if it's OK to visit <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Suggestions:<ph name="MARKUP_2" />Make sure that you have a data connection<ph name="MARKUP_3" />Reload this web page later<ph name="MARKUP_4" />Check the address that you entered<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_es-419.xtb b/android_webview/ui/translations/aw_strings_es-419.xtb index 08e7d1f..7283ca3 100644 --- a/android_webview/ui/translations/aw_strings_es-419.xtb +++ b/android_webview/ui/translations/aw_strings_es-419.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Es posible que la página web de <ph name="PAGE" /> no funcione temporalmente o se haya trasladado permanentemente a una dirección web nueva.</translation> <translation id="6312113039770857350">Página web no disponible</translation> <translation id="8681531050781943054">La página web de <ph name="PAGE" /> no se pudo cargar porque:</translation> -<translation id="8882178685025065378">Debes preguntarles a tus padres si puedes visitar <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Sugerencias:<ph name="MARKUP_2" />Asegúrate de tener una conexión de datos.<ph name="MARKUP_3" />Vuelve a cargar esta pagina web más adelante.<ph name="MARKUP_4" />Comprueba la dirección que ingresaste.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_es.xtb b/android_webview/ui/translations/aw_strings_es.xtb index e84176e..b1ab503 100644 --- a/android_webview/ui/translations/aw_strings_es.xtb +++ b/android_webview/ui/translations/aw_strings_es.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">La página web <ph name="PAGE" /> podría estar temporalmente fuera de servicio o bien podría haberse trasladado a una dirección web nueva permanentemente.</translation> <translation id="6312113039770857350">Página web no disponible</translation> <translation id="8681531050781943054">No ha sido posible cargar la página web <ph name="PAGE" /> porque:</translation> -<translation id="8882178685025065378">¡Vaya! Pide permiso a tu padre, madre o tutor para acceder a la página <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Sugerencias:<ph name="MARKUP_2" />Comprueba que tienes una conexión de datos<ph name="MARKUP_3" />Vuelve a cargar esta página web más tarde<ph name="MARKUP_4" />Comprueba la dirección que has introducido<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_et.xtb b/android_webview/ui/translations/aw_strings_et.xtb index 75c81ea..4dd226a 100644 --- a/android_webview/ui/translations/aw_strings_et.xtb +++ b/android_webview/ui/translations/aw_strings_et.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Veebileht <ph name="PAGE" /> võib olla ajutiselt maas või see viidi jäädavalt üle uuele veebiaadressile.</translation> <translation id="6312113039770857350">Veebileht ei ole saadaval</translation> <translation id="8681531050781943054">Veebilehte <ph name="PAGE" /> ei saanud laadida järgmisel põhjusel.</translation> -<translation id="8882178685025065378">Vabandust! Peate vanema käest küsima, kas tohite külastada lehte <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Soovitused.<ph name="MARKUP_2" />Veenduge, et andmesideühendus oleks olemas<ph name="MARKUP_3" />Laadige veebileht hiljem uuesti<ph name="MARKUP_4" />Kontrollige sisestatud aadressi<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_fa.xtb b/android_webview/ui/translations/aw_strings_fa.xtb index 39b0db6c..164356c 100644 --- a/android_webview/ui/translations/aw_strings_fa.xtb +++ b/android_webview/ui/translations/aw_strings_fa.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">شاید صفحه وب در <ph name="PAGE" /> موقتاً غیرفعال شده باشد یا شاید بهطور دائم به آدرس وب جدیدی منتقل شده باشد.</translation> <translation id="6312113039770857350">صفحه وب در دسترس نیست</translation> <translation id="8681531050781943054">صفحه وب در <ph name="PAGE" /> نمیتواند بارگیری شود، زیرا:</translation> -<translation id="8882178685025065378">وای! باید از والدینتان بپرسید که بازدید از <ph name="PAGE" /> اشکالی نداشته باشد.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />پیشنهادات:<ph name="MARKUP_2" />مطمئن شوید اتصال داده دارید<ph name="MARKUP_3" />بعداً این صفحه وب را تازهسازی کنید<ph name="MARKUP_4" />آدرسی را که وارد کردهاید، بررسی کنید<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_fi.xtb b/android_webview/ui/translations/aw_strings_fi.xtb index f4fd1158..68a0e74 100644 --- a/android_webview/ui/translations/aw_strings_fi.xtb +++ b/android_webview/ui/translations/aw_strings_fi.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Verkkosivu <ph name="PAGE" /> saattaa olla väliaikaisesti poissa käytöstä tai se on siirretty pysyvästi uuteen osoitteeseen.</translation> <translation id="6312113039770857350">Verkkosivu ei ole saatavilla</translation> <translation id="8681531050781943054">Verkkosivun <ph name="PAGE" /> lataaminen epäonnistui:</translation> -<translation id="8882178685025065378">Hups! Sinun on kysyttävä vanhemmaltasi lupaa vierailla sivustolla <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Ehdotuksia:<ph name="MARKUP_2" />Varmista tiedonsiirtoyhteyden saatavuus.<ph name="MARKUP_3" />Lataa verkkosivu uudelleen.<ph name="MARKUP_4" />Tarkista syöttämäsi osoite.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_fil.xtb b/android_webview/ui/translations/aw_strings_fil.xtb index 9bf7ee1..e5e0098 100644 --- a/android_webview/ui/translations/aw_strings_fil.xtb +++ b/android_webview/ui/translations/aw_strings_fil.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Maaaring pansamantalang hindi gumagana ang webpage sa <ph name="PAGE" />, o kaya, maaaring permanente na itong lumipat sa isang bagong address sa web.</translation> <translation id="6312113039770857350">Hindi available ang webpage</translation> <translation id="8681531050781943054">Hindi ma-load ang webpage sa <ph name="PAGE" /> dahil:</translation> -<translation id="8882178685025065378">Oops! Kailangan mong tanungin sa iyong magulang kung OK lang na bisitahin ang <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Mga suhestyon:<ph name="MARKUP_2" />Tiyaking may koneksyon ka ng data<ph name="MARKUP_3" />Muling i-load ang webpage na ito sa ibang pagkakataon<ph name="MARKUP_4" />Tingnan ang inilagay mong address<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_fr.xtb b/android_webview/ui/translations/aw_strings_fr.xtb index d9f2af6..05cebc7 100644 --- a/android_webview/ui/translations/aw_strings_fr.xtb +++ b/android_webview/ui/translations/aw_strings_fr.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Il est possible que la page Web située à l'adresse <ph name="PAGE" /> soit temporairement inaccessible ou qu'elle ait été déplacée de façon permanente à une nouvelle adresse Web.</translation> <translation id="6312113039770857350">Page Web non disponible</translation> <translation id="8681531050781943054">Impossible de charger la page Web <ph name="PAGE" /> pour la raison suivante :</translation> -<translation id="8882178685025065378">Petit problème… Tu dois demander l'autorisation à tes parents pour accéder à la page <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Suggestions :<ph name="MARKUP_2" />Assurez-vous que vous disposez d'une connexion de données.<ph name="MARKUP_3" />Actualisez cette page ultérieurement.<ph name="MARKUP_4" />Vérifiez l'adresse que vous avez saisie.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_gu.xtb b/android_webview/ui/translations/aw_strings_gu.xtb index c58019ea..d6df6cc0 100644 --- a/android_webview/ui/translations/aw_strings_gu.xtb +++ b/android_webview/ui/translations/aw_strings_gu.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" /> પરનું વેબપેજ થોડી વાર માટે બંધ હોઈ શકે છે અથવા તે કાયમ માટે નવા વેબ ઍડ્રેસ પર ખસેડવામાં આવ્યું હોઈ શકે છે.</translation> <translation id="6312113039770857350">વેબપેજ ઉપલબ્ધ નથી</translation> <translation id="8681531050781943054"><ph name="PAGE" /> પરનું વેબપેજ લોડ કરી શકાયું નથી કારણ કે:</translation> -<translation id="8882178685025065378">અરેરે! <ph name="PAGE" /> ની મુલાકાત લો છો તે ઠીક છે કે કેમ તે તમારે તમારા માતાપિતાને પૂછવાની જરૂર છે.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />સૂચનો:<ph name="MARKUP_2" />ખાતરી કરો કે તમારી પાસે ડેટા કનેક્શન છે<ph name="MARKUP_3" />આ વેબપેજને પછીથી ફરી લોડ કરો<ph name="MARKUP_4" />તમે દાખલ કરેલું ઍડ્રેસ તપાસો<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_hi.xtb b/android_webview/ui/translations/aw_strings_hi.xtb index 8db400eb..a02f5c3 100644 --- a/android_webview/ui/translations/aw_strings_hi.xtb +++ b/android_webview/ui/translations/aw_strings_hi.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">हो सकता है कि <ph name="PAGE" /> पर मौजूद वेबपेज अस्थायी रूप से काम नहीं कर रहा हो या उसे स्थायी रूप से किसी नए वेब पते पर ले जाया गया हो.</translation> <translation id="6312113039770857350">वेबपेज उपलब्ध नहीं है</translation> <translation id="8681531050781943054"><ph name="PAGE" /> पर वेबपेज को लोड नहीं किया जा सका क्योंकि:</translation> -<translation id="8882178685025065378">ओह! आपको अपने माता-पिता से पूछना होगा कि क्या <ph name="PAGE" /> पर जाना ठीक है.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />सुझाव:<ph name="MARKUP_2" />तय करें कि आपके पास डेटा कनेक्शन है<ph name="MARKUP_3" />इस वेबपेज को बाद में फिर लोड करें<ph name="MARKUP_4" />आपने जो पता डाला है उसकी जाँच करें<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_hr.xtb b/android_webview/ui/translations/aw_strings_hr.xtb index 8f9e0f9..0eb390d3 100644 --- a/android_webview/ui/translations/aw_strings_hr.xtb +++ b/android_webview/ui/translations/aw_strings_hr.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Web-stranica na <ph name="PAGE" /> možda privremeno nije dostupna ili je trajno premještena na novu web-adresu.</translation> <translation id="6312113039770857350">Web-stranica nije dostupna</translation> <translation id="8681531050781943054">Web-stranica na <ph name="PAGE" /> ne može se učitati zbog sljedećih razloga:</translation> -<translation id="8882178685025065378">Ups! Moraš pitati roditelja smiješ li posjetiti <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Prijedlozi:<ph name="MARKUP_2" />Provjerite imate li podatkovnu vezu.<ph name="MARKUP_3" />Ponovo učitajte web-stranicu kasnije.<ph name="MARKUP_4" />Provjerite adresu koju ste unijeli.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_hu.xtb b/android_webview/ui/translations/aw_strings_hu.xtb index bd88f379..ab8715f 100644 --- a/android_webview/ui/translations/aw_strings_hu.xtb +++ b/android_webview/ui/translations/aw_strings_hu.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Előfordulhat, hogy a(z) <ph name="PAGE" /> webhelyen található oldal ideiglenesen nem érhető el, vagy véglegesen új címre költözött.</translation> <translation id="6312113039770857350">A weboldal nem érhető el</translation> <translation id="8681531050781943054">A(z) <ph name="PAGE" /> webhelyen található oldal betöltése a következő okból nem sikerült:</translation> -<translation id="8882178685025065378">Hoppá! Meg kell kérdeznie szüleit, hogy megnyithatja-e ezt az oldalt: <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Javaslatok:<ph name="MARKUP_2" />Ellenőrizze, hogy van-e adatkapcsolata<ph name="MARKUP_3" />Töltse be újra a weboldalt később<ph name="MARKUP_4" />Ellenőrizze a beírt internetcímet<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_id.xtb b/android_webview/ui/translations/aw_strings_id.xtb index 3952a4b..489b27d 100644 --- a/android_webview/ui/translations/aw_strings_id.xtb +++ b/android_webview/ui/translations/aw_strings_id.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Halaman web di <ph name="PAGE" /> mungkin tidak aktif untuk sementara atau dipindahkan secara permanen ke alamat web baru.</translation> <translation id="6312113039770857350">Halaman web tidak tersedia</translation> <translation id="8681531050781943054">Halaman web di <ph name="PAGE" /> tidak dapat dimuat karena:</translation> -<translation id="8882178685025065378">Maaf! Kamu perlu izin dari orang tua untuk membuka <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Saran:<ph name="MARKUP_2" />Pastikan Anda memiliki sambungan data<ph name="MARKUP_3" />Coba muat ulang halaman web ini nanti<ph name="MARKUP_4" />Periksa alamat yang Anda masukkan<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_it.xtb b/android_webview/ui/translations/aw_strings_it.xtb index aca26be0..b2e5e7d 100644 --- a/android_webview/ui/translations/aw_strings_it.xtb +++ b/android_webview/ui/translations/aw_strings_it.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">La pagina web all'indirizzo <ph name="PAGE" /> potrebbe non essere momentaneamente disponibile o potrebbe essere stata trasferita definitivamente a un nuovo indirizzo web.</translation> <translation id="6312113039770857350">Pagina web non disponibile</translation> <translation id="8681531050781943054">Impossibile caricare la pagina web all'indirizzo <ph name="PAGE" /> perché:</translation> -<translation id="8882178685025065378">Spiacenti. Devi chiedere ai tuoi genitori l'autorizzazione a visitare la pagina <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Suggerimenti.<ph name="MARKUP_2" />Assicurati di avere una connessione dati<ph name="MARKUP_3" />Ricarica la pagina web in un secondo momento<ph name="MARKUP_4" />Controlla l'indirizzo inserito<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_iw.xtb b/android_webview/ui/translations/aw_strings_iw.xtb index 0e2cf88..63951978 100644 --- a/android_webview/ui/translations/aw_strings_iw.xtb +++ b/android_webview/ui/translations/aw_strings_iw.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">ייתכן שדף האינטרנט בכתובת <ph name="PAGE" /> אינו פעיל זמנית, או שהוא הועבר לכתובת אינטרנט קבועה אחרת.</translation> <translation id="6312113039770857350">דף האינטרנט אינו זמין</translation> <translation id="8681531050781943054">לא ניתן היה לטעון את דף האינטרנט בכתובת <ph name="PAGE" /> מהסיבות הבאות:</translation> -<translation id="8882178685025065378">אופס! ההורים שלך צריכים לאשר לך לגשת אל <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />הצעות:<ph name="MARKUP_2" />ודא שקיים חיבור נתונים<ph name="MARKUP_3" />טען מחדש את דף האינטרנט הזה מאוחר יותר<ph name="MARKUP_4" />בדוק את הכתובת שהזנת<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ja.xtb b/android_webview/ui/translations/aw_strings_ja.xtb index 2c1c5f0..10b8ca0 100644 --- a/android_webview/ui/translations/aw_strings_ja.xtb +++ b/android_webview/ui/translations/aw_strings_ja.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">ウェブページ(<ph name="PAGE" />)は一時的に利用できなくなっているか、新しいウェブアドレスに移動した可能性があります。</translation> <translation id="6312113039770857350">ウェブページへのアクセス不可</translation> <translation id="8681531050781943054">ウェブページ(<ph name="PAGE" />)は次の理由で読み込めませんでした:</translation> -<translation id="8882178685025065378"><ph name="PAGE" /> を開いてもよいか、保護者の方におたずねください。</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />アドバイス:<ph name="MARKUP_2" />データ接続があることを確認します<ph name="MARKUP_3" />このウェブページを後で再読み込みします<ph name="MARKUP_4" />入力したアドレスを確認します<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_kn.xtb b/android_webview/ui/translations/aw_strings_kn.xtb index a897f98..3716a70 100644 --- a/android_webview/ui/translations/aw_strings_kn.xtb +++ b/android_webview/ui/translations/aw_strings_kn.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" /> ನಲ್ಲಿರುವ ವೆಬ್ಪುಟ ತಾತ್ಕಾಲಿಕವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ ಅಥವಾ ಅದನ್ನು ಶಾಶ್ವತವಾಗಿ ಹೊಸ ವೆಬ್ ವಿಳಾಸಕ್ಕೆ ಸರಿಸಲಾಗಿದೆ.</translation> <translation id="6312113039770857350">ವೆಬ್ಪುಟ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="8681531050781943054"><ph name="PAGE" /> ನಲ್ಲಿ ವೆಬ್ಪುಟವನ್ನು ಈ ಕಾರಣದಿಂದ ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ:</translation> -<translation id="8882178685025065378">ಓಹ್! ನೀವು <ph name="PAGE" /> ಗೆ ಭೇಟಿ ನೀಡುವುದು ಸರಿಯೇ ಎಂದು ನಿಮ್ಮ ಪೋಷಕರನ್ನು ಕೇಳಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />ಸಲಹೆಗಳು:<ph name="MARKUP_2" />ನೀವು ಡೇಟಾ ಸಂಪರ್ಕ ಹೊಂದಿರುವಿರಾ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ<ph name="MARKUP_3" />ಈ ವೆಬ್ ಪುಟವನ್ನು ನಂತರ ಮರುಲೋಡ್ ಮಾಡಿ<ph name="MARKUP_4" />ನೀವು ನಮೂದಿಸಿದ ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಿ<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ko.xtb b/android_webview/ui/translations/aw_strings_ko.xtb index d0a10337..76dc6247 100644 --- a/android_webview/ui/translations/aw_strings_ko.xtb +++ b/android_webview/ui/translations/aw_strings_ko.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" />의 웹페이지가 일시적으로 다운되었거나 새 웹 주소로 완전히 이동했을 수 있습니다.</translation> <translation id="6312113039770857350">웹페이지를 사용할 수 없음</translation> <translation id="8681531050781943054">다음 이유로 <ph name="PAGE" />의 웹페이지를 로드할 수 없습니다.</translation> -<translation id="8882178685025065378"><ph name="PAGE" />을(를) 방문해도 괜찮은지 부모님께 확인해야 합니다.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />제안사항:<ph name="MARKUP_2" />데이터 연결 상태 확인<ph name="MARKUP_3" />나중에 페이지 새로고침<ph name="MARKUP_4" />입력한 주소 확인<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_lt.xtb b/android_webview/ui/translations/aw_strings_lt.xtb index 0ec21b7b..f23d6b4 100644 --- a/android_webview/ui/translations/aw_strings_lt.xtb +++ b/android_webview/ui/translations/aw_strings_lt.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Gali būti, kad tinklalapis adresu <ph name="PAGE" /> laikinai neveikia arba yra visam laikui perkeltas nauju žiniatinklio adresu.</translation> <translation id="6312113039770857350">Tinklalapis nepasiekiamas</translation> <translation id="8681531050781943054">Tinklalapio adresu <ph name="PAGE" /> nepavyko įkelti, nes:</translation> -<translation id="8882178685025065378">Oi! Turite vieno iš tėvų paklausti, ar galite apsilankyti <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Pasiūlymai:<ph name="MARKUP_2" />įsitikinkite, kad veikia duomenų ryšys;<ph name="MARKUP_3" />vėliau iš naujo įkelkite šį tinklalapį;<ph name="MARKUP_4" />patikrinkite įvestą adresą<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_lv.xtb b/android_webview/ui/translations/aw_strings_lv.xtb index a94c7a1..517051b 100644 --- a/android_webview/ui/translations/aw_strings_lv.xtb +++ b/android_webview/ui/translations/aw_strings_lv.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Tīmekļa lapa <ph name="PAGE" /> var būt īslaicīgi nepieejama, vai tā var būt pārvietota uz jaunu tīmekļa adresi.</translation> <translation id="6312113039770857350">Tīmekļa lapa nav pieejama</translation> <translation id="8681531050781943054">Tīmekļa lapu <ph name="PAGE" /> nevarēja ielādēt tālāk norādīto iemeslu dēļ.</translation> -<translation id="8882178685025065378">Pajautājiet vecākiem, vai drīkstat apmeklēt lapu <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Ieteikumi.<ph name="MARKUP_2" />Pārbaudiet, vai ir pieejams datu savienojums.<ph name="MARKUP_3" />Ielādējiet šo tīmekļa lapu vēlāk.<ph name="MARKUP_4" />Pārbaudiet, vai ir ievadīta pareiza adrese.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ml.xtb b/android_webview/ui/translations/aw_strings_ml.xtb index 37e9af7..8c42d56 100644 --- a/android_webview/ui/translations/aw_strings_ml.xtb +++ b/android_webview/ui/translations/aw_strings_ml.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" /> എന്നതിലെ വെബ്പേജ് താല്ക്കാലികമായി പ്രവർത്തനരഹിതമായിരിക്കാം, അല്ലെങ്കില് അത് ശാശ്വതമായി ഒരു പുതിയ വെബ് വിലാസത്തിലേക്ക് മാറ്റിയിരിക്കാം.</translation> <translation id="6312113039770857350">വെബ്പേജ് ലഭ്യമല്ല</translation> <translation id="8681531050781943054">ഇനിപ്പറയുന്ന കാരണങ്ങളാൽ <ph name="PAGE" /> എന്നതിലെ വെബ്പേജ് ലോഡ് ചെയ്യാനായില്ല:</translation> -<translation id="8882178685025065378">ക്ഷമിക്കണം! <ph name="PAGE" /> സന്ദർശിക്കാൻ രക്ഷിതാവിന് സമ്മതമാണോയെന്ന് നിങ്ങൾ ചോദിക്കേണ്ടതുണ്ട്.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />നിർദ്ദേശങ്ങൾ:<ph name="MARKUP_2" />നിങ്ങൾക്കൊരു ഡാറ്റ കണക്ഷൻ ഉണ്ടെന്ന് ഉറപ്പാക്കുക<ph name="MARKUP_3" />ഈ വെബ്പേജ് പിന്നീട് വീണ്ടും ലോഡ് ചെയ്യുക<ph name="MARKUP_4" />നിങ്ങൾ നൽകിയ വിലാസം പരിശോധിക്കുക<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_mr.xtb b/android_webview/ui/translations/aw_strings_mr.xtb index f44576b..bfe23d9 100644 --- a/android_webview/ui/translations/aw_strings_mr.xtb +++ b/android_webview/ui/translations/aw_strings_mr.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" /> वरील वेबपेज कदाचित तात्पुरते बंद आहे किंवा ते कदाचित कायमचे नवीन वेब पत्त्यावर हलवले आहे.</translation> <translation id="6312113039770857350">वेबपेज उपलब्ध नाही</translation> <translation id="8681531050781943054"><ph name="PAGE" /> वरील वेबपेज लोड केले जाऊ शकले नाही कारण:</translation> -<translation id="8882178685025065378">अरेरे! <ph name="PAGE" /> ला भेट देणे योग्य आहे किंवा नाही ते तुमच्या पालकांना विचारावे लागेल.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />सूचना:<ph name="MARKUP_2" />आपल्याकडे डेटा कनेक्शन असल्याचे निश्चित करा<ph name="MARKUP_3" />हे वेबपेज नंतर रीलोड करा<ph name="MARKUP_4" />तुम्ही एंटर केलेला अॅड्रेस तपासा<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ms.xtb b/android_webview/ui/translations/aw_strings_ms.xtb index 414e9b10a..4d71fcb7 100644 --- a/android_webview/ui/translations/aw_strings_ms.xtb +++ b/android_webview/ui/translations/aw_strings_ms.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Halaman web di <ph name="PAGE" /> mungkin tergendala sebentar atau mungkin telah dipindahkan secara kekal ke alamat web baharu.</translation> <translation id="6312113039770857350">Halaman web tidak tersedia</translation> <translation id="8681531050781943054">Halaman web di <ph name="PAGE" /> tidak boleh dimuatkan kerana:</translation> -<translation id="8882178685025065378">Op! Anda perlu bertanya kepada ibu bapa sama ada anda boleh melawati <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Cadangan:<ph name="MARKUP_2" />Pastikan anda mempunyai sambungan data<ph name="MARKUP_3" />Muatkan semula halaman web ini kemudian<ph name="MARKUP_4" />Semak alamat yang anda masukkan<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_nl.xtb b/android_webview/ui/translations/aw_strings_nl.xtb index 4e25a8c..b0e7687 100644 --- a/android_webview/ui/translations/aw_strings_nl.xtb +++ b/android_webview/ui/translations/aw_strings_nl.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">De webpagina op <ph name="PAGE" /> is mogelijk tijdelijk niet beschikbaar of is permanent verplaatst naar een nieuw webadres.</translation> <translation id="6312113039770857350">Webpagina niet beschikbaar</translation> <translation id="8681531050781943054">De webpagina op <ph name="PAGE" /> kan niet worden geladen vanwege het volgende:</translation> -<translation id="8882178685025065378">Je moet je volwassene vragen of je <ph name="PAGE" /> mag bezoeken.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Suggesties:<ph name="MARKUP_2" />Controleer of er een gegevensverbinding beschikbaar is<ph name="MARKUP_3" />Laad deze pagina later opnieuw<ph name="MARKUP_4" />Controleer het adres dat je hebt opgegeven<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_no.xtb b/android_webview/ui/translations/aw_strings_no.xtb index 9a684b0..6f8f527 100644 --- a/android_webview/ui/translations/aw_strings_no.xtb +++ b/android_webview/ui/translations/aw_strings_no.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Det kan hende at nettsiden på <ph name="PAGE" /> er midlertidig nede eller flyttet permanent til en ny nettadresse.</translation> <translation id="6312113039770857350">Nettsiden er ikke tilgjengelig</translation> <translation id="8681531050781943054">Nettsiden på <ph name="PAGE" /> kunne ikke lastes inn fordi</translation> -<translation id="8882178685025065378">Beklager. Du må spørre en av foreldrene dine om det er greit at du går til <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Forslag:<ph name="MARKUP_2" />Sjekk at du har datatilkobling.<ph name="MARKUP_3" />Last inn denne nettsiden på nytt senere.<ph name="MARKUP_4" />Kontrollér adressen du har skrevet inn.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_pl.xtb b/android_webview/ui/translations/aw_strings_pl.xtb index 7dde100f..0f3eb05 100644 --- a/android_webview/ui/translations/aw_strings_pl.xtb +++ b/android_webview/ui/translations/aw_strings_pl.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Strona <ph name="PAGE" /> może być chwilowo niedostępna lub została przeniesiona pod nowy adres.</translation> <translation id="6312113039770857350">Strona internetowa jest niedostępna</translation> <translation id="8681531050781943054">Nie można załadować strony <ph name="PAGE" />, ponieważ:</translation> -<translation id="8882178685025065378">Ups… Aby wejść na stronę <ph name="PAGE" />, musisz poprosić o zgodę rodzica.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Sugestie:<ph name="MARKUP_2" />Upewnij się, że działa połączenie transmisji danych.<ph name="MARKUP_3" />Załaduj tę stronę ponownie później.<ph name="MARKUP_4" />Sprawdź wpisany adres.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_pt-BR.xtb b/android_webview/ui/translations/aw_strings_pt-BR.xtb index c3735d7..575f4df2 100644 --- a/android_webview/ui/translations/aw_strings_pt-BR.xtb +++ b/android_webview/ui/translations/aw_strings_pt-BR.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">A página da Web no endereço <ph name="PAGE" /> pode estar temporariamente inativa ou pode ter sido transferida para um novo endereço.</translation> <translation id="6312113039770857350">Página da Web não disponível</translation> <translation id="8681531050781943054">Não foi possível carregar a página da Web no endereço <ph name="PAGE" /> porque:</translation> -<translation id="8882178685025065378">Ops! É necessária a permissão do seu responsável para visitar <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Sugestões:<ph name="MARKUP_2" />certifique-se de que você tenha uma conexão de dados<ph name="MARKUP_3" />atualize esta página da Web mais tarde<ph name="MARKUP_4" />verifique o endereço que digitou<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_pt-PT.xtb b/android_webview/ui/translations/aw_strings_pt-PT.xtb index 76a7a53e..8bbebdc 100644 --- a/android_webview/ui/translations/aw_strings_pt-PT.xtb +++ b/android_webview/ui/translations/aw_strings_pt-PT.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">A página Web em <ph name="PAGE" /> pode estar temporariamente indisponível ou pode ter sido permanentemente movida para um novo endereço Web.</translation> <translation id="6312113039770857350">Página Web não disponível</translation> <translation id="8681531050781943054">Não foi possível carregar a página Web em <ph name="PAGE" /> porque:</translation> -<translation id="8882178685025065378">Ups! Tens de perguntar ao teu encarregado de educação se podes aceder a <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Sugestões:<ph name="MARKUP_2" />Assegure-se de que tem uma ligação de dados<ph name="MARKUP_3" />Recarregue esta página Web mais tarde<ph name="MARKUP_4" />Verifique o endereço que introduziu<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ro.xtb b/android_webview/ui/translations/aw_strings_ro.xtb index acdc2fd..3dc552dd 100644 --- a/android_webview/ui/translations/aw_strings_ro.xtb +++ b/android_webview/ui/translations/aw_strings_ro.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Este posibil ca pagina web de la <ph name="PAGE" /> să fie blocată temporar sau să fi fost mutată definitiv la o nouă adresă web.</translation> <translation id="6312113039770857350">Pagina web nu este disponibilă</translation> <translation id="8681531050781943054">Pagina de la <ph name="PAGE" /> nu a putut fi încărcată, deoarece:</translation> -<translation id="8882178685025065378">Hopa! Trebuie să-ți întrebi părintele dacă poți accesa <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Sugestii:<ph name="MARKUP_2" />asigură-te că ai o conexiune de date;<ph name="MARKUP_3" />reîncarcă mai târziu această pagină web;<ph name="MARKUP_4" />verifică adresa pe care ai introdus-o.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ru.xtb b/android_webview/ui/translations/aw_strings_ru.xtb index c4969a8d..a047ee51 100644 --- a/android_webview/ui/translations/aw_strings_ru.xtb +++ b/android_webview/ui/translations/aw_strings_ru.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Возможно, веб-страница <ph name="PAGE" /> временно недоступна или находится по новому адресу.</translation> <translation id="6312113039770857350">Не удалось открыть веб-страницу</translation> <translation id="8681531050781943054">При загрузке веб-страницы <ph name="PAGE" /> произошла ошибка по следующим причинам:</translation> -<translation id="8882178685025065378">Чтобы просмотреть страницу <ph name="PAGE" />, попросите разрешение у родителя.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Что делать?<ph name="MARKUP_2" />Убедитесь, что вы подключены к Интернету.<ph name="MARKUP_3" />Через некоторое время обновите страницу.<ph name="MARKUP_4" />Проверьте, правильно ли указан веб-адрес.<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_sk.xtb b/android_webview/ui/translations/aw_strings_sk.xtb index 8e61433..192642d 100644 --- a/android_webview/ui/translations/aw_strings_sk.xtb +++ b/android_webview/ui/translations/aw_strings_sk.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Stránka <ph name="PAGE" /> je možno dočasne nedostupná, možno bola natrvalo presunutá na novú webovú adresu.</translation> <translation id="6312113039770857350">Webová stránka nie je k dispozícii</translation> <translation id="8681531050781943054">Webovú stránku na adrese <ph name="PAGE" /> sa nepodarilo načítať z nasledujúceho dôvodu:</translation> -<translation id="8882178685025065378">Ojoj! Musíte sa spýtať rodiča, či môžete navštíviť stránku <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Návrhy:<ph name="MARKUP_2" />Skontrolujte, či máte dátové pripojenie<ph name="MARKUP_3" />Načítajte túto webovú stránku znova neskôr<ph name="MARKUP_4" />Skontrolujte zadanú adresu<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_sl.xtb b/android_webview/ui/translations/aw_strings_sl.xtb index 4170fbc..e8343b26 100644 --- a/android_webview/ui/translations/aw_strings_sl.xtb +++ b/android_webview/ui/translations/aw_strings_sl.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Spletna stran na naslovu <ph name="PAGE" /> morda začasno ni na voljo ali pa je trajno preseljena na drug spletni naslov.</translation> <translation id="6312113039770857350">Spletna stran ni na voljo</translation> <translation id="8681531050781943054">Spletne strani na naslovu <ph name="PAGE" /> ni bilo mogoče naložiti zaradi teh razlogov:</translation> -<translation id="8882178685025065378">Ojoj. Vprašati moraš starša, ali ti dovoli obiskati stran <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Predlogi:<ph name="MARKUP_2" />Poskrbite, da imate podatkovno povezavo<ph name="MARKUP_3" />Znova naložite to spletno stran pozneje<ph name="MARKUP_4" />Preverite naslov, ki ste ga vnesli<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_sr.xtb b/android_webview/ui/translations/aw_strings_sr.xtb index 910448d..ba1d65e4 100644 --- a/android_webview/ui/translations/aw_strings_sr.xtb +++ b/android_webview/ui/translations/aw_strings_sr.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Веб-страница на адреси <ph name="PAGE" /> можда привремено не функционише или је трајно премештена на нову веб-адресу.</translation> <translation id="6312113039770857350">Веб-страница није доступна</translation> <translation id="8681531050781943054">Веб-страница на адреси <ph name="PAGE" /> не може да се учита из следећих разлога:</translation> -<translation id="8882178685025065378">Упс! Мораш да питаш родитеље да ли смеш да посетиш <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Предлози:<ph name="MARKUP_2" />Проверите да ли је успостављена веза за пренос података<ph name="MARKUP_3" />Поново учитајте ову веб-страницу касније<ph name="MARKUP_4" />Проверите адресу коју сте унели<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_sv.xtb b/android_webview/ui/translations/aw_strings_sv.xtb index 6c858ed1..28ce2ed 100644 --- a/android_webview/ui/translations/aw_strings_sv.xtb +++ b/android_webview/ui/translations/aw_strings_sv.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Webbsidan på <ph name="PAGE" /> kan vara nere tillfälligt eller ha flyttats permanent till en ny webbadress.</translation> <translation id="6312113039770857350">Webbsidan är inte tillgänglig</translation> <translation id="8681531050781943054">Det gick inte att läsa in webbsidan på <ph name="PAGE" />. Orsak:</translation> -<translation id="8882178685025065378">Hoppsan! Du måste be en förälder om tillstånd att besöka <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Förslag:<ph name="MARKUP_2" />Kontrollera att du använder en dataanslutning<ph name="MARKUP_3" />Läs in den här webbsidan igen senare<ph name="MARKUP_4" />Kontrollera att du har angett rätt adress<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_sw.xtb b/android_webview/ui/translations/aw_strings_sw.xtb index 2bcc2db..7ba6245 100644 --- a/android_webview/ui/translations/aw_strings_sw.xtb +++ b/android_webview/ui/translations/aw_strings_sw.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Huenda ukurasa wa wavuti ulio kwenye <ph name="PAGE" /> haupatikani kwa muda au umehamishwa kabisa hadi kwenye anwani mpya ya wavuti.</translation> <translation id="6312113039770857350">Ukurasa wa wavuti haupatikani</translation> <translation id="8681531050781943054">Ukurasa wa wavuti ulio kwenye <ph name="PAGE" /> haukuweza kupakiwa kwa sababu:</translation> -<translation id="8882178685025065378">Lo! Unahitaji kumwuliza mzazi wako ikiwa ni sawa kuutembelea <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Mapendekezo:<ph name="MARKUP_2" />Hakikisha kuwa una muunganisho wa data<ph name="MARKUP_3" />Pakia upya ukurasa huu wa wavuti baadaye<ph name="MARKUP_4" />Kagua anwani uliyoweka<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_ta.xtb b/android_webview/ui/translations/aw_strings_ta.xtb index 86647db..b1bfdfe 100644 --- a/android_webview/ui/translations/aw_strings_ta.xtb +++ b/android_webview/ui/translations/aw_strings_ta.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" /> இல் உள்ள இணையப்பக்கம் தற்காலிகமாக இயங்கவில்லை அல்லது புதிய வலை முகவரிக்கு நிரந்தரமாக நகர்த்தப்பட்டிருக்கலாம்.</translation> <translation id="6312113039770857350">இணையப்பக்கம் கிடைக்கவில்லை</translation> <translation id="8681531050781943054"><ph name="PAGE" /> இல் உள்ள இணையப்பக்கத்தை ஏற்ற முடியவில்லை, ஏனெனில்:</translation> -<translation id="8882178685025065378">அச்சச்சோ! <ph name="PAGE" />ஐப் பார்க்க, நீங்கள் பெற்றோரிடம் அனுமதி கேட்க வேண்டும்.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />பரிந்துரைகள்:<ph name="MARKUP_2" />உங்களுடைய தரவு இணைப்பைச் சரிபார்க்கவும்<ph name="MARKUP_3" />இந்த இணையப்பக்கத்தைப் பின்னர் ஏற்றவும்<ph name="MARKUP_4" />நீங்கள் உள்ளிட்ட முகவரியைச் சரிபார்க்கவும்<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_te.xtb b/android_webview/ui/translations/aw_strings_te.xtb index d2ec836..90c2ed3 100644 --- a/android_webview/ui/translations/aw_strings_te.xtb +++ b/android_webview/ui/translations/aw_strings_te.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" />లోని వెబ్పేజీ తాత్కాలికంగా నిలిపివేయబడి ఉండవచ్చు లేదా ఇది శాశ్వతంగా కొత్త వెబ్ చిరునామాకు తరలించబడి ఉండవచ్చు.</translation> <translation id="6312113039770857350">వెబ్పేజీ అందుబాటులో లేదు</translation> <translation id="8681531050781943054"><ph name="PAGE" />లోని వెబ్పేజీ ఈ కారణంగా లోడ్ కాలేదు:</translation> -<translation id="8882178685025065378">అయ్యో! మీరు <ph name="PAGE" />ను సందర్శించాలంటే మీ తల్లిదండ్రుల అనుమతి పొందాలి.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />సూచనలు:<ph name="MARKUP_2" />మీకు డేటా కనెక్షన్ ఉందని నిర్ధారించుకోండి<ph name="MARKUP_3" />ఈ వెబ్పేజీని తర్వాత మళ్లీ లోడ్ చేయండి<ph name="MARKUP_4" />మీరు నమోదు చేసిన చిరునామా తనిఖీ చేయండి<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_th.xtb b/android_webview/ui/translations/aw_strings_th.xtb index c833c3b..6aff425d 100644 --- a/android_webview/ui/translations/aw_strings_th.xtb +++ b/android_webview/ui/translations/aw_strings_th.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">หน้าเว็บที่ <ph name="PAGE" /> อาจใช้งานไม่ได้ชั่วคราวหรืออาจมีการย้ายไปยังที่อยู่เว็บใหม่อย่างถาวรแล้ว</translation> <translation id="6312113039770857350">หน้าเว็บไม่พร้อมใช้งาน</translation> <translation id="8681531050781943054">ไม่สามารถโหลดหน้าเว็บที่ <ph name="PAGE" /> เนื่องจาก:</translation> -<translation id="8882178685025065378">อ๊ะ! ถามผู้ปกครองก่อนว่าไปที่ <ph name="PAGE" /> ได้ไหม</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />คำแนะนำ:<ph name="MARKUP_2" />ตรวจสอบว่าคุณมีการเชื่อมต่ออินเทอร์เน็ต<ph name="MARKUP_3" />โหลดหน้าเว็บนี้อีกครั้งในภายหลัง<ph name="MARKUP_4" />ตรวจสอบที่อยู่ที่คุณป้อน<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_tr.xtb b/android_webview/ui/translations/aw_strings_tr.xtb index 35f388cd..f2ab10a 100644 --- a/android_webview/ui/translations/aw_strings_tr.xtb +++ b/android_webview/ui/translations/aw_strings_tr.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772"><ph name="PAGE" /> adresindeki web sayfası geçici olarak kullanılamıyor veya kalıcı olarak yeni bir web adresine taşınmış olabilir.</translation> <translation id="6312113039770857350">Web sayfası mevcut değil</translation> <translation id="8681531050781943054"><ph name="PAGE" /> adresindeki web sayfası şu nedenle yüklenemedi:</translation> -<translation id="8882178685025065378">Hay aksi! <ph name="PAGE" /> sayfasını ziyaret etmende bir sakınca olup olmadığını annene veya babana sorman gerekiyor.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Öneriler:<ph name="MARKUP_2" />Veri bağlantınızın olduğundan emin olun<ph name="MARKUP_3" />Bu web sayfasını daha sonra yükleyin<ph name="MARKUP_4" />Girdiğiniz adresi kontrol edin<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_uk.xtb b/android_webview/ui/translations/aw_strings_uk.xtb index 36ed0b7..4bd296a 100644 --- a/android_webview/ui/translations/aw_strings_uk.xtb +++ b/android_webview/ui/translations/aw_strings_uk.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Можливо, веб-сторінка <ph name="PAGE" /> тимчасово недоступна або її назавжди переміщено на нову веб-адресу.</translation> <translation id="6312113039770857350">Веб-сторінка недоступна</translation> <translation id="8681531050781943054">Не вдалося завантажити веб-сторінку <ph name="PAGE" />.</translation> -<translation id="8882178685025065378">Потрібно запитати когось із батьків, чи ви можете відвідувати сторінку <ph name="PAGE" />.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Пропозиції.<ph name="MARKUP_2" />Переконайтеся, що пристрій під’єднано до мобільного Інтернету.<ph name="MARKUP_3" />Оновіть цю веб-сторінку пізніше<ph name="MARKUP_4" />Перевірне адресу, яку ви ввели<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_vi.xtb b/android_webview/ui/translations/aw_strings_vi.xtb index b6b16092..003a4a0 100644 --- a/android_webview/ui/translations/aw_strings_vi.xtb +++ b/android_webview/ui/translations/aw_strings_vi.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">Trang web tại <ph name="PAGE" /> có thể tạm thời không hoạt động hoặc có thể đã được chuyển vĩnh viễn sang địa chỉ web mới.</translation> <translation id="6312113039770857350">Trang web hiện không khả dụng</translation> <translation id="8681531050781943054">Không thể tải trang web tại <ph name="PAGE" /> do:</translation> -<translation id="8882178685025065378">Rất tiếc! Bạn cần hỏi cha mẹ xem có được phép truy cập <ph name="PAGE" /> hay không.</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />Đề xuất:<ph name="MARKUP_2" />Đảm bảo bạn có kết nối dữ liệu<ph name="MARKUP_3" />Tải lại trang web này sau<ph name="MARKUP_4" />Kiểm tra địa chỉ bạn đã nhập<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_zh-CN.xtb b/android_webview/ui/translations/aw_strings_zh-CN.xtb index efd60d11..3e78f9c 100644 --- a/android_webview/ui/translations/aw_strings_zh-CN.xtb +++ b/android_webview/ui/translations/aw_strings_zh-CN.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">位于 <ph name="PAGE" /> 的网页可能暂时无法打开或已永久移至新网址。</translation> <translation id="6312113039770857350">网页无法打开</translation> <translation id="8681531050781943054">位于 <ph name="PAGE" /> 的网页无法加载,因为:</translation> -<translation id="8882178685025065378">抱歉!若想访问 <ph name="PAGE" />,您需要先征得家长同意。</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />建议:<ph name="MARKUP_2" />确保有数据网络连接<ph name="MARKUP_3" />稍后重新加载此网页<ph name="MARKUP_4" />检查您输入的地址是否正确<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/ui/translations/aw_strings_zh-TW.xtb b/android_webview/ui/translations/aw_strings_zh-TW.xtb index 7bf2915..b9e1527 100644 --- a/android_webview/ui/translations/aw_strings_zh-TW.xtb +++ b/android_webview/ui/translations/aw_strings_zh-TW.xtb
@@ -4,6 +4,5 @@ <translation id="6106989379647458772">位於 <ph name="PAGE" /> 的網頁可能暫時無法使用,或是已永久移至新的網址。</translation> <translation id="6312113039770857350">網頁無法使用</translation> <translation id="8681531050781943054">無法載入位於 <ph name="PAGE" /> 的網頁,原因如下:</translation> -<translation id="8882178685025065378">注意:你必須徵求家長同意,才能瀏覽 <ph name="PAGE" />。</translation> <translation id="8963213021028234748"><ph name="MARKUP_1" />建議:<ph name="MARKUP_2" />確認您的數據連線狀態正常<ph name="MARKUP_3" />稍後再重新載入這個網頁<ph name="MARKUP_4" />檢查您輸入的網址是否正確<ph name="MARKUP_5" /></translation> </translationbundle> \ No newline at end of file
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc index 436d1bc..edf667a 100644 --- a/ash/assistant/assistant_controller.cc +++ b/ash/assistant/assistant_controller.cc
@@ -241,6 +241,10 @@ return; } + // Give observers an opportunity to perform any necessary handling before we + // open the specified |url| in a new browser tab. + NotifyOpeningUrl(url, from_server); + // The new tab should be opened with a user activation since the user // interacted with the Assistant to open the url. NewWindowDelegate::GetInstance()->NewTabWithUrl( @@ -300,6 +304,11 @@ view_delegate_.NotifyDeepLinkReceived(type, params); } +void AssistantController::NotifyOpeningUrl(const GURL& url, bool from_server) { + for (AssistantControllerObserver& observer : observers_) + observer.OnOpeningUrl(url, from_server); +} + void AssistantController::NotifyUrlOpened(const GURL& url, bool from_server) { for (AssistantControllerObserver& observer : observers_) observer.OnUrlOpened(url, from_server);
diff --git a/ash/assistant/assistant_controller.h b/ash/assistant/assistant_controller.h index 16fa6cb..a996c8b 100644 --- a/ash/assistant/assistant_controller.h +++ b/ash/assistant/assistant_controller.h
@@ -146,6 +146,7 @@ void NotifyConstructed(); void NotifyDestroying(); void NotifyDeepLinkReceived(const GURL& deep_link); + void NotifyOpeningUrl(const GURL& url, bool from_server); void NotifyUrlOpened(const GURL& url, bool from_server); // mojom::VoiceInteractionObserver:
diff --git a/ash/assistant/assistant_controller_observer.h b/ash/assistant/assistant_controller_observer.h index d23e98a9..93645c7 100644 --- a/ash/assistant/assistant_controller_observer.h +++ b/ash/assistant/assistant_controller_observer.h
@@ -40,6 +40,11 @@ assistant::util::DeepLinkType type, const std::map<std::string, std::string>& params) {} + // Invoked when the specified |url| is about to be opened by Assistant in a + // new tab. If |from_server| is true, this event was triggered by a server + // response. Note that this event immediately precedes |OnUrlOpened|. + virtual void OnOpeningUrl(const GURL& url, bool from_server) {} + // Invoked when the specified |url| is opened by Assistant in a new tab. If // |from_server| is true, this event was triggered by a server response. virtual void OnUrlOpened(const GURL& url, bool from_server) {}
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc index dbf3641..3dab6bf 100644 --- a/ash/assistant/assistant_ui_controller.cc +++ b/ash/assistant/assistant_ui_controller.cc
@@ -253,7 +253,7 @@ UpdateUiMode(AssistantUiMode::kWebUi); } -void AssistantUiController::OnUrlOpened(const GURL& url, bool from_server) { +void AssistantUiController::OnOpeningUrl(const GURL& url, bool from_server) { if (model_.visibility() != AssistantVisibility::kVisible) return;
diff --git a/ash/assistant/assistant_ui_controller.h b/ash/assistant/assistant_ui_controller.h index cecaffbb..eddf2be 100644 --- a/ash/assistant/assistant_ui_controller.h +++ b/ash/assistant/assistant_ui_controller.h
@@ -101,7 +101,7 @@ void OnDeepLinkReceived( assistant::util::DeepLinkType type, const std::map<std::string, std::string>& params) override; - void OnUrlOpened(const GURL& url, bool from_server) override; + void OnOpeningUrl(const GURL& url, bool from_server) override; // AssistantUiModelObserver: void OnUiVisibilityChanged(
diff --git a/ash/host/ash_window_tree_host_platform.cc b/ash/host/ash_window_tree_host_platform.cc index bbc1888..f368a97 100644 --- a/ash/host/ash_window_tree_host_platform.cc +++ b/ash/host/ash_window_tree_host_platform.cc
@@ -24,10 +24,8 @@ #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/transform.h" -#include "ui/platform_window/platform_ime_controller.h" #include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_init_properties.h" -#include "ui/platform_window/text_input_state.h" namespace ash {
diff --git a/ash/keyboard/OWNERS b/ash/keyboard/OWNERS index 9834f7a..f0bcea4da 100644 --- a/ash/keyboard/OWNERS +++ b/ash/keyboard/OWNERS
@@ -1,3 +1,7 @@ -file://ash/keyboard/ui/OWNERS +googleo@chromium.org +shend@chromium.org +shuchen@chromium.org +wuyingbing@chromium.org +yhanada@chromium.org # COMPONENT: UI>Input>VirtualKeyboard
diff --git a/ash/keyboard/ui/OWNERS b/ash/keyboard/ui/OWNERS deleted file mode 100644 index f0bcea4da..0000000 --- a/ash/keyboard/ui/OWNERS +++ /dev/null
@@ -1,7 +0,0 @@ -googleo@chromium.org -shend@chromium.org -shuchen@chromium.org -wuyingbing@chromium.org -yhanada@chromium.org - -# COMPONENT: UI>Input>VirtualKeyboard
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index ea39ca69..8fa5013 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -470,7 +470,7 @@ <translation id="8394567579869570560">پدر یا مادرتان این دستگاه را قفل کرده است</translation> <translation id="8406981827175133772">ذرهبین تمامصفحه</translation> <translation id="8425213833346101688">تغییر</translation> -<translation id="8427213022735114808">با دیکته کردن، صدایتان به Google ارسال میشود تا بتوانید در هر فیلد نوشتاری تایپ گفتاری انجام دهید.</translation> +<translation id="8427213022735114808">با دیکته کردن، صدایتان به Google ارسال میشود تا بتوانید در هر فیلد نوشتاری تایپ صوتی انجام دهید.</translation> <translation id="8428213095426709021">تنظیمات</translation> <translation id="8433186206711564395">تنظیمات شبکه</translation> <translation id="8433977262951327081">میانبر نمایش ابزارک اعلان گزینههای ورودی در قفسه تغییر کرده است. لطفاً بهجای <ph name="OLD_SHORTCUT" /> از <ph name="NEW_SHORTCUT" /> استفاده کنید.</translation>
diff --git a/ash/system/unified/sign_out_button.cc b/ash/system/unified/sign_out_button.cc index bf23fc8..a9bd5f4 100644 --- a/ash/system/unified/sign_out_button.cc +++ b/ash/system/unified/sign_out_button.cc
@@ -14,10 +14,7 @@ : RoundedLabelButton(listener, user::GetLocalizedSignOutStringForStatus( Shell::Get()->session_controller()->login_status(), - false /* multiline */)) { - SetVisible(Shell::Get()->session_controller()->login_status() != - LoginStatus::NOT_LOGGED_IN); -} + false /* multiline */)) {} SignOutButton::~SignOutButton() = default;
diff --git a/ash/system/unified/sign_out_button.h b/ash/system/unified/sign_out_button.h index dff18ae2..d6bf363 100644 --- a/ash/system/unified/sign_out_button.h +++ b/ash/system/unified/sign_out_button.h
@@ -14,9 +14,9 @@ namespace ash { -// Sign out button shown in TopShortcutView with TopShortcutButtons. +// Sign out button to be shown in TopShortcutView with TopShortcutButtons. // Shows the label like "Sign out", "Exit guest", etc. depending on the session -// status. Not visible when not signed in. +// status. class SignOutButton : public RoundedLabelButton { public: explicit SignOutButton(views::ButtonListener* listener);
diff --git a/ash/system/unified/top_shortcuts_view.cc b/ash/system/unified/top_shortcuts_view.cc index 1d842a4..917e9c8 100644 --- a/ash/system/unified/top_shortcuts_view.cc +++ b/ash/system/unified/top_shortcuts_view.cc
@@ -7,6 +7,7 @@ #include <numeric> #include "ash/accessibility/accessibility_controller.h" +#include "ash/kiosk_next/kiosk_next_shell_controller.h" #include "ash/public/cpp/ash_view_ids.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/session/session_controller_impl.h" @@ -166,39 +167,44 @@ container_ = new TopShortcutButtonContainer(); AddChildView(container_); - if (Shell::Get()->session_controller()->login_status() != - LoginStatus::NOT_LOGGED_IN) { + ash::Shell* shell = Shell::Get(); + + bool is_on_login_screen = + shell->session_controller()->login_status() == LoginStatus::NOT_LOGGED_IN; + bool is_kiosk_next = shell->kiosk_next_shell_controller()->IsEnabled(); + bool can_show_settings = TrayPopupUtils::CanOpenWebUISettings(); + bool can_lock_screen = shell->session_controller()->CanLockScreen(); + + if (!is_on_login_screen) { user_avatar_button_ = new UserAvatarButton(this); user_avatar_button_->SetEnabled( UserChooserDetailedViewController::IsUserChooserEnabled()); container_->AddUserAvatarButton(user_avatar_button_); + + sign_out_button_ = new SignOutButton(this); + container_->AddSignOutButton(sign_out_button_); } - // Show the buttons in this row as disabled if the user is at the login - // screen, lock screen, or in a secondary account flow. The exception is - // |power_button_| which is always shown as enabled. - const bool can_show_web_ui = TrayPopupUtils::CanOpenWebUISettings(); + if (!is_kiosk_next) { + bool reboot = shell->shutdown_controller()->reboot_on_shutdown(); + power_button_ = new TopShortcutButton( + this, kUnifiedMenuPowerIcon, + reboot ? IDS_ASH_STATUS_TRAY_REBOOT : IDS_ASH_STATUS_TRAY_SHUTDOWN); + power_button_->SetID(VIEW_ID_POWER_BUTTON); + container_->AddChildView(power_button_); + } - sign_out_button_ = new SignOutButton(this); - container_->AddSignOutButton(sign_out_button_); + if (can_show_settings && can_lock_screen && !is_kiosk_next) { + lock_button_ = new TopShortcutButton(this, kUnifiedMenuLockIcon, + IDS_ASH_STATUS_TRAY_LOCK); + container_->AddChildView(lock_button_); + } - bool reboot = Shell::Get()->shutdown_controller()->reboot_on_shutdown(); - power_button_ = new TopShortcutButton( - this, kUnifiedMenuPowerIcon, - reboot ? IDS_ASH_STATUS_TRAY_REBOOT : IDS_ASH_STATUS_TRAY_SHUTDOWN); - power_button_->SetID(VIEW_ID_POWER_BUTTON); - container_->AddChildView(power_button_); - - lock_button_ = new TopShortcutButton(this, kUnifiedMenuLockIcon, - IDS_ASH_STATUS_TRAY_LOCK); - lock_button_->SetVisible(can_show_web_ui && - Shell::Get()->session_controller()->CanLockScreen()); - container_->AddChildView(lock_button_); - - settings_button_ = new TopShortcutButton(this, kUnifiedMenuSettingsIcon, - IDS_ASH_STATUS_TRAY_SETTINGS); - settings_button_->SetVisible(can_show_web_ui); - container_->AddChildView(settings_button_); + if (can_show_settings) { + settings_button_ = new TopShortcutButton(this, kUnifiedMenuSettingsIcon, + IDS_ASH_STATUS_TRAY_SETTINGS); + container_->AddChildView(settings_button_); + } // |collapse_button_| should be right-aligned, so we make the buttons // container flex occupying all remaining space. @@ -209,7 +215,7 @@ OnAccessibilityStatusChanged(); - Shell::Get()->accessibility_controller()->AddObserver(this); + shell->accessibility_controller()->AddObserver(this); } TopShortcutsView::~TopShortcutsView() {
diff --git a/ash/system/unified/top_shortcuts_view_unittest.cc b/ash/system/unified/top_shortcuts_view_unittest.cc index 88d3245..a105e62 100644 --- a/ash/system/unified/top_shortcuts_view_unittest.cc +++ b/ash/system/unified/top_shortcuts_view_unittest.cc
@@ -4,6 +4,9 @@ #include "ash/system/unified/top_shortcuts_view.h" +#include "ash/kiosk_next/kiosk_next_shell_test_util.h" +#include "ash/kiosk_next/mock_kiosk_next_shell_client.h" +#include "ash/public/cpp/ash_features.h" #include "ash/session/test_session_controller_client.h" #include "ash/system/unified/collapse_button.h" #include "ash/system/unified/sign_out_button.h" @@ -11,8 +14,8 @@ #include "ash/system/unified/unified_system_tray_controller.h" #include "ash/system/unified/unified_system_tray_model.h" #include "ash/test/ash_test_base.h" - -using views::Button; +#include "base/macros.h" +#include "base/test/scoped_feature_list.h" namespace ash { @@ -23,6 +26,8 @@ ~TopShortcutsViewTest() override = default; void SetUp() override { + scoped_feature_list_.InitAndEnableFeature(features::kKioskNextShell); + NoSessionAshTestBase::SetUp(); model_ = std::make_unique<UnifiedSystemTrayModel>(); @@ -41,7 +46,12 @@ top_shortcuts_view_ = std::make_unique<TopShortcutsView>(controller_.get()); } - views::View* GetUserAvatar() { + void CreateKioskNextSession() { + kiosk_next_shell_client_ = BindMockKioskNextShellClient(); + LogInKioskNextUser(GetSessionControllerClient()); + } + + views::View* GetUserAvatar() { return top_shortcuts_view_->user_avatar_button_; } @@ -61,10 +71,12 @@ return top_shortcuts_view_->collapse_button_; } - void Layout() { - top_shortcuts_view_->Layout(); - } + void Layout() { top_shortcuts_view_->Layout(); } + private: + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<MockKioskNextShellClient> kiosk_next_shell_client_; + std::unique_ptr<UnifiedSystemTrayModel> model_; std::unique_ptr<UnifiedSystemTrayController> controller_; std::unique_ptr<TopShortcutsView> top_shortcuts_view_; @@ -76,9 +88,9 @@ TEST_F(TopShortcutsViewTest, ButtonStatesNotLoggedIn) { SetUpView(); EXPECT_EQ(nullptr, GetUserAvatar()); - EXPECT_FALSE(GetSignOutButton()->GetVisible()); - EXPECT_FALSE(GetLockButton()->GetVisible()); - EXPECT_FALSE(GetSettingsButton()->GetVisible()); + EXPECT_EQ(nullptr, GetSignOutButton()); + EXPECT_EQ(nullptr, GetLockButton()); + EXPECT_EQ(nullptr, GetSettingsButton()); EXPECT_TRUE(GetPowerButton()->GetVisible()); EXPECT_TRUE(GetCollapseButton()->GetVisible()); } @@ -87,7 +99,7 @@ TEST_F(TopShortcutsViewTest, ButtonStatesLoggedIn) { CreateUserSessions(1); SetUpView(); - EXPECT_NE(nullptr, GetUserAvatar()); + EXPECT_TRUE(GetUserAvatar()->GetVisible()); EXPECT_TRUE(GetSignOutButton()->GetVisible()); EXPECT_TRUE(GetLockButton()->GetVisible()); EXPECT_TRUE(GetSettingsButton()->GetVisible()); @@ -99,10 +111,10 @@ TEST_F(TopShortcutsViewTest, ButtonStatesLockScreen) { BlockUserSession(BLOCKED_BY_LOCK_SCREEN); SetUpView(); - EXPECT_NE(nullptr, GetUserAvatar()); + EXPECT_TRUE(GetUserAvatar()->GetVisible()); EXPECT_TRUE(GetSignOutButton()->GetVisible()); - EXPECT_FALSE(GetLockButton()->GetVisible()); - EXPECT_FALSE(GetSettingsButton()->GetVisible()); + EXPECT_EQ(nullptr, GetLockButton()); + EXPECT_EQ(nullptr, GetSettingsButton()); EXPECT_TRUE(GetPowerButton()->GetVisible()); EXPECT_TRUE(GetCollapseButton()->GetVisible()); } @@ -113,10 +125,10 @@ CreateUserSessions(1); SetUserAddingScreenRunning(true); SetUpView(); - EXPECT_NE(nullptr, GetUserAvatar()); + EXPECT_TRUE(GetUserAvatar()->GetVisible()); EXPECT_TRUE(GetSignOutButton()->GetVisible()); - EXPECT_FALSE(GetLockButton()->GetVisible()); - EXPECT_FALSE(GetSettingsButton()->GetVisible()); + EXPECT_EQ(nullptr, GetLockButton()); + EXPECT_EQ(nullptr, GetSettingsButton()); EXPECT_TRUE(GetPowerButton()->GetVisible()); EXPECT_TRUE(GetCollapseButton()->GetVisible()); } @@ -130,9 +142,9 @@ "foo@example.com", user_manager::USER_TYPE_REGULAR, enable_settings); SetUpView(); EXPECT_EQ(nullptr, GetUserAvatar()); - EXPECT_FALSE(GetSignOutButton()->GetVisible()); - EXPECT_FALSE(GetLockButton()->GetVisible()); - EXPECT_FALSE(GetSettingsButton()->GetVisible()); + EXPECT_EQ(nullptr, GetSignOutButton()); + EXPECT_EQ(nullptr, GetLockButton()); + EXPECT_EQ(nullptr, GetSettingsButton()); EXPECT_TRUE(GetPowerButton()->GetVisible()); EXPECT_TRUE(GetCollapseButton()->GetVisible()); } @@ -173,4 +185,30 @@ SetUpView(); Layout(); } + +// Some buttons are hidden in Kiosk Next sessions. +TEST_F(TopShortcutsViewTest, ButtonStatesKioskNextLoggedIn) { + CreateKioskNextSession(); + SetUpView(); + EXPECT_TRUE(GetUserAvatar()->GetVisible()); + EXPECT_TRUE(GetSignOutButton()->GetVisible()); + EXPECT_EQ(nullptr, GetLockButton()); + EXPECT_TRUE(GetSettingsButton()->GetVisible()); + EXPECT_EQ(nullptr, GetPowerButton()); + EXPECT_TRUE(GetCollapseButton()->GetVisible()); +} + +// Settings button is also hidden at the lock screen in Kiosk Next sessions. +TEST_F(TopShortcutsViewTest, ButtonStatesKioskNextLockScreen) { + CreateKioskNextSession(); + GetSessionControllerClient()->LockScreen(); + SetUpView(); + EXPECT_TRUE(GetUserAvatar()->GetVisible()); + EXPECT_TRUE(GetSignOutButton()->GetVisible()); + EXPECT_EQ(nullptr, GetLockButton()); + EXPECT_EQ(nullptr, GetSettingsButton()); + EXPECT_EQ(nullptr, GetPowerButton()); + EXPECT_TRUE(GetCollapseButton()->GetVisible()); +} + } // namespace ash
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index 2741053..d4e0d712 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -4,6 +4,7 @@ #include "ash/system/unified/unified_system_tray_controller.h" +#include "ash/kiosk_next/kiosk_next_shell_controller.h" #include "ash/metrics/user_metrics_action.h" #include "ash/metrics/user_metrics_recorder.h" #include "ash/public/cpp/system_tray_client.h" @@ -317,6 +318,10 @@ } void UnifiedSystemTrayController::InitFeaturePods() { + // No feature pods in Kisok Next. + if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled()) + return; + AddFeaturePodItem(std::make_unique<NetworkFeaturePodController>(this)); AddFeaturePodItem(std::make_unique<BluetoothFeaturePodController>(this)); AddFeaturePodItem(std::make_unique<QuietModeFeaturePodController>(this));
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc index 980ddd6..994d331 100644 --- a/ash/wm/overview/overview_session.cc +++ b/ash/wm/overview/overview_session.cc
@@ -819,6 +819,7 @@ // we let the app list to handle the key event. // TODO(crbug.com/952315): Explore better ways to handle this splitview + // overview + applist case. + // TODO(crbug.com/969899): Fix for tablet mode. Shell* shell = Shell::Get(); if (shell->app_list_controller() && shell->app_list_controller()->IsVisible() &&
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 24ae9ef..7126dcb 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -1614,8 +1614,7 @@ } } -// Tests hitting the escape and back keys exit overview mode, unless we're in -// single splitview mode with no windows in overview. +// Tests hitting the escape and back keys exits overview mode. TEST_F(OverviewSessionTest, ExitOverviewWithKey) { std::unique_ptr<aura::Window> window(CreateTestWindow()); @@ -1629,17 +1628,8 @@ SendKey(ui::VKEY_BROWSER_BACK); EXPECT_FALSE(overview_controller()->InOverviewSession()); - // Tests that if we snap the only overview window, we cannot exit overview - // mode. - ToggleOverview(); - ASSERT_TRUE(overview_controller()->InOverviewSession()); - Shell::Get()->split_view_controller()->SnapWindow(window.get(), - SplitViewController::LEFT); - ASSERT_TRUE(overview_controller()->InOverviewSession()); - SendKey(ui::VKEY_ESCAPE); - EXPECT_TRUE(overview_controller()->InOverviewSession()); - SendKey(ui::VKEY_BROWSER_BACK); - EXPECT_TRUE(overview_controller()->InOverviewSession()); + // TODO(crbug.com/969899): Test in tablet mode, and ensure escape/back does + // not exit single spitview mode with no other windows in overview. } // Regression test for clusterfuzz crash. https://crbug.com/920568 @@ -1877,6 +1867,7 @@ TEST_F(OverviewSessionTest, NoWindowsIndicatorPositionSplitview) { UpdateDisplay("400x300"); + EnterTabletMode(); std::unique_ptr<aura::Window> window(CreateTestWindow()); ToggleOverview(); @@ -1918,6 +1909,7 @@ // Tests that the no windows indicator shows properly after adding an item. TEST_F(OverviewSessionTest, NoWindowsIndicatorAddItem) { + EnterTabletMode(); std::unique_ptr<aura::Window> window(CreateTestWindow()); ToggleOverview();
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc index 58284bfa..0480891 100644 --- a/ash/wm/splitview/split_view_controller_unittest.cc +++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -4,11 +4,20 @@ #include "ash/wm/splitview/split_view_controller.h" +#include <algorithm> +#include <memory> +#include <string> +#include <utility> +#include <vector> + #include "ash/app_list/app_list_controller_impl.h" #include "ash/display/screen_orientation_controller.h" #include "ash/display/screen_orientation_controller_test_api.h" +#include "ash/kiosk_next/kiosk_next_shell_test_util.h" +#include "ash/kiosk_next/mock_kiosk_next_shell_client.h" #include "ash/magnifier/docked_magnifier_controller_impl.h" #include "ash/public/cpp/app_types.h" +#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/fps_counter.h" #include "ash/public/cpp/presentation_time_recorder.h" #include "ash/public/cpp/window_properties.h" @@ -43,6 +52,7 @@ #include "ash/wm/wm_event.h" #include "base/stl_util.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/test/test_windows.h" @@ -4593,4 +4603,71 @@ EXPECT_EQ(backdrop_window->bounds(), active_desk_container->bounds()); } +class SplitViewKioskNextAppDraggingTest : public SplitViewAppDraggingTest { + public: + SplitViewKioskNextAppDraggingTest() = default; + ~SplitViewKioskNextAppDraggingTest() override = default; + + // SplitViewAppDraggingTest: + void SetUp() override { + scoped_feature_list_.InitAndEnableFeature(features::kKioskNextShell); + set_start_session(false); + + SplitViewAppDraggingTest::SetUp(); + + client_ = BindMockKioskNextShellClient(); + LogInKioskNextUser(GetSessionControllerClient()); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<MockKioskNextShellClient> client_; + + DISALLOW_COPY_AND_ASSIGN(SplitViewKioskNextAppDraggingTest); +}; + +// Tests that split view is disabled in Kiosk Next sessions. +TEST_F(SplitViewKioskNextAppDraggingTest, SplitViewDisabled) { + std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400))); + + EXPECT_FALSE(ShouldAllowSplitView()); + EXPECT_FALSE(CanSnapInSplitview(window.get())); +} + +// Tests that dragging a maximized window doesn't show drag indicators or allow +// snapping in Kiosk Next sessions. +TEST_F(SplitViewKioskNextAppDraggingTest, DragMaximizedWindow) { + UpdateDisplay("800x600"); + InitializeWindow(); + EXPECT_TRUE(wm::GetWindowState(window())->IsMaximized()); + gfx::Rect display_bounds = + screen_util::GetDisplayWorkAreaBoundsInScreenForActiveDeskContainer( + window()); + + // Move the window by a small amount of distance will maximize the window + // again. + gfx::Point location(0, 10); + SendGestureEvents(location); + EXPECT_TRUE(wm::GetWindowState(window())->IsMaximized()); + + // Drag the window down to trigger overview mode. + const float long_scroll_delta = display_bounds.height() / 4 + 5; + location.set_y(long_scroll_delta); + SendScrollStartAndUpdate(location); + OverviewController* overview_controller = Shell::Get()->overview_controller(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + EXPECT_FALSE( + overview_controller->overview_session()->IsWindowInOverview(window())); + + // No drag indicators. + EXPECT_EQ(IndicatorState::kNone, GetIndicatorState()); + + // Complete the drag and verify the window is not snapped. + EndScrollSequence(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + EXPECT_EQ(IndicatorState::kNone, GetIndicatorState()); + EXPECT_FALSE(split_view_controller()->InSplitViewMode()); + EXPECT_FALSE(wm::GetWindowState(window())->IsSnapped()); +} + } // namespace ash
diff --git a/ash/wm/splitview/split_view_utils.cc b/ash/wm/splitview/split_view_utils.cc index 3f73975b..b9fb0d5c 100644 --- a/ash/wm/splitview/split_view_utils.cc +++ b/ash/wm/splitview/split_view_utils.cc
@@ -6,6 +6,7 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/display/screen_orientation_controller.h" +#include "ash/kiosk_next/kiosk_next_shell_controller.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" #include "ash/screen_util.h" @@ -244,6 +245,10 @@ if (Shell::Get()->screen_pinning_controller()->IsPinned()) return false; + // Don't allow split view in Kiosk Next. + if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled()) + return false; + // TODO(crubg.com/853588): Disallow window dragging and split screen while // ChromeVox is on until they are in a usable state. if (Shell::Get()->accessibility_controller()->spoken_feedback_enabled()) @@ -253,6 +258,9 @@ } bool CanSnapInSplitview(aura::Window* window) { + if (!ShouldAllowSplitView()) + return false; + if (!::wm::CanActivateWindow(window)) return false;
diff --git a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc index ac91f93..5a3f566 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
@@ -315,6 +315,10 @@ IndicatorState TabletModeWindowDragDelegate::GetIndicatorState( const gfx::Point& location_in_screen) const { + // Do not show the drag indicators if split view is disabled globally. + if (!ShouldAllowSplitView()) + return IndicatorState::kNone; + // Do not show the drag indicators if the window hasn't been considered as // moved. if (!is_window_considered_moved_)
diff --git a/base/BUILD.gn b/base/BUILD.gn index ba25074..9d689f8 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2216,6 +2216,7 @@ "strings/string_util_perftest.cc", "task/sequence_manager/sequence_manager_perftest.cc", "task/thread_pool/thread_pool_perftest.cc", + "threading/thread_local_storage_perftest.cc", # "test/run_all_unittests.cc", "json/json_perftest.cc", @@ -3293,6 +3294,7 @@ deps = [ ":base_java", ":base_java_test_support", + "//base/test:test_support_java", "//third_party/android_support_test_runner:runner_java", "//third_party/hamcrest:hamcrest_java", "//third_party/junit:junit", @@ -3318,6 +3320,7 @@ "android/javatests/src/org/chromium/base/task/SequencedTaskRunnerImplTest.java", "android/javatests/src/org/chromium/base/task/SingleThreadTaskRunnerImplTest.java", "android/javatests/src/org/chromium/base/task/TaskRunnerImplTest.java", + "android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java", ] } @@ -3418,7 +3421,6 @@ testonly = true java_files = [ "android/junit/src/org/chromium/base/metrics/test/ShadowRecordHistogram.java", - "android/junit/src/org/chromium/base/util/GarbageCollectionTestUtil.java", "test/android/junit/src/org/chromium/base/task/test/BackgroundShadowAsyncTask.java", "test/android/junit/src/org/chromium/base/task/test/CustomShadowAsyncTask.java", "test/android/junit/src/org/chromium/base/task/test/ShadowPostTask.java", @@ -3452,7 +3454,7 @@ "android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java", "android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java", "android/junit/src/org/chromium/base/task/TaskTraitsTest.java", - "android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilTest.java", + "android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java", "test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java", "test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java", "test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java", @@ -3472,6 +3474,7 @@ ":base_java_test_support", ":base_junit_test_support", ":jni_java", + "//base/test:test_support_java", "//third_party/hamcrest:hamcrest_java", ] }
diff --git a/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java b/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java new file mode 100644 index 0000000..f58cbebe --- /dev/null +++ b/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java
@@ -0,0 +1,42 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base.util; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected; + +import android.graphics.Bitmap; +import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.GarbageCollectionTestUtils; +import org.chromium.base.test.BaseJUnit4ClassRunner; + +import java.lang.ref.WeakReference; + +/** + * Tests for {@link GarbageCollectionTestUtils}. + */ +@RunWith(BaseJUnit4ClassRunner.class) +public class GarbageCollectionTestUtilsTest { + @Test + @SmallTest + @UiThreadTest + public void testCanBeGarbageCollected() { + Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888); + WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(bitmap); + assertNotNull(bitmapWeakReference.get()); + assertFalse(canBeGarbageCollected(bitmapWeakReference)); + + bitmap = null; + assertTrue(canBeGarbageCollected(bitmapWeakReference)); + } +}
diff --git a/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtil.java b/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtil.java deleted file mode 100644 index c8a13e8..0000000 --- a/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtil.java +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.util; - -import java.lang.ref.WeakReference; - -/** - * Util for doing garbage collection tests. - */ -public class GarbageCollectionTestUtil { - /** - * Do garbage collection and see if an object is released. - * @param reference A {@link WeakReference} pointing to the object. - * @return Whether the object can be garbage-collected. - */ - public static boolean isGarbageCollected(WeakReference<?> reference) { - Runtime runtime = Runtime.getRuntime(); - runtime.runFinalization(); - runtime.gc(); - return reference.get() == null; - } -}
diff --git a/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilTest.java b/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java similarity index 68% rename from base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilTest.java rename to base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java index c6cf781..decab3ad 100644 --- a/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilTest.java +++ b/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java
@@ -8,7 +8,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.chromium.base.util.GarbageCollectionTestUtil.isGarbageCollected; +import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected; import android.graphics.Bitmap; @@ -16,24 +16,25 @@ import org.junit.runner.RunWith; import org.robolectric.annotation.Config; +import org.chromium.base.GarbageCollectionTestUtils; import org.chromium.base.test.BaseRobolectricTestRunner; import java.lang.ref.WeakReference; /** - * Tests for {@link GarbageCollectionTestUtil}. + * Tests for {@link GarbageCollectionTestUtils}. */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) -public class GarbageCollectionTestUtilTest { +public class GarbageCollectionTestUtilsUnitTest { @Test - public void testIsGarbageCollected() { + public void testCanBeGarbageCollected() { Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888); WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(bitmap); assertNotNull(bitmapWeakReference.get()); - assertFalse(isGarbageCollected(bitmapWeakReference)); + assertFalse(canBeGarbageCollected(bitmapWeakReference)); bitmap = null; - assertTrue(isGarbageCollected(bitmapWeakReference)); + assertTrue(canBeGarbageCollected(bitmapWeakReference)); } }
diff --git a/base/mac/foundation_util.h b/base/mac/foundation_util.h index 7ddecaa..19dc089 100644 --- a/base/mac/foundation_util.h +++ b/base/mac/foundation_util.h
@@ -5,6 +5,7 @@ #ifndef BASE_MAC_FOUNDATION_UTIL_H_ #define BASE_MAC_FOUNDATION_UTIL_H_ +#include <AvailabilityMacros.h> #include <CoreFoundation/CoreFoundation.h> #include <string> @@ -52,7 +53,7 @@ typedef unsigned int NSSearchPathDomainMask; #endif -#if defined(OS_IOS) +#if defined(OS_IOS) || defined(MAC_OS_X_VERSION_10_15) typedef struct CF_BRIDGED_TYPE(id) __SecCertificate* SecCertificateRef; typedef struct CF_BRIDGED_TYPE(id) __SecKey* SecKeyRef; typedef struct CF_BRIDGED_TYPE(id) __SecPolicy* SecPolicyRef;
diff --git a/base/sampling_heap_profiler/lock_free_address_hash_set.cc b/base/sampling_heap_profiler/lock_free_address_hash_set.cc index d78498dd..acfcdac 100644 --- a/base/sampling_heap_profiler/lock_free_address_hash_set.cc +++ b/base/sampling_heap_profiler/lock_free_address_hash_set.cc
@@ -43,7 +43,6 @@ } } // There are no empty nodes to reuse left in the bucket. - DCHECK_EQ(node, nullptr); // Create a new node first... Node* new_node = new Node(key, bucket.load(std::memory_order_relaxed)); // ... and then publish the new chain.
diff --git a/base/sampling_heap_profiler/lock_free_address_hash_set.h b/base/sampling_heap_profiler/lock_free_address_hash_set.h index a5113288..1007859d 100644 --- a/base/sampling_heap_profiler/lock_free_address_hash_set.h +++ b/base/sampling_heap_profiler/lock_free_address_hash_set.h
@@ -9,6 +9,7 @@ #include <cstdint> #include <vector> +#include "base/compiler_specific.h" #include "base/logging.h" namespace base { @@ -46,12 +47,12 @@ // Checks if the |key| is in the set. Can be executed concurrently with // |Insert|, |Remove|, and |Contains| operations. - bool Contains(void* key) const; + ALWAYS_INLINE bool Contains(void* key) const; // Removes the |key| from the set. The key must be present in the set before // the invocation. // Concurrent execution of |Insert|, |Remove|, or |Copy| is not supported. - void Remove(void* key); + ALWAYS_INLINE void Remove(void* key); // Inserts the |key| into the set. The key must not be present in the set // before the invocation. @@ -73,28 +74,29 @@ friend class LockFreeAddressHashSetTest; struct Node { - Node(void* key, Node* next); + ALWAYS_INLINE Node(void* key, Node* next); std::atomic<void*> key; Node* next; }; - static uint32_t Hash(void* key); - Node* FindNode(void* key) const; + ALWAYS_INLINE static uint32_t Hash(void* key); + ALWAYS_INLINE Node* FindNode(void* key) const; std::vector<std::atomic<Node*>> buckets_; int size_ = 0; const size_t bucket_mask_; }; -inline LockFreeAddressHashSet::Node::Node(void* key, Node* next) : next(next) { +ALWAYS_INLINE LockFreeAddressHashSet::Node::Node(void* key, Node* next) + : next(next) { this->key.store(key, std::memory_order_relaxed); } -inline bool LockFreeAddressHashSet::Contains(void* key) const { +ALWAYS_INLINE bool LockFreeAddressHashSet::Contains(void* key) const { return FindNode(key) != nullptr; } -inline void LockFreeAddressHashSet::Remove(void* key) { +ALWAYS_INLINE void LockFreeAddressHashSet::Remove(void* key) { Node* node = FindNode(key); DCHECK_NE(node, nullptr); // We can never delete the node, nor detach it from the current bucket @@ -104,7 +106,7 @@ --size_; } -inline LockFreeAddressHashSet::Node* LockFreeAddressHashSet::FindNode( +ALWAYS_INLINE LockFreeAddressHashSet::Node* LockFreeAddressHashSet::FindNode( void* key) const { DCHECK_NE(key, nullptr); const std::atomic<Node*>& bucket = buckets_[Hash(key) & bucket_mask_]; @@ -122,7 +124,7 @@ } // static -inline uint32_t LockFreeAddressHashSet::Hash(void* key) { +ALWAYS_INLINE uint32_t LockFreeAddressHashSet::Hash(void* key) { // A simple fast hash function for addresses. constexpr uintptr_t random_bits = static_cast<uintptr_t>(0x4bfdb9df5a6f243b); uint64_t k = reinterpret_cast<uintptr_t>(key);
diff --git a/base/sampling_heap_profiler/poisson_allocation_sampler.cc b/base/sampling_heap_profiler/poisson_allocation_sampler.cc index 515cf6c..1f0aaeb1 100644 --- a/base/sampling_heap_profiler/poisson_allocation_sampler.cc +++ b/base/sampling_heap_profiler/poisson_allocation_sampler.cc
@@ -17,7 +17,6 @@ #include "base/no_destructor.h" #include "base/partition_alloc_buildflags.h" #include "base/rand_util.h" -#include "base/sampling_heap_profiler/lock_free_address_hash_set.h" #include "build/build_config.h" #if defined(OS_MACOSX) || defined(OS_ANDROID) @@ -472,14 +471,6 @@ observer->SampleAdded(address, size, total_allocated, type, context); } -// static -void PoissonAllocationSampler::RecordFree(void* address) { - if (UNLIKELY(address == nullptr)) - return; - if (UNLIKELY(sampled_addresses_set().Contains(address))) - instance_->DoRecordFree(address); -} - void PoissonAllocationSampler::DoRecordFree(void* address) { if (UNLIKELY(ScopedMuteThreadSamples::IsMuted())) return;
diff --git a/base/sampling_heap_profiler/poisson_allocation_sampler.h b/base/sampling_heap_profiler/poisson_allocation_sampler.h index f0751e4..3178ef7b 100644 --- a/base/sampling_heap_profiler/poisson_allocation_sampler.h +++ b/base/sampling_heap_profiler/poisson_allocation_sampler.h
@@ -8,7 +8,9 @@ #include <vector> #include "base/base_export.h" +#include "base/compiler_specific.h" #include "base/macros.h" +#include "base/sampling_heap_profiler/lock_free_address_hash_set.h" #include "base/synchronization/lock.h" namespace base { @@ -16,8 +18,6 @@ template <typename T> class NoDestructor; -class LockFreeAddressHashSet; - // This singleton class implements Poisson sampling of the incoming allocations // stream. It hooks onto base::allocator and base::PartitionAlloc. // An extra custom allocator can be hooked via SetHooksInstallCallback method. @@ -86,7 +86,7 @@ size_t, AllocatorType, const char* context); - static void RecordFree(void* address); + ALWAYS_INLINE static void RecordFree(void* address); static PoissonAllocationSampler* Get(); @@ -120,6 +120,14 @@ DISALLOW_COPY_AND_ASSIGN(PoissonAllocationSampler); }; +// static +ALWAYS_INLINE void PoissonAllocationSampler::RecordFree(void* address) { + if (UNLIKELY(address == nullptr)) + return; + if (UNLIKELY(sampled_addresses_set().Contains(address))) + instance_->DoRecordFree(address); +} + } // namespace base #endif // BASE_SAMPLING_HEAP_PROFILER_POISSON_ALLOCATION_SAMPLER_H_
diff --git a/base/task/promise/abstract_promise.cc b/base/task/promise/abstract_promise.cc index df73b51..1bafc86 100644 --- a/base/task/promise/abstract_promise.cc +++ b/base/task/promise/abstract_promise.cc
@@ -80,7 +80,7 @@ break; case DependentList::InsertResult::FAIL_PROMISE_RESOLVED: - dependent->OnPrerequisiteResolved(); + dependent->OnPrerequisiteResolved(this); break; case DependentList::InsertResult::FAIL_PROMISE_REJECTED: @@ -242,11 +242,12 @@ return executor->GetPrerequisitePolicy(); } -AbstractPromise* AbstractPromise::GetFirstRejectedPrerequisite() const { +AbstractPromise* AbstractPromise::GetFirstSettledPrerequisite() const { if (!prerequisites_) return nullptr; return reinterpret_cast<AbstractPromise*>( - prerequisites_->first_rejecting_promise.load(std::memory_order_acquire)); + prerequisites_->first_settled_prerequisite.load( + std::memory_order_acquire)); } void AbstractPromise::Execute() { @@ -264,14 +265,7 @@ } #endif - if (IsResolvedWithPromise()) { - bool settled = DispatchIfNonCurriedRootSettled(); - DCHECK(settled); - - prerequisites_->prerequisite_list.clear(); - return; - } - + DCHECK(!IsResolvedWithPromise()); DCHECK(GetExecutor()) << from_here_.ToString() << " value_ contains " << value_.type(); @@ -302,8 +296,12 @@ return true; } -void AbstractPromise::OnPrerequisiteResolved() { +void AbstractPromise::OnPrerequisiteResolved( + AbstractPromise* resolved_prerequisite) { + DCHECK(resolved_prerequisite->IsResolved()); if (IsResolvedWithPromise()) { + // The executor has already run so we don't need to call + // MarkPrerequisiteAsSettling. bool settled = DispatchIfNonCurriedRootSettled(); DCHECK(settled); return; @@ -317,7 +315,8 @@ case Executor::PrerequisitePolicy::kAny: // PrerequisitePolicy::kAny should resolve immediately. - DispatchPromise(); + if (prerequisites_->MarkPrerequisiteAsSettling(resolved_prerequisite)) + DispatchPromise(); break; case Executor::PrerequisitePolicy::kNever: @@ -326,20 +325,17 @@ } void AbstractPromise::OnPrerequisiteRejected( - AbstractPromise* rejected_promise) { - DCHECK(rejected_promise->IsRejected()); - uintptr_t expected = 0; - // Promises::All (or Race if we add that) can have multiple prerequsites and - // it will reject as soon as any prerequsite rejects. Multiple prerequsites - // can reject, but we wish to record only the first one. - bool is_first_rejection = - prerequisites_->first_rejecting_promise.compare_exchange_strong( - expected, reinterpret_cast<uintptr_t>(rejected_promise), - std::memory_order_acq_rel); - // We only want to dispatch a promise the first time a prerequisite is - // rejected because the executors can only be invoked once. - if (is_first_rejection) + AbstractPromise* rejected_prerequisite) { + DCHECK(rejected_prerequisite->IsRejected()); + + // Promises::All (or Race if we add that) can have multiple prerequisites and + // it will reject as soon as any prerequisite rejects. Multiple prerequisites + // can reject, but we wish to record only the first one. Also we can only + // invoke executors once. + if (prerequisites_->MarkPrerequisiteAsSettling(rejected_prerequisite) && + !DispatchIfNonCurriedRootSettled()) { DispatchPromise(); + } } bool AbstractPromise::OnPrerequisiteCancelled() { @@ -382,7 +378,7 @@ // OnPrerequisiteResolved might post a task which destructs |node| on // another thread so load |node->next| now. next = node->next.load(std::memory_order_relaxed); - dependent->OnPrerequisiteResolved(); + dependent->OnPrerequisiteResolved(this); } } @@ -468,10 +464,6 @@ // The curried promise isn't already settled we need to throw away any // existing dependencies and make |curried_promise| the only dependency of // this promise. - - if (!curried_promise->prerequisites_) - curried_promise->prerequisites_ = std::make_unique<AdjacencyList>(); - #if DCHECK_IS_ON() { CheckedAutoLock lock(GetCheckedLock()); @@ -479,7 +471,11 @@ ancestor_that_could_reject_ = nullptr; } #endif - prerequisites_->ResetWithSingleDependency(curried_promise); + if (prerequisites_) { + prerequisites_->ResetWithSingleDependency(curried_promise); + } else { + prerequisites_ = std::make_unique<AdjacencyList>(curried_promise); + } AddAsDependentForAllPrerequisites(); } } else { @@ -559,6 +555,18 @@ return action_prerequisite_count.fetch_sub(1, std::memory_order_acq_rel) == 1; } +// For PrerequisitePolicy::kAll this is called for the first rejected +// prerequisite. For PrerequisitePolicy:kAny this is called for the first +// resolving or rejecting prerequisite. +bool AbstractPromise::AdjacencyList::MarkPrerequisiteAsSettling( + AbstractPromise* settled_prerequisite) { + DCHECK(settled_prerequisite->IsSettled()); + uintptr_t expected = 0; + return first_settled_prerequisite.compare_exchange_strong( + expected, reinterpret_cast<uintptr_t>(settled_prerequisite), + std::memory_order_acq_rel); +} + void AbstractPromise::AdjacencyList::ResetWithSingleDependency( scoped_refptr<AbstractPromise> prerequisite) { prerequisite_list.clear(); @@ -572,7 +580,7 @@ AbstractPromise::Executor::PrerequisitePolicy AbstractPromise::Executor::GetPrerequisitePolicy() const { - return vtable_->get_prerequsite_policy(storage_); + return vtable_->get_prerequisite_policy(storage_); } bool AbstractPromise::Executor::IsCancelled() const {
diff --git a/base/task/promise/abstract_promise.h b/base/task/promise/abstract_promise.h index ba921e5..45597ed 100644 --- a/base/task/promise/abstract_promise.h +++ b/base/task/promise/abstract_promise.h
@@ -280,7 +280,7 @@ struct VTable { void (*destructor)(void* self); - PrerequisitePolicy (*get_prerequsite_policy)(const void* self); + PrerequisitePolicy (*get_prerequisite_policy)(const void* self); bool (*is_cancelled)(const void* self); #if DCHECK_IS_ON() ArgumentPassingType (*resolve_argument_passing_type)(const void* self); @@ -390,6 +390,12 @@ bool DecrementPrerequisiteCountAndCheckIfZero(); + // Called for each prerequisites that resolves or rejects for + // PrerequisitePolicy::kAny and each prerequisite that rejects for + // PrerequisitePolicy::kAll. This saves |settled_prerequisite| and returns + // true iff called for the first time. + bool MarkPrerequisiteAsSettling(AbstractPromise* settled_prerequisite); + std::vector<AdjacencyListNode> prerequisite_list; // PrerequisitePolicy::kAny waits for at most 1 resolve or N cancellations. @@ -397,11 +403,11 @@ // PrerequisitePolicy::kNever doesn't use this. std::atomic_int action_prerequisite_count; - // Stores the address of the first rejecting promise. The purpose of this is - // two-fold, first to ensure that Promises::All/Race return the first - // prerequisite that rejected and secondly to prevent the executor from - // being run multiple times if there's multiple rejection. - std::atomic<uintptr_t> first_rejecting_promise{0}; + // For PrerequisitePolicy::kAll the address of the first rejected + // prerequisite if any. + // For PrerequisitePolicy::kAll the address of the first rejected or + // resolved rerequsite if any. + std::atomic<uintptr_t> first_settled_prerequisite{0}; }; const std::vector<AdjacencyListNode>* prerequisite_list() const { @@ -418,7 +424,10 @@ return prerequisites_->prerequisite_list[0].prerequisite.get(); } - AbstractPromise* GetFirstRejectedPrerequisite() const; + // For PrerequisitePolicy::kAll returns the first rejected prerequisite if + // any. For PrerequisitePolicy::kAny returns the first rejected or resolved + // rerequsite if any. + AbstractPromise* GetFirstSettledPrerequisite() const; // Calls |RunExecutor()| or posts a task to do so if |from_here_| is not // nullopt. @@ -498,10 +507,10 @@ // Checks if the promise is now ready to be executed and if so posts it on the // given task runner. - void OnPrerequisiteResolved(); + void OnPrerequisiteResolved(AbstractPromise* resolved_prerequisite); // Schedules the promise for execution. - void OnPrerequisiteRejected(AbstractPromise* rejected_promise); + void OnPrerequisiteRejected(AbstractPromise* rejected_prerequisite); // Returns true if we are still potentially eligible to run despite the // cancellation.
diff --git a/base/task/promise/abstract_promise_unittest.cc b/base/task/promise/abstract_promise_unittest.cc index 6214f09..131e750 100644 --- a/base/task/promise/abstract_promise_unittest.cc +++ b/base/task/promise/abstract_promise_unittest.cc
@@ -8,6 +8,7 @@ #include "base/test/do_nothing_promise.h" #include "base/test/gtest_util.h" #include "base/test/scoped_task_environment.h" +#include "base/test/test_simple_task_runner.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "testing/gmock/include/gmock/gmock.h" @@ -102,6 +103,19 @@ namespace base { namespace internal { +namespace { + +size_t CountTasksRunUntilIdle( + const scoped_refptr<TestSimpleTaskRunner>& task_runner) { + size_t count = 0; + while (task_runner->HasPendingTask()) { + count += task_runner->NumPendingTasks(); + task_runner->RunPendingTasks(); + } + return count; +} + +} // namespace class TestExecutor { public: @@ -694,7 +708,8 @@ scoped_refptr<AbstractPromise> p2 = CatchPromise(FROM_HERE, p1) .With(BindLambdaForTesting([&](AbstractPromise* p) { - EXPECT_EQ(p->GetFirstRejectedPrerequisite(), p1); + EXPECT_TRUE(p->GetFirstSettledPrerequisite()->IsRejected()); + EXPECT_EQ(p->GetFirstSettledPrerequisite(), p1); p->emplace(Resolved<void>()); p->OnResolved(); })); @@ -813,7 +828,8 @@ AllPromise(FROM_HERE, std::move(prerequisite_list)) .With(CallbackResultType::kCanResolveOrReject) .With(BindLambdaForTesting([&](AbstractPromise* p) { - EXPECT_EQ(p->GetFirstRejectedPrerequisite(), p3); + EXPECT_TRUE(p->GetFirstSettledPrerequisite()->IsRejected()); + EXPECT_EQ(p->GetFirstSettledPrerequisite(), p3); p->emplace(Rejected<void>()); p->OnRejected(); })); @@ -851,8 +867,9 @@ AllPromise(FROM_HERE, std::move(prerequisite_list)) .With(CallbackResultType::kCanResolveOrReject) .With(BindLambdaForTesting([&](AbstractPromise* p) { - if (AbstractPromise* rejected = p->GetFirstRejectedPrerequisite()) { - EXPECT_EQ(rejected, p2); + AbstractPromise* settled = p->GetFirstSettledPrerequisite(); + if (settled && settled->IsRejected()) { + EXPECT_EQ(settled, p2); p->emplace(Rejected<void>()); p->OnRejected(); } else { @@ -864,7 +881,8 @@ CatchPromise(FROM_HERE, all_promise) .With(BindLambdaForTesting([&](AbstractPromise* p) { EXPECT_FALSE(p->IsSettled()); // Should only happen once. - EXPECT_EQ(p->GetFirstRejectedPrerequisite(), all_promise); + EXPECT_TRUE(p->GetFirstSettledPrerequisite()->IsRejected()); + EXPECT_EQ(p->GetFirstSettledPrerequisite(), all_promise); p->emplace(Resolved<void>()); p->OnResolved(); })); @@ -877,7 +895,7 @@ EXPECT_TRUE(p5->IsResolved()); } -TEST_F(AbstractPromiseTest, SingleResolvedPrerequisitesPrerequisitePolicyANY) { +TEST_F(AbstractPromiseTest, SingleResolvedPrerequisitePolicyANY) { scoped_refptr<AbstractPromise> p1 = DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); scoped_refptr<AbstractPromise> p2 = @@ -902,6 +920,32 @@ EXPECT_TRUE(any_promise->IsResolved()); } +TEST_F(AbstractPromiseTest, MultipleResolvedPrerequisitePolicyANY) { + scoped_refptr<AbstractPromise> p1 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + scoped_refptr<AbstractPromise> p2 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + scoped_refptr<AbstractPromise> p3 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + scoped_refptr<AbstractPromise> p4 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + + std::vector<internal::AbstractPromise::AdjacencyListNode> prerequisite_list( + 4); + prerequisite_list[0].prerequisite = p1; + prerequisite_list[1].prerequisite = p2; + prerequisite_list[2].prerequisite = p3; + prerequisite_list[3].prerequisite = p4; + + scoped_refptr<AbstractPromise> any_promise = + AnyPromise(FROM_HERE, std::move(prerequisite_list)); + + p1->OnResolved(); + p2->OnResolved(); + RunLoop().RunUntilIdle(); + EXPECT_TRUE(any_promise->IsResolved()); +} + TEST_F(AbstractPromiseTest, MAYBE_SingleRejectPrerequisitePolicyANY) { scoped_refptr<AbstractPromise> p1 = DoNothingPromiseBuilder(FROM_HERE).SetCanReject(true).SetCanResolve( @@ -1153,6 +1197,62 @@ EXPECT_TRUE(any_promise->IsCanceled()); } +TEST_F(AbstractPromiseTest, CurriedResolvedPromiseAny) { + scoped_refptr<AbstractPromise> p0 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + scoped_refptr<AbstractPromise> p2 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + scoped_refptr<AbstractPromise> p1 = + ThenPromise(FROM_HERE, p0) + .With(BindOnce( + [](scoped_refptr<AbstractPromise> p2, AbstractPromise* p) { + p->emplace(std::move(p2)); + p->OnResolved(); + }, + p2)) + .With(PrerequisitePolicy::kAny); + + scoped_refptr<TestSimpleTaskRunner> task_runner = + MakeRefCounted<TestSimpleTaskRunner>(); + scoped_refptr<AbstractPromise> p3 = + ThenPromise(FROM_HERE, p1).With(task_runner); + + p0->OnResolved(); + p2->OnResolved(); + RunLoop().RunUntilIdle(); + + // |p3| should run. + EXPECT_EQ(1u, CountTasksRunUntilIdle(task_runner)); +} + +TEST_F(AbstractPromiseTest, CurriedRejectedPromiseAny) { + scoped_refptr<AbstractPromise> p0 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + scoped_refptr<AbstractPromise> p2 = + DoNothingPromiseBuilder(FROM_HERE).SetCanReject(true); + scoped_refptr<AbstractPromise> p1 = + ThenPromise(FROM_HERE, p0) + .With(BindOnce( + [](scoped_refptr<AbstractPromise> p2, AbstractPromise* p) { + p->emplace(std::move(p2)); + p->OnResolved(); + }, + p2)) + .With(PrerequisitePolicy::kAny); + + scoped_refptr<TestSimpleTaskRunner> task_runner = + MakeRefCounted<TestSimpleTaskRunner>(); + scoped_refptr<AbstractPromise> p3 = + CatchPromise(FROM_HERE, p1).With(task_runner); + + p0->OnResolved(); + p2->OnRejected(); + RunLoop().RunUntilIdle(); + + // |p3| should run. + EXPECT_EQ(1u, CountTasksRunUntilIdle(task_runner)); +} + TEST_F(AbstractPromiseTest, ABSTRACT_PROMISE_DEATH_TEST(MAYBE_DetectResolveDoubleMoveHazard)) { scoped_refptr<AbstractPromise> p0 = ThenPromise(FROM_HERE, nullptr); @@ -2121,7 +2221,7 @@ scoped_refptr<AbstractPromise> p2 = ThenPromise(FROM_HERE, p0) .With(BindOnce( - [&](scoped_refptr<AbstractPromise> p1, AbstractPromise* p) { + [](scoped_refptr<AbstractPromise> p1, AbstractPromise* p) { // Resolve with a promise that can and does reject. ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, BindOnce(&AbstractPromise::Execute, p1)); @@ -2139,6 +2239,86 @@ EXPECT_TRUE(p3->IsResolved()); } +TEST_F(AbstractPromiseTest, ManuallyResolveWithNonSettledCurriedPromise) { + scoped_refptr<AbstractPromise> p0 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + + scoped_refptr<AbstractPromise> p1 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + + p1->emplace(p0); + p1->OnResolved(); + RunLoop().RunUntilIdle(); + EXPECT_FALSE(p1->IsResolved()); + + p0->OnResolved(); + RunLoop().RunUntilIdle(); + EXPECT_TRUE(p1->IsResolved()); +} + +TEST_F(AbstractPromiseTest, ExecuteCalledOnceForLateResolvedCurriedPromise) { + scoped_refptr<AbstractPromise> p0 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + + scoped_refptr<AbstractPromise> p1 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + + scoped_refptr<TestSimpleTaskRunner> task_runner = + MakeRefCounted<TestSimpleTaskRunner>(); + scoped_refptr<AbstractPromise> p2 = + ThenPromise(FROM_HERE, p0) + .With(BindLambdaForTesting([&](AbstractPromise* p) { + p->emplace(p1); + p->OnResolved(); + })) + .With(task_runner); + + scoped_refptr<AbstractPromise> p3 = + ThenPromise(FROM_HERE, p1).With(task_runner); + + p0->OnResolved(); + // |p2| should run but not |p3|. + EXPECT_EQ(1u, CountTasksRunUntilIdle(task_runner)); + EXPECT_FALSE(p3->IsResolved()); + + p1->OnResolved(); + // |p3| should run. + EXPECT_EQ(1u, CountTasksRunUntilIdle(task_runner)); + EXPECT_TRUE(p3->IsResolved()); +} + +TEST_F(AbstractPromiseTest, ExecuteCalledOnceForLateRejectedCurriedPromise) { + scoped_refptr<AbstractPromise> p0 = + DoNothingPromiseBuilder(FROM_HERE).SetCanResolve(true); + + scoped_refptr<AbstractPromise> p1 = + DoNothingPromiseBuilder(FROM_HERE).SetCanReject(true).SetRejectPolicy( + RejectPolicy::kCatchNotRequired); + + scoped_refptr<TestSimpleTaskRunner> task_runner = + MakeRefCounted<TestSimpleTaskRunner>(); + scoped_refptr<AbstractPromise> p2 = + ThenPromise(FROM_HERE, p0) + .With(BindLambdaForTesting([&](AbstractPromise* p) { + p->emplace(p1); + p->OnResolved(); + })) + .With(task_runner); + + scoped_refptr<AbstractPromise> p3 = + ThenPromise(FROM_HERE, p1).With(task_runner); + + p0->OnResolved(); + // |p2| should run but not |p3|. + EXPECT_EQ(1u, CountTasksRunUntilIdle(task_runner)); + EXPECT_FALSE(p3->IsRejected()); + + p1->OnRejected(); + // |p3| should run. + EXPECT_EQ(1u, CountTasksRunUntilIdle(task_runner)); + EXPECT_TRUE(p3->IsRejected()); +} + TEST_F(AbstractPromiseTest, ThreadHopping) { std::unique_ptr<Thread> thread_a(new Thread("AbstractPromiseTest_Thread_A")); std::unique_ptr<Thread> thread_b(new Thread("AbstractPromiseTest_Thread_B"));
diff --git a/base/task/promise/all_container_executor.h b/base/task/promise/all_container_executor.h index 4045fe65a..9f901d49 100644 --- a/base/task/promise/all_container_executor.h +++ b/base/task/promise/all_container_executor.h
@@ -26,8 +26,10 @@ void Execute(AbstractPromise* promise) { // All is rejected if any prerequisites are rejected. - if (AbstractPromise* rejected = promise->GetFirstRejectedPrerequisite()) { - AllPromiseRejectHelper<Rejected<RejectType>>::Reject(promise, rejected); + AbstractPromise* first_settled = promise->GetFirstSettledPrerequisite(); + if (first_settled && first_settled->IsRejected()) { + AllPromiseRejectHelper<Rejected<RejectType>>::Reject(promise, + first_settled); promise->OnRejected(); return; }
diff --git a/base/task/promise/all_tuple_executor.h b/base/task/promise/all_tuple_executor.h index 545ef95..69a3fa8 100644 --- a/base/task/promise/all_tuple_executor.h +++ b/base/task/promise/all_tuple_executor.h
@@ -62,8 +62,9 @@ void Execute(AbstractPromise* promise) { // All is rejected if any prerequisites are rejected. - if (AbstractPromise* rejected = promise->GetFirstRejectedPrerequisite()) { - AllPromiseRejectHelper<RejectT>::Reject(promise, rejected); + AbstractPromise* first_settled = promise->GetFirstSettledPrerequisite(); + if (first_settled && first_settled->IsRejected()) { + AllPromiseRejectHelper<RejectT>::Reject(promise, first_settled); promise->OnRejected(); return; }
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn index 88e1600..b987a4bc3 100644 --- a/base/test/BUILD.gn +++ b/base/test/BUILD.gn
@@ -496,6 +496,7 @@ ] srcjar_deps = [ ":test_support_java_aidl" ] java_files = [ + "android/java/src/org/chromium/base/GarbageCollectionTestUtils.java", "android/java/src/org/chromium/base/MainReturnCodeResult.java", "android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java", "android/java/src/org/chromium/base/MultiprocessTestClientService.java",
diff --git a/base/test/android/java/src/org/chromium/base/GarbageCollectionTestUtils.java b/base/test/android/java/src/org/chromium/base/GarbageCollectionTestUtils.java new file mode 100644 index 0000000..2755a1d --- /dev/null +++ b/base/test/android/java/src/org/chromium/base/GarbageCollectionTestUtils.java
@@ -0,0 +1,52 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base; + +import android.os.Build; + +import java.lang.ref.WeakReference; + +/** + * Utils for doing garbage collection tests. + */ +public class GarbageCollectionTestUtils { + /** + * Relying on just one single GC might make instrumentation tests flaky. + * Note that {@link #MAX_GC_ITERATIONS} * {@link #GC_SLEEP_TIME} should not be too large, + * since there are tests asserting objects NOT garbage collected. + */ + private final static int MAX_GC_ITERATIONS = 3; + private final static long GC_SLEEP_TIME = 100; + + /** + * Do garbage collection and see if an object is released. + * @param reference A {@link WeakReference} pointing to the object. + * @return Whether the object can be garbage-collected. + */ + public static boolean canBeGarbageCollected(WeakReference<?> reference) { + // Robolectric tests, one iteration is enough. + final int iterations = isInRobolectric() ? 1 : MAX_GC_ITERATIONS; + final long sleepTime = isInRobolectric() ? 0 : GC_SLEEP_TIME; + Runtime runtime = Runtime.getRuntime(); + for (int i = 0; i < iterations; i++) { + runtime.runFinalization(); + runtime.gc(); + if (reference.get() == null) return true; + + // Pause for a while and then go back around the loop to try again. + try { + Thread.sleep(sleepTime); + } catch (InterruptedException e) { + // Ignore any interrupts and just try again. + } + } + + return reference.get() == null; + } + + private static boolean isInRobolectric() { + return Build.FINGERPRINT.equals("robolectric"); + } +}
diff --git a/base/threading/thread_local_storage_perftest.cc b/base/threading/thread_local_storage_perftest.cc new file mode 100644 index 0000000..786a091 --- /dev/null +++ b/base/threading/thread_local_storage_perftest.cc
@@ -0,0 +1,142 @@ +// 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. + +#include <stddef.h> +#include <memory> +#include <vector> + +#include "base/barrier_closure.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback.h" +#include "base/synchronization/waitable_event.h" +#include "base/test/bind_test_util.h" +#include "base/threading/simple_thread.h" +#include "base/threading/thread_local_storage.h" +#include "base/time/time.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/perf/perf_test.h" + +namespace base { +namespace internal { + +namespace { + +// A thread that waits for the caller to signal an event before proceeding to +// call action.Run(). +class TLSThread : public SimpleThread { + public: + // Creates a PostingThread that waits on |start_event| before calling + // action.Run(). + TLSThread(WaitableEvent* start_event, + base::OnceClosure action, + base::OnceClosure completion) + : SimpleThread("TLSThread"), + start_event_(start_event), + action_(std::move(action)), + completion_(std::move(completion)) { + Start(); + } + + void Run() override { + start_event_->Wait(); + std::move(action_).Run(); + std::move(completion_).Run(); + } + + private: + WaitableEvent* const start_event_; + base::OnceClosure action_; + base::OnceClosure completion_; + + DISALLOW_COPY_AND_ASSIGN(TLSThread); +}; + +class ThreadLocalStoragePerfTest : public testing::Test { + public: + protected: + ThreadLocalStoragePerfTest() = default; + ~ThreadLocalStoragePerfTest() override = default; + + template <class Read, class Write> + void Benchmark(const std::string& trace, + Read read, + Write write, + size_t num_operation, + size_t num_threads) { + write(2); + + BenchmarkImpl("TLS read throughput", trace, + base::BindLambdaForTesting([&]() { + volatile intptr_t total = 0; + for (size_t i = 0; i < num_operation; ++i) + total += read(); + }), + num_operation, num_threads); + + BenchmarkImpl("TLS write throughput", trace, + base::BindLambdaForTesting([&]() { + for (size_t i = 0; i < num_operation; ++i) + write(i); + }), + num_operation, num_threads); + + BenchmarkImpl("TLS read-write throughput", trace, + base::BindLambdaForTesting([&]() { + for (size_t i = 0; i < num_operation; ++i) + write(read() + 1); + }), + num_operation, num_threads); + } + + void BenchmarkImpl(const std::string& measurment, + const std::string& trace, + base::RepeatingClosure action, + size_t num_operation, + size_t num_threads) { + WaitableEvent start_thread; + WaitableEvent complete_thread; + + base::RepeatingClosure done = BarrierClosure( + num_threads, + base::BindLambdaForTesting([&]() { complete_thread.Signal(); })); + + std::vector<std::unique_ptr<TLSThread>> threads; + for (size_t i = 0; i < num_threads; ++i) { + threads.emplace_back( + std::make_unique<TLSThread>(&start_thread, action, done)); + } + + TimeTicks operation_start = TimeTicks::Now(); + start_thread.Signal(); + complete_thread.Wait(); + TimeDelta operation_duration = TimeTicks::Now() - operation_start; + + for (auto& thread : threads) + thread->Join(); + + perf_test::PrintResult( + measurment, "", trace, + num_operation / + static_cast<double>(operation_duration.InMilliseconds()), + "operations/ms", true); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ThreadLocalStoragePerfTest); +}; + +} // namespace + +TEST_F(ThreadLocalStoragePerfTest, ThreadLocalStorage) { + ThreadLocalStorage::Slot tls; + auto read = [&]() { return reinterpret_cast<intptr_t>(tls.Get()); }; + auto write = [&](intptr_t value) { tls.Set(reinterpret_cast<void*>(value)); }; + + Benchmark("ThreadLocalStorage", read, write, 1000000, 1); + Benchmark("ThreadLocalStorage 4 threads", read, write, 1000000, 4); +} + +} // namespace internal +} // namespace base \ No newline at end of file
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc index 08ed27f..0a98759 100644 --- a/base/trace_event/trace_log.cc +++ b/base/trace_event/trace_log.cc
@@ -1550,7 +1550,8 @@ it.second); } - // Thread names. + // TODO(ssid): Stop emitting and tracking thread names when perfetto is + // enabled. The JSON exporter will emit thread names. AutoLock thread_info_lock(thread_info_lock_); for (const auto& it : thread_names_) { if (it.second.empty())
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index e591f72..5879c8f4 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8911593221651797744 \ No newline at end of file +8911513658805632768 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index fe35a65c9..aa42851 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8911592625228302816 \ No newline at end of file +8911513947770213696 \ No newline at end of file
diff --git a/cc/paint/image_transfer_cache_entry.cc b/cc/paint/image_transfer_cache_entry.cc index 9e96fdb..46c16f4c 100644 --- a/cc/paint/image_transfer_cache_entry.cc +++ b/cc/paint/image_transfer_cache_entry.cc
@@ -308,6 +308,10 @@ } } + // Make sure the GPU work to create the backing texture is issued. + if (image_) + image_->getBackendTexture(true /* flushPendingGrContextIO */); + return !!image_; }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index 1f6534b..40a4309 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -278,6 +278,9 @@ ":browser_dependencies", ":child_dependencies", + # For the sampling profiler. + "//chrome/common/profiler", + # Needed to use the master_preferences functions "//chrome/installer/util:with_no_strings", "//content/public/app:both", @@ -418,6 +421,7 @@ "//chrome/app/theme:chrome_unscaled_resources", "//chrome/chrome_elf", "//chrome/common:buildflags", + "//chrome/common/profiler", "//chrome/install_static:install_static_util", "//chrome/install_static:secondary_module", "//components/crash/content/app", @@ -558,6 +562,7 @@ "//chrome/browser/policy:path_parser", "//chrome/chrome_elf", "//chrome/common:buildflags", + "//chrome/common/profiler", "//chrome/install_static:install_static_util", "//chrome/install_static:secondary_module", "//components/browser_watcher:browser_watcher_client", @@ -1213,6 +1218,7 @@ ":child_dependencies", "//chrome/app:command_ids", "//chrome/common:buildflags", + "//chrome/common/profiler", "//components/crash/content/app", "//components/policy:generated", "//content/public/app:both",
diff --git a/chrome/VERSION b/chrome/VERSION index a36a619..61fd67e 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=77 MINOR=0 -BUILD=3815 +BUILD=3816 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 6ab78ed..2e72c71 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -760,6 +760,7 @@ "$google_play_services_package:google_play_services_tasks_java", "//base:base_java", "//base:base_java_test_support", + "//base/test:test_support_java", "//chrome/android:app_hooks_java", "//chrome/android:chrome_java", "//chrome/android/features/tab_ui:java",
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 7780b92..8683c792 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -21,6 +21,7 @@ java_files = [ "java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabGridViewHolder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java", @@ -34,6 +35,7 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetToolbarCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetViewBinder.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridView.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml index 70061a53..12fb957 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -3,7 +3,8 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> <!-- TODO(crbug/928388): Handle elevation for KitKat.--> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<org.chromium.chrome.browser.tasks.tab_management.TabGridView + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -51,7 +52,8 @@ android:importantForAccessibility="no" android:src="@color/thumbnail_placeholder_on_primary_bg" app:cornerRadiusBottomStart="@dimen/default_rounded_corner_radius" - app:cornerRadiusBottomEnd="@dimen/default_rounded_corner_radius"/> + app:cornerRadiusBottomEnd="@dimen/default_rounded_corner_radius" + app:roundedfillColor="@color/default_bg_color_light"/> <View style="@style/HorizontalDivider" android:layout_below="@id/tab_title"/> @@ -68,11 +70,11 @@ style="@style/FilledButton"/> </RelativeLayout> <org.chromium.ui.widget.ChromeImageView - android:id="@+id/close_button" + android:id="@+id/action_button" android:layout_width="48dp" android:layout_height="48dp" android:scaleType="center" android:layout_gravity="end" - android:tint="@color/modern_grey_800" - android:contentDescription="@string/accessibility_tabstrip_btn_close_tab"/> -</FrameLayout> + android:tint="@color/modern_grey_800"/> +</org.chromium.chrome.browser.tasks.tab_management.TabGridView> +
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabGridViewHolder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabGridViewHolder.java new file mode 100644 index 0000000..73d0ae5 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabGridViewHolder.java
@@ -0,0 +1,32 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import java.lang.ref.WeakReference; + +/** + * A {@link TabGridViewHolder} with a close button. This is used in the Grid Tab Switcher. + */ +class ClosableTabGridViewHolder extends TabGridViewHolder { + private static WeakReference<Bitmap> sCloseButtonBitmapWeakRef; + + ClosableTabGridViewHolder(TabGridView itemView) { + super(itemView); + if (sCloseButtonBitmapWeakRef == null || sCloseButtonBitmapWeakRef.get() == null) { + int closeButtonSize = (int) itemView.getResources().getDimension( + org.chromium.chrome.tab_ui.R.dimen.tab_grid_close_button_size); + Bitmap bitmap = BitmapFactory.decodeResource( + itemView.getResources(), org.chromium.chrome.tab_ui.R.drawable.btn_close); + sCloseButtonBitmapWeakRef = new WeakReference<>( + Bitmap.createScaledBitmap(bitmap, closeButtonSize, closeButtonSize, true)); + bitmap.recycle(); + } + + actionButton.setImageBitmap(sCloseButtonBitmapWeakRef.get()); + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridView.java new file mode 100644 index 0000000..a0e604fd --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridView.java
@@ -0,0 +1,18 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * Holds the view for tab grid. + */ +public class TabGridView extends FrameLayout { + public TabGridView(Context context, AttributeSet attrs) { + super(context, attrs); + } +}
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 1ecadf9..2340e8c2 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
@@ -40,8 +40,6 @@ if (TabProperties.TITLE == propertyKey) { String title = item.get(TabProperties.TITLE); holder.title.setText(title); - holder.closeButton.setContentDescription(holder.itemView.getResources().getString( - org.chromium.chrome.R.string.accessibility_tabstrip_btn_close_tab, title)); } else if (TabProperties.IS_SELECTED == propertyKey) { Resources res = holder.itemView.getResources(); Resources.Theme theme = holder.itemView.getContext().getTheme(); @@ -60,14 +58,6 @@ holder.itemView.setForeground( item.get(TabProperties.IS_SELECTED) ? drawable : null); } - } else if (TabProperties.TAB_SELECTED_LISTENER == propertyKey) { - holder.itemView.setOnClickListener(view -> { - item.get(TabProperties.TAB_SELECTED_LISTENER).run(holder.getTabId()); - }); - } else if (TabProperties.TAB_CLOSED_LISTENER == propertyKey) { - holder.closeButton.setOnClickListener(view -> { - item.get(TabProperties.TAB_CLOSED_LISTENER).run(holder.getTabId()); - }); } else if (TabProperties.FAVICON == propertyKey) { holder.favicon.setImageDrawable(item.get(TabProperties.FAVICON)); } else if (TabProperties.THUMBNAIL_FETCHER == propertyKey) { @@ -81,11 +71,35 @@ } }; fetcher.fetch(callback); - } else if (TabProperties.IPH_PROVIDER == propertyKey) { - TabListMediator.IphProvider provider = item.get(TabProperties.IPH_PROVIDER); - if (provider != null) provider.showIPH(holder.thumbnail); } else if (TabProperties.TAB_ID == propertyKey) { holder.setTabId(item.get(TabProperties.TAB_ID)); + } + + if (holder instanceof ClosableTabGridViewHolder) { + onBindClosableTab(holder, item, propertyKey); + } else { + onBindSelectableTab(holder, item, propertyKey); + } + } + + private static void onBindViewHolder(TabGridViewHolder holder, PropertyModel item) { + for (PropertyKey propertyKey : TabProperties.ALL_KEYS_TAB_GRID) { + onBindViewHolder(holder, item, propertyKey); + } + } + + private static void onBindClosableTab( + TabGridViewHolder holder, PropertyModel item, PropertyKey propertyKey) { + assert holder instanceof ClosableTabGridViewHolder; + + if (TabProperties.TAB_CLOSED_LISTENER == propertyKey) { + holder.actionButton.setOnClickListener(view -> { + item.get(TabProperties.TAB_CLOSED_LISTENER).run(holder.getTabId()); + }); + } else if (TabProperties.TAB_SELECTED_LISTENER == propertyKey) { + holder.itemView.setOnClickListener(view -> { + item.get(TabProperties.TAB_SELECTED_LISTENER).run(holder.getTabId()); + }); } else if (TabProperties.CREATE_GROUP_LISTENER == propertyKey) { TabListMediator.TabActionListener listener = item.get(TabProperties.CREATE_GROUP_LISTENER); @@ -97,12 +111,18 @@ holder.createGroupButton.setOnClickListener(view -> listener.run(holder.getTabId())); } else if (TabProperties.ALPHA == propertyKey) { holder.itemView.setAlpha(item.get(TabProperties.ALPHA)); + } else if (TabProperties.TITLE == propertyKey) { + String title = item.get(TabProperties.TITLE); + holder.actionButton.setContentDescription(holder.itemView.getResources().getString( + org.chromium.chrome.R.string.accessibility_tabstrip_btn_close_tab, title)); + } else if (TabProperties.IPH_PROVIDER == propertyKey) { + TabListMediator.IphProvider provider = item.get(TabProperties.IPH_PROVIDER); + if (provider != null) provider.showIPH(holder.thumbnail); } } - private static void onBindViewHolder(TabGridViewHolder holder, PropertyModel item) { - for (PropertyKey propertyKey : TabProperties.ALL_KEYS_TAB_GRID) { - onBindViewHolder(holder, item, propertyKey); - } + private static void onBindSelectableTab( + TabGridViewHolder holder, PropertyModel item, PropertyKey propertyKey) { + // TODO(meiliang): Bind SELECTABLE_TAB properties } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java index ab77adc..d3141fc3 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
@@ -4,8 +4,7 @@ package org.chromium.chrome.browser.tasks.tab_management; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; +import android.support.annotation.IntDef; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -17,24 +16,32 @@ import org.chromium.chrome.tab_ui.R; import org.chromium.ui.widget.ButtonCompat; -import java.lang.ref.WeakReference; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * {@link RecyclerView.ViewHolder} for tab grid. Owns the tab info card * and the associated view hierarchy. */ class TabGridViewHolder extends RecyclerView.ViewHolder { - private static WeakReference<Bitmap> sCloseButtonBitmapWeakRef; + @IntDef({TabGridViewItemType.CLOSABLE_TAB, TabGridViewItemType.SELECTABLE_TAB}) + @Retention(RetentionPolicy.SOURCE) + public @interface TabGridViewItemType { + int CLOSABLE_TAB = 0; + int SELECTABLE_TAB = 1; + int NUM_ENTRIES = 2; + } public final ImageView favicon; public final TextView title; public final ImageView thumbnail; - public final ImageView closeButton; public final ButtonCompat createGroupButton; public final View backgroundView; + public final ImageView actionButton; + private int mTabId; - private TabGridViewHolder(View itemView) { + protected TabGridViewHolder(TabGridView itemView) { super(itemView); this.thumbnail = itemView.findViewById(R.id.tab_thumbnail); this.title = itemView.findViewById(R.id.tab_title); @@ -42,26 +49,20 @@ title.setTextColor(ContextCompat.getColor( itemView.getContext(), org.chromium.chrome.R.color.default_text_color_dark)); this.favicon = itemView.findViewById(R.id.tab_favicon); - this.closeButton = itemView.findViewById(R.id.close_button); + this.actionButton = itemView.findViewById(R.id.action_button); this.createGroupButton = itemView.findViewById(R.id.create_group_button); this.backgroundView = itemView.findViewById(R.id.background_view); - - if (sCloseButtonBitmapWeakRef == null || sCloseButtonBitmapWeakRef.get() == null) { - int closeButtonSize = - (int) itemView.getResources().getDimension(R.dimen.tab_grid_close_button_size); - Bitmap bitmap = BitmapFactory.decodeResource( - itemView.getResources(), org.chromium.chrome.R.drawable.btn_close); - sCloseButtonBitmapWeakRef = new WeakReference<>( - Bitmap.createScaledBitmap(bitmap, closeButtonSize, closeButtonSize, true)); - bitmap.recycle(); - } - this.closeButton.setImageBitmap(sCloseButtonBitmapWeakRef.get()); } public static TabGridViewHolder create(ViewGroup parent, int itemViewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.tab_grid_card_item, parent, false); - return new TabGridViewHolder(view); + TabGridView view = (TabGridView) LayoutInflater.from(parent.getContext()) + .inflate(R.layout.tab_grid_card_item, parent, false); + if (itemViewType == TabGridViewItemType.CLOSABLE_TAB) { + return new ClosableTabGridViewHolder(view); + } else { + // TODO(meiliang): Return SelectableTabGridViewHolder + return new TabGridViewHolder(view); + } } public void setTabId(int tabId) { @@ -73,7 +74,7 @@ } public void resetThumbnail() { - thumbnail.setImageResource(0); + thumbnail.setImageDrawable(null); thumbnail.setMinimumHeight(thumbnail.getWidth()); } }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java index 19a7c2a2..8c6c3d4 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
@@ -7,9 +7,10 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; +import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected; + import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.test.annotation.UiThreadTest; @@ -31,6 +32,7 @@ import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; +import java.lang.ref.WeakReference; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -152,12 +154,7 @@ @UiThreadTest public void testThumbnail() throws Exception { mGridModel.set(TabProperties.THUMBNAIL_FETCHER, mMockThumbnailProvider); - // This should have set the image resource id to 0 and reset it. - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - Assert.assertNull(mTabGridViewHolder.thumbnail.getDrawable()); - } else { - assertThat(mTabGridViewHolder.thumbnail.getDrawable(), instanceOf(ColorDrawable.class)); - } + Assert.assertNull(mTabGridViewHolder.thumbnail.getDrawable()); mGridModel.set(TabProperties.THUMBNAIL_FETCHER, null); mShouldReturnBitmap = true; @@ -168,6 +165,60 @@ @Test @MediumTest @UiThreadTest + public void testThumbnailGCAfterNullBitmap() throws Exception { + mShouldReturnBitmap = true; + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, mMockThumbnailProvider); + assertThat(mTabGridViewHolder.thumbnail.getDrawable(), instanceOf(BitmapDrawable.class)); + Bitmap bitmap = ((BitmapDrawable) mTabGridViewHolder.thumbnail.getDrawable()).getBitmap(); + WeakReference<Bitmap> ref = new WeakReference<>(bitmap); + bitmap = null; + + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, null); + Assert.assertFalse(canBeGarbageCollected(ref)); + + mShouldReturnBitmap = false; + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, mMockThumbnailProvider); + Assert.assertTrue(canBeGarbageCollected(ref)); + } + + @Test + @MediumTest + @UiThreadTest + public void testThumbnailGCAfterNewBitmap() throws Exception { + mShouldReturnBitmap = true; + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, mMockThumbnailProvider); + assertThat(mTabGridViewHolder.thumbnail.getDrawable(), instanceOf(BitmapDrawable.class)); + Bitmap bitmap = ((BitmapDrawable) mTabGridViewHolder.thumbnail.getDrawable()).getBitmap(); + WeakReference<Bitmap> ref = new WeakReference<>(bitmap); + bitmap = null; + + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, null); + Assert.assertFalse(canBeGarbageCollected(ref)); + + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, mMockThumbnailProvider); + Assert.assertTrue(canBeGarbageCollected(ref)); + } + + @Test + @MediumTest + @UiThreadTest + public void testResetThumbnailGC() throws Exception { + mShouldReturnBitmap = true; + mGridModel.set(TabProperties.THUMBNAIL_FETCHER, mMockThumbnailProvider); + assertThat(mTabGridViewHolder.thumbnail.getDrawable(), instanceOf(BitmapDrawable.class)); + Bitmap bitmap = ((BitmapDrawable) mTabGridViewHolder.thumbnail.getDrawable()).getBitmap(); + WeakReference<Bitmap> ref = new WeakReference<>(bitmap); + bitmap = null; + + Assert.assertFalse(canBeGarbageCollected(ref)); + + mTabGridViewHolder.resetThumbnail(); + Assert.assertTrue(canBeGarbageCollected(ref)); + } + + @Test + @MediumTest + @UiThreadTest public void testClickToSelect() throws Exception { mTabGridViewHolder.itemView.performClick(); Assert.assertTrue(mSelectClicked.get()); @@ -187,7 +238,7 @@ @MediumTest @UiThreadTest public void testClickToClose() throws Exception { - mTabGridViewHolder.closeButton.performClick(); + mTabGridViewHolder.actionButton.performClick(); Assert.assertTrue(mCloseClicked.get()); mCloseClicked.set(false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java index 51e7fc9..d5ef4a39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java
@@ -14,6 +14,8 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.LayerTitleCache; +import org.chromium.chrome.browser.compositor.animation.CompositorAnimator; +import org.chromium.chrome.browser.compositor.animation.CompositorAnimator.AnimatorUpdateListener; import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent; @@ -35,6 +37,9 @@ import org.chromium.ui.base.PageTransition; import org.chromium.ui.resources.ResourceManager; +import java.net.MalformedURLException; +import java.net.URL; + /** * The panel containing an ephemeral tab. * TODO(jinsukkim): Write tests. @@ -66,6 +71,16 @@ private TabModelSelectorTabModelObserver mTabModelObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver; + /** Favicon opacity. Fully visible when 1.f. */ + private float mFaviconOpacity; + + /** Animation effect for favicon display. */ + private CompositorAnimator mFaviconAnimation; + private final AnimatorUpdateListener mFadeInAnimatorListener = + animator -> mFaviconOpacity = animator.getAnimatedValue(); + private final AnimatorUpdateListener mFadeOutAnimatorListener = + animator -> mFaviconOpacity = 1.f - animator.getAnimatedValue(); + /** * Checks if this feature (a.k.a. "Preview page/image") is supported. * @return {@code true} if the feature is enabled. @@ -109,8 +124,18 @@ private class EphemeralTabPanelContentDelegate extends OverlayContentDelegate { @Override - public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) { - if (!isFailure) mUrl = url; + public void onMainFrameLoadStarted(String url, boolean isExternalUrl) { + try { + String newHost = new URL(url).getHost(); + String curHost = new URL(mUrl).getHost(); + if (!newHost.equals(curHost)) { + mUrl = url; + // Resets to default icon if favicon may need updating. + startFaviconAnimation(false); + } + } catch (MalformedURLException e) { + assert false : "Malformed URL should not be passed."; + } } } @@ -216,6 +241,29 @@ return super.updateOverlay(time, dt); } + /** + * Starts animation effect on the favicon. + * @param showFavicon If {@code true} show the favicon with fade-in effect. Otherwise + * fade out the favicon to show the default one. + */ + public void startFaviconAnimation(boolean showFavicon) { + if (mFaviconAnimation != null) mFaviconAnimation.cancel(); + mFaviconAnimation = new CompositorAnimator(getAnimationHandler()); + mFaviconAnimation.setDuration(BASE_ANIMATION_DURATION_MS); + mFaviconAnimation.removeAllListeners(); + mFaviconAnimation.addUpdateListener( + showFavicon ? mFadeInAnimatorListener : mFadeOutAnimatorListener); + mFaviconOpacity = showFavicon ? 0.f : 1.f; + mFaviconAnimation.start(); + } + + /** + * @return Snaptshot value of the favicon opacity. + */ + public float getFaviconOpacity() { + return mFaviconOpacity; + } + // Generic Event Handling @Override @@ -288,6 +336,7 @@ @Override protected void onClosed(@StateChangeReason int reason) { super.onClosed(reason); + mFaviconOpacity = 0.f; if (mSceneLayer != null) mSceneLayer.hideTree(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java index 3a109b3..98c1695c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -20,6 +20,7 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.native_page.FrozenNativePage; import org.chromium.chrome.browser.native_page.NativePage; import org.chromium.chrome.browser.tab.SadTab; import org.chromium.chrome.browser.tab.Tab; @@ -195,7 +196,12 @@ return null; } - View viewToDraw = isNativeViewShowing ? tab.getContentView() : nativePage.getView(); + View viewToDraw = null; + if (isNativeViewShowing) { + viewToDraw = tab.getContentView(); + } else if (!(nativePage instanceof FrozenNativePage)) { + viewToDraw = nativePage.getView(); + } if (viewToDraw == null || viewToDraw.getWidth() == 0 || viewToDraw.getHeight() == 0) { return null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/EphemeralTabSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/EphemeralTabSceneLayer.java index 0d13e8e..233de3ce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/EphemeralTabSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/EphemeralTabSceneLayer.java
@@ -5,8 +5,8 @@ package org.chromium.chrome.browser.compositor.scene_layer; import android.support.annotation.Nullable; -import android.text.TextUtils; +import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; @@ -14,7 +14,6 @@ import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCaptionControl; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabPanel; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabTitleControl; -import org.chromium.chrome.browser.profiles.Profile; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.resources.ResourceManager; @@ -34,7 +33,15 @@ private final int mFaviconSizePx; - private String mCachedUrl; + /** Interface to get notified that favicon is available. */ + private interface FaviconCallback { + /** + * Called when a favicon becomes available. Used to start the animation fading + * out the default icon and fading in the favicon. + */ + @CalledByNative("FaviconCallback") + void onAvailable(); + } /** * @param dpToPx The conversion multiple from dp to px for the device. @@ -59,7 +66,8 @@ // Don't try to update the layer if not initialized or showing. if (resourceManager == null || !panel.isShowing()) return; if (!mIsInitialized) { - nativeCreateEphemeralTabLayer(mNativePtr, resourceManager); + nativeCreateEphemeralTabLayer( + mNativePtr, resourceManager, () -> panel.startFaviconAnimation(true)); int openInTabIconId = (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT) && panel.canPromoteToNewTab()) ? R.drawable.open_in_new_tab @@ -99,14 +107,8 @@ panel.getBarMarginTop() * mDpToPx, panel.getBarHeight() * mDpToPx, panel.isBarBorderVisible(), panel.getBarBorderHeight() * mDpToPx, panel.getBarShadowVisible(), panel.getBarShadowOpacity(), panel.getIconColor(), - panel.getDragHandlebarColor(), isProgressBarVisible, progressBarHeight * mDpToPx, - progressBarOpacity, progressBarCompletion); - - String url = panel.getUrl(); - if (!TextUtils.equals(mCachedUrl, url)) { - nativeGetFavicon(mNativePtr, Profile.getLastUsedProfile(), url, mFaviconSizePx); - mCachedUrl = url; - } + panel.getDragHandlebarColor(), panel.getFaviconOpacity(), isProgressBarVisible, + progressBarHeight * mDpToPx, progressBarOpacity, progressBarCompletion); } @Override @@ -120,14 +122,11 @@ public void hideTree() { if (!mIsInitialized) return; nativeHideTree(mNativePtr); - mCachedUrl = null; } @Override protected void initializeNative() { - if (mNativePtr == 0) { - mNativePtr = nativeInit(); - } + if (mNativePtr == 0) mNativePtr = nativeInit(); assert mNativePtr != 0; } @@ -142,8 +141,8 @@ } private native long nativeInit(); - private native void nativeCreateEphemeralTabLayer( - long nativeEphemeralTabSceneLayer, ResourceManager resourceManager); + private native void nativeCreateEphemeralTabLayer(long nativeEphemeralTabSceneLayer, + ResourceManager resourceManager, FaviconCallback callback); private native void nativeSetContentTree( long nativeEphemeralTabSceneLayer, SceneLayer contentTree); private native void nativeHideTree(long nativeEphemeralTabSceneLayer); @@ -151,8 +150,6 @@ int barTextResourceId, int barBackgroundResourceId, int barShadowResourceId, int panelIconResourceId, int dragHandlebarResourceId, int openTabIconResourceId, int closeIconResourceId); - private native void nativeGetFavicon( - long nativeEphemeralTabSceneLayer, Profile profile, String url, int size); private native void nativeUpdate(long nativeEphemeralTabSceneLayer, int titleViewId, int captionViewId, float captionAnimationPercentage, float textLayerMinHeight, float titleCaptionSpacing, boolean captionVisible, int progressBarBackgroundResourceId, @@ -161,6 +158,6 @@ float panelWidth, float panelHeight, int barBackgroundColor, float barMarginSide, float barMarginTop, float barHeight, boolean barBorderVisible, float barBorderHeight, boolean barShadowVisible, float barShadowOpacity, int iconColor, int dragHandlebarColor, - boolean isProgressBarVisible, float progressBarHeight, float progressBarOpacity, - int progressBarCompletion); + float faviconOpacity, boolean isProgressBarVisible, float progressBarHeight, + float progressBarOpacity, int progressBarCompletion); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java index 1d15b452..bab21314 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -145,6 +145,7 @@ // The first download that is triggered in background mode. private String mFirstBackgroundDownloadId; + private int mFirstBackgroundDownloadInterruptionCount; /** Generic interface for notifying external UI components about downloads and their states. */ public interface DownloadObserver extends DownloadSharedPreferenceHelper.Observer { @@ -1982,7 +1983,9 @@ if (mFirstBackgroundDownloadId == null) { mFirstBackgroundDownloadId = downloadGuid; DownloadNotificationUmaHelper.recordFirstBackgroundDownloadHistogram( - UmaBackgroundDownload.STARTED); + UmaBackgroundDownload.STARTED, 0); + nativeRecordFirstBackgroundInterruptReason(getNativeDownloadManagerService(), + mFirstBackgroundDownloadId, true /* downloadStarted */); } } @@ -2000,7 +2003,13 @@ DownloadNotificationUmaHelper.recordBackgroundDownloadHistogram(event); } if (downloadGuid.equals(mFirstBackgroundDownloadId)) { - DownloadNotificationUmaHelper.recordFirstBackgroundDownloadHistogram(event); + DownloadNotificationUmaHelper.recordFirstBackgroundDownloadHistogram( + event, mFirstBackgroundDownloadInterruptionCount); + if (event == UmaBackgroundDownload.INTERRUPTED) { + mFirstBackgroundDownloadInterruptionCount++; + nativeRecordFirstBackgroundInterruptReason(getNativeDownloadManagerService(), + mFirstBackgroundDownloadId, false /* downloadStarted */); + } } } @@ -2069,4 +2078,6 @@ private native void nativeOnFullBrowserStarted(long nativeDownloadManagerService); private native void nativeCreateInterruptedDownloadForTest( long nativeDownloadManagerService, String url, String guid, String targetPath); + private native void nativeRecordFirstBackgroundInterruptReason( + long nativeDownloadManagerService, String guid, boolean downloadStarted); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java index e8b91f39..5e26bab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java
@@ -218,9 +218,15 @@ /** * Helper method to record the first background download resumption UMA. * @param type UMA type to be recorded. + * @param interruptionCount Number of interruptions since process launch. */ - static void recordFirstBackgroundDownloadHistogram(@UmaBackgroundDownload int type) { + static void recordFirstBackgroundDownloadHistogram( + @UmaBackgroundDownload int type, int interruptionCount) { RecordHistogram.recordEnumeratedHistogram( "MobileDownload.Background.FirstDownload", type, UmaBackgroundDownload.NUM_ENTRIES); + if (type != UmaBackgroundDownload.INTERRUPTED && type != UmaBackgroundDownload.STARTED) { + RecordHistogram.recordCountHistogram( + "MobileDownload.FirstBackground.InterruptionCount", interruptionCount); + } } }
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index f73b8f916..93bc61f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -810,7 +810,7 @@ <translation id="6963766334940102469">Bladwijzers verwijderen</translation> <translation id="6965382102122355670">OK</translation> <translation id="6978479750597523876">Vertaalinstellingen opnieuw instellen</translation> -<translation id="6979737339423435258">Altijd</translation> +<translation id="6979737339423435258">Alles</translation> <translation id="6981982820502123353">Toegankelijkheid</translation> <translation id="6985347914332179298">Geen downloads hier</translation> <translation id="6989267951144302301">Kan niet downloaden</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index 4edab101..dd78ba1 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -20,7 +20,7 @@ <translation id="1145536944570833626">Excluir dados já existentes.</translation> <translation id="1146678959555564648">Entrar na RV</translation> <translation id="116280672541001035">Dados usados</translation> -<translation id="1171770572613082465">Toque no botão "Mais visitados" para ver os sites muito acessados</translation> +<translation id="1171770572613082465">Toque no botão "Sites famosos" para ver os sites muito acessados</translation> <translation id="1172593791219290334">Página de inicialização</translation> <translation id="1173894706177603556">Renomear</translation> <translation id="1175310183703641346">Seus favoritos, histórico, senhas e outras configurações não serão mais sincronizados com sua Conta do Google</translation> @@ -257,7 +257,7 @@ <translation id="2836148919159985482">Toque no botão "Voltar" para sair da tela cheia.</translation> <translation id="2842985007712546952">Pasta mãe</translation> <translation id="2845873210977809562">As guias abertas foram fechadas</translation> -<translation id="2858138569776157458">Mais visitados</translation> +<translation id="2858138569776157458">Sites famosos</translation> <translation id="2870560284913253234">Site</translation> <translation id="2874939134665556319">Faixa anterior</translation> <translation id="2876369937070532032">Quando há risco de segurança, envia para o Google os URLs de algumas páginas que você visita</translation> @@ -1005,7 +1005,7 @@ <translation id="8327155640814342956">Para ter a melhor experiência de navegação, abra para atualizar o Chrome</translation> <translation id="8339163506404995330">Páginas em <ph name="LANGUAGE" /> não serão traduzidas</translation> <translation id="8349013245300336738">Classificar por quantidade de dados usados</translation> -<translation id="8364299278605033898">Ver sites mais visitados</translation> +<translation id="8364299278605033898">Ver sites conhecidos</translation> <translation id="8372893542064058268">Permite a sincronização em segundo plano para um site específico.</translation> <translation id="8374821112118309944">Atualize o TalkBack para receber uma versão mais nova.</translation> <translation id="8378714024927312812">Gerenciado pela sua organização</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index 90cc436..2651363 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -20,7 +20,7 @@ <translation id="1145536944570833626">Избришите постојеће податке</translation> <translation id="1146678959555564648">Уђи у ВР</translation> <translation id="116280672541001035">Искоришћено</translation> -<translation id="1171770572613082465">Додирните дугме „Најпопуларнији веб-сајтови“ и погледајте популарне веб-сајтове</translation> +<translation id="1171770572613082465">Додирните дугме „Најпопуларнији веб-сајтови“ и видите те веб-сајтове</translation> <translation id="1172593791219290334">Почетна страница</translation> <translation id="1173894706177603556">Преименуј</translation> <translation id="1175310183703641346">Обележивачи, историја, лозинке и други подаци се више неће синхронизовати са Google налогом</translation>
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 7b1af26..c85bacbf 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-77.0.3814.0_rc-r1-merged.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-77.0.3815.0_rc-r1-merged.afdo.bz2 \ No newline at end of file
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc index 1bf6733..7efac59 100644 --- a/chrome/app/chrome_main.cc +++ b/chrome/app/chrome_main.cc
@@ -12,6 +12,7 @@ #include "chrome/app/chrome_main_delegate.h" #include "chrome/common/buildflags.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/profiler/main_thread_stack_sampling_profiler.h" #include "content/public/app/content_main.h" #include "content/public/common/content_switches.h" #include "headless/public/headless_shell.h" @@ -93,6 +94,12 @@ SetUpBundleOverrides(); #endif + // Start the sampling profiler as early as possible - namely, once the command + // line data is available. Allocated as an object on the stack to ensure that + // the destructor runs on shutdown, which is important to avoid the profiler + // thread's destruction racing with main thread destruction. + MainThreadStackSamplingProfiler scoped_sampling_profiler; + // Chrome-specific process modes. #if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) if (command_line->HasSwitch(switches::kHeadless)) {
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index e9e116b..d53afb5 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">በመሣሪያ አሞሌ ላይ አሳይ</translation> <translation id="6086846494333236931">በእርስዎ አስተዳዳሪ የተጫነ</translation> <translation id="6087960857463881712">ግሩም ፊት</translation> -<translation id="6089481419520884864">ገጹን አጣራ</translation> <translation id="6091761513005122595">አጋራ በተሳካ ሁኔታ ተፈናጥጧል።</translation> <translation id="6093888419484831006">ዝማኔን በመሰረዝ ላይ...</translation> <translation id="6095984072944024315">−</translation> @@ -3340,6 +3339,7 @@ <translation id="6125479973208104919">የአጋጣሚ ነገር ሆኖ መለያዎን እንደገና ወደዚህ <ph name="DEVICE_TYPE" /> ማከል አለብዎት።</translation> <translation id="6129691635767514872">የተመረጠው ውሂብ ከChrome እና የሰመሩ መሣሪያዎች ተወግዷል። የGoogle መለያዎ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ላይ እንደ የሌሎች Google አገልግሎቶች ፍለጋዎች እና እንቅስቃሴ ያለ ሌሎች የአሰሳ ታሪክ ዓይነት ሊኖረው ይችላል።</translation> <translation id="6129938384427316298">የNetscape ሰርቲፊኬት አስተያየት</translation> +<translation id="6129953537138746214">ባዶ ቦታ</translation> <translation id="6135622770221372891">የሰርጥ መታወቂያዎች</translation> <translation id="6136114942382973861">የውርዶች አሞሌን ዝጋ</translation> <translation id="6137767437444130246">የተጠቃሚ እውቅና ማረጋገጫ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index d99871b..1a41a53 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3290,7 +3290,6 @@ <translation id="6082651258230788217">العرض في شريط الأدوات</translation> <translation id="6086846494333236931">تم التثبيت من قبل مشرفك</translation> <translation id="6087960857463881712">وجه رائع</translation> -<translation id="6089481419520884864">صفحة التنقية</translation> <translation id="6091761513005122595">تم تحميل المشاركة بنجاح.</translation> <translation id="6093888419484831006">جارٍ إلغاء التحديث...</translation> <translation id="6095984072944024315">−</translation> @@ -3317,6 +3316,7 @@ <translation id="6125479973208104919">عذرًا، ستحتاج إلى إضافة حسابك إلى جهاز <ph name="DEVICE_TYPE" /> هذا مرة أخرى.</translation> <translation id="6129691635767514872">تمت إزالة البيانات المحددة من Chrome والأجهزة التي تمت مزامنتها. قد يحتوي حسابك على Google على نماذج أخرى من سجل التصفح، مثل عمليات البحث والنشاط من خدمات Google الأخرى في <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">التعليق على شهادة Netscape</translation> +<translation id="6129953537138746214">مسافة</translation> <translation id="6135622770221372891">معرّفات القنوات</translation> <translation id="6136114942382973861">إغلاق شريط التنزيلات</translation> <translation id="6137767437444130246">شهادة المستخدم</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 56aa0d27..f0b7b40 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Показване в лентата с инструменти</translation> <translation id="6086846494333236931">Инсталирано от администратора ви</translation> <translation id="6087960857463881712">Страхотно лице</translation> -<translation id="6089481419520884864">Създаване на сбит вариант на страницата</translation> <translation id="6091761513005122595">Дялът е свързан успешно.</translation> <translation id="6093888419484831006">Актуализирането се анулира...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">За съжаление, трябва отново да добавите профила си към това устройство <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Избраните данни са премахнати от Chrome и синхронизираните устройства. Възможно е в профила ви в Google да има други видове история на сърфиране, съхранявани на адрес <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> – например търсения и активност от други наши услуги.</translation> <translation id="6129938384427316298">Коментар на сертификат на Netscape</translation> +<translation id="6129953537138746214">Интервал</translation> <translation id="6135622770221372891">Идентификатори на каналите</translation> <translation id="6136114942382973861">Затваряне на лентата на изтеглянето</translation> <translation id="6137767437444130246">Потребителски сертификат</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index f3f46ab6..01ca603 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">টুলবারের মধ্যে দেখুন</translation> <translation id="6086846494333236931">আপনার প্রশাসক দ্বারা ইনস্টল করা হয়েছে</translation> <translation id="6087960857463881712">দুর্দান্ত চেহারা</translation> -<translation id="6089481419520884864">পৃষ্ঠা পাতন করুন</translation> <translation id="6091761513005122595">শেয়ার মাউন্ট করা হয়েছে।</translation> <translation id="6093888419484831006">আপডেট বাতিল হচ্ছে...</translation> <translation id="6095984072944024315">−</translation> @@ -3340,6 +3339,7 @@ <translation id="6125479973208104919">দুর্ভাগ্যবশত, আপনাকে এই <ph name="DEVICE_TYPE" />এ আবার অ্যাকাউন্ট তৈরি করতে হবে।</translation> <translation id="6129691635767514872">বেছে নেওয়া ডেটা Chrome ও সিঙ্ক করা ডিভাইস থেকে সরিয়ে ফেলা হয়েছে। আপনার Google অ্যাকাউন্টের অন্যান্য ধরনের ব্রাউজিং ইতিহাস, যেমন বিভিন্ন Google পরিষেবায় করা সার্চ এবং অ্যাক্টিভিটির মতো তথ্য <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-এ সেভ করা থাকতে পারে।</translation> <translation id="6129938384427316298">Netscape সার্টিফিকেট মন্তব্য</translation> +<translation id="6129953537138746214">ব্যবধান</translation> <translation id="6135622770221372891">চ্যানেল IDগুলি</translation> <translation id="6136114942382973861">ডাউনলোড বার বন্ধ করুন</translation> <translation id="6137767437444130246">ব্যবহারকারীর সার্টিফিকেট</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index e56b327..5894e09 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -925,7 +925,7 @@ <translation id="2391762656119864333">Revoca</translation> <translation id="2392369802118427583">Activa</translation> <translation id="2394566832561516196">La configuració s'esborrarà en tornar a carregar.</translation> -<translation id="2395616325548404795">El teu dispositiu <ph name="DEVICE_TYPE" /> s'ha inscrit correctament a la gestió empresarial, però no ha pogut enviar la informació d'elements i d'ubicació. Introdueix aquesta informació manualment a la Consola d'administració del dispositiu.</translation> +<translation id="2395616325548404795">El teu dispositiu <ph name="DEVICE_TYPE" /> s'ha inscrit correctament a la gestió empresarial, però no ha pogut enviar la informació d'elements i d'ubicació. Introdueix aquesta informació manualment a la consola d'administració del dispositiu.</translation> <translation id="2396783860772170191">Introdueix un PIN de 4 dígits (0000-9999)</translation> <translation id="2408955596600435184">Introdueix el PIN</translation> <translation id="241082044617551207">Connector desconegut</translation> @@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">Mostra a la barra d'eines</translation> <translation id="6086846494333236931">Extensió instal·lada per l'administrador</translation> <translation id="6087960857463881712">Cara de fascinació</translation> -<translation id="6089481419520884864">Condensa la pàgina</translation> <translation id="6091761513005122595">L'ús compartit s'ha activat correctament.</translation> <translation id="6093888419484831006">S’està cancel·lant l’actualització...</translation> <translation id="6095984072944024315">−</translation> @@ -3340,6 +3339,7 @@ <translation id="6125479973208104919">Cal que tornis a afegir el teu compte en aquest <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Les dades seleccionades s'han suprimit de Chrome i dels dispositius sincronitzats. És possible que el teu compte de Google tingui altres formes de l'historial de navegació, com ara les cerques i l'activitat d'altres serveis de Google a <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Comentari de certificat de Netscape</translation> +<translation id="6129953537138746214">Espai</translation> <translation id="6135622770221372891">Identificadors de canal</translation> <translation id="6136114942382973861">Tanca la barra de baixades</translation> <translation id="6137767437444130246">Certificat d'usuari</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index a526c5d6..c50baf7 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -3311,7 +3311,6 @@ <translation id="6082651258230788217">Zobrazit na liště</translation> <translation id="6086846494333236931">Nainstaloval administrátor</translation> <translation id="6087960857463881712">Paráda</translation> -<translation id="6089481419520884864">Zpracovat stránku</translation> <translation id="6091761513005122595">Sdílená složka byla úspěšně připojena.</translation> <translation id="6093888419484831006">Rušení aktualizace...</translation> <translation id="6095984072944024315">−</translation> @@ -3339,6 +3338,7 @@ <translation id="6125479973208104919">Do zařízení <ph name="DEVICE_TYPE" /> je nutné znovu přidat účet.</translation> <translation id="6129691635767514872">Vybraná data byla z Chromu a synchronizovaných zařízení odstraněna. Na stránce <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> mohou být k dispozici další druhy historie prohlížení zaznamenané ve vašem účtu Google, například vyhledávací dotazy a aktivita z ostatních služeb Google.</translation> <translation id="6129938384427316298">Komentář certifikátu Netscape</translation> +<translation id="6129953537138746214">Mezera</translation> <translation id="6135622770221372891">ID kanálu</translation> <translation id="6136114942382973861">Zavřít lištu se staženými soubory</translation> <translation id="6137767437444130246">Certifikát uživatele</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 83f3a61b..be40a477 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">Vis på værktøjslinjen</translation> <translation id="6086846494333236931">Installeret af din administrator</translation> <translation id="6087960857463881712">Fantastisk-smiley</translation> -<translation id="6089481419520884864">Destiller side</translation> <translation id="6091761513005122595">Delingen blev anvendt.</translation> <translation id="6093888419484831006">Annullerer opdatering...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">Du skal desværre føje din konto til denne <ph name="DEVICE_TYPE" /> igen.</translation> <translation id="6129691635767514872">De valgte data er blevet fjernet fra Chrome og synkroniserede enheder. Din Google-konto kan indeholde andre former for browserhistorik, f.eks. søgninger og aktivitet i andre Google-tjenester, på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> <translation id="6129938384427316298">Kommentar til Netscape-certifikat</translation> +<translation id="6129953537138746214">Mellemrum</translation> <translation id="6135622770221372891">Kanal-id'er</translation> <translation id="6136114942382973861">Luk downloadlinje</translation> <translation id="6137767437444130246">Brugercertifikat</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 397726aa7..62c58692 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -3310,7 +3310,6 @@ <translation id="6082651258230788217">In Symbolleiste anzeigen</translation> <translation id="6086846494333236931">Von Ihrem Administrator installiert</translation> <translation id="6087960857463881712">Cooles Gesicht</translation> -<translation id="6089481419520884864">Seite konvertieren</translation> <translation id="6091761513005122595">Freigabe wurde erfolgreich bereitgestellt.</translation> <translation id="6093888419484831006">Aktualisierung wird abgebrochen...</translation> <translation id="6095984072944024315">−</translation> @@ -3338,6 +3337,7 @@ <translation id="6125479973208104919">Sie müssen Ihr Konto dem <ph name="DEVICE_TYPE" /> erneut hinzufügen.</translation> <translation id="6129691635767514872">Die ausgewählten Daten wurden aus Chrome und von synchronisierten Geräten entfernt. Ihr Google-Konto weist möglicherweise andere Formen von Browserverläufen wie Suchanfragen und Aktivitäten von anderen Google-Diensten unter <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> auf.</translation> <translation id="6129938384427316298">Kommentar zu Netscape-Zertifikaten</translation> +<translation id="6129953537138746214">Leerzeichen</translation> <translation id="6135622770221372891">Kanal-IDs</translation> <translation id="6136114942382973861">Downloadleiste schließen</translation> <translation id="6137767437444130246">Nutzerzertifikat</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 014b95f..35b9230 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Εμφάνιση στη γραμμή εργαλείων</translation> <translation id="6086846494333236931">Εγκαταστάθηκε από το διαχειριστή σας</translation> <translation id="6087960857463881712">Καταπληκτικό πρόσωπο</translation> -<translation id="6089481419520884864">Φιλτράρισμα σελίδας</translation> <translation id="6091761513005122595">Το σύστημα κοινοποίησης προσαρτήθηκε επιτυχώς.</translation> <translation id="6093888419484831006">Ακύρωση ενημέρωσης...</translation> <translation id="6095984072944024315">−</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Δυστυχώς, θα πρέπει να προσθέσετε ξανά τον λογαριασμό σας σε αυτήν τη συσκευή <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Τα επιλεγμένα δεδομένα καταργήθηκαν από το Chrome και από τις συγχρονισμένες συσκευές. Ο Λογαριασμός σας Google μπορεί να διαθέτει άλλες μορφές ιστορικού περιήγησης, όπως αναζητήσεις και δραστηριότητα από άλλες υπηρεσίες Google στη διεύθυνση <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Σχόλιο πιστοποιητικού Netscape</translation> +<translation id="6129953537138746214">Κενό</translation> <translation id="6135622770221372891">Αναγνωριστικά καναλιών</translation> <translation id="6136114942382973861">Κλείσιμο γραμμής λήψεων</translation> <translation id="6137767437444130246">Πιστοποιητικό χρήστη</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 9b2b063..d8075c1c 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -3314,7 +3314,6 @@ <translation id="6082651258230788217">Show in toolbar</translation> <translation id="6086846494333236931">Installed by your administrator</translation> <translation id="6087960857463881712">Awesome face</translation> -<translation id="6089481419520884864">Distill page</translation> <translation id="6091761513005122595">Share mounted successfully.</translation> <translation id="6093888419484831006">Cancelling update...</translation> <translation id="6095984072944024315">−</translation> @@ -3342,6 +3341,7 @@ <translation id="6125479973208104919">Unfortunately, you'll need to add your account to this <ph name="DEVICE_TYPE" /> again.</translation> <translation id="6129691635767514872">The selected data has been removed from Chrome and synced devices. Your Google Account may have other forms of browsing history such as searches and activity from other Google services at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Netscape Certificate Comment</translation> +<translation id="6129953537138746214">Space</translation> <translation id="6135622770221372891">Channel IDs</translation> <translation id="6136114942382973861">Close downloads bar</translation> <translation id="6137767437444130246">User certificate</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 7ab9db5..1baba989 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">Mostrar en la barra de herramientas</translation> <translation id="6086846494333236931">Instalado por el administrador</translation> <translation id="6087960857463881712">Cara increíble</translation> -<translation id="6089481419520884864">Filtrar página</translation> <translation id="6091761513005122595">Se activó correctamente el recurso compartido.</translation> <translation id="6093888419484831006">Cancelando actualización…</translation> <translation id="6095984072944024315">−</translation> @@ -3340,6 +3339,7 @@ <translation id="6125479973208104919">Lamentablemente, debes volver a agregar tu cuenta a este dispositivo <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Los datos seleccionados se quitaron de Chrome y los dispositivos sincronizados. Es posible que tu cuenta de Google tenga otros formularios del historial de navegación, como las búsquedas y la actividad de otros servicios de Google en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Comentario sobre el certificado Netscape</translation> +<translation id="6129953537138746214">Google Space</translation> <translation id="6135622770221372891">ID de canales</translation> <translation id="6136114942382973861">Cerrar la barra de descargas</translation> <translation id="6137767437444130246">Certificado del usuario</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 2865af30..ebcfff5 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">Mostrar en la barra de herramientas</translation> <translation id="6086846494333236931">Instalada por tu administrador</translation> <translation id="6087960857463881712">Cara de emoción</translation> -<translation id="6089481419520884864">Convertir página</translation> <translation id="6091761513005122595">El recurso compartido se ha activado correctamente.</translation> <translation id="6093888419484831006">Cancelando la actualización...</translation> <translation id="6095984072944024315">−</translation> @@ -3340,6 +3339,7 @@ <translation id="6125479973208104919">Debes volver a añadir una cuenta a este <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Los datos seleccionados se han quitado de Chrome y de los dispositivos sincronizados. Es posible que tu cuenta de Google tenga otros tipos de historial de navegación, como búsquedas o actividad de otros servicios de Google, en la página <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Comentario del certificado de Netscape</translation> +<translation id="6129953537138746214">Espacio</translation> <translation id="6135622770221372891">IDs de canal</translation> <translation id="6136114942382973861">Cerrar barra de descargas</translation> <translation id="6137767437444130246">Certificado de usuario</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 141412c..a1050b7a 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Tööriistaribal kuvamine</translation> <translation id="6086846494333236931">Selle installis administraator</translation> <translation id="6087960857463881712">Lahe nägu</translation> -<translation id="6089481419520884864">Lehe teisendamine</translation> <translation id="6091761513005122595">Jagatava üksuse ühendamine õnnestus.</translation> <translation id="6093888419484831006">Värskenduse tühistamine ...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Kahjuks peate oma konto seadmesse <ph name="DEVICE_TYPE" /> uuesti lisama.</translation> <translation id="6129691635767514872">Valitud andmed eemaldati Chrome'ist ja sünkroonitud seadmetest. Aadressil <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> võib teie Google'i kontol olla muus vormis sirvimisajalugu, nt otsingud ja muudes Google'i teenustes toimunud tegevused.</translation> <translation id="6129938384427316298">Netscape'i sertifikaadi kommentaar</translation> +<translation id="6129953537138746214">Tühik</translation> <translation id="6135622770221372891">Kanalite ID-d</translation> <translation id="6136114942382973861">Sule allalaadimiste riba</translation> <translation id="6137767437444130246">Kasutaja sertifikaat</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index a81ef3fc..42d15d5 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -3311,7 +3311,6 @@ <translation id="6082651258230788217">نمایش در نوار ابزار</translation> <translation id="6086846494333236931">سرپرست سیستم شما نصب کرده است.</translation> <translation id="6087960857463881712">چهره تأثیرگذار</translation> -<translation id="6089481419520884864">صفحه فشرده</translation> <translation id="6091761513005122595">دستگاه ذخیرهسازی متصل به شبکه با موفقیت نشانده شد.</translation> <translation id="6093888419484831006">در حال لغو بهروزرسانی...</translation> <translation id="6095984072944024315">−</translation> @@ -3339,6 +3338,7 @@ <translation id="6125479973208104919">متأسفانه دوباره باید حسابتان را به این <ph name="DEVICE_TYPE" /> اضافه کنید.</translation> <translation id="6129691635767514872">دادههای انتخابشده از Chrome و دستگاههای همگامسازیشده برداشته شدهاند. ممکن است حساب Google شما در <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> شکلهای دیگری از سابقه مرور (مانند جستجوها و فعالیت از سایر سرویسهای Google) داشته باشد.</translation> <translation id="6129938384427316298">نظر گواهی Netscape</translation> +<translation id="6129953537138746214">فاصله</translation> <translation id="6135622770221372891">شناسههای کانال</translation> <translation id="6136114942382973861">بستن نوار بارگیری</translation> <translation id="6137767437444130246">گواهی کاربر</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index bad6db4..334bbbed 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">Näytä yläpalkissa</translation> <translation id="6086846494333236931">Järjestelmänvalvojasi asentama</translation> <translation id="6087960857463881712">Eeppinen hymiö</translation> -<translation id="6089481419520884864">Koontisivu</translation> <translation id="6091761513005122595">Jako otettiin käyttöön.</translation> <translation id="6093888419484831006">Peruutetaan päivitystä...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">Sinun on lisättävä tilisi laitteelle <ph name="DEVICE_TYPE" /> uudelleen.</translation> <translation id="6129691635767514872">Valitut tiedot on poistettu Chromesta ja synkronoiduilta laitteilta. Google-tililläsi voi olla muita selaushistoriatietoja, esimerkiksi hakuja ja toimintaa muista Google-palveluista, osoitteessa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Netscape-varmenteen kommentti</translation> +<translation id="6129953537138746214">Välilyönti</translation> <translation id="6135622770221372891">Kanavatunnukset</translation> <translation id="6136114942382973861">Sulje latauspalkki</translation> <translation id="6137767437444130246">Käyttäjävarmenne</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 8952ccdd..710e6039 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Ipakita sa toolbar</translation> <translation id="6086846494333236931">Na-install ng iyong administrator</translation> <translation id="6087960857463881712">Astig na mukha</translation> -<translation id="6089481419520884864">Distill page</translation> <translation id="6091761513005122595">Matagumpay na na-mount ang share</translation> <translation id="6093888419484831006">Kinakansela ang pag-update...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Sa kasamaang-palad, kakailanganin mong idagdag muli ang iyong account sa <ph name="DEVICE_TYPE" /> na ito.</translation> <translation id="6129691635767514872">Inalis sa Chrome at sa mga naka-sync na device ang napiling data. Maaaring may iba pang anyo ng history ng pag-browse ang iyong Google Account tulad ng mga paghahanap at aktibidad mula sa iba pang serbisyo ng Google sa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Komento sa Netscape Certificate</translation> +<translation id="6129953537138746214">Puwang</translation> <translation id="6135622770221372891">Mga ID ng Channel</translation> <translation id="6136114942382973861">Isara ang bar ng mga download</translation> <translation id="6137767437444130246">Certificate ng user</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index bef6b861..d87612f2 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Afficher dans la barre d'outils</translation> <translation id="6086846494333236931">Installée par votre administrateur</translation> <translation id="6087960857463881712">Visage "Génial"</translation> -<translation id="6089481419520884864">Convertir la page</translation> <translation id="6091761513005122595">Le partage a bien été installé.</translation> <translation id="6093888419484831006">Annulation de la mise à jour...</translation> <translation id="6095984072944024315">−</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Malheureusement, vous devrez ajouter à nouveau votre compte sur cet appareil <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Les données sélectionnées ont été supprimées de Chrome et des appareils synchronisés. Votre compte Google conserve peut-être d'autres formes d'historique de navigation, comme vos recherches ou vos activités via d'autres services Google sur la page <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Commentaire du certificat Netscape</translation> +<translation id="6129953537138746214">Espace</translation> <translation id="6135622770221372891">Identifiants de version</translation> <translation id="6136114942382973861">Fermer la barre de téléchargements</translation> <translation id="6137767437444130246">Certificat utilisateur</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index a1d7a15..11c410e 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">ટુલબારમાં દર્શાવો</translation> <translation id="6086846494333236931">તમારા વ્યવસ્થાપક દ્વારા ઇન્સ્ટોલ કરાયું</translation> <translation id="6087960857463881712">અદ્ભુત ચહેરો</translation> -<translation id="6089481419520884864">Distill પૃષ્ઠ</translation> <translation id="6091761513005122595">શેર સફળતાપૂર્વક માઉન્ટ થયું.</translation> <translation id="6093888419484831006">અપડેટને રદ કરી રહ્યું છે...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">કમનસીબે, તમને આ <ph name="DEVICE_TYPE" />માં તમારું એકાઉન્ટ ઉમેરવાની જરૂર પડશે.</translation> <translation id="6129691635767514872">પસંદ કરેલો ડેટા Chrome અને તમારા સિંક કરેલ ડિવાઇસમાંથી ડિલીટ કરવામાં આવ્યો છે. તમારા Google એકાઉન્ટમાં બ્રાઉઝિંગ ઇતિહાસના બીજા સ્વરૂપો જેમ કે શોધ અને બીજા Google સેવાઓ પરની પ્રવૃત્તિઓ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> પર હોય શકે છે.</translation> <translation id="6129938384427316298">નેટસ્કેપ પ્રમાણપત્ર ટિપ્પણી</translation> +<translation id="6129953537138746214">જગ્યા</translation> <translation id="6135622770221372891">ચેનલ ID</translation> <translation id="6136114942382973861">ડાઉનલોડ બાર બંધ કરો</translation> <translation id="6137767437444130246">વપરાશકર્તા પ્રમાણપત્ર</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 5ee86f7..c5230b1 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -3314,7 +3314,6 @@ <translation id="6082651258230788217">टूलबार में दिखाएं</translation> <translation id="6086846494333236931">आपके नियंत्रक द्वारा इंस्टॉल किया गया</translation> <translation id="6087960857463881712">बढ़िया चेहरा</translation> -<translation id="6089481419520884864">शुद्ध पेज</translation> <translation id="6091761513005122595">शेयर माउंट करना सफल रहा.</translation> <translation id="6093888419484831006">अपडेट रद्द किया जा रहा है...</translation> <translation id="6095984072944024315">−</translation> @@ -3342,6 +3341,7 @@ <translation id="6125479973208104919">दुर्भाग्यवश, आपको इस <ph name="DEVICE_TYPE" /> में अपना खाता फिर से जोड़ना होगा.</translation> <translation id="6129691635767514872">चुना गया डेटा Chrome और सिंक किए गए सभी डिवाइस से हटा दिया गया है. हो सकता है कि आपके Google खाते में खोजों और <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य Google सेवाओं की गतिविधि जैसे अन्य प्रकार के ब्राउज़िंग इतिहास मौजूद हों.</translation> <translation id="6129938384427316298">Netscape प्रमाणपत्र टिप्पणी</translation> +<translation id="6129953537138746214">Space</translation> <translation id="6135622770221372891">चैनल आईडी</translation> <translation id="6136114942382973861">डाउनलोड बार बंद करें</translation> <translation id="6137767437444130246">उपयोगकर्ता प्रमाणपत्र</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 254c237..49d2080 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Prikaži na alatnoj traci</translation> <translation id="6086846494333236931">Instalirao vaš administrator</translation> <translation id="6087960857463881712">Oduševljeno lice</translation> -<translation id="6089481419520884864">Sažmi stranicu</translation> <translation id="6091761513005122595">Dijeljenje je učitano.</translation> <translation id="6093888419484831006">Otkazivanje ažuriranja...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Nažalost, morat ćete ponovo dodati svoj račun na ovaj uređaj <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Odabrani podaci uklonjeni su iz Chromea i sa sinkroniziranih uređaja. Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjerice pretraživanja i aktivnosti s drugih Googleovih usluga, na stranici <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Komentar Netscape certifikata</translation> +<translation id="6129953537138746214">Razmak</translation> <translation id="6135622770221372891">ID-ovi kanala</translation> <translation id="6136114942382973861">Zatvori traku preuzimanja</translation> <translation id="6137767437444130246">Korisnički certifikat</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 08dd10a..12dc7a3 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -3317,7 +3317,6 @@ <translation id="6082651258230788217">Megjelenítés az eszköztáron</translation> <translation id="6086846494333236931">A rendszergazda telepítette</translation> <translation id="6087960857463881712">Menő arc</translation> -<translation id="6089481419520884864">Oldal előállítása</translation> <translation id="6091761513005122595">A megosztott tároló csatlakoztatása sikeres volt.</translation> <translation id="6093888419484831006">Frissítés leállítása...</translation> <translation id="6095984072944024315">−</translation> @@ -3345,6 +3344,7 @@ <translation id="6125479973208104919">Sajnos ismét hozzá kell adnia fiókját a(z) <ph name="DEVICE_TYPE" /> eszközhöz.</translation> <translation id="6129691635767514872">A kiválasztott adatokat eltávolítottuk a Chrome-ból és a szinkronizált eszközökről. Előfordulhat, hogy Google-fiókjában (a <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> címen) még szerepelnek a böngészési előzmények egyéb formái, például az egyéb Google-szolgáltatásokban végzett keresései és tevékenységei.</translation> <translation id="6129938384427316298">Netscape tanúsítvány - megjegyzés</translation> +<translation id="6129953537138746214">Szóköz</translation> <translation id="6135622770221372891">Csatornaazonosítók</translation> <translation id="6136114942382973861">A letöltéssáv bezárása</translation> <translation id="6137767437444130246">Felhasználói tanúsítvány</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index a370165..234268d 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">Tampilkan di bilah alat</translation> <translation id="6086846494333236931">Dipasang oleh administrator Anda</translation> <translation id="6087960857463881712">Wajah keren</translation> -<translation id="6089481419520884864">Halaman saring</translation> <translation id="6091761513005122595">URL berbagi berhasil dipasang.</translation> <translation id="6093888419484831006">Membatalkan pembaruan...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">Sayangnya, Anda harus menambahkan akun ke perangkat <ph name="DEVICE_TYPE" /> ini lagi.</translation> <translation id="6129691635767514872">Data yang dipilih telah dihapus dari Chrome dan perangkat yang disinkronkan. Akun Google Anda mungkin memiliki bentuk histori penjelajahan lain seperti penelusuran dan aktivitas dari layanan Google lainnya di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Netscape Certificate Comment</translation> +<translation id="6129953537138746214">Spasi</translation> <translation id="6135622770221372891">ID Saluran</translation> <translation id="6136114942382973861">Tutup kotak download</translation> <translation id="6137767437444130246">Sertifikat pengguna</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index dbb9b1d..23fc3e52 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3311,7 +3311,6 @@ <translation id="6082651258230788217">Mostra in barra degli strumenti</translation> <translation id="6086846494333236931">Installata dall'amministratore</translation> <translation id="6087960857463881712">Faccina splendente</translation> -<translation id="6089481419520884864">Pagina Distill</translation> <translation id="6091761513005122595">Condivisione montata correttamente.</translation> <translation id="6093888419484831006">Annullamento aggiornamento...</translation> <translation id="6095984072944024315">–</translation> @@ -3339,6 +3338,7 @@ <translation id="6125479973208104919">Purtroppo devi aggiungere nuovamente il tuo account al dispositivo <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">I dati selezionati sono stati rimossi da Chrome e dai dispositivi sincronizzati. Il tuo Account Google potrebbe avere altre forme di cronologia di navigazione, ad esempio ricerche e attività, di altri servizi Google all'indirizzo <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Commento certificato Netscape</translation> +<translation id="6129953537138746214">Spazio</translation> <translation id="6135622770221372891">ID canali</translation> <translation id="6136114942382973861">Chiudi la barra dei download</translation> <translation id="6137767437444130246">Certificato utente</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index ac59b3e..6fc3d8c 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">הצג בסרגל הכלים</translation> <translation id="6086846494333236931">הותקן על ידי מנהל המערכת שלך</translation> <translation id="6087960857463881712">פרצוף "אדיר!"</translation> -<translation id="6089481419520884864">זקק דף</translation> <translation id="6091761513005122595">התקן הרשת לשיתוף קבצים נטען בהצלחה.</translation> <translation id="6093888419484831006">מבטל עדכון...</translation> <translation id="6095984072944024315">−</translation> @@ -3340,6 +3339,7 @@ <translation id="6125479973208104919">תצטרך להוסיף את החשבון שלך ב-<ph name="DEVICE_TYPE" /> פעם נוספת.</translation> <translation id="6129691635767514872">הנתונים שבחרת הוסרו מ-Chrome ומהמכשירים המסונכרנים. ייתכן שבכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> עדיין יתאפשר לך לגשת לסוגים אחרים של היסטוריית גלישה בחשבון Google, כמו חיפושים ופעילות משירותים אחרים של Google.</translation> <translation id="6129938384427316298">הערה לאישור Netscape</translation> +<translation id="6129953537138746214">רווח</translation> <translation id="6135622770221372891">מזהי ערוץ</translation> <translation id="6136114942382973861">סגירת סרגל ההורדות</translation> <translation id="6137767437444130246">אישור משתמש</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 3b5e4f2..dd069e7 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">ツールバーに表示</translation> <translation id="6086846494333236931">管理者によりインストールされています</translation> <translation id="6087960857463881712">エピック スマイリー</translation> -<translation id="6089481419520884864">ページを抽出</translation> <translation id="6091761513005122595">共有フォルダが正常にマウントされました。</translation> <translation id="6093888419484831006">更新をキャンセルしています...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">アカウントをもう一度この <ph name="DEVICE_TYPE" /> に追加する必要があります。</translation> <translation id="6129691635767514872">選択したデータが Chrome から削除され、同期されたデバイスからも削除されました。他の Google サービスでの検索や操作など、Google アカウントの他の形式の閲覧履歴が <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> に残ることがあります。</translation> <translation id="6129938384427316298">Netscape 証明書コメント</translation> +<translation id="6129953537138746214">Space</translation> <translation id="6135622770221372891">チャンネル ID</translation> <translation id="6136114942382973861">ダウンロード バーを閉じる</translation> <translation id="6137767437444130246">ユーザー証明書</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 6b6c2dcd..70ac6e7 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -3317,7 +3317,6 @@ <translation id="6082651258230788217">ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ ತೋರಿಸು</translation> <translation id="6086846494333236931">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ</translation> <translation id="6087960857463881712">ಅದ್ಭುತ ಮುಖ</translation> -<translation id="6089481419520884864">ಪುಟವನ್ನು ಶೋಧಿಸು</translation> <translation id="6091761513005122595">ಹಂಚಿಕೆ ಯಶಸ್ವಿಯಾಗಿ ಅಳವಡಿಸಲಾಗಿದೆ.</translation> <translation id="6093888419484831006">ಅಪ್ಡೇಟ್ ಅನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="6095984072944024315">−</translation> @@ -3345,6 +3344,7 @@ <translation id="6125479973208104919">ದುರದೃಷ್ಟವಶಾತ್, ನಿಮ್ಮ ಖಾತೆಯನ್ನು ನೀವು ಮತ್ತೆ ಈ <ph name="DEVICE_TYPE" /> ಗೆ ಸೇರಿಸುವ ಅಗತ್ಯವಿದೆ.</translation> <translation id="6129691635767514872">ಆಯ್ಕೆಮಾಡಲಾದ ಡೇಟಾವನ್ನು Chrome ಮತ್ತು ಸಿಂಕ್ ಮಾಡಲ್ಪಟ್ಟ ಸಾಧನಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />ನಲ್ಲಿನ ಇತರ Google ಸೇವೆಗಳಲ್ಲಿ ಹುಡುಕಾಟಗಳು ಮತ್ತು ಚಟುವಟಿಕೆಯಂತಹ ಬ್ರೌಸಿಂಗ್ ಹುಡುಕಾಟಗಳ ಇತರ ಪ್ರಕಾರಗಳನ್ನು ಹೊಂದಿರಬಹುದು.</translation> <translation id="6129938384427316298">Netscape ಪ್ರಮಾಣಪತ್ರ ಕಾಮೆಂಟ್</translation> +<translation id="6129953537138746214">ಸ್ಪೇಸ್</translation> <translation id="6135622770221372891">ಚಾನಲ್ IDಗಳು</translation> <translation id="6136114942382973861">ಡೌನ್ಲೋಡ್ಗಳ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಿ</translation> <translation id="6137767437444130246">ಬಳಕೆದಾರರ ಪ್ರಮಾಣಪತ್ರ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 9f21bd52..a2a97d0 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">툴바에서 보기</translation> <translation id="6086846494333236931">관리자가 설치함</translation> <translation id="6087960857463881712">멋진 얼굴</translation> -<translation id="6089481419520884864">페이지 추출</translation> <translation id="6091761513005122595">공유가 성공적으로 마운트되었습니다.</translation> <translation id="6093888419484831006">업데이트를 취소하는 중...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">이 <ph name="DEVICE_TYPE" />에 계정을 다시 추가해야 합니다.</translation> <translation id="6129691635767514872">선택한 데이터가 Chrome 및 동기화된 기기에서 삭제되었습니다. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />에서 검색이나 기타 Google 서비스에서의 활동 등 내 Google 계정에 있는 다른 형식의 탐색 기록을 확인할 수 있습니다.</translation> <translation id="6129938384427316298">Netscape Certificate Comment</translation> +<translation id="6129953537138746214">공백</translation> <translation id="6135622770221372891">채널 ID</translation> <translation id="6136114942382973861">다운로드바 닫기</translation> <translation id="6137767437444130246">사용자 인증서</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 5e3fea25..f6d2a14 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Rodyti įrankių juostoje</translation> <translation id="6086846494333236931">Įdiegė jūsų administratorius</translation> <translation id="6087960857463881712">Nuostabus veidas</translation> -<translation id="6089481419520884864">„Distill“ puslapis</translation> <translation id="6091761513005122595">Bendrinamas objektas įdėtas sėkmingai.</translation> <translation id="6093888419484831006">Naujinys atšaukiamas...</translation> <translation id="6095984072944024315">–</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Deja, reikės vėl pridėti paskyrą šiame „<ph name="DEVICE_TYPE" />“.</translation> <translation id="6129691635767514872">Pasirinkti duomenys pašalinti iš „Chrome“ ir sinchronizuojamų įrenginių. „Google“ paskyroje galite būti kitų formų naršymo istorijos, pvz., paieškų ir veiklos iš kitų „Google“ paslaugų, kuri pasiekiama adresu <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">„Netscape“ sertifikato komentaras</translation> +<translation id="6129953537138746214">Tarpas</translation> <translation id="6135622770221372891">Kanalų ID</translation> <translation id="6136114942382973861">Uždaryti atsisiuntimų juostą</translation> <translation id="6137767437444130246">Naudotojo sertifikatas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 23095d4..3b39cd46 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Rādīt rīkjoslā</translation> <translation id="6086846494333236931">Instalēja administrators.</translation> <translation id="6087960857463881712">Satriecoša seja</translation> -<translation id="6089481419520884864">Attīrīt lapu</translation> <translation id="6091761513005122595">Kopīgošana veiksmīgi iekļauta.</translation> <translation id="6093888419484831006">Notiek atjaunināšanas atcelšana...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Diemžēl jums būs atkārtoti jāpievieno savs konts šajā <ph name="DEVICE_TYPE" /> ierīcē.</translation> <translation id="6129691635767514872">Atlasītie dati ir noņemti no pārlūka Chrome un sinhronizētajām ierīcēm. Jūsu Google kontam vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> var būt cita veida pārlūkošanas vēstures dati, piemēram, meklēšanas vaicājumi un darbības citos Google pakalpojumos.</translation> <translation id="6129938384427316298">Netscape sertifikāta komentārs</translation> +<translation id="6129953537138746214">Atstarpe</translation> <translation id="6135622770221372891">Kanālu ID</translation> <translation id="6136114942382973861">Aizvērt lejupielāžu joslu</translation> <translation id="6137767437444130246">Lietotāja sertifikāts</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index be91c90..de03026 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -3312,7 +3312,6 @@ <translation id="6082651258230788217">ടൂൾബാറിൽ കാണിക്കുക</translation> <translation id="6086846494333236931">നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ ഇൻസ്റ്റാൾ ചെയ്തു</translation> <translation id="6087960857463881712">മനോഹരമായ മുഖം</translation> -<translation id="6089481419520884864">പേജ് ഡിസ്റ്റിൽ ചെയ്യുക</translation> <translation id="6091761513005122595">പങ്കിടൽ വിജയകരമായി മൗണ്ട് ചെയ്തു.</translation> <translation id="6093888419484831006">അപ്ഡേറ്റ് ചെയ്തത് റദ്ദാക്കുന്നു...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">നിർഭാഗ്യവശാൽ ഈ <ph name="DEVICE_TYPE" /> ഉപകരണത്തിൽ വീണ്ടും നിങ്ങളുടെ അക്കൗണ്ട് ചേർക്കേണ്ടതുണ്ട്.</translation> <translation id="6129691635767514872">തിരഞ്ഞെടുത്ത ഡാറ്റയെ Chrome-ൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കം ചെയ്തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന്, <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> എന്നതിൽ, മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകളും ആക്റ്റിവിറ്റിയും എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation> <translation id="6129938384427316298">നെറ്റ്സ്കേപ്പ് സര്ട്ടിഫിക്കറ്റ് അഭിപ്രായം</translation> +<translation id="6129953537138746214">സ്പെയ്സ്</translation> <translation id="6135622770221372891">ചാനൽ ID-കൾ</translation> <translation id="6136114942382973861">ഡൗണ്ലോഡ് വിവരങ്ങളുടെ ബാര് അടയ്ക്കുക</translation> <translation id="6137767437444130246">ഉപയോക്തൃ സർട്ടിഫിക്കറ്റ്</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 534734b1..44e9149e 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1525,7 +1525,7 @@ <translation id="3319048459796106952">नवीन &गुप्त विंडो</translation> <translation id="3323521181261657960">बोनस! तुम्हाला आणखी स्क्रीन वेळ मिळाला</translation> <translation id="3325910708063135066">Mac सिस्टम प्राधान्ये मधील कॅमेरा आणि मायक्रोफोन बंद आहे</translation> -<translation id="3330615614570718993">या डिव्हाइस वर प्लग-इन VM सुरू करण्यासाठी कृपया तुमच्या ॲडमिनशी संपर्क साधा.</translation> +<translation id="3330615614570718993">या डिव्हाइसवर प्लग-इन VM सुरू करण्यासाठी कृपया तुमच्या ॲडमिनशी संपर्क साधा.</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">ॲप माहिती</translation> <translation id="3334632933872291866"><ph name="WINDOW_TITLE" /> - चित्रात-चित्र मोडमध्ये व्हिडिओ प्ले करत आहे</translation> @@ -1728,7 +1728,7 @@ <translation id="3629631988386925734">Smart Lock सुरू करण्यासाठी तुमचा पासवर्ड एंटर करा. पुढील वेळेस तुमचा फोन तुमचे <ph name="DEVICE_TYPE" /> अनलॉक करेल. तुम्ही सेटिंग्जमध्ये Smart Lock बंद करू शकता.</translation> <translation id="3630132874740063857">तुमचा फोन</translation> <translation id="3630995161997703415">कधीही वापरण्यासाठी ही साइट तुमच्या शेल्फवर जोडा</translation> -<translation id="3635256809897331115">प्लग-इन VM वापरण्यासाठी लाँच करा क्लिक किंवा टॅप करा. भविष्यात, तुम्ही लाँचरमध्ये आयकन निवडून प्लग-इन VM सुरू करू शकता.</translation> +<translation id="3635256809897331115">प्लग-इन VM वापरण्यासाठी लाँच करा वर क्लिक किंवा टॅप करा. भविष्यात, तुम्ही लाँचरमध्ये आयकन निवडून प्लग-इन VM सुरू करू शकता.</translation> <translation id="3636096452488277381">कसे आहात, <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> शिल्लक</translation> <translation id="3637682276779847508">तुम्ही योग्य पिन अनलॉक की एंटर न केल्यास तुमचे सिम कार्ड कायमचे अक्षम केले जाईल.</translation> @@ -2200,7 +2200,7 @@ <translation id="4340515029017875942">"<ph name="EXTENSION_NAME" />" अॅपसह <ph name="ORIGIN" /> संवाद प्रस्थापित करू इच्छितो</translation> <translation id="4342311272543222243">अरेरे, TPM एरर.</translation> <translation id="4345587454538109430">कॉन्फिगर करा...</translation> -<translation id="4345732373643853732">सर्व्हरला वापरकर्तानाव माहीत नाही</translation> +<translation id="4345732373643853732">सर्व्हरला वापर कर्ता नाव माहीत नाही</translation> <translation id="4348766275249686434">एरर संकलित करा</translation> <translation id="4350019051035968019">एका भिन्न डोमेनद्वारे व्यवस्थापनासाठी डिव्हाइस चिन्हांकित केले असल्यामुळे तुमचे खाते ज्या मालकीचे आहे त्या डोमेवर या डिव्हाइसची नोंदणी केली जाऊ शकत नाही.</translation> <translation id="4354344420232759511">तुम्ही भेट दिलेल्या साइट येथे दिसतील</translation> @@ -2334,7 +2334,7 @@ <translation id="4563880231729913339">तिसरे बोट</translation> <translation id="4565377596337484307">पासवर्ड लपवा</translation> <translation id="4567772783389002344">शब्द जोडा</translation> -<translation id="4568025708905928793">सिक्युरिटी की साठी विनंती केली आहे</translation> +<translation id="4568025708905928793">सिक्युरिटी कीसाठी विनंती केली आहे</translation> <translation id="4568213207643490790">क्षमस्व, Google खात्यांना या डिव्हाइसवर अनुमती नाही.</translation> <translation id="4569747168316751899">निष्क्रिय असताना</translation> <translation id="4570387585180509432">पत्ते, फोन नंबर आणि अधिक</translation> @@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">टूलबारमध्ये दर्शवा</translation> <translation id="6086846494333236931">तुमच्या अॅडमिनिस्ट्रेटरद्वारे इंस्टॉल केले</translation> <translation id="6087960857463881712">छान चेहरा</translation> -<translation id="6089481419520884864">Distill पृष्ठ</translation> <translation id="6091761513005122595">शेअर यशस्वीरीत्या माउंट केले आहे.</translation> <translation id="6093888419484831006">अपडेट रद्द करत आहे...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">दुर्दैवाने, तुम्हाला या <ph name="DEVICE_TYPE" /> वर तुमचे खाते पुन्हा जोडावे लागेल.</translation> <translation id="6129691635767514872">निवडलेला डेटा Chrome आणि सिंक केलेल्या डिव्हाइसमधून काढला गेला आहे. तुमच्या Google खात्यामध्ये Google च्या इतर सेवांमधील शोध आणि अॅक्टिव्हिटी यासारख्या ब्राउझिंग इतिहासाची इतर स्वरूपे <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> वर असू शकतात.</translation> <translation id="6129938384427316298">Netscape सर्टिफिकेट टिप्पणी</translation> +<translation id="6129953537138746214">जागा</translation> <translation id="6135622770221372891">चॅनेल आय़डी</translation> <translation id="6136114942382973861">डाउनलोड बार बंद करा</translation> <translation id="6137767437444130246">वापरकर्ता सर्टिफिकेट</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 6dea19b7..9453061 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Tunjukkan dalam bar alat</translation> <translation id="6086846494333236931">Dipasang oleh pentadbir anda</translation> <translation id="6087960857463881712">Wajah hebat</translation> -<translation id="6089481419520884864">Menyuling halaman</translation> <translation id="6091761513005122595">Perkongsian berjaya dilekapkan.</translation> <translation id="6093888419484831006">Membatalkan kemas kini...</translation> <translation id="6095984072944024315">−</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Malangnya, anda perlu menambahkan akaun pada <ph name="DEVICE_TYPE" /> ini sekali lagi.</translation> <translation id="6129691635767514872">Data yang dipilih telah dialih keluar daripada Chrome dan peranti yang disegerakkan. Akaun Google anda mungkin mempunyai sejarah penyemakan imbas dalam bentuk lain seperti carian dan aktiviti daripada perkhidmatan Google yang lain di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Komen Sijil Netscape</translation> +<translation id="6129953537138746214">Ruang</translation> <translation id="6135622770221372891">ID Saluran</translation> <translation id="6136114942382973861">Tutup bar muat turun</translation> <translation id="6137767437444130246">Sijil pengguna</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index dabfc14..e3e2fda1 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">In werkbalk weergeven</translation> <translation id="6086846494333236931">Geïnstalleerd door je beheerder</translation> <translation id="6087960857463881712">Geweldig gezicht</translation> -<translation id="6089481419520884864">Pagina omzetten</translation> <translation id="6091761513005122595">Fileshare geactiveerd.</translation> <translation id="6093888419484831006">Update annuleren...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Je moet je account opnieuw toevoegen aan deze <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">De geselecteerde gegevens zijn verwijderd uit Chrome en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Opmerking van Netscape-certificaat</translation> +<translation id="6129953537138746214">Spatie</translation> <translation id="6135622770221372891">Kanaal-ID's</translation> <translation id="6136114942382973861">Downloadbalk sluiten</translation> <translation id="6137767437444130246">Gebruikerscertificaat</translation> @@ -3874,7 +3874,7 @@ <translation id="6977381486153291903">Firmwarerevisie</translation> <translation id="6978121630131642226">Zoekmachines</translation> <translation id="6979440798594660689">Dempen (standaard)</translation> -<translation id="6979737339423435258">Altijd</translation> +<translation id="6979737339423435258">Alles</translation> <translation id="6980462514016882061">Google kan je browsegeschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren</translation> <translation id="6981982820502123353">Toegankelijkheid</translation> <translation id="6983783921975806247">Geregistreerde OID</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index b4a92839..0eb8a00 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3308,7 +3308,6 @@ <translation id="6082651258230788217">Vis i verktøyraden</translation> <translation id="6086846494333236931">Installert av administratoren din</translation> <translation id="6087960857463881712">Fantastisk-fjes</translation> -<translation id="6089481419520884864">Destiller siden</translation> <translation id="6091761513005122595">Delingen er aktivert.</translation> <translation id="6093888419484831006">Avbryter oppdatering …</translation> <translation id="6095984072944024315">−</translation> @@ -3336,6 +3335,7 @@ <translation id="6125479973208104919">Du må dessverre legge til kontoen din på denne <ph name="DEVICE_TYPE" />-enheten på nytt.</translation> <translation id="6129691635767514872">De valgte dataene er fjernet fra Chrome og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettleserlogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Kommentar til Netscape-sertifikat</translation> +<translation id="6129953537138746214">Mellomrom</translation> <translation id="6135622770221372891">ID-er for kanal</translation> <translation id="6136114942382973861">Lukk nedlastingsraden</translation> <translation id="6137767437444130246">Brukersertifikat</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 1527367..406d4fc 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Pokaż na pasku narzędzi</translation> <translation id="6086846494333236931">Zainstalowane przez administratora</translation> <translation id="6087960857463881712">Niesamowita twarz</translation> -<translation id="6089481419520884864">Zbadaj stronę</translation> <translation id="6091761513005122595">Udział został podłączony.</translation> <translation id="6093888419484831006">Anulowanie aktualizacji...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Musisz jeszcze raz dodać swoje konto na tym urządzeniu <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Wybrane dane zostały usunięte z Chrome i synchronizowanych urządzeń. Inne rodzaje historii przeglądania, takie jak wyszukiwania i aktywność w innych usługach Google, mogą być nadal dostępne na Twoim koncie Google na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Komentarz do certyfikatu firmy Netscape</translation> +<translation id="6129953537138746214">Spacja</translation> <translation id="6135622770221372891">Identyfikatory kanałów</translation> <translation id="6136114942382973861">Zamknij pasek pobranych plików</translation> <translation id="6137767437444130246">Certyfikat użytkownika</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 73f6e1c6..6b04794 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -151,7 +151,7 @@ <translation id="1206407435587370571">Explorar o Chromebook</translation> <translation id="1209796539517632982">Servidores de nome automáticos</translation> <translation id="1211364473545090084">Use a Web sem salvar seu histórico de navegação com uma janela anônima</translation> -<translation id="1211769675100312947">Atalhos selecionados para você</translation> +<translation id="1211769675100312947">Atalhos selecionados por você</translation> <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> impressões digitais configuradas</translation> <translation id="1215411991991485844">Novo aplicativo de fundo adicionado</translation> <translation id="1217483152325416304">Seus dados locais serão excluídos em breve</translation> @@ -1232,7 +1232,7 @@ <translation id="284975061945174219">Falha ao limpar</translation> <translation id="2849936225196189499">Crítico</translation> <translation id="2850541429955027218">Adicionar tema</translation> -<translation id="2858138569776157458">Mais visitados</translation> +<translation id="2858138569776157458">Sites famosos</translation> <translation id="2859806420264540918">Neste site, há exibição de anúncios invasivos ou enganosos</translation> <translation id="2861301611394761800">A atualização do sistema foi concluída. Reinicie o sistema.</translation> <translation id="2861941300086904918">Gerenciador de segurança do Cliente nativo</translation> @@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Mostrar na barra de ferramentas</translation> <translation id="6086846494333236931">Instalada pelo administrador</translation> <translation id="6087960857463881712">Rosto maravilhado</translation> -<translation id="6089481419520884864">Página de conversão</translation> <translation id="6091761513005122595">Compartilhamento ativado.</translation> <translation id="6093888419484831006">Cancelando atualização...</translation> <translation id="6095984072944024315">−</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Adicione sua conta a esse <ph name="DEVICE_TYPE" /> novamente.</translation> <translation id="6129691635767514872">Os dados selecionados foram removidos do Chrome e dos dispositivos sincronizados. É possível que sua Conta do Google tenha outras formas de histórico de navegação, como pesquisas e atividades de outros serviços do Google em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Comentário do certificado do Netscape</translation> +<translation id="6129953537138746214">Espaço</translation> <translation id="6135622770221372891">IDs de canais</translation> <translation id="6136114942382973861">Fechar barra de downloads</translation> <translation id="6137767437444130246">Certificado do usuário</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index d57194e..c3bdb2c 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Mostrar na barra de ferramentas</translation> <translation id="6086846494333236931">Instalada pelo gestor</translation> <translation id="6087960857463881712">Cara de fantástico</translation> -<translation id="6089481419520884864">Página de destilação</translation> <translation id="6091761513005122595">A partilha foi montada com êxito.</translation> <translation id="6093888419484831006">A cancelar a atualização...</translation> <translation id="6095984072944024315">−</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Infelizmente, tem de adicionar novamente a sua conta a este <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Os dados selecionados foram removidos do Chrome e dos dispositivos sincronizados. A sua Conta Google pode ter outras formas do histórico de navegação, tais como as pesquisas e a atividade de outros serviços Google em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Comentário do certificado Netscape</translation> +<translation id="6129953537138746214">Espaço</translation> <translation id="6135622770221372891">IDs do canal</translation> <translation id="6136114942382973861">Fechar barra de transferências</translation> <translation id="6137767437444130246">Certificado do utilizador</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 0c51653..e757a07f 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Afișează în bara de instrumente</translation> <translation id="6086846494333236931">Instalată de administrator</translation> <translation id="6087960857463881712">Față extraordinară</translation> -<translation id="6089481419520884864">Faceți conversia paginii</translation> <translation id="6091761513005122595">Dispozitivul de stocare în rețea a fost montat.</translation> <translation id="6093888419484831006">Se anulează actualizarea...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Din păcate, va trebui să îți adaugi din nou contul pe acest dispozitiv <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Datele selectate au fost eliminate din Chrome și de pe dispozitivele sincronizate. Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi căutările și activitatea din alte servicii Google, la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Comentariu certificat Netscape</translation> +<translation id="6129953537138746214">Spațiu</translation> <translation id="6135622770221372891">Coduri de canal</translation> <translation id="6136114942382973861">Închide bara de descărcări</translation> <translation id="6137767437444130246">Certificat de utilizator</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index d2b28221..dc20067 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Добавить на панель инструментов</translation> <translation id="6086846494333236931">Установлено администратором</translation> <translation id="6087960857463881712">Модник</translation> -<translation id="6089481419520884864">Сжать страницу</translation> <translation id="6091761513005122595">Ресурс подключен.</translation> <translation id="6093888419484831006">Отмена обновления...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Необходимо заново добавить аккаунт на <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Выбранные данные удалены из Chrome и с синхронизированных устройств. История также может храниться в вашем аккаунте Google, например в виде поисковых запросов и сведений из сервисов Google. Их можно найти на сайте <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Комментарий к сертификату Netscape</translation> +<translation id="6129953537138746214">Пробел</translation> <translation id="6135622770221372891">Идентификаторы каналов</translation> <translation id="6136114942382973861">Закрыть панель загрузок</translation> <translation id="6137767437444130246">Сертификат пользователя</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index cabe4db..6fdf363 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">Zobraziť na paneli s nástrojmi</translation> <translation id="6086846494333236931">Nainštalované vaším správcom</translation> <translation id="6087960857463881712">Paráda</translation> -<translation id="6089481419520884864">Destilovať stránku</translation> <translation id="6091761513005122595">Zdieľané úložisko sa úspešne pripojilo.</translation> <translation id="6093888419484831006">Zrušenie aktualizácie...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">Do tohto zariadenia <ph name="DEVICE_TYPE" /> si žiaľ budete musieť znova pridať účet.</translation> <translation id="6129691635767514872">Vybrané dáta boli odstránené z Chromu a synchronizovaných zariadení. Váš účet Google môže mať ďalšie formy histórie prehliadania na adrese <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> (napríklad vyhľadávania a aktivity v iných službách Googlu).</translation> <translation id="6129938384427316298">Netscape – komentár certifikátu</translation> +<translation id="6129953537138746214">Medzera</translation> <translation id="6135622770221372891">ID kanála</translation> <translation id="6136114942382973861">Zatvoriť panel so stiahnutými súbormi</translation> <translation id="6137767437444130246">Certifikát používateľa</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 00d91650..cc337a09 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3317,7 +3317,6 @@ <translation id="6082651258230788217">Pokaži v orodni vrstici</translation> <translation id="6086846494333236931">Namestil skrbnik</translation> <translation id="6087960857463881712">Navdušen obraz</translation> -<translation id="6089481419520884864">Ustvari povzetek strani</translation> <translation id="6091761513005122595">Datotečno sredstvo v skupni rabi je bilo uspešno vpeto.</translation> <translation id="6093888419484831006">Preklic posodabljanja ...</translation> <translation id="6095984072944024315">−</translation> @@ -3345,6 +3344,7 @@ <translation id="6125479973208104919">V napravi <ph name="DEVICE_TYPE" /> boste morali znova dodati račun.</translation> <translation id="6129691635767514872">Izbrani podatki so bili odstranjeni iz Chroma in sinhroniziranih naprav. V Google Računu so morda druge vrste zgodovine brskanja, kot so iskanja in dejavnosti iz drugih Googlovih storitev, na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Pripomba o Netscapeovem potrdilu</translation> +<translation id="6129953537138746214">Presledek</translation> <translation id="6135622770221372891">ID-ji kanalov</translation> <translation id="6136114942382973861">Zapri vrstico za prenose</translation> <translation id="6137767437444130246">Uporabniško potrdilo</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 8b17d4f..886bcc3 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -151,7 +151,7 @@ <translation id="1206407435587370571">Истражите Chromebook</translation> <translation id="1209796539517632982">Аутоматски сервери назива</translation> <translation id="1211364473545090084">Прегледајте веб без чувања историје прегледања у прозору без архивирања</translation> -<translation id="1211769675100312947">Ви припремате пречице</translation> +<translation id="1211769675100312947">Ви одређујете пречице</translation> <translation id="1213037489357051291">Отисци прстију (<ph name="NUM_FINGERPRINTS" />) су подешени</translation> <translation id="1215411991991485844">Нова апликација у позадини је додата</translation> <translation id="1217483152325416304">Локални подаци се ускоро бришу</translation> @@ -1600,7 +1600,7 @@ <translation id="3453612417627951340">Потребно је овлашћење</translation> <translation id="3454157711543303649">Активација је довршена</translation> <translation id="345693547134384690">Отвори &слику на новој картици</translation> -<translation id="3457500881955698515">Предузеће или организација тражи ажурирање за овај уређај одмах</translation> +<translation id="3457500881955698515">Ваше предузеће или организација захтева ажурирање за овај уређај одмах</translation> <translation id="3459509316159669723">Штампање</translation> <translation id="3459697287128633276">Да бисте омогућили налогу да приступа Google Play продавници, потврдите идентитет помоћу добављача идентитета.</translation> <translation id="3459774175445953971">Последњи пут измењено:</translation> @@ -2091,7 +2091,7 @@ <translation id="4130750466177569591">Прихватам</translation> <translation id="413121957363593859">Компоненте</translation> <translation id="4131410914670010031">Црно-бело</translation> -<translation id="4136203100490971508">Ноћно светло се аутоматски укључује када сунце изађе</translation> +<translation id="4136203100490971508">Ноћно светло се аутоматски искључује када сунце изађе</translation> <translation id="4138267921960073861">Приказуј корисничка имена и слике на екрану за пријављивање</translation> <translation id="4144218403971135344">Пронађите видео садржај бољег квалитета и продужите трајање батерије. Видео ће се пуштати само на екрану који подржава Cast.</translation> <translation id="4145922204387553806">Дозволите Помоћнику да вам приказује информације на основу онога што је на екрану</translation> @@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">Прикажи на траци с алаткама</translation> <translation id="6086846494333236931">Инсталирао је администратор</translation> <translation id="6087960857463881712">Задовољно лице</translation> -<translation id="6089481419520884864">Пречишћавање странице</translation> <translation id="6091761513005122595">Дељена датотека је учитана.</translation> <translation id="6093888419484831006">Отказивање ажурирања...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">Нажалост, треба поново да додате налог на овај <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Изабрани подаци су уклоњени из Chrome-а и са синхронизованих уређаја. Google налог можда има друге облике историје прегледања, попут претрага и активности на другим Google услугама на <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Коментар Netscape сертификата</translation> +<translation id="6129953537138746214">Размак</translation> <translation id="6135622770221372891">ИД-ови канала</translation> <translation id="6136114942382973861">Затвори траку са преузимањима</translation> <translation id="6137767437444130246">Кориснички сертификат</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index f229d43c..86476d721 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -3314,7 +3314,6 @@ <translation id="6082651258230788217">Visa i verktygsfältet</translation> <translation id="6086846494333236931">Har installerats av administratören</translation> <translation id="6087960857463881712">Entusiastiskt ansikte</translation> -<translation id="6089481419520884864">Skapa Distiller-sida</translation> <translation id="6091761513005122595">Den delade resursen har monterats.</translation> <translation id="6093888419484831006">Avbryter uppdatering ...</translation> <translation id="6095984072944024315">−</translation> @@ -3342,6 +3341,7 @@ <translation id="6125479973208104919">Du måste tyvärr lägga till ditt konto på <ph name="DEVICE_TYPE" /> igen.</translation> <translation id="6129691635767514872">Den data som markerades har tagits bort från Chrome och från synkroniserade enheter. Det kan finnas webbhistorik av annat slag i Google-kontot på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />, t.ex. sökningar och aktivitet på andra tjänster från Google.</translation> <translation id="6129938384427316298">Kommentar för Netscape-certifikat</translation> +<translation id="6129953537138746214">Blanksteg</translation> <translation id="6135622770221372891">Kanal-ID:n</translation> <translation id="6136114942382973861">Stäng nedladdningsfältet</translation> <translation id="6137767437444130246">Användarcertifikat</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index c9d4930..d0d57168 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3306,7 +3306,6 @@ <translation id="6082651258230788217">Onyesha katika upau wa vidhibiti</translation> <translation id="6086846494333236931">Kiendelezi kimesakinishwa na msimamizi wako</translation> <translation id="6087960857463881712">Uso wa kuvutia</translation> -<translation id="6089481419520884864">Tenganisha ukurasa</translation> <translation id="6091761513005122595">Imepachika faili ya kushiriki.</translation> <translation id="6093888419484831006">Inaghairi usasishaji...</translation> <translation id="6095984072944024315">−</translation> @@ -3334,6 +3333,7 @@ <translation id="6125479973208104919">Kwa bahati mbaya, utahitaji kuongeza akaunti yako kwenye kifaa hiki cha <ph name="DEVICE_TYPE" /> tena.</translation> <translation id="6129691635767514872">Data uliyochagua imeondolewa kwenye Chrome na kwenye vifaa vilivyosawazishwa. Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari kama vile utafutaji na shughuli kutoka huduma nyingine za Google katika <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Kidokezo cha Cheti cha Netscape</translation> +<translation id="6129953537138746214">Nafasi</translation> <translation id="6135622770221372891">Vitambulisho vya Kituo</translation> <translation id="6136114942382973861">Funga upau wa vipakuliwa</translation> <translation id="6137767437444130246">Cheti cha mtumiaji</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 692a791..dfd9e48 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -3296,7 +3296,6 @@ <translation id="6082651258230788217">கருவிப்பட்டியில் காட்டு</translation> <translation id="6086846494333236931">உங்கள் நிர்வாகி நிறுவினார்</translation> <translation id="6087960857463881712">அழகான முகம்</translation> -<translation id="6089481419520884864">பக்கத்தைப் பிரி</translation> <translation id="6091761513005122595">பகிர்வு ஏற்றப்பட்டது.</translation> <translation id="6093888419484831006">புதுப்பிப்பை ரத்துசெய்கிறது...</translation> <translation id="6095984072944024315">−</translation> @@ -3323,6 +3322,7 @@ <translation id="6125479973208104919"><ph name="DEVICE_TYPE" /> இல் உங்கள் கணக்கை மீண்டும் சேர்க்க வேண்டும்.</translation> <translation id="6129691635767514872">தேர்ந்தெடுத்த தரவு, Chrome மற்றும் ஒத்திசைக்கப்பட்ட சாதனங்களிலிருந்து அகற்றப்பட்டது. உங்கள் Google கணக்கு <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> எனும் தளத்தில் பிற Google சேவைகளிலிருந்து தேடல்கள், செயல்பாடு போன்ற உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கலாம்.</translation> <translation id="6129938384427316298">Netscape சான்றிதழ் கருத்து</translation> +<translation id="6129953537138746214">இடைவெளி</translation> <translation id="6135622770221372891">சேனல் ஐடிகள்</translation> <translation id="6136114942382973861">பதிவிறக்கங்கள் பட்டியை மூடு</translation> <translation id="6137767437444130246">பயனர் சான்றிதழ்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 3dc9a17e..26ed84bc 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1603,7 +1603,7 @@ <translation id="3453612417627951340">ప్రామాణీకరణ అవసరం</translation> <translation id="3454157711543303649">సక్రియం చేయడం పూర్తయింది</translation> <translation id="345693547134384690">కొత్త టాబ్లో &చిత్రాన్ని తెరువు</translation> -<translation id="3457500881955698515">మీ కంపెనీ లేదా సంస్థ కోసం ఈ పరికరానికి తక్షణం ఒక అప్డేట్ను జోడించడం అవసరం</translation> +<translation id="3457500881955698515">మీ కంపెనీ లేదా సంస్థ నియమాల ప్రకారం, ఈ పరికరాన్ని తక్షణం అప్డేట్ చేయాలి</translation> <translation id="3459509316159669723">ముద్రణ</translation> <translation id="3459697287128633276">మీ ఖాతాలో Google Play స్టోర్ యాక్సెస్ను ఆరంభించాలంటే, దయచేసి మీ గుర్తింపు ప్రదాతతో ప్రామాణీకరించండి.</translation> <translation id="3459774175445953971">చివరగా సవరించబడింది:</translation> @@ -1736,7 +1736,7 @@ <translation id="3645372836428131288">వేలిముద్రలోని వేరే భాగాన్ని క్యాప్చర్ చేయడం కోసం కొద్దిగా కదిలించండి.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> గుర్తించబడింది</translation> <translation id="3649138363871392317">ఫోటో క్యాప్చర్ చేయబడింది</translation> -<translation id="3649505501900178324">అప్డేట్ ఇంకా పూర్తికాలేదు</translation> +<translation id="3649505501900178324">అప్డేట్ పెండింగ్లో ఉంది</translation> <translation id="3650845953328929506">లాగ్ అప్లోడ్ పెండింగ్లో ఉంది.</translation> <translation id="3650952250015018111">యాక్సెస్ చేయడానికి "<ph name="APP_NAME" />"ని అనుమతించండి:</translation> <translation id="3651488188562686558">Wi-Fi నుండి డిస్కనెక్ట్ చేయి</translation> @@ -2624,7 +2624,7 @@ <translation id="5029568752722684782">కాపీని తీసివేయి</translation> <translation id="5030338702439866405">వీరిచే జారీచేయబడింది</translation> <translation id="5033266061063942743">జ్యామితీయ ఆకారాలు</translation> -<translation id="5033619151015094114">మీ కంపెనీ లేదా సంస్థ కోసం ఈ పరికరానికి తప్పనిసరిగా ఒక అప్డేట్ను జోడించాలి</translation> +<translation id="5033619151015094114">మీ కంపెనీ లేదా సంస్థ నియమాల ప్రకారం, ఈ పరికరాన్ని అప్డేట్ చేయాలి.</translation> <translation id="503498442187459473"><ph name="HOST" /> మీ కెమెరాను మరియు మైక్రోఫోన్ను ఉపయోగించాలనుకుంటోంది</translation> <translation id="5036662165765606524">బహుళ ఫైల్లను ఆటోమేటిక్గా డౌన్లోడ్ చేయడానికి ఏ సైట్నూ అనుమతించవద్దు</translation> <translation id="5037676449506322593">అన్నీ ఎంచుకోండి</translation> @@ -3314,7 +3314,6 @@ <translation id="6082651258230788217">సాధనపట్టీలో చూపండి</translation> <translation id="6086846494333236931">మీ నిర్వాహకుడు ఇన్స్టాల్ చేశారు</translation> <translation id="6087960857463881712">అద్భుతమైన ముఖం</translation> -<translation id="6089481419520884864">పేజీ డిస్టిల్ చేయి</translation> <translation id="6091761513005122595">షేర్ విజయవంతంగా మౌంట్ చేయబడింది.</translation> <translation id="6093888419484831006">అప్డేట్ రద్దు చేయడం...</translation> <translation id="6095984072944024315">−</translation> @@ -3342,6 +3341,7 @@ <translation id="6125479973208104919">దురదృష్టవశాత్తూ, మీరు మీ ఖాతాను ఈ <ph name="DEVICE_TYPE" />కి మళ్లీ జోడించాలి.</translation> <translation id="6129691635767514872">ఎంచుకోబడిన డేటా- Chromeతో పాటు సమకాలీకరించిన పరికరాల నుండి తీసివేయబడింది. మీ Google ఖాతా <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />లో ఇతర Google సేవల నుండి శోధనలు, కార్యకలాపాలు వంటి ఇతర రూపాల బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation> <translation id="6129938384427316298">Netscape సర్టిఫికెట్ వ్యాఖ్య</translation> +<translation id="6129953537138746214">ఖాళీ</translation> <translation id="6135622770221372891">ఛానెల్ IDలు</translation> <translation id="6136114942382973861">డౌన్లోడ్ల బార్ను మూసివేయండి</translation> <translation id="6137767437444130246">వినియోగదారు సర్టిఫికెట్</translation> @@ -4469,7 +4469,7 @@ <translation id="7849264908733290972">&చిత్రాన్ని కొత్త టాబ్లో తెరువు</translation> <translation id="784934925303690534">సమయ పరిధి</translation> <translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />ఈ పరికరంలో పర్యవేక్షణను సెటప్ చేయడం పూర్తి చేయడానికి, మీరు తప్పనిసరిగా <ph name="USER_NAME" /> ఖాతా నుండి సైన్ అవుట్ చేయాల్సి ఉంటుంది. <ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />మీరు మీ సొంత పరికరంలో తల్లిదండ్రుల కోసం Family Linkను ఇన్స్టాల్ చేసుకోవడం ద్వారా మీ చిన్నారి ఖాతాకు తల్లిదండ్రుల నియంత్రణలను మీరు నిర్వహించవచ్చు.<ph name="END_PARAGRAPH2" /></translation> + <ph name="BEGIN_PARAGRAPH2" />మీ సొంత పరికరంలో తల్లిదండ్రుల కోసం Family Linkను ఇన్స్టాల్ చేసుకోవడం ద్వారా మీ చిన్నారి ఖాతాకు సంబంధించిన తల్లిదండ్రుల నియంత్రణలను నిర్వహించవచ్చు.<ph name="END_PARAGRAPH2" /></translation> <translation id="7851457902707056880">సైన్-ఇన్ అనేది, యజమాని ఖాతాకు మాత్రమే పరిమితం చేయబడింది. దయచేసి రీబూట్ చేసి యజమాని ఖాతాతో సైన్ ఇన్ చేయండి. మెషీన్ 30 సెకన్లలో ఆటోమేటిక్గా రీబూట్ అవుతుంది.</translation> <translation id="7851716364080026749">ఎల్లప్పుడూ కెమెరా మరియు మైక్రోఫోన్ యాక్సెస్ను బ్లాక్ చేయి</translation> <translation id="7853747251428735">మరిన్ని సాధనా&లు</translation> @@ -4741,7 +4741,7 @@ <translation id="8253198102038551905">నెట్వర్క్ లక్షణాలను పొందడానికి '+' క్లిక్ చేయండి</translation> <translation id="825483282309623688">మీ డేటాను పునరుద్ధరించడానికి, ఇంటర్నెట్ కనెక్షన్ ఉండాలి.</translation> <translation id="8254954272268479918">Linux (బీటా)ను షట్ డౌన్ చేయండి</translation> -<translation id="8255451560461371599">నేపథ్యం ఏమీ వద్దు</translation> +<translation id="8255451560461371599">నేపథ్య చిత్రం ఏదీ వద్దు</translation> <translation id="8256319818471787266">స్పార్కీ</translation> <translation id="8257950718085972371">కెమెరా యాక్సెస్ను బ్లాక్ చేయడాన్ని కొనసాగించు</translation> <translation id="8259239505248583312">ప్రారంభించు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index a752745..3e9eb6f9 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">แสดงในแถบเครื่องมือ</translation> <translation id="6086846494333236931">ติดตั้งโดยผู้ดูแลระบบ</translation> <translation id="6087960857463881712">ใบหน้าเจ๋ง</translation> -<translation id="6089481419520884864">สกัดหน้า</translation> <translation id="6091761513005122595">ต่อเชื่อมพื้นที่แชร์สำเร็จแล้ว</translation> <translation id="6093888419484831006">กำลังยกเลิกการอัปเดต…</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">ขออภัย คุณจะต้องเพิ่มบัญชีของคุณลงใน <ph name="DEVICE_TYPE" /> นี้อีกครั้ง</translation> <translation id="6129691635767514872">นำข้อมูลที่เลือกออกจาก Chrome และอุปกรณ์ที่ซิงค์แล้ว บัญชี Google ของคุณอาจมีประวัติการท่องเว็บในรูปแบบอื่น เช่น การค้นหาและกิจกรรมจากบริการอื่นๆ ของ Google ที่ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> <translation id="6129938384427316298">ความคิดเห็นเกี่ยวกับใบรับรองของ Netscape</translation> +<translation id="6129953537138746214">ช่องว่าง</translation> <translation id="6135622770221372891">รหัสช่อง</translation> <translation id="6136114942382973861">ปิดแถบดาวน์โหลด</translation> <translation id="6137767437444130246">ใบรับรองของผู้ใช้</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 502ce862..3dd1e75 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -3316,7 +3316,6 @@ <translation id="6082651258230788217">Araç çubuğunda göster</translation> <translation id="6086846494333236931">Yöneticiniz tarafından yüklendi</translation> <translation id="6087960857463881712">Çok beğenen</translation> -<translation id="6089481419520884864">Sayfayı ayrıştır</translation> <translation id="6091761513005122595">Paylaşım başarıyla eklendi.</translation> <translation id="6093888419484831006">Güncelleme iptal ediliyor...</translation> <translation id="6095984072944024315">−</translation> @@ -3344,6 +3343,7 @@ <translation id="6125479973208104919">Ne yazık ki hesabınızı bu <ph name="DEVICE_TYPE" /> cihaza tekrar eklemeniz gerekecek.</translation> <translation id="6129691635767514872">Seçilen veriler Chrome'dan ve senkronize edilen cihazlardan kaldırıldı. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> adresinde, diğer Google hizmetlerinden yapılan aramalar ve etkinlikler gibi Google Hesabınızla ilişkili başka biçimlerde tarama geçmişi bulunabilir.</translation> <translation id="6129938384427316298">Netscape Sertifikası Yorumu</translation> +<translation id="6129953537138746214">Boşluk</translation> <translation id="6135622770221372891">Kanal Kimlikleri</translation> <translation id="6136114942382973861">İndirme çubuğunu kapat</translation> <translation id="6137767437444130246">Kullanıcı sertifikası</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 8919f52..b3490298 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Показати на панелі інструментів</translation> <translation id="6086846494333236931">Установив адміністратор</translation> <translation id="6087960857463881712">Гарне обличчя</translation> -<translation id="6089481419520884864">Сторінка перетворення</translation> <translation id="6091761513005122595">Спільний доступ надано.</translation> <translation id="6093888419484831006">Скасування оновлення...</translation> <translation id="6095984072944024315">–</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">На жаль, потрібно ще раз додати обліковий запис на пристрої <ph name="DEVICE_TYPE" />.</translation> <translation id="6129691635767514872">Вибрані дані видалено з Chrome і синхронізованих пристроїв. Історія веб-перегляду, а також ваші дії в інших сервісах Google можуть також зберігатися у вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Коментар сертифіката Netscape</translation> +<translation id="6129953537138746214">Пробіл</translation> <translation id="6135622770221372891">Ідентифікатори каналу</translation> <translation id="6136114942382973861">Закрити панель завантажень</translation> <translation id="6137767437444130246">Сертифікат користувача</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 0a533b4..73795b4 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -319,7 +319,7 @@ <translation id="1478340334823509079">Chi tiết: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Cài đặt chưa được bật</translation> <translation id="1483493594462132177">Gửi</translation> -<translation id="1483829627339988491">Kiểm soát của phụ huynh</translation> +<translation id="1483829627339988491">Quyền kiểm soát của cha mẹ</translation> <translation id="1484979925941077974">Trang web đang sử dụng Bluetooth</translation> <translation id="1485015260175968628">Tiện ích/ứng dụng giờ đây có thể:</translation> <translation id="1485141095922496924">Phiên bản <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> @@ -1604,7 +1604,7 @@ <translation id="3453612417627951340">Cần cấp phép</translation> <translation id="3454157711543303649">Đã kích hoạt xong</translation> <translation id="345693547134384690">Mở &hình ảnh trong tab mới</translation> -<translation id="3457500881955698515">Công ty hoặc tổ chức của bạn yêu cầu cập nhật ngay thiết bị này</translation> +<translation id="3457500881955698515">Công ty hoặc tổ chức của bạn yêu cầu bạn cập nhật thiết bị này ngay bây giờ</translation> <translation id="3459509316159669723">In</translation> <translation id="3459697287128633276">Để cho phép tài khoản của bạn truy cập vào Cửa hàng Google Play, vui lòng xác thực với Nhà cung cấp danh tính của bạn.</translation> <translation id="3459774175445953971">Sửa đổi lần cuối:</translation> @@ -1673,7 +1673,7 @@ <translation id="3552780134252864554">Xóa khi thoát</translation> <translation id="3555812735919707620">Xóa tiện ích</translation> <translation id="3556000484321257665">Công cụ tìm kiếm của bạn đã được thay đổi thành <ph name="URL" />.</translation> -<translation id="3557101512409028104">Đặt ra các hạn chế về trang web và giới hạn thời gian sử dụng thiết bị bằng Family Link</translation> +<translation id="3557101512409028104">Đặt các hạn chế về trang web và giới hạn thời gian sử dụng thiết bị bằng Family Link</translation> <translation id="3559262020195162408">Không cài đặt được chính sách trên thiết bị.</translation> <translation id="3560034655160545939">&Kiểm tra chính tả</translation> <translation id="3562423906127931518">Quá trình này có thể mất vài phút. Đang thiết lập vùng chứa Linux.</translation> @@ -3315,7 +3315,6 @@ <translation id="6082651258230788217">Hiển thị trên thanh công cụ</translation> <translation id="6086846494333236931">Do quản trị viên của bạn cài đặt</translation> <translation id="6087960857463881712">Khuôn mặt vui nhộn</translation> -<translation id="6089481419520884864">Lọc trang</translation> <translation id="6091761513005122595">Đã kết nối thành công với thư mục chia sẻ.</translation> <translation id="6093888419484831006">Đang hủy cập nhật...</translation> <translation id="6095984072944024315">−</translation> @@ -3343,6 +3342,7 @@ <translation id="6125479973208104919">Rất tiếc, bạn sẽ cần phải thêm lại tài khoản của mình vào <ph name="DEVICE_TYPE" /> này.</translation> <translation id="6129691635767514872">Dữ liệu được chọn đã bị xóa khỏi Chrome và các thiết bị được đồng bộ hóa. Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác, chẳng hạn như tìm kiếm và hoạt động từ các dịch vụ khác của Google tại <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="6129938384427316298">Nhận xét về Chứng chỉ Netscape</translation> +<translation id="6129953537138746214">Dấu cách</translation> <translation id="6135622770221372891">ID kênh</translation> <translation id="6136114942382973861">Đóng thanh tệp đã tải xuống</translation> <translation id="6137767437444130246">Chứng chỉ người dùng</translation> @@ -4311,7 +4311,7 @@ <translation id="7644543211198159466">Màu sắc và giao diện</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (chủ sở hữu)</translation> <translation id="7647403192093989392">Không có hoạt động nào gần đây</translation> -<translation id="7648142322539582331">Kết nối Internet để thiết lập tính năng Kiểm soát của phụ huynh</translation> +<translation id="7648142322539582331">Kết nối Internet để thiết lập tính năng Quyền kiểm soát của cha mẹ</translation> <translation id="7648992873808071793">Lưu trữ tệp trên thiết bị này</translation> <translation id="7649070708921625228">Trợ giúp</translation> <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" muốn xóa "<ph name="EXTENSION_NAME" />".</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index ee10151..2207d87 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -3307,7 +3307,6 @@ <translation id="6082651258230788217">在工具栏中显示</translation> <translation id="6086846494333236931">这是您的管理员安装的</translation> <translation id="6087960857463881712">酷炫表情</translation> -<translation id="6089481419520884864">提取页面</translation> <translation id="6091761513005122595">已成功装载共享资源。</translation> <translation id="6093888419484831006">正在取消更新...</translation> <translation id="6095984072944024315">−</translation> @@ -3335,6 +3334,7 @@ <translation id="6125479973208104919">抱歉,您需要再次向此 <ph name="DEVICE_TYPE" /> 添加您的帐号。</translation> <translation id="6129691635767514872">系统已从 Chrome 和同步的设备中移除了您所选的数据。不过,您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能还有其他形式的浏览记录(例如,在其他 Google 服务中的搜索记录和活动记录)。</translation> <translation id="6129938384427316298">Netscape 证书评论</translation> +<translation id="6129953537138746214">空格</translation> <translation id="6135622770221372891">版本 ID</translation> <translation id="6136114942382973861">关闭下载内容栏</translation> <translation id="6137767437444130246">用户证书</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 3483fc2..991b4f2 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1428,7 +1428,7 @@ <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (使用硬體加密金鑰)</translation> <translation id="3161522574479303604">所有語言</translation> <translation id="3163201441334626963">供應商 <ph name="VENDOR_ID" /> 提供的不明產品 <ph name="PRODUCT_ID" /></translation> -<translation id="3164329792803560526">將這個分頁與 <ph name="APP_NAME" /> 共用</translation> +<translation id="3164329792803560526">這個分頁正與 <ph name="APP_NAME" /> 共用</translation> <translation id="3165390001037658081">部分電信業者可能會封鎖這項功能。</translation> <translation id="3169472444629675720">Discover</translation> <translation id="3170072451822350649">你也可以略過登入程序,<ph name="LINK_START" />以訪客身分瀏覽<ph name="LINK_END" />。</translation> @@ -3313,7 +3313,6 @@ <translation id="6082651258230788217">顯示在工具列中</translation> <translation id="6086846494333236931">由您的管理員安裝</translation> <translation id="6087960857463881712">好看的臉蛋</translation> -<translation id="6089481419520884864">提取頁面</translation> <translation id="6091761513005122595">已成功共用掛接的裝置。</translation> <translation id="6093888419484831006">正在取消更新...</translation> <translation id="6095984072944024315">−</translation> @@ -3341,6 +3340,7 @@ <translation id="6125479973208104919">很抱歉,你需要重新在 <ph name="DEVICE_TYPE" /> 上新增帳戶。</translation> <translation id="6129691635767514872">系統已將所選資料從 Chrome 和其他同步的裝置中移除。你的 Google 帳戶仍可能保留了其他類型的瀏覽記錄,例如其他 Google 服務中的搜尋和活動記錄 (可前往 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 查詢)。</translation> <translation id="6129938384427316298">Netscape 憑證評論</translation> +<translation id="6129953537138746214">空格</translation> <translation id="6135622770221372891">頻道 ID</translation> <translation id="6136114942382973861">關閉下載內容列</translation> <translation id="6137767437444130246">使用者憑證</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index e6be4e5..da933db 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -267,7 +267,7 @@ <translation id="8568392309447938879">మీరు అనువర్తనాలను ఉపయోగించడానికి Chromeకు సైన్ ఇన్ చేయాలి. ఇది పరికరాల్లో మీ అనువర్తనాలు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను సమకాలీకరించడానికి Chromeను అనుమతిస్తుంది.</translation> <translation id="8606668294522778825">Google Chrome మీ బ్రౌజింగ్ అనుభవాన్ని మెరుగుపరచడానికి వెబ్ సేవలను ఉపయోగించవచ్చు. మీరు ఈ సేవలను ఐచ్ఛికంగా నిలిపివేయవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="8614913330719544658">Google Chrome స్పందించడం లేదు. ఇప్పుడే పునఃప్రారంభించాలా?</translation> -<translation id="8625237574518804553">{0,plural, =1{1 సెకనులో Chrome తిరిగి ప్రారంభించబడుతుంది}other{# నిమిషాల్లో Chrome తిరిగి ప్రారంభించబడుతుంది}}</translation> +<translation id="8625237574518804553">{0,plural, =1{1 నిమిషంలో Chrome తిరిగి ప్రారంభించబడుతుంది}other{# నిమిషాల్లో Chrome తిరిగి ప్రారంభించబడుతుంది}}</translation> <translation id="8667808506758191620">మీ <ph name="DEVICE_TYPE" /> ఆధునికంగా ఉంది.</translation> <translation id="8669527147644353129">Google Chrome సహాయకారుడు</translation> <translation id="8679801911857917785">ఇది మీరు Chromeని ప్రారంభించేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index d62126d..c58223d4 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1483,7 +1483,7 @@ Manufacturer </message> <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTER_SELECT_DRIVER" desc="Label for the file selector to manually select a PPD file from the user's file system."> - Or specify your own driver: + Or specify your printer PPD </message> <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER" desc="Text for the button which allows user to select a PPD file from the file system."> Browse
diff --git a/chrome/browser/android/compositor/layer/ephemeral_tab_layer.cc b/chrome/browser/android/compositor/layer/ephemeral_tab_layer.cc index 8b02af0..edb660f 100644 --- a/chrome/browser/android/compositor/layer/ephemeral_tab_layer.cc +++ b/chrome/browser/android/compositor/layer/ephemeral_tab_layer.cc
@@ -8,65 +8,50 @@ #include "cc/layers/layer.h" #include "cc/layers/ui_resource_layer.h" #include "chrome/browser/favicon/favicon_service_factory.h" -#include "chrome/browser/profiles/profile.h" #include "components/favicon/content/content_favicon_driver.h" -#include "components/favicon/core/favicon_service.h" #include "content/public/browser/web_contents.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/android/resources/resource_manager.h" #include "ui/base/l10n/l10n_util_android.h" #include "ui/gfx/codec/png_codec.h" +#include "ui/gfx/image/image_skia.h" #include "url/gurl.h" namespace { void DisplayFavicon(scoped_refptr<cc::UIResourceLayer> layer, - scoped_refptr<cc::UIResourceLayer> icon_layer, const SkBitmap& favicon, const float dp_to_px, const float panel_width, const float bar_height, - const float padding) { - const float icon_width = + const float bar_margin, + const base::RepeatingCallback<void()>& favicon_callback) { + const float bounds_width = android::OverlayPanelLayer::kDefaultIconWidthDp * dp_to_px; + + // Dimension to which favicons are resized - half the size of default icon. + const float icon_size = bounds_width / 2.0f; + const float padding = bar_margin + (bounds_width - icon_size) / 2.0f; layer->SetBitmap(favicon); - layer->SetBounds(gfx::Size(icon_width, icon_width)); + layer->SetBounds(gfx::Size(icon_size, icon_size)); bool is_rtl = l10n_util::IsLayoutRtl(); - float icon_x = is_rtl ? panel_width - icon_width - padding : padding; - float icon_y = (bar_height - layer->bounds().height()) / 2; - icon_layer->SetIsDrawable(false); - layer->SetIsDrawable(true); + float icon_x = is_rtl ? panel_width - icon_size - padding : padding; + float icon_y = (bar_height - icon_size) / 2; layer->SetPosition(gfx::PointF(icon_x, icon_y)); -} - -void OnLocalFaviconAvailable( - scoped_refptr<cc::UIResourceLayer> layer, - scoped_refptr<cc::UIResourceLayer> icon_layer, - const float dp_to_px, - const float panel_width, - const float bar_height, - const float padding, - const favicon_base::FaviconRawBitmapResult& result) { - if (!result.is_valid()) - return; - SkBitmap favicon_bitmap; - gfx::PNGCodec::Decode(result.bitmap_data->front(), result.bitmap_data->size(), - &favicon_bitmap); - if (favicon_bitmap.isNull()) - return; - favicon_bitmap.setImmutable(); - DisplayFavicon(layer, icon_layer, favicon_bitmap, dp_to_px, panel_width, - bar_height, padding); + favicon_callback.Run(); } } // namespace namespace android { + // static scoped_refptr<EphemeralTabLayer> EphemeralTabLayer::Create( - ui::ResourceManager* resource_manager) { - return base::WrapRefCounted(new EphemeralTabLayer(resource_manager)); + ui::ResourceManager* resource_manager, + base::RepeatingCallback<void()>&& favicon_callback) { + return base::WrapRefCounted( + new EphemeralTabLayer(resource_manager, std::move(favicon_callback))); } void EphemeralTabLayer::SetProperties( @@ -95,6 +80,7 @@ float bar_shadow_opacity, int icon_color, int drag_handlebar_color, + jfloat favicon_opacity, bool progress_bar_visible, float progress_bar_height, float progress_bar_opacity, @@ -137,6 +123,10 @@ panel_width_ = panel_width; bar_height_ = bar_height; bar_margin_side_ = bar_margin_side; + if (favicon_opacity > 0.f) + favicon_layer_->SetIsDrawable(true); + favicon_layer_->SetOpacity(favicon_opacity); + panel_icon_->SetOpacity(1 - favicon_opacity); } void EphemeralTabLayer::SetupTextLayer(float bar_top, @@ -247,50 +237,29 @@ const GURL& icon_url, bool icon_url_changed, const gfx::Image& image) { - if (notification_icon_type != NON_TOUCH_LARGEST && - notification_icon_type != TOUCH_LARGEST) { - return; - } - SkBitmap favicon_bitmap = image.AsImageSkia().GetRepresentation(1.0f).GetBitmap(); if (favicon_bitmap.empty()) return; - favicon_bitmap.setImmutable(); - DisplayFavicon(favicon_layer_, panel_icon_, favicon_bitmap, dp_to_px_, - panel_width_, bar_height_, bar_margin_side_); -} - -void EphemeralTabLayer::GetLocalFaviconImageForURL(Profile* profile, - const std::string& url, - int size) { - panel_icon_->SetIsDrawable(true); - favicon_layer_->SetIsDrawable(false); - favicon::FaviconService* favicon_service = - FaviconServiceFactory::GetForProfile(profile, - ServiceAccessType::EXPLICIT_ACCESS); - DCHECK(favicon_service); - if (!favicon_service) + std::string host = icon_url.host(); + if (host == favicon_url_host_) return; - - favicon_base::FaviconRawBitmapCallback callback_runner = - base::BindOnce(&OnLocalFaviconAvailable, favicon_layer_, panel_icon_, - dp_to_px_, panel_width_, bar_height_, bar_margin_side_); - - // Set |fallback_to_host|=true so the favicon database will fall back to - // matching only the hostname to have the best chance of finding a favicon. - const bool fallback_to_host = true; - favicon_service->GetRawFaviconForPageURL( - GURL(url), - {favicon_base::IconType::kFavicon, favicon_base::IconType::kTouchIcon, - favicon_base::IconType::kTouchPrecomposedIcon, - favicon_base::IconType::kWebManifestIcon}, - size, fallback_to_host, std::move(callback_runner), - cancelable_task_tracker_.get()); + favicon_url_host_ = host; + favicon_bitmap.setImmutable(); + DisplayFavicon(favicon_layer_, favicon_bitmap, dp_to_px_, panel_width_, + bar_height_, bar_margin_side_, favicon_callback_); } -EphemeralTabLayer::EphemeralTabLayer(ui::ResourceManager* resource_manager) +void EphemeralTabLayer::OnHide() { + favicon_layer_->SetIsDrawable(false); + favicon_url_host_.clear(); +} + +EphemeralTabLayer::EphemeralTabLayer( + ui::ResourceManager* resource_manager, + base::RepeatingCallback<void()>&& favicon_callback) : OverlayPanelLayer(resource_manager), + favicon_callback_(std::move(favicon_callback)), title_(cc::UIResourceLayer::Create()), caption_(cc::UIResourceLayer::Create()), favicon_layer_(cc::UIResourceLayer::Create()),
diff --git a/chrome/browser/android/compositor/layer/ephemeral_tab_layer.h b/chrome/browser/android/compositor/layer/ephemeral_tab_layer.h index 87046b6..b24f70d0 100644 --- a/chrome/browser/android/compositor/layer/ephemeral_tab_layer.h +++ b/chrome/browser/android/compositor/layer/ephemeral_tab_layer.h
@@ -7,10 +7,9 @@ #include "chrome/browser/android/compositor/layer/overlay_panel_layer.h" +#include "base/callback.h" #include "components/favicon/core/favicon_driver_observer.h" -class Profile; - namespace base { class CancelableTaskTracker; } @@ -36,7 +35,8 @@ public favicon::FaviconDriverObserver { public: static scoped_refptr<EphemeralTabLayer> Create( - ui::ResourceManager* resource_manager); + ui::ResourceManager* resource_manager, + base::RepeatingCallback<void()>&& favicon_callback); void SetProperties(content::WebContents* web_contents, int title_view_resource_id, int caption_view_resource_id, @@ -62,6 +62,7 @@ float bar_shadow_opacity, int icon_color, int drag_handlebar_color, + jfloat favicon_opacity, bool progress_bar_visible, float progress_bar_height, float progress_bar_opacity, @@ -75,9 +76,7 @@ int context_resource_id, float title_caption_spacing); - void GetLocalFaviconImageForURL(Profile* profile, - const std::string& url, - int size); + void OnHide(); // favicon::FaviconDriverObserver void OnFaviconUpdated(favicon::FaviconDriver* favicon_driver, @@ -87,7 +86,8 @@ const gfx::Image& image) override; protected: - explicit EphemeralTabLayer(ui::ResourceManager* resource_manager); + EphemeralTabLayer(ui::ResourceManager* resource_manager, + base::RepeatingCallback<void()>&& favicon_callback); ~EphemeralTabLayer() override; private: @@ -96,6 +96,8 @@ float panel_width_; float bar_height_; float bar_margin_side_; + std::string favicon_url_host_; + base::RepeatingCallback<void()> favicon_callback_; scoped_refptr<cc::UIResourceLayer> title_; scoped_refptr<cc::UIResourceLayer> caption_; scoped_refptr<cc::UIResourceLayer> favicon_layer_;
diff --git a/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.cc index 0728d4a..2883bca 100644 --- a/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.cc +++ b/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.cc
@@ -3,18 +3,27 @@ // found in the LICENSE file. #include "chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h" -#include "base/android/jni_string.h" + +#include "base/callback.h" #include "cc/layers/solid_color_layer.h" #include "chrome/browser/android/compositor/layer/ephemeral_tab_layer.h" -#include "chrome/browser/profiles/profile_android.h" #include "content/public/browser/web_contents.h" #include "jni/EphemeralTabSceneLayer_jni.h" #include "ui/android/resources/resource_manager_impl.h" #include "ui/android/view_android.h" -using base::android::ConvertJavaStringToUTF8; using base::android::JavaParamRef; using base::android::JavaRef; +using base::android::ScopedJavaGlobalRef; + +namespace { + +void OnFaviconAvailable(const ScopedJavaGlobalRef<jobject>& object) { + JNIEnv* env = base::android::AttachCurrentThread(); + android::Java_FaviconCallback_onAvailable(env, object); +} + +} // namespace namespace android { @@ -34,10 +43,13 @@ void EphemeralTabSceneLayer::CreateEphemeralTabLayer( JNIEnv* env, const JavaParamRef<jobject>& object, - const JavaParamRef<jobject>& jresource_manager) { + const JavaParamRef<jobject>& jresource_manager, + const JavaParamRef<jobject>& jcallback) { ui::ResourceManager* resource_manager = ui::ResourceManagerImpl::FromJavaObject(jresource_manager); - ephemeral_tab_layer_ = EphemeralTabLayer::Create(resource_manager); + ScopedJavaGlobalRef<jobject> java_obj(jcallback); + ephemeral_tab_layer_ = EphemeralTabLayer::Create( + resource_manager, base::BindRepeating(&OnFaviconAvailable, java_obj)); // The layer is initially invisible. ephemeral_tab_layer_->layer()->SetHideLayerAndSubtree(true); @@ -59,19 +71,6 @@ open_tab_icon_resource_id, close_icon_resource_id); } -void EphemeralTabSceneLayer::GetFavicon(JNIEnv* env, - const JavaParamRef<jobject>& object, - const JavaParamRef<jobject>& jprofile, - const JavaParamRef<jstring>& jurl, - jint size) { - Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); - DCHECK(profile); - if (!profile) - return; - ephemeral_tab_layer_->GetLocalFaviconImageForURL( - profile, ConvertJavaStringToUTF8(env, jurl), size); -} - void EphemeralTabSceneLayer::Update(JNIEnv* env, const JavaParamRef<jobject>& object, jint title_view_resource_id, @@ -100,6 +99,7 @@ jfloat bar_shadow_opacity, jint icon_color, jint drag_handlebar_color, + jfloat favicon_opacity, jboolean progress_bar_visible, jfloat progress_bar_height, jfloat progress_bar_opacity, @@ -131,7 +131,7 @@ content_layer, panel_x, panel_y, panel_width, panel_height, bar_background_color, bar_margin_side, bar_margin_top, bar_height, bar_border_visible, bar_border_height, bar_shadow_visible, - bar_shadow_opacity, icon_color, drag_handlebar_color, + bar_shadow_opacity, icon_color, drag_handlebar_color, favicon_opacity, progress_bar_visible, progress_bar_height, progress_bar_opacity, progress_bar_completion); // Make the layer visible if it is not already. @@ -155,6 +155,7 @@ const JavaParamRef<jobject>& jobj) { // TODO(mdjones): Create super class for this logic. if (ephemeral_tab_layer_) { + ephemeral_tab_layer_->OnHide(); ephemeral_tab_layer_->layer()->SetHideLayerAndSubtree(true); } // Reset base page brightness.
diff --git a/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h b/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h index a832120a8..c81a4501 100644 --- a/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h
@@ -6,7 +6,6 @@ #define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_EPHEMERAL_TAB_SCENE_LAYER_H_ #include "base/android/jni_android.h" -#include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h" @@ -28,7 +27,8 @@ void CreateEphemeralTabLayer( JNIEnv* env, const base::android::JavaParamRef<jobject>& object, - const base::android::JavaParamRef<jobject>& jresource_manager); + const base::android::JavaParamRef<jobject>& jresource_manager, + const base::android::JavaParamRef<jobject>& jfavicon_callback); void SetResourceIds(JNIEnv* env, const base::android::JavaParamRef<jobject>& object, @@ -40,12 +40,6 @@ jint open_tab_icon_resource_id, jint close_icon_resource_id); - void GetFavicon(JNIEnv* env, - const base::android::JavaParamRef<jobject>& object, - const base::android::JavaParamRef<jobject>& jprofile, - const base::android::JavaParamRef<jstring>& jurl, - jint size); - void Update(JNIEnv* env, const base::android::JavaParamRef<jobject>& object, jint title_view_resource_id, @@ -74,6 +68,7 @@ jfloat bar_shadow_opacity, jint icon_color, jint drag_handlebar_color, + jfloat favicon_opacity, jboolean progress_bar_visible, jfloat progress_bar_height, jfloat progress_bar_opacity,
diff --git a/chrome/browser/android/download/download_manager_service.cc b/chrome/browser/android/download/download_manager_service.cc index 5ed2f38..396f6ea 100644 --- a/chrome/browser/android/download/download_manager_service.cc +++ b/chrome/browser/android/download/download_manager_service.cc
@@ -32,6 +32,7 @@ #include "components/download/public/common/auto_resumption_handler.h" #include "components/download/public/common/download_item.h" #include "components/download/public/common/download_item_impl.h" +#include "components/download/public/common/download_stats.h" #include "components/download/public/common/download_url_loader_factory_getter_impl.h" #include "components/download/public/common/simple_download_manager_coordinator.h" #include "components/download/public/common/url_download_handler_factory.h" @@ -719,6 +720,19 @@ UpdateCoordinator(coordinator, false); } +void DownloadManagerService::RecordFirstBackgroundInterruptReason( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jstring>& jdownload_guid, + jboolean download_started) { + std::string download_guid = ConvertJavaStringToUTF8(env, jdownload_guid); + download::DownloadItem* download = GetDownload(download_guid, false); + if (download) { + download::RecordFirstBackgroundDownloadInterruptReason( + download->GetLastReason(), download_started); + } +} + void DownloadManagerService::OnPendingDownloadsLoaded() { // If |in_progress_manager_| is null, wait for DownloadManager to initialize // before performing any pending actions.
diff --git a/chrome/browser/android/download/download_manager_service.h b/chrome/browser/android/download/download_manager_service.h index f74f216..a9ae911 100644 --- a/chrome/browser/android/download/download_manager_service.h +++ b/chrome/browser/android/download/download_manager_service.h
@@ -191,6 +191,14 @@ // only mode. void CreateInProgressDownloadManager(); + // Helper method to record the interrupt reason UMA for the first background + // download. + void RecordFirstBackgroundInterruptReason( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jstring>& jdownload_guid, + jboolean download_started); + protected: // Called to get the content::DownloadManager instance. virtual content::DownloadManager* GetDownloadManager(bool is_off_the_record);
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index b257db8a..07c1ef0 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -615,14 +615,6 @@ prefs::kWebDriverOverridesIncompatiblePolicies))); } -// Sets up the ThreadProfiler for the browser process, runs it, and returns the -// profiler. -std::unique_ptr<ThreadProfiler> CreateAndStartBrowserMainThreadProfiler() { - ThreadProfiler::SetBrowserProcessReceiverCallback(base::BindRepeating( - &metrics::CallStackProfileMetricsProvider::ReceiveProfile)); - return ThreadProfiler::CreateAndStartOnMainThread(); -} - } // namespace // BrowserMainParts ------------------------------------------------------------ @@ -633,7 +625,6 @@ : parameters_(parameters), parsed_command_line_(parameters.command_line), result_code_(service_manager::RESULT_CODE_NORMAL_EXIT), - ui_thread_profiler_(CreateAndStartBrowserMainThreadProfiler()), heap_profiler_controller_(std::make_unique<HeapProfilerController>()), should_call_pre_main_loop_start_startup_on_variations_service_( !parameters.ui_task), @@ -846,8 +837,7 @@ void ChromeBrowserMainParts::PostMainMessageLoopStart() { TRACE_EVENT0("startup", "ChromeBrowserMainParts::PostMainMessageLoopStart"); - ui_thread_profiler_->SetMainThreadTaskRunner( - base::ThreadTaskRunnerHandle::Get()); + ThreadProfiler::SetMainThreadTaskRunner(base::ThreadTaskRunnerHandle::Get()); heap_profiler_controller_->Start();
diff --git a/chrome/browser/chrome_browser_main.h b/chrome/browser/chrome_browser_main.h index 8fafc5a..687eb5c 100644 --- a/chrome/browser/chrome_browser_main.h +++ b/chrome/browser/chrome_browser_main.h
@@ -26,7 +26,6 @@ class StartupBrowserCreator; class StartupTimeBomb; class ShutdownWatcherHelper; -class ThreadProfiler; class WebUsbDetector; namespace tracing { @@ -153,9 +152,6 @@ // Parts are deleted in the inverse order they are added. std::vector<ChromeBrowserMainExtraParts*> chrome_extra_parts_; - // A profiler that periodically samples stack traces on the UI thread. - std::unique_ptr<ThreadProfiler> ui_thread_profiler_; - // The controller schedules UMA heap profiles collections and forwarding down // the reporting pipeline. std::unique_ptr<HeapProfilerController> heap_profiler_controller_;
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index c66b7d7..5062f846 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -7,6 +7,7 @@ #include "ash/public/cpp/keyboard/keyboard_switches.h" #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "base/threading/thread_restrictions.h" #include "chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" @@ -1027,6 +1028,16 @@ TestCase("searchDownloadsWithNoResults"), TestCase("searchDownloadsClearSearch"))); +WRAPPED_INSTANTIATE_TEST_SUITE_P( + Metrics, /* metrics.js */ + FilesAppBrowserTest, + ::testing::Values(TestCase("metricsRecordEnum"))); + +WRAPPED_INSTANTIATE_TEST_SUITE_P( + Breadcrumbs, /* breadcrumbs.js */ + FilesAppBrowserTest, + ::testing::Values(TestCase("breadcrumbsNavigate"))); + // Structure to describe an account info. struct TestAccountInfo { const char* const gaia_id;
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc index 85d16bd..707b424 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -597,6 +597,40 @@ file_tasks::FileTasksObserver::OpenType open_type; }; +struct GetHistogramCountMessage { + static bool ConvertJSONValue(const base::DictionaryValue& value, + GetHistogramCountMessage* message) { + base::JSONValueConverter<GetHistogramCountMessage> converter; + return converter.Convert(value, message); + } + + static void RegisterJSONConverter( + base::JSONValueConverter<GetHistogramCountMessage>* converter) { + converter->RegisterStringField("histogramName", + &GetHistogramCountMessage::histogram_name); + converter->RegisterIntField("value", &GetHistogramCountMessage::value); + } + + std::string histogram_name; + int value = 0; +}; + +struct GetUserActionCountMessage { + static bool ConvertJSONValue(const base::DictionaryValue& value, + GetUserActionCountMessage* message) { + base::JSONValueConverter<GetUserActionCountMessage> converter; + return converter.Convert(value, message); + } + + static void RegisterJSONConverter( + base::JSONValueConverter<GetUserActionCountMessage>* converter) { + converter->RegisterStringField( + "userActionName", &GetUserActionCountMessage::user_action_name); + } + + std::string user_action_name; +}; + } // anonymous namespace class FileManagerBrowserTestBase::MockFileTasksObserver @@ -2247,6 +2281,26 @@ return; } + if (name == "getHistogramCount") { + GetHistogramCountMessage message; + ASSERT_TRUE(GetHistogramCountMessage::ConvertJSONValue(value, &message)); + base::JSONWriter::Write(base::Value(histograms_.GetBucketCount( + message.histogram_name, message.value)), + output); + + return; + } + + if (name == "getUserActionCount") { + GetUserActionCountMessage message; + ASSERT_TRUE(GetUserActionCountMessage::ConvertJSONValue(value, &message)); + base::JSONWriter::Write( + base::Value(user_actions_.GetActionCount(message.user_action_name)), + output); + + return; + } + FAIL() << "Unknown test message: " << name; }
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h index 23d23d1..132e5f9 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
@@ -10,6 +10,8 @@ #include <string> #include <vector> +#include "base/test/metrics/histogram_tester.h" +#include "base/test/metrics/user_action_tester.h" #include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h" @@ -172,6 +174,9 @@ std::unique_ptr<MockFileTasksObserver> file_tasks_observer_; + base::HistogramTester histograms_; + base::UserActionTester user_actions_; + // Not owned. SelectFileDialogExtensionTestFactory* select_factory_;
diff --git a/chrome/browser/chromeos/file_manager/file_manager_uitest.cc b/chrome/browser/chromeos/file_manager/file_manager_uitest.cc index 75b68240..1d0aafa 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_uitest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_uitest.cc
@@ -99,8 +99,4 @@ RunTest("progressCenter"); } -IN_PROC_BROWSER_TEST_F(FileManagerUITest, UMA) { - RunTest("uma"); -} - } // namespace file_manager
diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc b/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc index 3ab89e43..b99e696 100644 --- a/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc +++ b/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc
@@ -44,6 +44,9 @@ namespace { constexpr char kTestDomain[] = "test-domain.com"; +constexpr char kTestRlzBrandCodeKey[] = "TEST"; +constexpr char kTestSerialNumber[] = "111111"; +constexpr char kTestHardwareClass[] = "hw"; std::string GetDmTokenFromPolicy(const std::string& blob) { enterprise_management::PolicyFetchResponse policy; @@ -143,7 +146,8 @@ AutoEnrollmentWithStatistics() : AutoEnrollmentLocalPolicyServer() { // AutoEnrollmentController assumes that VPD is in valid state if // "serial_number" or "Product_S/N" could be read from it. - fake_statistics_provider_.SetMachineStatistic("serial_number", "111111"); + fake_statistics_provider_.SetMachineStatistic( + system::kSerialNumberKeyForTest, kTestSerialNumber); } ~AutoEnrollmentWithStatistics() override = default; @@ -160,7 +164,8 @@ } void SetVPDCorrupted() { - fake_statistics_provider_.ClearMachineStatistic("serial_number"); + fake_statistics_provider_.ClearMachineStatistic( + system::kSerialNumberKeyForTest); } private: @@ -184,6 +189,30 @@ DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentNoStateKeys); }; +class InitialEnrollmentTest : public EnrollmentLocalPolicyServerBase { + public: + InitialEnrollmentTest() { + fake_statistics_provider_.SetMachineStatistic(system::kRlzBrandCodeKey, + kTestRlzBrandCodeKey); + fake_statistics_provider_.SetMachineStatistic( + system::kSerialNumberKeyForTest, kTestSerialNumber); + fake_statistics_provider_.SetMachineStatistic(system::kHardwareClassKey, + kTestHardwareClass); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + EnrollmentLocalPolicyServerBase::SetUpCommandLine(command_line); + + command_line->AppendSwitchASCII( + switches::kEnterpriseEnableInitialEnrollment, + AutoEnrollmentController::kInitialEnrollmentAlways); + } + + private: + system::ScopedFakeStatisticsProvider fake_statistics_provider_; + DISALLOW_COPY_AND_ASSIGN(InitialEnrollmentTest); +}; + // Simple manual enrollment. IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, ManualEnrollment) { TriggerEnrollmentAndSignInSuccessfully(); @@ -657,4 +686,82 @@ enrollment_ui_.RetryAfterError(); } +IN_PROC_BROWSER_TEST_F(InitialEnrollmentTest, EnrollmentForced) { + auto initial_enrollment = + enterprise_management::DeviceInitialEnrollmentStateResponse:: + INITIAL_ENROLLMENT_MODE_ENROLLMENT_ENFORCED; + policy_server_.SetDeviceInitialEnrollmentResponse( + kTestRlzBrandCodeKey, kTestSerialNumber, initial_enrollment, kTestDomain, + base::nullopt /* is_license_packaged_with_device */); + + host()->StartWizard(AutoEnrollmentCheckScreenView::kScreenId); + OobeScreenWaiter(EnrollmentScreenView::kScreenId).Wait(); + + // User can't skip. + enrollment_ui_.SetExitHandler(); + enrollment_screen()->OnCancel(); + EXPECT_EQ(EnrollmentScreen::Result::BACK, enrollment_ui_.WaitForScreenExit()); + + // Domain is actually different from what the server sent down. But Chrome + // does not enforce that domain if device is not locked. + enrollment_screen()->OnLoginDone(FakeGaiaMixin::kEnterpriseUser1, + FakeGaiaMixin::kFakeAuthCode); + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); + EXPECT_TRUE(InstallAttributes::Get()->IsEnterpriseManaged()); +} + +// Zero touch with attestation authentication fail. Attestation fails because we +// send empty cert request. Should switch to interactive authentication. +IN_PROC_BROWSER_TEST_F(InitialEnrollmentTest, ZeroTouchForcedAttestationFail) { + auto initial_enrollment = + enterprise_management::DeviceInitialEnrollmentStateResponse:: + INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED; + policy_server_.SetDeviceInitialEnrollmentResponse( + kTestRlzBrandCodeKey, kTestSerialNumber, initial_enrollment, kTestDomain, + base::nullopt /* is_license_packaged_with_device */); + + host()->StartWizard(AutoEnrollmentCheckScreenView::kScreenId); + OobeScreenWaiter(EnrollmentScreenView::kScreenId).Wait(); + + // First it tries with attestation auth and should fail. + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepError); + enrollment_ui_.ExpectErrorMessage( + IDS_ENTERPRISE_ENROLLMENT_STATUS_REGISTRATION_CERT_FETCH_FAILED, + /* can retry */ true); + + // Cancel bring up Gaia sing-in page. + enrollment_screen()->OnCancel(); + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSignin); + + // User can't skip. + enrollment_ui_.SetExitHandler(); + enrollment_screen()->OnCancel(); + EXPECT_EQ(EnrollmentScreen::Result::BACK, enrollment_ui_.WaitForScreenExit()); + + // Domain is actually different from what the server sent down. But Chrome + // does not enforce that domain if device is not locked. + enrollment_screen()->OnLoginDone(FakeGaiaMixin::kEnterpriseUser1, + FakeGaiaMixin::kFakeAuthCode); + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); + EXPECT_TRUE(InstallAttributes::Get()->IsEnterpriseManaged()); +} + +IN_PROC_BROWSER_TEST_F(InitialEnrollmentTest, + ZeroTouchForcedAttestationSuccess) { + policy_server_.SetFakeAttestationFlow(); + auto initial_enrollment = + enterprise_management::DeviceInitialEnrollmentStateResponse:: + INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED; + policy_server_.SetDeviceInitialEnrollmentResponse( + kTestRlzBrandCodeKey, kTestSerialNumber, initial_enrollment, kTestDomain, + base::nullopt /* is_license_packaged_with_device */); + + host()->StartWizard(AutoEnrollmentCheckScreenView::kScreenId); + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); + EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged()); +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc index f22d391..b48ef32 100644 --- a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc +++ b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
@@ -6,8 +6,10 @@ #include "base/logging.h" #include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h" +#include "chrome/common/channel_info.h" #include "chromeos/constants/chromeos_features.h" #include "components/user_manager/user_manager.h" +#include "components/version_info/version_info.h" namespace chromeos { namespace { @@ -37,7 +39,8 @@ user_manager::UserManager::Get(); DCHECK(user_manager->IsUserLoggedIn()); - if (view_ && + version_info::Channel channel = chrome::GetChannel(); + if (view_ && channel <= version_info::Channel::DEV && base::FeatureList::IsEnabled( features::kSupervisionOnboardingEligibility) && user_manager->IsLoggedInAsChildUser()) {
diff --git a/chrome/browser/chromeos/login/signin/oauth2_login_verifier.cc b/chrome/browser/chromeos/login/signin/oauth2_login_verifier.cc index bd19f8b..07cf5015 100644 --- a/chrome/browser/chromeos/login/signin/oauth2_login_verifier.cc +++ b/chrome/browser/chromeos/login/signin/oauth2_login_verifier.cc
@@ -7,6 +7,7 @@ #include <vector> #include "base/logging.h" +#include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "content/public/browser/browser_thread.h" #include "services/identity/public/cpp/accounts_cookie_mutator.h"
diff --git a/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.cc b/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.cc index b66c7dd..f6fb18bfe 100644 --- a/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.cc +++ b/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.cc
@@ -209,6 +209,32 @@ return policy_test_server_->SetConfig(server_config_); } +bool LocalPolicyTestServerMixin::SetDeviceInitialEnrollmentResponse( + const std::string& device_brand_code, + const std::string& device_serial_number, + enterprise_management::DeviceInitialEnrollmentStateResponse:: + InitialEnrollmentMode initial_mode, + const base::Optional<std::string>& management_domain, + const base::Optional<bool> is_license_packaged_with_device) { + base::Value serial_entry(base::Value::Type::DICTIONARY); + serial_entry.SetKey("initial_enrollment_mode", base::Value(initial_mode)); + + if (management_domain.has_value()) + serial_entry.SetKey("management_domain", + base::Value(management_domain.value())); + + if (is_license_packaged_with_device.has_value()) + serial_entry.SetKey("is_license_packaged_with_device", + base::Value(is_license_packaged_with_device.value())); + + const std::string brand_serial_id = + device_brand_code + "_" + device_serial_number; + server_config_.SetPath("initial_enrollment_state." + brand_serial_id, + std::move(serial_entry)); + policy_test_server_->SetConfig(server_config_); + return true; +} + LocalPolicyTestServerMixin::~LocalPolicyTestServerMixin() = default; } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h b/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h index 16546ad..666739e 100644 --- a/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h +++ b/chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h
@@ -80,6 +80,14 @@ restore_mode, const std::string& managemement_domain); + bool SetDeviceInitialEnrollmentResponse( + const std::string& device_brand_code, + const std::string& device_serial_number, + enterprise_management::DeviceInitialEnrollmentStateResponse:: + InitialEnrollmentMode initial_mode, + const base::Optional<std::string>& management_domain, + const base::Optional<bool> is_license_packaged_with_device); + private: std::unique_ptr<policy::LocalPolicyTestServer> policy_test_server_; base::Value server_config_;
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system_id.cc b/chrome/browser/chromeos/smb_client/smb_file_system_id.cc index e266b3c..cb76254d 100644 --- a/chrome/browser/chromeos/smb_client/smb_file_system_id.cc +++ b/chrome/browser/chromeos/smb_client/smb_file_system_id.cc
@@ -4,13 +4,17 @@ #include "chrome/browser/chromeos/smb_client/smb_file_system_id.h" +#include <string.h> + #include <string> #include "base/files/file_path.h" +#include "base/logging.h" #include "base/rand_util.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" +#include "base/strings/string_util.h" namespace chromeos { namespace smb_client { @@ -18,12 +22,12 @@ constexpr char kDelimiter[] = "@@"; constexpr char kKerberosSymbol[] = "kerberos_chromad"; +constexpr char kUserPrefix[] = "user="; constexpr int kRandomIdBytes = 8; std::vector<std::string> GetComponents(const std::string& file_system_id) { - const std::vector<std::string> components = - SplitString(file_system_id, kDelimiter, base::TRIM_WHITESPACE, - base::SPLIT_WANT_NONEMPTY); + std::vector<std::string> components = SplitStringUsingSubstr( + file_system_id, kDelimiter, base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); DCHECK_GE(components.size(), 2u); DCHECK_LE(components.size(), 3u); @@ -51,6 +55,18 @@ return file_system_id; } +std::string CreateFileSystemIdForUser(const base::FilePath& share_path, + const std::string& username) { + // Disallow down-level logon names. + CHECK_EQ(username.find('\\'), std::string::npos); + const std::string base_file_system_id = + base::StrCat({GenerateRandomId(), kDelimiter, share_path.value()}); + if (username.empty()) { + return base_file_system_id; + } + return base::StrCat({base_file_system_id, kDelimiter, kUserPrefix, username}); +} + base::FilePath GetSharePathFromFileSystemId(const std::string& file_system_id) { const std::vector<std::string> components = GetComponents(file_system_id); DCHECK_GE(components.size(), 1u); @@ -64,5 +80,16 @@ return components.size() >= 3 && components[2] == kKerberosSymbol; } +base::Optional<std::string> GetUserFromFileSystemId( + const std::string& file_system_id) { + const std::vector<std::string> components = GetComponents(file_system_id); + if (components.size() < 3 || + !base::StartsWith(components[2], kUserPrefix, + base::CompareCase::SENSITIVE)) { + return {}; + } + return components[2].substr(strlen(kUserPrefix)); +} + } // namespace smb_client } // namespace chromeos
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system_id.h b/chrome/browser/chromeos/smb_client/smb_file_system_id.h index 453838c..0dc3ecca 100644 --- a/chrome/browser/chromeos/smb_client/smb_file_system_id.h +++ b/chrome/browser/chromeos/smb_client/smb_file_system_id.h
@@ -7,7 +7,8 @@ #include <string> -#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/optional.h" namespace chromeos { namespace smb_client { @@ -19,6 +20,14 @@ std::string CreateFileSystemId(const base::FilePath& share_path, bool is_kerberos_chromad); +// Creates a FileSystemId by concatenating a random filesystem identifier, +// |share_path|, and |username| with a delimiter. The random ID is used so that +// the same share path can be mounted multiple times. |username| must be either +// a name without a domain/workgroup, or in the "user@domain.com" format +// parsable by ParseUserPrincipalName(). +std::string CreateFileSystemIdForUser(const base::FilePath& share_path, + const std::string& username); + // Returns the SharePath component of a |file_system_id|. |file_system_id| must // be well-formed (e.g. 2@@smb://192.168.1.1/testShare). base::FilePath GetSharePathFromFileSystemId(const std::string& file_system_id); @@ -27,6 +36,12 @@ // using ChromAD Kerberos. bool IsKerberosChromadFileSystemId(const std::string& file_system_id); +// Returns the username if |file_system_id| was constructed with +// CreateFileSystemIdForUser(). Returns nullopt if |file_system_id| does not +// store the username. +base::Optional<std::string> GetUserFromFileSystemId( + const std::string& file_system_id); + } // namespace smb_client } // namespace chromeos
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc b/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc index db25800..39981a8 100644 --- a/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc +++ b/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc
@@ -7,6 +7,7 @@ #include <string> #include "base/files/file_path.h" +#include "base/strings/strcat.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -23,6 +24,9 @@ "^\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w"; } // namespace +constexpr char kTestUsername[] = "foobar"; +constexpr char kTestWorkgroup[] = "accounts.baz.com"; + class SmbFileSystemIdTest : public testing::Test { public: SmbFileSystemIdTest() = default; @@ -43,6 +47,20 @@ "@@smb://192.168.0.0/test@@kerberos_chromad")); } +TEST_F(SmbFileSystemIdTest, CreateFileSystemIdForUser) { + const base::FilePath share_path("smb://192.168.0.0/test"); + + EXPECT_THAT(CreateFileSystemIdForUser(share_path, kTestUsername), + MatchesRegex(std::string(kRandomIdRegex) + + "@@smb://192.168.0.0/test@@user=" + kTestUsername)); + + std::string user_workgroup = + base::StrCat({kTestUsername, "@", kTestWorkgroup}); + EXPECT_THAT(CreateFileSystemIdForUser(share_path, user_workgroup), + MatchesRegex(std::string(kRandomIdRegex) + + "@@smb://192.168.0.0/test@@user=" + user_workgroup)); +} + TEST_F(SmbFileSystemIdTest, ShouldParseSharePathCorrectly) { // Note: These are still valid because existing users might have saved shares. const std::string file_system_id_1 = "12@@smb://192.168.0.0/test"; @@ -72,5 +90,36 @@ EXPECT_FALSE(IsKerberosChromadFileSystemId(non_kerberos_file_system_id)); } +TEST_F(SmbFileSystemIdTest, GetUserFromFileSystemId) { + const std::string file_system_id_1 = base::StrCat( + {"EFAFF3864D0FE389@@smb://192.168.0.1/test@@user=", kTestUsername}); + const std::string user_workgroup = + base::StrCat({kTestUsername, "@", kTestWorkgroup}); + const std::string file_system_id_2 = base::StrCat( + {"EFAFF3864D0FE389@@smb://192.168.0.1/test@@user=", user_workgroup}); + + base::Optional<std::string> actual_user = + GetUserFromFileSystemId(file_system_id_1); + ASSERT_TRUE(actual_user); + EXPECT_EQ(kTestUsername, *actual_user); + + actual_user = GetUserFromFileSystemId(file_system_id_2); + ASSERT_TRUE(actual_user); + EXPECT_EQ(user_workgroup, *actual_user); +} + +TEST_F(SmbFileSystemIdTest, GetUserFromFileSystemId_NoUser) { + const std::string file_system_id_1 = + "EFAFF3864D0FE389@@smb://192.168.0.1/test"; + const std::string file_system_id_2 = + "EFAFF3864D0FE389@@smb://192.168.0.1/test@@kerberos_chromad"; + const std::string file_system_id_3 = + "EFAFF3864D0FE389@@smb://192.168.0.1/test@@unrecognised_field"; + + EXPECT_FALSE(GetUserFromFileSystemId(file_system_id_1)); + EXPECT_FALSE(GetUserFromFileSystemId(file_system_id_2)); + EXPECT_FALSE(GetUserFromFileSystemId(file_system_id_3)); +} + } // namespace smb_client } // namespace chromeos
diff --git a/chrome/browser/chromeos/smb_client/smb_service.cc b/chrome/browser/chromeos/smb_client/smb_service.cc index 3421132..bfcfb24 100644 --- a/chrome/browser/chromeos/smb_client/smb_service.cc +++ b/chrome/browser/chromeos/smb_client/smb_service.cc
@@ -417,6 +417,13 @@ DCHECK(user->IsActiveDirectoryUser()); ParseUserPrincipalName(user->GetDisplayEmail(), &username, &workgroup); + } else { + base::Optional<std::string> user_workgroup = + GetUserFromFileSystemId(file_system_info.file_system_id()); + if (user_workgroup && + !ParseUserName(*user_workgroup, &username, &workgroup)) { + LOG(ERROR) << "Failed to parse username/workgroup from file system ID"; + } } SmbUrl parsed_url(share_path.value());
diff --git a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc index c7b5714..8b67d7d 100644 --- a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc +++ b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/json/json_reader.h" #include "base/run_loop.h" +#include "base/strings/strcat.h" #include "base/test/simple_test_tick_clock.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h" @@ -43,7 +44,10 @@ namespace { const ProviderId kProviderId = ProviderId::CreateFromNativeId("smb"); -const char kTestDomain[] = "EXAMPLE.COM"; +constexpr char kTestUser[] = "foobar"; +constexpr char kTestDomain[] = "EXAMPLE.COM"; +constexpr char kSharePath[] = "\\\\server\\foobar"; +constexpr char kMountPath[] = "smb://server/foobar"; void SaveMountResult(SmbMountResult* out, SmbMountResult result) { *out = result; @@ -181,9 +185,6 @@ } TEST_F(SmbServiceTest, Remount) { - const char* kSharePath = "\\\\server\\foobar"; - const char* kRemountPath = "smb://server/foobar"; - file_system_provider::MountOptions mount_options( CreateFileSystemId(base::FilePath(kSharePath), false /* is_kerberos_chromad */), @@ -196,7 +197,7 @@ registry_->RememberFileSystem(file_system_info, {}); base::RunLoop run_loop; - EXPECT_CALL(*mock_client_, Mount(base::FilePath(kRemountPath), _, "", "", _, + EXPECT_CALL(*mock_client_, Mount(base::FilePath(kMountPath), _, "", "", _, true /* skip_connect */, _)) .WillOnce(WithArg<6>( Invoke([&run_loop](SmbProviderClient::MountCallback callback) { @@ -213,9 +214,6 @@ } TEST_F(SmbServiceTest, Remount_ActiveDirectory) { - const char* kSharePath = "\\\\krbserver\\foobar"; - const char* kRemountPath = "smb://krbserver/foobar"; - file_system_provider::MountOptions mount_options( CreateFileSystemId(base::FilePath(kSharePath), true /* is_kerberos_chromad */), @@ -236,8 +234,8 @@ FROM_HERE, base::BindOnce(std::move(callback), true)); }))); EXPECT_CALL(*mock_client_, - Mount(base::FilePath(kRemountPath), _, kTestDomain, - "ad-test-user", _, true /* skip_connect */, _)) + Mount(base::FilePath(kMountPath), _, kTestDomain, "ad-test-user", + _, true /* skip_connect */, _)) .WillOnce(WithArg<6>( Invoke([&run_loop](SmbProviderClient::MountCallback callback) { std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); @@ -252,6 +250,65 @@ EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); } +TEST_F(SmbServiceTest, Remount_SavedUser) { + file_system_provider::MountOptions mount_options( + CreateFileSystemIdForUser(base::FilePath(kSharePath), + base::StrCat({kTestUser, "@", kTestDomain})), + "Foo"); + ProvidedFileSystemInfo file_system_info( + kProviderId, mount_options, base::FilePath(kSharePath), + false /* configurable */, false /* watchable */, + extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet()); + CreateFspRegistry(profile_); + registry_->RememberFileSystem(file_system_info, {}); + + base::RunLoop run_loop; + EXPECT_CALL(*mock_client_, Mount(base::FilePath(kMountPath), _, kTestDomain, + kTestUser, _, true /* skip_connect */, _)) + .WillOnce(WithArg<6>( + Invoke([&run_loop](SmbProviderClient::MountCallback callback) { + std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); + run_loop.Quit(); + }))); + + CreateService(profile_); + run_loop.Run(); + + // Because the mock is potentially leaked, expectations needs to be manually + // verified. + EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); +} + +TEST_F(SmbServiceTest, Remount_SavedInvalidUser) { + file_system_provider::MountOptions mount_options( + CreateFileSystemIdForUser( + base::FilePath(kSharePath), + base::StrCat({kTestUser, "@", kTestDomain, "@", kTestDomain})), + "Foo"); + ProvidedFileSystemInfo file_system_info( + kProviderId, mount_options, base::FilePath(kSharePath), + false /* configurable */, false /* watchable */, + extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet()); + CreateFspRegistry(profile_); + registry_->RememberFileSystem(file_system_info, {}); + + base::RunLoop run_loop; + EXPECT_CALL(*mock_client_, Mount(base::FilePath(kMountPath), _, "", "", _, + true /* skip_connect */, _)) + .WillOnce(WithArg<6>( + Invoke([&run_loop](SmbProviderClient::MountCallback callback) { + std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); + run_loop.Quit(); + }))); + + CreateService(profile_); + run_loop.Run(); + + // Because the mock is potentially leaked, expectations needs to be manually + // verified. + EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); +} + TEST_F(SmbServiceTest, Premount) { const char kPremountPath[] = "smb://server/foobar"; const char kPreconfiguredShares[] =
diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/download/download_item_model.cc index fabf466..96b07e9 100644 --- a/chrome/browser/download/download_item_model.cc +++ b/chrome/browser/download/download_item_model.cc
@@ -656,7 +656,7 @@ (sb_service ? sb_service->download_protection_service() : nullptr); if (protection_service) protection_service->ShowDetailsForDownload( - *download_, download_commands->GetBrowser()); + download_, download_commands->GetBrowser()); #else // Should only be getting invoked if we are using safe browsing. NOTREACHED();
diff --git a/chrome/browser/engagement/site_engagement_service.cc b/chrome/browser/engagement/site_engagement_service.cc index 07c6d30..57ea702 100644 --- a/chrome/browser/engagement/site_engagement_service.cc +++ b/chrome/browser/engagement/site_engagement_service.cc
@@ -188,10 +188,8 @@ SiteEngagementService::SiteEngagementService(Profile* profile) : SiteEngagementService(profile, base::DefaultClock::GetInstance()) { - content::BrowserThread::PostAfterStartupTask( - FROM_HERE, - base::CreateSingleThreadTaskRunnerWithTraits( - {content::BrowserThread::UI}), + base::PostTaskWithTraits( + FROM_HERE, {content::BrowserThread::UI, base::TaskPriority::BEST_EFFORT}, base::BindOnce(&SiteEngagementService::AfterStartupTask, weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc index 5556209..5e1ea66b 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -10,8 +10,6 @@ #include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/feedback/feedback_dialog_utils.h" -#include "chrome/browser/feedback/feedback_uploader_chrome.h" -#include "chrome/browser/feedback/feedback_uploader_factory_chrome.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/extensions/extension_constants.h" @@ -96,18 +94,6 @@ } }; -class TestFeedbackUploaderDelegate - : public feedback::FeedbackUploaderChrome::Delegate { - public: - explicit TestFeedbackUploaderDelegate(base::RunLoop* quit_on_dispatch) - : quit_on_dispatch_(quit_on_dispatch) {} - - void OnStartDispatchingReport() override { quit_on_dispatch_->Quit(); } - - private: - base::RunLoop* quit_on_dispatch_; -}; - // Disabled for ASan due to flakiness on Mac ASan 64 Tests (1). // See crbug.com/757243. #if defined(ADDRESS_SANITIZER) @@ -317,7 +303,7 @@ EXPECT_TRUE(bool_result); } #endif // if defined(CHROME_OS) - + IN_PROC_BROWSER_TEST_F(FeedbackTest, GetTargetTabUrl) { const std::pair<std::string, std::string> test_cases[] = { {"https://www.google.com/", "https://www.google.com/"}, @@ -354,49 +340,4 @@ DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window); } } - -IN_PROC_BROWSER_TEST_F(FeedbackTest, SubmissionTest) { - WaitForExtensionViewsToLoad(); - - ASSERT_TRUE(IsFeedbackAppAvailable()); - StartFeedbackUI(FeedbackFlow::FEEDBACK_FLOW_GOOGLEINTERNAL, std::string()); - VerifyFeedbackAppLaunch(); - - AppWindow* const window = - PlatformAppBrowserTest::GetFirstAppWindowForBrowser(browser()); - ASSERT_TRUE(window); - content::WebContents* const content = window->web_contents(); - - // Set a delegate for the uploader which will be invoked when the report - // normally would have been uploaded. We have it setup to then quit the - // RunLoop which will then allow us to terminate. - base::RunLoop run_loop; - TestFeedbackUploaderDelegate delegate(&run_loop); - feedback::FeedbackUploaderFactoryChrome::GetInstance() - ->GetForBrowserContext(browser()->profile()) - ->set_feedback_uploader_delegate(&delegate); - - // Click the send button. - bool bool_result = false; - ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - content, - "domAutomationController.send(" - " ((function() {" - " if ($('send-report-button') != null) {" - " document.getElementById('send-report-button').click();" - " return true;" - " }" - " return false;" - " })()));", - &bool_result)); - EXPECT_TRUE(bool_result); - - // This will DCHECK if the JS private API call doesn't return a value, which - // is the main case we are concerned about. - run_loop.Run(); - feedback::FeedbackUploaderFactoryChrome::GetInstance() - ->GetForBrowserContext(browser()->profile()) - ->set_feedback_uploader_delegate(nullptr); -} - } // namespace extensions
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.cc b/chrome/browser/feedback/feedback_uploader_chrome.cc index f0f4f14..37653a1d 100644 --- a/chrome/browser/feedback/feedback_uploader_chrome.cc +++ b/chrome/browser/feedback/feedback_uploader_chrome.cc
@@ -46,9 +46,6 @@ } void FeedbackUploaderChrome::StartDispatchingReport() { - if (delegate_) - delegate_->OnStartDispatchingReport(); - access_token_.clear(); // TODO(crbug.com/849591): Instead of getting the IdentityManager from the
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.h b/chrome/browser/feedback/feedback_uploader_chrome.h index 5a49d651..e26eaf0 100644 --- a/chrome/browser/feedback/feedback_uploader_chrome.h +++ b/chrome/browser/feedback/feedback_uploader_chrome.h
@@ -28,19 +28,6 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~FeedbackUploaderChrome() override; - class Delegate { - public: - // Notifies the delegate when we have started dispatching a feedback report. - virtual void OnStartDispatchingReport() = 0; - - protected: - virtual ~Delegate() = default; - }; - - void set_feedback_uploader_delegate(Delegate* delegate) { - delegate_ = delegate; - } - private: // feedback::FeedbackUploader: void StartDispatchingReport() override; @@ -54,8 +41,6 @@ std::string access_token_; - Delegate* delegate_ = nullptr; // Not owned. - DISALLOW_COPY_AND_ASSIGN(FeedbackUploaderChrome); };
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn index ed765cc..5fdad09 100644 --- a/chrome/browser/media/router/BUILD.gn +++ b/chrome/browser/media/router/BUILD.gn
@@ -142,6 +142,8 @@ if (enable_openscreen) { sources += [ + "providers/openscreen/discovery/open_screen_listener.cc", + "providers/openscreen/discovery/open_screen_listener.h", "providers/openscreen/network_service_async_packet_sender.cc", "providers/openscreen/network_service_async_packet_sender.h", "providers/openscreen/network_service_quic_packet_writer.cc", @@ -152,7 +154,11 @@ configs += [ "//third_party/openscreen/src/build:allow_build_from_embedder" ] - deps += [ "//third_party/openscreen/src/platform" ] + deps += [ + "//third_party/openscreen/src/osp/public", + "//third_party/openscreen/src/osp_base", + "//third_party/openscreen/src/platform", + ] } } }
diff --git a/chrome/browser/media/router/DEPS b/chrome/browser/media/router/DEPS index 2c23f24..0126c6b 100644 --- a/chrome/browser/media/router/DEPS +++ b/chrome/browser/media/router/DEPS
@@ -1,4 +1,6 @@ include_rules = [ "+services/network", - "+third_party/openscreen/src" + "+third_party/openscreen/src/osp/public", + "+third_party/openscreen/src/osp_base", + "+third_party/openscreen/src/platform/api", ]
diff --git a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc new file mode 100644 index 0000000..a283dffa --- /dev/null +++ b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc
@@ -0,0 +1,186 @@ +// 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. + +#include "chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h" + +#include <utility> + +namespace media_router { +namespace { +const char kOpenScreenServiceType[] = "openscreen_.udp_"; + +openscreen::ServiceInfo ServiceInfoFromServiceDescription( + const local_discovery::ServiceDescription& desc) { + openscreen::ErrorOr<openscreen::IPAddress> address = + openscreen::IPAddress::Parse(desc.address.host()); + DCHECK(address); + + openscreen::ServiceInfo service_info; + service_info.service_id = desc.service_name; + service_info.friendly_name = desc.instance_name(); + + if (address.value().IsV4()) { + service_info.v4_endpoint = + openscreen::IPEndpoint{address.value(), desc.address.port()}; + service_info.v6_endpoint = {}; + } else { + service_info.v4_endpoint = {}; + service_info.v6_endpoint = + openscreen::IPEndpoint{address.value(), desc.address.port()}; + } + + return service_info; +} +} // namespace + +OpenScreenListener::OpenScreenListener(std::string service_type) + : service_type_(kOpenScreenServiceType) {} + +OpenScreenListener::~OpenScreenListener() {} + +bool OpenScreenListener::Start() { + is_running_ = true; + + // TODO(jophba): instantiate local_discovery::ServiceDiscoveryClient + for (auto* observer : observers_) { + observer->OnStarted(); + } + return true; +} + +bool OpenScreenListener::StartAndSuspend() { + for (auto* observer : observers_) { + observer->OnStarted(); + observer->OnSuspended(); + } + return true; +} + +bool OpenScreenListener::Stop() { + DCHECK(is_running_); + is_running_ = false; + for (auto* observer : observers_) { + observer->OnStopped(); + } + return true; +} + +bool OpenScreenListener::Suspend() { + DCHECK(is_running_); + is_running_ = false; + for (auto* observer : observers_) { + observer->OnSuspended(); + } + return true; +} + +bool OpenScreenListener::Resume() { + DCHECK(!is_running_); + is_running_ = true; + for (auto* observer : observers_) { + observer->OnStarted(); + } + return true; +} + +bool OpenScreenListener::SearchNow() { + is_running_ = true; + for (auto* observer : observers_) { + observer->OnSearching(); + } + return true; +} + +const std::vector<openscreen::ServiceInfo>& OpenScreenListener::GetReceivers() + const { + return receivers_; +} + +void OpenScreenListener::AddObserver(ServiceListener::Observer* observer) { + CHECK(observer); + observers_.push_back(observer); +} + +void OpenScreenListener::RemoveObserver(ServiceListener::Observer* observer) { + CHECK(observer); + observers_.erase(std::remove(observers_.begin(), observers_.end(), observer), + observers_.end()); +} + +void OpenScreenListener::RunTasks() {} + +void OpenScreenListener::OnDeviceChanged( + const std::string& service_type, + bool added, + const local_discovery::ServiceDescription& service_description) { + CHECK_EQ(service_type, service_type_); + if (!is_running_) { + return; + } + + openscreen::ServiceInfo service_info = + ServiceInfoFromServiceDescription(service_description); + if (added) { + receivers_.push_back(std::move(service_info)); + + const openscreen::ServiceInfo& ref = receivers_.back(); + for (auto* observer : observers_) { + observer->OnReceiverAdded(ref); + } + } else { + auto it = + std::find_if(receivers_.begin(), receivers_.end(), + [&service_info](const openscreen::ServiceInfo& info) { + return info.service_id == service_info.service_id; + }); + + *it = std::move(service_info); + + for (auto* observer : observers_) { + observer->OnReceiverChanged(*it); + } + } +} + +void OpenScreenListener::OnDeviceRemoved(const std::string& service_type, + const std::string& service_name) { + CHECK(service_type == service_type_); + if (!is_running_) { + return; + } + + const auto& removed_it = + std::find_if(receivers_.begin(), receivers_.end(), + [&service_name](openscreen::ServiceInfo& info) { + return info.service_id == service_name; + }); + + // Move the receiver we want to remove to the end, so we don't have to shift. + DCHECK(removed_it != receivers_.end()); + const openscreen::ServiceInfo removed_info = std::move(*removed_it); + if (removed_it != receivers_.end() - 1) { + *removed_it = std::move(receivers_.back()); + } + receivers_.pop_back(); + + for (auto* observer : observers_) { + observer->OnReceiverRemoved(removed_info); + } +} + +void OpenScreenListener::OnDeviceCacheFlushed(const std::string& service_type) { + CHECK(service_type == service_type_); + receivers_.clear(); + + // We still flush even if not running, since it's not going to be accurate. + if (!is_running_) { + return; + } + + for (auto* observer : observers_) { + observer->OnAllReceiversRemoved(); + } +} + +} // namespace media_router
diff --git a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h new file mode 100644 index 0000000..6ba7c2a --- /dev/null +++ b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h
@@ -0,0 +1,60 @@ +// 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_MEDIA_ROUTER_PROVIDERS_OPENSCREEN_DISCOVERY_OPEN_SCREEN_LISTENER_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_OPENSCREEN_DISCOVERY_OPEN_SCREEN_LISTENER_H_ + +#include <string> +#include <vector> + +#include "chrome/browser/local_discovery/service_discovery_device_lister.h" + +#include "third_party/openscreen/src/osp/public/service_info.h" +#include "third_party/openscreen/src/osp/public/service_listener.h" +#include "third_party/openscreen/src/osp_base/ip_address.h" + +namespace media_router { +class OpenScreenListener + : public openscreen::ServiceListener, + local_discovery::ServiceDiscoveryDeviceLister::Delegate { + public: + explicit OpenScreenListener(std::string service_type); + + // ServiceListener overrides + ~OpenScreenListener() override; + + bool Start() override; + bool StartAndSuspend() override; + bool Stop() override; + bool Suspend() override; + bool Resume() override; + bool SearchNow() override; + + const std::vector<openscreen::ServiceInfo>& GetReceivers() const override; + void AddObserver(ServiceListener::Observer* observer) override; + void RemoveObserver(ServiceListener::Observer* observer) override; + + void RunTasks() override; + + // ServiceDiscoveryDeviceLister::Delegate + void OnDeviceChanged( + const std::string& service_type, + bool added, + const local_discovery::ServiceDescription& service_description) override; + + void OnDeviceRemoved(const std::string& service_type, + const std::string& service_name) override; + void OnDeviceCacheFlushed(const std::string& service_type) override; + + private: + bool is_running_ = false; + const std::string service_type_; + std::vector<openscreen::ServiceInfo> receivers_; + + DISALLOW_COPY_AND_ASSIGN(OpenScreenListener); +}; + +} // namespace media_router + +#endif // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_OPENSCREEN_DISCOVERY_OPEN_SCREEN_LISTENER_H_
diff --git a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc new file mode 100644 index 0000000..ba4188f7 --- /dev/null +++ b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc
@@ -0,0 +1,210 @@ +// 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. + +#include "chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h" + +#include "base/time/time.h" +#include "net/base/host_port_pair.h" +#include "net/base/ip_address.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::Invoke; +using ::testing::Return; +using ::testing::StrictMock; +using ::testing::WithArg; + +namespace media_router { + +const char kServiceType[] = "openscreen_.udp_"; + +class MockServiceListenerObserver + : public openscreen::ServiceListener::Observer { + public: + MOCK_METHOD0(OnStarted, void()); + MOCK_METHOD0(OnStopped, void()); + MOCK_METHOD0(OnSuspended, void()); + MOCK_METHOD0(OnSearching, void()); + + MOCK_METHOD1(OnReceiverAdded, void(const openscreen::ServiceInfo&)); + MOCK_METHOD1(OnReceiverChanged, void(const openscreen::ServiceInfo&)); + MOCK_METHOD1(OnReceiverRemoved, void(const openscreen::ServiceInfo&)); + MOCK_METHOD0(OnAllReceiversRemoved, void()); + + MOCK_METHOD1(OnError, void(openscreen::ServiceListenerError)); + MOCK_METHOD1(OnMetrics, void(openscreen::ServiceListener::Metrics)); +}; + +// Although the testing framework can do a byte comparison, when it fails +// it's difficult to figure out *exactly* what is wrong with the actual +// Service Info class. +MATCHER_P(ServiceInfoEquals, expected, "") { + return (expected.service_id == arg.service_id) && + (expected.friendly_name == arg.friendly_name) && + (expected.network_interface_index == arg.network_interface_index) && + (expected.v4_endpoint == arg.v4_endpoint) && + (expected.v6_endpoint == arg.v6_endpoint); +} + +class OpenScreenListenerTest : public ::testing::Test { + protected: + void SetUp() override { + valid_description_.service_name = "mock_service.test_service_type"; + valid_description_.address = net::HostPortPair("192.168.0.10", 8888); + valid_description_.metadata = {"foo", "bar", "baz"}; + valid_description_.ip_address = net::IPAddress(192, 168, 0, 10); + valid_description_.last_seen = base::Time(); + + service_info_.service_id = "mock_service.test_service_type"; + service_info_.friendly_name = "mock_service"; + service_info_.v4_endpoint = + openscreen::IPEndpoint{openscreen::IPAddress(192, 168, 0, 10), 8888}; + service_info_.v6_endpoint = {}; + } + + OpenScreenListenerTest() : listener(kServiceType), observer() { + listener.AddObserver(&observer); + } + + void ExpectReceiverAdded(const openscreen::ServiceInfo& info) { + EXPECT_CALL(observer, OnReceiverAdded(ServiceInfoEquals(info))); + } + + void ExpectReceiverChanged(const openscreen::ServiceInfo& info) { + EXPECT_CALL(observer, OnReceiverChanged(ServiceInfoEquals(info))); + } + + void ExpectReceiverRemoved(const openscreen::ServiceInfo& info) { + EXPECT_CALL(observer, OnReceiverRemoved(ServiceInfoEquals(info))); + } + + OpenScreenListener listener; + StrictMock<MockServiceListenerObserver> observer; + local_discovery::ServiceDescription valid_description_; + openscreen::ServiceInfo service_info_; +}; + +TEST_F(OpenScreenListenerTest, DeviceAddedNotifiesObserversIfStarted) { + listener.OnDeviceChanged(kServiceType, true, valid_description_); + + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); + ExpectReceiverAdded(service_info_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); +} + +TEST_F(OpenScreenListenerTest, DeviceChangedNotifiesObserversIfStarted) { + listener.OnDeviceChanged(kServiceType, false, valid_description_); + + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); + ExpectReceiverAdded(service_info_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + + ExpectReceiverChanged(service_info_); + listener.OnDeviceChanged(kServiceType, false, valid_description_); +} + +TEST_F(OpenScreenListenerTest, DeviceRemovedNotifiesObserversIfStarted) { + listener.OnDeviceRemoved(kServiceType, valid_description_.service_name); + + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); + ExpectReceiverAdded(service_info_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + + ExpectReceiverRemoved(service_info_); + listener.OnDeviceRemoved(kServiceType, valid_description_.service_name); +} + +TEST_F(OpenScreenListenerTest, CachedFlushNotifiesObserversIfStarted) { + listener.OnDeviceCacheFlushed(kServiceType); + + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); + EXPECT_CALL(observer, OnAllReceiversRemoved()).Times(1); + listener.OnDeviceCacheFlushed(kServiceType); +} + +TEST_F(OpenScreenListenerTest, CachedFlushEmptiesReceiverList) { + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); + + ExpectReceiverAdded(service_info_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + + ExpectReceiverAdded(service_info_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + + EXPECT_EQ(2ul, listener.GetReceivers().size()); + EXPECT_CALL(observer, OnAllReceiversRemoved()).Times(1); + listener.OnDeviceCacheFlushed(kServiceType); + EXPECT_EQ(0ul, listener.GetReceivers().size()); +} + +TEST_F(OpenScreenListenerTest, StartNotifiesObservers) { + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); +} + +TEST_F(OpenScreenListenerTest, StopNotifiesObservers) { + EXPECT_CALL(observer, OnStarted()).Times(1); + EXPECT_CALL(observer, OnStopped()).Times(1); + + listener.Start(); + listener.Stop(); +} + +TEST_F(OpenScreenListenerTest, SuspendNotifiesObservers) { + EXPECT_CALL(observer, OnStarted()).Times(2); + EXPECT_CALL(observer, OnSuspended()).Times(2); + + listener.Start(); + listener.Suspend(); + listener.StartAndSuspend(); +} + +TEST_F(OpenScreenListenerTest, ResumeNotifiesObservers) { + EXPECT_CALL(observer, OnStarted()).Times(2); + EXPECT_CALL(observer, OnSuspended()).Times(1); + + listener.Start(); + listener.Suspend(); + listener.Resume(); +} + +TEST_F(OpenScreenListenerTest, SearchingNotifiesObservers) { + EXPECT_CALL(observer, OnStarted()).Times(1); + listener.Start(); + EXPECT_CALL(observer, OnSearching()).Times(1); + listener.SearchNow(); +} + +TEST_F(OpenScreenListenerTest, RemovedObserversDoNotGetNotified) { + listener.RemoveObserver(&observer); + + listener.Start(); + listener.Stop(); + listener.StartAndSuspend(); + listener.Resume(); + listener.SearchNow(); + listener.Suspend(); + listener.Resume(); + listener.OnDeviceCacheFlushed(kServiceType); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + listener.OnDeviceRemoved(kServiceType, valid_description_.service_name); +} + +TEST_F(OpenScreenListenerTest, DoesNotRecordReceiversIfNotStarted) { + EXPECT_EQ(0ul, listener.GetReceivers().size()); + + listener.OnDeviceChanged(kServiceType, true, valid_description_); + listener.OnDeviceChanged(kServiceType, false, valid_description_); + listener.OnDeviceChanged(kServiceType, true, valid_description_); + EXPECT_EQ(0ul, listener.GetReceivers().size()); +} +} // namespace media_router
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc index 0a6e2324..8eeed2fd 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc +++ b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc
@@ -11,7 +11,7 @@ #include "mojo/public/cpp/bindings/interface_request.h" -namespace openscreen { +namespace media_router { NetworkServiceAsyncPacketSender::NetworkServiceAsyncPacketSender( network::mojom::NetworkContext* network_context) { network::mojom::UDPSocketRequest socket_request(mojo::MakeRequest(&socket_)); @@ -39,4 +39,4 @@ return net::Error::OK; } -} // namespace openscreen +} // namespace media_router
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.h b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.h index a59e6e8..92e8c9d0 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.h +++ b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.h
@@ -13,7 +13,7 @@ #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/udp_socket.mojom.h" -namespace openscreen { +namespace media_router { class AsyncPacketSender { public: virtual ~AsyncPacketSender() {} @@ -41,6 +41,6 @@ DISALLOW_COPY_AND_ASSIGN(NetworkServiceAsyncPacketSender); }; -} // namespace openscreen +} // namespace media_router #endif // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_OPENSCREEN_NETWORK_SERVICE_ASYNC_PACKET_SENDER_H_
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.cc b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.cc index a01563a..3f375b7 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.cc +++ b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.cc
@@ -16,7 +16,7 @@ #include "net/base/ip_endpoint.h" #include "net/third_party/quiche/src/quic/core/quic_constants.h" -namespace openscreen { +namespace media_router { namespace { // Set a reasonable maximum number of packets in flight, for a total of @@ -165,4 +165,4 @@ UpdateIsWriteBlocked(); } -} // namespace openscreen +} // namespace media_router
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h index 61dba25..01b1f63 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h +++ b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h
@@ -19,7 +19,7 @@ #include "chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.h" -namespace openscreen { +namespace media_router { // Chrome-specific packet writer. Intended for use outside of the Network // service, this class uses the network service's UdpSocket for sending and @@ -117,6 +117,6 @@ DISALLOW_COPY_AND_ASSIGN(NetworkServiceQuicPacketWriter); }; -} // namespace openscreen +} // namespace media_router #endif // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_OPENSCREEN_NETWORK_SERVICE_QUIC_PACKET_WRITER_H_
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer_unittest.cc b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer_unittest.cc index bd3ad1b4..3d8b806 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer_unittest.cc +++ b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer_unittest.cc
@@ -13,7 +13,7 @@ #include "media/base/fake_single_thread_task_runner.h" #include "net/base/net_errors.h" -namespace openscreen { +namespace media_router { using ::testing::_; using ::testing::Invoke; using ::testing::Return; @@ -267,4 +267,4 @@ ASSERT_FALSE(test_writer.writer->IsWriteBlocked()); } -} // namespace openscreen +} // namespace media_router
diff --git a/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc b/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc index 7bdec94..9709428 100644 --- a/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc +++ b/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" +#include "chrome/browser/notifications/scheduler/internal/background_task_coordinator.h" #include "chrome/browser/notifications/scheduler/internal/display_decider.h" #include "chrome/browser/notifications/scheduler/internal/distribution_policy.h" #include "chrome/browser/notifications/scheduler/internal/icon_store.h" @@ -187,9 +188,15 @@ } void ScheduleBackgroundTask() { - // TODO(xingliu): Implements a class to determine the next background task - // based on scheduled notification data. - NOTIMPLEMENTED(); + BackgroundTaskCoordinator::Notifications notifications; + context_->notification_manager()->GetAllNotifications(¬ifications); + BackgroundTaskCoordinator::ClientStates client_states; + context_->impression_tracker()->GetClientStates(&client_states); + + // TODO(xingliu): Pass SchedulerTaskTime from background task. + context_->background_task_coordinator()->ScheduleBackgroundTask( + std::move(notifications), std::move(client_states), + SchedulerTaskTime::kMorning); } void OnClick(const std::string& notification_id) override {
diff --git a/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.cc b/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.cc index b70faa5..1ba5799 100644 --- a/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.cc +++ b/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.cc
@@ -6,6 +6,8 @@ #include <utility> +#include "base/time/default_clock.h" +#include "chrome/browser/notifications/scheduler/internal/background_task_coordinator.h" #include "chrome/browser/notifications/scheduler/internal/display_decider.h" #include "chrome/browser/notifications/scheduler/internal/icon_store.h" #include "chrome/browser/notifications/scheduler/internal/impression_history_tracker.h" @@ -18,18 +20,21 @@ NotificationSchedulerContext::NotificationSchedulerContext( std::unique_ptr<NotificationSchedulerClientRegistrar> client_registrar, - std::unique_ptr<NotificationBackgroundTaskScheduler> scheduler, + std::unique_ptr<NotificationBackgroundTaskScheduler> background_task, std::unique_ptr<IconStore> icon_store, std::unique_ptr<ImpressionHistoryTracker> impression_tracker, std::unique_ptr<ScheduledNotificationManager> notification_manager, std::unique_ptr<DisplayDecider> display_decider, std::unique_ptr<SchedulerConfig> config) : client_registrar_(std::move(client_registrar)), - background_task_scheduler_(std::move(scheduler)), impression_tracker_(std::move(impression_tracker)), notification_manager_(std::move(notification_manager)), display_decider_(std::move(display_decider)), - config_(std::move(config)) {} + config_(std::move(config)), + background_task_coordinator_(std::make_unique<BackgroundTaskCoordinator>( + std::move(background_task), + config_.get(), + base::DefaultClock::GetInstance())) {} NotificationSchedulerContext::~NotificationSchedulerContext() = default;
diff --git a/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.h b/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.h index 86aa260..b00d728d 100644 --- a/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.h +++ b/chrome/browser/notifications/scheduler/internal/notification_scheduler_context.h
@@ -13,6 +13,7 @@ namespace notifications { +class BackgroundTaskCoordinator; class DisplayDecider; class IconStore; class ImpressionHistoryTracker; @@ -27,7 +28,7 @@ public: NotificationSchedulerContext( std::unique_ptr<NotificationSchedulerClientRegistrar> client_registrar, - std::unique_ptr<NotificationBackgroundTaskScheduler> scheduler, + std::unique_ptr<NotificationBackgroundTaskScheduler> background_task, std::unique_ptr<IconStore> icon_store, std::unique_ptr<ImpressionHistoryTracker> impression_tracker, std::unique_ptr<ScheduledNotificationManager> notification_manager, @@ -39,8 +40,8 @@ return client_registrar_.get(); } - NotificationBackgroundTaskScheduler* background_task_scheduler() { - return background_task_scheduler_.get(); + BackgroundTaskCoordinator* background_task_coordinator() { + return background_task_coordinator_.get(); } IconStore* icon_store() { return icon_store_.get(); } @@ -61,10 +62,6 @@ // Holds a list of clients using the notification scheduler system. std::unique_ptr<NotificationSchedulerClientRegistrar> client_registrar_; - // Used to schedule background task in OS level. - std::unique_ptr<NotificationBackgroundTaskScheduler> - background_task_scheduler_; - // Stores notification icons. std::unique_ptr<IconStore> icon_store_; @@ -80,6 +77,9 @@ // System configuration. std::unique_ptr<SchedulerConfig> config_; + // Used to schedule background task in OS level. + std::unique_ptr<BackgroundTaskCoordinator> background_task_coordinator_; + DISALLOW_COPY_AND_ASSIGN(NotificationSchedulerContext); };
diff --git a/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.cc index 8f7f0cac..0976d44f 100644 --- a/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.cc
@@ -44,6 +44,8 @@ SchemePageLoadMetricsObserver::OnCommit( content::NavigationHandle* navigation_handle, ukm::SourceId source_id) { + // Capture committed transition type. + transition_ = navigation_handle->GetPageTransition(); if (navigation_handle->GetURL().scheme() == url::kHttpScheme || navigation_handle->GetURL().scheme() == url::kHttpsScheme) { return CONTINUE_OBSERVING; @@ -106,6 +108,17 @@ "PageLoad.Clients.Scheme.HTTP.PaintTiming.UnderStat"; static constexpr char kUnderStatHistogramHttps[] = "PageLoad.Clients.Scheme.HTTPS.PaintTiming.UnderStat"; + static constexpr char kUnderStatHistogramHttpUserNewNav[] = + "PageLoad.Clients.Scheme.HTTP.PaintTiming.UnderStat.UserInitiated." + "NewNavigation"; + static constexpr char kUnderStatHistogramHttpsUserNewNav[] = + "PageLoad.Clients.Scheme.HTTPS.PaintTiming.UnderStat.UserInitiated." + "NewNavigation"; + + bool is_user_initiated = extra_info.user_initiated_info.browser_initiated || + extra_info.user_initiated_info.user_gesture; + bool is_user_initiated_new_navigation = + is_user_initiated && ui::PageTransitionIsNewNavigation(transition_); // Record understat metrics for the time to first contentful paint. static constexpr const int kUnderStatRecordingIntervalsSeconds[] = {1, 2, 5, @@ -119,6 +132,12 @@ ? kUnderStatHistogramHttp : kUnderStatHistogramHttps, PageLoadTimingUnderStat::kTotal); + if (is_user_initiated_new_navigation) { + base::UmaHistogramEnumeration(extra_info.url.scheme() == url::kHttpScheme + ? kUnderStatHistogramHttpUserNewNav + : kUnderStatHistogramHttpsUserNewNav, + PageLoadTimingUnderStat::kTotal); + } for (size_t index = 0; index < base::size(kUnderStatRecordingIntervalsSeconds); ++index) { @@ -130,6 +149,13 @@ ? kUnderStatHistogramHttp : kUnderStatHistogramHttps, static_cast<PageLoadTimingUnderStat>(index + 1)); + if (is_user_initiated_new_navigation) { + base::UmaHistogramEnumeration( + extra_info.url.scheme() == url::kHttpScheme + ? kUnderStatHistogramHttpUserNewNav + : kUnderStatHistogramHttpsUserNewNav, + static_cast<PageLoadTimingUnderStat>(index + 1)); + } } } }
diff --git a/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.h index a550254..8f43ba42 100644 --- a/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.h +++ b/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer.h
@@ -38,6 +38,9 @@ const page_load_metrics::PageLoadExtraInfo& extra_info) override; private: + // The ui transition for the committed navigation. + ui::PageTransition transition_ = ui::PAGE_TRANSITION_FIRST; + DISALLOW_COPY_AND_ASSIGN(SchemePageLoadMetricsObserver); };
diff --git a/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer_unittest.cc index 5e28228..4b1d421 100644 --- a/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/scheme_page_load_metrics_observer_unittest.cc
@@ -41,8 +41,10 @@ PopulateRequiredTimingFields(timing); } - void SimulateNavigation(std::string scheme) { - NavigateAndCommit(GURL(scheme.append("://google.com"))); + void SimulateNavigation( + std::string scheme, + ui::PageTransition transition = ui::PAGE_TRANSITION_LINK) { + NavigateAndCommit(GURL(scheme.append("://google.com")), transition); page_load_metrics::mojom::PageLoadTiming timing; InitializeTestPageLoadTiming(&timing); @@ -88,7 +90,9 @@ return 0; } - void CheckHistograms(int expected_count, const std::string& protocol) { + void CheckHistograms(int expected_count, + const std::string& protocol, + bool new_navigation = true) { EXPECT_EQ(expected_count, CountTotalProtocolMetricsRecorded(protocol)); if (expected_count == 0) return; @@ -99,6 +103,8 @@ std::string fcp_histogram_name( prefix + ".PaintTiming.NavigationToFirstContentfulPaint"); std::string fcp_understat_histogram_name(prefix + ".PaintTiming.UnderStat"); + std::string fcp_understat_new_nav_histogram_name( + fcp_understat_histogram_name + ".UserInitiated.NewNavigation"); histogram_tester().ExpectTotalCount( prefix + ".ParseTiming.NavigationToParseStart", 1); @@ -113,6 +119,13 @@ 1); histogram_tester().ExpectBucketCount(fcp_understat_histogram_name, 0, 1); + if (new_navigation) { + histogram_tester().ExpectBucketCount(fcp_understat_new_nav_histogram_name, + 0, 1); + } else { + histogram_tester().ExpectTotalCount(fcp_understat_new_nav_histogram_name, + 0); + } // Must remain synchronized with the array of the same name in // scheme_page_load_metrics_observer.cc. @@ -129,6 +142,10 @@ if (recorded_fcp_value <= threshold) { histogram_tester().ExpectBucketCount(fcp_understat_histogram_name, index + 1, 1); + if (new_navigation) { + histogram_tester().ExpectBucketCount( + fcp_understat_new_nav_histogram_name, index + 1, 1); + } } } @@ -158,3 +175,13 @@ SimulateNavigation(url::kAboutScheme); CheckHistograms(0, ""); } + +TEST_F(SchemePageLoadMetricsObserverTest, HTTPForwardBackNavigation) { + SimulateNavigation(url::kHttpScheme, ui::PAGE_TRANSITION_FORWARD_BACK); + CheckHistograms(6, url::kHttpScheme, false /* new_navigation */); +} + +TEST_F(SchemePageLoadMetricsObserverTest, HTTPSReloadNavigation) { + SimulateNavigation(url::kHttpsScheme, ui::PAGE_TRANSITION_RELOAD); + CheckHistograms(6, url::kHttpsScheme, false /* new_navigation */); +}
diff --git a/chrome/browser/policy/test/policy_testserver.py b/chrome/browser/policy/test/policy_testserver.py index a2ee88e..dbf49275 100644 --- a/chrome/browser/policy/test/policy_testserver.py +++ b/chrome/browser/policy/test/policy_testserver.py
@@ -62,6 +62,13 @@ "register": 500, } "allow_set_device_attributes" : false, + "initial_enrollment_state": { + "TEST_serial": { + "initial_enrollment_mode": 2, + "management_domain": "test-domain.com", + "is_license_packaged_with_device": true + } + } } """ @@ -327,6 +334,9 @@ response = self.ProcessPolicy(rmsg, request_type) elif request_type == 'enterprise_check': response = self.ProcessAutoEnrollment(rmsg.auto_enrollment_request) + elif request_type == 'device_initial_enrollment_state': + response = self.ProcessDeviceInitialEnrollmentState( + rmsg.device_initial_enrollment_state_request) elif request_type == 'device_state_retrieval': response = self.ProcessDeviceStateRetrievalRequest( rmsg.device_state_retrieval_request) @@ -638,7 +648,7 @@ """Handles an auto-enrollment check request. The reply depends on the value of the modulus: - 1: replies with no new modulus and the sha256 hash of "0" + 1: replies with no new modulus and corresponding sha256 hashes. 2: replies with a new modulus, 4. 4: replies with a new modulus, 2. 8: fails with error 400. @@ -657,8 +667,14 @@ auto_enrollment_response = dm.DeviceAutoEnrollmentResponse() if msg.modulus == 1: - auto_enrollment_response.hashes.extend( - self.server.GetMatchingStateKeyHashes(msg.modulus, msg.remainder)) + if (msg.enrollment_check_type == dm.DeviceAutoEnrollmentRequest. + ENROLLMENT_CHECK_TYPE_FRE): + auto_enrollment_response.hashes.extend( + self.server.GetMatchingStateKeyHashes(msg.modulus, msg.remainder)) + elif (msg.enrollment_check_type == dm.DeviceAutoEnrollmentRequest. + ENROLLMENT_CHECK_TYPE_FORCED_ENROLLMENT): + auto_enrollment_response.hashes.extend( + self.server.GetMatchingSerialHashes(msg.modulus, msg.remainder)) elif msg.modulus == 2: auto_enrollment_response.expected_modulus = 4 elif msg.modulus == 4: @@ -674,6 +690,36 @@ response.auto_enrollment_response.CopyFrom(auto_enrollment_response) return (200, response) + def ProcessDeviceInitialEnrollmentState(self, msg): + """Handles a device initial enrollment state request. + + Response data is taken from server configuration. + + Returns: + A tuple of HTTP status code and response data to send to the client. + """ + device_initial_enrollment_state_response = ( + dm.DeviceInitialEnrollmentStateResponse()) + + brand_serial_id = msg.brand_code + '_' + msg.serial_number; + initial_state_dict = (self.server.GetPolicies(). + get('initial_enrollment_state', {})) + state = initial_state_dict.get(brand_serial_id, {}) + + FIELDS = [ + 'initial_enrollment_mode', + 'management_domain', + 'is_license_packaged_with_device', + ] + for field in FIELDS: + if field in state: + setattr(device_initial_enrollment_state_response, field, state[field]) + + response = dm.DeviceManagementResponse() + response.device_initial_enrollment_state_response.CopyFrom( + device_initial_enrollment_state_response) + return (200, response) + def ProcessDeviceStateRetrievalRequest(self, msg): """Handles a device state retrieval request. @@ -1533,6 +1579,21 @@ lambda hash : int(hash.encode('hex'), 16) % modulus == remainder, hashed_keys) + def GetMatchingSerialHashes(self, modulus, remainder): + """Returns all serial hashes from configuration. + + Returns: + The list of hashes + """ + brand_serial_keys = (self.GetPolicies().get('initial_enrollment_state', {}). + keys()) + hashed_keys = map(lambda key: hashlib.sha256(key).digest()[0:8], + brand_serial_keys) + return filter( + lambda hash : int(hash.encode('hex'), 16) % modulus == remainder, + hashed_keys) + + def UnregisterDevice(self, dmtoken): """Unregisters a device identified by the given DM token.
diff --git a/chrome/browser/resources/chromeos/camera/src/js/metrics.js b/chrome/browser/resources/chromeos/camera/src/js/metrics.js index 9368456..61919b61 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/metrics.js +++ b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
@@ -101,11 +101,15 @@ * @private */ cca.metrics.captureType_ = function(facingMode, length, [width, height]) { - var condState = (states, cond) => { + var condState = (states, cond, strict) => { // Return the first existing state among the given states only if there is // no gate condition or the condition is met. const prerequisite = !cond || cca.state.get(cond); - return prerequisite && states.find((state) => cca.state.get(state)) || ''; + if (strict && !prerequisite) { + return ''; + } + return prerequisite && states.find((state) => cca.state.get(state)) || + 'n/a'; }; return cca.metrics.base_.category('capture') @@ -116,7 +120,7 @@ .dimen(4, condState(['mirror'])) .dimen(5, condState(['_3x3', '_4x4', 'golden'], 'grid')) .dimen(6, condState(['_3sec', '_10sec'], 'timer')) - .dimen(7, condState(['mic'], 'video-mode')) + .dimen(7, condState(['mic'], 'video-mode', true)) .dimen(8, condState(['max-wnd'])) .dimen(9, condState(['tall'])) .dimen(10, `${width}x${height}`)
diff --git a/chrome/browser/resources/chromeos/first_run/app/main.html b/chrome/browser/resources/chromeos/first_run/app/main.html index 8ce5527..255f718 100644 --- a/chrome/browser/resources/chromeos/first_run/app/main.html +++ b/chrome/browser/resources/chromeos/first_run/app/main.html
@@ -8,7 +8,6 @@ <link rel="stylesheet" href="chrome://resources/css/apps/common.css"> <link rel="stylesheet" href="chrome://resources/css/apps/topbutton_bar.css"> <link rel="stylesheet" href="../step.css"> - <link rel="stylesheet" href="../preload.css"> <link rel="stylesheet" href="style.css"> <script src="chrome://resources/js/load_time_data.js"></script> <script src="chrome://resources/js/util.js"></script>
diff --git a/chrome/browser/resources/chromeos/first_run/first_run.html b/chrome/browser/resources/chromeos/first_run/first_run.html index 44cf341..d638ee9 100644 --- a/chrome/browser/resources/chromeos/first_run/first_run.html +++ b/chrome/browser/resources/chromeos/first_run/first_run.html
@@ -8,7 +8,6 @@ <link rel="stylesheet" href="chrome://resources/css/apps/common.css"> <link rel="stylesheet" href="bubble.css"> <link rel="stylesheet" href="first_run.css"> - <link rel="stylesheet" href="preload.css"> <link rel="stylesheet" href="step.css"> <link rel="stylesheet" href="step_bubble.css"> <script src="chrome://resources/js/cr.js"></script>
diff --git a/chrome/browser/resources/chromeos/first_run/preload.css b/chrome/browser/resources/chromeos/first_run/preload.css deleted file mode 100644 index 36b9442..0000000 --- a/chrome/browser/resources/chromeos/first_run/preload.css +++ /dev/null
@@ -1,49 +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. */ - -/* Preloads images. Without preloading, background image starts loading in - * the moment when CSS property is applied. Image loading has visible delay and - * looks like defect. */ - -@media all and (-webkit-max-device-pixel-ratio: 1.5) { - body::after { - content: - url(chrome://resources/images/apps/button.png) - url(chrome://resources/images/apps/button_hover.png) - url(chrome://resources/images/apps/button_pressed.png) - url(chrome://resources/images/apps/button_focused.png) - url(chrome://resources/images/apps/button_focused_hover.png) - url(chrome://resources/images/apps/button_focused_pressed.png) - url(chrome://resources/images/apps/button_inactive.png) - url(chrome://resources/images/apps/blue_button.png) - url(chrome://resources/images/apps/blue_button_hover.png) - url(chrome://resources/images/apps/blue_button_pressed.png) - url(chrome://resources/images/apps/blue_button_focused.png) - url(chrome://resources/images/apps/blue_button_focused_hover.png) - url(chrome://resources/images/apps/blue_button_focused_pressed.png) - url(chrome://resources/images/apps/blue_button_inactive.png); - display: none; - } -} - -@media all and (-webkit-min-device-pixel-ratio: 1.5) { - body::after { - content: - url(chrome://resources/images/2x/apps/button.png) - url(chrome://resources/images/2x/apps/button_hover.png) - url(chrome://resources/images/2x/apps/button_pressed.png) - url(chrome://resources/images/2x/apps/button_focused.png) - url(chrome://resources/images/2x/apps/button_focused_hover.png) - url(chrome://resources/images/2x/apps/button_focused_pressed.png) - url(chrome://resources/images/2x/apps/button_inactive.png) - url(chrome://resources/images/2x/apps/blue_button.png) - url(chrome://resources/images/2x/apps/blue_button_hover.png) - url(chrome://resources/images/2x/apps/blue_button_pressed.png) - url(chrome://resources/images/2x/apps/blue_button_focused.png) - url(chrome://resources/images/2x/apps/blue_button_focused_hover.png) - url(chrome://resources/images/2x/apps/blue_button_focused_pressed.png) - url(chrome://resources/images/2x/apps/blue_button_inactive.png); - display: none; - } -}
diff --git a/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.html b/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.html index 8ef779d..388d17cbe 100644 --- a/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.html +++ b/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.html
@@ -170,9 +170,15 @@ value="{{activePrinter.ppdModel}}"> </cr-searchable-drop-down> </div> + <div id="ppdLabel" class="field-label"> + <span>$i18n{selectDriver}</span> + <a href="$i18n{printingCUPSPrintPpdLearnMoreUrl}" target="_blank"> + $i18n{learnMore} + </a> + </div> <div class="settings-box two-line"> <cr-input class="browse-file-input" readonly value="[[newUserPPD_]]" - label="$i18n{selectDriver}" invalid="[[invalidPPD_]]" + aria-labelledby="ppdLabel" invalid="[[invalidPPD_]]" error-message="$i18n{selectDriverErrorMessage}" tabindex="-1"> </cr-input> <paper-button class="browse-button" on-click="onBrowseFile_">
diff --git a/chrome/browser/resources/settings/printing_page/cups_edit_printer_dialog.html b/chrome/browser/resources/settings/printing_page/cups_edit_printer_dialog.html index 7a1da54..8947b67a 100644 --- a/chrome/browser/resources/settings/printing_page/cups_edit_printer_dialog.html +++ b/chrome/browser/resources/settings/printing_page/cups_edit_printer_dialog.html
@@ -97,9 +97,15 @@ value="{{pendingPrinter_.ppdModel}}"> </cr-searchable-drop-down> </div> + <div id="ppdLabel" class="field-label"> + <span>$i18n{selectDriver}</span> + <a href="$i18n{printingCUPSPrintPpdLearnMoreUrl}" target="_blank"> + $i18n{learnMore} + </a> + </div> <div class="settings-box two-line"> <cr-input class="browse-file-input" readonly tabindex="-1" - value="[[userPPD_]]" label="$i18n{selectDriver}" + value="[[userPPD_]]" aria-labelledby="ppdLabel" error-message="$i18n{selectDriverErrorMessage}" invalid="[[invalidPPD_]]"> </cr-input>
diff --git a/chrome/browser/resources/settings/printing_page/cups_printer_shared_css.html b/chrome/browser/resources/settings/printing_page/cups_printer_shared_css.html index a8040ee..ab77ce6 100644 --- a/chrome/browser/resources/settings/printing_page/cups_printer_shared_css.html +++ b/chrome/browser/resources/settings/printing_page/cups_printer_shared_css.html
@@ -93,6 +93,11 @@ #search input[type='search'] { font: inherit; } + + .field-label { + padding-inline-start: 20px; + @apply --cr-form-field-label; + } </style> </template> </dom-module>
diff --git a/chrome/browser/resources/usb_internals/descriptor_panel.js b/chrome/browser/resources/usb_internals/descriptor_panel.js index baef3be..4bb19f0 100644 --- a/chrome/browser/resources/usb_internals/descriptor_panel.js +++ b/chrome/browser/resources/usb_internals/descriptor_panel.js
@@ -112,22 +112,23 @@ /** * @param {!device.mojom.UsbDeviceInterface} usbDeviceProxy * @param {!HTMLElement} rootElement - * @param {DescriptorPanel=} stringDescriptorPanel */ - constructor( - usbDeviceProxy, rootElement, stringDescriptorPanel = undefined) { + constructor(usbDeviceProxy, rootElement) { /** @private {!device.mojom.UsbDeviceInterface} */ this.usbDeviceProxy_ = usbDeviceProxy; /** @private {!HTMLElement} */ this.rootElement_ = rootElement; + } - this.clearView(); - - if (stringDescriptorPanel) { - /** @private {!DescriptorPanel} */ - this.stringDescriptorPanel_ = stringDescriptorPanel; - } + /** + * Adds the reference of the string descriptor panel of the device for + * string descriptor functionality. + * @param {!DescriptorPanel} stringDescriptorPanel + */ + setStringDescriptorPanel(stringDescriptorPanel) { + /** @private {!DescriptorPanel} */ + this.stringDescriptorPanel_ = stringDescriptorPanel; } /** @@ -144,10 +145,10 @@ /** @private {!HTMLElement} */ const rawDataTreeRoot = - descriptorPanelClone.querySelector('#raw-data-tree-view'); + descriptorPanelClone.querySelector('.raw-data-tree-view'); /** @private {!HTMLElement} */ const rawDataByteElement = - descriptorPanelClone.querySelector('#raw-data-byte-view'); + descriptorPanelClone.querySelector('.raw-data-byte-view'); cr.ui.decorate(rawDataTreeRoot, cr.ui.Tree); rawDataTreeRoot.detail = {payload: {}, children: {}}; @@ -2929,7 +2930,7 @@ el.addEventListener('click', (event) => { if (event.target.className != 'expand-icon') { // Clears all the selected elements before select another. - rawDataByteElement.querySelectorAll('#raw-data-byte-view span') + rawDataByteElement.querySelectorAll('.raw-data-byte-view span') .forEach((el) => el.classList.remove('selected-field')); rawDataByteElement
diff --git a/chrome/browser/resources/usb_internals/devices_page.js b/chrome/browser/resources/usb_internals/devices_page.js index 84cf946..700759d6 100644 --- a/chrome/browser/resources/usb_internals/devices_page.js +++ b/chrome/browser/resources/usb_internals/devices_page.js
@@ -124,14 +124,15 @@ cr.ui.decorate('tab', cr.ui.Tab); const tabPanels = document.querySelector('tabpanels'); - const tabPanelTemplate = document.querySelector('#tabpanel-template'); + const tabPanelTemplate = + document.querySelector('#device-tabpanel-template'); const tabPanelClone = document.importNode(tabPanelTemplate.content, true); /** * Root of the WebContents tree of current device. * @type {?cr.ui.Tree} */ - const treeViewRoot = tabPanelClone.querySelector('#tree-view'); + const treeViewRoot = tabPanelClone.querySelector('.tree-view'); cr.ui.decorate(treeViewRoot, cr.ui.Tree); treeViewRoot.detail = {payload: {}, children: {}}; // Clear the tree first before populating it with the new content. @@ -148,95 +149,28 @@ /** * Initializes all the descriptor panels. * @param {!HTMLElement} tabPanel - * @param {number} guid + * @param {string} guid * @private */ async initializeDescriptorPanels_(tabPanel, guid) { const usbDeviceProxy = new UsbDeviceProxy; await this.usbManager_.getDevice(guid, usbDeviceProxy.$.createRequest()); - const getStringDescriptorButton = - tabPanel.querySelector('#string-descriptor-button'); - const stringDescriptorElement = - tabPanel.querySelector('.string-descriptor-panel'); - const stringDescriptorPanel = new descriptor_panel.DescriptorPanel( - usbDeviceProxy, stringDescriptorElement); - stringDescriptorPanel.initialStringDescriptorPanel(guid); - getStringDescriptorButton.addEventListener('click', () => { - stringDescriptorElement.hidden = !stringDescriptorElement.hidden; + const deviceDescriptorPanel = initialInspectorPanel( + tabPanel, 'device-descriptor', usbDeviceProxy, guid); - // Clear the panel before rendering new data. - stringDescriptorPanel.clearView(); + const configurationDescriptorPanel = initialInspectorPanel( + tabPanel, 'configuration-descriptor', usbDeviceProxy, guid); - if (!stringDescriptorElement.hidden) { - stringDescriptorPanel.getAllLanguageCodes(); - } - }); - - const getDeviceDescriptorButton = - tabPanel.querySelector('#device-descriptor-button'); - const deviceDescriptorElement = - tabPanel.querySelector('.device-descriptor-panel'); - const deviceDescriptorPanel = new descriptor_panel.DescriptorPanel( - usbDeviceProxy, deviceDescriptorElement, stringDescriptorPanel); - getDeviceDescriptorButton.addEventListener('click', () => { - deviceDescriptorElement.hidden = !deviceDescriptorElement.hidden; - - // Clear the panel before rendering new data. - deviceDescriptorPanel.clearView(); - - if (!deviceDescriptorElement.hidden) { - deviceDescriptorPanel.renderDeviceDescriptor(); - } - }); - - const getConfigurationDescriptorButton = - tabPanel.querySelector('#configuration-descriptor-button'); - const configurationDescriptorElement = - tabPanel.querySelector('.configuration-descriptor-panel'); - const configurationDescriptorPanel = new descriptor_panel.DescriptorPanel( - usbDeviceProxy, configurationDescriptorElement, + const stringDescriptorPanel = initialInspectorPanel( + tabPanel, 'string-descriptor', usbDeviceProxy, guid); + deviceDescriptorPanel.setStringDescriptorPanel(stringDescriptorPanel); + configurationDescriptorPanel.setStringDescriptorPanel( stringDescriptorPanel); - getConfigurationDescriptorButton.addEventListener('click', () => { - configurationDescriptorElement.hidden = - !configurationDescriptorElement.hidden; - // Clear the panel before rendering new data. - configurationDescriptorPanel.clearView(); + initialInspectorPanel(tabPanel, 'bos-descriptor', usbDeviceProxy, guid); - if (!configurationDescriptorElement.hidden) { - configurationDescriptorPanel.renderConfigurationDescriptor(); - } - }); - - const getBosDescriptorButton = - tabPanel.querySelector('#bos-descriptor-button'); - const bosDescriptorElement = - tabPanel.querySelector('.bos-descriptor-panel'); - const bosDescriptorPanel = new descriptor_panel.DescriptorPanel( - usbDeviceProxy, bosDescriptorElement); - getBosDescriptorButton.addEventListener('click', () => { - bosDescriptorElement.hidden = !bosDescriptorElement.hidden; - - // Clear the panel before rendering new data. - bosDescriptorPanel.clearView(); - - if (!bosDescriptorElement.hidden) { - bosDescriptorPanel.renderBosDescriptor(); - } - }); - - const testingToolPanelButton = - tabPanel.querySelector('#testing-tool-button'); - const testingToolElement = tabPanel.querySelector('.testing-tool-panel'); - const testingToolPanel = new descriptor_panel.DescriptorPanel( - usbDeviceProxy, testingToolElement); - testingToolPanel.initialTestingToolPanel(); - testingToolPanelButton.addEventListener('click', () => { - testingToolElement.hidden = !testingToolElement.hidden; - // Clear the panel before rendering new data. - testingToolPanel.clearView(); - }); + initialInspectorPanel(tabPanel, 'testing-tool', usbDeviceProxy, guid); // window.deviceTabInitializedFn() provides a hook for the test suite to // perform test actions after the device tab query descriptors actions are @@ -419,6 +353,53 @@ } /** + * Initialize a descriptor panel. + * @param {!HTMLElement} tabPanel + * @param {string} panelType + * @param {!device.mojom.UsbDeviceInterface} usbDeviceProxy + * @param {string} guid + * @return {!descriptor_panel.DescriptorPanel} + */ + function initialInspectorPanel(tabPanel, panelType, usbDeviceProxy, guid) { + const button = tabPanel.querySelector(`.${panelType}-button`); + const displayElement = tabPanel.querySelector(`.${panelType}-panel`); + const descriptorPanel = + new descriptor_panel.DescriptorPanel(usbDeviceProxy, displayElement); + switch (panelType) { + case 'string-descriptor': + descriptorPanel.initialStringDescriptorPanel(guid); + break; + case 'testing-tool': + descriptorPanel.initialTestingToolPanel(); + break; + } + + button.addEventListener('click', () => { + displayElement.hidden = !displayElement.hidden; + // Clear the panel before rendering new data. + descriptorPanel.clearView(); + + if (!displayElement.hidden) { + switch (panelType) { + case 'device-descriptor': + descriptorPanel.renderDeviceDescriptor(); + break; + case 'configuration-descriptor': + descriptorPanel.renderConfigurationDescriptor(); + break; + case 'string-descriptor': + descriptorPanel.getAllLanguageCodes(); + break; + case 'bos-descriptor': + descriptorPanel.renderBosDescriptor(); + break; + } + } + }); + return descriptorPanel; + } + + /** * Parses utf16 coded string. * @param {!mojoBase.mojom.String16} arr * @return {string}
diff --git a/chrome/browser/resources/usb_internals/usb_internals.css b/chrome/browser/resources/usb_internals/usb_internals.css index 670b0eb..8b640a3 100644 --- a/chrome/browser/resources/usb_internals/usb_internals.css +++ b/chrome/browser/resources/usb_internals/usb_internals.css
@@ -69,58 +69,58 @@ margin-inline-start: 8px; } -#raw-data-byte-view, -#raw-data-tree-view { +.raw-data-byte-view, +.raw-data-tree-view { flex: 1 0; } -#raw-data-byte-view { +.raw-data-byte-view { font-size: 14px; line-height: 250%; white-space: pre; } -#raw-data-byte-view div { +.raw-data-byte-view div { position: sticky; /* height of <tabs> and button */ top: 41px; } @media screen and (min-width: 1200px) { - #raw-data-byte-view div span:nth-child(16n)::after { + .raw-data-byte-view div span:nth-child(16n)::after { content: '\A'; } } @media screen and (min-width: 600px) and (max-width: 1199px) { - #raw-data-byte-view div span:nth-child(8n)::after { + .raw-data-byte-view div span:nth-child(8n)::after { content: '\A'; } } @media screen and (min-width: 300px) and (max-width: 599px) { - #raw-data-byte-view div span:nth-child(4n)::after { + .raw-data-byte-view div span:nth-child(4n)::after { content: '\A'; } } @media screen and (min-width: 150px) and (max-width: 299px) { - #raw-data-byte-view div span:nth-child(2n)::after { + .raw-data-byte-view div span:nth-child(2n)::after { content: '\A'; } } -#raw-data-byte-view div span { +.raw-data-byte-view div span { font-family: monospace; padding-inline-end: .5em; padding-inline-start: .5em; } -#raw-data-byte-view .selected-field { +.raw-data-byte-view .selected-field { background: red; } -#raw-data-byte-view .hovered-field { +.raw-data-byte-view .hovered-field { background: yellow; }
diff --git a/chrome/browser/resources/usb_internals/usb_internals.html b/chrome/browser/resources/usb_internals/usb_internals.html index 80cbf6a9..e64eb5e 100644 --- a/chrome/browser/resources/usb_internals/usb_internals.html +++ b/chrome/browser/resources/usb_internals/usb_internals.html
@@ -135,21 +135,21 @@ <tab></tab> </template> - <template id="tabpanel-template"> + <template id="device-tabpanel-template"> <tabpanel> - <tree id="tree-view"></tree> + <tree class="tree-view"></tree> <div class="descriptor-button"> - <button id="device-descriptor-button">Get Device Descriptor</button> + <button class="device-descriptor-button">Get Device Descriptor</button> </div> <div class="device-descriptor-panel" hidden></div> <div class="descriptor-button"> - <button id="configuration-descriptor-button"> + <button class="configuration-descriptor-button"> Get Configuration Descriptor </button> </div> <div class="configuration-descriptor-panel" hidden></div> <div class="descriptor-button"> - <button id="string-descriptor-button">Get String Descriptor</button> + <button class="string-descriptor-button">Get String Descriptor</button> </div> <div class="string-descriptor-panel" hidden> String Descriptor Index: @@ -161,13 +161,13 @@ <button>GET</button> </div> <div class="descriptor-button"> - <button id="bos-descriptor-button"> + <button class="bos-descriptor-button"> Get WebUSB & Microsoft OS 2.0 Descriptors </button> </div> <div class="bos-descriptor-panel" hidden></div> <div class="descriptor-button"> - <button id="testing-tool-button">Testing Tool Panel</button> + <button class="testing-tool-button">Testing Tool Panel</button> </div> <div class="testing-tool-panel" hidden> <select id="input-type"> @@ -205,33 +205,23 @@ <option label="Other" value="OTHER"></option> </select> </td> - <td><input id="query-request" type="number" value="0"></td> - <td><input id="query-value" type="number" value="0"></td> - <td><input id="query-index" type="number" value="0"></td> - <td><input id="query-length" type="number" value="0"></td> + <td><input id="query-request" type="number" placeholder="0"></td> + <td><input id="query-value" type="number" placeholder="0"></td> + <td><input id="query-index" type="number" placeholder="0"></td> + <td><input id="query-length" type="number" placeholder="0"></td> <td><button>Send</button></td> </tr> <tr hidden> - <td> - 0x<input id="query-request-type" type="number" placeholder="00"> - </td> - <td> - 0x<input id="query-request" type="number" placeholder="00"> - </td> - <td> - 0x<input id="query-value" type="number" placeholder="0000"> - </td> - <td> - 0x<input id="query-index" type="number" placeholder="0000"> - </td> - <td> - 0x<input id="query-length" type="number" placeholder="0000"> - </td> + <td>0x<input id="query-request-type" placeholder="00"></td> + <td>0x<input id="query-request" placeholder="00"></td> + <td>0x<input id="query-value" placeholder="0000"></td> + <td>0x<input id="query-index" placeholder="0000"></td> + <td>0x<input id="query-length" placeholder="0000"></td> <td><button>Send</button></td> </tr> </tbody> </table> - <div id='data-input-area'> + <div id="data-input-area"> Data (in Hex): <textarea cols="31"></textarea> </div> @@ -241,8 +231,8 @@ <template id="descriptor-panel-template"> <descriptorpanel> - <tree id="raw-data-tree-view"></tree> - <div id="raw-data-byte-view"></div> + <tree class="raw-data-tree-view"></tree> + <div class="raw-data-byte-view"></div> </descriptorpanel> </template>
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc index 615e279..ee592221 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h" #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/safe_browsing/advanced_protection_status_manager.h" #include "chrome/browser/safe_browsing/download_protection/check_client_download_request.h" #include "chrome/browser/safe_browsing/download_protection/download_feedback_service.h" #include "chrome/browser/safe_browsing/download_protection/download_url_sb_client.h" @@ -281,14 +282,27 @@ } void DownloadProtectionService::ShowDetailsForDownload( - const download::DownloadItem& item, + const download::DownloadItem* item, content::PageNavigator* navigator) { GURL learn_more_url(chrome::kDownloadScanningLearnMoreURL); learn_more_url = google_util::AppendGoogleLocaleParam( learn_more_url, g_browser_process->GetApplicationLocale()); learn_more_url = net::AppendQueryParameter( learn_more_url, "ctx", - base::NumberToString(static_cast<int>(item.GetDangerType()))); + base::NumberToString(static_cast<int>(item->GetDangerType()))); + + Profile* profile = Profile::FromBrowserContext( + content::DownloadItemUtils::GetBrowserContext(item)); + if (profile && + AdvancedProtectionStatusManager::RequestsAdvancedProtectionVerdicts( + profile) && + item->GetDangerType() == + download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT) { + learn_more_url = GURL(chrome::kAdvancedProtectionDownloadLearnMoreURL); + learn_more_url = google_util::AppendGoogleLocaleParam( + learn_more_url, g_browser_process->GetApplicationLocale()); + } + navigator->OpenURL( content::OpenURLParams(learn_more_url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.h b/chrome/browser/safe_browsing/download_protection/download_protection_service.h index 8658e37..d39000bf 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service.h +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.h
@@ -102,7 +102,7 @@ // Display more information to the user regarding the download specified by // |info|. This method is invoked when the user requests more information // about a download that was marked as malicious. - void ShowDetailsForDownload(const download::DownloadItem& item, + void ShowDetailsForDownload(const download::DownloadItem* item, content::PageNavigator* navigator); // Enables or disables the service. This is usually called by the
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc index eca1784..34ce31b 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -2227,7 +2227,7 @@ .WillOnce(Return(download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST)); EXPECT_CALL(mock_page_navigator, OpenURL(OpenURLParamsWithContextValue("7"))); - download_service_->ShowDetailsForDownload(mock_download_item, + download_service_->ShowDetailsForDownload(&mock_download_item, &mock_page_navigator); }
diff --git a/chrome/browser/ui/ash/keyboard/OWNERS b/chrome/browser/ui/ash/keyboard/OWNERS new file mode 100644 index 0000000..94fbd75 --- /dev/null +++ b/chrome/browser/ui/ash/keyboard/OWNERS
@@ -0,0 +1,3 @@ +file://ash/keyboard/OWNERS + +# COMPONENT: UI>Input>VirtualKeyboard
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index 3f4bf8c..9cb51c5 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -1282,6 +1282,8 @@ // Test that when one browser window is snapped, the header is visible for // the snapped browser window, but invisible for the browser window still in // overview mode. + ASSERT_NO_FATAL_FAILURE( + ash::ShellTestApi().EnableTabletModeWindowManager(true)); ash::Shell* shell = ash::Shell::Get(); ash::SplitViewController* split_view_controller = shell->split_view_controller(); @@ -1289,13 +1291,12 @@ ToggleOverview(); split_view_controller->SnapWindow(widget->GetNativeWindow(), ash::SplitViewController::LEFT); - EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); + // TODO(crbug.com/970904): Test first frame header visibility here and below. EXPECT_FALSE(frame_view2->caption_button_container_->GetVisible()); // When both browser windows are snapped, the headers are both visible. split_view_controller->SnapWindow(widget2->GetNativeWindow(), ash::SplitViewController::RIGHT); - EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); EXPECT_TRUE(frame_view2->caption_button_container_->GetVisible()); // Toggle overview mode while splitview mode is active. Test that the header @@ -1303,7 +1304,6 @@ // window in overview mode. ToggleOverview(); - EXPECT_TRUE(frame_view->caption_button_container_->GetVisible()); EXPECT_FALSE(frame_view2->caption_button_container_->GetVisible()); }
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index be4249b97..7f23e92 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -2142,6 +2142,9 @@ #if defined(OS_CHROMEOS) html_source->AddString("printingCUPSPrintLearnMoreUrl", GetHelpUrlWithBoard(chrome::kCupsPrintLearnMoreURL)); + html_source->AddString( + "printingCUPSPrintPpdLearnMoreUrl", + GetHelpUrlWithBoard(chrome::kCupsPrintPPDLearnMoreURL)); #endif }
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 0d6a3538..e773334 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -187,6 +187,8 @@ "secure_origin_whitelist.h", "ssl_insecure_content.cc", "ssl_insecure_content.h", + + # TODO(asvitkine): Move the next four entries to chrome/common/profiler/. "stack_sampling_configuration.cc", "stack_sampling_configuration.h", "thread_profiler.cc",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 188efd4f..79bbe0e8 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -624,7 +624,7 @@ // Enables or disables the App Management UI. const base::Feature kAppManagement{"AppManagement", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Disable downloads of unsafe file types over insecure transports if initiated // from a secure page
diff --git a/chrome/common/profiler/BUILD.gn b/chrome/common/profiler/BUILD.gn new file mode 100644 index 0000000..49eb8cf --- /dev/null +++ b/chrome/common/profiler/BUILD.gn
@@ -0,0 +1,17 @@ +# 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. + +source_set("profiler") { + sources = [ + "main_thread_stack_sampling_profiler.cc", + "main_thread_stack_sampling_profiler.h", + ] + + deps = [ + "//base", + "//chrome/common", + "//components/metrics", + "//content/public/common", + ] +}
diff --git a/chrome/common/profiler/OWNERS b/chrome/common/profiler/OWNERS new file mode 100644 index 0000000..3ed2cd88 --- /dev/null +++ b/chrome/common/profiler/OWNERS
@@ -0,0 +1,4 @@ +# COMPONENT: Internals>Metrics + +charliea@chromium.org +wittman@chromium.org \ No newline at end of file
diff --git a/chrome/common/profiler/main_thread_stack_sampling_profiler.cc b/chrome/common/profiler/main_thread_stack_sampling_profiler.cc new file mode 100644 index 0000000..6f62d6a --- /dev/null +++ b/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
@@ -0,0 +1,44 @@ +// 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. + +#include "chrome/common/profiler/main_thread_stack_sampling_profiler.h" + +#include "base/bind.h" +#include "base/command_line.h" +#include "base/threading/platform_thread.h" +#include "chrome/common/thread_profiler.h" +#include "components/metrics/call_stack_profile_metrics_provider.h" +#include "content/public/common/content_switches.h" + +namespace { + +// Returns the profiler appropriate for the current process. +std::unique_ptr<ThreadProfiler> CreateThreadProfiler() { + const base::CommandLine* command_line = + base::CommandLine::ForCurrentProcess(); + + // The browser process has an empty process type. + // TODO(wittman): Do this for other process types too. + if (!command_line->HasSwitch(switches::kProcessType)) { + ThreadProfiler::SetBrowserProcessReceiverCallback(base::BindRepeating( + &metrics::CallStackProfileMetricsProvider::ReceiveProfile)); + return ThreadProfiler::CreateAndStartOnMainThread(); + } + + // No other processes are currently supported. + return nullptr; +} + +} // namespace + +MainThreadStackSamplingProfiler::MainThreadStackSamplingProfiler() { + sampling_profiler_ = CreateThreadProfiler(); +} + +// Note that it's important for the |sampling_profiler_| destructor to run, as +// it ensures program correctness on shutdown. Without it, the profiler thread's +// destruction can race with the profiled thread's destruction, which results in +// the sampling thread attempting to profile the sampled thread after the +// sampled thread has already been shut down. +MainThreadStackSamplingProfiler::~MainThreadStackSamplingProfiler() = default;
diff --git a/chrome/common/profiler/main_thread_stack_sampling_profiler.h b/chrome/common/profiler/main_thread_stack_sampling_profiler.h new file mode 100644 index 0000000..4e868ae5 --- /dev/null +++ b/chrome/common/profiler/main_thread_stack_sampling_profiler.h
@@ -0,0 +1,35 @@ +// 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_COMMON_PROFILER_MAIN_THREAD_STACK_SAMPLING_PROFILER_H_ +#define CHROME_COMMON_PROFILER_MAIN_THREAD_STACK_SAMPLING_PROFILER_H_ + +#include <memory> + +#include "base/macros.h" +#include "base/profiler/stack_sampling_profiler.h" + +class ThreadProfiler; + +// A wrapper class that begins profiling stack samples upon construction, and +// ensures correct shutdown behavior on destruction. Should only be used on the +// main thread of a process. Samples are collected for the thread of the current +// process where this object is constructed, and only if profiling is enabled +// for the thread. This data is used to understand startup performance behavior, +// and the object should therefore be created as early during initialization as +// possible. +class MainThreadStackSamplingProfiler { + public: + MainThreadStackSamplingProfiler(); + ~MainThreadStackSamplingProfiler(); + + private: + // A profiler that periodically samples stack traces. Used to understand + // thread and process startup behavior. + std::unique_ptr<ThreadProfiler> sampling_profiler_; + + DISALLOW_COPY_AND_ASSIGN(MainThreadStackSamplingProfiler); +}; + +#endif // CHROME_COMMON_PROFILER_MAIN_THREAD_STACK_SAMPLING_PROFILER_H_
diff --git a/chrome/common/thread_profiler.cc b/chrome/common/thread_profiler.cc index 5b480c8..bfdb6c4 100644 --- a/chrome/common/thread_profiler.cc +++ b/chrome/common/thread_profiler.cc
@@ -16,6 +16,7 @@ #include "base/threading/platform_thread.h" #include "base/threading/sequence_local_storage_slot.h" #include "base/threading/thread_task_runner_handle.h" +#include "build/build_config.h" #include "chrome/common/stack_sampling_configuration.h" #include "components/metrics/call_stack_profile_builder.h" #include "components/metrics/call_stack_profile_metrics_provider.h" @@ -29,6 +30,11 @@ namespace { +// Pointer to the main thread instance, if any. Stored as a global because it's +// created very early in chrome/app - and is thus otherwise inaccessible from +// chrome_dll, by the time we need to register the main thread task runner. +ThreadProfiler* g_main_thread_instance = nullptr; + // Run continuous profiling 2% of the time. constexpr const double kFractionOfExecutionTimeToSample = 0.02; @@ -130,26 +136,35 @@ base::WorkIdProvider* const work_id_provider_; }; -ThreadProfiler::~ThreadProfiler() = default; +ThreadProfiler::~ThreadProfiler() { + if (g_main_thread_instance == this) + g_main_thread_instance = nullptr; +} // static std::unique_ptr<ThreadProfiler> ThreadProfiler::CreateAndStartOnMainThread() { - return std::unique_ptr<ThreadProfiler>( + // If running in single process mode, there may be multiple "main thread" + // profilers created. In this case, we assume the first created one is the + // browser one. + bool is_single_process = base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kSingleProcess); + DCHECK(!g_main_thread_instance || is_single_process); + auto instance = std::unique_ptr<ThreadProfiler>( new ThreadProfiler(CallStackProfileParams::MAIN_THREAD)); + if (!g_main_thread_instance) + g_main_thread_instance = instance.get(); + return instance; } +// static void ThreadProfiler::SetMainThreadTaskRunner( scoped_refptr<base::SingleThreadTaskRunner> task_runner) { - if (!StackSamplingConfiguration::Get()->IsProfilerEnabledForCurrentProcess()) - return; - - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - // This should only be called if the task runner wasn't provided in the - // constructor. - DCHECK(!owning_thread_task_runner_); - owning_thread_task_runner_ = task_runner; - ScheduleNextPeriodicCollection(); +#if !defined(OS_ANDROID) + // TODO(asvitkine): The code path where we create the profiler instance in + // chrome_main.cc does not run on Android. + DCHECK(g_main_thread_instance); + g_main_thread_instance->SetMainThreadTaskRunnerImpl(task_runner); +#endif } void ThreadProfiler::SetAuxUnwinderFactory( @@ -259,6 +274,20 @@ thread_profiler)); } +void ThreadProfiler::SetMainThreadTaskRunnerImpl( + scoped_refptr<base::SingleThreadTaskRunner> task_runner) { + if (!StackSamplingConfiguration::Get()->IsProfilerEnabledForCurrentProcess()) + return; + + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + + // This should only be called if the task runner wasn't provided in the + // constructor. + DCHECK(!owning_thread_task_runner_); + owning_thread_task_runner_ = task_runner; + ScheduleNextPeriodicCollection(); +} + void ThreadProfiler::ScheduleNextPeriodicCollection() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); owning_thread_task_runner_->PostDelayedTask(
diff --git a/chrome/common/thread_profiler.h b/chrome/common/thread_profiler.h index c1793e70..e173757 100644 --- a/chrome/common/thread_profiler.h +++ b/chrome/common/thread_profiler.h
@@ -55,14 +55,22 @@ // Creates a profiler for a main thread and immediately starts it. This // function should only be used when profiling the main thread of a // process. The returned profiler must be destroyed prior to thread exit to - // stop the profiling. SetMainThreadTaskRunner() should be called after the - // message loop has been started on the thread. + // stop the profiling. + // + // SetMainThreadTaskRunner() should be called after the message loop has been + // started on the thread. It is the caller's responsibility to ensure that + // the instance returned by this function is still alive when the static API + // SetMainThreadTaskRunner() is used. The latter is static to support Chrome's + // set up where the ThreadProfiler is created in chrome/app which cannot be + // easily accessed from chrome_browser_main.cc which sets the task runner. static std::unique_ptr<ThreadProfiler> CreateAndStartOnMainThread(); // Sets the task runner when profiling on the main thread. This occurs in a // separate call from CreateAndStartOnMainThread so that startup profiling can - // occur prior to message loop start. - void SetMainThreadTaskRunner( + // occur prior to message loop start. The task runner is associated with the + // instance returned by CreateAndStartOnMainThread(), which must be alive when + // this is called. + static void SetMainThreadTaskRunner( scoped_refptr<base::SingleThreadTaskRunner> task_runner); // Sets a callback to create auxiliary unwinders, for handling additional, @@ -112,6 +120,12 @@ scoped_refptr<base::SingleThreadTaskRunner> owning_thread_task_runner, base::WeakPtr<ThreadProfiler> thread_profiler); + // Sets the task runner when profiling on the main thread. This occurs in a + // separate call from CreateAndStartOnMainThread so that startup profiling can + // occur prior to message loop start. + void SetMainThreadTaskRunnerImpl( + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + // Posts a delayed task to start the next periodic sampling collection. void ScheduleNextPeriodicCollection();
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc index e85e33b..065e8df9 100644 --- a/chrome/common/url_constants.cc +++ b/chrome/common/url_constants.cc
@@ -12,6 +12,9 @@ const char kAutomaticSettingsResetLearnMoreURL[] = "https://support.google.com/chrome/?p=ui_automatic_settings_reset"; +const char kAdvancedProtectionDownloadLearnMoreURL[] = + "https://support.google.com/accounts/?p=ap_faq"; + const char kBluetoothAdapterOffHelpURL[] = #if defined(OS_CHROMEOS) "chrome://settings/?search=bluetooth"; @@ -285,6 +288,9 @@ const char kCupsPrintLearnMoreURL[] = "https://support.google.com/chromebook?p=chromebook_printing"; +const char kCupsPrintPPDLearnMoreURL[] = + "https://support.google.com/chromebook?p=chromebook_printing"; + const char kEasyUnlockLearnMoreUrl[] = "https://support.google.com/chromebook/?p=smart_lock";
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h index 895c834a..dfe7bbd 100644 --- a/chrome/common/url_constants.h +++ b/chrome/common/url_constants.h
@@ -33,6 +33,9 @@ // "Learn more" URL for when profile settings are automatically reset. extern const char kAutomaticSettingsResetLearnMoreURL[]; +// "Learn more" URL for Advanced Protection download warnings. +extern const char kAdvancedProtectionDownloadLearnMoreURL[]; + // The URL for providing help when the Bluetooth adapter is off. extern const char kBluetoothAdapterOffHelpURL[]; @@ -230,6 +233,8 @@ extern const char kCupsPrintLearnMoreURL[]; +extern const char kCupsPrintPPDLearnMoreURL[]; + // The URL for the "Learn more" link the the Easy Unlock settings. extern const char kEasyUnlockLearnMoreUrl[];
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc index 9e320e5..2116d66db 100644 --- a/chrome/gpu/chrome_content_gpu_client.cc +++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -90,7 +90,7 @@ switches::kSingleProcess) && !base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kInProcessGPU)) { - main_thread_profiler_->SetMainThreadTaskRunner( + ThreadProfiler::SetMainThreadTaskRunner( base::ThreadTaskRunnerHandle::Get()); mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector;
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index bb33d93..aa0a04e 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -433,7 +433,7 @@ // This doesn't work in single-process mode. if (!base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kSingleProcess)) { - main_thread_profiler_->SetMainThreadTaskRunner( + ThreadProfiler::SetMainThreadTaskRunner( base::ThreadTaskRunnerHandle::Get()); mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector; service_manager::Connector* connector = nullptr;
diff --git a/chrome/renderer/chrome_content_renderer_client_browsertest.cc b/chrome/renderer/chrome_content_renderer_client_browsertest.cc index afe8633..125dba9 100644 --- a/chrome/renderer/chrome_content_renderer_client_browsertest.cc +++ b/chrome/renderer/chrome_content_renderer_client_browsertest.cc
@@ -87,7 +87,8 @@ // Load a page that contains an iframe. LoadHTML(kHtmlWithIframe); - ChromeContentRendererClient client; + ChromeContentRendererClient* client = + static_cast<ChromeContentRendererClient*>(content_renderer_client_.get()); // Create a thumbnail URL containing the correct render view ID and an // arbitrary instant restricted ID. @@ -98,9 +99,9 @@ GURL result; bool attach_same_site_cookies; // Make sure the SearchBox rewrites a thumbnail request from the main frame. - client.WillSendRequest(GetMainFrame(), ui::PAGE_TRANSITION_LINK, - blink::WebURL(thumbnail_url), nullptr, &result, - &attach_same_site_cookies); + client->WillSendRequest(GetMainFrame(), ui::PAGE_TRANSITION_LINK, + blink::WebURL(thumbnail_url), nullptr, &result, + &attach_same_site_cookies); EXPECT_NE(result, thumbnail_url); // Make sure the SearchBox rewrites a thumbnail request from the iframe. @@ -109,9 +110,9 @@ ASSERT_TRUE(child_frame->IsWebLocalFrame()); blink::WebLocalFrame* local_child = static_cast<blink::WebLocalFrame*>(child_frame); - client.WillSendRequest(local_child, ui::PAGE_TRANSITION_LINK, - blink::WebURL(thumbnail_url), nullptr, &result, - &attach_same_site_cookies); + client->WillSendRequest(local_child, ui::PAGE_TRANSITION_LINK, + blink::WebURL(thumbnail_url), nullptr, &result, + &attach_same_site_cookies); EXPECT_NE(result, thumbnail_url); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 6685d0c6..42650719 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3832,10 +3832,6 @@ "../renderer/media/chrome_webrtc_log_message_delegate_unittest.cc", ] - if (enable_openscreen) { - sources += [ "../browser/media/router/providers/openscreen/network_service_quic_packet_writer_unittest.cc" ] - } - deps += [ "//components/bubble:test_support", "//services/network:test_support", @@ -4943,6 +4939,15 @@ if (is_win || is_mac) { deps += [ "//chrome/updater:updater_tests" ] } + + if (enable_openscreen) { + include_dirs = [ "//third_party/openscreen/src" ] + + sources += [ + "../browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc", + "../browser/media/router/providers/openscreen/network_service_quic_packet_writer_unittest.cc", + ] + } } static_library("test_support_unit") { @@ -5018,6 +5023,7 @@ "//content/public/browser", ] deps = [ + "//chrome/common/profiler", "//components/metrics:test_support", "//components/nacl/common:buildflags", "//components/os_crypt:test_support",
diff --git a/chrome/test/base/chrome_test_launcher.cc b/chrome/test/base/chrome_test_launcher.cc index 0d82f05..5de030a 100644 --- a/chrome/test/base/chrome_test_launcher.cc +++ b/chrome/test/base/chrome_test_launcher.cc
@@ -23,6 +23,7 @@ #include "chrome/app/chrome_main_delegate.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/profiler/main_thread_stack_sampling_profiler.h" #include "chrome/install_static/test/scoped_install_details.h" #include "chrome/test/base/chrome_test_suite.h" #include "chrome/utility/chrome_content_utility_client.h" @@ -197,6 +198,17 @@ install_static::ScopedInstallDetails install_details; #endif + const auto& command_line = *base::CommandLine::ForCurrentProcess(); + +#if !defined(OS_ANDROID) + // Initialize sampling profiler for tests that relaunching a browser. This + // mimics the behavior in standalone Chrome, where this is done in + // chrome/app/chrome_main.cc, which does not get called by tests. + std::unique_ptr<MainThreadStackSamplingProfiler> sampling_profiler; + if (command_line.HasSwitch(content::kLaunchAsBrowser)) + sampling_profiler = std::make_unique<MainThreadStackSamplingProfiler>(); +#endif + #if defined(OS_LINUX) || defined(OS_ANDROID) ChromeCrashReporterClient::Create(); #elif defined(OS_WIN) @@ -212,8 +224,8 @@ // interfere with other test objects in the browser process. std::unique_ptr<content::NetworkServiceTestHelper> network_service_test_helper; - if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kProcessType) == switches::kUtilityProcess) { + if (command_line.GetSwitchValueASCII(switches::kProcessType) == + switches::kUtilityProcess) { network_service_test_helper = std::make_unique<content::NetworkServiceTestHelper>(); ChromeContentUtilityClient::SetNetworkBinderCreationCallback(base::Bind(
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc index 979046a8..632e2f9 100644 --- a/chrome/test/base/in_process_browser_test.cc +++ b/chrome/test/base/in_process_browser_test.cc
@@ -51,6 +51,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/logging_chrome.h" +#include "chrome/common/profiler/main_thread_stack_sampling_profiler.h" #include "chrome/common/url_constants.h" #include "chrome/renderer/chrome_content_renderer_client.h" #include "chrome/test/base/chrome_test_suite.h" @@ -221,6 +222,11 @@ // Browser tests will create their own g_browser_process later. DCHECK(!g_browser_process); + // Initialize sampling profiler in browser tests. This mimics the behavior + // in standalone Chrome, where this is done in chrome/app/chrome_main.cc, + // which does not get called by browser tests. + sampling_profiler_ = std::make_unique<MainThreadStackSamplingProfiler>(); + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); // Auto-reload breaks many browser tests, which assume error pages won't be
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h index c0312f3..b80d04147 100644 --- a/chrome/test/base/in_process_browser_test.h +++ b/chrome/test/base/in_process_browser_test.h
@@ -49,6 +49,7 @@ #endif // defined(TOOLKIT_VIEWS) class Browser; +class MainThreadStackSamplingProfiler; class Profile; #if defined(OS_MACOSX) class ScopedBundleSwizzlerMac; @@ -306,6 +307,10 @@ #if defined(TOOLKIT_VIEWS) std::unique_ptr<views::ViewsDelegate> views_delegate_; #endif + + std::unique_ptr<MainThreadStackSamplingProfiler> sampling_profiler_; + + DISALLOW_COPY_AND_ASSIGN(InProcessBrowserTest); }; #endif // CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_
diff --git a/chrome/test/base/run_all_unittests.cc b/chrome/test/base/run_all_unittests.cc index 259fdc25..80ffb261 100644 --- a/chrome/test/base/run_all_unittests.cc +++ b/chrome/test/base/run_all_unittests.cc
@@ -11,6 +11,7 @@ #include "chrome/test/base/chrome_unit_test_suite.h" #include "content/public/test/unittest_test_suite.h" #include "mojo/core/embedder/scoped_ipc_support.h" +#include "services/network/public/cpp/features.h" #if defined(OS_WIN) #include "chrome/install_static/test/scoped_install_details.h" @@ -21,8 +22,9 @@ // unit_tests don't currently work with the Network Service enabled. // https://crbug.com/966633. - content::UnitTestTestSuite test_suite(new ChromeUnitTestSuite(argc, argv), - "NetworkService"); + content::UnitTestTestSuite test_suite( + new ChromeUnitTestSuite(argc, argv), + network::features::kNetworkServiceFeatureName); base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart); mojo::core::ScopedIPCSupport ipc_support(
diff --git a/chrome/test/data/webui/usb_internals_browsertest.js b/chrome/test/data/webui/usb_internals_browsertest.js index c993737..c64c027 100644 --- a/chrome/test/data/webui/usb_internals_browsertest.js +++ b/chrome/test/data/webui/usb_internals_browsertest.js
@@ -391,7 +391,7 @@ // The tab panel of the first device is opened in previous test as the // third tab panel. This device has correct device descriptor. const deviceTab = document.querySelectorAll('tabpanel')[2]; - deviceTab.querySelector('#device-descriptor-button').click(); + deviceTab.querySelector('.device-descriptor-button').click(); await deviceDescriptorRenderPromise; const panel = deviceTab.querySelector('.device-descriptor-panel'); @@ -418,11 +418,11 @@ expectEquals('Product String Index: 2GET', treeItems[11].textContent); expectEquals('Serial Number Index: 0', treeItems[12].textContent); expectEquals('Number of Configurations: 1', treeItems[13].textContent); - const byteElements = panel.querySelectorAll('#raw-data-byte-view span'); + const byteElements = panel.querySelectorAll('.raw-data-byte-view span'); expectEquals(18, byteElements.length); expectEquals( '12010002000000405010EF17210301020001', - panel.querySelector('#raw-data-byte-view').textContent); + panel.querySelector('.raw-data-byte-view').textContent); // Click a single byte tree item (Length) and check that both the item // and the related byte are highlighted. @@ -493,7 +493,7 @@ const deviceTab = document.querySelectorAll('tabpanel')[2]; await deviceTabInitializedPromise; - deviceTab.querySelector('#device-descriptor-button').click(); + deviceTab.querySelector('.device-descriptor-button').click(); await deviceDescriptorRenderPromise; const panel = deviceTab.querySelector('.device-descriptor-panel'); @@ -516,11 +516,11 @@ expectEquals( 'Control Pipe Maximum Packet Size: 64', treeItems[6].textContent); - const byteElements = panel.querySelectorAll('#raw-data-byte-view span'); + const byteElements = panel.querySelectorAll('.raw-data-byte-view span'); expectEquals(9, byteElements.length); expectEquals( '120100020000004050', - panel.querySelector('#raw-data-byte-view').textContent); + panel.querySelector('.raw-data-byte-view').textContent); // Click a single byte tree item (Length) and check that both the item
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc index 19238d7..6b70e31 100644 --- a/chromeos/constants/chromeos_features.cc +++ b/chromeos/constants/chromeos_features.cc
@@ -103,7 +103,7 @@ // supervised users. It will display a loading page while we fetch // eligibility data. const base::Feature kSupervisionOnboardingEligibility{ - "SupervisionOnboardingEligibility", base::FEATURE_DISABLED_BY_DEFAULT}; + "SupervisionOnboardingEligibility", base::FEATURE_ENABLED_BY_DEFAULT}; // If enabled, we will display the full onboarding flow for eligible supervised // users.
diff --git a/components/BUILD.gn b/components/BUILD.gn index d644399..3f8e79f4 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -198,6 +198,7 @@ deps += [ "//components/autofill/ios/browser:unit_tests", "//components/autofill/ios/form_util:unit_tests", + "//components/crash/core/common:unit_tests", "//components/image_fetcher/ios:unit_tests", "//components/language/ios/browser:unit_tests", "//components/password_manager/ios:unit_tests",
diff --git a/components/arc/common/app.mojom b/components/arc/common/app.mojom index 70e33787..8513efb 100644 --- a/components/arc/common/app.mojom +++ b/components/arc/common/app.mojom
@@ -354,7 +354,7 @@ }; // TODO(lhchavez): Migrate all request/response messages to Mojo. -// Next method ID: 34 +// Next method ID: 35 // Deprecated method IDs: 2, 3, 13 interface AppInstance { // DEPRECATED: Please use Init@21 instead. @@ -492,4 +492,10 @@ [MinVersion=37] RequestAssistStructure@29() => (ax.mojom.AssistantExtra? assistant_extra, ax.mojom.AssistantTree? assistant_tree); + + // Queries whether |package_name| is installable for the current user. This + // may return false if the user has already installed |package_name|, or if + // it isn't available in the user's store. + [MinVersion=43] IsInstallable@34(string package_name) => + (bool is_installable); };
diff --git a/components/arc/test/fake_app_instance.cc b/components/arc/test/fake_app_instance.cc index 84cd13c..15903e9 100644 --- a/components/arc/test/fake_app_instance.cc +++ b/components/arc/test/fake_app_instance.cc
@@ -485,6 +485,11 @@ std::move(callback).Run(nullptr, nullptr); } +void FakeAppInstance::IsInstallable(const std::string& package_name, + IsInstallableCallback callback) { + std::move(callback).Run(false); +} + void FakeAppInstance::LaunchIntentDeprecated( const std::string& intent_uri, const base::Optional<gfx::Rect>& dimension_on_screen) {
diff --git a/components/arc/test/fake_app_instance.h b/components/arc/test/fake_app_instance.h index dfb720d..47489d6 100644 --- a/components/arc/test/fake_app_instance.h +++ b/components/arc/test/fake_app_instance.h
@@ -159,6 +159,8 @@ void StartFastAppReinstallFlow( const std::vector<std::string>& package_names) override; void RequestAssistStructure(RequestAssistStructureCallback callback) override; + void IsInstallable(const std::string& package_name, + IsInstallableCallback callback) override; // Methods to reply messages. void SendRefreshAppList(const std::vector<mojom::AppInfo>& apps);
diff --git a/components/autofill_assistant/browser/actions/get_payment_information_action.cc b/components/autofill_assistant/browser/actions/get_payment_information_action.cc index c4db06d..15f6aec 100644 --- a/components/autofill_assistant/browser/actions/get_payment_information_action.cc +++ b/components/autofill_assistant/browser/actions/get_payment_information_action.cc
@@ -57,6 +57,17 @@ get_payment_information.ask_for_payment(); payment_options->confirm_button_text = get_payment_information.confirm_button_text(); + switch (get_payment_information.terms_and_conditions_state()) { + case GetPaymentInformationProto::NOT_SELECTED: + payment_options->initial_terms_and_conditions = NOT_SELECTED; + break; + case GetPaymentInformationProto::ACCEPTED: + payment_options->initial_terms_and_conditions = ACCEPTED; + break; + case GetPaymentInformationProto::REVIEW_REQUIRED: + payment_options->initial_terms_and_conditions = REQUIRES_REVIEW; + break; + } payment_options->callback = base::BindOnce(&GetPaymentInformationAction::OnGetPaymentInformation,
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc index 619aea1..343ac46 100644 --- a/components/autofill_assistant/browser/controller.cc +++ b/components/autofill_assistant/browser/controller.cc
@@ -1142,6 +1142,8 @@ payment_request_info_ = std::make_unique<PaymentInformation>(); // TODO(crbug.com/806868): set initial state according to proto. + payment_request_info_->terms_and_conditions = + options->initial_terms_and_conditions; } payment_request_options_ = std::move(options);
diff --git a/components/autofill_assistant/browser/payment_request.h b/components/autofill_assistant/browser/payment_request.h index fa8b56b..9df555f9 100644 --- a/components/autofill_assistant/browser/payment_request.h +++ b/components/autofill_assistant/browser/payment_request.h
@@ -57,6 +57,7 @@ std::vector<std::string> supported_basic_card_networks; std::string default_email; std::string confirm_button_text; + TermsAndConditionsState initial_terms_and_conditions = NOT_SELECTED; base::OnceCallback<void(std::unique_ptr<PaymentInformation>)> callback; };
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index 87df20f2..eeb5422 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -997,6 +997,15 @@ // Asks to provide the data used by UseAddressAction and // UseCreditCardAction. message GetPaymentInformationProto { + enum TermsAndConditionsState { + // No choice has been made yet. + NOT_SELECTED = 0; + // The 'accept' radio button is toggled. + ACCEPTED = 1; + // The 'review' radio button is toggled. + REVIEW_REQUIRED = 2; + } + optional string prompt = 1; // NOTE: Payment request does not ask separately for billing address. // The billing address is associated with the credit card that was picked. @@ -1014,6 +1023,8 @@ optional ContactDetailsProto contact_details = 5; // Override for the text of the confirm button in the payment request. optional string confirm_button_text = 7; + // The initial state of the terms & conditions choice. + optional TermsAndConditionsState terms_and_conditions_state = 8; // When 'false', hide the terms and conditions box in the UI. optional bool request_terms_and_conditions = 9 [default = true]; }
diff --git a/components/crash/core/common/BUILD.gn b/components/crash/core/common/BUILD.gn index 8caf17a..e1a5fb35 100644 --- a/components/crash/core/common/BUILD.gn +++ b/components/crash/core/common/BUILD.gn
@@ -153,7 +153,15 @@ sources += [ "objc_zombie_unittest.mm" ] } - if (!is_mac && !is_win && !is_fuchsia && !is_android) { + # TODO(crbug.com/970280): crash_key* is failing on iOS. + if (is_ios) { + sources -= [ + "crash_key_unittest.cc", + "crash_keys_unittest.cc", + ] + } + + if (!is_mac && !is_ios && !is_win && !is_fuchsia && !is_android) { include_dirs = [ "//third_party/breakpad/breakpad/src/" ] sources += [ "crash_key_breakpad_unittest.cc" ] }
diff --git a/components/crash/core/common/objc_zombie.mm b/components/crash/core/common/objc_zombie.mm index 70e47a2..3df8479 100644 --- a/components/crash/core/common/objc_zombie.mm +++ b/components/crash/core/common/objc_zombie.mm
@@ -56,7 +56,17 @@ const size_t kBacktraceDepth = 20; // The original implementation for |-[NSObject dealloc]|. -IMP g_originalDeallocIMP = NULL; +#if OBJC_OLD_DISPATCH_PROTOTYPES +using RealIMP = IMP; +#else +// With !OBJC_OLD_DISPATCH_PROTOTYPES the runtime hasn't changed and IMP is +// still what it always was, but the SDK is hiding the details now outside the +// objc runtime. It is safe to define |RealIMP| to match the older definition of +// |IMP|. +using RealIMP = id (*)(id, SEL, ...); +#endif + +RealIMP g_originalDeallocIMP = NULL; // Classes which freed objects become. |g_fatZombieSize| is the // minimum object size which can be made into a fat zombie (which can @@ -252,8 +262,8 @@ return YES; Class rootClass = [NSObject class]; - g_originalDeallocIMP = - class_getMethodImplementation(rootClass, @selector(dealloc)); + g_originalDeallocIMP = reinterpret_cast<RealIMP>( + class_getMethodImplementation(rootClass, @selector(dealloc))); // objc_getClass() so CrZombie doesn't need +class. g_zombieClass = objc_getClass("CrZombie"); g_fatZombieClass = objc_getClass("CrFatZombie"); @@ -346,9 +356,10 @@ if (!m) return false; - const IMP prevDeallocIMP = method_setImplementation(m, (IMP)ZombieDealloc); + const RealIMP prevDeallocIMP = reinterpret_cast<RealIMP>( + method_setImplementation(m, reinterpret_cast<IMP>(ZombieDealloc))); DCHECK(prevDeallocIMP == g_originalDeallocIMP || - prevDeallocIMP == (IMP)ZombieDealloc); + prevDeallocIMP == reinterpret_cast<RealIMP>(ZombieDealloc)); // Grab the current set of zombies. This is thread-safe because // only the main thread can change these. @@ -420,7 +431,7 @@ // Put back the original implementation of -[NSObject dealloc]. Method m = class_getInstanceMethod([NSObject class], @selector(dealloc)); DCHECK(m); - method_setImplementation(m, g_originalDeallocIMP); + method_setImplementation(m, reinterpret_cast<IMP>(g_originalDeallocIMP)); // Can safely grab this because it only happens on the main thread. const size_t oldCount = g_zombieCount;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_stats_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_stats_unittest.cc index 8de086e..b2c34a86 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_stats_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_stats_unittest.cc
@@ -18,7 +18,6 @@ #include "base/metrics/histogram.h" #include "base/stl_util.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/test/scoped_task_environment.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_test_utils.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.h" @@ -27,7 +26,6 @@ #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_bypass_protocol.h" -#include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params_test_utils.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" @@ -148,10 +146,6 @@ } void SetUp() override { - // TODO(crbug.com/968214): Modify these tests to work correctly with the - // network service (and DRP) enabled by default. - scoped_feature_list_.InitWithFeatures( - {}, {features::kDataReductionProxyEnabledWithNetworkService}); drp_test_context_ = DataReductionProxyTestContext::Builder() .WithURLRequestContext(&context_) .WithMockClientSocketFactory(&mock_socket_factory_) @@ -388,7 +382,6 @@ net::TestDelegate* delegate() { return &delegate_; } private: - base::test::ScopedFeatureList scoped_feature_list_; base::test::ScopedTaskEnvironment task_environment_{ base::test::ScopedTaskEnvironment::MainThreadType::IO}; net::TestDelegate delegate_; @@ -436,31 +429,6 @@ } } -// Verify that when there is a URL redirect cycle, data reduction proxy is -// bypassed for a single request. -TEST_F(DataReductionProxyBypassStatsEndToEndTest, URLRedirectCycle) { - InitializeContext(); - ClearBadProxies(); - base::HistogramTester histogram_tester_1; - CreateAndExecuteURLRedirectCycleRequest(); - - histogram_tester_1.ExpectUniqueSample( - "DataReductionProxy.BypassedBytes.URLRedirectCycle", kBody.size(), 1); - ExpectOtherBypassedBytesHistogramsEmpty( - histogram_tester_1, "DataReductionProxy.BypassedBytes.URLRedirectCycle"); - - // The second request should be sent via the proxy. - base::HistogramTester histogram_tester_2; - CreateAndExecuteRequest(GURL("http://bar.com"), net::LOAD_NORMAL, net::OK, - "HTTP/1.1 200 OK\r\n" - "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n", - kNextBody.c_str(), nullptr, nullptr); - histogram_tester_2.ExpectUniqueSample( - "DataReductionProxy.BypassedBytes.NotBypassed", kNextBody.size(), 1); - ExpectOtherBypassedBytesHistogramsEmpty( - histogram_tester_2, "DataReductionProxy.BypassedBytes.NotBypassed"); -} - TEST_F(DataReductionProxyBypassStatsEndToEndTest, BypassedBytesProxyOverridden) { std::unique_ptr<net::ProxyResolutionService> proxy_resolution_service(
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_interceptor_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_interceptor_unittest.cc index 9a32c28..30fbeb91 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_interceptor_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_interceptor_unittest.cc
@@ -420,66 +420,6 @@ EXPECT_EQ(1, delegate().received_redirect_count()); } -// Test that data reduction proxy is byppassed if there is a URL redirect cycle. -// TODO(crbug.com/968214): Modify this test to work correctly with the -// network service (and DRP) enabled by default. -TEST_F(DataReductionProxyInterceptorEndToEndTest, DISABLED_URLRedirectCycle) { - base::HistogramTester histogram_tester; - MockRead redirect_mock_reads_1[] = { - MockRead("HTTP/1.1 302 Found\r\n" - "Via: 1.1 Chrome-Compression-Proxy\r\n" - "Location: http://bar.com/\r\n\r\n"), - MockRead(""), MockRead(net::SYNCHRONOUS, net::OK), - }; - net::StaticSocketDataProvider redirect_socket_data_provider_1( - redirect_mock_reads_1, base::span<net::MockWrite>()); - mock_socket_factory()->AddSocketDataProvider( - &redirect_socket_data_provider_1); - - MockRead redirect_mock_reads_2[] = { - MockRead("HTTP/1.1 302 Found\r\n" - "Via: 1.1 Chrome-Compression-Proxy\r\n" - "Location: http://foo.com/\r\n\r\n"), - MockRead(""), MockRead(net::SYNCHRONOUS, net::OK), - }; - net::StaticSocketDataProvider redirect_socket_data_provider_2( - redirect_mock_reads_2, base::span<net::MockWrite>()); - mock_socket_factory()->AddSocketDataProvider( - &redirect_socket_data_provider_2); - - // Redirect cycle. - MockRead redirect_mock_reads_3[] = { - MockRead("HTTP/1.1 302 Found\r\n" - "Via: 1.1 Chrome-Compression-Proxy\r\n" - "Location: http://bar.com/\r\n\r\n"), - MockRead(""), MockRead(net::SYNCHRONOUS, net::OK), - }; - net::StaticSocketDataProvider redirect_socket_data_provider_3( - redirect_mock_reads_3, base::span<net::MockWrite>()); - mock_socket_factory()->AddSocketDataProvider( - &redirect_socket_data_provider_3); - - // Data reduction proxy should be bypassed. - MockRead redirect_mock_reads_4[] = { - MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead(kBody.c_str()), - MockRead(net::SYNCHRONOUS, net::OK), - }; - net::StaticSocketDataProvider redirect_socket_data_provider_4( - redirect_mock_reads_4, base::span<net::MockWrite>()); - mock_socket_factory()->AddSocketDataProvider( - &redirect_socket_data_provider_4); - - std::unique_ptr<net::URLRequest> request = - CreateAndExecuteRequest(GURL("http://foo.com")); - - EXPECT_EQ(net::OK, delegate().request_status()); - EXPECT_EQ(200, request->GetResponseCode()); - EXPECT_EQ(kBody, delegate().data_received()); - EXPECT_TRUE(request->proxy_server().is_direct()); - histogram_tester.ExpectTotalCount( - "DataReductionProxy.BypassedBytes.URLRedirectCycle", 1); -} - TEST_F(DataReductionProxyInterceptorEndToEndTest, ResponseWithBypassAndRetry) { // The first try gives a bypass. MockRead initial_mock_reads[] = {
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc index 1d58f799..321a38fb 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc
@@ -24,21 +24,7 @@ namespace data_reduction_proxy { -class DataReductionProxyHeadersTest : public testing::Test { - public: - void SetUp() override { - // TODO(crbug.com/968214): Modify these tests to work correctly with the - // network service (and DRP) enabled by default. This class can be deleted - // and TEST_F => TEST with that change. - scoped_feature_list_.InitWithFeatures( - {}, {features::kDataReductionProxyEnabledWithNetworkService}); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(DataReductionProxyHeadersTest, IsEmptyImagePreview) { +TEST(DataReductionProxyHeadersTest, IsEmptyImagePreview) { const struct { const char* headers; bool expected_result; @@ -86,7 +72,7 @@ } } -TEST_F(DataReductionProxyHeadersTest, IsEmptyImagePreviewValue) { +TEST(DataReductionProxyHeadersTest, IsEmptyImagePreviewValue) { const struct { const char* chrome_proxy_content_transform_header; const char* chrome_proxy_header; @@ -107,7 +93,7 @@ } } -TEST_F(DataReductionProxyHeadersTest, IsLitePagePreview) { +TEST(DataReductionProxyHeadersTest, IsLitePagePreview) { const struct { const char* headers; bool expected_result; @@ -155,7 +141,7 @@ } } -TEST_F(DataReductionProxyHeadersTest, GetDataReductionProxyActionValue) { +TEST(DataReductionProxyHeadersTest, GetDataReductionProxyActionValue) { const struct { const char* headers; std::string action_key; @@ -249,7 +235,7 @@ } } -TEST_F(DataReductionProxyHeadersTest, GetProxyBypassInfo) { +TEST(DataReductionProxyHeadersTest, GetProxyBypassInfo) { const struct { const char* headers; bool expected_result; @@ -501,7 +487,7 @@ } } -TEST_F(DataReductionProxyHeadersTest, ParseHeadersAndSetProxyInfo) { +TEST(DataReductionProxyHeadersTest, ParseHeadersAndSetProxyInfo) { std::string headers = "HTTP/1.1 200 OK\n" "connection: keep-alive\n" @@ -518,7 +504,7 @@ EXPECT_FALSE(data_reduction_proxy_info.bypass_all); } -TEST_F(DataReductionProxyHeadersTest, HasDataReductionProxyViaHeader) { +TEST(DataReductionProxyHeadersTest, HasDataReductionProxyViaHeader) { const struct { const char* headers; bool expected_result; @@ -616,7 +602,7 @@ } } -TEST_F(DataReductionProxyHeadersTest, GetDataReductionProxyBypassEventType) { +TEST(DataReductionProxyHeadersTest, GetDataReductionProxyBypassEventType) { const struct { const char* headers; DataReductionProxyBypassType expected_result; @@ -748,82 +734,4 @@ } } -TEST_F(DataReductionProxyHeadersTest, - GetDataReductionProxyBypassEventTypeURLRedirectCycle) { - const struct { - const char* headers; - std::vector<GURL> url_chain; - DataReductionProxyBypassType expected_result; - } tests[] = { - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{GURL("http://google.com/1"), - GURL("http://google.com/2"), - GURL("http://google.com/1")}, - BYPASS_EVENT_TYPE_URL_REDIRECT_CYCLE, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{ - GURL("http://google.com/1"), GURL("http://google.com/2"), - GURL("http://google.com/1"), GURL("http://google.com/2")}, - BYPASS_EVENT_TYPE_URL_REDIRECT_CYCLE, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{GURL("http://google.com/1")}, BYPASS_EVENT_TYPE_MAX, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{GURL("http://google.com/1"), - GURL("http://google.com/2")}, - BYPASS_EVENT_TYPE_MAX, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{GURL("http://google.com/1"), - GURL("http://google.com/2"), - GURL("http://google.com/3")}, - BYPASS_EVENT_TYPE_MAX, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{ - GURL("http://google.com/1"), GURL("http://google.com/2"), - GURL("http://google.com/3"), GURL("http://google.com/1")}, - BYPASS_EVENT_TYPE_URL_REDIRECT_CYCLE, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>{ - GURL("http://google.com/1"), GURL("http://google.com/2"), - GURL("http://google.com/1"), GURL("http://google.com/3")}, - BYPASS_EVENT_TYPE_MAX, - }, - { - "HTTP/1.1 200 OK\n" - "Via: 1.1 Chrome-Compression-Proxy\n", - std::vector<GURL>(), BYPASS_EVENT_TYPE_MAX, - }}; - - for (const auto& test : tests) { - std::string headers(test.headers); - HeadersToRaw(&headers); - scoped_refptr<net::HttpResponseHeaders> parsed( - new net::HttpResponseHeaders(headers)); - DataReductionProxyInfo chrome_proxy_info; - - EXPECT_EQ(test.expected_result, - GetDataReductionProxyBypassType(test.url_chain, *parsed, - &chrome_proxy_info)); - } -} - } // namespace data_reduction_proxy
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index f95cfee..cfb832a 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -2043,7 +2043,8 @@ RecordDownloadInterrupted(reason, GetReceivedBytes(), total_bytes_, job_ && job_->IsParallelizable(), - IsParallelDownloadEnabled(), download_source_); + IsParallelDownloadEnabled(), download_source_, + received_bytes_at_length_mismatch_ > 0); base::TimeDelta time_since_start = base::Time::Now() - GetStartTime(); int resulting_file_size = GetReceivedBytes();
diff --git a/components/download/internal/common/download_stats.cc b/components/download/internal/common/download_stats.cc index 19b418f..1a91d9e 100644 --- a/components/download/internal/common/download_stats.cc +++ b/components/download/internal/common/download_stats.cc
@@ -12,6 +12,7 @@ #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" #include "base/strings/string_util.h" +#include "build/build_config.h" #include "components/download/public/common/download_interrupt_reasons.h" #include "net/http/http_content_disposition.h" #include "net/http/http_util.h" @@ -605,13 +606,19 @@ int64_t total, bool is_parallelizable, bool is_parallel_download_enabled, - DownloadSource download_source) { + DownloadSource download_source, + bool post_content_length_mismatch) { RecordDownloadCountWithSource(INTERRUPTED_COUNT, download_source); if (is_parallelizable) { RecordParallelizableDownloadCount(INTERRUPTED_COUNT, is_parallel_download_enabled); } + if (post_content_length_mismatch) { + base::UmaHistogramSparse( + "Download.ResumptionAfterContentLengthMismatch.Reason", reason); + } + std::vector<base::HistogramBase::Sample> samples = base::CustomHistogram::ArrayToCustomEnumRanges(kAllInterruptReasonCodes); UMA_HISTOGRAM_CUSTOM_ENUMERATION("Download.InterruptedReason", reason, @@ -1254,4 +1261,16 @@ base::UmaHistogramEnumeration("Download.ResumptionRestart.Counts", type); } +#if defined(OS_ANDROID) +void RecordFirstBackgroundDownloadInterruptReason( + DownloadInterruptReason reason, + bool download_started) { + if (download_started) + base::UmaHistogramSparse("MobileDownload.FirstBackground.StartedReason", + reason); + else + base::UmaHistogramSparse("MobileDownload.FirstBackground.Reason", reason); +} +#endif // defined(OS_ANDROID) + } // namespace download
diff --git a/components/download/public/common/download_stats.h b/components/download/public/common/download_stats.h index bc4d7ae..b1b3947412 100644 --- a/components/download/public/common/download_stats.h +++ b/components/download/public/common/download_stats.h
@@ -15,6 +15,7 @@ #include "base/callback.h" #include "base/optional.h" +#include "build/build_config.h" #include "components/download/public/common/download_content.h" #include "components/download/public/common/download_danger_type.h" #include "components/download/public/common/download_export.h" @@ -260,7 +261,8 @@ int64_t total, bool is_parallelizable, bool is_parallel_download_enabled, - DownloadSource download_source); + DownloadSource download_source, + bool post_content_length_mismatch); // Record that a download has been classified as malicious. COMPONENTS_DOWNLOAD_EXPORT void RecordMaliciousDownloadClassified( @@ -436,6 +438,15 @@ COMPONENTS_DOWNLOAD_EXPORT void RecordResumptionRestartCount( ResumptionRestartCountTypes type); + +#if defined(OS_ANDROID) +// Records the download interrupt reason for the first background download. +// If |download_started| is true, this records the last interrupt reason +// before download is started manually or by the task scheduler. +COMPONENTS_DOWNLOAD_EXPORT void RecordFirstBackgroundDownloadInterruptReason( + DownloadInterruptReason reason, + bool download_started); +#endif // defined(OS_ANDROID) } // namespace download #endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_STATS_H_
diff --git a/components/favicon/core/favicon_request_handler.cc b/components/favicon/core/favicon_request_handler.cc index 33a7cff..7531923 100644 --- a/components/favicon/core/favicon_request_handler.cc +++ b/components/favicon/core/favicon_request_handler.cc
@@ -79,22 +79,10 @@ const bool kFallbackToHost = true; // Parameter used for local bitmap queries by page url. -favicon_base::IconTypeSet GetIconTypesForLocalQuery( - FaviconRequestPlatform platform) { - // The value must agree with the one written in the local data for retrieved - // server icons so that we can find them on the second lookup. This depends on - // whether the caller is a mobile UI or not. - switch (platform) { - case FaviconRequestPlatform::kMobile: - return favicon_base::IconTypeSet{ - favicon_base::IconType::kFavicon, favicon_base::IconType::kTouchIcon, +favicon_base::IconTypeSet GetIconTypesForLocalQuery() { + return {favicon_base::IconType::kFavicon, favicon_base::IconType::kTouchIcon, favicon_base::IconType::kTouchPrecomposedIcon, favicon_base::IconType::kWebManifestIcon}; - case FaviconRequestPlatform::kDesktop: - return favicon_base::IconTypeSet{favicon_base::IconType::kFavicon}; - } - NOTREACHED(); - return favicon_base::IconTypeSet{}; } bool CanOriginQueryGoogleServer(FaviconRequestOrigin origin) { @@ -151,8 +139,8 @@ // First attempt to find the icon locally. favicon_service->GetRawFaviconForPageURL( - page_url, GetIconTypesForLocalQuery(request_platform), - desired_size_in_pixel, kFallbackToHost, + page_url, GetIconTypesForLocalQuery(), desired_size_in_pixel, + kFallbackToHost, base::BindOnce(&FaviconRequestHandler::OnBitmapLocalDataAvailable, weak_ptr_factory_.GetWeakPtr(), page_url, desired_size_in_pixel, @@ -240,8 +228,8 @@ base::BindOnce( base::IgnoreResult(&FaviconService::GetRawFaviconForPageURL), base::Unretained(favicon_service), page_url, - GetIconTypesForLocalQuery(platform), desired_size_in_pixel, - kFallbackToHost, repeating_response_callback, tracker), + GetIconTypesForLocalQuery(), desired_size_in_pixel, kFallbackToHost, + repeating_response_callback, tracker), large_icon_service, icon_url_for_uma, origin); return; }
diff --git a/components/metrics/stability_metrics_helper.cc b/components/metrics/stability_metrics_helper.cc index fbbb316..8be3149 100644 --- a/components/metrics/stability_metrics_helper.cc +++ b/components/metrics/stability_metrics_helper.cc
@@ -225,6 +225,7 @@ } void StabilityMetricsHelper::LogLoadStarted() { + base::RecordAction(base::UserMetricsAction("PageLoad")); IncrementPrefValue(prefs::kStabilityPageLoadCount); IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); // We need to save the prefs, as page load count is a critical stat, and it
diff --git a/components/navigation_metrics/navigation_metrics.cc b/components/navigation_metrics/navigation_metrics.cc index a946b1c..ece9c39 100644 --- a/components/navigation_metrics/navigation_metrics.cc +++ b/components/navigation_metrics/navigation_metrics.cc
@@ -79,7 +79,6 @@ base::RecordAction(base::UserMetricsAction("PageLoadInIncognito")); } - base::RecordAction(base::UserMetricsAction("PageLoad")); } void RecordOmniboxURLNavigation(const GURL& url) {
diff --git a/components/navigation_metrics/navigation_metrics_unittest.cc b/components/navigation_metrics/navigation_metrics_unittest.cc index 262a28b..d48a3196 100644 --- a/components/navigation_metrics/navigation_metrics_unittest.cc +++ b/components/navigation_metrics/navigation_metrics_unittest.cc
@@ -19,7 +19,6 @@ const char* const kMainFrameSchemeOTR = "Navigation.MainFrameSchemeOTR"; const char* const kMainFrameSchemeDifferentPageOTR = "Navigation.MainFrameSchemeDifferentPageOTR"; -const char* const kPageLoad = "PageLoad"; const char* const kPageLoadInIncognito = "PageLoadInIncognito"; constexpr char kMainFrameHasRTLDomain[] = "Navigation.MainFrameHasRTLDomain"; constexpr char kMainFrameHasRTLDomainDifferentPage[] = @@ -30,7 +29,6 @@ TEST(NavigationMetrics, MainFrameSchemeDifferentDocument) { base::HistogramTester test; - base::UserActionTester user_action_tester; RecordMainFrameNavigation(GURL(kTestUrl), false, false); @@ -40,12 +38,10 @@ test.ExpectUniqueSample(kMainFrameSchemeDifferentPage, 1 /* http */, 1); test.ExpectTotalCount(kMainFrameSchemeOTR, 0); test.ExpectTotalCount(kMainFrameSchemeDifferentPageOTR, 0); - EXPECT_EQ(1, user_action_tester.GetActionCount(kPageLoad)); } TEST(NavigationMetrics, MainFrameSchemeSameDocument) { base::HistogramTester test; - base::UserActionTester user_action_tester; RecordMainFrameNavigation(GURL(kTestUrl), true, false); @@ -54,7 +50,6 @@ test.ExpectTotalCount(kMainFrameSchemeDifferentPage, 0); test.ExpectTotalCount(kMainFrameSchemeOTR, 0); test.ExpectTotalCount(kMainFrameSchemeDifferentPageOTR, 0); - EXPECT_EQ(1, user_action_tester.GetActionCount(kPageLoad)); } TEST(NavigationMetrics, MainFrameSchemeDifferentDocumentOTR) {
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index 22c5a8dc..75f05af 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -180,9 +180,8 @@ return; } - const std::string current_url = result_type_running_ == DEFAULT_SERP_FOR_URL - ? current_query_ - : std::string(); + const std::string current_url = + result_type_running_ == REMOTE_SEND_URL ? current_query_ : std::string(); // Create a request for suggestions, routing completion to // OnContextualSuggestionsLoaderAvailable. client() @@ -350,7 +349,7 @@ // When running the personalized service, we want to store suggestion // responses if non-empty. - if (result_type_running_ == DEFAULT_SERP && !json_data.empty()) { + if (result_type_running_ == REMOTE_NO_URL && !json_data.empty()) { client()->GetPrefs()->SetString(omnibox::kZeroSuggestCachedResults, json_data); @@ -564,7 +563,7 @@ } void ZeroSuggestProvider::MaybeUseCachedSuggestions() { - if (result_type_running_ != DEFAULT_SERP) + if (result_type_running_ != REMOTE_NO_URL) return; std::string json_data = @@ -590,7 +589,6 @@ const bool can_send_current_url = CanSendURL( current_url, suggest_url, default_provider, current_page_classification_, template_url_service->search_terms_data(), client()); - // Collect metrics on eligibility. GURL arbitrary_insecure_url(kArbitraryInsecureUrlString); ZeroSuggestEligibility eligibility = ZeroSuggestEligibility::ELIGIBLE; @@ -614,7 +612,7 @@ if (current_page_classification_ == metrics::OmniboxEventProto::CHROMEOS_APP_LIST) { - return DEFAULT_SERP; + return REMOTE_NO_URL; } if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial( @@ -623,7 +621,7 @@ client()->GetPrefs(), client()->IsAuthenticated(), template_url_service) ? MOST_VISITED - : DEFAULT_SERP; + : REMOTE_NO_URL; } if (OmniboxFieldTrial::InZeroSuggestMostVisitedWithoutSerpFieldTrial( @@ -642,7 +640,7 @@ if (can_send_current_url && OmniboxFieldTrial::InZeroSuggestRemoteSendURLFieldTrial( current_page_classification_)) { - return DEFAULT_SERP_FOR_URL; + return REMOTE_SEND_URL; } return NONE;
diff --git a/components/omnibox/browser/zero_suggest_provider.h b/components/omnibox/browser/zero_suggest_provider.h index 38e8e77..8574960 100644 --- a/components/omnibox/browser/zero_suggest_provider.h +++ b/components/omnibox/browser/zero_suggest_provider.h
@@ -64,6 +64,7 @@ void ResetSession() override; private: + FRIEND_TEST_ALL_PREFIXES(ZeroSuggestProviderTest, TypeOfResultToRun); FRIEND_TEST_ALL_PREFIXES(ZeroSuggestProviderTest, TestStartWillStopForSomeInput); ZeroSuggestProvider(AutocompleteProviderClient* client, @@ -76,12 +77,19 @@ // at any time. enum ResultType { NONE, - DEFAULT_SERP, // The default search provider is queried for - // zero-suggest suggestions. - DEFAULT_SERP_FOR_URL, // The default search provider is queried for - // zero-suggest suggestions that are specific - // to the visited URL. - MOST_VISITED + + // A remote endpoint (usually the default search provider) is queried for + // suggestions. The endpoint is sent the user's authentication state, but + // not sent the current URL. + REMOTE_NO_URL, + + // A remote endpoint (usually the default search provider) is queried for + // suggestions. The endpoint is sent the user's authentication state and + // the current URL. + REMOTE_SEND_URL, + + // Gets the most visited sites from local history. + MOST_VISITED, }; // BaseSearchProvider: @@ -177,7 +185,8 @@ // The type of page the user is viewing (a search results page doing search // term replacement, an arbitrary URL, etc.). - metrics::OmniboxEventProto::PageClassification current_page_classification_; + metrics::OmniboxEventProto::PageClassification current_page_classification_ = + metrics::OmniboxEventProto::INVALID_SPEC; // Copy of OmniboxEditModel::permanent_text_. base::string16 permanent_text_;
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc index 3437a53..64a57338 100644 --- a/components/omnibox/browser/zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -14,6 +14,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/test/scoped_task_environment.h" +#include "build/build_config.h" #include "components/history/core/browser/top_sites.h" #include "components/omnibox/browser/autocomplete_provider_listener.h" #include "components/omnibox/browser/mock_autocomplete_provider_client.h" @@ -151,7 +152,6 @@ void CreatePersonalizedFieldTrial(); void CreateMostVisitedFieldTrial(); - void CreateContextualSuggestFieldTrial(); void SetZeroSuggestVariantForAllContexts(const std::string& variant); base::test::ScopedTaskEnvironment scoped_task_environment_; @@ -205,6 +205,36 @@ variant}}); } +TEST_F(ZeroSuggestProviderTest, TypeOfResultToRun) { + GURL current_url = GURL("https://example.com/"); + GURL suggest_url = GURL("https://www.google.com/complete/?q={searchTerms}"); + + EXPECT_CALL(*client_, IsAuthenticated()) + .WillRepeatedly(testing::Return(true)); + EXPECT_CALL(*client_, IsPersonalizedUrlDataCollectionActive()) + .WillRepeatedly(testing::Return(true)); + +#if defined(OS_IOS) || defined(OS_ANDROID) + EXPECT_EQ(ZeroSuggestProvider::ResultType::MOST_VISITED, + provider_->TypeOfResultToRun(current_url, suggest_url)); +#else + EXPECT_EQ(ZeroSuggestProvider::ResultType::NONE, + provider_->TypeOfResultToRun(current_url, suggest_url)); +#endif + + SetZeroSuggestVariantForAllContexts("RemoteSendURL"); + EXPECT_EQ(ZeroSuggestProvider::ResultType::REMOTE_SEND_URL, + provider_->TypeOfResultToRun(current_url, suggest_url)); + + CreatePersonalizedFieldTrial(); + EXPECT_EQ(ZeroSuggestProvider::ResultType::REMOTE_NO_URL, + provider_->TypeOfResultToRun(current_url, suggest_url)); + + CreateMostVisitedFieldTrial(); + EXPECT_EQ(ZeroSuggestProvider::ResultType::MOST_VISITED, + provider_->TypeOfResultToRun(current_url, suggest_url)); +} + TEST_F(ZeroSuggestProviderTest, TestDoesNotReturnMatchesForPrefix) { CreatePersonalizedFieldTrial();
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index 7403694..132eb23 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -1184,25 +1184,6 @@ ይህ መመሪያ ወደ ሐሰት ከተዋቀረ WPAD ማትቢያ በመሰናከል <ph name="PRODUCT_NAME" /> በDNS ላይ ለተመሠረቱ የWPAD አገልጋዮች ለረዥም ጊዜ እንዲጠብቁ ያደርጋል። መመሪያው ካልዋቀረ ወይም ከነቃ WPAD ማትቢያ ይነቃል። ይህ መመሪያ ተዋቀረ አልተዋቀረ ወይም ይህ እንዴትም ይዋቀር የWPAD ማትቢያ ውቅረቱ በተጠቃሚዎች ሊለወጥ አይችልም።</translation> -<translation id="3071839057966069710">የአታሚዎችን ዝርዝር ያዋቅራል - - ይህ መመሪያ አስተዳዳሪዎች ለእነርሱ ተጠቃሚዎች የአታሚ ውቅረቶችን እንዲያቀርቡ - ያስችላቸዋል። - - <ph name="PRINTER_DISPLAY_NAME" /> እና <ph name="PRINTER_DESCRIPTION" /> ለአታሚ ምርጫ ቅለት ብጁ ሊደረጉ የሚችሉ ነጻ የኅብረ ቁምፊ ዓይነቶች ናቸው። <ph name="PRINTER_MANUFACTURER" /> እና <ph name="PRINTER_MODEL" /> በመጨረሻ ተጠቃሚዎች የአታሚ ለይቶ ማወቅን ለማቅለል ያገለግላሉ። የአማራቹን እና የአታሚውን ሞዴል ይወክላሉ። <ph name="PRINTER_URI" /> የ <ph name="URI_SCHEME" />፣ <ph name="URI_PORT" />፣ እና <ph name="URI_QUEUE" /> ጨምሮ ከደንበኛው ኮምፒውተር ላይ ሊደረስበት የሚችል አድራሻ መሆን አለበት።<ph name="PRINTER_UUID" /> ግዴታ ያልሆነ ነው። ከተሰጠ፣ ድግምግሞሽ <ph name="ZEROCONF_DISCOVERY" /> አታሚዎችን ለማገዝ ጥቅም ላይ ይውላል። - - <ph name="PRINTER_EFFECTIVE_MODEL" /> የ <ph name="PRODUCT_NAME" /> የሚደገፍ አታሚን ከሚወክሉ ኅብረ ቁምፊዎች ከአንዱ ጋር መዛመድ አለበት። ኅብረ ቁምፊው ለአታሚው ተገቢነት ያለው PPD ን ለይቶ ለማወቅ እና ለመጫን ጥቅም ላይ ይውላል። ተጨማሪ መረጃ እዚህ ላይ ሊገኝ ይችላል፦ https://support.google.com/chrome?p=noncloudprint። - - <ph name="PRINTER_AUTOCONF" /> IPP Everywhere ለአታሚው ለማቀናበር መዋቀር እንዳለበት እና እንደሌለበት የሚጠቁም የቡልያን ጠቁም ነው። ይህ ጠቁም <ph name="PRODUCT_OS_NAME" /> ስሪት 76 እና ከዚያ በላይ ላይ የሚደገፍ ነው። - - አሊያም <ph name="PRINTER_EFFECTIVE_MODEL" /> የአታሚውን ስም በውስጡ ሊይዝ ይገባል ወይም <ph name="PRINTER_AUTOCONF" /> ወደ እውነት መቀናበር አለበት። ሁለቱም ያሉዋቸው ወይም ምንም ይዘቶች የሌሉዋቸው አታሚዎች ችላ ይባላሉ። - - የአታሚ ቅንብር አታሚው ለመጀመሪያ ጊዜ ጥቅም ላይ ሲውል ይጠናቀቃል። PPDዎች አታሚው ጥቅም ላይ እስከሚውል ድረስ አይወርዱም። ከዚያ ጊዜ በኋላ፣ ብዙውን ጊዜ ጥቅም ላይ የሚውሉ PPDዎች ይሸጎጣሉ። - - ይህ መመሪያ ተጠቃሚዎች በነፍስ ወከፍ መሣሪያዎች ላይ አታሚዎችን ማዋቀር መቻለ አለመቻላቸው ላይ ምንም ተጽዕኖ አይኖረውም። በነፍስ ወከፍ ተጠቃሚዎች አታሚዎችን ሲያዋቅሩ እንደ ተጨማሪ አጋዥ እንዲሆን የታሰበ ነው። - - በ Active Directory ለሚተዳደሩ መሣሪያዎች ይህ መመሪያ <ph name="MACHINE_NAME_VARIABLE" /> ወደ Active Directory ማሽን ስሙ ወይም የእሱ ንዑስ ኅብረ ቁምፊ እንዲስፋፋ ይደግፋል። ለምሳሌ፣ የማሽኑ ስም <ph name="MACHINE_NAME_EXAMPLE" /> ከሆነ፣ <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ከ6ኛው ቦታ አቀማመጥ ጀምሮ በ4 ቁምፊዎች ይተካል፣ ለምሳሌ <ph name="MACHINE_NAME_PART_EXAMPLE" />። ቦታ አቀማመጡ በዜሮ ላይ የተመረኮዘ እንደሆነ ልብ ይበሉ። - </translation> <translation id="3072045631333522102">በችርቻሮ ሁነታ ላይ የመግቢያ ማያው ላይ ስራ ላይ የሚውለው የማያ ገጽ ማዳኛ</translation> <translation id="3072847235228302527">የመሣሪያ-አካባቢያዊ መለያ አገልግሎት ውል ያዋቅሩ</translation> <translation id="3077183141551274418">የትር የዕድሜ ዑደትን ያነቃል ወይም ያሰናክላል</translation> @@ -1342,13 +1323,6 @@ ይህን መመሪያ ካቀናበሩት፣ ተጠቃሚዎች ሊለውጡት ወይም ሊሽሩት አይችሉም። ይህ መመሪያ ሳይቀናበር ከተተወ፣ የኃይል ጣሪያ መቀየሪያ ከጅምሩ ይሰናከላል እና በተጠቃሚ ሊነቃ አይችልም።</translation> -<translation id="3388153794103186066">የትኛዎቹ ጣቢያዎች በራስ-ሰር ከቀረበው አገልግሎት ሻጭ እና የምርት መታወቂያዎች ጋር የዩኤስቢ መሣሪያን ለመድረስ ፈቃድ እንደሚሰጡ የዩአርኤሎች ዝርዝርን እንዲያዘጋጁ ያስችልዎታል። የሚሠራ እንዲሆን በዝርዝሩ ውስጥ ያለውን እያንዳንዱ ንጥል መሣሪያዎችን እና ዩአርኤሎችን ሁለቱንም በትክክለኛ አቀማመጥ መያዝ ይኖርበታል። በመሣሪያዎች ውስጥ ያለው እያንዳንዱ ንጥል የአገልግሎት ሻጭ መታወቂያ እና የምርት መታወቂያ መስክ በውስጡ ሊይዝ ይችላል። እንዲቀር የተደረገ ማናቸውም መታወቂያ ከአንድ ልዩ ሁኔታ ጋር እንደ ልዩ መታወቂያ ይስተናገዳል፤ ይኸው ልዩ ሁኔታ የምርት መታወቂያ የተለየ የሻጭ መታወቂያ በተጨማሪ ሳይጠቀስ ሊጠቀስ አይችልም። አለበለዚያ፣ መመሪያው የሚሠራ አይሆንም እና ችላ ተብሎ ይታለፋል። - - የዩኤስቢ ፈቃድ ሞዴሉ የጠያቂውን ጣቢያ («ጠያቂ ዩአርኤል») ዩአርኤል እና የከፍተኛውን ክፍለ ድረገጽ ዩአርኤል («ተካታች ዩአርኤል») ለጠያቂው ዩአርኤል ወደ ዩኤስቢ መሣሪያ እንዲደርስ ፈቃድ ለመስጠት ይጠቀማል። ጠያቂው ዩአርኤል በiframe ውስጥ የሚሰቀል ከሆነ ጠያቂው ዩአርኤል ከተካታቹ ዩአርኤል የተለየ ሊሆን ይችላል። በመሆኑም የ«ዩአርኤሎች» መስክ በኮማ የተለዩ እስከ ሁለት የሚደርሱ ዩአርኤል ኅብረ ቁምፊዎች በውስጡ ሊይዝ ይችላል። አንድ ብቻ ዩአርኤል ከተጠቀሰ ጠያቂው ዩአርኤል ተካታች ይሁን አይሁን ከግምት ሳይገባ ወደ ተዛማጆቹ ዩኤስቢ መሣሪያዎች መዳረሻ ይሰጣል። በ«ዩአርኤሎች» ውስጥ ያለው ዩአርኤል የሚሠሩ ዩአርኤል መሆን አለባቸው፤ አለበለዚያ መመሪያው ችላ ተብሎ ይታለፋል። - - ይህ መመሪያ ሳይቀናበር ከተተወ ሁለንተናዊው ነባሪ እሴት ከ«DefaultWebUsbGuardSetting» መመሪያ ከተዋቀረ ወይም የተጠቃሚው የግል ውቅረት አለበለዚያ ለሁሉም ጣቢያዎች ጥቅም ላይ ይውላል። - - በዚህ መመሪያ ውስጥ ያሉ ዩአርኤል ሥርዓተ ጥለቶች በWebUsbBlockedForUrls ከተዋቀሩት ጋር መጋጨት የለባቸውም። ግጭት ካለ፣ ይህ መመሪያ በWebUsbBlockedForUrls እና በWebUsbAskForUrls ላይ የበላይነት ይኖረዋል።</translation> <translation id="3414260318408232239">ይህ መመሪያ ካልተዋቀረ <ph name="PRODUCT_NAME" /> ነባሪው አነስተኛ ስሪት የሆነውን TLS 1.0 ይጠቀማል። አለበለዚያ ከሚከተሉት እሴቶች ውስጥ ወደ አንዱ ሊዋቀር ይችላል፦ «tls1»፣ «tls1.1» ወይም «tls1.2»። ሲዋቀር <ph name="PRODUCT_NAME" /> ከተገለጸው ስሪት በታች የሆኑ የSSL/TLS ስሪቶችን አይጠቀምም። ያልታወቀ እሴት ችላ ይባላል።</translation>
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index bba12ee..6df6866 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -1167,25 +1167,6 @@ إذا تم تعيين هذه السياسة على "false"، فإنه سيتم إيقاف تحسين WPAD مما يتسبب في انتظار <ph name="PRODUCT_NAME" /> لفترة أطول لخوادم WPAD المستندة إلى نظام أسماء النطاقات. في حالة عدم تعيين السياسة أو عدم تفعيلها، فإنه سيتم تفعيل تحسين WPAD. وبغض النظر عن سبب أو كيفية تعيين هذه السياسة، فإنه يتعذر تغيير إعداد WPAD من خلال المستخدمين.</translation> -<translation id="3071839057966069710">تعمل هذه السياسة على ضبط قائمة بالطابعات. - - تسمح هذه السياسة للمشرفين بتوفير عمليات ضبط الطابعات - للمستخدمين. - - <ph name="PRINTER_DISPLAY_NAME" /> و<ph name="PRINTER_DESCRIPTION" /> هما سلسلتان حرتان يمكن تخصيصهما لتسهيل اختيار الطابعة. يُسهّل <ph name="PRINTER_MANUFACTURER" /> و<ph name="PRINTER_MODEL" /> على المستخدمين مهمة التعرُّف على الطابعة. إذ يمثّلان الشركة المُصنّعة للطابعة وطرازها. يجب أن يكون <ph name="PRINTER_URI" /> عنوانًا يمكن الوصول إليه من جهاز كمبيوتر العميل، بما في ذلك <ph name="URI_SCHEME" /> و<ph name="URI_PORT" /> و<ph name="URI_QUEUE" />. ويكون <ph name="PRINTER_UUID" /> اختياريًا. وفي حال توفّره، يتم استخدامه للمساعدة في إزالة تكرار طابعات <ph name="ZEROCONF_DISCOVERY" />. - - يجب أن يُطابِق <ph name="PRINTER_EFFECTIVE_MODEL" /> إحدى السلاسل التي تمثل طابعة <ph name="PRODUCT_NAME" /> مدعومة. سيتم استخدام السلسلة للتعرُّف على ملف PPD المناسب للطابعة وتثبيته. يمكن الحصول على مزيد من المعلومات على https://support.google.com/chrome?p=noncloudprint. - - وتكون <ph name="PRINTER_AUTOCONF" /> علامة منطقية تشير إلى ما إذا كان يجب استخدام بروتوكول الطباعة على الإنترنت (IPP) Everywhere لإعداد الطابعة أم لا. تتوفّر هذه العلامة في الإصدار 76 والإصدارات الأحدث من <ph name="PRODUCT_OS_NAME" />. - - يجب أن يحتوي <ph name="PRINTER_EFFECTIVE_MODEL" /> على اسم الطابعة أو يجب ضبط <ph name="PRINTER_AUTOCONF" /> على "True". سيتم تجاهل الطابعات التي تحتوي على الاسم أو مضبوطة على "True"، أو التي بدون أي خصائص. - - يكتمل إعداد الطابعة عند استخدامها لأول مرة. ولا يتم تنزيل ملفات PPD حتى يتم استخدام الطابعة. وبعد ذلك، يتم تخزين ملفات PPD المستخدمة بشكل متكرر تخزينًا مؤقتًا. - - لا تؤثِّر هذه السياسة على إمكانية ضبط المستخدمين للطابعات على الأجهزة الفردية. قد تم إعدادها لتكون مكمّلة لضبط الطابعات من قِبل المستخدمين الفرديين. - - بالنسبة إلى أجهزة Active Directory المُدارة، تدعم هذه السياسة توسيع <ph name="MACHINE_NAME_VARIABLE" /> ليشمل اسم جهاز Active Directory أو سلسلة فرعية له. مثلاً، إذا كان اسم الجهاز <ph name="MACHINE_NAME_EXAMPLE" />، حينئذٍ يتم استبدال <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> بسلسلة مكونة من 4 أحرف بعد الموضع السادس، مثل <ph name="MACHINE_NAME_PART_EXAMPLE" />. يُذكر أن الموضع يبدأ من الصفر. - </translation> <translation id="3072045631333522102">شاشة التوقف المراد استخدامها على شاشة تسجيل الدخول في وضع البيع بالتجزئة</translation> <translation id="3072847235228302527">تعيين بنود الخدمة لحساب محلي على الجهاز</translation> <translation id="3077183141551274418">تفعيل دورات حياة علامات التبويب أو إيقافها</translation> @@ -1321,13 +1302,6 @@ في حال ضبط هذه السياسة، لن يتمكَّن المستخدمون من تغييرها أو إلغائها. في حال ترك هذه السياسة بدن ضبط، يتم إيقاف تحويل طاقة الذروة في البداية ولن يتمكن المستخدم من تفعيله.</translation> -<translation id="3388153794103186066">تسمح هذه السياسة بإعداد قائمة بعناوين URL التي تحدِّد المواقع الإلكترونية التي سيتم منحها إذن الوصول إلى جهاز USB تلقائيًا مع أرقام تعريف المنتج والمورِّد المذكورة. ويجب أن يحتوي كل عنصر في القائمة على الجهازين وعناوين URL حتى تكون السياسة صالحة. ويمكن أن يحتوي كل عنصر في الأجهزة على حقل مٌعرِّف المورِّد ومعرِّف المنتج. ويتم التعامل مع أي معرِّف تم حذفه كحرف بدل مع استثناء واحد هو أنه لا يمكن تحديد معرِّف المنتج بدون تحديد معرِّف المورِّد. وبخلاف ذلك، لن تكون السياسة صالحة وسيتم تجاهلها. - - يستخدم نموذج إذن USB عنوان URL للموقع المطلوب ("عنوان URL المطلوب") وعنوان URL لموقع الإطار ذي المستوى الأعلى ("عنوان URL المُضمَّن") لمنح الإذن إلى عنوان URL المطلوب للوصول إلى جهاز USB. وقد يكون عنوان URL المطلوب مختلفًا عن عنوان URL المُضمَّن عندما يتم تحميل الموقع المطلوب في إطار iframe. ولذلك، يمكن أن يحتوي حقل "عناوين URL" على ما يصل إلى سلسلتي عناوين URL مفصولتين بفاصلة لتحديد عنوان URL المطلوب والمُضمّن على التوالي. وفي حال تحديد عنوان URL واحد فقط، حينئذٍ سيتم منح الوصول إلى أجهزة USB المطابقة عندما يطابق عنوان URL للموقع المطلوب عنوان URL هذا، بصرف النظر عن الحالة المُضمّنة. ويجب أن تكون عناوين URL في "urls" عناوين URL صالحة، وإلا سيتم تجاهل السياسة. - - في حال عدم ضبط هذه السياسة، سيتم استخدام القيمة التلقائية العامة لجميع المواقع الإلكترونية إما من السياسة "DefaultWebUsbGuardSetting" في حال ضبطها، أو من الضبط الشخصي للمستخدم. - - يجب ألا تتعارض أنماط عناوين URL في هذه السياسة مع الأنماط التي تم ضبطها عبر WebUsbBlockedForUrls. وفي حال كان هناك تعارض، ستكون لهذه السياسة الأولوية عن WebUsbBlockedForUrls وWebUsbAskForUrls.</translation> <translation id="3414260318408232239">إذا لم تتم تهيئة هذه السياسة، سيستخدم عندئذ <ph name="PRODUCT_NAME" /> إصدار أدنى تلقائي وهو الإصدار 1.0 من طبقة النقل الآمنة (TLS). وإلا قد يتم تعيينها على إحدى القيم التالية: "tls1" أو "tls1.1" أو "tls1.2". عند تعيينها، لن يستخدم <ph name="PRODUCT_NAME" /> إصدارات طبقة المقابس الآمنة (SSL)/طبقة النقل الآمنة (TLS) الأقل من الإصدار المُحدد. وسيتم تجاهل أي قيمة غير معروفة.</translation>
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 2c0e189..59a1b35 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -1160,25 +1160,6 @@ Ако за това правило е зададено false, оптимизирането на WPAD ще е деактивирано. Така <ph name="PRODUCT_NAME" /> ще чака по-дълго време основаните на DNS сървъри за WPAD. В случай че правилото не е конфигурирано или е активирано, оптимизирането ще е включено. Независимо дали или как е зададено правилото, потребителите няма да могат да променят настройката за оптимизиране на WPAD.</translation> -<translation id="3071839057966069710">Конфигурира списък с принтери. - - Това правило дава възможност на администраторите да предоставят конфигурации на принтери за -потребителите си. - - <ph name="PRINTER_DISPLAY_NAME" /> и <ph name="PRINTER_DESCRIPTION" /> са низове в свободна форма, които могат да се персонализират за улесняване на избирането на принтер. <ph name="PRINTER_MANUFACTURER" /> и <ph name="PRINTER_MODEL" /> служат за улесняване на разпознаването на принтерите от крайните потребители и представят производителя и модела на устройството. <ph name="PRINTER_URI" /> трябва да бъде адрес, достъпен от компютър клиент, като съдържа <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> и <ph name="URI_QUEUE" />. Идентификаторът <ph name="PRINTER_UUID" /> не е задължителен. Ако бъде посочен, служи за по-лесно премахване на дублиращите се принтери, открити чрез протокола <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> трябва да съвпада с някой от низовете, които представят поддържан от <ph name="PRODUCT_NAME" /> принтер. Низът ще се използва за идентифициране и инсталиране на подходящия PPD файл за принтера. Повече информация можете да намерите на адрес https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> е булеви флаг, указващ дали за настройването на принтера трябва да се използва IPP Everywhere. Този флаг се поддържа в <ph name="PRODUCT_OS_NAME" /> 76 и по-нови версии. - - Или <ph name="PRINTER_EFFECTIVE_MODEL" /> трябва да съдържа името на принтера, или за <ph name="PRINTER_AUTOCONF" /> трябва да бъде зададено true. Принтерите, за които са използвани и двете свойства или за които не е зададено нито едно, ще бъдат пренебрегнати. - - Настройването на принтера завършва при първото му използване. PPD файловете не се изтеглят, преди принтерът да влезе в употреба. След това често използваните PPD файлове се кешират. - - Това правило няма ефект върху възможността на потребителите да конфигурират принтери на отделни устройства. То е предназначено да допълва конфигурирането на принтери от отделните потребители. - - За устройства, управлявани чрез Active Directory, това правило поддържа разширяване на <ph name="MACHINE_NAME_VARIABLE" /> до името на машината в Active Directory или до подниз от него. Ако например името е <ph name="MACHINE_NAME_EXAMPLE" />, променливата <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ще бъде заменена с четирите знака, започващи след шестата позиция, напр. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Обърнете внимание, че отброяването на позицията започва от нула. - </translation> <translation id="3072045631333522102">Скрийнсейвър, който да се използва на екрана за вход в режим за търговски експонати</translation> <translation id="3072847235228302527">Задаване на Общите условия за локален за устройството профил</translation> <translation id="3077183141551274418">Активиране или деактивиране на жизнените цикли за разделите</translation> @@ -1314,13 +1295,6 @@ Ако зададете правилото, потребителите няма да могат да го променят или отменят. В случай че правилото не е зададено, режимът за енергоспестяване в пикови часове е деактивиран и не може да бъде активиран от потребителя.</translation> -<translation id="3388153794103186066">Дава възможност да определите списък с URL адреси, които посочват на кои сайтове автоматично ще бъде разрешен достъп до USB устройство с дадените идентификатори на доставчик и продукт. Всеки елемент в списъка трябва да съдържа устройства и URL адреси, за да бъде правилото валидно. Всеки запис за устройство може да съдържа полета за идентификатор на доставчик и идентификатор на продукт. Ако бъде пропуснат идентификатор, той се третира като заместващ символ. Не може да бъде посочен идентификатор на продукта, без да бъде посочен и идентификатор на доставчика. В противен случай правилото няма да бъде валидно и се пренебрегва. - - Моделът за разрешения за USB използва URL адреса на сайта, отправил заявката („URL адрес на заявката“), и URL адреса на съдържащия рамката сайт от най-високо ниво („URL адрес на вграждането“), за да предостави на URL адреса на заявката разрешение за достъп до USB устройството. URL адресът на заявката може да е различен от този на вграждането, когато отправилият заявката сайт е зареден във вложена рамка. Поради това полето urls може да съдържа до два низа с URL адреси, разделени със запетая, които посочват адресите съответно на заявката и на вграждането. Ако е посочен само един URL адрес, достъп до съответните USB устройства ще се предоставя, когато URL адресът на сайта, отправил заявката, съвпада с този адрес, независимо какво е състоянието на вграждане. URL адресите в полето urls трябва да са валидни, в противен случай правилото ще бъде пренебрегнато. - - Ако правилото не е зададено, ще се използва глобалната стандартна стойност от правилото DefaultWebUsbGuardSetting, а ако то не е зададено, от личната конфигурация на потребителя. - - Шаблоните за URL адресите в това правило не бива да са в конфликт с конфигурираните чрез WebUsbBlockedForUrls. В случай на конфликт това правило има приоритет пред WebUsbBlockedForUrls и WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Ако правилото не е конфигурирано, <ph name="PRODUCT_NAME" /> използва минималната версия по подразбиране, която е TLS 1.0. Иначе може да бъде зададена една от следните стойности: tls1, tls1.1 или tls1.2. В този случай <ph name="PRODUCT_NAME" /> няма да използва версии на SSL/TLS, по-малки от посочената. Неразпознатите стойности ще бъдат пренебрегвани.</translation>
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 6dbba7c..7b97261 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -1189,24 +1189,6 @@ এই নীতিটি মিথ্যাতে সেট করা হলে, <ph name="PRODUCT_NAME" /> কে ডিএনএস ভিত্তিক WPAD সার্ভারের জন্য অপেক্ষা করানোর মাধ্যমে WPAD অপটিমাইজেশান বন্ধ করা হয়। নীতিটি সেট না করা হলে বা চালু থাকলে, WPAD অপটিমাইজেশান চালু করা হয়। এই নীতি সেট করা আছে কিনা বা কিভাবে সেট করা আছে, তা যাই হোক না কেন, WPAD অপটিমাইজেশান সেটিং ব্যবহারকারীদের দ্বারা পরিবর্তন করা যাবে না।</translation> -<translation id="3071839057966069710">প্রিন্টারের একটি সূচি কনফিগার করে। - - এই নীতির মাধ্যমে অ্যাডমিনিস্ট্রেটররা ব্যবহারকারীদের জন্য প্রিন্টার কনফিগার করেন। - - সহজে প্রিন্টার বেছে নিতে কাস্টমাইজ করা যায় এমন <ph name="PRINTER_DISPLAY_NAME" /> ও <ph name="PRINTER_DESCRIPTION" /> ফ্রি-ফর্ম স্ট্রিং দুটি ব্যবহার করা হয়। <ph name="PRINTER_MANUFACTURER" /> ও <ph name="PRINTER_MODEL" />-এর সাহায্যে ব্যবহারকারীরা সহজেই কোনও প্রিন্টার চিনে নিতে পারেন। এই দুটি থেকে প্রিন্টারের প্রস্তুতকারক এবং মডেল নম্বর দেখা যায়। কোনও ক্লায়েন্ট কম্পিউটার থেকে অ্যাক্সেস করা যায় এমন একটি ঠিকানা <ph name="PRINTER_URI" />-এ উল্লেখ করতে হবে। সেটির মধ্যে <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ও <ph name="URI_QUEUE" /> অন্তর্ভুক্ত থাকে। ঐচ্ছিকভাবে <ph name="PRINTER_UUID" /> লেখা যেতে পারে। উল্লেখ করা থাকলে, এটি <ph name="ZEROCONF_DISCOVERY" /> প্রিন্টারের ডুপ্লিকেট সরানোর জন্য ব্যবহার করা হয়। - - <ph name="PRODUCT_NAME" />-এ ব্যবহার উপযোগী প্রিন্টারকে উপস্থাপিত করে এমন স্ট্রিংগুলির যেকোনও একটির সাথে <ph name="PRINTER_EFFECTIVE_MODEL" />-কে মিলতে হবে। প্রিন্টারের জন্য উপযুক্ত PPD শনাক্ত এবং ইনস্টল করতে এই স্ট্রিং ব্যবহার করা হয়। আরও জানতে https://support.google.com/chrome?p=noncloudprint দেখুন। - - প্রিন্টার সেট-আপ করতে IPP Everywhere ব্যবহার করা হবে কিনা তা বোঝাতে <ph name="PRINTER_AUTOCONF" /> বুলিয়ান ফ্ল্যাগ ব্যবহার করা হয়। এই ফ্ল্যাগ <ph name="PRODUCT_OS_NAME" />-এর 76 সহ পরবর্তী ভার্সনগুলিতে ব্যবহার করা যাবে। - - <ph name="PRINTER_EFFECTIVE_MODEL" />-এ প্রিন্টারের নাম থাকতে হবে অথবা <ph name="PRINTER_AUTOCONF" />-কে ট্রু হিসেবে সেট করতে হবে। উভয় প্রপার্টি আছে বা কোনওটিই নেই এমন প্রিন্টার অগ্রাহ্য করা হবে। - - কোনও প্রিন্টার প্রথমবার ব্যবহার করার সময় সেটির সেট-আপ সম্পূর্ণ হয়। প্রিন্টার ব্যবহার না করা পর্যন্ত PPD ডাউনলোড হয় না। এর পরে, প্রায়ই ব্যবহার করা হয় এমন PPD ক্যাশে করে রাখা হয়। - - ব্যবহারকারীরা স্বতন্ত্র ডিভাইসে প্রিন্টার কনফিগার করতে পারবেন কিনা তার উপর এই নীতির কোনও প্রভাব থাকে না। ব্যবহারকারী প্রিন্টারের যে কনফিগারেশন করেন সেটির পরিপূরক হিসেবে এই নীতি কাজ করে। - - অ্যাক্টিভ ডিরেক্টরি দ্বারা ম্যানেজ করা ডিভাইসের ক্ষেত্রে এই নীতি, অ্যাক্টিভ ডিরেক্টরি মেশিনের নাম বা সেটির একটি সাবস্ট্রিং <ph name="MACHINE_NAME_VARIABLE" />-এ অন্তর্ভুক্ত করতে দেয়। যেমন মেশিনের নাম <ph name="MACHINE_NAME_EXAMPLE" /> হলে, নামের ষষ্ঠ স্থানের পর থেকে শুরু করে ৪টি অক্ষর অর্থাৎ <ph name="MACHINE_NAME_PART_EXAMPLE" /> দিয়ে <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> প্রতিস্থাপিত হয়ে যাবে। মনে রাখবেন যে স্থান শূন্য থেকে গণনা করা শুরু হয়। - </translation> <translation id="3072045631333522102">রিটেল মোডে সাইন-ইন স্ক্রিনে স্ক্রিন সেভার ব্যবহৃত হবে।</translation> <translation id="3072847235228302527">একটি ডিভাইস-স্থানীয় অ্যাকাউন্টের জন্য পরিষেবার শর্তাদি সেট করুন</translation> <translation id="3077183141551274418">ট্যাব লাইফসাইকেল চালু অথবা বন্ধ করা</translation> @@ -1343,13 +1325,6 @@ এই নীতি আপনি নিজে সেট করলে ব্যবহারকারীরা এটি পরিবর্তন বা ওভাররাইড করতে পারবেন না। এই নীতি সেট করা না থাকলে প্রথমে Power Peak Shift বন্ধ থাকবে এবং ব্যবহারকারীরা এটি চালু করতে পারবেন না।</translation> -<translation id="3388153794103186066">প্রদত্ত বিক্রেতার এবং প্রোডাক্ট আইডি ব্যবহার করে কোনও ইউএসবি ডিভাইস অ্যাক্সেসের অনুমতি দিতে হবে কিনা তা নির্দিষ্ট করে এমন ইউআরএলগুলির একটি তালিকা সেট করতে আপনাকে অনুমতি দেয়। নীতিটি ন্যায্য হতে হলে তালিকার প্রতিটি আইটেমে ডিভাইস এবং ইউআরএল অবশ্যই থাকতে হবে। ডিভাইসে প্রতিটি আইটেমে বিক্রেতা আইডি এবং প্রোডাক্ট আইডি থাকতে পারে। কোনও বাদ দেওয়া আইডি ওয়াইল্ডকার্ড হিসেবে বিবেচিত হয় একটি ব্যতিক্রমসহ, সেটি হল কোনও প্রোডাক্ট আইডি ঠিক না করা পর্যন্ত বিক্রেতা আইডি ঠিক করা যাবে না। যদি এটি না ঘটে তবে নীতিটি উপযুক্ত হবে না এবং উপেক্ষা করা হবে। - - ইউএসবি অনুমতি মডেল, ইউএসবি ডিভাইস অ্যাক্সেস করতে অনুরোধ করা ইউআরএল-কে অনুমতি দেওয়ার জন্য শীর্ষ স্তরের ফ্রেম সাইট ("এম্বেডিং ইউআরএল")-এর ইউআরএল এবং অনুরোধ করছে যে সাইট সেটির ইউআরএল ("ইউআরএল অনুরোধ") ব্যবহার করে। অনুরোধকারী সাইট আইফ্রেমে লোড করা হলে, অনুরোধকারী ইউআরএলটি এমবেডেড ইউআরএলের চেয়ে আলাদা হতে পারে। অতএব, অনুরোধ এবং এম্বেডিং ইউআরএলের "ইউআরএল" অংশ অবশ্যই কমা দ্বারা সীমিত দুটি ইউআরএল স্ট্রিং হতে হবে। যদি শুধুমাত্র একটি ইউআরএল নির্দিষ্ট থাকে তাহলে সম্পর্কিত ইউএসবি ডিভাইসে অ্যাক্সেস তখনই অনুমোদিত হবে যখন এম্বেড করা স্ট্যাটাসের পরিবর্তে অনুরোধ করা ইউআরএলটি এই ইউআরএলের সাথে মিলবে। "ইউআরএল"-এর ইউআরএলটি একটি সঠিক ইউআরএল হওয়া উচিত, অন্যথায় নীতি উপেক্ষা করা হবে। - - নীতিটি সেট না করা থাকলে, গ্লোবাল ডিফল্ট মানটি 'DefaultWebUsbGuardSetting' নীতি থেকে বা অন্যথায় ব্যবহারকারীর ব্যক্তিগত কনফিগারেশন থেকে সেট করা থাকলে সেটিকে ব্যবহার করা হবে। - - এই নীতির ইউআরএল প্যাটার্ন WebUsbBlockedForUrls-এর মাধ্যমে সেট করা প্যাটার্নের থেকে আলাদা হতে হবে। যদি দ্বন্দ্ব থাকে, তবে এই নীতিটি WebUsbBlockedForUrls এবং WebUsbAskForUrls-এ অগ্রাধিকার পাবে।</translation> <translation id="3414260318408232239">এই নীতিটি কনফিগার না করা হলে <ph name="PRODUCT_NAME" /> একটি ডিফল্ট নূন্যতম নীতি ব্যবহার করবে যেটি হল TLS 1.0। অন্যথায়, একে নিম্নলিখিত কোনও একটি মানে সেট করা হতে পারে: "tls1", "tls1.1" অথবা "tls1.2"। এটি সেট করা থাকলে <ph name="PRODUCT_NAME" /> নির্দিষ্ট করে দেওয়া ভার্সনের নিচে কোনও SSL/TLS ভার্সন ব্যবহার করবে না। শনাক্ত করা হয়নি সেইসব মান উপেক্ষা করা হবে।</translation>
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 36353a66..1d32a6a9 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -1068,24 +1068,6 @@ Si aquesta política s'estableix en "false", l'optimització WPAD es desactiva i <ph name="PRODUCT_NAME" /> ha d'esperar més temps els servidors WPAD basats en DNS. Si la política no s'estableix o està activada, l'optimització WPAD s'activa. Tant si la política s'estableix com si no, els usuaris no poden canviar la configuració de l'optimització WPAD.</translation> -<translation id="3071839057966069710">Configura una llista d'impressores. - - Aquesta política permet als administradors proporcionar configuracions d'impressores als usuaris. - - <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> són cadenes de format lliure que es poden personalitzar per facilitar la selecció de la impressora. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> serveixen perquè els usuaris finals puguin identificar la impressora més fàcilment. Representen el fabricant i el model de la impressora. <ph name="PRINTER_URI" /> ha de ser una adreça accessible des d'un ordinador de client, com ara <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> o <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> és opcional. Si s'indica, s'utilitza per eliminar la duplicació d'impressores <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> ha de coincidir amb una de les cadenes que representen una impressora compatible amb <ph name="PRODUCT_NAME" />. La cadena s'utilitzarà per identificar i instal·lar el fitxer PPD adequat per a la impressora. Pots trobar-ne més informació a https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> és un indicador booleà que indica si cal usar IPP Everywhere per configurar la impressora. Aquest indicador s'admet a <ph name="PRODUCT_OS_NAME" /> versió 76 i posteriors. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> hauria de contenir el nom de la impressora o bé <ph name="PRINTER_AUTOCONF" /> s'hauria d'establir en "true". Les impressores que no tinguin cap d'aquestes propietats o que les tinguin totes dues s'ignoraran. - - La configuració de la impressora finalitza quan la impressora s'utilitza per primera vegada. Els fitxers PPD no es baixen fins que s'utilitza la impressora. Passat aquest temps, els fitxers PPD que s'utilitzen amb freqüència es desen a la memòria cau. - - Aquesta política no repercuteix en la possibilitat dels usuaris de configurar les impressores en dispositius individuals. La seva finalitat és complementar la configuració d'impressores per part d'usuaris individuals. - - En dispositius gestionats per Active Directory, aquesta política admet afegir <ph name="MACHINE_NAME_VARIABLE" /> al nom de l'ordinador gestionat per Active Directory o a una subcadena d'aquest. Per exemple, si el nom de l'ordinador fos <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> se substituiria pels 4 caràcters que segueixen la 6a posició, per exemple, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tingues en compte que aquesta posició es basa en zero. - </translation> <translation id="3072045631333522102">Estalvi de pantalla per utilitzar a la pantalla d'inici de sessió en mode botiga</translation> <translation id="3072847235228302527">Defineix els Termes i condicions d'un compte local del dispositiu</translation> <translation id="3077183141551274418">Activa o desactiva els cicles de vida de les pestanyes</translation> @@ -1214,13 +1196,6 @@ Si estableixes aquesta política, els usuaris no la podran canviar ni substituir. Si aquesta política es deixa sense establir, el canvi d'alimentació en pics d'ús estarà desactivat d'entrada i l'usuari no el podrà activar.</translation> -<translation id="3388153794103186066">Permet definir una llista d'URL que especifiquin quins llocs web obtindran permís automàticament per accedir a un dispositiu USB amb els identificadors de proveïdor i producte que s'indiquin. Perquè la política sigui vàlida, tots els elements de la llista han d'incloure tant dispositius com URL. A més, cada dispositiu pot incloure un camp per a l'identificador de proveïdor i per al de producte. Els identificadors omesos es tracten com un comodí, amb excepció dels identificadors de producte, que no es poden especificar si no hi ha un identificador de proveïdor. En cas contrari, la política no serà vàlida i s'ignorarà. - - El model de permisos per a USB utilitza l'URL del lloc web que sol·licita permís ("URL sol·licitant") i l'URL del lloc web de marcs de nivell superior ("URL d'inserció") per concedir permís a l'URL sol·licitant per accedir al dispositiu USB. Si el lloc web que sol·licita permís es carrega en un iframe, l'URL sol·licitant pot ser diferent de l'URL d'inserció. Per tant, el camp urls pot incloure fins a dues cadenes d'URL delimitades per una coma a fi d'especificar l'URL sol·licitant i el d'inserció, respectivament. Si només se n'especifica un, l'accés als dispositius USB corresponents es concedeix quan l'URL del lloc web sol·licitant coincideixi amb aquest URL independentment de l'estat d'inserció. Els URL del camp urls han de ser vàlids. Si no, la política s'ignorarà. - - Si aquesta política es deixa sense establir, s'utilitzarà el valor predeterminat general per a tots els llocs web, ja sigui de la política DefaultWebUsbGuardSetting si està establerta o de la configuració personal de l'usuari si no ho està. - - Els patrons d'URL d'aquesta política no poden entrar en conflicte amb els configurats mitjançant WebUsbBlockedForUrls. Si hi ha un conflicte, aquesta política té prioritat sobre WebUsbBlockedForUrls i WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Si aquesta política no es configura, <ph name="PRODUCT_NAME" /> utilitzarà TLS 1.0 com a versió mínima predeterminada. També es pot definir en un dels valors següents: "tls1", "tls1.1" o "tls1.2". Quan s'hagi definit, <ph name="PRODUCT_NAME" /> no utilitzarà versions SSL/TLS inferiors a la versió especificada. Els valors que no es reconeguin s'ignoraran.</translation> @@ -1256,7 +1231,7 @@ <translation id="3487623755010328395"> Si s'estableix aquesta política, <ph name="PRODUCT_NAME" /> provarà de registrar-se sense ajuda i d'aplicar en tots els perfils la política per al núvol associada. - El valor d'aquesta política és un testimoni d'inscripció que es pot recuperar de la Consola d'administració de Google.</translation> + El valor d'aquesta política és un testimoni d'inscripció que es pot recuperar de la consola d'administració de Google.</translation> <translation id="3496296378755072552">Gestor de contrasenyes</translation> <translation id="3500732098526756068">Et permet controlar l'activació d'un advertiment sobre la protecció de contrasenyes, que avisa els usuaris quan reutilitzen una contrasenya protegida en llocs web potencialment sospitosos. @@ -1279,9 +1254,9 @@ <translation id="3528000905991875314">Activa les pàgines d'error alternatives</translation> <translation id="3545457887306538845">Et permet controlar on es poden utilitzar les Eines per a desenvolupadors. - Si aquesta política s'estableix en "DeveloperToolsDisallowedForForceInstalledExtensions" (valor 0, que és el predeterminat), es podrà accedir en general a les Eines per a desenvolupadors i a la Consola de JavaScript, però no s'hi podrà accedir quan les extensions estiguin instal·lades per la política d'empresa. - Si aquesta política s'estableix en "DeveloperToolsAllowed" (valor 1), es podrà accedir en qualsevol context a les Eines per a desenvolupadors i a la Consola de JavaScript, i es podran utilitzar en tots els contextos, fins i tot en extensions instal·lades per la política d'empresa. - Si aquesta política s'estableix en "DeveloperToolsDisallowed" (valor 2), no es podrà accedir a les Eines per a desenvolupadors i ja no es podran inspeccionar els elements del lloc web. Es desactivaran totes les dreceres de teclat i les entrades de menú o de menú contextual que obrin les Eines per a desenvolupadors o la Consola de JavaScript.</translation> + Si aquesta política s'estableix en "DeveloperToolsDisallowedForForceInstalledExtensions" (valor 0, que és el predeterminat), es podrà accedir en general a les Eines per a desenvolupadors i a la consola de JavaScript, però no s'hi podrà accedir quan les extensions estiguin instal·lades per la política d'empresa. + Si aquesta política s'estableix en "DeveloperToolsAllowed" (valor 1), es podrà accedir en qualsevol context a les Eines per a desenvolupadors i a la consola de JavaScript, i es podran utilitzar en tots els contextos, fins i tot en extensions instal·lades per la política d'empresa. + Si aquesta política s'estableix en "DeveloperToolsDisallowed" (valor 2), no es podrà accedir a les Eines per a desenvolupadors i ja no es podran inspeccionar els elements del lloc web. Es desactivaran totes les dreceres de teclat i les entrades de menú o de menú contextual que obrin les Eines per a desenvolupadors o la consola de JavaScript.</translation> <translation id="3547954654003013442">Configuració del servidor intermediari</translation> <translation id="3550875587920006460">Permet definir una programació personalitzada per comprovar si hi ha actualitzacions. S'aplica a tots els usuaris i a totes les interfícies del dispositiu. Un cop definida, el dispositiu comprovarà si hi ha actualitzacions segons la programació. Cal suprimir la política per cancel·lar les comprovacions d'actualitzacions programades.</translation> <translation id="355118380775352753">Llocs web que s'obriran al navegador alternatiu</translation> @@ -1793,7 +1768,7 @@ Si l'activeu o el desactiveu, els usuaris no podran canviar ni substituir aquesta configuració a <ph name="PRODUCT_NAME" />. Si no es defineix aquesta política, aquest paràmetre s'activarà, però l'usuari podrà canviar-lo.</translation> -<translation id="4531706050939927436">Es pot utilitzar Google Play des de la Consola d'administració de Google per forçar la instal·lació de les aplicacions per a Android. No utilitzen aquesta política.</translation> +<translation id="4531706050939927436">Es pot utilitzar Google Play des de la consola d'administració de Google per forçar la instal·lació de les aplicacions per a Android. No utilitzen aquesta política.</translation> <translation id="4534500438517478692">Nom de la restricció d'Android:</translation> <translation id="4541530620466526913">Comptes locals del dispositiu</translation> <translation id="4543502256674577024">Configuració de l'actualització del dispositiu</translation> @@ -2483,10 +2458,10 @@ Si la política <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> s'estableix en "<ph name="BLOCK_GEOLOCATION_SETTING" />", aquesta política s'ignora i els serveis d'ubicació de Google es mantenen desactivats permanentment.</translation> <translation id="6145799962557135888">Us permet definir una llista de patrons d'URL que especifiquen els llocs que no poden executar JavaScript. Si no es defineix aquesta política, s'utilitzarà el valor global predeterminat per a tots els llocs tant de la política "DefaultJavaScriptSetting", si es defineix, com d'un altre tipus de configuració personal de l'usuari.</translation> <translation id="614662973812186053">Aquesta política també controla la recollida de dades d'ús i de diagnòstic d'Android.</translation> -<translation id="6153048425064249648">Aquesta política controla els informes al núvol de <ph name="PRODUCT_NAME" />, que carreguen informació sobre el funcionament del navegador a la Consola d'administració de Google. +<translation id="6153048425064249648">Aquesta política controla els informes al núvol de <ph name="PRODUCT_NAME" />, que carreguen informació sobre el funcionament del navegador a la consola d'administració de Google. Si aquesta política no es defineix o es defineix en "false", no es recopilaran ni es penjaran dades. - Si aquesta política es defineix en "true", les dades es recopilaran i es penjaran a la Consola d'administració de Google. + Si aquesta política es defineix en "true", les dades es recopilaran i es penjaran a la consola d'administració de Google. Per controlar les dades que es pengen, utilitza les polítiques del grup Chrome Reporting Extension. Aquesta política només funciona quan l'ordinador està inscrit amb <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />. @@ -3035,11 +3010,11 @@ <translation id="7261252191178797385">Imatge de fons de pantalla del dispositiu</translation> <translation id="7264704483008663819">Aquesta política es considera obsoleta a M68; en lloc seu, utilitza DeveloperToolsAvailability. - Desactiva les Eines per a desenvolupadors i la Consola de JavaScript. + Desactiva les Eines per a desenvolupadors i la consola de JavaScript. - Si actives aquesta opció de configuració, ja no es podrà accedir a les Eines per a desenvolupadors ni inspeccionar els elements del lloc web. Es desactivaran les tecles de drecera i les entrades als menús o als menús contextuals que obrin les Eines per a desenvolupadors o la Consola de JavaScript. + Si actives aquesta opció de configuració, ja no es podrà accedir a les Eines per a desenvolupadors ni inspeccionar els elements del lloc web. Es desactivaran les tecles de drecera i les entrades als menús o als menús contextuals que obrin les Eines per a desenvolupadors o la consola de JavaScript. - Si aquesta opció es desactiva o es deixa sense establir, l'usuari podrà utilitzar les Eines per a desenvolupadors i la Consola de JavaScript. + Si aquesta opció es desactiva o es deixa sense establir, l'usuari podrà utilitzar les Eines per a desenvolupadors i la consola de JavaScript. Si s'estableix la política DeveloperToolsAvailability, s'ignora el valor establert a DeveloperToolsDisabled.</translation> <translation id="7266471712301230894">Aquesta política no està disponible des de la versió 64 de <ph name="PRODUCT_NAME" />. @@ -3810,7 +3785,7 @@ Si aquesta política no es defineix, Google Sync estarà disponible perquè l'usuari pugui escollir si la vol utilitzar o no. - Per desactivar el servei Google Sync per complet, et recomanem que el desactivis a la Consola d'administració de Google. + Per desactivar el servei Google Sync per complet, et recomanem que el desactivis a la consola d'administració de Google. Aquesta política no s'ha d'activar si la política <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> està activada, ja que aquesta funció comparteix la mateixa funcionalitat al costat del client. En aquest cas, la sincronització allotjada a Google es desactiva completament.</translation> <translation id="8955719471735800169">Torna a dalt</translation>
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index dc794484d..006cd5ead 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -1163,24 +1163,6 @@ Je-li tato zásada nastavena na hodnotu false, je optimalizace WPAD zakázána, a <ph name="PRODUCT_NAME" /> proto bude na servery WPAD založené na DNS čekat déle. Pokud tato zásada není nastavena, je optimalizace WPAD povolena. Nezávisle na tom, zda je tato zásada nastavena nebo jak je nastavena, uživatelé nastavení optimalizace WPAD nemohou změnit.</translation> -<translation id="3071839057966069710">Konfiguruje seznam tiskáren. - - Tato zásada administrátorům umožňuje poskytnout uživatelům konfigurace tiskáren. - - Hodnoty <ph name="PRINTER_DISPLAY_NAME" /> a <ph name="PRINTER_DESCRIPTION" /> jsou volně upravitelné textové řetězce, pomocí kterých lze usnadnit výběr tiskárny. Hodnoty <ph name="PRINTER_MANUFACTURER" /> a <ph name="PRINTER_MODEL" /> koncovým uživatelům umožní snáze tiskárnu rozpoznat. Představují výrobce a model tiskárny. Hodnotou <ph name="PRINTER_URI" /> by měla být adresa přístupná z klientského počítače, včetně údajů <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> a <ph name="URI_QUEUE" />. Hodnota <ph name="PRINTER_UUID" /> je volitelná. Pokud je zadána, slouží k odebrání duplicitních tiskáren <ph name="ZEROCONF_DISCOVERY" />. - - Hodnota <ph name="PRINTER_EFFECTIVE_MODEL" /> musí odpovídat jednomu z řetězců, které představují tiskárny podporované systémem <ph name="PRODUCT_NAME" />. Řetězec se použije k identifikaci a instalaci vhodného souboru PPD pro tiskárnu. Další informace naleznete na stránce https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> je logický příznak, který udává, zda se má k nastavení tiskárny použít technologie IPP Everywhere. Tento příznak je podporován ve verzi 76 a novějších verzích systému <ph name="PRODUCT_OS_NAME" />. - - Pole <ph name="PRINTER_EFFECTIVE_MODEL" /> musí obsahovat název tiskárny, nebo je třeba nastavit příznak <ph name="PRINTER_AUTOCONF" /> na hodnotu true. Tiskárny s oběma těmito nastaveními nebo bez žádného z nich budou ignorovány. - - Nastavení tiskárny se dokončí při prvním použití. Soubory PPD se stáhnou až při použití tiskárny. Často používané soubory PPD budou následně uloženy do mezipaměti. - - Tato zásada nemá vliv na to, zda uživatelé mohou konfigurovat tiskárny na jednotlivých zařízeních. Je zamýšlena jako doplněk ke konfiguraci tiskáren ze strany jednotlivých uživatelů. - - U zařízení spravovaných pomocí služby Active Directory tato zásada podporuje rozšíření <ph name="MACHINE_NAME_VARIABLE" /> na název počítače ve službě Active Directory nebo jeho podřetězec. V případě názvu počítače <ph name="MACHINE_NAME_EXAMPLE" /> by byl řetězec <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> nahrazen čtyřmi znaky po šesté pozici, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Pozice se počítají od nuly. - </translation> <translation id="3072045631333522102">Spořič obrazovky, který bude použit na přihlašovací obrazovce v režimu pro obchody</translation> <translation id="3072847235228302527">Nastavit smluvní podmínky pro účet v zařízení</translation> <translation id="3077183141551274418">Povolí nebo zakáže životní cykly karet</translation> @@ -1320,13 +1302,6 @@ Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat. Pokud tuto zásadu ponecháte nenastavenou, funkce napájení Peak Shift bude ve výchozím nastavení vypnutá a uživatel ji nebude moci zapnout.</translation> -<translation id="3388153794103186066">Umožňuje nastavit seznam adres URL určujících, kterým webům bude automaticky uděleno oprávnění k přístupu k zařízení USB od určitého dodavatele s určitými ID produktu. Aby zásada byla platná, musí každá položka v seznamu obsahovat jak zařízení, tak adresy URL. Každá položka zařízení může obsahovat pole ID dodavatele a ID produktu. Chybějící ID je považováno za zástupný znak. ID produktu však nesmí být zadáno bez ID dodavatele, jinak zásada nebude platná. - - Model oprávnění USB k udělení přístupu k zařízení USB žádajícímu webu používá adresu URL žádajícího webu („žádající adresa URL“) a adresu URL webu v rámci nejvyšší úrovně („adresa URL hlavního rámce“). Pokud je žádající web načten v prvku iframe, může se žádající adresa URL od adresy URL hlavního rámce lišit. Pole „urls“ proto může obsahovat až dva řetězce URL oddělené čárkou, které určují žádající adresu URL a adresu URL hlavního rámce. Pokud je zadána jen jedna adresa URL, bude přístup k příslušným zařízením USB udělen, když adresa URL žádajícího webu odpovídá této adrese URL, bez ohledu na stav vložení. Adresy URL v poli „urls“ musejí být platné, jinak tato zásada bude ignorována. - - Pokud tuto zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultWebUsbGuardSetting (pokud je nastavena), nebo z osobního nastavení uživatele. - - Vzory adres URL v této zásadě by neměly být v konfliktu se vzory nakonfigurovanými prostřednictvím zásady WebUsbBlockedForUrls. V případě konfliktu bude mít tato zásada před zásadami WebUsbBlockedForUrls a WebUsbAskForUrls přednost.</translation> <translation id="3414260318408232239">Pokud tato zásada není nakonfigurovaná, používá <ph name="PRODUCT_NAME" /> výchozí minimální verzi, což je TLS 1.0. Jinak lze zásadu nastavit na jednu z těchto hodnot: tls1, tls1.1 nebo tls1.2. Je-li nastavena, nebude <ph name="PRODUCT_NAME" /> používat verze protokolů SSL a TLS nižší, než je uvedená verze. Nerozpoznané hodnoty budou ignorovány.</translation>
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 4b377aa..e65bec3e 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -1165,25 +1165,6 @@ Hvis denne politik angives som Falsk, deaktiveres WPAD-optimering, så <ph name="PRODUCT_NAME" /> skal vente længere på DNS-baserede WPAD-servere. Hvis politikken ikke er indstillet, eller hvis den er aktiveret, er WPAD-optimering aktiveret. Uafhængigt af om politikken er indstillet og hvordan, kan indstillingen for WPAD-optimering ikke ændres af brugerne.</translation> -<translation id="3071839057966069710">Konfigurerer en liste over printere. - - Med denne politik kan administratorer angive printerkonfigurationer for - deres brugere. - - <ph name="PRINTER_DISPLAY_NAME" /> og <ph name="PRINTER_DESCRIPTION" /> er strenge i frit format, der kan tilpasses, så det bliver nemmere at vælge printer. <ph name="PRINTER_MANUFACTURER" /> og <ph name="PRINTER_MODEL" /> gør det nemmere for slutbrugerne at identificere printere. De repræsenterer printerproducenten og -modellen. <ph name="PRINTER_URI" /> skal være en adresse, der er tilgængelig fra en klientcomputer, bl.a. <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> og <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> er valgfri. Hvis den angives, bruges den som en hjælp til at deduplikere <ph name="ZEROCONF_DISCOVERY" />-printere. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> skal stemme overens med en af de strenge, der repræsenterer en <ph name="PRODUCT_NAME" />-understøttet printer. Strengen bruges til at identificere og installere den relevante PPD-fil til printeren. Du kan finde flere oplysninger på https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> er en boolesk markering, der indikerer, om IPP Everywhere skal bruges til at konfigurere printeren. Markeringen understøttes i <ph name="PRODUCT_OS_NAME" />-version 76 og nyere. - - Enten skal <ph name="PRINTER_EFFECTIVE_MODEL" /> indeholde navnet på printeren, eller også skal <ph name="PRINTER_AUTOCONF" /> angives som Sand. Printere med begge eller ingen af egenskaberne ignoreres. - - Printerkonfigurationen fuldføres, første gang printeren tages i brug. PPD-filer downloades ikke, før printeren benyttes. Derefter gemmes ofte anvendte PPD-filer i cachen. - - Politikken påvirker ikke, om brugerne kan konfigurere printere på individuelle enheder. Den er beregnet til at fungere som supplement til den enkelte brugers konfiguration af printere. - - Politikken understøtter udvidelse af <ph name="MACHINE_NAME_VARIABLE" /> til Active Directory-enhedsnavnet eller en af dets understrenge på enheder, der administreres med Active Directory. Hvis enhedsnavnet f.eks. er <ph name="MACHINE_NAME_EXAMPLE" />, erstattes <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> af de fire tegn, der kommer efter den sjette position, dvs. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Bemærk, at positionen er nulbaseret. - </translation> <translation id="3072045631333522102">Pauseskærm, som skal bruges på loginskærmen i detailtilstand</translation> <translation id="3072847235228302527">Konfigurer servicevilkårene for en enhedslokal konto</translation> <translation id="3077183141551274418">Aktiverer eller deaktiverer livscyklus for faner</translation> @@ -1319,13 +1300,6 @@ Hvis du konfigurerer denne politik, kan brugerne ikke ændre eller tilsidesætte den. Hvis denne politik ikke er konfigureret, er ændringen ved strømspidsbelastning deaktiveret og kan ikke aktiveres af brugeren.</translation> -<translation id="3388153794103186066">Gør det muligt at angive en liste over webadresser, der angiver, hvilke sider der automatisk får adgangstilladelse til en USB-enhed med de givne leverandør- og produkt-id'er. Hvert element på listen skal indeholde både enheder og webadresser, før politikken er gyldig. Hvert element på enheder kan indeholde felter til leverandør-id og produkt-id. Alle id'er, der udelades, behandles som et jokertegn – et produkt-id kan dog ikke angives, uden at der også angives et leverandør-id. Hvis ikke disse regler overholdes, regnes politikken som ugyldig og ignoreres. - - USB-tilladelsesmodellen anvender webadressen til det anmodende website ("anmodende webadresse") og webadressen til indramningswebsitet på øverste niveau ("integrerende webadresse") til at give den anmodende webadresse adgang til USB-enheden. Den anmodende webadresse kan adskille sig fra den integrerende webadresse, når det anmodende website indlæses i en iframe. Feltet "webadresser" kan derfor indeholde op til to webadressestrenge, adskilt af et komma, for at angive henholdsvis den anmodende og den integrerende webadresse. Hvis der kun angives én webadresse, gives der adgang til de tilsvarende USB-enheder, når webadressen til det anmodende website stemmer overens med denne webadresse, uanset hvilken integreringsstatus den har. Webadresserne i feltet "webadresser" skal være gyldige webadresser, ellers ignoreres politikken. - - Hvis politikken ikke konfigureres, anvendes den globale standardværdi fra politikken "DefaultWebUsbGuardSetting" til alle websites, og hvis denne ikke er konfigureret, anvendes brugerens personlige konfiguration. - - Webadressemønstre i denne politik må ikke være i strid med dem, der er konfigureret via WebUsbBlockedForUrls. Hvis de er i strid med hinanden, har denne politik forrang frem for WebUsbBlockedForUrls og WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Hvis denne politik ikke konfigureres, anvender <ph name="PRODUCT_NAME" /> en standardminimumversion, som er TLS 1.0. Den kan også angives til en af følgende værdier: "tls1", "tls1.1" eller "tls1.2". Når der er angivet en værdi, anvender <ph name="PRODUCT_NAME" /> ikke SSL/TLS-versioner, der er mindre end den angivne version. Ukendte værdier ignoreres.</translation>
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 34b5183c..a6bbcad7 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -1181,24 +1181,6 @@ Ist diese Richtlinie auf "false" gesetzt, ist die WPAD-Optimierung deaktiviert, sodass <ph name="PRODUCT_NAME" /> länger auf DNS-basierte WPAD-Server warten muss. Wenn die Richtlinie aktiviert oder nicht festgelegt ist, ist die WPAD-Optimierung aktiviert. Unabhängig davon, ob und wie die Richtlinie festgelegt ist, kann die WPAD-Optimierung nicht von Nutzern verändert werden.</translation> -<translation id="3071839057966069710">Hiermit wird eine Liste von Druckern konfiguriert. - - Mit dieser Richtlinie können Administratoren den Nutzern Druckerkonfigurationen zur Verfügung stellen. - - "<ph name="PRINTER_DISPLAY_NAME" />" und "<ph name="PRINTER_DESCRIPTION" />" sind Freiform-Strings, die für eine einfachere Druckerauswahl angepasst werden können. Mit "<ph name="PRINTER_MANUFACTURER" />" und "<ph name="PRINTER_MODEL" />" können Endnutzer einen Drucker leichter erkennen. Sie geben den Hersteller und das Modell des Druckers an. Bei "<ph name="PRINTER_URI" />" sollte es sich um eine Adresse einschließlich <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> und <ph name="URI_QUEUE" /> handeln, auf die über einen Client-Computer zugegriffen werden kann. Die <ph name="PRINTER_UUID" /> ist optional. Ist sie angegeben, wird sie zum Entfernen von Duplikaten bei <ph name="ZEROCONF_DISCOVERY" />-Druckern verwendet. - - "<ph name="PRINTER_EFFECTIVE_MODEL" />" muss mit einem der Strings übereinstimmen, die einen von <ph name="PRODUCT_NAME" /> unterstützten Drucker angeben. Der String wird zur Ermittlung und Installation der korrekten PPD für den Drucker verwendet. Weitere Informationen finden Sie unter https://support.google.com/chrome?p=noncloudprint. - - "<ph name="PRINTER_AUTOCONF" />" ist ein boolescher Parameter, der angibt, ob IPP Everywhere zum Einrichten des Druckers verwendet werden soll. Dieser Parameter wird unter <ph name="PRODUCT_OS_NAME" /> Version 76 und höher unterstützt. - - Entweder sollte "<ph name="PRINTER_EFFECTIVE_MODEL" />" den Namen des Druckers enthalten oder "<ph name="PRINTER_AUTOCONF" />" auf "true" festgelegt sein. Drucker mit beiden oder keiner der Eigenschaften werden ignoriert. - - Die Druckereinrichtung wird bei der ersten Verwendung des Druckers abgeschlossen. PPDs werden erst heruntergeladen, wenn der Drucker genutzt wird. Anschließend werden häufig verwendete PPDs im Cache gespeichert. - - Diese Richtlinie hat keinen Einfluss darauf, ob Nutzer Drucker auf ihren individuellen Geräten konfigurieren können. Sie ist als Ergänzung zu den Druckerkonfigurationen der einzelnen Nutzer gedacht. - - Bei Geräten, die über Active Directory verwaltet werden, unterstützt diese Richtlinie die Erweiterung von "<ph name="MACHINE_NAME_VARIABLE" />" auf den Active Directory-Computernamen oder einen Teilstring davon. Wenn der Computername beispielsweise "<ph name="MACHINE_NAME_EXAMPLE" />" lautet, wird "<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />" durch die vier Zeichen nach der sechsten Stelle ersetzt, z. B. "<ph name="MACHINE_NAME_PART_EXAMPLE" />". Beachten Sie, dass die Position auf null basiert. - </translation> <translation id="3072045631333522102">Bildschirmschoner für die Anmeldeseite im Händlermodus</translation> <translation id="3072847235228302527">Nutzungsbedingungen für ein lokales Gerätekonto festlegen</translation> <translation id="3077183141551274418">Aktiviert oder deaktiviert Tablebenszyklen</translation> @@ -1334,13 +1316,6 @@ Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. Wird die Richtlinie nicht festgelegt, ist das Umschalten bei Leistungsspitzen zuerst deaktiviert und kann vom Nutzer nicht aktiviert werden.</translation> -<translation id="3388153794103186066">Ermöglicht das Erstellen einer Liste mit URLs, deren Websites automatisch auf ein USB-Gerät mit einem bestimmten Anbieter und einer bestimmten Produkt-ID zugreifen dürfen. Damit die Richtlinie gültig ist, muss jeder Eintrag in der Liste sowohl Geräte als auch URLs enthalten. Jeder Geräteeintrag kann ein Feld für eine Anbieter-ID und eine Produkt-ID enthalten. Fehlende IDs werden wie Platzhalter gehandhabt. Dabei gibt es jedoch eine Ausnahme: Produkt-IDs können nur spezifiziert werden, wenn auch die entsprechende Anbieter-ID angegeben ist. Andernfalls ist die Richtlinie ungültig und wird ignoriert. - - Im USB-Berechtigungsmodell wird die URL der anfragenden Website ("anfragende URL") verwendet und die URL der Frame-Website der obersten Ebene ("einbettende URL"). Dabei wird der anfragenden URL die Berechtigung erteilt, auf das USB-Gerät zuzugreifen. Wenn die anfragende Website in einen iFrame geladen wird, kann die anfragende von der einbettenden URL abweichen. Deshalb kann das Feld "urls" bis zu zwei durch ein Komma voneinander getrennte URL-Strings enthalten: die anfragende URL und die einbettende URL. Wenn nur eine einzige URL angegeben ist, wird der Zugriff auf die entsprechenden USB-Geräte gewährt, wenn unabhängig vom Einbettungsstatus die URL der anfragenden Website mit dieser URL übereinstimmt. Die URLs im Feld "urls" müssen gültig sein, da ansonsten die Richtlinie ignoriert wird. - - Ist diese Richtlinie nicht konfiguriert, kommt für alle Websites entweder der globale Standardwert der Richtlinie "DefaultWebUsbGuardSetting", sofern konfiguriert, oder die persönliche Konfiguration des Nutzers zum Einsatz. - - URL-Muster in dieser Richtlinie dürfen nicht im Widerspruch zu den über "WebUsbBlockedForUrls" konfigurierten URLs stehen. Im Falle einer Diskrepanz hat diese Richtlinie Vorrang vor "WebUsbBlockedForUrls" und "WebUsbAskForUrls".</translation> <translation id="3414260318408232239">Wenn diese Richtlinie nicht konfiguriert ist, verwendet <ph name="PRODUCT_NAME" /> standardmäßig eine Mindestversion: die Version TLS 1.0. Ansonsten kann sie auf einen der folgenden Werte festgelegt werden: "tls1", "tls1.1" oder "tls1.2". Wenn die Richtlinie konfiguriert ist, verwendet <ph name="PRODUCT_NAME" /> keine SSL- oder TLS-Versionen, die niedriger als die vorgegebene Version sind. Ein unbekannter Wert wird ignoriert.</translation>
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 45621a0..b078467 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -1206,25 +1206,6 @@ Εάν η πολιτική έχει οριστεί ως ψευδής, η βελτιστοποίηση WPAD απενεργοποιείται προκαλώντας την περαιτέρω αναμονή του <ph name="PRODUCT_NAME" /> για διακομιστές WPAD που βασίζονται σε DNS. Εάν η πολιτική δεν έχει οριστεί ή έχει ενεργοποιηθεί, ενεργοποιείται η βελτιστοποίηση WPAD. Ανεξάρτητα από το εάν και πώς έχει οριστεί αυτή η πολιτική, η ρύθμιση της βελτιστοποίησης WPAD δεν είναι δυνατό να αλλάξει από τους χρήστες.</translation> -<translation id="3071839057966069710">Διαμορφώνει μια λίστα εκτυπωτών. - - Αυτή η πολιτική επιτρέπει στους διαχειριστές να παρέχουν διαμορφώσεις εκτυπωτή για - τους χρήστες τους. - - Τα <ph name="PRINTER_DISPLAY_NAME" /> και <ph name="PRINTER_DESCRIPTION" /> είναι συμβολοσειρές ελεύθερης μορφής που μπορούν να προσαρμοστούν για διευκόλυνση της επιλογής εκτυπωτή Τα <ph name="PRINTER_MANUFACTURER" /> και <ph name="PRINTER_MODEL" /> διευκολύνουν την αναγνώριση των εκτυπωτών από τους τελικούς χρήστες. Αντιπροσωπεύουν τον κατασκευαστή και το μοντέλο του εκτυπωτή. Το <ph name="PRINTER_URI" /> θα πρέπει να είναι διεύθυνση προσβάσιμη από υπολογιστή-πελάτη, συμπεριλαμβανομένων των <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> και <ph name="URI_QUEUE" />. Το<ph name="PRINTER_UUID" /> είναι προαιρετικό. Εάν παρέχεται, χρησιμοποιείται για τη διευκόλυνση της κατάργησης διπλοτύπων εκτυπωτών <ph name="ZEROCONF_DISCOVERY" />. - - Το <ph name="PRINTER_EFFECTIVE_MODEL" /> πρέπει να αντιστοιχεί σε μία από τις συμβολοσειρές που αντιπροσωπεύουν έναν υποστηριζόμενο εκτυπωτή<ph name="PRODUCT_NAME" />. Η συμβολοσειρά θα χρησιμοποιηθεί για τον προσδιορισμό και την εγκατάσταση του κατάλληλου PPD για τον εκτυπωτή Για περισσότερες πληροφορίες, επισκεφτείτε τη διεύθυνση https://support.google.com/chrome?p=noncloudprint. - - Το <ph name="PRINTER_AUTOCONF" /> είναι μια δυαδική επισήμανση που υποδεικνύει αν το IPP Everywhere θα πρέπει να χρησιμοποιηθεί για τη ρύθμιση του εκτυπωτή. Αυτή η επισήμανση υποστηρίζεται στην έκδοση 76 καθώς και σε νεότερες εκδόσεις του <ph name="PRODUCT_OS_NAME" />. - - Θα πρέπει είτε το <ph name="PRINTER_EFFECTIVE_MODEL" /> να περιέχει το όνομα του εκτυπωτή ή το <ph name="PRINTER_AUTOCONF" /> να οριστεί ως αληθές. Οι εκτυπωτές που διαθέτουν και τα δύο ή που δεν διαθέτουν καθόλου ιδιότητες θα αγνοούνται. - - Η ρύθμιση εκτυπωτή ολοκληρώνεται με την πρώτη χρήση του εκτυπωτή. Δεν γίνεται λήψη των PPD μέχρι να χρησιμοποιηθεί ο εκτυπωτής. Μόλις συμβεί αυτό, θα αποθηκευτούν στην κρυφή μνήμη τα PPD που χρησιμοποιούνται συχνά. - - Αυτή η πολιτική δεν επηρεάζει τη δυνατότητα των χρηστών να διαμορφώσουν εκτυπωτές σε μεμονωμένες συσκευές. Προορίζεται να είναι συμπληρωματική στη διαμόρφωση των εκτυπωτών από μεμονωμένους χρήστες. - - Για συσκευές διαχειριζόμενες μέσω Active Directory, αυτή η πολιτική υποστηρίζει την επέκταση του <ph name="MACHINE_NAME_VARIABLE" /> στο όνομα υπολογιστή Active Directory ή σε ένα από τα τμήματα συμβολοσειράς του. Για παράδειγμα, αν το όνομα υπολογιστή είναι <ph name="MACHINE_NAME_EXAMPLE" />, τότε το <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> θα αντικατασταθεί με τους 4 χαρακτήρες που ξεκινούν μετά την 6η θέση, δηλ. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Έχετε υπόψη σας ότι η θέση έχει βάση το μηδέν. - </translation> <translation id="3072045631333522102">Προφύλαξη οθόνης για χρήση στην οθόνη σύνδεσης σε εμπορική λειτουργία</translation> <translation id="3072847235228302527">Καθορισμός των Όρων Παροχής Υπηρεσιών για λογαριασμό συσκευής/τοπικό λογαριασμό</translation> <translation id="3077183141551274418">Ενεργοποιεί ή απενεργοποιεί τους κύκλους ζωής καρτελών</translation> @@ -1364,13 +1345,6 @@ Εάν ορίσετε αυτήν την πολιτική, οι χρήστες δεν θα μπορούν να την αλλάξουν ή να την παρακάμψουν. Εάν αυτή η πολιτική δεν οριστεί, η λειτουργία ισχύος Peak Shift απενεργοποιείται αρχικά, χωρίς δυνατότητα ενεργοποίησης από τον χρήστη.</translation> -<translation id="3388153794103186066">Σάς επιτρέπει να ορίσετε μια λίστα URL που καθορίζει τους ιστοτόπους στους οποίους θα παραχωρείται αυτόματα άδεια πρόσβασης σε μια συσκευή USB με το δεδομένο αναγνωριστικό προμηθευτή και προϊόντος. Κάθε στοιχείο στη λίστα θα πρέπει να περιέχει και τις συσκευές και τα URL προκειμένου να είναι έγκυρη η πολιτική. Κάθε στοιχείο στις συσκευές μπορεί να περιέχει πεδίο αναγνωριστικού προμηθευτή και αναγνωριστικού προϊόντος. Οποιοδήποτε αναγνωριστικό που παραλείπεται αντιμετωπίζεται ως χαρακτήρας μπαλαντέρ με την εξαίρεση το ότι δεν μπορεί να οριστεί αναγνωριστικό προϊόντος χωρίς να καθοριστεί επίσης αναγνωριστικό προμηθευτή. Διαφορετικά, η πολιτική δεν θα είναι έγκυρη και θα γίνεται παράβλεψή της. - - Το μοντέλο αδειών USB χρησιμοποιεί το URL του ιστοτόπου που υποβάλει το αίτημα ("αιτών URL") και το URL του ιστοτόπου πλαισίου ανώτατου επιπέδου ("URL ενσωμάτωσης") για τη χορήγηση άδειας στο αιτών URL για πρόσβαση στη συσκευή USB. Το αιτών URL μπορεί να είναι διαφορετικό από το URL ενσωμάτωσης όταν ο ιστότοπος που υποβάλει το αίτημα φορτώνεται σε ένα iframe. Συνεπώς, το πεδίο "URL" μπορεί να περιέχει έως και δύο συμβολοσειρές URL διαχωρισμένες με κόμμα για τον καθορισμό του αιτούντος URL και του URL ενσωμάτωσης αντίστοιχα. Εάν καθοριστεί μόνο ένα URL, τότε η πρόσβαση στις αντίστοιχες συσκευές USB θα παραχωρείται όταν το URL του ιστοτόπου που υποβάλει το αίτημα αντιστοιχεί σε αυτό URL ανεξάρτητα από την κατάσταση ενσωμάτωσης. Τα URL στο πεδίο "URL" θα πρέπει να αποτελούν έγκυρα URL, διαφορετικά θα γίνει παράβλεψη της πολιτικής. - - Εάν αυτή η πολιτική δεν οριστεί, η καθολική προεπιλεγμένη τιμή θα χρησιμοποιείται για όλους τους ιστοτόπους είτε από την πολιτική 'DefaultWebUsbGuardSetting', εφόσον έχει οριστεί, είτε από την προσωπική διαμόρφωση του χρήστη σε διαφορετική περίπτωση. - - Τα μοτίβα URL σε αυτήν την πολιτική δεν θα πρέπει να έρχονται σε διένεξη με αυτά που έχουν διαμορφωθεί μέσω του WebUsbBlockedForUrls. Σε περίπτωση διένεξης, αυτή η πολιτική θα έχει προτεραιότητα σε σχέση με τις πολιτικές WebUsbBlockedForUrls και WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Εάν αυτή η πολιτική δεν έχει ρυθμιστεί, το <ph name="PRODUCT_NAME" /> χρησιμοποιεί μια προεπιλεγμένη ελάχιστη έκδοση, την TLS 1.0. Διαφορετικά, μπορεί να οριστεί σε μία από τις ακόλουθες τιμές: "tls1", "tls1.1" ή "tls1.2". Όταν οριστεί, το <ph name="PRODUCT_NAME" /> δεν θα χρησιμοποιεί εκδόσεις SSL/TLS μικρότερες από την καθορισμένη έκδοση. Μια τιμή που δεν έχει αναγνωρισθεί θα αγνοηθεί.</translation>
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index 8e76ca1..fb68386 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -1202,24 +1202,6 @@ If this policy is set to false, WPAD optimisation is disabled causing <ph name="PRODUCT_NAME" /> to wait longer for DNS-based WPAD servers. If the policy is not set or is enabled, WPAD optimisation is enabled. Independent of whether or how this policy is set, the WPAD optimisation setting cannot be changed by users.</translation> -<translation id="3071839057966069710">Configures a list of printers. - - This policy allows administrators to provide printer configurations for their users. - - <ph name="PRINTER_DISPLAY_NAME" /> and <ph name="PRINTER_DESCRIPTION" /> are free-form strings that can be customised for ease of printer selection. <ph name="PRINTER_MANUFACTURER" /> and <ph name="PRINTER_MODEL" /> serve to ease printer identification by end users. They represent the manufacturer and model of the printer. <ph name="PRINTER_URI" /> should be an address reachable from a client computer including the <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> and <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> is optional. If provided, it is used to help de-duplicate <ph name="ZEROCONF_DISCOVERY" /> printers. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> must match one of the strings which represent a <ph name="PRODUCT_NAME" /> supported printer. The string will be used to identify and install the appropriate PPD for the printer. More information can be found at https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> is a boolean flag indicating whether IPP Everywhere should be used to set up the printer. This flag is supported on <ph name="PRODUCT_OS_NAME" /> version 76 and higher. - - Either <ph name="PRINTER_EFFECTIVE_MODEL" /> should contain the name of the printer or <ph name="PRINTER_AUTOCONF" /> should be set to true. The printers with both or without any properties will be ignored. - - Printer setup is completed upon the first use of a printer. PPDs are not downloaded until the printer is used. After that time, frequently used PPDs are cached. - - This policy has no effect on whether users can configure printers on individual devices. It is intended to be supplementary to the configuration of printers by individual users. - - For Active Directory managed devices this policy supports expansion of <ph name="MACHINE_NAME_VARIABLE" /> to the Active Directory machine name or a substring of it. For example, if the machine name is <ph name="MACHINE_NAME_EXAMPLE" />, then <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> would be replaced by the 4 characters starting after the sixth position, i.e. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Note that the position is zero-based. - </translation> <translation id="3072045631333522102">Screen saver to be used on the sign-in screen in retail mode</translation> <translation id="3072847235228302527">Set the Terms of Service for a device-local account</translation> <translation id="3077183141551274418">Enables or disables tab lifecycles</translation> @@ -1359,13 +1341,6 @@ If you set this policy, users cannot change or override it. If this policy is left unset, power peak shift is disabled initially and cannot be enabled by the user.</translation> -<translation id="3388153794103186066">Allows you to set a list of URLs that specify which sites will automatically be granted permission to access a USB device with the given vendor and product IDs. Each item in the list must contain both devices and URLs in order for the policy to be valid. Each item in devices can contain a vendor ID and product ID field. Any ID that is omitted is treated as a wildcard with one exception, and that exception is that a product ID cannot be specified without a vendor ID also being specified. Otherwise, the policy will not be valid and will be ignored. - - The USB permission model uses the URL of the requesting site ('requesting URL') and the URL of the top-level frame site ('embedding URL') to grant permission to the requesting URL to access the USB device. The requesting URL may be different from the embedding URL when the requesting site is loaded in an iframe. Therefore, the 'urls' field can contain up to two URL strings delimited by a comma to specify the requesting and embedding URL respectively. If only one URL is specified, then access to the corresponding USB devices will be granted when the requesting site's URL matches this URL regardless of embedding status. The URLs in 'urls' must be valid URLs, otherwise the policy will be ignored. - - If this policy is left not set, the global default value will be used for all sites either from the 'DefaultWebUsbGuardSetting' policy if it is set, or the user's personal configuration otherwise. - - URL patterns in this policy should not clash with the ones configured via WebUsbBlockedForUrls. If there is a clash, this policy will take precedence over WebUsbBlockedForUrls and WebUsbAskForUrls.</translation> <translation id="3414260318408232239">If this policy is not configured then <ph name="PRODUCT_NAME" /> uses a default minimum version which is TLS 1.0. Otherwise it may be set to one of the following values: 'tls1', 'tls1.1' or 'tls1.2'. When set, <ph name="PRODUCT_NAME" /> will not use SSL/TLS versions less than the specified version. An unrecognised value will be ignored.</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 131e700..f8f58e9 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1170,25 +1170,6 @@ Si esta política se establece en false, la optimización de WPAD se inhabilita, lo que hace que <ph name="PRODUCT_NAME" /> espere más tiempo a los servidores de WPAD basados en DNS. Si la política se habilita o no se establece, la optimización de WPAD se habilita. Independientemente de si se establece esta política o de cómo se configura, los usuarios no pueden cambiar la configuración de optimización de WPAD.</translation> -<translation id="3071839057966069710">Configura una lista de impresoras. - - Esta política permite que los administradores proporcionen configuraciones de impresoras - para sus usuarios. - - <ph name="PRINTER_DISPLAY_NAME" /> y <ph name="PRINTER_DESCRIPTION" /> son strings con formato libre que pueden personalizarse para facilitar la selección de impresoras. <ph name="PRINTER_MANUFACTURER" /> y <ph name="PRINTER_MODEL" /> sirven para que los usuarios finales puedan identificar las impresoras fácilmente y representan al fabricante y el modelo de la impresora. <ph name="PRINTER_URI" /> debe ser una dirección que se pueda contactar desde la computadora cliente (que incluya <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> y <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> es opcional). Si se proporciona, se usa para ayudar con la anulación de las impresoras <ph name="ZEROCONF_DISCOVERY" /> duplicadas. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> debe coincidir con uno de los strings que representan una impresora compatible con <ph name="PRODUCT_NAME" />. El string se usará para identificar e instalar el PPD correspondiente para la impresora. Para obtener más información, visita https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> es un indicador booleano que especifica si se debe usar "IPP Everywhere" para configurar la impresora. Este indicador es compatible con <ph name="PRODUCT_OS_NAME" /> 76 y versiones posteriores. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> debe incluir el nombre de la impresora, o debe establecerse <ph name="PRINTER_AUTOCONF" /> como verdadero. Se ignorarán las impresoras que tengan ambas propiedades o ninguna de las dos. - - La configuración de la impresora se completa cuando se usa por primera vez. Los PPD no se descargan hasta que se usa la impresora. Luego, los PPD que se usan con mayor frecuencia se almacenan en caché. - - Esta política no afecta la capacidad del usuario para configurar impresoras en dispositivos individuales. Su objetivo es complementar la configuración de impresoras a cargo de usuarios individuales. - - Para los dispositivos administrados con Active Directory, esta política es compatible con la expansión de <ph name="MACHINE_NAME_VARIABLE" /> al nombre de la máquina de Active Directory o un substring de él. Por ejemplo, si el nombre de la máquina es <ph name="MACHINE_NAME_EXAMPLE" />, entonces <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> se reemplazará con los 4 caracteres a partir de la sexta posición, es decir, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Ten en cuenta que esta posición incluye el cero. - </translation> <translation id="3072045631333522102">Protector de pantalla que se utilizará en la pantalla de inicio de sesión del modo de venta</translation> <translation id="3072847235228302527">Establecer las Condiciones del servicio para la cuenta local del dispositivo</translation> <translation id="3077183141551274418">Habilitar o inhabilitar los ciclos de vida de las pestañas</translation> @@ -1322,13 +1303,6 @@ Si la estableces, los usuarios no podrán cambiarla ni anularla. Si no se establece, se inhabilitará el cambio de pico de consumo de energía desde un principio, y el usuario no podrá habilitarla.</translation> -<translation id="3388153794103186066">Te permite establecer una lista de URL en la que se especifiquen los sitios a los que se les otorgará permiso para acceder de forma automática a un dispositivo USB con los ID del producto y proveedor correspondientes. Para que la política sea válida, cada elemento en la lista debe contener tanto los dispositivos como las URL. Cada elemento en los dispositivos puede contener un campo de ID del producto y del proveedor. Los ID que se omitan se considerarán como comodín con una excepción: no podrá especificarse un ID del producto sin que se especifique un ID del proveedor; de lo contrario, la política no será válida y se ignorará. - - El modelo del permiso para USB utiliza la URL del sitio que lo solicita ("URL que solicita permiso") y la URL del sitio del marco principal ("URL de incorporación") para otorgar permiso a la URL que lo solicita a fin de acceder al dispositivo USB. Es posible que esa URL no sea la misma que la de incorporación cuando se carga el sitio que solicita permiso en un iframe. Por lo tanto, el campo "urls" puede incluir hasta dos strings de URL delimitados por una coma para especificar la URL que solicita permiso y la URL de incorporación respectivamente. Si solo se especifica una URL, se otorgará el acceso a los dispositivos USB correspondientes cuando la URL del sitio que lo solicita coincida con esta URL más allá del estado de incorporación. Las URL en el campo "urls" deben ser válidas; de lo contrario, se ignorará la política. - - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios ya sea de la política "DefaultWebUsbGuardSetting" (si se establece) o de la configuración personal del usuario. - - Los patrones de URL en esta política deben ser compatibles con los que se configuran a través de WebUsbBlockedForUrls. Si no lo son, prevalecerá esta política por sobre WebUsbBlockedForUrls y WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Si no se configura esta política, <ph name="PRODUCT_NAME" /> usará la versión mínima predeterminada, que es TLS 1.0. De lo contrario, se podrá establecer en uno de los siguientes valores: "tls1", "tls1.1" o "tls1.2". De esta manera, <ph name="PRODUCT_NAME" /> no usará las versiones de SSL/TLS anteriores a la versión especificada. Se ignorarán los valores que no se reconozcan.</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 463d524..4e56d7d 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -1199,25 +1199,6 @@ Si se asigna el valor false a esta política, la optimización de WPAD se inhabilitará, lo que causará que <ph name="PRODUCT_NAME" /> tenga que esperar más tiempo la respuesta de los servidores WPAD basados en DNS. Si no se configura esta política o se habilita, se habilitará la optimización de WPAD. Independientemente de cómo se configure esta política o de si se configura o no, los usuarios no podrán cambiar la opción de configuración de WPAD.</translation> -<translation id="3071839057966069710">Configura una lista de impresoras. - - Esta política permite que los administradores proporcionen opciones de configuración de impresoras - a sus usuarios. - - <ph name="PRINTER_DISPLAY_NAME" /> y <ph name="PRINTER_DESCRIPTION" /> son cadenas de formato libre que se pueden personalizar para que la selección de impresoras sea sencilla. <ph name="PRINTER_MANUFACTURER" /> y <ph name="PRINTER_MODEL" /> permiten que la identificación de la impresora sea sencilla para los usuarios finales. Representan el fabricante y el modelo de la impresora. <ph name="PRINTER_URI" /> debería ser una dirección que esté disponible desde un ordenador cliente (incluidos <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> y <ph name="URI_QUEUE" />). <ph name="PRINTER_UUID" /> es opcional. Si se especifica, se utiliza para anular el duplicado de impresoras <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> debe coincidir con una de las cadenas que representan una impresora <ph name="PRODUCT_NAME" /> compatible. La cadena se usará para identificar e instalar los archivos PPD adecuados para la impresora. Consulta más información en la página https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> es un indicador booleano que especifica si se debe usar IPP Everywhere para configurar la impresora. Este indicador es compatible con <ph name="PRODUCT_OS_NAME" /> 76 y versiones posteriores. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> debería incluir el nombre de la impresora o <ph name="PRINTER_AUTOCONF" /> debería tener asignado el valor "True". Se ignorarán las impresoras que tengan ambas propiedades o ninguna. - - La configuración de la impresora se completará la primera vez que se use. Los archivos PPD no se descargarán hasta que se use la impresora. A partir de ese momento, los archivos PPD que se usen con frecuencia se almacenarán en caché. - - Esta política no afecta a la capacidad de los usuarios para configurar impresoras en determinados dispositivos. La política se ha diseñado con el objetivo de ser complementaria a la configuración de impresoras por parte de los usuarios. - - En los dispositivos administrados de Active Directory, esta política admite una expansión de <ph name="MACHINE_NAME_VARIABLE" /> al nombre de máquina de Active Directory o una subcadena de este. Por ejemplo, si el nombre de máquina es <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> se sustituiría por 4 caracteres después de la sexta posición, es decir, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Ten en cuenta que la posición se basa en cero. - </translation> <translation id="3072045631333522102">Protector de pantalla a utilizar en la pantalla de inicio de sesión del modo de venta</translation> <translation id="3072847235228302527">Establecer las Condiciones de Servicio para una cuenta de dispositivo local</translation> <translation id="3077183141551274418">Habilita o inhabilita los ciclos de vida de las pestañas</translation> @@ -1359,13 +1340,6 @@ Si asignas un valor a esta política, el usuario no podrá cambiarlo o anularlo. Si no le asignas ningún valor, Peak Shift estará inhabilitado inicialmente y el usuario no podrá habilitarlo.</translation> -<translation id="3388153794103186066">Permite configurar una lista con las URL de los sitios web a los que se concederá permiso automáticamente para acceder a un dispositivo USB con los ID de proveedor y producto facilitados. Cada elemento de la lista debe contener tanto el dispositivo como la URL para que la política sea válida. Cada elemento de los dispositivos puede incluir un campo de ID de proveedor e ID de producto. Los ID que se omitan se considerarán comodines, con una excepción: no se puede especificar un ID de producto sin que se especifique también un ID de proveedor. De lo contrario, la política no será válida y se ignorará. - - El modelo de permiso de USB usa la URL del sitio web solicitante ("URL solicitante") y la URL del sitio web marco de nivel superior ("URL de inserción") para otorgar permiso a la URL solicitante para acceder al dispositivo USB. La URL solicitante puede ser distinta a la de inserción si el sitio web solicitante se encuentra en un iframe. Por lo tanto, el campo "urls" puede contener un máximo de dos cadenas de URL delimitadas por una coma para especificar la URL solicitante y la de inserción, respectivamente. Si solo se especifica una URL, se otorgará acceso a los dispositivos USB correspondientes cuando la URL del sitio web solicitante coincida con esta URL, independientemente del estado de inserción. Las URL del campo "urls" deben ser URL válidas; de lo contrario, la política se ignorará. - - Si no se le asigna ningún valor a esta política, se usará en todos los sitios web el valor general predeterminado que se indique en la política "DefaultWebUsbGuardSetting" (si se ha definido) o las preferencias personales del usuario (si no se ha definido). - - Los patrones de URL de esta política no deben entrar en conflicto con los de la política WebUsbBlockedForUrls. Si hay un conflicto, esta política prevale sobre las políticas WebUsbBlockedForUrls y WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Si esta política no se configura, <ph name="PRODUCT_NAME" /> usa una versión mínima predeterminada (TLS 1.0). En caso contrario, se le asignará uno de estos valores: "tls1", "tls1.1" o "tls1.2". Si se habilita, <ph name="PRODUCT_NAME" /> no usará las versiones de SSL/TLS inferiores a la versión especificada y se ignorarán los valores no reconocidos.</translation>
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index b7929c20..8535800 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -1212,25 +1212,6 @@ Kui selle reegli väärtuseks on määratud Väär, on WPAD-i optimeerimine keelatud ja teenus <ph name="PRODUCT_NAME" /> peab DNS-põhiseid WPAD-i servereid kauem ootama. Kui reeglit pole määratud või see on lubatud, on WPAD-i optimeerimine lubatud. Olenemata sellest, kas ja kuidas see reegel on määratud, ei saa kasutajad WPAD-i optimeerimise seadet muuta.</translation> -<translation id="3071839057966069710">Seadistab printerid. - - Reegel võimaldab administraatoritel kasutajatele printeriseadistusi - pakkuda. - - <ph name="PRINTER_DISPLAY_NAME" /> ja <ph name="PRINTER_DESCRIPTION" /> on vabas vormis stringid, mida saab kohandada, et hõlbustada printeri valimist. <ph name="PRINTER_MANUFACTURER" /> ja <ph name="PRINTER_MODEL" /> hõlbustavad lõppkasutajate jaoks printerite tuvastamist. Need näitavad printeri tootjat ja mudelit. <ph name="PRINTER_URI" /> peab olema aadress, mida saab külastada klientarvutist, sh <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ja <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> on valikuline. Selle olemasolul aitab see seadistus <ph name="ZEROCONF_DISCOVERY" /> printerite duplikaate eemaldada. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> peab vastama ühele stringidest, mis on seotud teenuses <ph name="PRODUCT_NAME" /> toetatud printeriga. Stringi kasutatakse printeri jaoks sobiva PPD tuvastamiseks ja installimiseks. Lisateavet leiate aadressilt https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> on kahendmuutuja märgis, mis näitab, kas tööriista IPP Everywhere peaks kasutama printeri seadistamiseks. Seda märgist toetatakse operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> versioonis 76 ja uuemates. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> peab sisaldama printeri nime või <ph name="PRINTER_AUTOCONF" /> tuleb määrata väärtusele Tõene. Printereid, mis kasutavad mõlemat või millel puuduvad atribuudid, eiratakse. - - Printeri seadistus viiakse lõpule printeri esimesel kasutuskorral. PPD-sid ei laadita alla enne, kui printerit kasutatakse. Pärast seda salvestatakse sageli kasutatud PPD-d vahemällu. - - See reegel ei mõjuta seda, kas kasutajad saavad konkreetsetes seadmetes printereid seadistada. See on mõeldud kasutajate printerite seadistusi täiendama. - - Active Directory hallatavate seadmete puhul toetab see reegel seadme <ph name="MACHINE_NAME_VARIABLE" /> laiendamist Active Directory seadme nimele või selle alamstringile. Näiteks kui seadme nimi on <ph name="MACHINE_NAME_EXAMPLE" />, siis asendatakse <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> nelja tähemärgiga, mis algab pärast kuuendat märki (nt <ph name="MACHINE_NAME_PART_EXAMPLE" />). Pange tähele, et loendamist alustatakse nullist. - </translation> <translation id="3072045631333522102">Ekraanisäästja, mida kasutatakse jaemüügirežiimis sisselogimiskuval</translation> <translation id="3072847235228302527">Teenusetingimuste määramine seadmes kasutatava konto jaoks</translation> <translation id="3077183141551274418">Lubab või keelab vahelehtede elutsüklid</translation> @@ -1366,13 +1347,6 @@ Selle reegli määramisel ei saa kasutajad seda muuta ega alistada. Kui see reegel jäetakse määramata, siis on elektrikasutuse nihutamine tarbimise tippajast esialgu keelatud ja kasutaja ei saa seda lubada.</translation> -<translation id="3388153794103186066">Võimaldab teil määrata URL-ide loendi, mis määravad, millistele saitidele antakse automaatselt luba määratud hankija ja toote ID-ga USB-seadmele juurdepääsemiseks. Iga loendiüksus peab sisaldama nii seadmeid kui ka URL-e, et reegel kehtiks. Iga seadmete loendi üksus võib sisaldada hankija ID ja toote ID välja. Välja jäetud ID-sid käsitletakse metamärkidena ühe erandiga: ilma hankija ID-d määramata ei saa toote ID-d määrata. Muidu on reegel kehtetu ja seda eiratakse. - - USB loamudel kasutab taotluse esitanud saidi URL-i („taotleja URL”) ja ülataseme raamsaidi URL-i („manustamise URL”), et lubada taotluse esitanud URL-il USB-seadmele juurde pääseda. Taotleja URL võib manustamise URL-ist erineda juhul, kui taotluse esitanud sait laaditakse iframe'is. Seetõttu võib väli „URL-id” sisaldada kuni kaht komaga eraldatud URL-i, mis määravad vastavalt taotleja URL-i ja manustamise URL-i. Kui määratud on ainult üks URL, antakse juurdepääs vastavatele USB-seadmetele juhul, kui taotluse esitanud saidi URL kattub selle URL-iga, olenemata manustamise olekust. Väljal „URL-id” olevad URL-id peavad olema kehtivad, muidu reeglit eiratakse. - - Kui reegel jäetakse määramata, kasutatakse kõigi saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultWebUsbGuardSetting” (kui see on määratud) või kasutaja isiklikust seadistusest. - - Reeglis määratud URL-i mustrid ei tohi olla vastuolus reegli WebUsbBlockedForUrls kaudu seadistatud URL-idega. Vastuolu korral on sellel reeglil eesõigus reeglite WebUsbBlockedForUrls ja WebUsbAskForUrls ees.</translation> <translation id="3414260318408232239">Kui seda reeglit pole seadistatud, siis kasutab teenus <ph name="PRODUCT_NAME" /> vaikimisi miinimumversiooni, milleks on TLS 1.0. Muul juhul võidakse see määrata ühele järgmistest väärtustest: „tls1”, „tls1.1” või „tls1.2”. Kui see on määratud, ei kasuta teenus <ph name="PRODUCT_NAME" /> SSL-i/TLS-i versioone, mis on määratud versioonist vanemad. Tundmatut väärtust eiratakse.</translation>
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index 45dd8e7..992b4da9 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -1170,24 +1170,6 @@ اگر این خطمشی روی نادرست تنظیم شود، بهینهسازی WPAD غیرفعال شده و باعث میشود <ph name="PRODUCT_NAME" /> مدت زمان بیشتری برای سرورهای WPAD مبتنی بر DNS منتظر بماند. اگر این خطمشی تنظیم نشود یا فعال شود، بهینهسازی WPAD فعال میشود. بدون توجه به اینکه این خطمشی تنظیم شود یا نه و نحوه تنظیم آن، تنظیم بهینهسازی WPAD نمیتواند توسط کاربران تغییر داده شود.</translation> -<translation id="3071839057966069710">فهرستی از چاپگرها را پیکربندی میکند. - - این خطمشی به سرپرستان سیستم امکان میدهد پیکربندیهای چاپگر را برای کاربرانشان فراهم کنند. - - <ph name="PRINTER_DISPLAY_NAME" /> و <ph name="PRINTER_DESCRIPTION" /> رشتههایی بهشکل آزادند که میتوانند برای سهولت در انتخاب چاپگر، سفارشی شوند. <ph name="PRINTER_MANUFACTURER" /> و <ph name="PRINTER_MODEL" /> کار کاربران نهایی را در شناسایی چاپگر تسهیل میکنند. این دو مورد سازنده و مدل چاپگر را نشان میدهند. <ph name="PRINTER_URI" /> باید نشانی قابلدسترسی ازطریق رایانه کارخواه شامل <ph name="URI_SCHEME" />، <ph name="URI_PORT" />، و <ph name="URI_QUEUE" /> باشد. <ph name="PRINTER_UUID" /> اختیاری است. اگر ارائه شود، برای جلوگیری از تکرار چاپگرهای <ph name="ZEROCONF_DISCOVERY" /> استفاده میشود. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> باید با یکی از رشتههایی که نشاندهنده چاپگر پشتیبانیشده ازجانب <ph name="PRODUCT_NAME" /> است، مطابقت کند. این رشته برای تشخیص و نصب PPD مناسب برای چاپگر استفاده میشود. در https://support.google.com/chrome?p=noncloudprint اطلاعات بیشتری پیدا میکنید. - - <ph name="PRINTER_AUTOCONF" /> پرچمی منطقی است که نشان میدهد آیا IPP Everywhere باید برای راهاندازی چاپگر استفاده شود یا نه این پرچم در <ph name="PRODUCT_OS_NAME" /> نسخه ۷۶ و بالاتر پشتیبانی میشود. - - اگر لازم باشد <ph name="PRINTER_EFFECTIVE_MODEL" /> حاوی نام چاپگر یا <ph name="PRINTER_AUTOCONF" /> باشد، باید روی درست تنظیم شود. چاپگرهای دارای هردو یا فاقد هیچ ویژگی کنار گذاشته میشوند. - - راهاندازی چاپگر با اولین استفاده کامل میشود. تا از چاپگر استفاده نشود، فایلهای PPD بارگیری نمیشوند. پس از آن، فایلهای PPD که اغلب استفاده میشوند، در حافظه پنهان قرار میگیرند. - - این خطمشی توانایی کاربران را برای پیکربندی چاپگر در دستگاههای فردی تحتتأثیر قرار نمیدهد. این خطمشی بهعنوان مکملی برای پیکربندی چاپگرها ازجانب کاربران مجزا درنظر گرفته شده است. - - برای دستگاههای مدیریتشده با Active Directory، این خطمشی از گسترش <ph name="MACHINE_NAME_VARIABLE" /> به نام رایانه Active Directory یا رشتهای فرعی از آن پشتیبانی میکند. برای مثال، اگر نام رایانه <ph name="MACHINE_NAME_EXAMPLE" /> باشد، ۴ نویسه بعد از موقعیت ششم جایگزین <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> میشوند (به این شکل: <ph name="MACHINE_NAME_PART_EXAMPLE" />) . توجه کنید این موقعیت برمبنای صفر است. - </translation> <translation id="3072045631333522102">محافظ صفحه مورداستفاده در صفحه ورود به سیستم در حالت خردهفروشی</translation> <translation id="3072847235228302527">تنظیم شرایط خدمات برای حساب محلی دستگاه</translation> <translation id="3077183141551274418">فعال یا غیرفعال کردن چرخه حیات برگه</translation> @@ -1323,13 +1305,6 @@ اگر این خطمشی را تنظیم کنید، کاربران نمیتوانند آن را تغییر دهند یا لغو کنند. اگر این خطمشی تنظیم نشود، تغییر مصرف انرژی از ابتدا غیرفعال است و کاربر نمیتواند آن را فعال کند.</translation> -<translation id="3388153794103186066">به شما امکان میدهد فهرستی از نشانیهای وب تنظیم کنید که مشخص میکند کدام سایتها بهطور خودکار اجازه خواهند داشت به دستگاه USB با فروشنده و شناسههای محصول مشخص دسترسی داشته باشند. برای اینکه خطمشی معتبر باشد، همه موارد موجود در فهرست باید هم حاوی دستگاه و هم نشانی وب باشند. همه موارد موجود در دستگاهها میتوانند فیلد شناسه فروشنده و شناسه محصول را بهدست آورند. هر شناسهای که جا میافتد بهعنوان نویسه عام در نظر گرفته میشود؛ اما یک استثنا وجود دارد، اینکه اگر شناسه فروشنده مشخص نشود نمیتوان شناسه محصول را هم مشخص کرد. درغیراینصورت، خطمشی نامعتبر خواهد بود و نادیده گرفته میشود. - - مدل مجوز USB برای ارائه مجوز از نشانی وب سایت درخواستکننده («نشانی وب درخواستکننده») و نشانی وب سایت از سایت فریم بالا («نشانی وب جاسازیشونده») استفاده میکند تا به نشانی وب درخواستکننده اجازه دهد به دستگاه USB دسترسی داشته باشد. اگر سایت درخواستکننده در یک iframe بار شود، نشانی وب درخواستکننده میتواند متفاوت از نشانی وب جاسازیشونده باشد. بنابراین، فیلد نشانی وب میتواند حداکثر دو رشته نشانی وب جداشده با ویرگول داشته باشد تا بهترتیب نشانی وب درخواستکننده و جاسازیشونده مشخص شود. اگر فقط یک نشانی وب مشخص شود، وقتی نشانی وب سایت درخواستکننده با نشانی وب مشخصشده منطبق باشد، دسترسی به دستگاههای USB مربوطه ارائه خواهد شد (بدون توجه به وضعیت جاسازی). باید نشانیهای وب معتبری در فیلد «urls» وارد شود، درغیراینصورت، این خطمشی نادیده گرفته خواهد شد. - - اگر این خطمشی تنظیم نشود، مقدار پیشفرض عمومی برای همه سایتها استفاده خواهد شد. اگر خطمشی «DefaultWebUsbGuardSetting» تنظیم شده باشد این مقدار از این خطمشی گرفته میشود، درغیراینصورت از پیکربندی شخصی کاربر بهدست میآید. - - الگوهای نشانی وب در این خطمشی نباید با الگوهای پیکربندیشده ازطریق WebUsbBlockedForUrls مغایرت داشته باشد. اگر مغایرتی وجود داشته باشد، این خطمشی نسبت به WebUsbBlockedForUrls و WebUsbAskForUrls در اولویت قرار خواهد گرفت.</translation> <translation id="3414260318408232239">اگر این خطمشی پیکربندی نشده باشد، <ph name="PRODUCT_NAME" /> از نسخه حداقل پیشفرض استفاده میکند که TLS 1.0 است. درغیراینصورت، ممکن است روی یکی از مقادیر زیر تنظیم شود: «tls1»، «tls1.1» یا «tls1.2». پس از تنظیم شدن، <ph name="PRODUCT_NAME" /> از نسخههای SSL/TLS پایینتر از نسخه مشخصشده استفاده نخواهد کرد. مقدار ناشناس، نادیده گرفته خواهد شد.</translation>
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index a7253ef..5d6ae49 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -1183,25 +1183,6 @@ Jos tämän käytännön arvo on Epätosi, WPAD-optimointi poistetaan käytöstä, jolloin <ph name="PRODUCT_NAME" /> odottaa nimipalveluun perustuvia WPAD-palvelimia kauemmin. Jos käytäntöä ei aseteta tai sen arvo on Tosi, WPAD-optimointia käytetään. Käyttäjät eivät voi muuttaa WPAD-optimoinnin asetuksia tästä käytännöstä riippumatta.</translation> -<translation id="3071839057966069710">Määrittää tulostinluettelon. - - Tämän käytännön avulla järjestelmänvalvojat voivat määrittää tulostinasetuksia - käyttäjiä varten. - - <ph name="PRINTER_DISPLAY_NAME" /> ja <ph name="PRINTER_DESCRIPTION" /> ovat vapaamuotoisia merkkijonoja, joita voidaan muokata tulostimen valinnan helpottamiseksi. <ph name="PRINTER_MANUFACTURER" /> ja <ph name="PRINTER_MODEL" /> auttavat käyttäjiä tunnistamaan tulostimet. Ne vastaavat tulostimen valmistajaa ja mallia. Määritä kohteen <ph name="PRINTER_URI" /> arvoksi osoite, joka on käytettävissä asiakastietokoneelta ja johon sisältyvät <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ja <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> on valinnainen arvo. Sen tarkoituksena on auttaa <ph name="ZEROCONF_DISCOVERY" /> ‑tulostinkopioiden poistamisessa. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> on oltava sama kuin jokin <ph name="PRODUCT_NAME" /> ‑yhteensopivia tulostimia edustavista merkkijonoista. Merkkijonoa käytetään oikean PPD:n tunnistamiseen ja asentamiseen tulostinta varten. Saat lisätietoja osoitteesta https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> on totuusarvo, joka määrittää, pitäisikö tulostimen määritykseen käyttää IPP Everywhereä. Tätä arvoa tuetaan tuotteen <ph name="PRODUCT_OS_NAME" /> versiossa 76 ja sitä uudemmissa. - - Joko kohteen <ph name="PRINTER_EFFECTIVE_MODEL" /> pitäisi sisältää tulostimen nimen tai kohteen <ph name="PRINTER_AUTOCONF" /> arvoksi pitäisi olla asetettu tosi. Sellaiset tulostimet ohitetaan, joissa on joko molemmat ominaisuudet tai ei kumpaakaan. - - Tulostin määritetään sen ensimmäisen käyttökerran yhteydessä. PPD:t ladataan vasta, kun tulostinta käytetään. Tämän jälkeen PPD:t tallennetaan välimuistiin, jos niitä käytetään usein. - - Tämä käytäntö ei vaikuta siihen, voivatko käyttäjät määrittää tulostimia yksittäisillä laitteilla. Se on tarkoitettu käytettäväksi yksittäisten käyttäjien tekemien tulostinmääritysten lisäksi. - - Jos laitetta hallinnoidaan Active Directoryn avulla, tämä käytäntö sallii, että <ph name="MACHINE_NAME_VARIABLE" /> liitetään Active Directory ‑koneen nimeen tai sen alimerkkijonoon. Jos koneen nimi on esimerkiksi <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> korvattaisiin kuudennetta kohtaa seuraavilla neljällä merkillä: <ph name="MACHINE_NAME_PART_EXAMPLE" />. Huomaa, että kohtien laskeminen aloitetaan nollasta. - </translation> <translation id="3072045631333522102">Näytönsäästäjä, jota käytetään kirjautumisruudulla jälleenmyyntitilassa</translation> <translation id="3072847235228302527">Aseta laitteen paikallisen tilin käyttöehdot</translation> <translation id="3077183141551274418">Ottaa välilehtien elinkaaret käyttöön tai poistaa ne käytöstä</translation> @@ -1337,13 +1318,6 @@ Jos määrität tämän käytännön, käyttäjät eivät voi muuttaa tai ohittaa sitä. Jos tätä käytäntöä ei ole määritetty, ruuhka-ajan virranvaihto on oletuksena poistettu käytöstä eikä käyttäjä voi ottaa sitä käyttöön.</translation> -<translation id="3388153794103186066">Voit määrittää luettelon URL-osoitemalleja, jonka sivustot saavat automaattisesti pyytää käyttäjältä USB-laitteen käyttöoikeutta, jos sillä on tietty myyjän ja tuotteen tunnus. Luettelon jokaisessa kohteessa on oltava laitteita ja URL-osoitemalleja, jotta käytäntö voi astua voimaan. Jokainen laitekohta voi sisältää kentät myyjän tunnukselle ja tuotteen tunnukselle. Jos tunnusta ei mainita, tätä pidetään jokerimerkkinä, paitsi jos tuotteen tunnus mainitaan ilman myyjän tunnuksen mainitsemista – tämä ei ole mahdollista. Muuten käytäntö ei voi astua voimaan. Virheelliset käytännön arvot ohitetaan. - - USB-lupamallissa on pyytävän sivuston URL-osoite (pyytävä URL) ja ylimmän tason kehyssivuston URL-osoite (upottava URL), joiden avulla pyytävälle URL-osoitteelle annetaan lupa käyttää USB-laitetta. Pyytävä ja upottava URL-osoite voivat olla erilaiset, kun pyytävä sivusto ladataan iframella. Siksi "urls"-kentässä voi olla enintään kaksi URL-osoitekohtaa pilkulla erotettuna: pyytävä ja upottava URL-osoite. Jos vain yksi URL-osoite mainitaan, kyseisten USB-laitteiden käyttölupa annetaan, jos tämä osoite vastaa pyytävän sivun URL-osoitetta upotustilasta huolimatta. "urls"-kentän osoitteiden on oltava hyväksyttäviä URL-osoitteita, tai käytäntö ohitetaan. - - Jos tätä käytäntöä ei ole määritetty, kaikkiin sivustoihin sovelletaan DefaultWebUsbGuardSetting-käytäntöä (jos se on määritetty) tai käyttäjän omien asetusten mukaista arvoa. - - Tämän käytännön URL-osoitemallien on sovittava yhteen WebUsbBlockedForUrls-mallien kanssa. Ristiriitatilanteissa tätä käytäntöä sovelletaan ennen WebUsbBlockedForUrls- ja WebUsbAskForUrls-käytäntöjä.</translation> <translation id="3414260318408232239">Jos tätä käytäntöä ei ole määritetty, <ph name="PRODUCT_NAME" /> käyttää oletuksena vanhinta versiota, joka on TLS 1.0. Muussa tapauksessa käytännön arvoksi voidaan määrittää tls1, tls1.1 tai tls1.2. Jos arvo on jokin näistä, <ph name="PRODUCT_NAME" /> ei käytä kyseistä arvoa vanhempaa SSL/TLS-versiota. Tunnistamattomat arvot ohitetaan.</translation>
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index 037cd79a..e9626309 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -1206,25 +1206,6 @@ Kung nakatakda sa false ang patakarang ito, madi-disable ang pag-optimize ng WPAD na magsasanhi sa <ph name="PRODUCT_NAME" /> na maghintay nang mas matagal para sa mga DNS-based na WPAD server. Kung hindi nakatakda o naka-enable ang patakarang ito, ie-enable ang pag-optimize ng WPAD. Nakatakda man o paano man itinakda ang patakarang ito, hindi mababago ng mga user ang setting ng pag-optimize ng WPAD.</translation> -<translation id="3071839057966069710">Nagko-configure ng listahan ng mga printer. - - Nagbibigay-daan ang patakarang ito sa mga administrator na magbigay ng mga configuration ng printer para sa - kanilang mga user. - - Ang <ph name="PRINTER_DISPLAY_NAME" /> at <ph name="PRINTER_DESCRIPTION" /> ay mga free form na string na puwedeng i-customize para sa mas madaling pagpili ng printer. Pinapadali ng <ph name="PRINTER_MANUFACTURER" /> at <ph name="PRINTER_MODEL" /> ang pagtukoy ng printer ng mga end user. Kinakatawan ng mga ito ang manufacturer at modelo ng printer. Ang <ph name="PRINTER_URI" /> ay dapat isang address na mapupuntahan mula sa isang client na computer kabilang ang <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, at <ph name="URI_QUEUE" />. Opsyonal ang <ph name="PRINTER_UUID" />. Kung ibibigay, gagamitin ito para makatulong na mag-deduplicate ng mga printer sa <ph name="ZEROCONF_DISCOVERY" />. - - Tumutugma dapat ang <ph name="PRINTER_EFFECTIVE_MODEL" /> sa isa sa mga string na kumakatawan sa printer na sinusuportahan ng <ph name="PRODUCT_NAME" />. Gagamitin ang string para tukuyin at i-install ang naaangkop na PPD para sa printer. Makakahanap ng higit pang impormasyon sa https://support.google.com/chrome?p=noncloudprint. - - Ang <ph name="PRINTER_AUTOCONF" /> ay isang boolean flag na nagsasaad kung dapat gamitin ang IPP Everywhere para i-set up ang printer. Sinusuportahan ang flag na ito sa bersyon 76 pataas ng <ph name="PRODUCT_OS_NAME" />. - - Dapat ay naglalaman ang <ph name="PRINTER_EFFECTIVE_MODEL" /> ng pangalan ng printer o nakatakda ang <ph name="PRINTER_AUTOCONF" /> sa true. Babalewalain ang mga printer na may pareho o walang anumang property. - - Makukumpleto ang pag-set up ng printer sa unang paggamit ng printer. Hindi mada-download ang mga PPD hanggang magamit ang printer. Pagkatapos noon, maka-cache ang mga PPD na madalas gamitin. - - Walang epekto ang patakarang ito sa kung puwedeng mag-configure ng mga printer ang mga user sa mga indibidwal na device. Ginawa ito para maging karagdagan sa configuration ng mga printer ng mga indibidwal na user. - - Para sa mga device na pinapamahalaan ng Active Directory, sinusuportahan ng patakarang ito ang pag-expand ng <ph name="MACHINE_NAME_VARIABLE" /> sa pangalan ng machine ng Active Directory o sa isang substring nito. Halimbawa, kung ang pangalan ng machine ay <ph name="MACHINE_NAME_EXAMPLE" />, mapapalitan ang <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ng 4 na character simula sa ikaw-6 na posisyon, ibig sabihin, ang <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tandaang nakabtay sa zero ang posisyon. - </translation> <translation id="3072045631333522102">Screen saver na gagamitin sa screen sa pag-sign-in sa mode ng retail</translation> <translation id="3072847235228302527">Itakda ang Mga Tuntunin ng Serbisyo para sa isang account na lokal sa device</translation> <translation id="3077183141551274418">Ine-enable o dini-disable ang mga lifecycle ng tab</translation> @@ -1364,13 +1345,6 @@ Kung itatakda mo ang patakarang ito, hindi ito maaaring baguhin o i-override ng mga user. Kung hindi naitakda ang patakarang ito, idi-disable muna ang power peak shift at hindi maaaring i-enable ng user.</translation> -<translation id="3388153794103186066">Nagbibigay-daan sa iyong magtakda ng listahan ng mga url na tumutukoy kung aling mga site ang awtomatikong bibigyan ng pahintulot na mag-access ng USB device gamit ang mga ibinigay na vendor at product ID. Dapat makita sa bawat item sa listahan ang mga device at url para maging valid ang patakaran. Maaaring makakita sa bawat item sa mga device ng field ng vendor ID at product ID. Ang anumang ID na aalisin ay ituturing na wildcard maliban sa isang exception, at iyon ay hindi makakatukoy ng product ID kung hindi tutukoy ng vendor ID. Kung hindi, hindi magiging valid ang patakaran at babalewalain ito. - - Ginagamit ng model ng pahintulot sa USB ang URL ng humihiling na site ("humihiling na URL") at ang URL ng nangungunang frame site ("nag-e-embed na URL") para magbigay ng pahintulot sa humihiling na URL na i-access ang USB device. Maaaring iba ang humihiling na URL sa nag-e-embed na URL kapag na-load ang humihiling na site sa iframe. Kung kaya, maaaring magkaroon ang field ng "mga url" ng hanggang dalawang string ng URL na dine-delimit ng kuwit para matukoy ang humihiling at nag-e-embed na URL. Kung isang URL lang ang tutukuyin, magbibigay ng access sa mga kaukulang USB device kapag tumugma ang URL ng humihiling na site sa URL na ito anuman ang status ng pag-embed. Ang mga URL sa "mga url" ay dapat mga valid na URL, kung hindi ay babalewalain ang patakaran. - - Kung hahayaang hindi nakatakda ang patakarang ito, gagamitin ang pangkalahatang default na value para sa lahat ng site mula sa patakarang 'DefaultWebUsbGuardSetting' kung nakatakda ito, o kung hindi ay ang personal na configuration ng user. - - Hindi dapat sumalungat ang mga pattern ng URL sa patakarang ito sa mga pattern na na-configure sa pamamagitan ng WebUsbBlockedForUrls. Kung magkakaroon ng salungatan, mananaig ang patakarang ito sa WebUsbBlockedForUrls at WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Kung hindi na-configure ang patakarang ito, gumagamit ang <ph name="PRODUCT_NAME" /> ng default na minimum na bersyon na TLS 1.0. Kung hindi, maaari itong itakda sa isa sa mga sumusunod na value: "tls1", "tls1.1" o "tls1.2". Kapag naitakda, hindi gagamit ang <ph name="PRODUCT_NAME" /> ng mga bersyon ng SSL/TLS na mas luma kaysa sa tinukoy na bersyon. Babalewalain ang hindi kinikilalang value.</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index ca3760c..7fdf6eff5 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1209,24 +1209,6 @@ Si cette règle est définie sur "False", l'optimisation WPAD est désactivée. Par conséquent, l'attente est plus longue dans <ph name="PRODUCT_NAME" /> pour obtenir une réponse des serveurs WPAD basés sur le DNS. Si la règle n'est pas configurée ou si elle est activée, l'optimisation WPAD est activée. Quelle que soit la définition de cette règle, les utilisateurs n'ont pas la possibilité de modifier le paramètre d'optimisation WPAD.</translation> -<translation id="3071839057966069710">Permet de configurer une liste d'imprimantes. - - Cette règle offre la possibilité aux administrateurs de proposer des configurations d'imprimantes à leurs utilisateurs. - - <ph name="PRINTER_DISPLAY_NAME" /> et <ph name="PRINTER_DESCRIPTION" /> sont des chaînes au format libre, que vous pouvez personnaliser pour faciliter la sélection de l'imprimante. <ph name="PRINTER_MANUFACTURER" /> et <ph name="PRINTER_MODEL" /> visent à aider les utilisateurs finaux à identifier rapidement une imprimante. Ces chaînes correspondent respectivement au fabricant et au modèle de l'imprimante. <ph name="PRINTER_URI" /> doit être une adresse accessible à partir d'un ordinateur client (cette chaîne doit inclure le <ph name="URI_SCHEME" />, le <ph name="URI_PORT" /> et la <ph name="URI_QUEUE" />). <ph name="PRINTER_UUID" /> est facultatif. S'il est indiqué, il est utilisé pour supprimer les imprimantes <ph name="ZEROCONF_DISCOVERY" /> en double. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> doit correspondre à l'une des chaînes qui représentent une imprimante <ph name="PRODUCT_NAME" /> compatible. Cette chaîne sert à identifier et à installer le bon fichier PPD pour l'imprimante. Pour en savoir plus, consultez la page https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> est un indicateur booléen précisant si IPP Everywhere doit être utilisé ou non pour configurer l'imprimante. Cet indicateur est compatible avec <ph name="PRODUCT_OS_NAME" /> version 76 (ou version ultérieure). - - Soit <ph name="PRINTER_EFFECTIVE_MODEL" /> doit contenir le nom de l'imprimante, soit <ph name="PRINTER_AUTOCONF" /> doit être défini sur "True". Toute imprimante avec ces deux propriétés ou sans aucune propriété est ignorée. - - La configuration d'une imprimante est effectuée lors de sa première utilisation. Les fichiers PPD ne sont pas téléchargés tant que l'imprimante ne sert pas. Par la suite, les fichiers PPD utilisés fréquemment sont mis en cache. - - Cette règle n'a aucune incidence pour les utilisateurs en ce qui concerne la possibilité ou non de configurer des imprimantes sur différents appareils. Elle est destinée à compléter la configuration des imprimantes effectuée par les différents utilisateurs. - - Pour les appareils gérés par Active Directory, cette règle permet l'expansion de <ph name="MACHINE_NAME_VARIABLE" /> en fonction du nom de machine Active Directory ou de l'une de ses sous-chaînes. Par exemple, si le nom de machine est <ph name="MACHINE_NAME_EXAMPLE" />, alors <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> est remplacé par les quatre caractères suivant la sixième position, soit <ph name="MACHINE_NAME_PART_EXAMPLE" />. Notez que la position prend en compte le zéro. - </translation> <translation id="3072045631333522102">Economiseur d'écran à utiliser sur l'écran de connexion en mode Point de vente</translation> <translation id="3072847235228302527">Définir les conditions d'utilisation d'un compte local de l'appareil</translation> <translation id="3077183141551274418">Activer ou désactiver le cycle de vie des onglets</translation> @@ -1366,13 +1348,6 @@ Si vous définissez cette règle, les utilisateurs n'ont pas la possibilité de la modifier ni de l'ignorer. Si cette règle n'est pas définie, le passage à l'alimentation via la batterie est désactivé au départ et ne peut être activé par l'utilisateur.</translation> -<translation id="3388153794103186066">Vous permet de définir une liste d'URL indiquant les sites automatiquement autorisés à accéder à un appareil USB correspondant aux ID de fournisseur et de produit indiqués. Chaque élément de la liste doit contenir à la fois les appareils et les URL pour que la règle soit valide. Chaque élément des appareils peut contenir un champ d'ID de produit et d'ID de fournisseur. Les ID non renseignés sont traités comme des caractères génériques, à une exception près : un ID de produit ne peut pas être spécifié si un ID de fournisseur n'est pas aussi spécifié. Sinon, la règle n'est pas valide et est ignorée. - - Le modèle d'autorisation USB utilise l'URL du site à l'origine de la demande ("URL demandeuse") et l'URL du site du cadre de premier niveau ("URL d'intégration") pour autoriser l'URL demandeuse à accéder à l'appareil USB. L'URL demandeuse peut être différente de l'URL d'intégration si le site demandeur est chargé dans un iFrame. Le champ "URL" peut de ce fait contenir jusqu'à deux chaînes d'URL séparées par une virgule, afin d'indiquer l'URL demandeuse et l'URL d'intégration, respectivement. Si une seule URL est spécifiée, l'accès aux appareils USB concernés est autorisé si l'URL du site demandeur correspond à cette URL, quel que soit l'état d'intégration. Si les URL indiquées dans le champ "URL" ne sont pas valides, la règle est ignorée. - - Si cette règle n'est pas configurée, la valeur par défaut globale sera utilisée pour tous les sites à partir de la règle DefaultWebUsbGuardSetting si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur. - - Les formats d'URL de cette règle ne doivent pas entrer en conflit avec ceux qui ont été configurés via WebUsbBlockedForUrls. En cas de conflit, cette règle est prioritaire sur les règles WebUsbBlockedForUrls et WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Si cette règle n'est pas configurée, <ph name="PRODUCT_NAME" /> utilise une version minimale par défaut qui est TLS 1.0. Sinon, l'une des valeurs suivantes peut être définie : "tls1", "tls1.1" ou "tls1.2". Si elle est configurée, <ph name="PRODUCT_NAME" /> n'utilisera pas de versions SSL/TLS antérieures à la version précisée. Toute valeur non reconnue sera ignorée.</translation>
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index a5a672f..376e037 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -1190,25 +1190,6 @@ જો આ નીતિને false પર સેટ કરવામાં આવી હોય, તો WPAD ઓપ્ટિમાઇઝેશનને બંધ કરવામાં આવે છે જેના કારણે <ph name="PRODUCT_NAME" /> ને DNS-આધારિત WPAD સર્વર્સ માટે લાંબો સમય રાહ જોવી પડે છે. જો આ નીતિને સેટ કરેલી ન હોય અથવા ચાલુ કરેલી હોય, તો WPAD ઓપ્ટિમાઇઝેશનને ચાલુ કરવામાં આવે છે. આ નીતિને સેટ કરેલી છે કે નહીં અથવા તેને કેવી રીતે સેટ કરવામાં આવે છે તે બાબતથી સ્વતંત્ર, WPAD ઓપ્ટિમાઇઝેશન સેટિંગને વપરાશકર્તાઓ દ્વારા બદલી શકાતું નથી.</translation> -<translation id="3071839057966069710">પ્રિન્ટરની સૂચિ ગોઠવે છે. - - આ નીતિ વ્યવસ્થાપકોને તેમના વપરાશકર્તાઓ માટે પ્રિન્ટરની ગોઠવણીઓ પૂરી પાડવાની - મંજૂરી આપે છે. - - <ph name="PRINTER_DISPLAY_NAME" /> અને <ph name="PRINTER_DESCRIPTION" /> મુક્ત પ્રકારની સ્ટ્રિંગ છે જેને પ્રિન્ટરની સરળ પસંદગી માટે કસ્ટમાઇઝ કરી શકાય છે. <ph name="PRINTER_MANUFACTURER" /> અને <ph name="PRINTER_MODEL" /> વાપરનાર માટે પ્રિન્ટરની ઓળખ સરળ બનાવે છે. તે પ્રિન્ટરના ઉત્પાદક અને મૉડલ દર્શાવે છે. <ph name="PRINTER_URI" /> ઍડ્રેસ ક્લાયન્ટના કમ્પ્યુટર પરથી પહોંચી શકાય એવું હોવું જોઈએ, જેમાં <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, અને <ph name="URI_QUEUE" />નો સમાવેશ હોવો જોઈએ. <ph name="PRINTER_UUID" /> વૈકલ્પિક છે. જો આપવામાં આવ્યું હોય, તો તે <ph name="ZEROCONF_DISCOVERY" /> પ્રિન્ટરની ડુપ્લિકેટ ડિલીટ કરવામાં સહાય કરે છે. - - <ph name="PRINTER_EFFECTIVE_MODEL" />નો એ સ્ટ્રિંગ સાથે મેળ ખાવો જોઈએ જે <ph name="PRODUCT_NAME" />ની સુવિધા આપતા પ્રિન્ટર પ્રસ્તુત કરતી હોય. સ્ટ્રિંગનો ઉપયોગ પ્રિન્ટર માટેના યોગ્ય PPDને ઓળખવા તથા ઇન્સ્ટૉલ કરવા માટે થશે. https://support.google.com/chrome?p=noncloudprint પર વધુ માહિતી મળી શકે છે. - - <ph name="PRINTER_AUTOCONF" /> એક બુલિયન ફ્લેગ છે જે IPP Everywhereને પ્રિન્ટરના સેટઅપમાં ઉપયોગમાં લેવું જોઈએ કે નહીં તે દર્શાવે છે. <ph name="PRODUCT_OS_NAME" /> વર્ઝન 76 પર અને પછીના વર્ઝન પર આ ફ્લેગની સુવિધા છે. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> પ્રિન્ટરનું નામ હોવું જોઈએ અથવા <ph name="PRINTER_AUTOCONF" />ને true પર સેટ કરેલું હોવું જોઈએ. બન્ને અથવા કોઈપણ પ્રોપર્ટી ધરાવતા હોય તેવા પ્રિંટરને અવગણવામાં આવશે. - - પ્રિન્ટરના પ્રથમ ઉપયોગ સમયે એનું સેટઅપ પૂરું થાય છે. પ્રિન્ટરનો ઉપયોગ ન થાય ત્યાં સુધી PPD ડાઉનલોડ કરવામાં આવતા નથી. ત્યાર પછી, વારંવાર ઉપયોગમાં લેવાતા PPDને કૅશ મેમરીમાં સાચવવામાં આવે છે. - - વપરાશકર્તાઓ દરેક ડિવાઇસ પર પ્રિન્ટરની ગોઠવણી કરી શકે કે ન કરી શકે એની આ નીતિ ઉપર કોઈ અસર થતી નથી. એનો હેતુ દરેક વપરાશકર્તાઓના પ્રિન્ટરની ગોઠવણીના સહાયક તરીકે હોવાનો છે. - - Active Directory દ્વારા મેનેજ કરાયેલ ડિવાઇસ માટે, આ નીતિ <ph name="MACHINE_NAME_VARIABLE" />નું Active Directory મશીન નામ અથવા એની સબસ્ટ્રિંગમાં વિસ્તરણ કરવામાં સહાય કરે છે. ઉદાહરણ તરીકે, જો મશીનનું નામ <ph name="MACHINE_NAME_EXAMPLE" />હોય, તો <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> આ એના છઠ્ઠા અક્ષર પછીના 4 અક્ષરને બદલશે, દા.ત. <ph name="MACHINE_NAME_PART_EXAMPLE" />. નોંધ લો કે ગણતરી શૂન્યથી શરૂ થાય છે. - </translation> <translation id="3072045631333522102">રીટેલ મોડમાં સાઇન-ઇન સ્ક્રીન પર ઉપયોગ કરવા માટે સ્ક્રીન સેવર</translation> <translation id="3072847235228302527">ડિવાઇસ-સ્થાનિક એકાઉન્ટ માટે સેવાની શરતો સેટ કરો</translation> <translation id="3077183141551274418">ટૅબ લાઇફસાઇકલ ચાલુ અથવા બંધ કરે છે</translation> @@ -1346,13 +1327,6 @@ જો તમે આ પૉલિસી સેટ કરેલી હોય. તો વપરાશકર્તાઓ તેને બદલી કે ઓવરરાઇડ કરી શકતા નથી. જો આ પૉલિસીને સેટ કર્યા વિના રાખી હોય, તો શરૂઆતમાં પાવર પીક શિફ્ટ બંધ રહે છે અને વપરાશકર્તાઓ તેને ચાલુ કરી શકતા નથી.</translation> -<translation id="3388153794103186066">આપેલા વેન્ડર અને પ્રોડક્ટ IDs વડે USB ડિવાઇસ ઍક્સેસ કરવા માટે, કઈ સાઇટને ઑટોમેટિક રીતે પરવાનગી આપવામાં આવશે તે સૂચવતા urlsની સૂચિ સેટ કરવાની તમને પરવાનગી આપે છે. નીતિ માન્ય થાય તે માટે સૂચિમાંની દરેક આઇટમમાં ડિવાઇસો અને urls એમ બન્ને હોવા જરૂરી છે. ડિવાઇસોમાંની દરેક આઇટમમાં વેન્ડર ID અને પ્રોડક્ટ ID ફીલ્ડ હોઈ શકે છે. બાકાત રાખવામાં આવેલું કોઈપણ ID એક અપવાદ સાથે વાઇલ્ડકાર્ડ તરીકે ગણવામાં આવે છે અને તે અપવાદ એ છે કે વેન્ડર ID પણ સૂચવવામાં ન આવ્યું હોય, તો પ્રોડક્ટ ID સૂચવી શકાય નહીં. નહિતર, નીતિ માન્ય નહીં હોય અને તે અવગણાશે. - - USB પરવાનગી મૉડલ USB ડિવાઇસ ઍક્સેસ કરવા માટે વિનંતીકર્તા URLને પરવાનગી આપવા માટે વિનંતી કરનાર સાઇટના URL ("વિનંતીકર્તા URL") અને ઉચ્ચ-સ્તરીય ફ્રેમ સાઇટના URL ("શામેલકર્તા URL")નો ઉપયોગ કરે છે. જ્યારે વિનંતી કરનાર સાઇટ iframeમાં લોડ કરવામાં આવી હોય ત્યારે શામેલકર્તા URL કરતાં વિનંતીકર્તા URL જુદું હોઈ શકે છે. તેથી, "urls" ફીલ્ડ વિનંતીકર્તા અને શામેલકર્તા URL અનુક્રમે સૂચિત કરવા માટે અલ્પવિરામ દ્વારા ડિલિમિટ થયેલી વધુમાં વધુ બે URL સ્ટ્રિંગ ધરાવી શકે છે. જો માત્ર એક જ URL સૂચિત કરવામાં આવ્યું હોય, તો જ્યારે વિનંતીકર્તા સાઇટનું URL આ URL સાથે મેળ ખાય ત્યારે શામેલ કરવાના સ્ટેટસને ધ્યાનમાં લીધા વિના, સંબંધિત USB ડિવાઇસો માટે ઍક્સેસ આપવામાં આવે છે. "urls"માંના URLs માન્ય URLs હોવા જરૂરી છે, નહિતર નીતિ અવગણાશે. - - જો આ નીતિ સેટ કર્યા વિના રાખી હશે, તો જો સેટ કરેલી હશે તો 'DefaultWebUsbGuardSetting' નીતિ પરથી અથવા અન્યથા વપરાશકર્તાની વ્યક્તિગત ગોઠવણી પરથી બધી સાઇટ માટે વૈશ્વિક ડિફૉલ્ટ મૂલ્યનો ઉપયોગ કરવામાં આવશે. - - WebUsbBlockedForUrls મારફત ગોઠવેલી પૅટર્ન સાથે આ નીતિમાંની URL પૅટર્ન વિસંગત ન હોવી જોઈએ. જો કોઈ વિસંગતિ હશે, તો આ નીતિ WebUsbBlockedForUrls અને WebUsbAskForUrlsની ઉપર પ્રાધાન્યતા મેળવશે.</translation> <translation id="3414260318408232239">જ્યારે આ પોલિસી ગોઠવવામાં આવી ન હોય, ત્યારે <ph name="PRODUCT_NAME" /> ડિફૉલ્ટ રીતે નીચામાં નીચું વર્ઝન, જે TLS 1.0 છે, તેનો ઉપયોગ કરે છે. નહિતર તે નીચેનામાંથી કોઈ એક મૂલ્ય પર સેટ કરવામાં આવી શકે છે: "tls1", "tls1.1" અથવા "tls1.2". જ્યારે સેટ કરેલી હોય, ત્યારે SSL/TLSના ઉલ્લેખિત વર્ઝનથી નીચા વર્ઝનનો ઉપયોગ <ph name="PRODUCT_NAME" /> કરશે નહિ. જાણ્યા વગરનું મૂલ્ય અવગણવામાં આવશે.</translation>
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 35f3abab..aa2bb6d 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -1205,24 +1205,6 @@ अगर इस पॉलिसी को असत्य पर सेट किया जाता है, तो WPAD ऑप्टिमाइज़ेशन अक्षम हो जाता है, जिसके कारण <ph name="PRODUCT_NAME" /> को DNS-आधारित WPAD सर्वर के लिए ज़्यादा समय तक प्रतीक्षा करनी पड़ती है. अगर यह पॉलिसी सेट नहीं है या सक्षम नहीं है, तो WPAD ऑप्टिमाइज़ेशन सक्षम हो जाता है. भले ही इस पॉलिसी को किसी भी तरह से सेट किया जाए, WPAD ऑप्टिमाइज़ेशन सेटिंग को उपयोगकर्ताओं के द्वारा नहीं बदला जा सकता है.</translation> -<translation id="3071839057966069710">प्रिंटर की सूची कॉन्फ़िगर करें. - - यह नीति एडमिन को अपने उपयोगकर्ताओं के लिए, प्रिंटर कॉन्फ़िगर करने की अनुमति देती है. - - <ph name="PRINTER_DISPLAY_NAME" /> और <ph name="PRINTER_DESCRIPTION" /> ऐसी फ़्री-फ़ॉर्म स्ट्रिंग हैं जिन्हें हर चुने गए प्रिंटर के लिए मनमुताबिक बनाया जा सकता है. असली उपयोगकर्ता <ph name="PRINTER_MANUFACTURER" /> और <ph name="PRINTER_MODEL" /> की मदद से प्रिंटर की आसानी से पहचान कर पाते हैं. वे प्रिंटर के निर्माता और मॉडल के बारे में बताते हैं. <ph name="PRINTER_URI" /> एक ऐसा पता होना चाहिए जिस पर किसी क्लाइंट कंप्यूटर से पहुंचा जा सके जिसमें <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, और <ph name="URI_QUEUE" /> शामिल हैं. <ph name="PRINTER_UUID" /> वैकल्पिक है. अगर बताया गया हो, तो इसका इस्तेमाल <ph name="ZEROCONF_DISCOVERY" /> प्रिंटर की कॉपी हटाने में किया जाता है. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> उस स्ट्रिंग से मेल खाना चाहिए. यह स्ट्रिंग ऐसे प्रिंटर के बारे में बताती है जिस पर <ph name="PRODUCT_NAME" /> काम करता है. स्ट्रिंग का इस्तेमाल प्रिंटर के लिए सही पीपीडी की पहचान करने और उसे इंस्टॉल करने के लिए किया जाएगा. ज़्यादा जानकारी https://support.google.com/chrome?p=noncloudprint पर मिल सकती है. - - <ph name="PRINTER_AUTOCONF" /> बूलियन फ़्लैग होता है जो यह बताता है कि प्रिंटर को सेटअप करने के लिए, IPP Everywhere का इस्तेमाल किया जाना चाहिए या नहीं. यह फ़्लैग <ph name="PRODUCT_OS_NAME" /> के 76 या इसके बाद वाले वर्शन पर काम करता है. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> में प्रिंटर का नाम होना चाहिए या <ph name="PRINTER_AUTOCONF" /> को सही पर सेट किया जाना चाहिए. ऐसे प्रिंटर को अनदेखा कर दिया जाएगा जिसमें दोनों प्रॉपर्टी शामिल होंगी या दोनों में से कोई भी प्रॉपर्टी शामिल नहीं होगी. - - किसी प्रिंटर का पहली बार इस्तेमाल करते ही प्रिंटर का सेटअप पूरा हो जाता है. पीपीडी तब तक डाउनलोड नहीं किए जाते हैं जब तक प्रिंटर का इस्तेमाल नहीं किया जाता. उस समय के बाद, अक्सर इस्तेमाल होने वाले पीपीडी कैश मेमोरी में रख दिए जाते हैं. - - इस नीति का इस पर कोई असर नहीं होता कि उपयोगकर्ता अलग-अलग डिवाइस पर प्रिंटर कॉन्फ़िगर कर सकते हैं या नहीं. इसे अलग-अलग उपयोगकर्ताओं के प्रिंटर के कॉन्फ़िगरेशन के हिसाब से बनाया गया है. - - 'चालू निर्देशिका' से प्रबंधित होने वाले डिवाइस के लिए यह नीति मशीन के नाम की 'चालू निर्देशिका' या उसकी सबस्ट्रिंग में <ph name="MACHINE_NAME_VARIABLE" /> को बढ़ाने की अनुमति देती है. उदाहरण के लिए, अगर मशीन का नाम <ph name="MACHINE_NAME_EXAMPLE" /> है, तो <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> को छठी जगह के बाद शुरू होने वाले चार वर्णों, यानी <ph name="MACHINE_NAME_PART_EXAMPLE" /> से बदल दिया जाएगा. - </translation> <translation id="3072045631333522102">रिटेल मोड में साइन इन स्क्रीन पर इस्तेमाल करने के लिए स्क्रीन सेवर</translation> <translation id="3072847235228302527">डिवाइस-स्थानीय खाते के लिए सेवा की शर्तों सेट करना</translation> <translation id="3077183141551274418">'टैब लाइफ़ साइकल' सुविधा को चालू या बंद करती है</translation> @@ -1362,14 +1344,6 @@ अगर आपने यह नीति सेट कर दी है, तो उपयोगकर्ता इसमें बदलाव नहीं कर सकते है. इस नीति को सेट किए बिना ही छोड़ देने पर, पावर पीक शिफ़्ट शुरुआत में ही बंद हो जाता है और उपयोगकर्ता इसे चालू नहीं कर सकता है.</translation> -<translation id="3388153794103186066">आपको उन यूआरएल की सूची सेट करने देती है जिनसे यह तय होता है कि दिए गए विक्रेता और उत्पाद आईडी के साथ किसी यूएसबी डिवाइस को एक्सेस करने की अनुमति किन साइटों को अपने आप दी जाएगी. नीति के सही होने के लिए सूची में मौजूद हर आइटम में डिवाइस और यूआरएल शामिल होना ज़रूरी है. डिवाइस में हर आइटम में एक विक्रेता आईडी और उत्पाद आईडी फ़ील्ड शामिल हो सकता है. छोड़ा गया कोई भी आईडी एक अपवाद के साथ वाइल्डकार्ड माना जाता है, और वह अपवाद यह है कि किसी उत्पाद आईडी को भी तय किए बिना किसी विक्रेता आईडी को तय नहीं किया जा सकता. ऐसा न होने पर, नीति लागू नहीं की जाएगी और अनदेखा कर दी जाएगी. - - - अनुरोध करने वाले यूआरएल को यूएसबी डिवाइस एक्सेस करने की अनुमति देने के लिए यूएसबी की मंज़ूरी वाला मॉडल अनुरोध करने वाली साइट के यूआरएल ("अनुरोध करने वाला यूआरएल") और सबसे ऊपर के लेवल के फ़्रेम साइट ("एम्बेडिंग यूआरएल") के यूआरएल का इस्तेमाल करता है. जब अनुरोध करने वाली साइट को किसी iframe में लोड किया जाता है, तो अनुरोध करने वाला यूआरएल एम्बेडिंग यूआरएल से अलग हो सकता है. इसलिए, अनुरोध वाले और एम्बेडिंग यूआरएल को दिखाने के लिए "यूआरएल" फ़ील्ड में कॉमा से अलग की गईं कुल दो यूआरएल स्ट्रिंग शामिल की जा सकती हैं. अगर सिर्फ़ एक यूआरएल तय किया जाता है, तो फिर उससे जुड़े यूएसबी डिवाइस पर एक्सेस तब दिया जाएगा जब अनुरोध करने वाली साइट का यूआरएल एम्बेडिंग स्थिति के बावजूद इस यूआरएल से मिलान करता हो. "यूआरएल" में काम करने वाले यूआरएल शामिल होने चाहिए, वर्ना नीति को अनदेखा कर दिया जाएगा. - - अगर इस नीति को सेट किए बिना छोड़ दिया जाता है, तो सभी साइट के लिए या तो 'DefaultWebUsbGuardSetting' नीति अगर वह सेट की गई हो, या उपयोगकर्ता के व्यक्तिगत कॉन्फ़िगरेशन से, ग्लोबल डिफ़ॉल्ट मान का इस्तेमाल किया जाएगा. - - इस नीति में मौजूद यूआरएल पैटर्न का टकराव WebUsbBlockedForUrls के ज़रिए कॉन्फ़िगर किए गए यूआरएल पैटर्न से नहीं होना चाहिए. अगर कोई टकराव है, तो WebUsbBlockedForUrls और WebUsbAskForUrls के बजाय इस नीति को प्राथमिकता दी जाएगी.</translation> <translation id="3414260318408232239">अगर यह नीति कॉन्फ़िगर नहीं की जाती है तो फिर <ph name="PRODUCT_NAME" /> डिफ़ॉल्ट कम से कम वर्शन का इस्तेमाल करता है, जो कि TLS 1.0 है. अन्यथा उसे आगे दिए गए किसी एक मान पर सेट किया जा सकता है: "tls1", "tls1.1" या "tls1.2". सेट होने पर, <ph name="PRODUCT_NAME" /> बताए गए SSL/TLS वर्शन से नीचे वाले वर्शन का इस्तेमाल नहीं करेगा. नहीं पहचाने गए किसी मान को अनदेखा कर दिया जाएगा.</translation>
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index fd06f40..36db6090 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -1171,25 +1171,6 @@ Ako se to pravilo postavi na "False", optimizacija WPAD-a nije omogućena, pa <ph name="PRODUCT_NAME" /> dulje čeka WPAD poslužitelje temeljene na DNS-u. Ako se pravilo ne postavi ili ako se omogući, optimizacija WPAD-a omogućena je. Neovisno o tome hoće li se to pravilo postaviti i na koji način, korisnici ne mogu mijenjati postavku optimizacije WPAD-a.</translation> -<translation id="3071839057966069710">Konfigurira popis pisača. - - To pravilo omogućuje administratorima da navedu konfiguracije pisača za - korisnike. - - <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> predstavljaju nizove slobodnog oblika koji se mogu prilagoditi radi lakšeg odabira pisača. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> krajnjim korisnicima omogućuju da lakše prepoznaju pisač tako što predstavljaju proizvođača i model pisača. <ph name="PRINTER_URI" /> treba biti adresa kojoj se može pristupiti s računala klijenta, uključujući <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. Polje <ph name="PRINTER_UUID" /> nije obavezno. Ako se navede, služi za uklanjanje duplikata <ph name="ZEROCONF_DISCOVERY" /> pisača. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> mora odgovarati jednom od nizova koji predstavljaju pisač koji <ph name="PRODUCT_NAME" /> podržava. Niz će se upotrebljavati za određivanje i instaliranje odgovarajućeg PPD-a za pisač. Više informacija dostupno je na https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> je Booleova oznaka koja naznačuje treba li se za postavljanje pisača upotrijebiti IPP Everywhere. <ph name="PRODUCT_OS_NAME" /> podržava tu oznaku od verzije 76 nadalje. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> treba sadržavati naziv pisača ili se <ph name="PRINTER_AUTOCONF" /> treba postaviti na true. Pisači s oba ta svojstva ili bez ijednog od tih svojstava zanemarit će se. - - Postavljanje pisača dovršava se po prvoj upotrebi pisača. PPD-ovi će se preuzeti tek prilikom upotrebe pisača. Nakon toga često korišteni PPD-ovi spremit će se u predmemoriju. - - To pravilo ne utječe na mogućnost korisnika da konfiguriraju pisače na pojedinačnim uređajima. Ono služi kao dodatno pravilo za konfiguraciju pisača pojedinačnih korisnika. - - Za uređaje kojima upravlja Active Directory to pravilo podržava proširivanje naziva uređaja <ph name="MACHINE_NAME_VARIABLE" /> na naziv uređaja Active Directoryja ili njegov podniz. Na primjer, ako naziv uređaja glasi <ph name="MACHINE_NAME_EXAMPLE" />, onda će se <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zamijeniti s četiri znaka iza šestog položaja, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Položaj se temelji na nuli. - </translation> <translation id="3072045631333522102">Čuvar zaslona koji će se upotrebljavati na zaslonu prijave u prodajnom načinu</translation> <translation id="3072847235228302527">Postavi Uvjete pružanja usluge za lokalni račun na uređaju</translation> <translation id="3077183141551274418">Omogućuje ili onemogućuje životne cikluse kartica</translation> @@ -1321,13 +1302,6 @@ Ako postavite to pravilo, korisnici ga neće moći promijeniti ili nadjačati. Ako se to pravilo ne postavi, prebacivanje napajanja radi uštede energije bit će onemogućeno i korisnik ga neće moći omogućiti.</translation> -<translation id="3388153794103186066">Omogućuje postavljanje popisa URL-ova koji navode koje će web-lokacije automatski dobiti dopuštenje za pristup USB uređaju s navedenim ID-jem dobavljača i ID-jem proizvoda. Svaka stavka na popisu mora sadržavati uređaje i URL-ove da bi pravilo bilo važeće. Svaka stavka na uređaju može sadržavati polje ID-ja dobavljača i ID-ja proizvoda. Svaki izostavljeni ID smatra se zamjenskim znakom s jednom iznimkom, a ta je iznimka da se ID proizvoda ne može navesti, a da se ne navede i ID dobavljača. U suprotnom pravilo neće biti važeće i zanemarit će se. - - Model dopuštenja za USB upotrebljava URL web-lokacije koja šalje zahtjev ("URL koji šalje zahtjev") i URL vršnih web-lokacija u okviru ("URL koji se ugrađuje") kako bi se URL-u koji šalje zahtjev dopustio pristup USB uređaju. URL koji šalje zahtjev može se razlikovati od URL-a koji se ugrađuje ako se web-lokacija koja šalje zahtjev učitava u iframeu. Stoga, da bi se odredio URL koji šalje zahtjev i URL koji se ugrađuje, polje za "URL-ove" može sadržavati najviše dva niza URL-a razdvojena zarezom. Ako se odredi samo jedan URL, pristup će biti dopušten odgovarajućim USB uređajima kada se URL web-lokacije koja šalje zahtjev podudara s ovim URL-om, bez obzira na status ugrađivanja. URL-ovi u polju "URL-ovi" moraju biti važeći. U protivnom će se pravilo zanemariti. - - Ako se to pravilo ne postavi, za sve web-lokacije upotrebljavat će se globalna zadana vrijednost iz pravila "DefaultWebUsbGuardSetting" ako je to pravilo postavljeno, a ako nije, upotrebljavat će se korisnikova osobna konfiguracija. - - Uzorci URL-a u ovom pravilu ne bi trebali biti u sukobu s onima koji su konfigurirani pravilom WebUsbBlockedForUrls. Ako se pojavi sukob, ovo će pravilo imati prednost pred pravilima WebUsbBlockedForUrls i WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Ako se to pravilo ne konfigurira, <ph name="PRODUCT_NAME" /> upotrebljava zadanu minimalnu verziju, a to je TLS 1.0. U suprotnom se može postaviti na jednu od sljedećih vrijednosti: "tls1", "tls1.1" ili "tls1.2". Kad se to pravilo postavi, <ph name="PRODUCT_NAME" /> neće upotrebljavati verzije SSL-a/TLS-a manje od navedene verzije. Vrijednost koja se ne prepozna ignorirat će se.</translation>
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index e86ee94..c29d270 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -1181,25 +1181,6 @@ Ha a házirend értéke hamis, a WPAD-optimalizálás inaktív lesz, így a <ph name="PRODUCT_NAME" /> hosszabb ideig várakozik a DNS-alapú WPAD-szerverek esetében. Ha nem állítja be, vagy ha engedélyezi a házirendet, akkor a WPAD-optimalizálás aktív lesz. A házirend beállításától függetlenül a felhasználók nem tudják módosítani a WPAD-optimalizálás beállítását.</translation> -<translation id="3071839057966069710">A nyomtatók listáját konfigurálja. - - Ez a házirend lehetővé teszi a rendszergazdák számára, hogy - nyomtatókonfigurációkat biztosítsanak felhasználóiknak. - - A <ph name="PRINTER_DISPLAY_NAME" /> és a <ph name="PRINTER_DESCRIPTION" /> szabad formájú karakterláncok, amelyek személyre szabhatók a nyomtatóválasztás megkönnyítése érdekében. A <ph name="PRINTER_MANUFACTURER" /> és a <ph name="PRINTER_MODEL" /> a nyomtató végfelhasználó általi azonosításának megkönnyítésére szolgálnak. A nyomtató gyártóját és modelljét jelölik. Az <ph name="PRINTER_URI" /> linknek olyan címnek kell lennie, amelyhez hozzáfér az ügyfélszámítógép, és amely tartalmazza a következőket: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> és <ph name="URI_QUEUE" />. Az <ph name="PRINTER_UUID" /> megadása nem kötelező. Ha meg van adva, segít elkerülni a <ph name="ZEROCONF_DISCOVERY" /> nyomtatók ismétlődését. - - Az <ph name="PRINTER_EFFECTIVE_MODEL" /> karakterláncnak meg kell egyeznie a <ph name="PRODUCT_NAME" /> támogatott nyomtatóinak egyikét képviselő karakterlánccal. A karakterlánc a nyomtatóhoz tartozó megfelelő PPD azonosításához és telepítéséhez szükséges. További információ a következő linken található: https://support.google.com/chrome?p=noncloudprint. - - Az <ph name="PRINTER_AUTOCONF" /> egy logikai jelölő, amely azt jelzi, hogy IPP Everywhere szabvánnyal kell-e beállítani a nyomtatót. Ezt a jelölőt a <ph name="PRODUCT_OS_NAME" /> 76-os és újabb verziói támogatják. - - Vagy az <ph name="PRINTER_EFFECTIVE_MODEL" /> elemnek kell tartalmaznia a nyomtató nevét, vagy igazra kell állítani az <ph name="PRINTER_AUTOCONF" /> beállítást. A rendszer figyelmen kívül hagyja a mindkét tulajdonsággal, illetve az egyikkel sem rendelkező nyomtatókat. - - A nyomtató beállítása a nyomtató első használatakor történik. A PPD-k csak a nyomtató használatakor töltődnek le. Ezután a gyakran használt PPD-k a gyorsítótárba kerülnek. - - A házirend nem befolyásolja, hogy a felhasználók beállíthatják-e a nyomtatókat saját eszközeiken. A házirend célja, hogy kiegészítse az egyes felhasználók nyomtatóbeállításait. - - Az Active Directory által kezelt eszközöknél a házirend támogatja az <ph name="MACHINE_NAME_VARIABLE" /> kibővítését az Active Directory gép nevére, vagy annak karakterláncrészére. Ha például a gép neve <ph name="MACHINE_NAME_EXAMPLE" />, akkor az <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> karakterláncot a 6. pozíciónál kezdődő négy karakter helyettesíti, vagyis: <ph name="MACHINE_NAME_PART_EXAMPLE" />. Megjegyzés: A pozíció meghatározásához a kiindulási pont a nulla. - </translation> <translation id="3072045631333522102">A használandó képernyőkímélő a bejelentkezési képernyőn kiállító módban</translation> <translation id="3072847235228302527">Általános Szerződési Feltételek beállítása egy eszközszinten helyi fiók számára</translation> <translation id="3077183141551274418">Letiltja vagy engedélyezi a lapéletciklus funkciót</translation> @@ -1335,13 +1316,6 @@ Ha beállítja ezt a házirendet, a felhasználók nem módosíthatják vagy bírálhatják felül. Ha nem állítja be a házirendet, az energiaellátás peak shift funkciója a kezdetektől le lesz tiltva, és a felhasználók nem aktiválhatják.</translation> -<translation id="3388153794103186066">Lehetővé teszi olyan URL-lista megadását, amely meghatározza, hogy mely webhelyek kapnak automatikusan engedélyt arra, hogy hozzáférjenek adott szállító adott termékazonosítóival rendelkező USB-eszközökhöz. A listában lévő összes elemnek tartalmaznia kell eszközt és URL-t is, hogy a házirend érvényes legyen. Az eszközök összes eleme tartalmazhat szállító- és termékazonosítót. A nem megadott azonosítókat a rendszer – egy kivétellel – helyettesítő azonosítóként kezeli. A kivétel az, hogy termékazonosítót nem lehet szállítóazonosító nélkül megadni. Máskülönben a házirend érvénytelen lesz, és a rendszer figyelmen kívül hagyja. - - Az USB-engedélyezési modell a kérelmező webhely URL-je („kérelmező URL”) és a keretet biztosító legfelső szintű weboldal URL-je („beágyazó URL”) alapján adja meg az engedélyt az URL számára az USB-eszköz eléréséhez. Az igénylő URL és a beágyazó URL eltérő is lehet, ha az igénylő webhely iframe keretben töltődik be. Az „urls” mező ezért legfeljebb két, egymástól vesszővel elválasztott URL-címet tartalmazhat (az igénylő és a beágyazó URL-t). Ha csak egy URL-címet adnak meg, akkor az adott USB-eszközhöz való hozzáférési engedélyt akkor kapja meg a webhely, ha a kérelmező webhely URL-je egyezik ezzel az URL-címmel (függetlenül a beágyazás állapotától). Az „urls” mezőben lévő URL-eknek érvényes URL-címeknek kell lenniük, különben a rendszer figyelmen kívül hagyja a házirendet. - - Ha a házirend nincs beállítva, a rendszer az összes webhely esetében a globális alapértelmezett értéket fogja használni, amely származhat a „DefaultWebUsbGuardSetting” házirendből (ha beállították), illetve a felhasználó saját konfigurációs beállításaiból. - - Az ebben a házirendben szereplő URL-mintáknak nem szabad ütközniük a WebUsbBlockedForUrls házirendben megadott URL-mintákkal. Ütközés esetén ez a házirend élvez elsőbbséget a WebUsbBlockedForUrls és a WebUsbAskForUrls házirendekkel szemben.</translation> <translation id="3414260318408232239">Ha a házirend nincs beállítva, akkor a <ph name="PRODUCT_NAME" /> az alapértelmezés szerinti legkisebb verziót használja majd, amely a TLS 1.0. Ellenkező esetben a következő értékek egyikét lehet beállítani: „tls1”, „tls1.1” vagy „tls1.2”. Ha beállítja a házirendet, a <ph name="PRODUCT_NAME" /> nem használ majd a megadottnál alacsonyabb verziószámú SSL/TLS-verziót. Az ismeretlen értékeket a rendszer figyelmen kívül hagyja.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 07afd71..b363414 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -1163,25 +1163,6 @@ Jika kebijakan ini disetel ke false, pengoptimalan WPAD akan dinonaktifkan sehingga menyebabkan <ph name="PRODUCT_NAME" /> menunggu server WPAD berbasis DNS dalam waktu yang lebih lama. Jika kebijakan diaktifkan atau tidak disetel, pengoptimalan WPAD akan diaktifkan. Terlepas dari apakah kebijakan ini disetel atau tidak, dan bagaimana kebijakan ini disetel, setelan pengoptimalan WPAD tidak dapat diubah oleh pengguna.</translation> -<translation id="3071839057966069710">Mengonfigurasi daftar printer. - - Kebijakan ini memungkinkan administrator memberikan konfigurasi printer untuk - pengguna. - - <ph name="PRINTER_DISPLAY_NAME" /> dan <ph name="PRINTER_DESCRIPTION" /> adalah string format bebas yang dapat disesuaikan untuk mempermudah pemilihan printer. <ph name="PRINTER_MANUFACTURER" /> dan <ph name="PRINTER_MODEL" /> diberikan agar pengguna akhir mudah mengidentifikasi printer. Keduanya mewakili produsen dan model printer. <ph name="PRINTER_URI" /> harus berupa alamat yang dapat dijangkau dari komputer klien, termasuk <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, dan <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> bersifat opsional. Jika tersedia, akan digunakan untuk membantu menghapus duplikat printer <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> harus cocok dengan salah satu string yang mewakili printer yang didukung<ph name="PRODUCT_NAME" />. String ini akan digunakan untuk mengidentifikasi dan menginstal PPD yang sesuai untuk printer. Informasi selengkapnya dapat ditemukan di https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> adalah tanda boolean yang menunjukkan apakah IPP Everywhere harus digunakan untuk menyiapkan printer. Tanda ini didukung di <ph name="PRODUCT_OS_NAME" /> versi 76 dan lebih baru. - - Entah <ph name="PRINTER_EFFECTIVE_MODEL" /> harus mengandung nama printer atau <ph name="PRINTER_AUTOCONF" /> harus ditetapkan ke true. Printer dengan kedua atau tanpa properti apa pun akan diabaikan. - - Penyiapan printer diselesaikan pada saat penggunaan printer yang pertama. PPD tidak didownload sebelum printer digunakan. Setelah waktu tersebut, PPD yang sering digunakan akan disimpan dalam cache. - - Kebijakan ini tidak memengaruhi kemampuan pengguna untuk mengonfigurasi printer di tiap perangkat. Kebijakan ini ditujukan sebagai tambahan untuk konfigurasi printer yang diberikan oleh tiap pengguna. - - Untuk perangkat yang dikelola Active Directory, kebijakan ini mendukung perluasan <ph name="MACHINE_NAME_VARIABLE" /> ke nama mesin Active Directory atau substring-nya. Misalnya, jika nama mesinnya adalah <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> akan diganti dengan 4 karakter yang dimulai setelah posisi keenam, yaitu <ph name="MACHINE_NAME_PART_EXAMPLE" />. Perhatikan bahwa posisinya mulai dari nol. - </translation> <translation id="3072045631333522102">Tirai layar untuk digunakan pada layar masuk dalam mode eceran</translation> <translation id="3072847235228302527">Menyetel Persyaratan Layanan untuk akun lokal perangkat</translation> <translation id="3077183141551274418">Mengaktifkan atau menonaktifkan siklus pemakaian tab</translation> @@ -1317,7 +1298,6 @@ Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya. Jika kebijakan ini tidak ditetapkan, pergeseran puncak daya mula-mula dinonaktifkan dan tidak dapat diaktifkan oleh pengguna.</translation> -<translation id="3388153794103186066">Memungkinkan Anda menyetel daftar URL yang menentukan situs mana yang otomatis diberi izin untuk mengakses perangkat USB dengan ID vendor dan produk yang ditentukan. Setiap item dalam daftar harus memuat perangkat dan URL agar kebijakan tersebut valid. Setiap item di perangkat dapat berisi kolom ID vendor dan ID produk. ID apa pun yang dihilangkan akan diperlakukan sebagai karakter pengganti, dengan satu pengecualian, yaitu ID produk tidak dapat ditentukan tanpa menentukan ID vendor. Jika tidak, kebijakan tidak akan valid dan akan diabaikan. Model izin USB menggunakan URL situs yang meminta ("URL yang meminta") dan URL situs bingkai level teratas ("URL sematan") untuk memberikan izin kepada URL yang meminta untuk mengakses perangkat USB. URL yang meminta mungkin berbeda dengan URL sematan saat situs yang meminta dimuat dalam iframe. Oleh karena itu, kolom "URL" dapat berisi hingga dua string URL yang dipisahkan dengan koma, untuk menentukan masing-masing URL yang meminta dan URL sematan. Jika hanya ada satu URL yang ditentukan, maka akses ke perangkat USB yang sesuai akan diberikan saat URL situs yang meminta cocok dengan URL ini, terlepas dari status sematannya. URL dalam "URL" harus berupa URL yang valid. Jika tidak, kebijakan akan diabaikan. Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk seluruh situs, yaitu dari kebijakan 'DefaultWebUsbGuardSetting' jika disetel, atau dari konfigurasi pribadi pengguna. Pola URL di kebijakan ini tidak boleh bertentangan dengan pola URL yang dikonfigurasi melalui WebUsbBlockedForUrls dan WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Jika kebijakan ini tidak dikonfigurasi, <ph name="PRODUCT_NAME" /> akan menggunakan versi minimum default yaitu TLS 1.0. Jika kebijakan dikonfigurasi, kebijakan dapat disetel ke salah satu nilai berikut: "tls1", "tls1.1", atau "tls1.2". Jika disetel, <ph name="PRODUCT_NAME" /> tidak akan menggunakan versi SSL/TLS yang lebih rendah daripada versi yang ditentukan. Nilai yang tidak dikenal akan diabaikan.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 856115f..f46072e40 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -1152,24 +1152,6 @@ Se questa norma è impostata su false, l'ottimizzazione WPAD viene disattivata, aumentando così i tempi di attesa da parte di <ph name="PRODUCT_NAME" /> dei server WPAD basati su DNS. Se questa norma non è impostata oppure se è attiva, l'ottimizzazione WPAD è abilitata. Indipendentemente da se o come questa norma è impostata, l'utente non può modificare l'impostazione di ottimizzazione di WPAD.</translation> -<translation id="3071839057966069710">Consente di configurare un elenco di stampanti. - - Questo criterio consente agli amministratori di fornire configurazioni delle stampanti ai propri utenti. - - <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> sono stringhe in formato libero che è possibile personalizzare per selezionare facilmente le stampanti. I valori <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" />, che rappresentano il produttore e il modello della stampante, consentono agli utenti finali di identificare più facilmente le stampanti. Il valore <ph name="PRINTER_URI" /> deve essere un indirizzo raggiungibile da un computer client che includa <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. Il valore <ph name="PRINTER_UUID" /> è facoltativo, ma se viene specificato viene utilizzato per consentire la deduplicazione delle stampanti <ph name="ZEROCONF_DISCOVERY" />. - - Il valore <ph name="PRINTER_EFFECTIVE_MODEL" /> deve corrispondere a una delle stringhe che rappresentano una stampante supportata da <ph name="PRODUCT_NAME" />. La stringa verrà usata per identificare e installare il file PPD appropriato per la stampante. È possibile trovare ulteriori informazioni all'indirizzo https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> è un flag booleano che indica se deve essere usato o meno IPP Everywhere per configurare la stampante. Questo flag è supportato su <ph name="PRODUCT_OS_NAME" /> 76 e versioni successive. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> deve contenere il nome della stampante oppure occorre impostare <ph name="PRINTER_AUTOCONF" /> su true. Le stampanti con entrambe le proprietà o prive di proprietà verranno ignorate. - - La configurazione viene completata al primo utilizzo della stampante. I file PPD vengono scaricati soltanto quando viene utilizzata la stampante. Dopodiché, i PPD utilizzati più spesso vengono memorizzati nella cache. - - Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi. È supplementare alla configurazione di stampanti da parte dei singoli utenti. - - Per i dispositivi Active Directory gestiti, questo criterio supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina Active Directory oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> verrà sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tieni presente che la posizione è in base zero. - </translation> <translation id="3072045631333522102">Salvaschermo da utilizzare nella schermata di accesso in modalità retail</translation> <translation id="3072847235228302527">Imposta i Termini di servizio di un account locale del dispositivo</translation> <translation id="3077183141551274418">Abilita o disabilita i cicli di vita delle schede</translation> @@ -1305,13 +1287,6 @@ Se imposti questa norma, gli utenti non potranno modificarla o sostituirla. Se questa norma non viene impostata, la variazione dei picchi energetici è disattivata da subito e non può essere attivata dall'utente.</translation> -<translation id="3388153794103186066">Consente di impostare un elenco di URL che specifica a quali siti verrà concessa automaticamente l'autorizzazione per accedere a un dispositivo USB con gli ID prodotto e vendor definiti. Perché la norma sia valida, ogni elemento dell'elenco deve contenere sia dispositivi sia URL. Ogni elemento nei dispositivi può contenere un campo ID vendor e un campo ID prodotto. Gli eventuali ID omessi verranno considerati caratteri jolly con l'eccezione che non è possibile specificare un ID prodotto senza aver specificato un ID vendor. In caso contrario, la norma non sarà valida e verrà ignorata. - - Il modello di autorizzazione USB utilizza l'URL del sito richiedente ("URL richiedente") e l'URL del sito frame di livello principale ("URL di incorporamento") per concedere l'autorizzazione all'URL richiedente di accedere al dispositivo USB. L'URL richiedente può essere diverso dall'URL di incorporamento quando il sito richiedente viene caricato in un iframe. Di conseguenza il campo "urls" può contenere fino a due stringhe URL delimitate da virgola per specificare rispettivamente l'URL richiedente e l'URL di incorporamento. Se è specificato un solo URL, l'accesso ai dispositivi USB corrispondenti viene concesso quando l'URL del sito richiedente corrisponde all'URL, a prescindere dallo stato di incorporamento. Gli URL in "urls" devono essere validi, altrimenti la norma viene ignorata. - - Se questa norma non viene impostata, per tutti i siti viene usato il valore predefinito globale dalla norma "DefaultWebUsbGuardSetting" (se impostata) o dalla configurazione personale dell'utente (se non impostata). - - I pattern URL di questa norma non devono essere in conflitto con quelli configurati tramite WebUsbBlockedForUrls. In caso di conflitto, questa norma ha la precedenza su WebUsbBlockedForUrls e WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Se questa norma non viene configurata, <ph name="PRODUCT_NAME" /> utilizza una versione minima predefinita, ossia TLS 1.0. In caso contrario, la norma potrebbe essere impostata su uno dei seguenti valori: "tls1", "tls1.1" o "tls1.2". Se questa norma viene impostata, <ph name="PRODUCT_NAME" /> non utilizzerà versioni SSL/TLS precedenti alla versione specificata. I valori non riconosciuti verranno ignorati.</translation>
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 49eaba6c..0ddfe82 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -1172,25 +1172,6 @@ אם המדיניות מוגדרת כ-false, אופטימיזציית WPAD מושבתת והדבר גורם ל-<ph name="PRODUCT_NAME" /> להמתין זמן רב יותר לשרתי WPAD מבוססי-DNS. אם המדיניות לא מוגדרת או שהיא מופעלת, אופטימיזציית WPAD מופעלת. ללא קשר להגדרת המדיניות או לאופן הגדרתה, משתמשים לא יכולים לשנות את ההגדרה של אופטימיזציית WPAD.</translation> -<translation id="3071839057966069710">המדיניות מגדירה רשימת מדפסות. - - מדיניות זו מאפשרת למנהלי מערכות לספק הגדרות של מדפסות - למשתמשים. - - המחרוזת <ph name="PRINTER_DISPLAY_NAME" /> והמחרוזת <ph name="PRINTER_DESCRIPTION" /> הן בעלות פורמט חופשי שניתן להתאים אישית כדי לאפשר לבחור מדפסת בקלות. הערך <ph name="PRINTER_MANUFACTURER" /> והערך <ph name="PRINTER_MODEL" /> עוזרים למשתמשי הקצה לזהות את המדפסת בקלות. הם מייצגים את היצרן והדגם של המדפסת. הערך <ph name="PRINTER_URI" /> צריך להיות כתובת שניתן להגיע אליה ממחשב לקוח, כולל ה-<ph name="URI_SCHEME" />, ה-<ph name="URI_PORT" /> וה-<ph name="URI_QUEUE" />. הערך <ph name="PRINTER_UUID" /> הוא אופציונלי. אם מציינים אותו, הוא עוזר לבטל כפילויות של מדפסות <ph name="ZEROCONF_DISCOVERY" />. - - הערך <ph name="PRINTER_EFFECTIVE_MODEL" /> חייב להתאים לאחת מהמחרוזות המייצגות מדפסת נתמכת של <ph name="PRODUCT_NAME" />. המחרוזת תשמש לזיהוי ולהתקנה של ה-PPD המתאים של המדפסת. מידע נוסף זמין בכתובת https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> הוא סימון בוליאני המציין אם יש להשתמש ב-'IPP בכל מקום' להגדרת המדפסת. הסימון הבוליאני נתמך ב-<ph name="PRODUCT_OS_NAME" /> בגרסה 76 ואילך. - - אחד משני התנאים הבאים חייב להתקיים: <ph name="PRINTER_EFFECTIVE_MODEL" /> צריך להכיל את שם המדפסת או שהערך של <ph name="PRINTER_AUTOCONF" /> צריך להיות True. המערכת מתעלמת ממדפסות שההגדרה שלהן כוללת את שני המאפיינים האלה ביחד או לא מכילה אף מאפיין. - - ההשלמה של הגדרת המדפסת מתרחשת עם השימוש הראשון במדפסת. לא ניתן להוריד קובצי PPD עד שנעשה שימוש במדפסת. אחרי השימוש הראשון, קובצי PPD בשימוש נפוץ נשמרים במטמון. - - למדיניות הזו אין השפעה על היכולת של משתמשים להגדיר מדפסות במכשירים ספציפיים. היא מיועדת לשמש כתוספת להגדרה של מדפסות שנקבעת על ידי משתמשים נפרדים. - - במכשירים המנוהלים ב-Active Directory, המדיניות הזו תומכת בהרחבה של <ph name="MACHINE_NAME_VARIABLE" /> לשם המחשב המנוהל ב-Active Directory או למחרוזת משנה שלו. למשל, אם שם המחשב הוא <ph name="MACHINE_NAME_EXAMPLE" />, הערך <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> יוחלף ב-4 התווים שמתחילים אחרי המיקום השישי, כלומר <ph name="MACHINE_NAME_PART_EXAMPLE" />. לתשומת ליבך, המיקום מבוסס על אפסים. - </translation> <translation id="3072045631333522102">שומר מסך שמשמש במסך הכניסה של מצב קמעונאי</translation> <translation id="3072847235228302527">הגדר את התנאים וההגבלות עבור חשבון מקומי של מכשיר</translation> <translation id="3077183141551274418">מפעילה או משביתה מחזורי חיים של כרטיסיות</translation> @@ -1326,13 +1307,6 @@ אם המדיניות הזו מוגדרת על ידך, המשתמשים לא יכולים לשנות או לבטל אותה. אם המדיניות הזו לא מוגדרת, החלפת מקור החשמל בשעות השיא מושבתת מראש והמשתמש לא יכול להפעיל אותה.</translation> -<translation id="3388153794103186066">המדיניות מאפשרת לפרט רשימה של כתובות אתר שמציינות אילו אתרים יקבלו הרשאת גישה אוטומטית להתקן USB בעל מזהה הספק ומזהה המוצר הנתונים. כל פריט ברשימה חייב להכיל גם התקנים וגם כתובות אתר כדי שיהיה תוקף למדיניות. כל פריט בהתקנים יכול להכיל שדה של מזהה ספק ושדה של מזהה מוצר. אם משמיטים מזהה מסוים המערכת מתייחסת אליו כאל תו כללי, למעט במקרים שבהם לא ניתן לציין מזהה מוצר מבלי לציין גם מזהה ספק. בשאר המקרים, אין תוקף למדיניות והמערכת מתעלמת ממנה. - - מודל ההרשאה ל-USB משתמש בכתובת האתר של האתר המבקש ("האתר המבקש") ובכתובת האתר של אתר המסגרת ברמה העליונה ("כתובת האתר המטמיע") כדי להעניק לכתובת האתר המבקש הרשאת גישה להתקן ה-USB. כתובת האתר המבקש עשויה להיות שונה מכתובת האתר המטמיע אם האתר המבקש נטען ב-iframe. לכן השדה 'כתובות אתר' יכול להכיל עד 2 מחרוזות של כתובות אתר המופרדות באמצעות פסיק כדי לציין את כתובת האתר המבקש וכתובת האתר המטמיע בהתאמה. אם מציינים כתובת אתר אחת בלבד, הגישה להתקני ה-USB המתאימים מוענקת כשכתובת האתר המבקש תואמת לכתובת האתר הזו, בכל סטטוס הטמעה. כתובות האתר בשדה 'כתובות אתר' חייבות להיות כתובות אתר חוקיות, אחרת המערכת מתעלמת מהמדיניות. - - אם לא מגדירים את המדיניות הזו, המערכת משתמשת בערך ברירת המחדל הכללי לכל האתרים, שנקבע במדיניות 'DefaultWebUsbGuardSetting' (אם היא מוגדרת) או שנקבע על ידי המשתמש. - - אסור שתהיה סתירה בין הדפוסים של כתובות האתר שנקבעו במדיניות זו לבין הדפוסים של כתובות האתר שהוגדרו ב-WebUsbBlockedForUrls. במקרה של סתירה, המדיניות הזו מקבלת עדיפות על-פני WebUsbBlockedForUrls ו-WebUsbAskForUrls.</translation> <translation id="3414260318408232239">אם המדיניות הזו לא מוגדרת, ב-<ph name="PRODUCT_NAME" /> ייעשה שימוש בגירסת ברירת המחדל המינימלית, שהיא TLS 1.0. אחרת, אפשר להגדיר אותה לאחד מהערכים הבאים: "tls1", "tls1.1" או "tls1.2". כשהמדיניות מוגדרת, ב-<ph name="PRODUCT_NAME" /> לא ייעשה שימוש בגירסאות SSL/TLS ישנות יותר מהגירסה המצוינת. המערכת תתעלם מערך לא מוכר.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 0843dcbc..0dc012fe 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1169,25 +1169,6 @@ このポリシーを false に設定すると、WPAD の最適化は無効になり、DNS ベースの WPAD サーバーに対する <ph name="PRODUCT_NAME" /> の待機間隔が長くなります。このポリシーを未設定または有効にすると、WPAD の最適化は有効になります。 このポリシーの設定に関係なく、ユーザーは WPAD の最適化設定を変更できません。</translation> -<translation id="3071839057966069710">プリンタのリストを設定します。 - - 管理者はこのポリシーを使ってユーザーのプリンタ設定を - 指定できます。 - - <ph name="PRINTER_DISPLAY_NAME" /> と <ph name="PRINTER_DESCRIPTION" /> は自由形式の文字列で、プリンタを選択しやすいようにカスタマイズできます。<ph name="PRINTER_MANUFACTURER" /> と <ph name="PRINTER_MODEL" /> はエンドユーザーがプリンタを識別しやすいようにするための情報で、それぞれプリンタのメーカーと機種を表します。<ph name="PRINTER_URI" /> は、クライアントのパソコンからアクセス可能な、<ph name="URI_SCHEME" />、<ph name="URI_PORT" />、<ph name="URI_QUEUE" /> を含むアドレスである必要があります。<ph name="PRINTER_UUID" /> の指定は任意で、指定した場合は <ph name="ZEROCONF_DISCOVERY" /> プリンタの重複除外に使用されます。 - - <ph name="PRINTER_EFFECTIVE_MODEL" /> は、<ph name="PRODUCT_NAME" /> 対応のプリンタを示す文字列のいずれかと一致する必要があります。この文字列は、プリンタに適した PPD の特定とインストールに使用されます。詳細については、https://support.google.com/chrome?p=noncloudprint をご覧ください。 - - <ph name="PRINTER_AUTOCONF" /> は、プリンタの設定に IPP Everywhere を使用するかどうかを示すブール値のフラグです。このフラグは <ph name="PRODUCT_OS_NAME" /> バージョン 76 以降でサポートされています。 - - <ph name="PRINTER_EFFECTIVE_MODEL" /> にプリンタの名前を含めるか、<ph name="PRINTER_AUTOCONF" /> を true に設定する必要があります。両方のプロパティが指定されているか、どちらのプロパティも指定されていないプリンタは無視されます。 - - プリンタの設定は初回使用時に完了し、プリンタが使用されるときに初めて PPD がダウンロードされます。以降、使用頻度の高い PPD はキャッシュされます。 - - このポリシーでは、ユーザーが各自のデバイスでプリンタを設定できるかどうかは制御されません。このポリシーは、個々のユーザーのプリンタ設定をサポートすることを目的としたものです。 - - Active Directory の管理下にあるデバイスの場合、このポリシーでは、<ph name="MACHINE_NAME_VARIABLE" /> から Active Directory のマシン名またはその部分文字列への展開がサポートされます。たとえばマシン名が <ph name="MACHINE_NAME_EXAMPLE" /> の場合、<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> は 6 文字目以降の 4 文字(<ph name="MACHINE_NAME_PART_EXAMPLE" />)に置き換えられます(先頭をゼロ文字目として数えます)。 - </translation> <translation id="3072045631333522102">小売りモードでのログイン画面に使用するスクリーンセーバー</translation> <translation id="3072847235228302527">デバイスのローカル アカウントの利用規約を設定する</translation> <translation id="3077183141551274418">タブのライフサイクルを有効または無効にします</translation> @@ -1323,13 +1304,6 @@ このポリシーを設定した場合、ユーザーが変更したりオーバーライドしたりすることはできません。 このポリシーを設定しない場合、電力ピークシフトは最初から無効になっていて、ユーザーが有効にすることはできません。</translation> -<translation id="3388153794103186066">指定したベンダー ID と製品 ID の USB デバイスへのアクセスを自動的に許可するサイトを、URL のリストで設定します。このポリシーが有効になるためには、リストの各項目でデバイスと URL の両方を指定する必要があります。デバイスの各項目にはベンダー ID と製品 ID を指定できます。指定されていない ID はワイルドカードとして扱われますが、例外として、製品 ID を指定するのであればベンダー ID も指定する必要があります。ベンダー ID の指定なしで製品 ID のみを指定した場合、このポリシーは無効となり、無視されます。 - - USB のアクセス許可モデルでは、リクエスト元のサイトの URL(以下「リクエスト元 URL」)と最上位フレームサイトの URL(以下「埋め込み元 URL」)を使用して、リクエスト元 URL に USB デバイスへのアクセスを許可します。リクエスト元のサイトが iframe 内で読み込まれている場合、リクエスト元 URL と埋め込み元 URL は異なる可能性があります。このため、「urls」フィールドには、リクエスト元 URL と埋め込み元 URL をカンマで区切って、最大 2 つの URL 文字列を指定することができます。URL を 1 つだけ指定した場合、対応する USB デバイスへのアクセスは、リクエスト元のサイトの URL がこの URL と一致した場合に、埋め込みの状態にかかわらず許可されます。「urls」フィールドの URL には必ず有効な URL を指定してください。無効な URL を指定した場合、このポリシーは無視されます。 - - このポリシーが未設定の場合は、すべてのサイトでグローバルなデフォルト値(「DefaultWebUsbGuardSetting」ポリシーで値が設定されている場合はその値、設定されていない場合はユーザーの個人設定の値)が使用されます。 - - このポリシーで指定する URL パターンは、WebUsbBlockedForUrls ポリシーで指定する URL パターンと競合しないようにする必要があります。競合する場合は、WebUsbBlockedForUrls や WebUsbAskForUrls よりもこのポリシーが優先されます。</translation> <translation id="3414260318408232239">このポリシーが未設定の場合、<ph name="PRODUCT_NAME" /> ではデフォルトの最小バージョン(TLS 1.0)が使用されます。 このポリシーを設定する場合、「tls1」、「tls1.1」、「tls1.2」のいずれかの値を指定できます。<ph name="PRODUCT_NAME" /> では、指定されたバージョンより小さい SSL / TLS バージョンは使用されません。認識されない値は無視されます。</translation>
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index 17b760c..90d3c4a4 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -1129,25 +1129,6 @@ ಈ ನೀತಿಯು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದ್ದಲ್ಲಿ, DNS ಆಧರಿತ WPAD ಸೇವೆಗಳಿಗೆ ದೀರ್ಘ ಕಾಲ ಕಾಯುವುದಕ್ಕೆ <ph name="PRODUCT_NAME" /> ಕಾರಣದಿಂದ WPAD ಆಪ್ಟಿಮೈಸೇಶನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ. ಒಂದು ವೇಳೆ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದಲ್ಲಿ ಅಥವಾ ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದಲ್ಲಿ, WPAD ಆಪ್ಟಿಮೈಸೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಲಾಗಿದೆಯೇ ಅಥವಾ ಹೊಂದಿಸಿದ್ದರೆ ಹೇಗೆ ಹೊಂದಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಗಣನೆಗೆ ತೆಗೆದುಕೊಳ್ಳದೇ WPAD ಆಪ್ಟಿಮೈಸೇಶನ್ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಕೆದಾರರ ಮೂಲಕ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> -<translation id="3071839057966069710">ಪ್ರಿಂಟರ್ಗಳ ಪಟ್ಟಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ. - - ನಿರ್ವಾಹಕರು, ಬಳಕೆದಾರರಿಗೆ ಪ್ರಿಂಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ಗಳನ್ನು ಒದಗಿಸಲು ಈ - ಕಾರ್ಯನೀತಿಯು ಅವಕಾಶ ನೀಡುತ್ತದೆ. - - <ph name="PRINTER_DISPLAY_NAME" /> ಮತ್ತು <ph name="PRINTER_DESCRIPTION" /> ಮುಕ್ತ ರೂಪದ ಸ್ಟ್ರಿಂಗ್ಗಳಾಗಿದ್ದು, ಸುಲಭವಾಗಿ ಪ್ರಿಂಟರ್ ಆಯ್ಕೆ ಮಾಡುವುದಕ್ಕಾಗಿ ಇವುಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಬಹುದು. ಅಂತಿಮ ಬಳಕೆದಾರರು ಪ್ರಿಂಟರ್ ಅನ್ನು ಸುಲಭವಾಗಿ ಗುರುತಿಸಲು <ph name="PRINTER_MANUFACTURER" /> ಮತ್ತು <ph name="PRINTER_MODEL" /> ನೆರವಾಗುತ್ತವೆ. ಅವು ಪ್ರಿಂಟರ್ ತಯಾರಕರು ಮತ್ತು ಅದರ ಮಾಡೆಲ್ಗಳನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತವೆ. <ph name="PRINTER_URI" />, ಯಾವುದೇ ಕ್ಲೈಂಟ್ ಕಂಪ್ಯೂಟರ್ನಿಂದ ತಲುಪಲು ಸಾಧ್ಯವಿರುವ ವಿಳಾಸವಾಗಿರಬೇಕು ಮತ್ತು <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ಹಾಗೂ <ph name="URI_QUEUE" /> ಅನ್ನು ಒಳಗೊಂಡಿರಬೇಕು. <ph name="PRINTER_UUID" /> ಐಚ್ಛಿಕವಾಗಿದೆ. ಇದನ್ನು ಒದಗಿಸಿದರೆ, <ph name="ZEROCONF_DISCOVERY" /> ಪ್ರಿಂಟರ್ಗಳ ನಕಲನ್ನು ತೊಡೆದುಹಾಕಲು ಅದನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. - - <ph name="PRODUCT_NAME" /> ಬೆಂಬಲಿತ ಪ್ರಿಂಟರ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಸ್ಟ್ರಿಂಗ್ಗಳಲ್ಲಿ ಒಂದು ಸ್ಟ್ರಿಂಗ್ಗೆ <ph name="PRINTER_EFFECTIVE_MODEL" /> ಹೊಂದಿಕೆಯಾಗಬೇಕು. ಪ್ರಿಂಟರ್ಗಾಗಿ ಸೂಕ್ತ PPD ಅನ್ನು ಗುರುತಿಸಿ, ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಈ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಹೆಚ್ಚಿನ ಮಾಹಿತಿಯನ್ನು https://support.google.com/chrome?p=noncloudprint ನಲ್ಲಿ ನೋಡಬಹುದು. - - <ph name="PRINTER_AUTOCONF" /> ಬೂಲಿಯನ್ ಫ್ಲ್ಯಾಗ್ ಆಗಿದೆ ಹಾಗೂ ಇದು ಪ್ರಿಂಟರ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಲು IPP ಅನ್ನು ಎಲ್ಲೆಡೆ ಬಳಸಬೇಕು ಎಂದು ಸೂಚಿಸುತ್ತದೆ. <ph name="PRODUCT_OS_NAME" /> ಆವೃತ್ತಿ 76 ಹಾಗೂ ನಂತರದ ಆವೃತ್ತಿಗಳಲ್ಲಿ ಈ ಫ್ಲ್ಯಾಗ್ ಬೆಂಬಲಿತವಾಗಿರುತ್ತದೆ. - - <ph name="PRINTER_EFFECTIVE_MODEL" />, ಪ್ರಿಂಟರ್ನ ಹೆಸರನ್ನು ಒಳಗೊಂಡಿರಬೇಕು ಇಲ್ಲದಿದ್ದರೆ <ph name="PRINTER_AUTOCONF" /> ಅನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿರಬೇಕು. ಎರಡೂ ಗುಣಲಕ್ಷಣಗಳಿರುವ ಅಥವಾ ಯಾವುದೇ ಗುಣಲಕ್ಷಣವನ್ನು ಹೊಂದಿಲ್ಲದ ಪ್ರಿಂಟರ್ ಅನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ. - - ಪ್ರಿಂಟರ್ ಅನ್ನು ಮೊದಲ ಬಾರಿ ಬಳಸಿದಾಗ, ಪ್ರಿಂಟರ್ ಸೆಟಪ್ ಮಾಡುವಿಕೆ ಪೂರ್ಣಗೊಳ್ಳುತ್ತದೆ. ಪ್ರಿಂಟರ್ ಅನ್ನು ಬಳಸುವವರೆಗೆ PPD ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಅದರ ಬಳಿಕ, ಆಗಾಗ ಬಳಸುವ PPD ಗಳನ್ನು ಕ್ಯಾಷ್ನಲ್ಲಿ ಉಳಿಸಲಾಗುವುದು. - - ಬಳಕೆದಾರರು ಪ್ರಿಂಟರ್ಗಳನ್ನು ಪ್ರತ್ಯೇಕ ಸಾಧನಗಳಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದೇ ಎಂಬುದರ ಮೇಲೆ ಈ ಕಾರ್ಯನೀತಿಯು ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ. ಪ್ರತ್ಯೇಕ ಬಳಕೆದಾರರು ಪ್ರಿಂಟರ್ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದಕ್ಕೆ ಪೂರಕವಾಗಿರುವುದು ಇದರ ಉದ್ದೇಶವಾಗಿದೆ. - - ಸಕ್ರಿಯ ಡೈರೆಕ್ಟರಿ ಮೂಲಕ ನಿರ್ವಹಿಸುವ ಸಾಧನಗಳಿಗೆ ಸಂಬಂಧಿಸಿದಂತೆ, <ph name="MACHINE_NAME_VARIABLE" /> ಅನ್ನು ಸಕ್ರಿಯ ಡೈರೆಕ್ಟರಿ ಮೆಷೀನ್ ಹೆಸರು ಅಥವಾ ಅದರ ಸಬ್ಸ್ಟ್ರಿಂಗ್ನಷ್ಟು ವಿಸ್ತರಿಸುವುದನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ಬೆಂಬಲಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಮೆಷೀನ್ ಹೆಸರು <ph name="MACHINE_NAME_EXAMPLE" /> ಆಗಿದ್ದರೆ, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ಅನ್ನು 6ನೇ ಸ್ಥಾನದ ನಂತರದಿಂದ ಪ್ರಾರಂಭವಾಗುವ 4 ಅಕ್ಷರಗಳಿಂದ ಬದಲಾಯಿಸಲಾಗುತ್ತದೆ, ಅಂದರೆ ಅದು <ph name="MACHINE_NAME_PART_EXAMPLE" />. ಸ್ಥಾನವು ಶೂನ್ಯದಿಂದ ಆರಂಭವಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. - </translation> <translation id="3072045631333522102">ಸ್ಕ್ರೀನ್ ಸೇವರ್ ಅನ್ನು ಸೈನ್-ಇನ್ ಪರದೆಯಲ್ಲಿ ಚಿಲ್ಲರೆ ಮೋಡ್ನಲ್ಲಿ ಬಳಸಲು</translation> <translation id="3072847235228302527">ಸಾಧನ-ಸ್ಥಳೀಯ ಖಾತೆಗಾಗಿ ಸೇವಾ ನಿಯಮಗಳನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="3077183141551274418">ಟ್ಯಾಬ್ ಜೀವನಚಕ್ರಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ</translation> @@ -1284,13 +1265,6 @@ ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಪ್ರಾರಂಭದಲ್ಲಿ ಪವರ್ ಪೀಕ್ ಶಿಫ್ಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> -<translation id="3388153794103186066">ಒದಗಿಸಲಾದ ಮಾರಾಟಗಾರರ ಮತ್ತು ಉತ್ಪನ್ನ ಐಡಿಗಳ ಮೂಲಕ USB ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಲು ಯಾವ ಸೈಟ್ಗಳಿಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅನುಮತಿ ನೀಡಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ urlಗಳ ಪಟ್ಟಿಯನ್ನು ಹೊಂದಿಸಲು ಇದು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಕಾರ್ಯನೀತಿಯು ಮಾನ್ಯವಾಗಿರಲು, ಪಟ್ಟಿಯಲ್ಲಿರುವ ಪ್ರತಿ ಐಟಂ ಸಾಧನಗಳು ಮತ್ತು urlಗಳು ಇವೆರಡನ್ನೂ ಒಳಗೊಂಡಿರಬೇಕು. ಸಾಧನಗಳಲ್ಲಿರುವ ಪ್ರತಿ ಐಟಂ ಮಾರಾಟಗಾರರ ಐಡಿ ಮತ್ತು ಉತ್ಪನ್ನ ಐಡಿಯ ಫೀಲ್ಡ್ ಅನ್ನು ಹೊಂದಿರಬಹುದು. ಹೊರಗುಳಿದ ಯಾವುದೇ ಐಡಿಯನ್ನು ಒಂದು ವಿನಾಯಿತಿ ಆಧಾರದ ಮೇಲೆ ವೈಲ್ಡ್ಕಾರ್ಡ್ ಎಂದು ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಆ ವಿನಾಯಿತಿಯೆಂದರೆ, ಮಾರಾಟದ ಐಡಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸದೆ ಉತ್ಪನ್ನ ಐಡಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಎಂಬುದಾಗಿದೆ. ಇಲ್ಲದಿದ್ದರೆ, ಕಾರ್ಯನೀತಿಯು ಮಾನ್ಯವಾಗಿರುವುದಿಲ್ಲ ಮತ್ತು ಅದನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ. - - ವಿನಂತಿಸುವ URL ಗೆ USB ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ನೀಡಲು, USB ಅನುಮತಿ ಮಾದರಿಯು ವಿನಂತಿಸುವ ಸೈಟ್ನ ("ವಿನಂತಿಸುವ URL") URL ಅನ್ನು ಮತ್ತು ಉನ್ನತ-ಮಟ್ಟದ ಫ್ರೇಮ್ ಸೈಟ್ನ ("ಎಂಬೆಡ್ ಮಾಡುವ URL") URL ಅನ್ನು ಬಳಸುತ್ತದೆ. ವಿನಂತಿಸುವ ಸೈಟ್ iframe ನಲ್ಲಿ ಲೋಡ್ ಆದಾಗ ವಿನಂತಿಸುವ URL ಎಂಬೆಡ್ ಮಾಡುವ URL ಗಿಂತ ವಿಭಿನ್ನವಾಗಿರಬಹುದು. ಆದ್ದರಿಂದ, ಅನುಕ್ರಮವಾಗಿ ವಿನಂತಿಸುವ ಮತ್ತು ಎಂಬೆಡ್ ಮಾಡುವ URL ಅನ್ನು ಸೂಚಿಸಲು ಅವುಗಳನ್ನು ಅಲ್ಪವಿರಾಮದಿಂದ ವಿಂಗಡಿಸಲಾದ ಎರಡು URL ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು "urlಗಳ" ಫೀಲ್ಡ್ ಒಳಗೊಂಡಿರಬಹುದು. ಕೇವಲ ಒಂದು URL ಅನ್ನು ಮಾತ್ರ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ್ದರೆ, ಎಂಬೆಡ್ ಮಾಡುವ ಸ್ಥಿತಿಯನ್ನು ಲೆಕ್ಕಿಸದೆ ವಿನಂತಿಸುವ ಸೈಟ್ನ URL ಈ URL ಜೊತೆಗೆ ಹೊಂದಾಣಿಕೆಯಾದಾಗ, ಅನುಗುಣವಾದ USB ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಲಾಗುತ್ತದೆ. "urlಗಳ"ಲ್ಲಿರುವ URLಗಳು ಮಾನ್ಯವಾದ URLಗಳಾಗಿರಬೇಕು, ಇಲ್ಲದಿದ್ದಲ್ಲಿ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ. - - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದ ಪಕ್ಷದಲ್ಲಿ, ಒಂದು ವೇಳೆ 'DefaultWebUsbGuardSetting' ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದ್ದರೆ ಎಲ್ಲಾ ಸೈಟ್ಗಳಿಗಾಗಿ ಸಮಗ್ರ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಇದರಿಂದ ಬಳಸಲಾಗುತ್ತದೆ, ಇಲ್ಲದಿದ್ದರೆ ಬಳಕೆದಾರರ ವೈಯಕ್ತಿಕ ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಬಳಸಲಾಗುತ್ತದೆ. - - ಈ ಕಾರ್ಯನೀತಿಯಲ್ಲಿನ URL ಪ್ಯಾಟರ್ನ್ಗಳು, WebUsbBlockedForUrls ಮೂಲಕ ಕಾನ್ಫಿಗರ್ ಮಾಡಿರುವವುಗಳೊಂದಿಗೆ ಸಂಘರ್ಷ ಹೊಂದಿರಬಾರದು. ಸಂಘರ್ಷ ಉಂಟಾದರೆ, ಈ ಕಾರ್ಯನೀತಿಯು WebUsbBlockedForUrls ಮತ್ತು WebUsbAskForUrls ಮೇಲೆ ಪ್ರಾಧಾನ್ಯತೆಯನ್ನು ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ.</translation> <translation id="3414260318408232239">ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಡಿಫಾಲ್ಟ್ ಕನಿಷ್ಠ ಆವೃತ್ತಿಯಾದ TLS 1.0 ಅನ್ನು <ph name="PRODUCT_NAME" /> ಬಳಸುತ್ತದೆ. ಇಲ್ಲದಿದ್ದರೆ, ಅದನ್ನು ಈ ಕೆಳಗಿನ ಮೌಲ್ಯಗಳಲ್ಲಿ ಯಾವುದಾದರೂ ಒಂದು ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಬಹುದು: "tls1", "tls1.1" ಅಥವಾ "tls1.2". ಇದನ್ನು ಹೊಂದಿಸಿದಾಗ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಆವೃತ್ತಿಗಿಂತ ಹಳೆಯದಾಗಿರುವ SSL/TLS ಆವೃತ್ತಿಗಳನ್ನು <ph name="PRODUCT_NAME" /> ಬಳಸುವುದಿಲ್ಲ. ಗುರುತಿಸಲಾಗದ ಮೌಲ್ಯವನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುವುದು.</translation> <translation id="34160070798637152">ಸಾಧನ-ವ್ಯಾಪಿ ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation> <translation id="3417418267404583991">ಈ ನೀತಿಯನ್ನು 'ನಿಜ' ಎಂದು ಹೋಲಿಸಿದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, <ph name="PRODUCT_OS_NAME" /> ಅತಿಥಿ ಲಾಗಿನ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಅತಿಥಿ ಲಾಗಿನ್ಗಳು ಅಜ್ಞಾತನಾಮಕ ಬಳಕೆದಾರ ಸೆಶನ್ಗಳಾಗಿವೆ ಹಾಗೂ ಪಾಸ್ವರ್ಡ್ನ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ. ಈ ನೀತಿಯನ್ನು 'ತಪ್ಪು' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಅತಿಥಿ ಸೆಶನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲು <ph name="PRODUCT_OS_NAME" /> ಅನುಮತಿಸುವುದಿಲ್ಲ.</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 457b2de7..fe865d6 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1207,25 +1207,6 @@ 이 정책이 false로 설정된 경우 WPAD 최적화가 사용 중지되어 <ph name="PRODUCT_NAME" />이(가) DNS 기반 WPAD 서버를 더 오래 기다리게 됩니다. 이 정책이 설정되지 않았거나 사용 설정된 경우 WPAD 최적화가 사용 설정됩니다. 이 정책 설정 여부 및 방법과 관계없이 WPAD 최적화 설정은 사용자에 의해 변경될 수 없습니다.</translation> -<translation id="3071839057966069710">프린터 목록을 설정합니다. - - 이 정책을 사용하면 관리자가 사용자에게 프린터 설정을 제공할 수 - 있습니다. - - <ph name="PRINTER_DISPLAY_NAME" /> 및 <ph name="PRINTER_DESCRIPTION" />은(는) 손쉽게 프린터를 선택하도록 맞춤설정할 수 있는 자유 형식 문자열입니다. <ph name="PRINTER_MANUFACTURER" /> 및 <ph name="PRINTER_MODEL" />은(는) 최종 사용자가 손쉽게 프린터를 식별하도록 제공되며 프린터의 제조업체 및 모델을 나타냅니다. <ph name="PRINTER_URI" />은(는) <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> 등의 클라이언트 컴퓨터에서 연결할 수 있는 주소여야 합니다. <ph name="PRINTER_UUID" />은(는) 선택사항입니다. 제공되는 경우 <ph name="ZEROCONF_DISCOVERY" /> 프린터의 중복을 삭제하는 데 사용됩니다. - - <ph name="PRINTER_EFFECTIVE_MODEL" />은(는) <ph name="PRODUCT_NAME" /> 지원 프린터를 나타내는 문자열 중 하나와 일치해야 합니다. 이 문자열은 프린터에 맞는 PPD를 식별하고 설치하는 데 사용됩니다. https://support.google.com/chrome?p=noncloudprint에서 자세한 내용을 확인하세요. - - <ph name="PRINTER_AUTOCONF" />은(는) 프린터 설치 시 IPP Everywhere의 사용 여부를 나타내는 부울 플래그입니다. 이 플래그는 <ph name="PRODUCT_OS_NAME" /> 버전 76 이상에서 지원됩니다. - - <ph name="PRINTER_EFFECTIVE_MODEL" />이(가) 프린터 이름을 포함하거나 <ph name="PRINTER_AUTOCONF" />이(가) True로 설정되어야 합니다. 이 두 가지 속성이 모두 포함되거나 속성이 없는 프린터는 무시됩니다. - - 프린터 설정은 프린터 최초 사용 시 완료됩니다. 프린터가 사용될 때까지 PPD는 다운로드되지 않습니다. 이후 자주 사용되는 PPD가 캐시됩니다. - - 이 정책은 사용자가 개별 기기에서 프린터를 설정할 수 있는지 여부에는 영향을 미치지 않습니다. 이 정책은 개별 사용자의 프린터 설정을 보완하기 위한 것입니다. - - Active Directory 관리 대상 기기에서는 이 정책을 통해 <ph name="MACHINE_NAME_VARIABLE" />을(를) Active Directory 컴퓨터 이름 또는 관련 하위 문자열로 확장할 수 있습니다. 예를 들어, 컴퓨터 이름이 <ph name="MACHINE_NAME_EXAMPLE" />(이)라면 <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />이(가) 6번째 위치 이후에 시작되는 4자로 대체되어 <ph name="MACHINE_NAME_PART_EXAMPLE" />이(가) 됩니다. 이 위치는 0을 기준으로 합니다. - </translation> <translation id="3072045631333522102">판매 모드의 로그인 화면에서 사용되는 화면 보호기</translation> <translation id="3072847235228302527">기기 로컬 계정에 대한 서비스 약관 설정</translation> <translation id="3077183141551274418">탭 수명 주기 사용 또는 사용 중지</translation> @@ -1365,13 +1346,6 @@ 이 정책을 설정하면 사용자가 이를 변경하거나 덮어쓸 수 없습니다. 정책이 설정되지 않은 경우 전력 피크 시프트는 처음부터 사용 중지되며 사용자가 활성화할 수 없습니다.</translation> -<translation id="3388153794103186066">URL 목록을 설정하여 주어진 공급업체 및 제품 ID로 USB 기기에 액세스할 권한을 자동으로 부여할 사이트를 지정할 수 있습니다. 이 정책이 유효하려면 목록에 있는 모든 항목에 기기 및 URL이 포함되어 있어야 합니다. 기기에 있는 모든 항목에는 공급업체 ID 및 제품 ID 입력란이 포함될 수 있습니다. 생략된 모든 ID는 공급업체 ID가 지정되지 않으면 제품 ID도 지정될 수 없다는 하나의 예외 사항이 있는 와일드 카드로 취급됩니다. 그렇지 않은 경우 정책은 유효하지 않게 되며 무시됩니다. - - USB 권한 모델은 요청하는 사이트의 URL('요청 URL')과 최상위 프레임 사이트의 URL('삽입 URL')을 사용하여 요청 URL에 USB 기기 액세스 권한을 부여합니다. 요청하는 사이트가 iframe에서 로드되는 경우 요청 URL과 삽입 URL이 다를 수 있습니다. 따라서 'URL' 입력란에는 요청 URL과 삽입 URL을 구분하여 지정할 수 있도록 쉼표로 구분되는 두 개의 URL 문자열이 포함될 수 있습니다. URL이 하나만 지정된 경우 삽입 상태와 관계없이 요청하는 사이트의 URL이 이 URL과 일치하면 관련 USB 기기에 액세스할 권한이 부여됩니다. 'URL' 입력란의 URL은 유효한 URL이어야 하며, 그렇지 않으면 정책이 무시됩니다. - - 이 정책을 설정하지 않으면 'DefaultWebUsbGuardSetting' 정책(설정된 경우) 또는 사용자 개인 설정의 전체 기본값이 모든 사이트에서 사용됩니다. - - 이 정책의 URL 패턴은 WebUsbBlockedForUrls를 통해 구성된 패턴과 충돌해서는 안 됩니다. 충돌이 발생한 경우 이 정책이 WebUsbBlockedForUrls 및 WebUsbAskForUrls에 우선합니다.</translation> <translation id="3414260318408232239">이 정책을 설정하지 않으면 <ph name="PRODUCT_NAME" />에서 기본 최소 버전인 TLS 1.0이 사용됩니다. 정책을 설정하는 경우 'tls1', 'tls1.1', 'tls1.2' 중 하나로 설정할 수 있으며, 버전을 설정하면 <ph name="PRODUCT_NAME" />에서 지정된 버전보다 낮은 SSL/TLS 버전은 사용되지 않습니다. 인식할 수 없는 값은 무시됩니다.</translation>
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index d13361ef..5367ef9 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -1206,25 +1206,6 @@ Nustačius šią politiką į „false“, WPAD optimizavimas išjungiamas, todėl „<ph name="PRODUCT_NAME" />“ reikia ilgiau laukti DNS pagrindu veikiančių WPAD serverių. Jei politika nenustatoma arba įgalinama, WPAD optimizavimas įgalinamas. Neatsižvelgiant į tai, ar ši politika nustatyta ir kaip ji nustatyta, WPAD optimizavimo nustatymo negali keisti naudotojai.</translation> -<translation id="3071839057966069710">Konfigūruojamas spausdintuvų sąrašas. - - Taikant šią politiką leidžiama administratoriams teikti spausdintuvo konfigūracijas - naudotojams. - - „<ph name="PRINTER_DISPLAY_NAME" />“ ir „<ph name="PRINTER_DESCRIPTION" />“ yra laisvos formos eilutės, kurias galima tinkinti, kad būtų lengviau pasirinkti spausdintuvą. „<ph name="PRINTER_MANUFACTURER" />“ ir „<ph name="PRINTER_MODEL" />“ naudojamos siekiant palengvinti spausdintuvo identifikavimą galutiniams naudotojams. Jos nurodo spausdintuvo gamintoją ir modelį. „<ph name="PRINTER_URI" />“ turėtų būti adresas, kurį galima pasiekti iš kliento kompiuterio, įskaitant „<ph name="URI_SCHEME" />“, „<ph name="URI_PORT" />“ ir „<ph name="URI_QUEUE" />“. „<ph name="PRINTER_UUID" />“ yra pasirenkama Jei nurodyta, ji naudojama siekiant panaikinti pasikartojančius „<ph name="ZEROCONF_DISCOVERY" />“ spausdintuvus. - - „<ph name="PRINTER_EFFECTIVE_MODEL" />“ turi atitikti vieną iš eilučių, nurodančių „<ph name="PRODUCT_NAME" />“ palaikomą spausdintuvą. Eilutė bus naudojama siekiant identifikuoti ir įdiegti tinkamą spausdintuvo PPD. Daugiau informacijos galima rasti adresu https://support.google.com/chrome?p=noncloudprint. - - „<ph name="PRINTER_AUTOCONF" />“ yra loginė žyma, nurodanti, ar nustatant spausdintuvą turi būti naudojama „IPP Everywhere“. Ši žyma palaikoma 76 ar naujesnės versijos „<ph name="PRODUCT_OS_NAME" />“. - - „<ph name="PRINTER_EFFECTIVE_MODEL" />“ turi būti spausdintuvo pavadinimas arba „<ph name="PRINTER_AUTOCONF" />“ turi būti nustatyta kaip „Tiesa“. Spausdintuvų su abiem savybėmis arba visai be jų bus nepaisoma. - - Spausdintuvo sąranka užbaigiama pirmą kartą panaudojus spausdintuvą. PPD neatsisiunčiami, kol spausdintuvas nenaudojamas. Paskui dažnai naudojami PPD saugomi talpykloje. - - Ši politika neturi įtakos tam, ar naudotojai gali konfigūruoti spausdintuvus atskiruose įrenginiuose. Ji skirta papildyti atskirų naudotojų spausdintuvų konfigūraciją. - - Jei naudojami „Active Directory“ tvarkomi įrenginiai, ši politika palaiko „Active Directory“ įrenginio pavadinimo „<ph name="MACHINE_NAME_VARIABLE" />“ arba jo poeilučio plėtinį. Pavyzdžiui, jei įrenginio pavadinimas yra „<ph name="MACHINE_NAME_EXAMPLE" />“, tada „<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />“ turėtų būti pakeistas 4 simboliais nuo 6-osios pozicijos, pvz., „<ph name="MACHINE_NAME_PART_EXAMPLE" />“. Atminkite, kad pozicija nustatoma nuo nulio. - </translation> <translation id="3072045631333522102">Naudotina prisijungimo ekrano užsklanda dirbant mažmeninės prekybos režimu</translation> <translation id="3072847235228302527">Nustatyti vietinės įrenginio paskyros paslaugų teikimo sąlygas</translation> <translation id="3077183141551274418">Įgalinama arba išjungiama skirtukų naudojimo trukmė</translation> @@ -1364,13 +1345,6 @@ Jums nustačius šią politiką naudotojai negalės jos pakeisti ar nepaisyti. Jei ši politika nenustatyta, šaltinio pakeitimas suvartojant daugiausiai energijos iš karto yra išjungtas ir naudotojas jo įjungti negali.</translation> -<translation id="3388153794103186066">Galima nustatyti URL sąrašą, kuriame nurodoma, kurioms svetainėms automatiškai suteikiamas leidimas pasiekti USB įrenginį su duotais paslaugos teikėjo ir produkto ID. Kad politika galiotų, kiekviename sąraše esančiame elemente turi būti įrenginių ir URL. Kiekvienas įrenginiuose esantis elementas gali turėti paslaugos teikėjo ID ir produkto ID lauką. Kiekvienas nenurodytas ID laikomas pakaitos simboliu su viena išimtimi – produkto ID negali būti nurodytas, jei nenurodytas paslaugos teikėjo ID. Priešingu atveju politika negalios ir jos bus nepaisoma. - - Siekiant suteikti užklausą pateikusiam URL leidimą pasiekti USB įrenginį, USB leidimo modeliui naudojamas užklausą pateikusios svetainės URL („užklausą pateikęs URL“) ir aukščiausiojo lygio „iframe“ svetainės URL („įterptasis URL“). Užklausą pateikęs URL gali skirtis nuo įterptojo URL, kai užklausa įkeliama „iframe“. Todėl URL lauke gali būti iki dviejų URL eilučių, atskirtų kableliu, taip atskirai nurodant užklausą pateikusį ir įterptąjį URL. Jei nurodomas tik vienas URL, prieiga prie atitinkamų USB įrenginių suteikiama, kai užklausą pateikusios svetainės URL atitinka šį URL, nepaisant įterpimo būsenos. URL atitinkamame lauke turi būti tinkami, kitu atveju politikos bus nepaisoma. - - Jei ši politika palikta nenustatyta, visose svetainėse bus naudojama bendroji numatytoji vertė iš politikos „DefaultWebUsbGuardSetting“ (jei nustatyta) arba pagal naudotojo asmeninę konfigūraciją. - - URL šablonai šioje politikoje negali neatitikti tų, kurie sukonfigūruoti pagal „WebUsbBlockedForUrls“. Jei yra neatitikimų, šiai politikai bus teikiama pirmenybė prieš „WebUsbBlockedForUrls“ ir „WebUsbAskForUrls“.</translation> <translation id="3414260318408232239">Jei ši politika nesukonfigūruota, „<ph name="PRODUCT_NAME" />“ naudos numatytosios minimalios 1.0 versijos TLS. Kitaip gali būti nustatyta viena iš šių verčių: „tls1“, „tls1.1“ arba „tls1.2“. Nustačius šią politiką „<ph name="PRODUCT_NAME" />“ nenaudos senesnės nei nurodytos versijos SSL / TLS. Neatpažįstamos vertės bus nepaisoma.</translation>
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index ec59c61c..cd28408 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -1197,25 +1197,6 @@ Ja šai politikai ir iestatīta vērtība Nepatiesa, WPAD optimizācija ir atspējota, tādējādi pārlūkā <ph name="PRODUCT_NAME" /> tiek ilgāk gaidīts uz DNS WPAD serveriem. Ja politika nav iestatīta vai ir iespējota, WPAD optimizācija ir iespējota. Neatkarīgi no tā, vai šī politika ir iespējota un kā tā ir iespējota, lietotāji nevar mainīt WPAD optimizācijas iestatījumu.</translation> -<translation id="3071839057966069710">Konfigurē printeru sarakstu. - - Izmantojot šo politiku, administratori var nodrošināt printeru konfigurāciju - lietotājiem. - - Parametri <ph name="PRINTER_DISPLAY_NAME" /> un <ph name="PRINTER_DESCRIPTION" /> ir brīva formāta virknes, ko var pielāgot ērtai printera atlasei. Parametri <ph name="PRINTER_MANUFACTURER" /> un <ph name="PRINTER_MODEL" /> ļauj galalietotājiem identificēt printeri. Tie apzīmē printera ražotāju un modeli. Parametram <ph name="PRINTER_URI" /> ir jābūt adresei, ko var sasniegt no klienta datora, tostarp <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> un <ph name="URI_QUEUE" />. Parametrs <ph name="PRINTER_UUID" /> nav norāda obligāti. Ja tas ir norādīts, tas tiek izmantots, lai novērstu <ph name="ZEROCONF_DISCOVERY" /> printeru dublēšanu. - - Parametram <ph name="PRINTER_EFFECTIVE_MODEL" /> ir jāatbilst vienai no virknēm, kas apzīmē pārlūkā <ph name="PRODUCT_NAME" /> atbalstītu printeri. Šī virkne tiks izmantota, lai identificētu un instalētu printerim atbilstošo PPD failu. Plašāku informāciju skatiet vietnē https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> ir Būla karogs, kas norāda, vai printera iestatīšanai visur ir jāizmanto IPP. Šis karogs tiek atbalstīts pārlūka <ph name="PRODUCT_OS_NAME" /> versijā 76 un jaunākās. - - Parametram <ph name="PRINTER_EFFECTIVE_MODEL" /> ir jāietver printera nosaukums, vai parametram <ph name="PRINTER_AUTOCONF" /> ir jābūt iestatītam uz “true”. Printeri ar abiem parametriem vai bez tiem tiks ignorēti. - - Printera iestatīšana tiek pabeigta, kad printeris tiek izmantots pirmo reizi. PPD faili netiek lejupielādēti, kamēr printeris netiek izmantots. Pēc tam bieži izmantotie PPD faili tiek saglabāti kešatmiņā. - - Šī politika neietekmē to, vai lietotāji var konfigurēt printerus atsevišķās ierīcēs. Tās mērķis ir papildināt printeru konfigurāciju, ko veic individuāli lietotāji. - - Ierīcēs, kas tiek pārvaldītas pakalpojumā Active Directory, šī politika atbalsta Active Directory ierīces nosaukuma vai tās apakšvirknes iekļaušanu ierīces <ph name="MACHINE_NAME_VARIABLE" /> nosaukumā. Piemēram, ja ierīces nosaukums ir <ph name="MACHINE_NAME_EXAMPLE" />, vērtība <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> pēc sestās pozīcijas tiktu aizstāta ar četrām rakstzīmēm: <ph name="MACHINE_NAME_PART_EXAMPLE" />. Ņemiet vērā, ka pozīciju numurēšana sākas ar nulli. - </translation> <translation id="3072045631333522102">Ekrānsaudzētājs, kas jāizmanto mazumtirdzniecības režīma pieteikšanās ekrānā</translation> <translation id="3072847235228302527">Ierīces lokālā konta pakalpojumu sniegšanas noteikumu iestatīšana</translation> <translation id="3077183141551274418">Ciļņu dzīves ciklu iespējošana vai atspējošana</translation> @@ -1354,13 +1335,6 @@ Ja iestatīsiet šo politiku, lietotāji nevarēs to mainīt un ignorēt. Ja šī politika nav iestatīta, enerģijas maksimuma pārslēgšana tiks atspējota jau sākotnēji un lietotāji to nevarēs iestatīt.</translation> -<translation id="3388153794103186066">Ļauj jums iestatīt to vietrāžu URL sarakstu, kas norāda, kurām vietnēm tiks automātiski piešķirta atļauja piekļūt USB ierīcei, izmantojot norādīto pakalpojumu sniedzēja un produkta ID. Lai politika būtu derīga, katrā saraksta vienumā jānorāda gan ierīces, gan vietrāži URL. Katrs vienums ierīcēs var ietvert pakalpojumus sniedzēja ID un produkta ID lauku. Katrs izlaistais ID tiek uzskatīts par aizstājējzīmi, izņemot vienu gadījumu — produkta ID nevar norādīt, ja nav norādīts arī pakalpojumu sniedzēja ID. Pretējā gadījumā politika nebūs derīga un tiks ignorēta. - - USB atļauju modelis izmanto pieprasošās vietnes URL (“pieprasošais URL”) un augstākā līmeņa ietvara vietnes URL (“iegultais URL”), lai piešķirtu piekļuvi pieprasošajam URL piekļūt USB ierīcei. Pieprasošais URL var atšķirties no iegultā URL, kad pieprasošā vietne tiek ielādēta ietvarā iframe. Tāpēc laukā “urls” nedrīkst ietvert vairāk par divām URL virknēm, kas atdalītas ar komatu un norāda attiecīgi pieprasošo un iegulto URL. Ja ir norādīts tikai viens URL, piekļuve atbilstošajām USB ierīcēm tiks piešķirta, kad pieprasošās vietnes URL atbildīs šim URL neatkarīgi no iegulšanas statusa. Laukā “urls” ievadītajiem vietrāžiem URL ir jābūt derīgiem vietrāžiem URL, pretējā gadījumā politika tiks ignorēta. - - Ja politika netiks iestatīta, visām vietnēm tiks izmantota globālā noklusējuma vērtība no politikas “DefaultWebUsbGuardSetting” (ja tā ir iestatīta); pretējā gadījumā tiks izmantota lietotāja personīgā konfigurācija. - - Šajā politikā norādītie URL modeļi nedrīkst būt pretrunā ar modeļiem, kas konfigurēti politikā “WebUsbBlockedForUrls”. Ja rodas pretrunas, šai politikai ir lielāka prioritāte nekā politikām “WebUsbBlockedForUrls” un “WebUsbAskForUrls”.</translation> <translation id="3414260318408232239">Ja šī politika nav konfigurēta, pārlūkā <ph name="PRODUCT_NAME" /> tiek izmantota noklusējuma minimālā versija TLS 1.0. Pretējā gadījumā var būt iestatīta kāda no šīm vērtībām: “tls1”, “tls1.1” vai “tls1.2”. Ja politikai ir iestatīta vērtība, pārlūkā <ph name="PRODUCT_NAME" /> netiek izmantotas standarta SSL/TLS versijas, kas vecākas par norādīto versiju. Neatpazītas versijas tiek ignorētas.</translation>
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index 0f5c3c24..62894b8a 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -1173,24 +1173,6 @@ ഈ നയം തെറ്റ് എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, DNS അധിഷ്ഠിത WPAD സെർവറുകൾക്കായി <ph name="PRODUCT_NAME" /> എന്നതിന് കൂടുതൽ നേരം കാത്തിരിക്കുന്ന രീതിയിൽ WPAD ഒപ്റ്റിമൈസേഷൻ പ്രവർത്തനരഹിതമാക്കുന്നു. നയം സജ്ജമാക്കുന്നില്ലെങ്കിലോ പ്രവർത്തനക്ഷമമാക്കിയെങ്കിലോ, WPAD ഒപ്റ്റിമൈസേഷൻ പ്രവർത്തനക്ഷമമാക്കുന്നു. ഈ നയം സജ്ജമാക്കിയിട്ടുണ്ടോ അല്ലെങ്കിൽ എങ്ങനെ സജ്ജമാക്കി എന്നീ കാര്യങ്ങൾ ആശ്രയിക്കാതെ, ഉപയോക്താക്കൾക്ക് WPAD ഒപ്റ്റിമൈസേഷൻ ക്രമീകരണം മാറ്റാനാകില്ല.</translation> -<translation id="3071839057966069710">പ്രിൻ്ററുകളുടെ ലിസ്റ്റ് കോൺഫിഗർ ചെയ്യുന്നു. - - ഈ നയം, അഡ്മിൻമാരെ അവരുടെ ഉപയോക്താക്കൾക്ക് പ്രിന്റർ കോൺഫിഗറേഷനുകൾ നൽകാൻ അനുവദിക്കുന്നു. - - <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> എന്നിവ ഫ്രീ-ഫോം സ്ട്രിംഗുകളാണ്, പ്രിന്റർ തിരഞ്ഞെടുക്കൽ എളുപ്പത്തിലാക്കാൻ അവയെ ഇഷ്ടാനുസൃതമാക്കാവുന്നതാണ്. അന്തിമ ഉപയോക്താക്കൾക്ക് എളുപ്പത്തിൽ പ്രിന്റർ തിരിച്ചറിയാൻ<ph name="PRINTER_MANUFACTURER" />,<ph name="PRINTER_MODEL" /> എന്നിവ സഹായിക്കുന്നു. പ്രിൻ്ററിൻ്റെ നിർമ്മാതാവിനേയും മോഡലിനെയുമാണ് അവ പ്രതിനിധീകരിക്കുന്നത്. <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> എന്നിവ ഉൾപ്പെടെ ഒരു ക്ലയൻ്റിൻ്റെ കമ്പ്യൂട്ടറിൽ നിന്ന് എത്തിച്ചേരാനാകുന്ന വിലാസം ആയിരിക്കണം <ph name="PRINTER_URI" />. <ph name="PRINTER_UUID" /> ഓപ്ഷണൽ ആണ്. നൽകിയിട്ടുണ്ടെങ്കിൽ, ഇത് <ph name="ZEROCONF_DISCOVERY" /> പ്രിൻ്ററുകളുടെ ഡ്യൂപ്ലിക്കേറ്റുകൾ ഇല്ലാതാക്കാൻ സഹായിക്കുന്നു. - - <ph name="PRODUCT_NAME" /> പിന്തുണയുള്ള പ്രിൻ്ററിനെ പ്രതിനിധാനം ചെയ്യുന്ന സ്ട്രിംഗുകളിൽ ഒന്ന് <ph name="PRINTER_EFFECTIVE_MODEL" /> എന്നതുമായി പൊരുത്തപ്പെടേണ്ടതുണ്ട്. പ്രിൻ്ററിന് അനുയോജ്യമായ PPD തിരിച്ചറിഞ്ഞ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിന് സ്ട്രിംഗ് ഉപയോഗിക്കപ്പെടും. കൂടുതൽ വിവരങ്ങൾക്കായി https://support.google.com/chrome?p=noncloudprint സന്ദർശിക്കുക. - - പ്രിൻ്റർ സജ്ജീകരിക്കാൻ എല്ലായിടത്തും IPP ഉപയോഗിക്കണോ എന്ന് സൂചിപ്പിക്കുന്ന ഒരു ബുലിയൻ ഫ്ലാഗ് ആണ്<ph name="PRINTER_AUTOCONF" />. ഈ ഫ്ലാഗ് <ph name="PRODUCT_OS_NAME" /> 76 പതിപ്പിലും അതിന് ശേഷമുള്ളവയിലും പിന്തുണയ്ക്കുന്നു. - - ഒന്നുകിൽ <ph name="PRINTER_EFFECTIVE_MODEL" /> എന്നതിൽ പ്രിൻ്ററിൻ്റെ പേര് ഉണ്ടായിരിക്കണം അല്ലെങ്കിൽ <ph name="PRINTER_AUTOCONF" /> ശരി എന്ന് സജ്ജീകരിച്ചിരിക്കണം. രണ്ട് പ്രോപ്പർട്ടികളും ഉള്ളതോ ഒന്നും ഇല്ലാത്തതോ ആയ പ്രിൻ്ററുകൾ അവഗണിക്കപ്പെടും. - - ഒരു പ്രിൻ്റർ ആദ്യമായി ഉപയോഗിക്കുമ്പോൾ അതിൻ്റെ സജ്ജീകരണം പൂർത്തിയാകും. പ്രിൻ്റർ ഉപയോഗിക്കുന്നത് വരെ PPD-കൾ ഡൗൺലോഡ് ചെയ്യില്ല. അതിന് ശേഷം പതിവായി ഉപയോഗിക്കുന്ന PPD-കൾ കാഷെ ചെയ്യപ്പെടും. - - വ്യക്തിഗത ഉപകരണങ്ങളിൽ ഉപയോക്താക്കൾക്ക് പ്രിന്ററുകൾ കോൺഫിഗർ ചെയ്യാൻ കഴിയുമോ ഇല്ലയോ എന്നതിനെ ഈ നയം ബാധിക്കുന്നില്ല. വ്യക്തിഗത ഉപയോക്താക്കൾ മുഖേനയുള്ള പ്രിന്ററുകളുടെ കോൺഫിഗറേഷന് അനുബന്ധമാകുന്നതിന് ഉദ്ദേശിക്കപ്പെട്ടിട്ടുള്ളതാണ് ഈ നയം. - - ആക്റ്റീവ് ഡയറക്റ്ററി മാനേജ് ചെയ്യപ്പെടുന്ന ഉപകരണങ്ങളുടെ കാര്യത്തിൽ, ആക്റ്റീവ് ഡയറക്റ്ററി മെഷീനിന്റെ പേരിലേക്കോ അതിന്റെ ഉപസ്ട്രിംഗിലേക്കോ <ph name="MACHINE_NAME_VARIABLE" /> എന്നതിന്റെ വിപുലീകരണത്തെ ഈ നയം പിന്തുണയ്ക്കുന്നു. ഉദാഹരണത്തിന്, മെഷീനിൻ്റെ പേര് <ph name="MACHINE_NAME_EXAMPLE" /> എന്നാണെങ്കിൽ, 6-ാമത്തെ സ്ഥാനത്തിന് ശേഷം, അതായത് <ph name="MACHINE_NAME_PART_EXAMPLE" /> എന്നതിന് ശേഷം 4 പ്രതീകങ്ങൾ ഉപയോഗിച്ച് <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />.പ്രതിസ്ഥാപിക്കപ്പെടും. പൂജ്യം അടിസ്ഥാനമാക്കിയതാണ് സ്ഥാനമെന്ന് ശ്രദ്ധിക്കുക. - </translation> <translation id="3072045631333522102">സ്ക്രീൻ സേവർ റീട്ടെയ്ൽ മോഡിലെ സൈൻ-ഇൻ സ്ക്രീനിൽ ഉപയോഗിക്കും</translation> <translation id="3072847235228302527">ഉപകരണ-പ്രാദേശിക അക്കൗണ്ടിനായി സേവന നിബന്ധനകൾ സജ്ജമാക്കുക</translation> <translation id="3077183141551274418">ടാബ് ലൈഫ്സൈക്കിളുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു അല്ലെങ്കിൽ പ്രവർത്തനരഹിതമാക്കുന്നു</translation> @@ -1330,13 +1312,6 @@ നിങ്ങൾ ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല. ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, പവർ പീക്ക് ഷിഫ്റ്റ് ആദ്യം പ്രവർത്തനരഹിതമാകും ഉപയോക്താക്കൾക്ക് അത് പ്രവർത്തനക്ഷമമാക്കാൻ കഴിയുകയുമില്ല.</translation> -<translation id="3388153794103186066">നൽകിയിരിക്കുന്ന വെണ്ടർ, ഉൽപ്പന്ന ഐഡികൾ ഉപയോഗിച്ച് USB ഉപകരണം ആക്സസ് ചെയ്യാൻ ഏതെല്ലാം സൈറ്റുകൾക്ക് സ്വമേധയാ അനുമതി നൽകണമെന്ന് വ്യക്തമാക്കുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. നയം സാധുവാകാൻ, ലിസ്റ്റിലെ ഓരോ ഇനത്തിലും ഉപകരണങ്ങളും URLകളും അടങ്ങിയിരിക്കണം. ഉപകരണങ്ങളിലെ ഓരോ ഇനത്തിലും ഒരു വെണ്ടർ ഐഡി ഫീൽഡും ഉൽപ്പന്ന ഐഡി ഫീൽഡും അടങ്ങിയിരിക്കാം. ഒഴിവാക്കപ്പെട്ട ഏതൊരു ഐഡിയും, വെണ്ടർ ഐഡി കൂടി വ്യക്തമാക്കാതെ ഉൽപ്പന്ന ഐഡി വ്യക്തമാക്കാനാവില്ല എന്ന വ്യവസ്ഥയോടെ, വൈൽഡ്കാർഡ് ആയി പരിഗണിക്കപ്പെടും. അല്ലെങ്കിൽ, നയം സാധുവായിരിക്കില്ല, ഇത് അവഗണിക്കപ്പെടുന്നു. - - അഭ്യർത്ഥിക്കുന്ന URL-ന് USB ഉപകരണം ആക്സസ് ചെയ്യാനുള്ള അനുമതി നൽകാനായി, USB അനുമതി മാതൃക, അഭ്യർത്ഥിക്കുന്ന സൈറ്റിന്റെയും ("അഭ്യർത്ഥിക്കുന്ന URL") ഉന്നത ലെവലിൽ ഫ്രെയിം ചെയ്ത സൈറ്റിന്റെയും ("ഉൾച്ചേർക്കുന്ന URL") URL ഉപയോഗിക്കുന്നു. അഭ്യർത്ഥിക്കുന്ന സൈറ്റ് ഒരു iframe-ൽ ലോഡ് ചെയ്തിരിക്കുമ്പോൾ, അഭ്യർത്ഥിക്കുന്ന URL ഉൾച്ചേർക്കുന്ന URL-ൽ നിന്ന് വ്യത്യസ്തമായേക്കാം. അതിനാൽ, "URL-കൾ" ഫീൽഡിൽ, അഭ്യർത്ഥിക്കുന്ന URL-ഉം ഉൾച്ചേർക്കുന്ന URL-ഉം വ്യക്തമാക്കുന്നതിനായി കോമയാൽ വേർതിരിച്ച രണ്ട് URL സ്ട്രിംഗുകൾ വരെ അടങ്ങിയിരിക്കാം. ഒരു URL മാത്രമാണ് വ്യക്തമാക്കിയിട്ടുള്ളതെങ്കിൽ, ഉൾച്ചേർക്കുന്ന നില പരിഗണിക്കാതെ തന്നെ അഭ്യർത്ഥിക്കുന്ന സൈറ്റിന്റെ URL ഈ URL-മായി പൊരുത്തപ്പെടുമ്പോൾ അനുയോജ്യമായ USB ഉപകരണങ്ങളിലേക്ക് ആക്സസ് അനുവദിക്കപ്പെടും. "URL-കൾ" എന്നതിലെ URL-കൾ സാധുതയുള്ളവയായിരിക്കണം, അല്ലെങ്കിൽ നയം അവഗണിക്കപ്പെടും. - - ഈ നയം സജ്ജീകരിക്കാതെ നിലയിലാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള സ്ഥിര മൂല്യം ഉപയോഗിക്കപ്പെടും; 'DefaultWebUsbGuardSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക. - - ഈ നയത്തിലെ URL പാറ്റേണുകളും WebUsbBlockedForUrls വഴി കോൺഫിഗർ ചെയ്യപ്പെട്ടിട്ടുള്ളവയും തമ്മിൽ പൊരുത്തക്കേട് ഉണ്ടാകരുത്. വൈരുദ്ധ്യമുണ്ടെങ്കിൽ, ഈ നയം WebUsbBlockedForUrls, WebUsbAskForUrls എന്നിവയ്ക്ക്മേൽ പ്രാധാന്യം നേടും.</translation> <translation id="3414260318408232239">ഈ നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ <ph name="PRODUCT_NAME" /> ഏറ്റവും പഴയ ഡിഫോൾട്ട് പതിപ്പായ TLS 1.0. ഉപയോഗിക്കുന്നു. അല്ലെങ്കിൽ ഇത് ഇനിപ്പറയുന്ന മൂല്യങ്ങളിൽ ഒന്നിലേക്ക് സജ്ജീകരിക്കപ്പെട്ടേക്കാം: "tls1", "tls1.1" അല്ലെങ്കിൽ "tls1.2". സജ്ജീകരിച്ച ശേഷം, <ph name="PRODUCT_NAME" /> നിർദ്ദിഷ്ട പതിപ്പിന് മുമ്പുള്ള SSL/TLS പതിപ്പുകൾ ഉപയോഗിക്കില്ല. തിരിച്ചറിയാനാവാത്ത മൂല്യം അവഗണിക്കപ്പെടും.</translation>
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index fe7c960..cae1ed5 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -1169,25 +1169,6 @@ हे धोरण असत्यवर सेट केल्यास, WPAD ऑप्टिमायझेशन अक्षम केले जाते त्यामुळे <ph name="PRODUCT_NAME" /> ला DNS-आधारित WPAD सर्व्हरसाठी दीर्घकाळ प्रतीक्षा करावी लागते. धोरण सेट न केल्यास किंवा सक्षम केल्यास, WPAD ऑप्टिमायझेशन सक्षम केले जाते. हे धोरण कसे सेट केले जाते किंवा नाही त्यावर अवलंबून न राहता, वापरकर्त्यांद्वारे WPAD ऑप्टिमायझेशन सेटिंग बदलले जाऊ शकत नाही.</translation> -<translation id="3071839057966069710">प्रिंटरची सूची कॉन्फिगर करते. - - हे धोरण अॅडमिनिस्ट्रेटरना त्यांच्या वापरकर्त्यांसाठी - प्रिंटर कॉन्फिगरेशन पुरवण्याची अनुमती देते. - - <ph name="PRINTER_DISPLAY_NAME" /> आणि <ph name="PRINTER_DESCRIPTION" /> या फ्री-फॉर्म स्ट्रिंग आहेत ज्या प्रिंटर सुलभपणे निवडण्यासाठी कस्टमाइझ केल्या जाऊ शकतात. <ph name="PRINTER_MANUFACTURER" />आणि <ph name="PRINTER_MODEL" /> अंतिम वापरकर्त्याद्वारे प्रिंटरची सहजतेने ओळख पटवण्यासाठी उपयुक्त आहेत. ते प्रिंटरचे उत्पादक आणि मॉडेल दर्शवतात. <ph name="PRINTER_URI" /> हा क्लायंट काँप्युटरकडून <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> आणि <ph name="URI_QUEUE" /> यांच्या समावेशासह एक पोहोचण्यायोग्य अॅड्रेस असावा. <ph name="PRINTER_UUID" /> पर्यायी आहे. हे पुरवल्यास, याचा वापर डुप्लिकेट <ph name="ZEROCONF_DISCOVERY" /> प्रिंटर काढून टाकण्यात मदतीसाठी केला जातो. - - <ph name="PRODUCT_NAME" /> ला सपोर्ट असलेला प्रिंटर दर्शवणाऱ्या एका <ph name="PRINTER_EFFECTIVE_MODEL" /> स्ट्रिंगशी जुळणे आवश्यक आहे. स्ट्रिंगचा वापर प्रिंटरकरीता योग्य PPD ओळखण्यासाठी आणि इंस्टॉल करण्यासाठी केला जाईल. अधिक माहिती https://support.google.com/chrome?p=noncloudprint येथे मिळू शकते. - - प्रिंटर सेट करण्यासाठी IPP Everywhere वापरायचे की नाही हे सूचित करणारा <ph name="PRINTER_AUTOCONF" /> हा बुलियन फ्लॅग आहे. हा फ्लॅग <ph name="PRODUCT_OS_NAME" /> ची ७६ वी आणि त्यावरील आवृत्तीला सपोर्ट करतो. - - एकतर <ph name="PRINTER_EFFECTIVE_MODEL" /> मध्ये प्रिंटरचे नाव असणे आवश्यक आहे किंवा <ph name="PRINTER_AUTOCONF" /> सत्य वर सेट असणे आवश्यक आहे. दोन प्रॉपर्टी असलेल्या किंवा कोणतीही प्रॉपर्टी नसलेल्या प्रिंटरकडे दुर्लक्ष केले जाईल. - - पहिल्यांदा प्रिंटर वापरल्यावर प्रिंटरचे सेटअप पूर्ण होते. प्रिंटरचा वापर करेपर्यंत PPD डाउनलोड होत नाही. नंतर वारंवार वापरल्या जाणाऱ्या PPD कॅशे केल्या जातात. - - या धोरणाचे वापरकर्ते व्यक्तिगत डिव्हाइसवर प्रिंटर कॉन्फिगर करू शकतात का यावर परिणाम होत नाही. याचा हेतू वैयक्तिक वापरकर्त्यांद्वारे प्रिंटरच्या कॉन्फिगरेशनसाठी पूरक असणे हा आहे. - - अॅक्टिव्ह डिरेक्टरीने व्यवस्थापित केलेल्या डिव्हाइससाठी हे धोरण <ph name="MACHINE_NAME_VARIABLE" /> अॅक्टिव्ह डिरेक्टरी मशीनचे नाव किंवा त्याच्या सबस्ट्रिंगपर्यंत विस्तारीत करण्याला सपोर्ट करते. उदाहरणार्थ, मशीनचे नाव <ph name="MACHINE_NAME_EXAMPLE" /> असल्यास, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> हे सहाव्या स्थानानंतर सुरू होणाऱ्या चार वर्णांनी बदलले जाईल, जसे की, <ph name="MACHINE_NAME_PART_EXAMPLE" />. स्थान शून्य-आधारित आहे याची नोंद घ्या. - </translation> <translation id="3072045631333522102">किरकोळ मोडमध्ये साइन-इन स्क्रीनवर वापरले जाण्यासाठी स्क्रीन सेव्हर</translation> <translation id="3072847235228302527">एका डिव्हाइस-स्थानिक खात्यासाठी सेवा अटी सेट करा</translation> <translation id="3077183141551274418">टॅब लाइफसायकल सुरू किंवा बंद करते</translation> @@ -1329,13 +1310,6 @@ तुम्ही हे धोरण सेट केल्यास, वापरकर्ते ते बदलू शकत नाहीत किंवा ओव्हरराइड करू शकत नाहीत. हे धोरण सेट न करता सोडून दिल्यास, पॉवर पीक शिफ्ट सुरुवातीला बंद असेल आणि वापरकर्ता ते सुरू करू शकत नाही.</translation> -<translation id="3388153794103186066">तुम्हाला URL ची अशी सूची सेट करू देते ज्यामध्ये कोणत्या साइटना दिलेल्या विक्रेता आणि उत्पादन आयडी चा वापर करून USB डिव्हाइस ॲक्सेस करण्याची परवानगी आपोआप दिली जाईल हे स्पष्ट केलेले असते. धोरण योग्य ठरावे यासाठी सूचीमधील प्रत्येक आयटम मध्ये डिव्हाइस आणि URL असे दोन्हीही असणे अनिवार्य आहे. डिव्हाइसमधील प्रत्येक आयटममध्ये एक विक्रेता आयडी आणि उत्पादन आयडी असे भाग असू शकतात. कोणत्याही वगळलेल्या आयडी ला वाइल्डकार्ड एक्सेप्शन समजले जाते आणि अशा एक्सेप्शनमध्ये विक्रेता आयडी सुद्धा नमूद केल्याशिवाय उत्पादन आयडी नमूद केला जाऊ शकत नाही. असे न झाल्यास, धोरण योग्य ठरणार नाही आणि त्याकडे दुर्लक्ष केले जाईल. - -USB डिव्हाइस ॲक्सेस करण्याकरता विनंती करत असलेल्या URL ला परवानगी देण्यासाठी USB परवानगी मॉडेलद्वारे विनंती करणाऱ्या साइट ("विनंती करत असलेला URL") चा URL आणि वरच्या पातळीवरील फ्रेम साइट ("एम्बेडिंग URL") चा वापर केला जातो. जेव्हा विनंती करणारी साइट iframe मध्ये लोड केली असेल, तेव्हा विनंती करत असलेला URL हा एम्बेडिंग URL पेक्षा वेगळा असू शकतो. त्यामुळे, विनंती करत असलेल्या आणि एम्बेडिंग URL ला अनुक्रमे नमूद करण्यासाठी "URL" भागामध्ये स्वल्पविरामाद्वारे डीलिमिट केलेल्या दोन URL स्ट्रिंग असू शकतात. केवळ एकच URL नमूद केला असेल, तर एम्बेडिंग स्थिती लक्षात न घेता जर विनंती करणाऱ्या साइटचा URL या URL शी जुळला तर संबंधित USB डिव्हाइसचा ॲक्सेस दिला जाईल. "URL" मधील URL योग्य URL असले जावीत, अन्यथा धोरणाकडे दुर्लक्ष केले जाईल. - -जर हे धोरण सेट केले नसेल, तर एकतर 'DefaultWebUsbGuardSetting' धोरण सेट केले असेल तर त्यातून किंवा मग वापरकर्त्याच्या वैयक्तिक कॉंफिगरेशनमधून सर्व साइटसाठी सर्वंकष डीफॉल्ट मूल्य वापरले जाईल. - -या धोरणातील URL पॅटर्न हे WebUsbBlockedForUrls द्वारे कॉन्फिगर केलेल्यांविरुद्ध असू नयेत. जर ते विरुद्ध असतील, तर WebUsbBlockedForUrls आणि WebUsbAskForUrls ऐवजी या धोरणाला प्राधान्य दिले जाईल.</translation> <translation id="3414260318408232239">हे धोरण कॉंफिगर केले नसल्यास <ph name="PRODUCT_NAME" /> एक किमान आवृत्ती म्हणजेच TLS 1.0 वापरते. नाहीतर, ते खालीलपैकी एखाद्या मूल्यावर सेट केलेले असू शकेल: "tls1", "tls1.1" किंवा "tls1.2". सेट केलेले असल्यावर, <ph name="PRODUCT_NAME" /> हे SSL/TLS च्या दिलेल्या आवृत्त्यांपेक्षा कमी आवृत्ती वापरणार नाही. ओळख न झालेल्या मूल्याकडे दुर्लक्ष केले जाईल.</translation> @@ -2402,7 +2376,7 @@ तुम्ही हे धोरण सेट केल्यास, वापरकर्त्यांना ते बदलता किंवा ओव्हरराइड करता येणार नाही. - धोरण सेट न करता सोडल्यास वापरकर्ता डेस्कटॉपवर दाखवण्यासाठी आणि लॉगइन स्क्रीन बॅकग्राउंडवर दाखवण्यासाठी इमेज निवडू करू शकतो.</translation> + धोरण सेट न करता सोडल्यास वापरकर्ता डेस्कटॉपवर दाखवण्यासाठी आणि लॉगइन स्क्रीन बॅकग्राउंडवर दाखवण्यासाठी इमेज निवडू शकतो.</translation> <translation id="5437733496511628148">ही सेटिंग सुरू करणे ब्राउझरच्या अॅड्रेस बारमध्ये नसलेल्या वेब पेज घटकांद्वारे कुकी सेट करण्यास प्रतिबंध करते. ही सेटिंग बंद करणे ब्राउझरच्या अॅड्रेस बारमध्ये नसलेल्या वेब पेज घटकांद्वारे कुकी सेट करू देते आणि वापरकर्त्यांना ही सेटिंग बदलण्यापासून प्रतिबंध करते. @@ -4005,7 +3979,7 @@ हे धोरण डिव्हाइसवर कोणती Android अॅप्स आपोआप इंस्टॉल केली जावीत ते कॉन्फिगर करण्यासाठी वापरले जाऊ शकते. - अॅप्स लाँचर वर पिन करण्यासाठी, PinnedLauncherApps पाहा.</translation> + अॅप्स लाँचरवर पिन करण्यासाठी, PinnedLauncherApps पाहा.</translation> <translation id="8566842294717252664">नवीन टॅब पृष्ठ आणि अॅप लाँचरवरुन वेब स्टोअर लपवा</translation> <translation id="8569734380847633643"> हे धोरण असत्यवर सेट केल्यास, <ph name="PRODUCT_OS_NAME" /> वायफाय बंद करेल आणि वापरकर्ते ते पुन्हा सुरू करू शकत नाहीत.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index 9c94b2e..e5afbb4 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -1204,25 +1204,6 @@ Jika dasar ini ditetapkan kepada palsu, pengoptimuman WPAD dilumpuhkan menyebabkan <ph name="PRODUCT_NAME" /> menunggu lebih lama untuk pelayan WPAD berasaskan DNS. Jika dasar ini tidak ditetapkan atau didayakan, pengoptimuman WPAD didayakan. Bergantung kepada sama ada atau cara dasar ini ditetapkan, tetapan pengoptimuman WPAD tidak boleh diubah oleh pengguna.</translation> -<translation id="3071839057966069710">Mengkonfigurasi senarai pencetak. - - Dasar ini membolehkan pentadbir menyediakan konfigurasi pencetak untuk - pengguna mereka. - - <ph name="PRINTER_DISPLAY_NAME" /> dan <ph name="PRINTER_DESCRIPTION" /> ialah rentetan berbentuk bebas yang boleh disesuaikan untuk memudahkan pemilihan pencetak. <ph name="PRINTER_MANUFACTURER" /> dan <ph name="PRINTER_MODEL" /> berfungsi untuk memudahkan pengenalpastian pencetak oleh pengguna akhir. Maklumat ini mewakili pengeluar dan model pencetak. <ph name="PRINTER_URI" /> haruslah alamat yang boleh dihubungi daripada komputer pelanggan termasuk <ph name="URI_SCHEME" />, <ph name="URI_PORT" />dan <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> tidak diwajibkan. Jika disediakan, maklumat ini digunakan untuk membantu pentadbir menyahpendua pencetak <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> mestilah sepadan dengan satu daripada rentetan yang mewakili pencetak yang menyokong <ph name="PRODUCT_NAME" />. Rentetan akan digunakan untuk mengenal pasti dan memasang PPD yang bersesuaian untuk pencetak tersebut. Maklumat lanjut boleh didapati di https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> ialah bendera boolean yang menunjukkan sama ada IPP Everywhere harus digunakan untuk menyediakan pencetak. Bendera ini disokong pada <ph name="PRODUCT_OS_NAME" /> versi 76 ke atas. - - Sama ada <ph name="PRINTER_EFFECTIVE_MODEL" /> harus mengandungi nama pencetak atau <ph name="PRINTER_AUTOCONF" /> harus ditetapkan kepada benar. Pencetak yang mempunyai kedua-dua sifat atau tiada mana-mana sifat akan diabaikan. - - Penyediaan pencetak selesai apabila pencetak digunakan buat kali pertama. PPD tidak dimuat turun sehingga pencetak digunakan. Selepas itu, PPD yang kerap digunakan akan dicache. - - Dasar ini tidak mempengaruhi sama ada pengguna boleh mengkonfigurasi pencetak pada peranti individu. Dasar ini bertujuan untuk dijadikan tambahan kepada konfigurasi pencetak oleh pengguna individu. - - Untuk peranti yang diurus oleh Active Directory, dasar ini menyokong perluasan <ph name="MACHINE_NAME_VARIABLE" /> kepada nama mesin Active Directory atau subrentetan nama tersebut. Contohnya, jika nama mesin ialah <ph name="MACHINE_NAME_EXAMPLE" />, maka <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> akan digantikan oleh 4 aksara yang bermula selepas kedudukan ke-6, iaitu <ph name="MACHINE_NAME_PART_EXAMPLE" />. Harap maklum bahawa kedudukan tersebut adalah berasaskan sifar. - </translation> <translation id="3072045631333522102">Penyelamat skrin untuk digunakan pada skrin log masuk dalam mod runcit</translation> <translation id="3072847235228302527">Tetapkan Syarat Perkhidmatan untuk akaun setempat peranti</translation> <translation id="3077183141551274418">Mendayakan atau melumpuhkan kitaran hayat tab</translation> @@ -1362,13 +1343,6 @@ Jika anda menetapkan dasar ini, pengguna tidak boleh mengubah atau membatalkannya. Jika dasar ini dibiarkan tidak ditetapkan, pertukaran kuasa puncak dilumpuhkan pada mulanya dan tidak boleh didayakan oleh pengguna.</translation> -<translation id="3388153794103186066">Membolehkan anda menetapkan senarai url yang menentukan tapak yang akan diberikan kebenaran secara automatik untuk mengakses peranti USB dengan ID vendor dan produk yang dinyatakan. Setiap item dalam senarai mesti mengandungi peranti dan juga url untuk menjadikan dasar ini sah. Setiap item dalam peranti boleh mengandungi medan ID vendor dan ID produk. Mana-mana ID yang tidak dimasukkan akan dikendalikan sebagai kad bebas dengan satu pengecualian dan pengecualian itu ialah ID produk tidak boleh dinyatakan jika ID vendor juga tidak dinyatakan. Jika tidak, dasar ini tidak akan sah dan akan diabaikan. - - Model kebenaran USB menggunakan URL tapak yang meminta ("URL yang meminta") dan URL tapak bingkai tahap tinggi ("URL yang membenamkan") untuk memberikan kebenaran kepada URL yang meminta untuk mengakses peranti USB. URL yang meminta mungkin berbeza daripada URL yang membenamkan apabila tapak yang meminta dimuatkan dalam iframe. Oleh itu, medan "url" boleh mengandungi hingga dua rentetan URL yang dihadkan oleh koma untuk menyatakan URL yang meminta dan yang membenamkan. Jika hanya satu URL dinyatakan, maka akses kepada peranti USB yang sepadan akan diberikan apabila URL tapak yang meminta sepadan dengan URL ini tanpa mengira status pembenaman. URL dalam "url" mestilah URL yang sah, jika tidak dasar ini akan diabaikan. - - Jika dasar ini dibiarkan tanpa ditetapkan, nilai lalai global akan digunakan untuk semua tapak sama ada daripada dasar 'DefaultWebUsbGuardSetting' jika dasar ini ditetapkan, atau konfigurasi peribadi pengguna jika sebaliknya. - - Pola URL dalam dasar ini tidak boleh bercanggah dengan pola yang dikonfigurasikan melalui WebUsbBlockedForUrls. Jika terdapat percanggahan, dasar ini akan diutamakan berbanding WebUsbBlockedForUrls dan WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Jika dasar ini tidak dikonfigurasikan, maka <ph name="PRODUCT_NAME" /> menggunakan versi minimum lalai iaitu TLS 1.0. Jika tidak, dasar ini mungkin ditetapkan kepada satu daripada nilai berikut: "tls1", "tls1.1" atau "tls1.2". Apabila ditetapkan, <ph name="PRODUCT_NAME" /> tidak akan menggunakan versi SSL/TLS yang lebih rendah daripada versi yang dinyatakan. Nilai yang tidak dicam akan diabaikan.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 0a3a94f..ee28fee 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1202,24 +1202,6 @@ Als dit beleid is ingesteld op 'false', wordt WPAD-optimalisatie uitgeschakeld, waardoor <ph name="PRODUCT_NAME" /> langer moet wachten op DNS-gebaseerde WPAD-servers. Als het beleid niet is ingesteld of is ingeschakeld, is WPAD-optimalisatie ingeschakeld. Onafhankelijk van of en hoe dit beleid is ingesteld, kan de instelling voor WPAD-optimalisatie niet worden gewijzigd door gebruikers.</translation> -<translation id="3071839057966069710">Hiermee wordt een lijst met printers geconfigureerd. - - Met dit beleid kunnen beheerders hun gebruikers voorzien van printerconfiguraties. - - <ph name="PRINTER_DISPLAY_NAME" /> en <ph name="PRINTER_DESCRIPTION" /> zijn vrije tekenreeksen die kunnen worden aangepast om de printerselectie te vereenvoudigen. <ph name="PRINTER_MANUFACTURER" /> en <ph name="PRINTER_MODEL" /> zijn bedoeld om de printeridentificatie door eindgebruikers te vereenvoudigen. Ze staan voor de fabrikant en het model van de printer. <ph name="PRINTER_URI" /> moet een adres zijn dat bereikbaar is vanaf een clientcomputer, inclusief <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> en <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> is optioneel. Als de waarde is opgegeven, wordt deze gebruikt om <ph name="ZEROCONF_DISCOVERY" />-printers te dedupliceren. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> moet overeenkomen met een van de tekenreeksen die een door <ph name="PRODUCT_NAME" /> ondersteunde printer vertegenwoordigen. De tekenreeks wordt gebruikt om de juiste PPD voor de printer te identificeren en te installeren. Meer informatie hierover vind je op https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> is een Booleaanse markering die aangeeft of IPP Everywhere moet worden gebruikt om de printer in te stellen. Deze markering wordt ondersteund in versie 76 en hoger van <ph name="PRODUCT_OS_NAME" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> moet de naam van de printer bevatten of <ph name="PRINTER_AUTOCONF" /> moet zijn ingesteld op True. Printers met beide of geen van de eigenschappen worden genegeerd. - - De instellingen van de printer worden voltooid wanneer de printer voor het eerst wordt gebruikt. PPD's worden pas gedownload wanneer de printer wordt gebruikt. Daarna worden veelgebruikte PPD's opgeslagen in het cachegeheugen. - - Dit beleid is niet van invloed op de mogelijkheid van gebruikers om printers op afzonderlijke apparaten in te stellen. Het is bedoeld als aanvulling op de printerinstellingen van afzonderlijke gebruikers. - - Voor apparaten die via Active Directory worden beheerd, ondersteunt dit beleid de uitbreiding van <ph name="MACHINE_NAME_VARIABLE" /> naar de naam van de Active Directory-machine of naar een subtekenreeks daarvan. Als de machinenaam bijvoorbeeld <ph name="MACHINE_NAME_EXAMPLE" /> is, wordt <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> vervangen door de vier tekens vanaf de zesde positie, oftewel <ph name="MACHINE_NAME_PART_EXAMPLE" />. Houd er rekening mee dat de positie op nul is gebaseerd. - </translation> <translation id="3072045631333522102">Screensaver voor gebruik in het inlogvenster in de winkelmodus</translation> <translation id="3072847235228302527">De Servicevoorwaarden instellen voor een apparaat-lokaal account</translation> <translation id="3077183141551274418">Hiermee schakel je levenscyclussen voor tabbladen in of uit</translation> @@ -1359,13 +1341,6 @@ Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of negeren. Als dit beleid niet wordt ingesteld, wordt stroompiekverschuiving in eerste instantie uitgeschakeld en kan dit worden ingeschakeld door de gebruiker.</translation> -<translation id="3388153794103186066">Hiermee kun je een lijst met URL's instellen die aangeven welke sites automatisch toegang krijgen tot een USB-apparaat met de opgegeven leverancier- en product-ID. Het beleid is alleen geldig als elk item in de lijst zowel apparaten als URL's bevat. Elk item in apparaten kan een veld voor leverancier-ID en een veld voor product-ID bevatten. Een ID die is weggelaten, wordt als wildcard behandeld, met één uitzondering: er mag geen product-ID worden opgegeven zonder dat er ook een leverancier-ID is opgegeven. Anders is het beleid niet geldig. Ongeldige beleidswaarden worden genegeerd. - - Het USB-toestemmingsmodel gebruikt de URL van de site die de aanvraag indient ('aanvragende URL') en de URL van de framesite op hoofdniveau ('insluitings-URL') om de aanvragende URL toegang te geven tot het USB-apparaat. Wanneer de aanvragende site in een iframe wordt geladen, is het mogelijk dat de aanvragende URL en de insluitings-URL niet hetzelfde zijn. Daarom kan het veld voor URL's maximaal twee, door een komma gescheiden URL-tekenreeksen bevatten om respectievelijk de aanvragende URL en insluitings-URL op te geven. Als er slechts één URL wordt opgegeven, wordt toegang tot de bijbehorende USB-apparaten gegeven wanneer de URL van de aanvragende site overeenkomt met deze URL, ongeacht de insluitingsstatus. De URL's in het veld voor URL's moeten geldige URL's zijn. Als dit niet het geval is, wordt het beleid genegeerd. - - Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid DefaultWebUsbGuardSetting (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. - - De URL-patronen in dit beleid mogen niet conflicteren met de patronen die zijn ingesteld via WebUsbBlockedForUrls. Als er een conflict is, krijgt dit beleid voorrang op WebUsbBlockedForUrls en WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Als dit beleid niet is geconfigureerd, gebruikt <ph name="PRODUCT_NAME" /> een standaard minimum versie, oftewel TLS 1.0. In andere gevallen kan een van de volgende waarden worden ingesteld: 'tls1', 'tls1.1' of 'tls1.2'. Wanneer dit beleid is ingesteld, gebruikt <ph name="PRODUCT_NAME" /> geen lagere SSL-/TLS-versies dan de gespecificeerde versie. Als er een waarde wordt ingesteld die niet wordt herkend, wordt deze genegeerd.</translation>
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index 80c99386..b8333c5 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -1179,24 +1179,6 @@ Hvis denne regelen er satt til false (usann), er WPAD-optimalisering slått av, noe som fører til at <ph name="PRODUCT_NAME" /> må vente lenger på DNS-baserte WPAD-tjenere. Hvis denne regelen er slått på, eller hvis du ikke har spesifisert den, er WPAD-optimalisering slått på. Innstillingen for WPAD-optimalisering kan ikke endres av brukerne. Dette gjelder uansett hvordan eller om denne regelen er konfigurert.</translation> -<translation id="3071839057966069710">Konfigurerer en liste over skrivere. - - Med denne regelen kan administratorer levere skriveroppsett til brukerne sine. - - <ph name="PRINTER_DISPLAY_NAME" /> og <ph name="PRINTER_DESCRIPTION" /> er strenger som kan tilpasses fritt for å gjøre det lett å velge skriver. Formålet med <ph name="PRINTER_MANUFACTURER" /> og <ph name="PRINTER_MODEL" /> er å gjøre det lett for brukere å identifisere skriverne. Strengene representerer skriverprodusenten og -modellen. <ph name="PRINTER_URI" /> skal være en adresse som klientdatamaskiner kan nå, inkludert <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> og <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> er valgfritt. Hvis den angis, kan den bidra til å deduplisere <ph name="ZEROCONF_DISCOVERY" />-skrivere. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> må samsvare med en av strengene som representerer en skriver som støttes av <ph name="PRODUCT_NAME" />. Strengen brukes til å identifisere og installere riktig PPD for skriveren. Du finner mer informasjon på https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> er et boolsk flagg som indikerer om IPP Everywhere skal brukes til å sette opp skriveren. Dette flagget støttes i <ph name="PRODUCT_OS_NAME" /> versjon 76 og nyere. - - Enten må <ph name="PRINTER_EFFECTIVE_MODEL" /> inneholde navnet på skriveren, eller så må <ph name="PRINTER_AUTOCONF" /> være satt til «true» (sann). Skrivere med begge eller uten noen av egenskapene ignoreres. - - Skriveroppsettet fullføres første gang en skriver tas i bruk. PPD-er lastes ikke ned før skriveren tas i bruk. Deretter blir mye brukte PPD-er bufret. - - Denne regelen har ingen innvirkning på om brukere kan konfigurere skrivere på enhetene sine. Den er ment å supplere skriveroppsettene til individuelle brukere. - - For enheter som administreres via Active Directory, har denne regelen støtte for å utvide <ph name="MACHINE_NAME_VARIABLE" /> til Active Directory-maskinnavnet eller en delstreng av dette. Hvis maskinnavnet for eksempel er <ph name="MACHINE_NAME_EXAMPLE" />, erstattes <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> med de fire tegnene som kommer etter den sjette posisjonen, dvs. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Legg merke til at posisjonen er nullbasert. - </translation> <translation id="3072045631333522102">Skjermsparer som skal brukes på påloggingssiden i detaljistmodus</translation> <translation id="3072847235228302527">Angi bruksvilkårene for en konto på enheten</translation> <translation id="3077183141551274418">Aktiverer eller deaktiverer fanelivssykluser</translation> @@ -1328,13 +1310,6 @@ Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den. Hvis denne regelen ikke angis, er strømtoppskift av og kan ikke slås på av brukerne.</translation> -<translation id="3388153794103186066">Lar deg angi en liste over nettadresser som spesifiserer nettsteder som automatisk får tilgang til USB-enheter fra gjeldende leverandører og produkt-ID-er. Hvert element på listen må inneholde både enhetene og nettadressene for at regelen skal gjelde. Hvert element i enheter kan inneholde felt for leverandør-ID og produkt-ID. Eventuelle ID-er som ikke føres opp på listen, behandles som jokertegn, med ett unntak: Du kan ikke angi en produkt-ID uten å angi en leverandør-ID. Hvis ikke er regelen ugyldig og den blir ignorert. - - USB-tillatelsesmodellen bruker nettadressen forespørselen kommer fra («forespørsel-nettadressen»), og nettadressen med den innebygde iframe-koden («nettadressen med innebygging») for å gi nettadressen forespørselen kommer fra, tilgang til USB-enheten. Forespørsel-nettadressen kan være forskjellig fra nettadressen med innebygging når nettstedet forespørselen kommer fra, ligger i en iframe. Derfor kan feltet «urls» (nettadresser) inneholde opptil to nettadressestrenger atskilt med komma for å spesifisere henholdsvis forespørsel-nettadressen og nettadressen med innebygging. Hvis kun én nettadresse er spesifisert, gis tilgang til de samsvarende USB-enhetene når forespørsel-nettadressen samsvarer med denne nettadressen, uavhengig av innebyggingsstatus. Nettadressene i «urls» (nettadresser) må være gyldige, ellers blir regelen ignorert. - - Hvis denne regelen ikke er angitt, brukes den globale standardverdien for alle nettsteder fra «DefaultWebUsbGuardSetting»-regelen hvis den er angitt, eller brukerens personlige konfigurasjon hvis den ikke er angitt. - - Nettadressemønstre i denne regelen må ikke kollidere med de som er konfigurert via WebUsbBlockedForUrls. Hvis de kolliderer, har denne regelen prioritet over WebUsbBlockedForUrls og WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Hvis denne regelen ikke er konfigurert, bruker <ph name="PRODUCT_NAME" /> en standard minimumsversjon, som er TLS 1.0. Ellers kan den angis som en av de følgende verdiene: «tls1», «tls1.1» eller «tls1.2». Når den er angitt, bruker ikke <ph name="PRODUCT_NAME" /> lavere SSL/TLS-versjoner enn den angitte versjonen. Ukjente verdier blir ignorert.</translation>
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index 23ada38..e358650 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -1172,25 +1172,6 @@ Jeśli ta zasada jest wyłączona, optymalizacja WPAD jest wyłączona. <ph name="PRODUCT_NAME" /> musi wtedy dłużej oczekiwać na serwery WPAD oparte na DNS. Jeśli zasada jest włączona lub nie jest skonfigurowana, optymalizacja WPAD jest włączona. Bez względu na to, czy i jak ta zasada jest skonfigurowana, użytkownicy nie mogą jej zmienić.</translation> -<translation id="3071839057966069710">Konfiguruje listę drukarek. - - Ta zasada umożliwia administratorom przekazanie konfiguracji drukarek - użytkownikom. - - <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> to dowolny tekst, który ma ułatwić wybranie drukarki. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> ułatwiają użytkownikom identyfikację drukarki. Oznaczają producenta i model drukarki. <ph name="PRINTER_URI" /> to adres, który powinien być dostępny z komputera klienckiego, zawierający te składniki: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. Opcjonalny składnik to <ph name="PRINTER_UUID" />. Jeśli jest podany, umożliwia usunięcie duplikatów drukarek <ph name="ZEROCONF_DISCOVERY" />. - - Ciąg znaków <ph name="PRINTER_EFFECTIVE_MODEL" /> musi być zgodny z jednym z ciągów oznaczających drukarkę współpracującą z <ph name="PRODUCT_NAME" />. Zostanie on użyty do zidentyfikowania oraz zainstalowania pliku PPD odpowiedniego dla drukarki. Więcej informacji znajdziesz na stronie https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> to flaga wartości logicznej, która określa, czy do konfiguracji drukarki ma zostać użyty standard IPP Everywhere. Ta flaga działa w <ph name="PRODUCT_OS_NAME" /> w wersji 76 i nowszych. - - Musi zostać spełniony jeden z dwóch warunków: <ph name="PRINTER_EFFECTIVE_MODEL" /> musi zawierać nazwę drukarki lub ustawienie <ph name="PRINTER_AUTOCONF" /> musi mieć wartość Prawda. Drukarki spełniające oba te warunki lub niespełniające żadnego z nich będą ignorowane. - - Konfiguracja drukarki jest wykonywana podczas jej pierwszego użycia. Pliki PPD nie są pobierane przed użyciem drukarki. Później często używane pliki PPD są przechowywane w pamięci podręcznej. - - Zasada nie ma wpływu na to, czy użytkownicy mogą konfigurować drukarki na poszczególnych urządzeniach. Jest ona uzupełnieniem konfiguracji drukarek wykonywanej przez poszczególnych użytkowników. - - W przypadku urządzeń zarządzanych w Active Directory zasada ta obsługuje rozszerzanie nazwy <ph name="MACHINE_NAME_VARIABLE" /> do nazwy komputera Active Directory lub jej podłańcucha. Jeśli na przykład nazwa komputera to <ph name="MACHINE_NAME_EXAMPLE" />, ciąg <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zastępowany jest czterema znakami, zaczynając po szóstej pozycji, np. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Pozycja jest liczona od zera. - </translation> <translation id="3072045631333522102">Wygaszacz ekranu używany na ekranie logowania w trybie sklepu</translation> <translation id="3072847235228302527">Określ Warunki korzystania z usługi dla lokalnego konta na urządzeniu</translation> <translation id="3077183141551274418">Włącza lub wyłącza cykle życia kart</translation> @@ -1330,13 +1311,6 @@ Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić. Jeśli ta zasada pozostanie nieskonfigurowana, zasada Czas największego zużycia energii będzie wyłączona, a użytkownicy nie będą mogli jej włączyć.</translation> -<translation id="3388153794103186066">Umożliwia ustawienie listy adresów URL określającej witryny, które mają automatycznie uzyskiwać dostęp do urządzeń USB o podanych identyfikatorach producenta i produktu. Aby zasada była poprawna, każda pozycja na liście musi zawierać zarówno urządzenia, jak i adresy URL. Każda definicja urządzenia może zawierać pole identyfikatora producenta i identyfikatora produktu. Każde pominięcie identyfikatora jest traktowane jako symbol wieloznaczny, ale nie można podać identyfikatora produktu bez podania identyfikatora producenta. W przeciwnym razie zasada będzie niepoprawna i będzie ignorowana. - - W modelu przyznawania uprawnień dostępu do urządzeń USB rozróżniamy adres URL witryny wysyłającej żądanie („URL źródła żądania”) oraz URL witryny ramki najwyższego poziomu („URL miejsca osadzenia”). URL źródła żądania może być inny niż URL miejsca osadzenia, gdy witryna wysyłająca żądanie jest ładowana w elemencie iframe. Dlatego pole „adresy URL” może zawierać maksymalnie dwa adresy URL oddzielone przecinkiem: pierwszy to URL źródła żądania, drugi to URL miejsca osadzenia. Jeśli podany jest tylko jeden adres URL, witryna o tym adresie uzyska dostęp do wskazanych urządzeń USB niezależnie od osadzenia. W polu „adresy URL” muszą znajdować się poprawne adresy URL – w przeciwnym razie zasada będzie ignorowana. - - Jeśli zasada pozostanie nieskonfigurowana, dla wszystkich witryn będzie stosowana globalna wartość domyślna pochodząca z zasady „DefaultWebUsbGuardSetting”, o ile ta jest skonfigurowana, a w przeciwnym razie z osobistej konfiguracji użytkownika. - - Wzorce adresów URL w tej zasadzie nie powinny być w konflikcie z wzorcami w zasadzie WebUsbBlockedForUrls. W przypadku konfliktu ta zasada ma pierwszeństwo nad WebUsbBlockedForUrls i WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Jeśli ta zasada nie jest skonfigurowana, <ph name="PRODUCT_NAME" /> korzysta z domyślnej najniższej wersji TLS, czyli 1.0. W przeciwnym razie zasada może mieć jedną z tych wartości: „tls1”, „tls1.1” lub „tls1.2”. Po jej ustawieniu <ph name="PRODUCT_NAME" /> nie używa wersji SSL/TLS niższych niż określona. Nierozpoznana wartość jest ignorowana.</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index d6b732e..ea95abc 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1169,24 +1169,6 @@ Se esta política for definida como "false", a otimização de WPAD será desativada, fazendo com que o <ph name="PRODUCT_NAME" /> tenha que esperar mais tempo por servidores de WPAD baseados em DNS. Se a política não estiver definida ou estiver ativada, a otimização de WPAD será ativada. Independentemente de se ou como esta política está definida, a configuração de otimização de WPAD não pode ser alterada pelos usuários.</translation> -<translation id="3071839057966069710">Configura uma lista de impressoras. - - Esta política permite aos administradores fornecer configurações de impressora para os usuários. - - <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> são strings de formato livre que podem ser personalizadas para facilitar a seleção da impressora. <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" /> servem para facilitar a identificação da impressora pelos usuários finais. Esses dados representam o fabricante e o modelo da impressora. É necessário que <ph name="PRINTER_URI" /> seja um endereço acessível em um computador cliente e que inclua <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> é opcional. Se fornecido, será usado para ajudar a eliminar a duplicação de impressoras <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> precisa corresponder a uma das strings que representam uma impressora compatível com <ph name="PRODUCT_NAME" />. A string será usada para identificar e instalar o PPD apropriado para a impressora. Mais informações estão disponíveis em https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> é uma sinalização booleana que indica se é necessário usar o IPP Everywhere para configurar a impressora. Essa sinalização é compatível com <ph name="PRODUCT_OS_NAME" /> versão 76 ou posterior. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> precisa conter o nome da impressora ou <ph name="PRINTER_AUTOCONF" /> deve ser definida como verdadeira. As impressoras com as duas propriedades ou sem nenhuma serão ignoradas. - - A configuração da impressora é concluída depois que ela é utilizada pela primeira vez. O download de PPDs só é realizado quando a impressora é utilizada. Depois disso, os PPDs usados com frequência são armazenados em cache. - - Esta política não afeta a possibilidade de os usuários configurarem impressoras em dispositivos individuais. Ela tem o objetivo de complementar a configuração de impressoras por usuários individuais. - - Para dispositivos gerenciados pelo Active Directory, esta política permite a expansão de <ph name="MACHINE_NAME_VARIABLE" /> para o nome do computador com Active Directory ou uma substring correspondente. Por exemplo, se o nome do computador for <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> será substituído pelos quatro caracteres que começam depois da 6ª posição, ou seja, <ph name="MACHINE_NAME_PART_EXAMPLE" />. A posição se baseia em zero. - </translation> <translation id="3072045631333522102">Protetor de tela a ser utilizado na tela de login no modo de varejo</translation> <translation id="3072847235228302527">Definir os Termos de Serviço para uma conta local do dispositivo</translation> <translation id="3077183141551274418">Ativa ou desativa os ciclos de vida de guias</translation> @@ -1322,13 +1304,6 @@ Se você definir esta política, os usuários não poderão alterá-la ou modificá-la. Se esta política não for definida, a economia de energia no período de pico ficará inicialmente desativada e não poderá ser ativada pelo usuário.</translation> -<translation id="3388153794103186066">Permite definir uma lista de urls que especificam quais sites terão permissão automática para acessar um dispositivo USB com os códigos de fornecedor e de produto fornecidos. Cada item da lista precisa conter dispositivos e URLs para que a política seja válida. Cada item nos dispositivos pode conter um campo para código de fornecedor e código de produto. Os códigos omitidos são tratados como caracteres coringa com uma exceção, e essa exceção é que um código de produto não pode ser especificado sem que um código de fornecedor também seja. Caso contrário, a política não será válida e será ignorada. - - O modelo de permissão de USB usa o URL do site solicitante ("URL solicitante") e o URL do site de frame superior ("URL de incorporação") para conceder permissão ao URL solicitante para acessar o dispositivo USB. O URL solicitante pode ser diferente do URL de incorporação quando o site solicitante é carregado em um iframe. Portanto, o campo "urls" pode conter até duas strings de URL delimitadas por vírgula para especificar o URL solicitante e o de incorporação, respectivamente. Se apenas um URL for especificado, o acesso aos dispositivos USB correspondentes será permitido quando o URL do site solicitante corresponder a esse URL, independentemente do status de incorporação. Os URLs em "urls" precisam ser válidos, caso contrário, a política será ignorada. - - Se esta política não for definida, o valor padrão global será usado para todos os sites, seja da política "DefaultWebUsbGuardSetting", se ela estiver definida, ou das configurações pessoais do usuário. - - Os padrões de URL desta política não devem ser contrários àqueles configurados por meio de WebUsbBlockedForUrls. Se forem, esta política terá precedência sobre WebUsbBlockedForUrls e WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Se esta política não for configurada, o <ph name="PRODUCT_NAME" /> utilizará a versão mínima padrão, que é TLS 1.0. Caso contrário, ela poderá ser definida com um dos seguintes valores: "tls1", "tls1.1" ou "tls1.2". Quando definida, o <ph name="PRODUCT_NAME" /> não usará versões SSL/TLS inferiores à versão especificada. Valores não reconhecidos serão ignorados.</translation>
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 16d9178..fc8c1708 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -1184,25 +1184,6 @@ Se esta política for definida como falsa, a otimização WPAD estará desativada, o que faz com que o <ph name="PRODUCT_NAME" /> aguarde mais tempo pelos servidores WPAD baseados em DNS. Se a política não for definida ou estiver ativada, a otimização de WPAD estará ativada. Independentemente de a política estar definida ou de como está definida, a definição da otimização WPAD não pode ser alterada pelos utilizadores.</translation> -<translation id="3071839057966069710">Configura uma lista de impressoras. - - Esta política permite aos administradores fornecer configurações de impressora para - os respetivos utilizadores. - - <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> são strings de forma livre que podem ser personalizadas para facilitar a seleção da impressora. <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" /> servem para facilitar a identificação da impressora por parte dos utilizadores finais. Representam o fabricante e o modelo da impressora. <ph name="PRINTER_URI" /> deve ser um endereço acessível a partir de um computador de cliente, incluindo <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> é opcional. Se fornecido, é utilizado para ajudar a remover duplicados de impressoras <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> tem de corresponder a uma das strings que representam uma impressora compatível com o <ph name="PRODUCT_NAME" />. A string será utilizada para identificar e instalar o PPD adequado à impressora. Pode encontrar mais informações em https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> é um sinalizador booleano que indica se a opção IPP em todas as plataformas deve ser utilizada para configurar a impressora. Este sinalizador é suportado na versão 76 do <ph name="PRODUCT_OS_NAME" /> e superiores. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> deve conter o nome da impressora ou <ph name="PRINTER_AUTOCONF" /> deve ser definida como verdadeira. As impressoras com as duas propriedades ou sem nenhuma delas serão ignoradas. - - A configuração de uma impressora fica concluída com a primeira utilização da mesma. Os PPDs não são transferidos enquanto a impressora não for utilizada. Posteriormente, os PPDs utilizados com frequência são colocados em cache. - - Esta política não influencia a possibilidade de os utilizadores configurarem impressoras em dispositivos individuais. Destina-se a complementar a configuração de impressoras por utilizadores individuais. - - Em dispositivos geridos pelo Active Directory, esta política suporta a expansão de <ph name="MACHINE_NAME_VARIABLE" /> para o nome do computador do Active Directory ou uma substring do mesmo. Por exemplo, se o nome do computador for <ph name="MACHINE_NAME_EXAMPLE" />, então <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> será substituído pelos 4 carateres a partir da 6.ª posição, ou seja, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tenha em atenção que a posição baseia-se em zero. - </translation> <translation id="3072045631333522102">Proteção de ecrã a utilizar no ecrã de início de sessão no modo de retalho</translation> <translation id="3072847235228302527">Definir os Termos de Utilização para uma conta local do dispositivo</translation> <translation id="3077183141551274418">Ativa ou desativa os ciclos de vida dos separadores.</translation> @@ -1338,13 +1319,6 @@ Se definir esta política, os utilizadores não a podem alterar nem substituir. Se esta política não for definida, o desvio de picos de energia está inicialmente desativado e não pode ser ativado pelo utilizador.</translation> -<translation id="3388153794103186066">Permite-lhe definir uma lista de URLs que especificam os sites aos quais será concedida automaticamente autorização para aceder a um dispositivo USB com os IDs de fornecedor e do produto indicados. Todos os itens na lista devem conter dispositivos e URLs para que a política seja válida. Todos os itens nos dispositivos podem conter um campo de ID de fornecedor e de ID do produto. Os IDs omitidos são tratados como carateres universais, com a exceção de que não é possível especificar um ID do produto sem que o ID de fornecedor também seja especificado. Caso contrário, a política não é válida e será ignorada. - - O modelo de autorização de USB utiliza o URL do site requerente ("URL requerente") e o URL do site de nível superior ("URL incorporante") para autorizar o URL requerente a aceder ao dispositivo USB. O URL requerente pode ser diferente do URL incorporante se o site requerente for carregado num iFrame. Assim, o campo "URLs" pode conter até duas strings de URL separadas por vírgula para especificar o URL requerente e o URL incorporante, respetivamente. Se apenas for especificado um URL, é concedido acesso aos dispositivos USB correspondentes quando o URL do site requerente corresponder a este URL, independentemente do estado de incorporação. Os URLs no campo "URLs" têm de ser URLs válidos; caso contrário, a política será ignorada. - - Se esta política não estiver definida, o valor predefinido global é utilizado para todos os sites a partir da política "DefaultWebUsbGuardSetting", se estiver definida, ou, caso contrário, a partir da configuração pessoal do utilizador. - - Os padrões de URL nesta política não devem entrar em conflito com os configurados através de WebUsbBlockedForUrls. Se existir conflito, esta política prevalece em relação a WebUsbBlockedForUrls e WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Se esta política não estiver configurada, o <ph name="PRODUCT_NAME" /> utiliza a versão mínima predefinida, neste caso, TLS 1.0. Caso contrário, pode ser definida para um dos seguintes valores: "tls1", "tls1.1" ou "tls1.2". Quando estiver definida, o <ph name="PRODUCT_NAME" /> não utiliza as versões SSL/TLS inferiores à versão especificada. Um valor não reconhecido será ignorado.</translation>
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 3ab17364..e692b15 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -1171,25 +1171,6 @@ Dacă această politică este dezactivată, optimizarea pentru WPAD este, de asemenea, dezactivată, iar <ph name="PRODUCT_NAME" /> va aștepta mai mult timp un răspuns de la serverele WPAD bazate pe DNS. Dacă politica nu este configurată sau este activată, optimizarea pentru WPAD este activată. Indiferent dacă politica este configurată sau nu și indiferent de modul în care este configurată, utilizatorii nu pot să modifice setarea privind optimizarea pentru WPAD.</translation> -<translation id="3071839057966069710">Configurează o listă de imprimante. - - Această politică permite administratorilor să ofere utilizatorilor configurații ale - imprimantelor. - - <ph name="PRINTER_DISPLAY_NAME" /> și <ph name="PRINTER_DESCRIPTION" /> sunt șiruri cu formă liberă care pot fi personalizate pentru a selecta mai ușor o imprimantă. <ph name="PRINTER_MANUFACTURER" /> și <ph name="PRINTER_MODEL" /> sunt folosite pentru a simplifica identificarea imprimantei de utilizatorii finali. Acestea reprezintă producătorul și modelul imprimantei. <ph name="PRINTER_URI" /> trebuie să fie o adresă care poate fi accesată de pe un computer client, inclusiv <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, și <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> este opțional. Dacă este specificat, acesta este folosit pentru a deduplica imprimantele <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> trebuie să corespundă unuia dintre șirurile care reprezintă o imprimantă <ph name="PRODUCT_NAME" /> compatibilă. Șirul va fi folosit pentru a identifica și instala PPD-ul corespunzător imprimantei. Mai multe informații sunt disponibile la https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> este un semnal boolean care indică dacă IPP Everywhere trebuie folosit pentru configurarea imprimantei. Acest semnal este compatibil cu versiunea 76 și versiunile ulterioare de <ph name="PRODUCT_OS_NAME" />. - - Ori <ph name="PRINTER_EFFECTIVE_MODEL" /> trebuie să conțină numele imprimantei, ori <ph name="PRINTER_AUTOCONF" /> trebuie să fie activat. Imprimantele cu ambele proprietăți sau fără niciuna vor fi ignorate. - - Configurarea imprimantei este finalizată la prima folosire a acesteia. PPD-urile nu sunt descărcate înainte de folosirea imprimantei. După aceea, PPD-urile folosite frecvent sunt stocate în memoria cache. - - Această politică nu afectează opțiunea utilizatorilor de a configura imprimantele pe dispozitive individuale. Este menită să fie suplimentară față de configurarea imprimantelor de utilizatori individuali. - - Pentru dispozitivele gestionate cu Active Directory, această politică acceptă extinderea <ph name="MACHINE_NAME_VARIABLE" /> la numele computerului cu Active Directory sau la un subșir al acestuia. De exemplu, dacă numele computerului este <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> va fi înlocuit de cele 4 caractere care urmează după cea de-a 6-a poziție, adică <ph name="MACHINE_NAME_PART_EXAMPLE" />. Reține că poziția începe de la zero. - </translation> <translation id="3072045631333522102">Screen saver setat pentru ecranul de conectare în modul Vânzare</translation> <translation id="3072847235228302527">Setați Termenii și condițiile pentru un cont local de pe dispozitiv</translation> <translation id="3077183141551274418">Activează sau dezactivează ciclurile de viață ale filelor</translation> @@ -1325,13 +1306,6 @@ Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze. Dacă politica nu este setată, modul de alimentare Peak shift este dezactivat inițial și nu poate fi activat de utilizator.</translation> -<translation id="3388153794103186066">Îți permite să setezi o listă de adrese URL ce specifică site-urile care vor primi automat permisiunea să acceseze un dispozitiv USB cu ID-ul de furnizor și de produs oferit. Fiecare articol din listă trebuie să conțină atât dispozitivele, cât și adresele URL pentru ca politica să fie validă. Fiecare articol din dispozitive poate conține un câmp pentru ID-ul furnizorului și ID-ul produsului. Orice ID omis este considerat un metacaracter, cu o excepție: un ID de produs nu poate fi specificat fără să fie specificat și un ID de furnizor. În caz contrar, politica nu va fi validă și va fi ignorată. - - Modelul permisiunii USB folosește adresa URL a site-ului care face solicitarea („adresa URL solicitantă”) și adresa URL a site-ului cadru de nivel superior („adresa URL încorporantă”) pentru a acorda permisiunea adresei URL solicitante de a accesa dispozitivul USB. Adresa URL solicitantă poate fi diferită de adresa URL încorporantă când site-ul solicitant este încărcat într-un iframe. De aceea, câmpul „urls” poate conține până la două șiruri separate cu o virgulă pentru a specifica adresa URL încorporantă și, respectiv, solicitantă. Dacă este specificată o singură adresă URL, accesul la dispozitivele USB corespunzătoare va fi acordat când adresa URL a site-ului solicitant este aceeași cu această adresă URL, indiferent de starea încorporării. Adresele URL din „urls” trebuie să fie adrese URL valide; în caz contrar, politica va fi ignorată. - - Dacă această politică nu este setată, valoarea globală prestabilită va fi folosită pentru toate site-urile, fie din politica „DefaultWebUsbGuardSetting”, dacă este setată, fie din configurația personală a utilizatorului, în caz contrar. - - Șabloanele de adrese URL din această politică nu trebuie să fie în contradicție cu cele configurate prin WebUsbBlockedForUrls. Dacă există o contradicție, această politică va avea întâietate în fața WebUsbBlockedForUrls și WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Dacă politica nu este configurată, <ph name="PRODUCT_NAME" /> folosește versiunea minimă prestabilită, care este TLS 1.0. În caz contrar, politica poate fi configurată la una dintre următoarele valori: „tls1”, „tls1.1” sau „tls1.2”. Când este configurată, <ph name="PRODUCT_NAME" /> nu va folosi versiunile SSL/TLS inferioare versiunii specificate. Valorile nerecunoscute vor fi ignorate.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index a5aee623..9b844ef 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1170,24 +1170,6 @@ Если задано значение False, оптимизация WPAD будет отключена и <ph name="PRODUCT_NAME" /> увеличит время ожидания для серверов WPAD на базе DNS. Если правило не задано или включено, оптимизация WPAD будет включена. Какой бы ни был задан параметр для правила, пользователи не могут менять настройки оптимизации WPAD.</translation> -<translation id="3071839057966069710">Позволяет настроить список принтеров. - - С помощью этого правила администраторы могут настраивать принтеры для пользователей. - - Строки <ph name="PRINTER_DISPLAY_NAME" /> и <ph name="PRINTER_DESCRIPTION" /> заполняются в свободной форме для того, чтобы пользователям было проще выбрать принтер. Строки <ph name="PRINTER_MANUFACTURER" /> и <ph name="PRINTER_MODEL" /> помогают конечным пользователям идентифицировать принтеры по производителю и модели. В качестве <ph name="PRINTER_URI" /> необходимо указать адрес в сети клиентского компьютера, включая <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> и <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> указывать необязательно, однако этот параметр помогает дедуплицировать принтеры <ph name="ZEROCONF_DISCOVERY" />. - - Значение строки <ph name="PRINTER_EFFECTIVE_MODEL" /> должно совпадать со значением одной из строк, в которых указан принтер с поддержкой <ph name="PRODUCT_NAME" />. Эта строка будет использоваться для того, чтобы идентифицировать и установить подходящий файл PPD для этого принтера. Подробные сведения читайте на странице https://support.google.com/chrome?p=noncloudprint. - - Логический флаг <ph name="PRINTER_AUTOCONF" /> показывает, будет ли для настройки принтера использоваться стандарт IPP Everywhere. Этот флаг поддерживается в <ph name="PRODUCT_OS_NAME" /> начиная с версии 76. - - Необходимо указать название принтера в строке <ph name="PRINTER_EFFECTIVE_MODEL" /> или установить значение True для параметра <ph name="PRINTER_AUTOCONF" />. Если заданы оба этих параметра или не задан ни один из них, принтер будет проигнорирован. - - Настройка принтера завершается после первого использования. До этого момента PPD-файлы не скачиваются. В дальнейшем часто используемые PPD-файлы кешируются. - - С помощью этого правила нельзя разрешить или запретить пользователям настраивать принтеры на своих устройствах. Оно только дополняет настройки пользователей. - - В среде Active Directory для переменной <ph name="MACHINE_NAME_VARIABLE" /> можно добавить значение имени устройства Active Directory или использовать метод substring. Например, если имя устройства – <ph name="MACHINE_NAME_EXAMPLE" />, то переменная <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> будет возвращать значение <ph name="MACHINE_NAME_PART_EXAMPLE" /> (4 символа, начиная с 6-й позиции). Обратите внимание, что отсчет позиции начинается с нуля. - </translation> <translation id="3072045631333522102">Экранная заставка, используемая для экрана входа в коммерческой версии</translation> <translation id="3072847235228302527">Установить Условия использования локального аккаунта</translation> <translation id="3077183141551274418">Правило включает или отключает жизненный цикл вкладки</translation> @@ -1321,13 +1303,6 @@ Если правило настроено, пользователи не могут изменить или перезаписать его. Если правило не настроено, режим пиковой нагрузки изначально отключен и пользователи не могут его включить.</translation> -<translation id="3388153794103186066">Правило позволяет задать список URL для сайтов, которым автоматически будет разрешен доступ к USB-устройству с предоставленными идентификаторами поставщика и продукта. Каждый пункт списка должен включать устройства и URL. Для каждого устройства можно задать идентификатор поставщика и идентификатор продукта. Вместо пропущенного идентификатора используется подстановочный знак с одним исключением – идентификатор товара не может быть указан без идентификатора поставщика. В противном случае правило недействительно и игнорируется. - - В модели разрешения доступа к USB-устройству используется URL сайта, запрашивающего доступ ("запрашивающий URL"), и URL сайта из фрейма верхнего уровня ("встраиваемый URL"). Если сайт, запрашивающий доступ, загружается в окне iframe, эти два URL могут отличаться. Поэтому поле URL может содержать два адреса, указанные через запятую. Когда задан только один, доступ к USB-устройствам будет предоставлен, если этот URL совпадает с "запрашивающим URL", независимо от способа встраивания. В поле URL необходимо указывать действительные адреса, иначе правило будет игнорироваться. - - Если это правило не настроено, для всех сайтов используется глобальное значение по умолчанию на основе правила DefaultWebUsbGuardSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации). - - Шаблоны URL в этом правиле не должны противоречить шаблонам, заданным в правиле WebUsbBlockedForUrls. В случае противоречия это правило имеет приоритет над правилами WebUsbBlockedForUrls и WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Если правило не настроено, то <ph name="PRODUCT_NAME" /> использует минимальную версию (TLS 1.0) по умолчанию. Правилу можно задать одно из следующих значений: tls1, tls1.1 или tls1.2. После того как вы установите любое из них, <ph name="PRODUCT_NAME" /> не будет использовать более старые версии SSL/TLS. Неподдерживаемые значения будут игнорироваться.</translation>
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index db647b0..cdd52272 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -1182,25 +1182,6 @@ Ak je toto pravidlo nastavené na možnosť False, optimalizácia WPAD je zakázaná a prehliadač <ph name="PRODUCT_NAME" /> tak musí čakať dlhšie na servery WPAD založené na systéme DNS. Ak je toto pravidlo povolené alebo nie je nastavené, optimalizácia WPAD je aktívna. Bez ohľadu na to, či je toto pravidlo nastavené, alebo na spôsob, akým bolo nastavené, nemôžu používatelia nastavenie optimalizácie WPAD zmeniť.</translation> -<translation id="3071839057966069710">Umožňuje nakonfigurovať zoznam tlačiarní. - - Toto pravidlo umožňuje správcom poskytnúť používateľom konfigurácie - tlačiarní. - - <ph name="PRINTER_DISPLAY_NAME" /> a <ph name="PRINTER_DESCRIPTION" /> sú textové reťazce, ktoré si môžete prispôsobiť na zjednodušenie výberu tlačiarne. Hodnoty <ph name="PRINTER_MANUFACTURER" /> a <ph name="PRINTER_MODEL" /> slúžia na zjednodušenie identifikácie tlačiarní koncovými používateľmi. Predstavujú výrobcu a model tlačiarne. Hodnota <ph name="PRINTER_URI" /> by mala byť adresa dostupná z klientskeho počítača vrátane údajov <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> a <ph name="URI_QUEUE" />. Hodnota <ph name="PRINTER_UUID" /> je voliteľná. Ak je zadaná, používa sa na odstraňovanie duplicitných tlačiarní <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> musí zodpovedať niektorému reťazcu, ktorý predstavuje podporovanú tlačiareň <ph name="PRODUCT_NAME" />. Daný reťazec sa použije na identifikáciu a inštaláciu vhodného súboru PPD pre tlačiareň. Ďalšie informácie nájdete na https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> je boolovský príznak označujúci, či sa má tlačiareň nastaviť pomocou štandardu IPP Everywhere. Tento príznak podporuje prehliadač <ph name="PRODUCT_OS_NAME" /> od verzie 76 (vrátane nej). - - <ph name="PRINTER_EFFECTIVE_MODEL" /> by mal obsahovať názov tlačiarne alebo pravidlo <ph name="PRINTER_AUTOCONF" /> by malo byť nastavené na hodnotu true. Tlačiarne s nastavenými vlastnosťami aj bez nich budú ignorované. - - Nastavenie tlačiarne sa dokončí pri prvom použití. Súbory PPD sa stiahnu až pri použití tlačiarne. Často používané súbory PPD sa následne uložia do vyrovnávacej pamäte. - - Toto pravidlo nemá vplyv na to, či používatelia môžu konfigurovať tlačiarne v jednotlivých zariadeniach. Je určené ako doplnok konfigurácie tlačiarní jednotlivými používateľmi. - - V prípade spravovaných zariadení Active Directory toto pravidlo podporuje rozšírenie premennej <ph name="MACHINE_NAME_VARIABLE" /> na názov zariadenia Active Directory alebo jeho podradený reťazec. Ak je napríklad názov zariadenia <ph name="MACHINE_NAME_EXAMPLE" />, potom bude premenná <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> nahradená štyrmi znakmi nasledujúcimi po šiestom mieste, t. j. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Pozície sa počítajú od nuly. - </translation> <translation id="3072045631333522102">Šetrič obrazovky, ktorý sa má použiť na prihlasovacej obrazovke v režime určenom pre predaj</translation> <translation id="3072847235228302527">Nastaviť Zmluvné podmienky pre miestny účet v zariadení</translation> <translation id="3077183141551274418">Povolí alebo zakáže životné cykly kariet</translation> @@ -1339,13 +1320,6 @@ Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať. Ak toto pravidlo nenastavíte, funkcia prepnutia napájania počas špičky bude počiatočne zakázaná a používateľ ju nebude môcť povoliť.</translation> -<translation id="3388153794103186066">Umožňuje nastaviť zoznam webových adries určujúcich weby, ktorým je automaticky udelené povolenie na prístup k zariadeniu USB s príslušným dodávateľom alebo ID produktu. Pravidlo je platné, keď každá položka v zozname obsahuje zariadenia aj webové adresy. Každá položka v zariadeniach môže obsahovať polia pre identifikátor dodávateľa a ID produktu. Každý vynechaný identifikátor sa považuje za zástupný znak s jednou výnimkou, totiž že ID produktu sa nedá špecifikovať bez toho, aby ste zároveň neuviedli aj identifikátor dodávateľa. Ak to neurobíte, pravidlo bude neplatné a ignorované. - -Model povolení USB udeľuje pomocou adresy webu odosielajúceho žiadosť (žiadajúcej webovej adresy) a adresy rámcového webu najvyššej úrovne (webová adresa vkladania) povolenie žiadajúcej webovej adrese na prístup k zariadeniu USB. Žiadajúca webová adresa sa môže od webovej adresy vkladania líšiť, ak je načítaná v prvku iframe. Preto môže pole pre webové adresy obsahovať až dva reťazce webovej adresy oddelené čiarkou, ktoré špecifikujú žiadajúcu webovú adresu a webovú adresu vkladania. Ak určíte iba jednu webovú adresu, prístup k príslušným zariadeniam USB bude udelený iba vtedy, keď sa adresa webu odosielajúceho žiadosť zhoduje s touto webovou adresu bez ohľadu na stav vloženia. V poli pre webové adresy musíte zadať platné webové adresy, inak bude pravidlo ignorované. - -Ak toto pravidlo nenastavíte, globálna predvolená hodnota sa použije pre všetky weby buď z pravidla DefaultWebUsbGuardSetting (ak je nastavené), alebo osobnou konfiguráciou používateľa. - -Vzory webových adries v tomto pravidle by nemali byť v konflikte s tými, ktoré boli nakonfigurované prostredníctvom pravidla WebUsbBlockedForUrls. Ak sú v konflikte, toto pravidlo bude mať prednosť pred pravidlami WebUsbBlockedForUrls aj WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Ak toto pravidlo nenastavíte, <ph name="PRODUCT_NAME" /> použije predvolenú minimálnu verziu, teda TLS 1.0. V opačnom prípade ho môžete nastaviť na jednu z nasledujúcich hodnôt: „tls1“, „tls1.1“ alebo „tls1.2“. Ak túto hodnotu nastavíte, <ph name="PRODUCT_NAME" /> nepoužije protokol SSL alebo TLS v nižšej ako zadanej verzii. Nerozpoznaná hodnota sa bude ignorovať.</translation>
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index deb6f279..fb3dbfa 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -1208,25 +1208,6 @@ Če je ta pravilnik onemogočen, je optimizacija WPAD onemogočena, zaradi česa mora <ph name="PRODUCT_NAME" /> čakati dlje na strežnike WPAD, ki temeljijo na DNS-ju. Če pravilnik ni nastavljen ali je omogočen, je optimizacija WPAD omogočena. Neodvisno od tega, ali je pravilnik nastavljen oziroma kako je nastavljen, uporabniki ne morejo spremeniti nastavitve optimizacije WPAD.</translation> -<translation id="3071839057966069710">Konfigurira seznam tiskalnikov. - - Ta pravilnik skrbnikom omogoča navajanje konfiguracij tiskalnikov - za uporabnike. - - <ph name="PRINTER_DISPLAY_NAME" /> in <ph name="PRINTER_DESCRIPTION" /> sta poljubno oblikovana niza, ki ju je mogoče prilagoditi za preprostejše izbiranje tiskalnika. <ph name="PRINTER_MANUFACTURER" /> in <ph name="PRINTER_MODEL" /> končnim uporabnikom olajšata prepoznavo tiskalnika, saj predstavljata proizvajalca in model tiskalnika. <ph name="PRINTER_URI" /> mora biti naslov, do katerega je mogoče dostopati iz odjemalskega računalnika, vključno s temi podatki: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> in <ph name="URI_QUEUE" />. Identifikator <ph name="PRINTER_UUID" /> ni obvezen. Če je naveden, se uporablja za odstranjevanje podvojenih tiskalnikov <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> se mora ujemati z enim od nizov, ki predstavljajo tiskalnik s podporo za <ph name="PRODUCT_NAME" />. Niz se uporabi za odkrivanje in namestitev ustrezne datoteke PPD za tiskalnik. Več informacij je na voljo na https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> je logična zastavica, ki označuje, ali naj se za nastavitev tiskalnika uporabi IPP Everywhere. Ta zastavica je podprta v brskalniku <ph name="PRODUCT_OS_NAME" /> različice 76 in novejših. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> mora vsebovati ime tiskalnika ali mora biti <ph name="PRINTER_AUTOCONF" /> omogočen. Tiskalniki z obema lastnostma ali brez lastnosti bodo prezrti. - - Nastavitev tiskalnika je dokončana ob prvi uporabi tiskalnika. Datoteke PPD se ne prenesejo, dokler se tiskalnik ne uporablja. Po tem se pogosto uporabljene datoteke PPD predpomnijo. - - Ta pravilnik ne vpliva na to, ali lahko uporabniki konfigurirajo tiskalnike v posameznih napravah. Namenjen je kot dodatek konfiguracijam tiskalnikov, ki jih opravijo posamezni uporabniki. - - Za naprave, ki jih upravlja Active Directory, ta pravilnik podpira razširitev <ph name="MACHINE_NAME_VARIABLE" /> na ime naprave za Active Directory ali njegov podniz. Če je ime naprave na primer <ph name="MACHINE_NAME_EXAMPLE" />, potem <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zamenjajo 4 znaki po 6. mestu, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Položaj temelji na ničli. - </translation> <translation id="3072045631333522102">Ohranjevalnik zaslona na zaslonu za prijavo v maloprodajnem načinu</translation> <translation id="3072847235228302527">Nastavitev pogojev storitve za lokalni račun v napravi.</translation> <translation id="3077183141551274418">Omogoči ali onemogoči življenjske cikle zavihkov</translation> @@ -1366,13 +1347,6 @@ Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti. Če ta pravilnik ni nastavljen, je funkcija preklopa na akumulatorsko napajanje ob konicah sprva onemogočena in je uporabnik ne more omogočiti.</translation> -<translation id="3388153794103186066">Omogoča nastavitev seznama URL-jev, ki določajo, katerim spletnim mestom bo samodejno podeljeno dovoljenje za dostop do naprave USB z danim ID-jem izdelka in dobavitelja. Pravilnik je veljaven samo, če vsak element na seznamu vsebuje tako naprave kot tudi URL-je. Vsak element v napravah lahko vsebuje polje z ID-jem dobavitelja in ID-jem izdelka. Vsak izpuščen ID se obravnava kot nadomestni znak z eno izjemo, in sicer, da ID izdelka ne more biti naveden, ne da bi bil naveden tudi ID dobavitelja. Pravilnik sicer ne bo veljaven in bo prezrt. - - Model dovoljenj za USB uporablja URL spletnega mesta, ki pošlje zahtevo (»URL z zahtevo«), in URL spletnega mesta z vrhnjim okvirjem (»URL za vdelavo«), da URL-ju z zahtevo podeli dovoljenje za dostop do naprave USB. URL z zahtevo se lahko razlikuje od URL-ja za vdelavo, če je stran, ki pošilja zahtevo, naložena v okviru iframe. Polje »urls« lahko tako vsebuje do dva niza z URL-jem, ločena z vejico, ki določata URL z zahtevo oziroma URL za vdelavo. Če je naveden samo en URL, bo dostop do ustreznih naprav USB podeljen, ko se URL spletnega mesta, ki pošilja zahtevo, ujema s tem URL-jem, ne glede na stanje vdelave. URL-ji v polju »urls« morajo biti veljavni URL-ji, sicer se pravilnik prezre. - - Če ta pravilnik ni nastavljen, se za vsa spletna mesta uporabi globalna privzeta vrednost iz pravilnika »DefaultWebUsbGuardSetting«, če je nastavljen, sicer pa iz uporabnikove osebne konfiguracije. - - Vzorci URL-jev v tem pravilniku ne smejo biti v navzkrižju s tistimi, ki so konfigurirani prek pravilnika WebUsbBlockedForUrls. V primeru navzkrižja ima ta pravilnik prednost pred pravilnikoma WebUsbBlockedForUrls in WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Če ta pravilnik ni konfiguriran, <ph name="PRODUCT_NAME" /> uporablja privzeto najnižjo različico, ki je TLS 1.0. Sicer bo nastavljen na eno od teh vrednosti: »tls1«, »tls1.1« ali »tls1.2«. Če je nastavljen, <ph name="PRODUCT_NAME" /> ne bo uporabljal različic protokolov SSL/TLS, nižjih od navedene različice. Neprepoznane vrednosti bodo prezrte.</translation>
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index 1f23a35c..91a3fc9c 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -1182,25 +1182,6 @@ Ако су ове смернице подешене на Тачно, оптимизација WPAD-а је онемогућена и због тога ће <ph name="PRODUCT_NAME" /> дуже чекати на одговор WPAD сервера заснованих на DNS-у. Ако ове смернице нису подешене или су омогућене, оптимизација WPAD-а је омогућена. Без обзира на то како су ове смернице подешене, корисници не могу да промене подешавање оптимизације WPAD-а.</translation> -<translation id="3071839057966069710">Конфигуришу листу штампача. - - Ове смернице омогућавају администраторима да корисницима пруже - конфигурације штампача. - - <ph name="PRINTER_DISPLAY_NAME" /> и <ph name="PRINTER_DESCRIPTION" /> су стрингови слободног облика који могу да се прилагоде ради једноставног бирања штампача. <ph name="PRINTER_MANUFACTURER" /> и <ph name="PRINTER_MODEL" /> омогућавају крајњим корисницима да једноставније идентификују штампач. Представљају произвођача и модел штампача. <ph name="PRINTER_URI" /> треба да буде адреса која је доступна рачунару клијента, укључујући <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> и <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> је опционалан. Ако је наведен, користи се за поништавање дупликата штампача <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> мора да се подудара са једним од стрингова који представљају штампач са <ph name="PRODUCT_NAME" /> подршком. Овај стринг ће се користити за идентификацију и инсталирање одговарајуће PPD датотеке за штампач. Више информација потражите на https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> је ознака логичке вредности која означава да ли IPP Everywhere треба да се користи за подешавање рачунара. Та ознака је подржана у производу <ph name="PRODUCT_OS_NAME" /> верзије 76 и новијим верзијама. - - Или <ph name="PRINTER_EFFECTIVE_MODEL" /> треба да садржи назив штампача или <ph name="PRINTER_AUTOCONF" /> треба да се подеси на Тачно. Штампачи са оба својства или без иједног својства биће занемарени. - - Подешавање штампача се завршава при првом коришћењу штампача. PPD датотеке се не преузимају пре коришћења штампача. Често коришћене PPD датотеке се кеширају после тога. - - Ове смернице не утичу на могућност корисника да конфигуришу штампаче на појединачним уређајима. Служе као додатак конфигурацији штампача од стране појединачних корисника. - - Када су у питању уређаји којима управља домен Active Directory, ове смернице подржавају проширивање назива уређаја <ph name="MACHINE_NAME_VARIABLE" /> у Active Directory назив уређаја или његов подстринг. На пример, ако је назив уређаја <ph name="MACHINE_NAME_EXAMPLE" />, онда ће назив <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> бити замењен са 4 знака која почињу после 6. места, тј.<ph name="MACHINE_NAME_PART_EXAMPLE" />. Имајте на уму да бројање места почиње од нуле. - </translation> <translation id="3072045631333522102">Чувар екрана који ће се користити на екрану за пријављивање у режиму малопродаје</translation> <translation id="3072847235228302527">Подешавање Услова коришћења услуге за локални налог на уређају</translation> <translation id="3077183141551274418">Омогућавају или онемогућавају животни циклус картица</translation> @@ -1340,13 +1321,6 @@ Ако подесите ове смернице, корисници неће моћи да их измене или замене. Ако се смернице не подесе, пребацивање ради уштеде енергије је првобитно онемогућено и корисници не могу да га омогуће.</translation> -<translation id="3388153794103186066">Омогућавају вам да подесите листу URL-ова који наводе сајтове којима ће се аутоматски дати дозвола за приступ USB уређају са наведеним ИД-ом добављача и ИД-ом производа. Свака ставка на листи мора да садржи и уређаје и URL-ове да би смернице биле важеће. Свака ставка за уређаје може да садржи поље за ИД добављача и ИД производа. Сваки изостављени ИД се сматра џокерским знаком са једним изузетком, а тај изузетак је да ИД производа не може да се наведе без навођења ИД-а добављача. У супротном ове смернице неће бити важеће и занемариће се. - - Модел дозволе за USB користи URL сајта који шаље захтев („URL који шаље захтев“) и URL сајта са оквиром највишег нивоа („URL који се уграђује“) да би дозволио да URL који шаље захтев приступа USB уређају. URL који шаље захтев може да се разликује од URL-а који се уграђује када се сајт који шаље захтев учитава у iframe-у. Због тога поље „URL-ови“ може да садржи највише два URL низа раздвојена зарезом да би се одредио URL који шаље захтев и URL који се уграђује. Ако се наведе само један URL, приступ одговарајућим USB уређајима ће се одобрити када се URL сајта који шаље захтев подудара са тим URL-ом, без обзира на статус уграђивања. URL-ови у пољу „URL-ови“ морају да буду важећи јер се, у супротном, смернице занемарују. - - Ако не подесите ове смернице, за све сајтове користиће се глобална подразумевана вредност из смерница „DefaultWebUsbGuardSetting“ ако су подешене или из личне корисничке конфигурације. - - URL обрасци у овим смерницама не треба да буду у сукобу са онима који су конфигурисани помоћу смерница WebUsbBlockedForUrls. Ако дође до сукоба, ове смернице ће имати приоритет у односу на смернице WebUsbBlockedForUrls и WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Ако се ове смернице не конфигуришу, онда ће <ph name="PRODUCT_NAME" /> користити подразумевану минималну верзију TLS 1.0. У супротном, смернице могу да се подесе на једну од следећих вредности: „tls1“, „tls1.1“ или „tls1.2“. Након подешавања <ph name="PRODUCT_NAME" /> неће користити SSL/TLS верзије испод наведене верзије. Вредности које не буду препознате ће бити игнорисане.</translation>
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index bf76463..ea69493 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -1208,25 +1208,6 @@ Om principen är inställd på falskt är WPAD-optimeringen inaktiverad, vilket innebär att <ph name="PRODUCT_NAME" /> får vänta längre på DNS-baserade WPAD-servrar. Om principen inte har konfigurerats eller har aktiverats är WPAD-optimeringen aktiverad. Oavsett om eller hur principen har konfigurerats kan inte WPAD-optimeringen ändras av användare.</translation> -<translation id="3071839057966069710">Konfigurerar en lista över skrivare. - - Med hjälp av den här principen kan administratören tillhandahålla - skrivarkonfigurationer åt användarna. - - <ph name="PRINTER_DISPLAY_NAME" /> och <ph name="PRINTER_DESCRIPTION" /> är strängar i fritt format som kan anpassas så att det blir enkelt att välja skrivare. <ph name="PRINTER_MANUFACTURER" /> och <ph name="PRINTER_MODEL" /> gör det enklare för användarna att identifiera skrivaren och står för tillverkare och märke. <ph name="PRINTER_URI" />ska vara en adress som går att nå från en klientdator, inklusive <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> och <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> är valfritt. Om det anges används det för att deduplicera <ph name="ZEROCONF_DISCOVERY" />-skrivare. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> måste matcha någon av strängarna som står för en skrivare som stöds i <ph name="PRODUCT_NAME" />. Strängen används för att identifiera och installera rätt PPD-fil för skrivaren. Mer information finns på https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> är en boolesk flagga som anger om skrivaren ska konfigureras med IPP Everywhere. Flaggan stöds i version 76 eller senare av <ph name="PRODUCT_OS_NAME" />. - - Antingen ska <ph name="PRINTER_EFFECTIVE_MODEL" /> innehålla skrivarens namn eller så ska <ph name="PRINTER_AUTOCONF" /> vara inställt på sant. Om en skrivare har båda värdena eller saknar egenskaper ignoreras den. - - Skrivarkonfigureringen slutförs första gången en skrivare används. Inga PPD-filer laddas ned förrän skrivaren används. Därefter cachelagras PPD-filer som används ofta. - - Principen påverkar inte om användarna kan konfigurera skrivare på enskilda enheter eller inte. Den är tänkt att vara ett supplement till de enskilda användarnas skrivarkonfiguration. - - På enheter som hanteras via Active Directory har principen stöd för att utöka <ph name="MACHINE_NAME_VARIABLE" /> till datornamnet i Active Directory eller en delsträng av det. Med datornamnet <ph name="MACHINE_NAME_EXAMPLE" /> skulle till exempel <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ersättas av de fyra tecknen från och med position nummer sex, d.v.s. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Observera att positionerna räknas från och med noll. - </translation> <translation id="3072045631333522102">Skärmsläckare att använda på inloggningsskärmen i återförsäljarläge</translation> <translation id="3072847235228302527">Ange användarvillkor för ett lokalt enhetskonto</translation> <translation id="3077183141551274418">Aktiverar eller inaktiverar en livscykel för flikar</translation> @@ -1366,13 +1347,6 @@ Om du ställer in den här principen kan användarna inte ändra eller åsidosätta den. Om principen saknar inställning är belastningsförskjutning inaktiverat från start och användarna kan inte aktivera det.</translation> -<translation id="3388153794103186066">Gör att du kan ange en lista med webbadresser som styr vilka webbplatser som automatiskt ska ges åtkomstbehörighet till en USB-enhet med angivet leverantörs- och produkt-id. Varje post i listan måste innehålla både enheter och webbadresser för att principen ska gälla. Varje enhetspost kan ha ett fält för leverantörs-id och ett för produkt-id. Om ett id utelämnas fungerar det som om ett jokertecken hade angetts, med ett undantag: det går inte att ange ett produkt-id om inget leverantörs-id har angetts. I så fall blir principen ogiltig och ignoreras. - - Med behörighetsmodellen för USB används webbadressen till den webbplats som begäran kommer från (den ”begärande” webbadressen) och webbadressen till ramen på toppnivå (den ”inbäddande” webbplatsen) när den begärande webbadressen ska ges åtkomstbehörighet till USB-enheten. Den begärande webbadressen behöver inte vara samma som den inbäddande webbadressen, om webbadressen som begäran kommer från har lästs in i en iframe. Därför kan webbadressfältet innehålla upp till två kommaavgränsade strängar som anger den begärande respektive inbäddande webbadressen. Om bara en webbadress har angetts kommer åtkomstbehörighet till USB-enheten att beviljas om den begärande webbadressen matchar denna, oavsett om den har bäddats in eller inte. Webbadresserna i webbadressfältet måste vara giltiga. I annat fall ignoreras principen. - - Om administratören har lämnat principen utan inställning används det globala standardvärdet för alla webbplatser, som hämtas antingen från principen DefaultWebUsbGuardSetting om den har ställts in eller från användarens konfiguration om den inte har det. - - Webbadressmönstren i den här principen får inte överlappa dem som konfigurerats via WebUsbBlockedForUrls. I händelse av konflikt har den här principen företräde framför WebUsbBlockedForUrls och WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Om denna princip inte konfigureras används den lägsta standardversionen (TLS 1.0.) av <ph name="PRODUCT_NAME" />. I annat fall kan följande värden anges: tls1, tls1.1 eller tls1.2. Om ett värde har angetts används inte versioner av SSL/TLS som är tidigare än den angivna versionen av <ph name="PRODUCT_NAME" />. Ett värde som inte känns igen ignoreras.</translation>
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index 842ed1b..b9d6ee0e 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -1179,24 +1179,6 @@ Sera hii ikiwekwa kuwa sivyo, uboreshaji wa WPAD utazimwa na kusababisha <ph name="PRODUCT_NAME" /> kusubiri muda mrefu zaidi kwa seva za WPAD zinazotegemea DNS. Sera hii isipowekwa au ikiwashwa, uboreshaji wa WPAD utawashwa. Kwa kutotogemea ikiwa au jinsi sera hii inavyowekwa, mipangilio ya uboreshaji wa WPAD haiwezi kubadilishwa na watumiaji.</translation> -<translation id="3071839057966069710">Huweka mipangilio ya orodha ya printa. - - Sera hii huruhusu wasimamizi kuweka mipangilio ya printa kwa ajili ya watumiaji wake. - - <ph name="PRINTER_DISPLAY_NAME" /> na <ph name="PRINTER_DESCRIPTION" /> ni mifuatano huru ambayo inaweza kuwekewa mapendeleo ili kurahisisha shughuli ya kuchagua printa. <ph name="PRINTER_MANUFACTURER" /> na <ph name="PRINTER_MODEL" /> hutumika kurahisisha shughuli ya kutambua printa kwa watumiaji wake wa mwisho. Huwakilisha mtengenezaji na muundo wa printa. <ph name="PRINTER_URI" /> inapaswa kuwa anwani ambayo inafikiwa kutoka kompyuta teja, ikiwa ni pamoja na <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> na <ph name="URI_QUEUE" />. Si lazima <ph name="PRINTER_UUID" /> iwekwe. Ikiwekwa, itasaidia kuondoa nakala za printa za <ph name="ZEROCONF_DISCOVERY" />. - - Ni lazima <ph name="PRINTER_EFFECTIVE_MODEL" /> ilingane na mojawapo ya mifuatano inayowakilisha printa inayotumika ya <ph name="PRODUCT_NAME" />. Mfuatano huo utatumiwa kutambua na kusakinisha PPD inayofaa kwenye printa. Maelezo zaidi yanaweza kupatikana katika https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> ni ripoti ya Boolean inayoonyesha ikiwa IPP Everywhere inapaswa kutumika kuweka mipangilio ya printa. Ripoti hii inatumika kwenye <ph name="PRODUCT_OS_NAME" /> toleo la 76 na mapya zaidi. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> inapaswa kuwa na jina la printa au <ph name="PRINTER_AUTOCONF" /> inapaswa kuwekwa kuwa 'ndivyo'. Printa zenye sifa zote mbili au zisizo na sifa yoyote hazitatumika. - - Shughuli ya kuweka mipangilio ya printa hukamilika baada ya kutumia printa mara ya kwanza. PPD hazipakuliwi mpaka printa itumike. Baada ya hapo, PPD zinazotumiwa sana huwekwa katika akiba. - - Sera hii haiwezi kubaini iwapo watumiaji wanaweza kuweka mipangilio ya printa kwenye vifaa mahususi. Inakusudiwa kuwa mbinu ya ziada ya kuweka mipangilio ya printa na watumiaji mahususi. - - Kwa vifaa vinavyodhibitiwa na Saraka Inayotumika, sera hii inatumia upanuzi wa <ph name="MACHINE_NAME_VARIABLE" /> kwenye jina la mashine ya Saraka Inayotumika au kiambishi husika cha msimbo. Kwa mfano, ikiwa jina la mashine ni<ph name="MACHINE_NAME_EXAMPLE" />, inamaanisha kuwa nafasi ya <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> itawekwa herufi 4 baada ya nafasi ya 6, yaani <ph name="MACHINE_NAME_PART_EXAMPLE" />. Kumbuka kwamba nafasi hii inatumia sufuri. - </translation> <translation id="3072045631333522102">Seva ya skrini kutumiwa kwenye skrini ya kuingia katika modi rejareja</translation> <translation id="3072847235228302527">Weka Sheria na Masharti kwa akaunti ya kifaa cha karibu nawe</translation> <translation id="3077183141551274418">Huwasha au kuzima muda wa matumizi ya kichupo</translation> @@ -1337,13 +1319,6 @@ Sera hii ikiwekwa, watumiaji hawawezi kuibadilisha au kuibatilisha. Sera hii isipowekwa, kipengele kinachopunguza matumizi ya betri kwa kubadilisha mfumo kuendeshwa kwenye nguvu za betri kitazima kwanza na hakiwezi kuwashwa na mtumiaji.</translation> -<translation id="3388153794103186066">Hukuruhusu kuweka orodha ya urls ambazo zinabainisha tovuti zitakazopewa ruhusa kiotomatiki ya kufikia kifaa cha USB chenye Vitambulisho husika vya muuzaji na bidhaa. Lazima kila kipengee kwenye orodha kijumuishe vifaa na urls ili sera itumike. Kila kipengee kwenye vifaa kinaweza kujumuisha sehemu ya Kitambulisho cha muuzaji na Kitambulisho cha bidhaa. Kitambulisho chochote kisichowekwa kinachukuliwa kuwa herufi wakilishi isiyofuata kanuni moja na kanuni hii ni kwamba kitambulisho cha bidhaa hakiwezi kubainishwa bila kitambulisho cha muuzaji kubainishwa pia. Vinginevyo, sera haitakuwa sahihi na itapuuzwa. - - Muundo wa ruhusa za USB hutumia URL ya tovuti inayotuma ombi ("URL inayotuma ombi") na URL ya tovuti maarufu ya fremu ("URL iliyopachikwa") ili kutoa ruhusa kwa URL inayotuma ombi iweze kufikia kifaa cha USB. URL inayotuma ombi inaweza kuwa tofauti na URL iliyopachikwa wakati tovuti inayotuma ombi imepakiwa kwenye iframe. Kwa hivyo, sehemu ya "urls" inaweza kujumuisha hadi mifuatano miwili ya URL inayotenganishwa kwa koma ili kubainisha URL ya kutuma ombi na URL iliyopachikwa mtawalia. Ikiwa URL moja tu imebainishwa, basi ufikiaji wa vifaa vinavyolingana vya USB utatolewa wakati URL ya tovuti inayotuma ombi inalingana na URL hii bila kuzingatia hali ya upachikwaji. Lazima URL kwenye "urls" ziwe URL sahihi, vinginevyo sera hii itapuuzwa. - - Sera hii isipowekwa, thamani chaguomsingi ya jumla itatumiwa kwenye tovuti zote, kutoka sera ya 'DefaultWebUsbGuardSetting' ikiwa sera imewekwa au vinginevyo kutoka mipangilio ya binafsi ya mtumiaji. - - Ruwaza za URL katika sera hii hazipaswi kukinzana na zile ambazo mipangilio yake huwekwa kupitia WebUsbBlockedForUrls. Kama zinakinzana, sera hii itatumika kwanza kabla ya WebUsbBlockedForUrls na WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Ikiwa hujaweka mipangilio ya sera hii inamaanisha kuwa <ph name="PRODUCT_NAME" /> itatumia toleo la chini zaidi katika mipangilio chaguomsingi ambalo ni TLS 1.0. Vinginevyo, inaweza kuwekwa kuwa mojawapo ya thamani zifuatazo: "tls1", "tls1.1" au "tls1.2". Ikiwekwa, <ph name="PRODUCT_NAME" /> itatumia matoleo ya SSL/TLS yaliyo chini ya toleo lililobainishwa. Haitazingatia thamani ambayo haitambuliki.</translation>
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index f19334b..54074d6 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -1159,25 +1159,6 @@ இந்தக் கொள்கை false என அமைக்கப்பட்டால், WPAD மேம்படுத்துதல் முடக்கப்பட்டு DNS-சார்ந்த WPAD சேவையகங்களுக்கு <ph name="PRODUCT_NAME" /> நீண்ட நேரம் காத்திருக்க வேண்டியதிருக்கும். கொள்கை அமைக்கப்படாவிட்டாலோ இயக்கப்பட்டாலோ, WPAD மேம்படுத்துதல் இயக்கப்படும். இந்தக் கொள்கை எவ்வாறு அமைக்கப்பட்டாலும், பயனர்களால் WPAD மேம்படுத்துதல் அமைப்பை மாற்ற முடியாது.</translation> -<translation id="3071839057966069710">சில வகையான பிரிண்ட்டர்களை உள்ளமைக்கும். - - நிர்வாகிகள் பிரிண்ட்டருக்கான உள்ளமைவுகளைப் பயனர்களுக்கு வழங்கிட - இந்தக் கொள்கை அனுமதிக்கும். - - <ph name="PRINTER_DISPLAY_NAME" /> மற்றும் <ph name="PRINTER_DESCRIPTION" /> ஆகியவை பிரிண்ட்டர் தேர்வை எளிதாக்கும் வகையில் உள்ளமைக்கக்கூடிய வார்த்தைகளாகும். இறுதிப் பயனர்கள் பிரிண்ட்டரை எளிதாக அடையாளம் காண்பதற்கு <ph name="PRINTER_MANUFACTURER" /> மற்றும் <ph name="PRINTER_MODEL" /> ஆகியவை உதவும். அவை பிரிண்ட்டரின் உற்பத்தியாளரையும் மாடலையும் குறிக்கின்றன. <ph name="PRINTER_URI" /> என்பது கிளையண்ட் கம்ப்யூட்டரிலிருந்து தொடர்புகொள்ளத்தக்க முகவரியாக இருக்க வேண்டும். அது <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> ஆகியவற்றைக் கொண்டிருக்க வேண்டும். <ph name="PRINTER_UUID" />ஐ விரும்பினால் வழங்கலாம். அவ்வாறு வழங்கினால் அது <ph name="ZEROCONF_DISCOVERY" /> பிரிண்ட்டர்களின் நகல்களை நீக்குவதற்குப் பயன்படுத்தப்படும். - - <ph name="PRODUCT_NAME" /> ஆதரிக்கும் பிரிண்ட்டரைக் குறிக்கும் வார்த்தைகளில் ஒன்றுடன் <ph name="PRINTER_EFFECTIVE_MODEL" /> பொருந்த வேண்டும். இந்த வார்த்தை பிரிண்ட்டருக்கான சரியான PPDயை அடையாளங்கண்டு நிறுவப் பயன்படுத்தப்படும். கூடுதல் தகவலைப் பின்வரும் இணைப்பில் பார்க்கலாம்: https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> என்பது பிரிண்ட்டரை அமைப்பதற்கு IPP Everywhereரைப் பயன்படுத்த வேண்டுமா என்பதைக் குறிக்கும் பூலியன் கொடியிடல் ஆகும். <ph name="PRODUCT_OS_NAME" />ன் 76வது மற்றும் அதற்கு மேம்பட்ட பதிப்பில் இந்தக் கொடியிடல் ஆதரிக்கப்படும். - - <ph name="PRINTER_EFFECTIVE_MODEL" />ல் பிரிண்ட்டரின் பெயர் குறிப்பிடப்பட்டிருக்க வேண்டும் அல்லது <ph name="PRINTER_AUTOCONF" /> என்பது 'சரி' என அமைக்கப்பட வேண்டும். இந்த இரண்டையும் கொண்டிருந்தாலோ இதில் பண்புகள் எதுவுமே இல்லாமல் இருந்தாலோ ஏற்றுக் கொள்ளப்படாது. - - பிரிண்ட்டரை முதல்முறை பயன்படுத்தும்போதே அது அமைக்கப்பட்டுவிடும். பிரிண்ட்டரைப் பயன்படுத்தும் வரை PPDகள் பதிவிறக்கப்படாது. அதன் பின்னர் அடிக்கடிப் பயன்படுத்தும் PPDகள் தற்காலிகமாகச் சேமிக்கப்படும். - - தனிநபர் சாதனங்களில் பிரிண்ட்டர்களைப் பயனர்கள் உள்ளமைப்பது குறித்து இந்தக் கொள்கையில் வரம்பிடப்படவில்லை. தனிப்பட்ட பயனர்கள் பிரிண்ட்டர்களை உள்ளமைக்க உதவியாக இருக்கவே இது உருவாக்கப்பட்டது. - - ‘ஆக்டிவ் டைரக்டரி’ நிர்வகிக்கும் சாதனங்களுக்கு <ph name="MACHINE_NAME_VARIABLE" />ஐ ‘ஆக்டிவ் டைரக்டரி’ சாதனத்தின் பெயருக்கோ அதன் உட்சரத்திற்கோ நீட்டிப்பதை இந்தக் கொள்கை அனுமதிக்கும். எடுத்துக்காட்டாக, சாதனத்தின் பெயர் <ph name="MACHINE_NAME_EXAMPLE" /> எனில் 6வது நிலைக்குப் (அதாவது <ph name="MACHINE_NAME_PART_EXAMPLE" /> இலிருந்து) பிறகு தொடங்கும் 4 எழுத்துகளால் <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> மாற்றியமைக்கப்படும். கவனத்திற்கு: அந்த நிலையானது பூஜ்ஜியத்தை அடிப்படையாகக் கொண்டது. - </translation> <translation id="3072045631333522102">விற்பனை பயன்முறையின் உள்நுழைவு திரையில் ஸ்கிரீன் சேவர் பயன்படுத்தப்படலாம்</translation> <translation id="3072847235228302527">சாதன-அகக் கணக்கிற்கான சேவை விதிமுறைகளை அமைக்கவும்</translation> <translation id="3077183141551274418">தாவல் காலச்சுழற்சிகளை இயக்கும் அல்லது முடக்கும்</translation> @@ -1313,13 +1294,6 @@ நீங்கள் அமைத்த கொள்கையைப் பயனர்கள் மாற்றவோ மேலெழுதவோ இயலாது. இந்தக் கொள்கையை அமைக்கவில்லை எனில் தொடக்கத்திலேயே power peak shift முடங்கிவிடும், அதன்பிறகு பயனரால் அதை இயக்க இயலாது.</translation> -<translation id="3388153794103186066">குறிப்பிட்ட விற்பனையாளர் ஐடியையும் தயாரிப்பு ஐடிகளையும் கொண்ட ஒரு USB சாதனத்தை அணுகுவதற்குத் தானாக அனுமதி வழங்கப்படும் தளங்களைக் குறிப்பிடுகின்ற urlகளின் பட்டியலை அமைக்க உங்களை அனுமதிக்கும். கொள்கை செல்லுபடியாவதற்கு, இந்தப் பட்டியலில் உள்ள அனைத்திலும் சாதனங்களும் urlகளும் இருக்க வேண்டும். சாதனங்களிலுள்ள ஒவ்வொன்றிலும் ஒரு விற்பனையாளர் ஐடி புலமும் தயாரிப்பு ஐடி புலமும் இருக்கலாம். தவிர்க்கப்படும் எந்தவொரு ஐடியும் விதிவிலக்குள்ள ஒரு வைல்டுகார்டாகக் கருதப்படும், விற்பனையாளர் ஐடி இல்லாமல் தயாரிப்பு ஐடியைக் குறிப்பிட முடியாது என்பதே அந்த விதிவிலக்கு. அப்படி இல்லாவிட்டால், கொள்கை செல்லுபடியாகாது. செல்லுபடியாகாத கொள்கை மதிப்புகள் புறக்கணிக்கப்படும். - - USB சாதனத்தை அணுகுவதற்குக் கோருகின்ற URLலுக்கு அனுமதியை வழங்க, கோருகின்ற தளத்தின் URLலையும் (”கோருகின்ற URL”) மேல் நிலை ஃபிரேம் தளத்தின் URLலையும் (”உட்பொதிக்கின்ற URL”) USB அனுமதி மாதிரி பயன்படுத்தும். கோருகின்ற தளத்தை iframeமில் ஏற்றும்போது, கோருகின்ற URLலும் உட்பொதிக்கின்ற URLலும் வெவ்வேறாக இருக்கலாம். அதனால், கோருகின்ற URLலையும் உட்பொதிக்கின்ற URLலையும் முறையே குறிப்பிடுவதற்காக, "urlகள்” புலத்தில் காற்புள்ளியால் பிரிக்கப்பட்ட இரண்டு URLகள் வரை இருக்கலாம். ஒரு URL மட்டும் குறிப்பிடப்பட்டிருந்தால், உட்பொதிக்கும் நிலை எதுவாக இருந்தாலும், கோருகின்ற தளத்தின் URLலும் இந்த URLலும் பொருந்தும்போது, தொடர்புடைய USB சாதனங்களுக்கான அணுகல் அளிக்கப்படும். "urlகளில்” உள்ள URLகள் செல்லுபடியாகும் URLகளாக இருக்க வேண்டும், இல்லாவிட்டால் அந்தக் கொள்கை புறக்கணிக்கப்படும். - - இந்தக் கொள்கையை அமைக்கவில்லை எனில், எல்லாத் தளங்களுக்கும் ஒட்டுமொத்த இயல்பு மதிப்பு பயன்படுத்தப்படும். அப்படி அமைக்கப்படும் மதிப்பு, 'DefaultWebUsbGuardSetting' கொள்கையில் குறிப்பிடப்பட்டிருக்கும் மதிப்பாகவோ (ஏற்கனவே அமைக்கப்பட்டிருந்தால்) பயனரின் தனிப்பட்ட உள்ளமைவின் மதிப்பாகவோ இருக்கும். - - இந்தக் கொள்கையின் URL பேட்டர்ன்கள், WebUsbBlockedForUrls கொள்கை மூலம் உள்ளமைக்கப்பட்டுள்ளவற்றுடன் முரண்படக்கூடாது. அப்படி முரண்பட்டால், WebUsbBlockedForUrls மற்றும் WebUsbAskForUrls கொள்கைகளை விட இந்தக் கொள்கைக்கே முன்னுரிமை வழங்கப்படும்.</translation> <translation id="3414260318408232239">இந்தக் கொள்கை உள்ளமைக்கப்படவில்லை எனில், <ph name="PRODUCT_NAME" /> இயல்பு குறைந்தபட்ச பதிப்பைப் (TLS 1.0) பயன்படுத்தும். இல்லையெனில், அது பின்வரும் மதிப்புகளில் ஏதேனும் ஒன்றுக்கு அமைக்கப்படலாம்: "tls1", "tls1.1" அல்லது "tls1.2". அவ்வாறு அமைக்கப்பட்டால், குறிப்பிட்ட பதிப்பிற்குக் குறைவான SSL/TLS பதிப்புகளை <ph name="PRODUCT_NAME" /> பயன்படுத்தாது. அறியப்படாத மதிப்பு புறக்கணிக்கப்படும்.</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index 4290b8fa..4ca945b 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -1164,25 +1164,6 @@ ఈ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే ఆప్టిమైజేషన్ నిలిపివేయబడుతుంది, దీని వలన DNS ఆధారిత WPAD సర్వర్ల కోసం <ph name="PRODUCT_NAME" /> ఎక్కువ వ్యవధి పాటు వేచి ఉండాల్సి ఉంటుంది. ఈ విధానాన్ని సెట్ చేయకపోతే లేదా ప్రారంభిస్తే, WPAD ఆప్టిమైజేషన్ ప్రారంభించబడుతుంది. ఈ విధానం సెట్ చేయబడిందా లేదా లేదంటే సెట్ చేయబడిన పక్షంలో ఎలా సెట్ చేయబడింది అనే వాటితో సంబంధం లేకుండా, వినియోగదారులు WPAD ఆప్టిమైజేషన్ సెట్టింగ్ను మార్చలేరు.</translation> -<translation id="3071839057966069710">ప్రింటర్ల జాబితాను కాన్ఫిగర్ చేస్తుంది. - - తమ వినియోగదారుల కోసం ప్రింటర్ కాన్ఫిగరేషన్లను అందించడానికి నిర్వాహకులను - ఈ విధానం అనుమతిస్తుంది. - - <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> అన్నవి ప్రింటర్ ఎంపికను సులభతరం చేయడం కోసం అనుకూల విధంగా మార్చుకోగలిగే స్వతంత్ర రూపంలోని స్ట్రింగ్లు. <ph name="PRINTER_MANUFACTURER" />, <ph name="PRINTER_MODEL" /> అన్నవి తుది వినియోగదారులకు ప్రింటర్ గుర్తింపును సులభతరం చేస్తాయి. అవి ప్రింటర్ తయారీదారు బ్రాండ్ పేరు, మోడల్ను సూచిస్తాయి. <ph name="PRINTER_URI" /> అనేది <ph name="URI_SCHEME" />, <ph name="URI_PORT" />,<ph name="URI_QUEUE" />తో సహా క్లయింట్ కంప్యూటర్ నుండి చేరుకోగలిగే చిరునామా అయి ఉండాలి. <ph name="PRINTER_UUID" /> అనేది ఐచ్ఛికం. ఒకవేళ అందిస్తే, అది <ph name="ZEROCONF_DISCOVERY" /> ప్రింటర్ల నకిలీలను తీసివేయడంలో సహాయపడడానికి ఉపయోగించబడుతుంది. - - <ph name="PRODUCT_NAME" /> మద్దతు గల ప్రింటర్ను సూచించే స్ట్రింగ్లలో ఒక దానితో <ph name="PRINTER_EFFECTIVE_MODEL" /> తప్పనిసరిగా సరిపోలాలి. ప్రింటర్ కోసం సరైన PPDని గుర్తించి, ఇన్స్టాల్ చేయడానికి ఈ స్ట్రింగ్ ఉపయోగించబడుతుంది. https://support.google.com/chrome?p=noncloudprintలో మరింత సమచారం పొందవచ్చు. - - <ph name="PRINTER_AUTOCONF" /> అన్నది ప్రింటర్ను సెటప్ చేయడానికి IPPని ప్రతిచోటా ఉపయోగించాలా వద్దా అనేది సూచించే బూలియన్ ఫ్లాగ్. ఈ ఫ్లాగ్ <ph name="PRODUCT_OS_NAME" /> వెర్షన్ 76, అంతకంటే తర్వాతి వెర్షన్లకు మద్దతు ఇస్తుంది. - - <ph name="PRINTER_EFFECTIVE_MODEL" />లో ప్రింటర్ పేరు ఉండాలి లేదా <ph name="PRINTER_AUTOCONF" />ను ఒప్పునకు సెట్ చేయాలి. రెండు లక్షణాలు ఉన్నవి లేదా ఏ లక్షణమూ లేని ప్రింటర్లు విస్మరించబడతాయి. - - ప్రింటర్ మొదటి వినియోగం తర్వాత ప్రింటర్ సెటప్ పూర్తవుతుంది. ప్రింటర్ ఉపయోగించే వరకు PPDలు డౌన్లోడ్ చేయబడవు. ఆ సమయం తర్వాత, తరచూ ఉపయోగించే PPDలు కాష్ చేయబడతాయి. - - వినియోగదారులు వేర్వేరు పరికరాల్లో ప్రింటర్లను కాన్ఫిగర్ చేసే విషయంలో ఈ విధానం ఎలాంటి ప్రభావం చూపదు. ఇది వేర్వేరు వినియోగదారులు ప్రింటర్ల కాన్ఫిగరేషన్కు అనుబంధంగా ఉండేలా ఉద్దేశించినది. - - Active Directory నిర్వాహిత పరికరాలకు సంబంధించి, <ph name="MACHINE_NAME_VARIABLE" />ను Active Directory మెషిన్ పేరుకు లేదా దాని సబ్స్ట్రింగ్కు విస్తరించగలిగేలా ఈ విధానం మద్దతిస్తుంది. ఉదాహరణకు, మెషిన్ పేరు <ph name="MACHINE_NAME_EXAMPLE" /> అయితే, ఆపై <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> అనేది 6వ స్థానం తర్వాతి 4 అక్షరాలు, అంటే <ph name="MACHINE_NAME_PART_EXAMPLE" />తో.భర్తీ చేయబడుతుంది. స్థానం శూన్య-ఆధారితమని గుర్తుంచుకోండి. - </translation> <translation id="3072045631333522102">రిటైల్ మోడ్లో సైన్-ఇన్ స్క్రీన్లో ఉపయోగించాల్సిన స్క్రీన్ సేవర్</translation> <translation id="3072847235228302527">పరికరం-స్థానిక ఖాతా కోసం సేవా నిబంధనలను సెట్ చేయడం</translation> <translation id="3077183141551274418">ట్యాబ్ లైఫ్సైకిల్లను ప్రారంభించండి లేదా నిలిపివేయండి</translation> @@ -1318,13 +1299,6 @@ మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారులు దీన్ని మార్చలేరు లేదా అధిగమించలేరు. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, ప్రారంభంలో గరిష్ఠ పవర్ షిఫ్ట్ నిలిపివేయబడుతుంది మరియు వినియోగదారు దీన్ని ప్రారంభించలేరు.</translation> -<translation id="3388153794103186066">పేర్కొనబడిన విక్రేత మరియు ఉత్పత్తి IDలతో USB పరికరాన్ని యాక్సెస్ చేయడానికి ఆటోమేటిక్గా అనుమతి మంజూరు చేయబడిన సైట్లను పేర్కొనే urlల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. విధానం చెల్లుబాటు కావాలంటే, జాబితాలో ప్రతి అంశం తప్పనిసరిగా పరికరాలు మరియు urlలు రెండింటినీ కలిగి ఉండాలి. పరికరాలలోని ప్రతి అంశం విక్రేత ID మరియు ఉత్పత్తి ID ఫీల్డ్ను కలిగి ఉండవచ్చు. ఏదైనా IDని విస్మరించినట్లయితే, అది ఒక మినహాయింపుతో వైల్డ్కార్డ్గా పరిగణించబడుతుంది, విక్రేత IDని కూడా పేర్కొనకుండా కేవలం ఉత్పత్తి IDని పేర్కొనడం సాధ్యం కాకుండా ఉండటం ఆ మినహాయింపు కిందికి వస్తుంది. లేకుంటే, విధానం చెల్లుబాటు కాదు మరియు విస్మరించబడుతుంది. - - USB పరికరాన్ని యాక్సెస్ చేయడం కోసం అభ్యర్థిస్తున్న URLకు అనుమతి మంజూరు చేయడానికి అభ్యర్థిస్తున్న సైట్ URL ("అభ్యర్థిస్తున్న URL") మరియు అగ్ర-స్థాయి ఫ్రేమ్ సైట్ URLను ("పొందుపరచబడిన URL") USB అనుమతి మోడల్ ఉపయోగిస్తుంది. అభ్యర్థిస్తున్న సైట్ iframeలో లోడ్ చేయబడినప్పుడు అభ్యర్థిస్తున్న URL మరియు పొందుపరచబడిన URL వేర్వేరుగా ఉండవచ్చు. అందువలన, "urlలు" ఫీల్డ్లో అభ్యర్థిస్తున్న మరియు పొందుపరచబడుతున్న URLలను విడివిడిగా పేర్కొనడానికి కామాతో వేరు చేస్తూ గరిష్టంగా రెండు URL స్ట్రింగ్లు ఉండవచ్చు. ఒక URL మాత్రమే పేర్కొనబడినట్లయితే, పొందుపరిచే స్థితితో సంబంధం లేకుండా అభ్యర్థిస్తున్న సైట్ URL ఈ URLతో సరిపోలినప్పుడు సంబంధిత USB పరికరాలకు యాక్సెస్ మంజూరు చేయబడుతుంది. "urlలు"లోని URLలు తప్పనిసరిగా చెల్లుబాటు అయ్యే URLలు అయ్యి ఉండాలి, లేదంటే విధానం విస్మరించబడుతుంది. - - ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే, 'DefaultWebUsbGuardSetting' విధానాన్ని సెట్ చేసి ఉంటే దాని నుండి లేదా వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి అన్ని సైట్ల కోసం గ్లోబల్ డిఫాల్ట్ విలువ ఉపయోగించబడుతుంది. - - ఈ విధానంలో ఉన్న URL ఆకృతులకు మరియు WebUsbBlockedForUrls ద్వారా కాన్ఫిగర్ చేసిన వాటికి మధ్య వైరుధ్యం ఏర్పడకూడదు. ఏదైనా వైరుధ్యం ఏర్పడితే, WebUsbBlockedForUrls మరియు WebUsbAskForUrls కాకుండా ఈ విధానానికి ప్రాధాన్యత ఇవ్వబడుతుంది.</translation> <translation id="3414260318408232239">ఈ విధానాన్ని సెట్ చేయకుంటే, <ph name="PRODUCT_NAME" /> డిఫాల్ట్ కనీస వెర్షన్ అయిన TLS 1.0ను ఉపయోగిస్తుంది. లేదంటే, అది కింది విలువలలో ఒక దానికి సెట్ చేయబడవచ్చు: "tls1", "tls1.1" లేదా "tls1.2". సెట్ చేసినప్పుడు, <ph name="PRODUCT_NAME" /> పేర్కొన్న వెర్షన్ కంటే తక్కువ SSL/TLS వెర్షన్లను ఉపయోగించదు. గుర్తించని విలువ విస్మరించబడుతుంది.</translation> @@ -2344,7 +2318,7 @@ ఈ విధానాన్ని ఆన్ చేసినట్లయితే, బ్రౌజర్ విండో ప్రారంభించబడదు. - ఈ విధానాన్ని నిలిపివేసినా లేదా సెట్ చేయకున్నా, బ్రౌజర్ విండో ప్రారంభించడానికి అనుమతించబడుతుంది. ఇతర విధానాలు లేదా ఆదేశ-పంక్తి ఫ్లాగ్లు కారణంగా, బ్రౌజర్ విండో ప్రారంభించకపోయి ఉండవచ్చని గుర్తుంచుకోండి.</translation> + ఈ విధానాన్ని నిలిపివేసినా లేదా సెట్ చేయకున్నా, బ్రౌజర్ విండో ప్రారంభించడానికి అనుమతించబడుతుంది. ఇతర విధానాలు లేదా ఆదేశ-పంక్తి ఫ్లాగ్లు కారణంగా, బ్రౌజర్ విండో ప్రారంభం కాకపోవచ్చని గుర్తుంచుకోండి.</translation> <translation id="5427879482805712214">ఈ విధానం ద్వారా లాగిన్ స్క్రీన్పై వినియోగదారును సూచించే అవతార్ చిత్రాన్ని కాన్ఫిగర్ చేయగలుగుతారు. <ph name="PRODUCT_OS_NAME" /> ఏ URL నుండి అవతార్ చిత్రాన్ని, దాని డౌన్లోడ్ సమగ్రతను ధృవీకరించే క్రిప్టోగ్రాఫిక్ హ్యాష్ను డౌన్లోడ్ చేయాలో పేర్కొనడం ద్వారా ఈ విధానం సెట్ చేయబడుతుంది. చిత్రం తప్పనిసరిగా JPEG ఫార్మాట్లో ఉండాలి, అలాగే దీని పరిమాణం ఎట్టి పరిస్థితుల్లోనూ 512kB మించకూడదు. URL తప్పనిసరిగా ప్రామాణీకరణ అవసరం లేకుండానే యాక్సెస్ చేయగలిగేలా ఉండాలి. అవతార్ చిత్రం డౌన్లోడ్ చేయబడుతుంది, అలాగే కాష్ చేయబడుతుంది. URL లేదా హ్యాష్ మారినప్పుడు, ఇది మళ్లీ డౌన్లోడ్ చేయబడుతుంది.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 26d9f89f..0530cc37 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -1171,24 +1171,6 @@ หากตั้งค่านโยบายนี้เป็น False จะเป็นการปิดใช้การเพิ่มประสิทธิภาพ WPAD ซึ่งทำให้ <ph name="PRODUCT_NAME" /> ต้องใช้เวลาในการรอเซิร์ฟเวอร์ WPAD แบบ DNS นานขึ้น หากไม่ได้ตั้งค่าหรือไม่ได้เปิดใช้นโยบาย จะมีการเปิดใช้การเพิ่มประสิทธิภาพ WPAD ไม่ว่าจะมีการกำหนดนโยบายนี้อย่างไรก็ตาม ผู้ใช้จะไม่สามารถเปลี่ยนแปลงการตั้งค่าการเพิ่มประสิทธิภาพ WPAD ได้</translation> -<translation id="3071839057966069710">กำหนดค่ารายการเครื่องพิมพ์ - - นโยบายนี้ช่วยให้ผู้ดูแลระบบกำหนดค่าเครื่องพิมพ์ให้ผู้ใช้ของตนได้ - - <ph name="PRINTER_DISPLAY_NAME" /> และ <ph name="PRINTER_DESCRIPTION" /> เป็นสตริงรูปแบบอิสระที่ปรับแต่งได้เพื่อการเลือกเครื่องพิมพ์ที่ง่ายขึ้น <ph name="PRINTER_MANUFACTURER" /> และ <ph name="PRINTER_MODEL" /> ช่วยให้ผู้ใช้ปลายทางระบุเครื่องพิมพ์ได้โดยง่าย ด้วยการแสดงชื่อผู้ผลิตและรุ่นของเครื่องพิมพ์ <ph name="PRINTER_URI" /> ควรเป็นที่อยู่ที่เข้าถึงได้จากคอมพิวเตอร์ของลูกค้า รวมถึง <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> และ <ph name="URI_QUEUE" /> ส่วน <ph name="PRINTER_UUID" /> นั้นจะระบุหรือไม่ก็ได้ หากระบุ ข้อมูลนี้จะใช้เพื่อช่วยกรองเครื่องพิมพ์ <ph name="ZEROCONF_DISCOVERY" /> ที่ซ้ำกันออก - - <ph name="PRINTER_EFFECTIVE_MODEL" /> ต้องตรงกับสตริงใดสตริงหนึ่งที่แสดงถึงเครื่องพิมพ์ที่รองรับ <ph name="PRODUCT_NAME" /> ระบบจะใช้สตริงนี้เพื่อระบุและติดตั้ง PPD ที่เหมาะสมสำหรับเครื่องพิมพ์ ดูข้อมูลเพิ่มเติมได้ที่ https://support.google.com/chrome?p=noncloudprint - - <ph name="PRINTER_AUTOCONF" /> เป็นธงบูลีนที่ระบุว่าควรใช้ IPP Everywhere เพื่อตั้งค่าเครื่องพิมพ์หรือไม่ ธงนี้ได้รับการรองรับใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 76 ขึ้นไป - - <ph name="PRINTER_EFFECTIVE_MODEL" /> ควรมีชื่อเครื่องพิมพ์หรือ <ph name="PRINTER_AUTOCONF" /> ควรตั้งค่าเป็น "จริง" ระบบจะไม่สนใจเครื่องพิมพ์ที่มีพร็อพเพอร์ตี้ทั้ง 2 รายการหรือไม่มีเลย - - การตั้งค่าเครื่องพิมพ์จะเสร็จสมบูรณ์เมื่อใช้เครื่องพิมพ์เป็นครั้งแรก จะไม่มีการดาวน์โหลด PPD จนกว่าจะมีการใช้เครื่องพิมพ์ หลังจากนั้น ระบบจะเก็บ PPD ที่ใช้บ่อยไว้ในแคช - - นโยบายนี้ไม่มีผลต่อความสามารถของผู้ใช้ในการกำหนดค่าเครื่องพิมพ์ในอุปกรณ์ใดๆ แต่เป็นเพียงนโยบายเพิ่มเติมสำหรับการกำหนดค่าเครื่องพิมพ์ของผู้ใช้แต่ละราย - - สำหรับอุปกรณ์ที่จัดการโดย Active Directory นโยบายนี้รองรับการขยาย <ph name="MACHINE_NAME_VARIABLE" /> ในชื่อเครื่อง Active Directory หรือสตริงย่อย ตัวอย่างเช่น หากชื่อเครื่องคือ <ph name="MACHINE_NAME_EXAMPLE" /> ระบบก็จะแทนที่ <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ด้วยอักขระ 4 ตัวที่เริ่มหลังจากตำแหน่งที่ 6 นั่นคือ <ph name="MACHINE_NAME_PART_EXAMPLE" /> โปรดทราบว่าตำแหน่งจะเริ่มนับจากศูนย์ - </translation> <translation id="3072045631333522102">โปรแกรมรักษาหน้าจอที่จะใช้ในหน้าจอการลงชื่อเข้าใช้ในโหมดปลีก</translation> <translation id="3072847235228302527">ตั้งข้อกำหนดในการให้บริการสำหรับบัญชีภายในอุปกรณ์</translation> <translation id="3077183141551274418">เปิดหรือปิดใช้วงจรชีวิตแท็บ</translation> @@ -1324,13 +1306,6 @@ หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ หากไม่ได้ตั้งค่านโยบายนี้ พาวเวอร์พีคชิฟต์จะปิดใช้ในขั้นต้นและผู้ใช้จะเปิดใช้ไม่ได้</translation> -<translation id="3388153794103186066">อนุญาตให้คุณตั้งค่ารายการ URL ซึ่งระบุเว็บไซต์ที่จะได้รับสิทธิ์เข้าถึงอุปกรณ์ USB โดยอัตโนมัติ พร้อมรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ที่กำหนด รายการย่อยในรายการจะต้องมีทั้งอุปกรณ์และ URL เพื่อให้นโยบายมีผล แต่ละรายการในอุปกรณ์อาจมีช่องรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ รหัสที่ไม่รวมอยู่ในรายการจะถือว่าเป็นสัญลักษณ์แทนโดยมีข้อยกเว้นข้อเดียว นั่นก็คือคุณจะระบุรหัสผลิตภัณฑ์ได้เฉพาะเมื่อระบุรหัสผู้ให้บริการด้วยเท่านั้น มิเช่นนั้น ระบบจะถือว่านโยบายไม่มีผลและจะเพิกเฉยต่อนโยบาย - - รูปแบบสิทธิ์ USB ใช้ URL ของเว็บไซต์ที่ส่งคำขอ ("URL ที่ส่งคำขอ") และ URL ของเว็บไซต์กรอบระดับบนสุด ("URL ที่มีการฝัง") เพื่อให้สิทธิ์ URL ที่ส่งคำขอในการเข้าถึงอุปกรณ์ USB โดย URL ที่ส่งคำขออาจต่างจาก URL ที่มีการฝังเมื่อมีการโหลดเว็บไซต์ที่ส่งคำขอใน iframe ดังนั้นช่อง "urls" อาจมีสตริง URL ได้ถึง 2 สตริงโดยคั่นด้วยเครื่องหมายจุลภาคเพื่อระบุ URL ที่ส่งคำขอและ URL ที่มีการฝังตามลำดับ หากมีการระบุ URL เพียงรายการเดียว ระบบจะให้สิทธิ์เข้าถึงอุปกรณ์ USB ที่เกี่ยวข้องเมื่อ URL ของเว็บไซต์ที่ส่งคำขอตรงกับ URL นี้ไม่ว่าสถานะการฝังจะเป็นอย่างไร URL ในช่อง "urls" ต้องเป็น URL ที่ถูกต้อง มิเช่นนั้น ระบบจะเพิกเฉยต่อนโยบาย - - หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นส่วนกลางกับเว็บไซต์ทั้งหมด ไม่ว่าจะมาจากนโยบาย "DefaultWebUsbGuardSetting" (หากตั้งค่าไว้) หรือการกำหนดค่าส่วนตัวของผู้ใช้ (หากไม่ได้ตั้งค่าไว้) - - รูปแบบ URL ในนโยบายนี้ไม่ควรขัดแย้งกับรูปแบบที่กำหนดค่าผ่าน WebUsbBlockedForUrls หากขัดแย้งกัน ระบบจะใช้นโยบายนี้แทน WebUsbBlockedForUrls และ WebUsbAskForUrls</translation> <translation id="3414260318408232239">หากไม่ได้กำหนดค่านโยบายนี้ไว้ <ph name="PRODUCT_NAME" /> จะใช้เวอร์ชันขั้นต่ำที่เป็นค่าเริ่มต้น ซึ่งก็คือ TLS 1.0 ทั้งนี้คุณตั้งค่านโยบายเป็นค่าใดค่าหนึ่งได้ระหว่าง "tls1", "tls1.1" หรือ "tls1.2" เมื่อตั้งค่าแล้ว <ph name="PRODUCT_NAME" /> จะไม่ใช้ SSL/TLS ในเวอร์ชันที่ต่ำกว่าเวอร์ชันที่ระบุ และจะไม่สนใจค่าที่ไม่รู้จัก</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 8beffe52..75ff9d1 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -1195,25 +1195,6 @@ Bu politika yanlış seçeneğine ayarlanırsa WPAD optimizasyonu devre dışı kalır ve <ph name="PRODUCT_NAME" /> ürününün DNS tabanlı WPAD sunucuları için daha uzun süre beklemesine neden olur. Politika ayarlanmazsa veya etkinleştirilirse WPAD optimizasyonu etkinleştirilir. Bu politikanın ayarlansa da ayarlanmasa da, WPAD optimizasyonu ayarı kullanıcılar tarafından değiştirilemez.</translation> -<translation id="3071839057966069710">Yazıcılar listesini yapılandırır. - - Bu politika, yöneticilerin kendi kullanıcıları için yazıcı yapılandırmaları - sunmalarına izin verir. - - <ph name="PRINTER_DISPLAY_NAME" /> ve <ph name="PRINTER_DESCRIPTION" />, yazıcı seçimini kolaylaştıracak şekilde özelleştirilebilen serbest biçimli dizelerdir. <ph name="PRINTER_MANUFACTURER" /> ve <ph name="PRINTER_MODEL" />, son kullanıcıların yazıcıyı tanımasını kolaylaştırmayı amaçlar. Bu ibareler yazıcının üreticisini ve modelini temsil eder. <ph name="PRINTER_URI" />, istemci bilgisayardan ulaşabilen ve <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> bilgilerini içeren bir adres olmalıdır. <ph name="PRINTER_UUID" /> isteğe bağlıdır. Sağlandığı takdirde, <ph name="ZEROCONF_DISCOVERY" /> yazıcıların tekilleştirilmesine yardımcı olmak için kullanılır. - - <ph name="PRINTER_EFFECTIVE_MODEL" />, <ph name="PRODUCT_NAME" /> tarafından desteklenen bir yazıcıyı temsil eden dizelerden biriyle eşleşmelidir. Dize, yazıcıya uygun PPD'yi tanımlamak ve yüklemek için kullanılır. Daha fazla bilgiye https://support.google.com/chrome?p=noncloudprint. adresinden ulaşılabilir. - - <ph name="PRINTER_AUTOCONF" />, yazıcıyı kurmak için IPP Everywhere kullanılması gerekip gerekmediğini belirten bir boole işaretidir. Bu işaret, <ph name="PRODUCT_OS_NAME" /> sürüm 76 ve sonrasındaki sürümlerde desteklenir. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> yazıcının adını içermelidir veya <ph name="PRINTER_AUTOCONF" /> politikası true (doğru) değerine ayarlanmalıdır. Her iki özelliği de taşıyan veya hiçbir özellik taşımayan yazıcılar yok sayılır. - - Yazıcı ilk kez kullanıldığında kurulum tamamlanmış olur. Yazıcı kullanılana kadar PPD'ler indirilmez. Bundan sonra sık kullanılan PPD'ler ön belleğe alınır. - - Bu politika, kullanıcıların yazıcıları ayrı ayrı cihazlarda yapılandırıp yapılandıramayacağı konusunu etkilemez. Ayrı ayrı kullanıcılar tarafından yazıcıların yapılandırılması konusunda tamamlayıcı olacak şekilde tasarlanmıştır. - - Active Directory tarafından yönetilen cihazlarda bu politika, <ph name="MACHINE_NAME_VARIABLE" /> değişkeninin Active Directory makine adına veya bunun bir alt dizesine genişletilmesini destekler. Örneğin, makine adı <ph name="MACHINE_NAME_EXAMPLE" /> ise <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />, 6. konumdan sonra başlayan 4 karakterle değiştirilir (<ph name="MACHINE_NAME_PART_EXAMPLE" /> gibi). Konumun sıfır tabanlı olduğuna dikkat edin. - </translation> <translation id="3072045631333522102">Perakende modunda oturum açma ekranında kullanılacak ekran koruyucu</translation> <translation id="3072847235228302527">Bir cihaz yerel hesabı için Hizmet Şartları'nı ayarlama</translation> <translation id="3077183141551274418">Sekme yaşam döngülerini etkinleştirir veya devre dışı bırakır</translation> @@ -1353,13 +1334,6 @@ Bu politikayı ayarlarsanız kullanıcılar tarafından değiştirilemez veya geçersiz kılınamaz. Bu politika ayarlanmazsa güç tüketimi en üst düzeydeyken pil kullanımına geçme ayarı başlangıçta devre dışı bırakılır ve kullanıcı tarafından etkinleştirilemez.</translation> -<translation id="3388153794103186066">Hangi sitelerin sağlanan tedarikçi ve ürün kimliklerine sahip USB cihazlarına erişmesine otomatik olarak izin verileceğini belirten bir URL listesi ayarlamanıza olanak tanır. Politikanın geçerli olabilmesi için listedeki her öğenin hem cihazları hem de URL'leri içermesi gerekir. Cihazlardaki her öğe tedarikçi kimliği ve ürün kimliği alanı içerebilir. Dahil edilmeyen her kimlik bir istisnayla joker olarak değerlendirilir. Bu istisnaya göre tedarikçi kimliği belirtilmeden ürün kimliği de belirtilemez. Aksi halde politika geçerli olmaz ve yoksayılır. - - USB izin modeli, istekte bulunan sitenin URL'sini ("istekte bulunan URL") ve üst düzey çerçeve sitesinin URL'sini ("yerleştirme URL'si") kullanarak istekte bulunan URL'ye USB cihazına erişmesi için izin verir. İstekte bulunan site bir iframe içinde yüklendiğinde, istekte bulunan URL yerleştirme URL'sinden farklı olabilir. Bu nedenle, "URL'ler" alanı, sırasıyla istekte bulunan URL'yi ve yerleştirme URL'sini belirtmek için virgülle sınırlandırılmış en fazla iki URL dizesi içerebilir. Yalnızca bir URL belirtilirse yerleştirme durumundan bağımsız olarak bu URL ile eşleşen istekte bulunan sitenin URL'sine karşılık gelen USB cihazlarına erişim izni verilir. "URL'ler" alanındaki URL'lerin geçerli URL'ler olmaları gerekir; aksi halde, politika yoksayılır. - - Bu politika ayarlanmadan bırakılırsa genel varsayılan değer, tüm siteler için, ayarlanması halinde "DefaultWebUsbGuardSetting" politikasından veya kullanıcının kişisel yapılandırmasından kullanılır. - - Bu politikadaki URL kalıpları, WebUsbBlockedForUrls politikasıyla yapılandırılan kalıplarla çakışmamalıdır. Çakışma olması halinde bu politikanın WebUsbBlockedForUrls ve WebUsbAskForUrls politikaları üzerinde önceliği olur.</translation> <translation id="3414260318408232239">Bu politika yapılandırılmazsa, <ph name="PRODUCT_NAME" /> varsayılan minimum sürüm olarak TLS 1.0'ı kullanır. Aksi halde, şu değerlerin birine ayarlanabilir: "tls1", "tls1.1" veya "tls1.2". Ayarlandığında, <ph name="PRODUCT_NAME" />, belirtilen sürümden düşük olan SSL/TLS sürümlerini kullanmaz. Tanınmayan bir değer yoksayılır.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 9135441a..d35483311 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1187,25 +1187,6 @@ Якщо для цього правила вибрано значення "false", оптимізація WPAD вимикається та <ph name="PRODUCT_NAME" /> довше очікує на відповідь серверів WPAD на основі DNS. Якщо це правило не налаштовано або ввімкнено, активується оптимізація WPAD. Незалежно від налаштувань правила, користувачі не можуть змінювати параметри оптимізації WPAD.</translation> -<translation id="3071839057966069710">Налаштовує список принтерів. - - Це правило дає змогу адміністраторам налаштовувати принтери - своїх користувачів. - - <ph name="PRINTER_DISPLAY_NAME" /> і <ph name="PRINTER_DESCRIPTION" /> – це рядки довільної форми, які можна налаштувати, щоб легко вибирати принтери. <ph name="PRINTER_MANUFACTURER" /> і <ph name="PRINTER_MODEL" /> допомагають кінцевим користувачам розпізнавати принтери. Вони містять дані про виробника й модель принтера. <ph name="PRINTER_URI" /> має бути адресою, доступною з комп’ютера клієнта, і містити такі дані: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> та <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> – додатковий рядок. Він допомагає видалити повтори принтерів <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> має відповідати одному з рядків принтера, який підтримує <ph name="PRODUCT_NAME" />. Цей рядок допомагає знайти й установити потрібний файл PPD для принтера. Докладніше читайте на сторінці https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> – це логічне значення, яке вказує, чи потрібно налаштовувати принтер за допомогою IPP Everywhere. Воно підтримується у версіях <ph name="PRODUCT_OS_NAME" /> 76 і новіших. - - Правило <ph name="PRINTER_EFFECTIVE_MODEL" /> має містити назву принтера. Для правила <ph name="PRINTER_AUTOCONF" /> потрібно встановити значення true. Принтери з обома значеннями або без жодного ігноруватимуться. - - Налаштування принтера завершується після його першого використання. Файли PPD не завантажуються, поки працює принтер. Після цього кешуються файли PPD, які часто використовуються. - - Це правило не впливає на здатність користувачів налаштовувати принтери для окремих пристроїв. Воно доповнює такі налаштування. - - Якщо пристроями керує Active Directory, це правило підтримує розширення <ph name="MACHINE_NAME_VARIABLE" /> до назви пристрою або її підрядків в Active Directory. Наприклад, якщо назва пристрою – <ph name="MACHINE_NAME_EXAMPLE" />, то <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> буде замінено 4 символами після 6-ї позиції, тобто <ph name="MACHINE_NAME_PART_EXAMPLE" />. Зауважте, що позиція починається з нуля. - </translation> <translation id="3072045631333522102">Заставка, яка буде відображатися на екрані входу в режимі роздрібного продажу</translation> <translation id="3072847235228302527">Установити Умови використання для локального облікового запису на пристрої</translation> <translation id="3077183141551274418">Вмикає або вимикає життєві цикли вкладок</translation> @@ -1341,13 +1322,6 @@ Якщо це правило налаштовано, користувачі не можуть змінювати або замінювати його. Якщо це правило не налаштовано, зміну піку потужності вимкнено спочатку. Користувачі не можуть увімкнути її.</translation> -<translation id="3388153794103186066">Дає змогу створювати список URL-адрес сайтів, яким автоматично надаватиметься доступ до пристрою USB з указаними ідентифікаторами постачальника й продукту. Щоб це правило було дійсним, кожний елемент списку має містити пристрої та URL-адреси. Кожний елемент на пристрої може містити поля для ідентифікаторів постачальника й продукту. Будь-який пропущений ідентифікатор вважається символом підстановки. Винятком є випадок, коли ідентифікатор продукту неможливо вказати без зазначення ідентифікатора постачальника. В іншому разі це правило буде недійсним та ігноруватиметься. - - Модель доступу до USB використовує URL-адреси запитаного сайту ("запитана URL-адреса") і сайту фрейму найвищого рівня ("вставлена URL-адреса"), щоб надати запитаній URL-адресі доступ до пристрою USB. Запитана URL-адреса може відрізнятися від вставленої, якщо запитаний сайт завантажується в iframe. Тому поле "URL-адреси" може містити до двох рядків, розділених комою, щоб можна було вказати запитану та вставлену URL-адреси відповідно. Якщо вказано лише одну URL-адресу, тоді доступ до відповідних пристроїв USB буде надано, коли запитана URL-адреса відповідатиме вказаній, незалежно від статусу вставлення. URL-адреси, указані у відповідному полі, мають бути дійсними, інакше правило ігноруватиметься. - - Якщо це правило не налаштовано, для всіх сайтів буде застосовано загальне значення за умовчанням відповідно до правила DefaultWebUsbGuardSetting (якщо його встановлено) чи особистих параметрів користувача. - - Шаблони URL-адрес у цьому правилі не повинні суперечити адресам, налаштованим через WebUsbBlockedForUrls. Інакше це правило матиме перевагу над WebUsbBlockedForUrls і WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Якщо це правило не налаштовано, <ph name="PRODUCT_NAME" /> використовує стандартну мінімальну версію – TLS 1.0. Для правила можна вибрати одне з таких значень: "tls1", "tls1.1" або "tls1.2". Якщо правило налаштовано, <ph name="PRODUCT_NAME" /> не використовуватиме версії SSL/TLS, старіші за вказану. Нерозпізнане значення ігноруватиметься.</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index ccbebfd6..b88600bb 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -1200,25 +1200,6 @@ Nếu bạn đặt chính sách này thành false, tối ưu hóa WPAD sẽ bị tắt, điều này khiến <ph name="PRODUCT_NAME" /> phải đợi trong khoảng thời gian lâu hơn đối với máy chủ WPAD dựa trên DNS. Nếu bạn không đặt hoặc nếu bạn bật chính sách này, tối ưu hóa WPAD sẽ được bật. Bất kể bạn có đặt chính sách này hay không hoặc cách bạn đặt chính sách này, người dùng cũng không thể thay đổi cài đặt tối ưu hóa WPAD.</translation> -<translation id="3071839057966069710">Định cấu hình danh sách máy in. - - Chính sách này cho phép quản trị viên cung cấp cấu hình máy in cho - người dùng của mình. - - <ph name="PRINTER_DISPLAY_NAME" /> và <ph name="PRINTER_DESCRIPTION" /> là các chuỗi dạng tự do có thể tùy chỉnh để dễ dàng chọn máy in. <ph name="PRINTER_MANUFACTURER" /> và <ph name="PRINTER_MODEL" /> giúp người dùng cuối dễ dàng nhận diện máy in. Các thông tin này cho biết nhà sản xuất và kiểu máy in. <ph name="PRINTER_URI" /> phải là địa chỉ có thể truy cập từ một máy khách bao gồm cả <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> và <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> là tùy chọn. Nếu được cung cấp, tùy chọn này sẽ dùng để giúp loại bỏ trùng lặp máy in <ph name="ZEROCONF_DISCOVERY" />. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> phải khớp với một trong các chuỗi đại diện cho một máy in được <ph name="PRODUCT_NAME" /> hỗ trợ. Chuỗi này sẽ dùng để nhận diện và cài đặt PPD phù hợp cho máy in. Bạn có thể xem thêm thông tin tại https://support.google.com/chrome?p=noncloudprint. - - <ph name="PRINTER_AUTOCONF" /> là cờ boolean cho biết có nên dùng IPP Everywhere để thiết lập máy in hay không. Cờ này được hỗ trợ trên <ph name="PRODUCT_OS_NAME" /> phiên bản 76 trở lên. - - <ph name="PRINTER_EFFECTIVE_MODEL" /> phải chứa tên của máy in hoặc <ph name="PRINTER_AUTOCONF" /> phải được đặt thành true. Các máy in có cả hai hoặc không có thuộc tính nào đều bị bỏ qua. - - Quá trình thiết lập máy in sẽ hoàn tất trong lần đầu tiên sử dụng máy in. PPD sẽ không tải xuống cho đến khi máy in được sử dụng. Sau lần đó, các PPD dùng thường xuyên sẽ được lưu vào bộ nhớ đệm. - - Chính sách này không ảnh hưởng đến việc người dùng có thể định cấu hình máy in trên từng thiết bị hay không. Chính sách này nhằm bổ sung cho quá trình định cấu hình máy in theo từng người dùng. - - Đối với các thiết bị được quản lý bằng Active Directory, chính sách này hỗ trợ mở rộng <ph name="MACHINE_NAME_VARIABLE" /> thành tên máy Active Directory hoặc chuỗi con của tên máy đó. Chẳng hạn, nếu tên máy là <ph name="MACHINE_NAME_EXAMPLE" />, thì <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> sẽ được thay thế bằng 4 ký tự bắt đầu sau vị trí thứ 6, tức là <ph name="MACHINE_NAME_PART_EXAMPLE" />. Xin lưu ý rằng vị trí này được tính từ đầu. - </translation> <translation id="3072045631333522102">Trình bảo vệ màn hình được sử dụng trên màn hình đăng nhập ở chế độ bán lẻ</translation> <translation id="3072847235228302527">Đặt Điều khoản dịch vụ cho một tài khoản cục bộ trên thiết bị</translation> <translation id="3077183141551274418">Bật hoặc tắt tính năng chu kỳ sử dụng tab</translation> @@ -1358,13 +1339,6 @@ Nếu bạn đặt chính sách này, thì người dùng không thể thay đổi hoặc ghi đè chính sách này. Nếu bạn không đặt chính sách này, thì chế độ chuyển đổi điện năng cao điểm sẽ tắt ngay từ đầu và người dùng không thể bật chế độ này.</translation> -<translation id="3388153794103186066">Cho phép bạn đặt danh sách các url chỉ định những trang web sẽ tự động được cấp quyền truy cập vào thiết bị USB bằng ID sản phẩm và ID nhà cung cấp cụ thể. Mỗi mục trong danh sách phải chứa cả thiết bị và url để chính sách có hiệu lực. Mỗi mục trong các thiết bị có thể chứa trường ID sản phẩm và ID nhà cung cấp. Bất kỳ ID nào bị bỏ qua đều được coi là ký tự đại diện có một ngoại lệ và ngoại lệ đó chính là không thể chỉ định ID sản phẩm nếu không chỉ định được ID nhà cung cấp. Nếu không, chính sách sẽ không có hiệu lực và bị bỏ qua. - - Mô hình quyền của USB sử dụng URL của trang web yêu cầu ("URL yêu cầu") và URL của trang web khung cấp cao nhất ("URL nhúng") để cấp quyền cho URL yêu cầu truy cập vào thiết bị USB. URL yêu cầu có thể khác với URL nhúng khi bạn tải trang web yêu cầu trong khung nội tuyến. Do đó, trường "url" có thể chứa tối đa hai chuỗi URL phân tách bằng dấu phẩy để chỉ định URL yêu cầu và URL nhúng tương ứng. Nếu chỉ có một URL được chỉ định, thì quyền truy cập vào các thiết bị USB tương ứng sẽ được cấp khi URL của trang web yêu cầu khớp với URL này bất kể trạng thái nhúng. Các URL trong "url" phải là các URL hợp lệ. Nếu không, chính sách này sẽ bị bỏ qua. - - Nếu bạn không đặt chính sách này, thì giá trị mặc định chung sẽ được dùng cho tất cả các trang web của chính sách 'DefaultWebUsbGuardSetting' nếu chính sách này được đặt, hoặc nếu không sẽ được sử dụng cho cấu hình cá nhân của người dùng. - - Các mẫu URL trong chính sách này không được xung đột với các URL đã định cấu hình thông qua WebUsbBlockedForUrls. Nếu có xung đột, thì chính sách này sẽ được ưu tiên so với WebUsbBlockedForUrls và WebUsbAskForUrls.</translation> <translation id="3414260318408232239">Nếu bạn chưa định cấu hình chính sách này, thì <ph name="PRODUCT_NAME" /> sẽ sử dụng phiên bản tối thiểu mặc định là TLS 1.0. Nếu không, bạn có thể đặt chính sách này thành một trong các giá trị sau: "tls1", "tls1.1" hoặc "tls1.2". Khi được đặt, <ph name="PRODUCT_NAME" /> sẽ không sử dụng các phiên bản SSL/TLS thấp hơn phiên bản đã chỉ định. Giá trị không xác định sẽ bị bỏ qua.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 4a3506d..3f09f13 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1130,24 +1130,6 @@ 如果此政策设置为 false,那么 WPAD 优化将处于停用状态,这会延长 <ph name="PRODUCT_NAME" /> 等待基于 DNS 的 WPAD 服务器响应的时间。如果未设置或已启用此政策,那么 WPAD 优化设置将处于启用状态。 无论是否设置此政策或如何设置此政策,用户都无法更改 WPAD 优化设置。</translation> -<translation id="3071839057966069710">配置打印机列表。 - - 通过此政策,管理员可为用户提供打印机配置。 - - “<ph name="PRINTER_DISPLAY_NAME" />”和“<ph name="PRINTER_DESCRIPTION" />”均为自由格式的字符串,且均可被自定义以便于选择打印机。“<ph name="PRINTER_MANUFACTURER" />”和“<ph name="PRINTER_MODEL" />”则可以帮助最终用户轻松识别打印机。它们分别代表打印机的制造商和型号。“<ph name="PRINTER_URI" />”应是可通过客户端计算机访问的地址,包括“<ph name="URI_SCHEME" />”、“<ph name="URI_PORT" />”和“<ph name="URI_QUEUE" />”。“<ph name="PRINTER_UUID" />”是可选项。如果提供的话,该项可用于帮助删除重复的“<ph name="ZEROCONF_DISCOVERY" />”打印机。 - - “<ph name="PRINTER_EFFECTIVE_MODEL" />”必须与代表 <ph name="PRODUCT_NAME" />支持的打印机的某个字符串匹配。该字符串将用于识别和为打印机安装相应的 PPD。如需了解详情,请访问:https://support.google.com/chrome?p=noncloudprint。 - - <ph name="PRINTER_AUTOCONF" /> 是一个布尔值标记,指示是否应该将 IPP Everywhere 用于设置打印机。<ph name="PRODUCT_OS_NAME" /> 76 及更高版本支持该标记。 - - 要么 <ph name="PRINTER_EFFECTIVE_MODEL" /> 应该包含打印机的名称,要么 <ph name="PRINTER_AUTOCONF" /> 应该设置为 true。具有这两种属性或者不具有任一属性的打印机将会被忽略。 - - 打印机设置会在用户首次使用打印机时完成。在用户开始使用打印机之前,系统不会下载 PPD。在用户开始使用打印机之后,系统会缓存经常使用的 PPD。 - - 此政策对用户能否在某设备上配置打印机没有影响。它旨在对各个用户的打印机配置起到补充作用。 - - 对于由 Active Directory 托管的设备,此政策支持将“<ph name="MACHINE_NAME_VARIABLE" />”扩展为 Active Directory 机器名称或其子字符串。例如,如果机器名称是“<ph name="MACHINE_NAME_EXAMPLE" />”,则“<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />”将被替换为第 6 个字符后面的 4 个字符(即 <ph name="MACHINE_NAME_PART_EXAMPLE" />)。请注意,位置序数从 0 起算。 - </translation> <translation id="3072045631333522102">用于零售模式登录屏幕的屏幕保护程序</translation> <translation id="3072847235228302527">为设备本地帐号设置服务条款</translation> <translation id="3077183141551274418">启用或停用标签页生命周期</translation> @@ -1283,13 +1265,6 @@ 如果您设置了此政策,用户将无法更改或覆盖它。 如果未设置此政策,“用电高峰转移”的初始状态为停用,且无法由用户启用。</translation> -<translation id="3388153794103186066">让您能够以列表的形式设置一系列网址,以指定将会自动授权哪些网站通过给定的供应商 ID 和产品 ID 访问 USB 设备。列表中的每项内容都必须包含设备和网址这两个部分,此政策才会有效。设备部分中的每项都可包含供应商 ID 和产品 ID 字段。被省略的任何 ID 都会被视为通配符,但例外情况是:如果未指定供应商 ID,便无法指定产品 ID。否则,该政策将会无效并会被忽略。 - - USB 权限模型会使用发出相应请求的网站的网址(“请求网址”)和顶级框架网站的网址(“嵌入网址”)来授权请求网址访问 USB 设备。如果发出请求的网站是在 iframe 中加载的,则请求网址可能会与嵌入网址不同。因此,“urls”字段最多可包含 2 个以英文逗号分隔的网址字符串以分别指定请求网址和嵌入网址。如果仅指定了 1 个网址,系统将会在请求网址与这个网址相符(无论嵌入网址的状态为何)时向该网站授予对相应 USB 设备的访问权限。“urls”字段中的网址必须是有效网址,否则系统会忽略此政策。 - - 如果未设置此政策,系统将会对所有网站使用“DefaultWebUsbGuardSetting”政策中的全局默认值(倘若已设置“DefaultWebUsbGuardSetting”政策),或使用用户个人配置中的全局默认值(倘若未设置“DefaultWebUsbGuardSetting”政策)。 - - 此政策中的网址格式不应与通过 WebUsbBlockedForUrls 配置的网址格式冲突。如果存在冲突,则此政策的优先级高于 WebUsbBlockedForUrls 和 WebUsbAskForUrls。</translation> <translation id="3414260318408232239">如果未配置此政策,<ph name="PRODUCT_NAME" /> 将会使用默认的最低版本(即 TLS 1.0)。 倘若您想配置此政策,则可将其设为下列值之一:“tls1”、“tls1.1”或“tls1.2”。如果您设置了此政策,<ph name="PRODUCT_NAME" /> 将不会使用低于指定版本的 SSL/TLS 版本。无法识别的值都会被忽略。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 7e92661..3255d7c 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1168,24 +1168,6 @@ 如果將這項政策設為 False,系統會停用 WPAD 最佳化設定,因而延長 <ph name="PRODUCT_NAME" /> 等待 DNS 型 WPAD 伺服器回應的時間。如果未設定或已啟用這項政策,系統會啟用 WPAD 最佳化設定。 無論系統是否設定這項政策或這項政策的設定方式為何,使用者一律無法變更 WPAD 最佳化設定。</translation> -<translation id="3071839057966069710">設定印表機清單。 - - 這項政策可讓管理員為使用者提供印表機設定。 - - 「<ph name="PRINTER_DISPLAY_NAME" />」和「<ph name="PRINTER_DESCRIPTION" />」可填入形式不拘的自訂字串,方便使用者選取印表機。「<ph name="PRINTER_MANUFACTURER" />」和「<ph name="PRINTER_MODEL" />」可讓使用者輕鬆識別印表機,兩者分別代表印表機的製造商和型號。<ph name="PRINTER_URI" /> 必須是可透過用戶端電腦連線的位址,包括 <ph name="URI_SCHEME" />、<ph name="URI_PORT" /> 和 <ph name="URI_QUEUE" />。<ph name="PRINTER_UUID" /> 為選填欄位。如有提供這項資訊,系統會用來刪除重複的 <ph name="ZEROCONF_DISCOVERY" /> 印表機。 - - <ph name="PRINTER_EFFECTIVE_MODEL" /> 必須與其中一個代表 <ph name="PRODUCT_NAME" />支援的印表機字串相符。系統會利用這個字串找出並安裝印表機適用的 PPD。詳情請參閱 https://support.google.com/chrome?p=noncloudprint。 - - <ph name="PRINTER_AUTOCONF" /> 是布林值標記,表示是否要使用 IPP Everywhere 設定印表機。<ph name="PRODUCT_OS_NAME" /> 76 以上版本支援這個標記。 - - 你可以選擇在 <ph name="PRINTER_EFFECTIVE_MODEL" /> 中納入印表機名稱,或將 <ph name="PRINTER_AUTOCONF" /> 設為 True。如果同時設定 (或同時不設定) 這兩個印表機屬性,系統將予以忽略。 - - 首次使用印表機時,系統會完成印表機設定程序。PPD 則會在有人使用印表機時才下載。之後系統會快取常用的 PPD。 - - 這項政策對使用者是否能在個別裝置上設定印表機沒有影響,而是補足個別使用者的印表機設定。 - - 如果是 Active Directory 管理的裝置,這項政策支援將 <ph name="MACHINE_NAME_VARIABLE" /> 擴充為 Active Directory 電腦名稱或其子字串。舉例來說,如果電腦名稱為 <ph name="MACHINE_NAME_EXAMPLE" />,則系統會以第 6 個字元後的 4 個字元取代 <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />,也就是 <ph name="MACHINE_NAME_PART_EXAMPLE" />。請注意,字元序數從 0 開始計算。 - </translation> <translation id="3072045631333522102">在零售模式下登入畫面所使用的螢幕保護程式</translation> <translation id="3072847235228302527">為裝置本機帳戶設定《服務條款》</translation> <translation id="3077183141551274418">啟用或停用分頁生命週期功能</translation> @@ -1321,13 +1303,6 @@ 設定這項政策後,使用者即無法變更或覆寫。 如果未設定這項政策,系統預設會關閉用電尖峰轉移功能,且使用者無法啟用這項功能。</translation> -<translation id="3388153794103186066">允許設定一組網址清單,當中指定的網站會自動取得權限,可存取具有特定廠商和產品 ID 的 USB 裝置。清單中的每個項目都必須包含裝置和網址,這項政策才具效力。裝置中的每個項目可包含廠商 ID 和產品 ID 欄位。如有省略的 ID,系統將視作萬用字元處理,但如未指定廠商 ID,將無法指定產品 ID。在其他情況下,這項政策一律不具效力,系統會予以忽略。 - - USB 權限模型會使用要求網站的網址 (簡稱「要求網址」) 以及頂層頁框網站的網址 (簡稱「內嵌網址」),將 USB 裝置存取權限授予要求網址。當網站在 iframe 中載入時,要求網址可能與內嵌網址不同。因此,「urls」欄位最多可包含兩個網址字串 (以半形逗號分隔),以依序指定要求網址和內嵌網址。如果只指定一個網址,只要要求網站的網址與指定的網址相符,不論其是否為內嵌網址,系統都會授予相應 USB 裝置的存取權限。「urls」中的網址必須是有效網址,否則系統將忽略這項政策。 - - 如果不設定這項政策,所有網站將使用「DefaultWebUsbGuardSetting」政策的全域預設值 (如有設定的話) 或使用者的個人設定值。 - - 這項政策中的網址模式與透過 WebUsbAskForUrls 所設定的網址模式應保持一致。如果兩者不符,這項政策的優先順序高於 WebUsbBlockedForUrls 和 WebUsbAskForUrls。</translation> <translation id="3414260318408232239">如果未設定這項政策,<ph name="PRODUCT_NAME" /> 會使用預設最低版本 TLS 1.0。 這項政策可使用的設定值包括:「tls1」、「tls1.1」或「tls1.2」。設定後,<ph name="PRODUCT_NAME" /> 就不會使用低於指定版本的 SSL/TLS 版本。系統會忽略無法辨識的值。</translation> @@ -2144,7 +2119,7 @@ 如果將這項政策設為 True 或不設定這項政策,當 Chrome 分頁改以其他瀏覽器開啟後,Chrome 中仍會有至少一個分頁保持開啟。 如果將這項政策設為 False,當 Chrome 分頁改以其他瀏覽器開啟後,Chrome 將關閉該分頁,即使該分頁是最後一個分頁也一樣。這會導致 Chrome 完全關閉。</translation> -<translation id="5102203758995933166">這項政策可將網路設定強制套用至 <ph name="PRODUCT_OS_NAME" />裝置 (依使用者區分)。這個網路設定是根據「開放網路設定」格式所定義的 JSON 格式字串。</translation> +<translation id="5102203758995933166">這項政策可依使用者將網路設定強制套用至 <ph name="PRODUCT_OS_NAME" />裝置。這個網路設定是根據「開放網路設定」格式所定義的 JSON 格式字串。</translation> <translation id="5105313908130842249">在電池供電環境下執行時的螢幕鎖定延遲時間</translation> <translation id="5108031557082757679">已停用企業裝置印表機</translation> <translation id="5124368997194894978">啟用「連接 AC (交流電) 電源時啟動」功能</translation> @@ -3116,7 +3091,7 @@ Google 可能會依照工作階段 ID 將這些記錄和 Google 服務本身收集的其他記錄建立關聯,目的是簡化偵錯作業。 </translation> <translation id="706669471845501145">允許網站顯示桌面通知</translation> -<translation id="7068108874199666656">這項政策可將網路設定強制套用至所有使用者的 <ph name="PRODUCT_OS_NAME" />裝置。這個網路設定是根據「開放網路設定」格式所定義的 JSON 格式字串。</translation> +<translation id="7068108874199666656">這項政策可將網路設定強制套用至 <ph name="PRODUCT_OS_NAME" />裝置的所有使用者。這個網路設定是根據「開放網路設定」格式所定義的 JSON 格式字串。</translation> <translation id="7070525176564511548">每週 (168 小時) 需輸入一次密碼</translation> <translation id="7072208053150563108">裝置密碼變更頻率</translation> <translation id="7079519252486108041">封鎖這些網站的彈出式視窗</translation>
diff --git a/components/security_interstitials/content/origin_policy_interstitial_page.cc b/components/security_interstitials/content/origin_policy_interstitial_page.cc index 5008b3d..3697645 100644 --- a/components/security_interstitials/content/origin_policy_interstitial_page.cc +++ b/components/security_interstitials/content/origin_policy_interstitial_page.cc
@@ -117,8 +117,7 @@ } void OriginPolicyInterstitialPage::OnProceed() { - content::OriginPolicyAddExceptionFor(web_contents()->GetBrowserContext(), - request_url()); + content::OriginPolicyAddExceptionFor(request_url()); web_contents()->GetController().Reload(content::ReloadType::NORMAL, true); }
diff --git a/components/signin/core/browser/gaia_cookie_manager_service.cc b/components/signin/core/browser/gaia_cookie_manager_service.cc index 4e932a49..1d2074f 100644 --- a/components/signin/core/browser/gaia_cookie_manager_service.cc +++ b/components/signin/core/browser/gaia_cookie_manager_service.cc
@@ -654,14 +654,6 @@ } } -void GaiaCookieManagerService::AddObserver(Observer* observer) { - observer_list_.AddObserver(observer); -} - -void GaiaCookieManagerService::RemoveObserver(Observer* observer) { - observer_list_.RemoveObserver(observer); -} - void GaiaCookieManagerService::CancelAll() { VLOG(1) << "GaiaCookieManagerService::CancelAll"; gaia_auth_fetcher_.reset(); @@ -695,8 +687,8 @@ if (cause == network::mojom::CookieChangeCause::EXPLICIT) { DCHECK(net::CookieChangeCauseIsDeletion(net::CookieChangeCause::EXPLICIT)); - for (auto& observer : observer_list_) { - observer.OnGaiaCookieDeletedByUserAction(); + if (gaia_cookie_deleted_by_user_action_callback_) { + gaia_cookie_deleted_by_user_action_callback_.Run(); } } @@ -744,6 +736,18 @@ requests_.front().RunSetAccountsInCookieCompletedCallback(result); } +void GaiaCookieManagerService::SetGaiaAccountsInCookieUpdatedCallback( + GaiaAccountsInCookieUpdatedCallback callback) { + DCHECK(!gaia_accounts_updated_in_cookie_callback_); + gaia_accounts_updated_in_cookie_callback_ = std::move(callback); +} + +void GaiaCookieManagerService::SetGaiaCookieDeletedByUserActionCallback( + GaiaCookieDeletedByUserActionCallback callback) { + DCHECK(!gaia_cookie_deleted_by_user_action_callback_); + gaia_cookie_deleted_by_user_action_callback_ = std::move(callback); +} + void GaiaCookieManagerService::OnUbertokenFetchComplete( GoogleServiceAuthError error, const std::string& uber_token) { @@ -852,8 +856,8 @@ // services, in response to OnGaiaAccountsInCookieUpdated, may try in return // to call ListAccounts, which would immediately return false if the // ListAccounts request is still sitting in queue. - for (auto& observer : observer_list_) { - observer.OnGaiaAccountsInCookieUpdated( + if (gaia_accounts_updated_in_cookie_callback_) { + gaia_accounts_updated_in_cookie_callback_.Run( listed_accounts_, signed_out_accounts_, GoogleServiceAuthError(GoogleServiceAuthError::NONE)); } @@ -881,10 +885,12 @@ } RecordListAccountsFailure(error.state()); - for (auto& observer : observer_list_) { - observer.OnGaiaAccountsInCookieUpdated(listed_accounts_, - signed_out_accounts_, error); + + if (gaia_accounts_updated_in_cookie_callback_) { + gaia_accounts_updated_in_cookie_callback_.Run(listed_accounts_, + signed_out_accounts_, error); } + HandleNextRequest(); }
diff --git a/components/signin/core/browser/gaia_cookie_manager_service.h b/components/signin/core/browser/gaia_cookie_manager_service.h index f3fbd22..77055d1c 100644 --- a/components/signin/core/browser/gaia_cookie_manager_service.h +++ b/components/signin/core/browser/gaia_cookie_manager_service.h
@@ -88,6 +88,12 @@ const GoogleServiceAuthError&)> AddAccountToCookieCompletedCallback; + typedef base::RepeatingCallback<void(const std::vector<gaia::ListedAccount>&, + const std::vector<gaia::ListedAccount>&, + const GoogleServiceAuthError&)> + GaiaAccountsInCookieUpdatedCallback; + typedef base::RepeatingCallback<void()> GaiaCookieDeletedByUserActionCallback; + // Contains the information and parameters for any request. class GaiaCookieRequest { public: @@ -148,28 +154,6 @@ DISALLOW_COPY_AND_ASSIGN(GaiaCookieRequest); }; - class Observer { - public: - // Called whenever the GaiaCookieManagerService's list of GAIA accounts is - // updated. The GCMS monitors the APISID cookie and triggers a /ListAccounts - // call on change. The GCMS will also call ListAccounts upon the first call - // to ListAccounts(). The GCMS will delay calling ListAccounts if other - // requests are in queue that would modify the APISID cookie. - // If the ListAccounts call fails and the GCMS cannot recover, the reason - // is passed in |error|. - virtual void OnGaiaAccountsInCookieUpdated( - const std::vector<gaia::ListedAccount>& accounts, - const std::vector<gaia::ListedAccount>& signed_out_accounts, - const GoogleServiceAuthError& error) {} - - // Called when the Gaia cookie has been deleted explicitly by a user action, - // e.g. from the settings or by an extension. - virtual void OnGaiaCookieDeletedByUserAction() {} - - protected: - virtual ~Observer() {} - }; - // Class to retrieve the external connection check results from gaia. // Declared publicly for unit tests. class ExternalCcResultFetcher : public GaiaAuthConsumer { @@ -274,10 +258,6 @@ // service. Virtual for testing. virtual void ForceOnCookieChangeProcessing(); - // Add or remove observers of this helper. - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - // Cancel all login requests. void CancelAll(); @@ -299,6 +279,25 @@ list_accounts_stale_ = stale; } + // If set, this callback will be invoked whenever the + // GaiaCookieManagerService's list of GAIA accounts is updated. The GCMS + // monitors the APISID cookie and triggers a /ListAccounts call on change. + // The GCMS will also call ListAccounts upon the first call to + // ListAccounts(). The GCMS will delay calling ListAccounts if other + // requests are in queue that would modify the APISID cookie. + // If the ListAccounts call fails and the GCMS cannot recover, the reason + // is passed in |error|. + // This method can only be called once. + void SetGaiaAccountsInCookieUpdatedCallback( + GaiaAccountsInCookieUpdatedCallback callback); + + // If set, this callback will be invoked whenever the Gaia cookie has + // been deleted explicitly by a user action, e.g. from the settings or by an + // extension. + // This method can only be called once. + void SetGaiaCookieDeletedByUserActionCallback( + GaiaCookieDeletedByUserActionCallback callback); + // Returns a non-NULL pointer to its instance of net::BackoffEntry const net::BackoffEntry* GetBackoffEntry() { return &fetcher_backoff_; } @@ -365,6 +364,11 @@ OAuth2TokenService* token_service_; SigninClient* signin_client_; + GaiaAccountsInCookieUpdatedCallback gaia_accounts_updated_in_cookie_callback_; + GaiaCookieDeletedByUserActionCallback + gaia_cookie_deleted_by_user_action_callback_; + base::RepeatingCallback<scoped_refptr<network::SharedURLLoaderFactory>()> + shared_url_loader_factory_getter_; std::unique_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; std::unique_ptr<signin::UbertokenFetcherImpl> uber_token_fetcher_; ExternalCcResultFetcher external_cc_result_fetcher_; @@ -390,10 +394,6 @@ // executed at a time. base::circular_deque<GaiaCookieRequest> requests_; - // List of observers to notify when merge session completes. - // Makes sure list is empty on destruction. - base::ObserverList<Observer, true>::Unchecked observer_list_; - // True once the ExternalCCResultFetcher has completed once. bool external_cc_result_fetched_;
diff --git a/components/signin/core/browser/gaia_cookie_manager_service_unittest.cc b/components/signin/core/browser/gaia_cookie_manager_service_unittest.cc index 80c2108c..5a27c8f 100644 --- a/components/signin/core/browser/gaia_cookie_manager_service_unittest.cc +++ b/components/signin/core/browser/gaia_cookie_manager_service_unittest.cc
@@ -38,21 +38,19 @@ using MockAddAccountToCookieCompletedCallback = base::MockCallback< GaiaCookieManagerService::AddAccountToCookieCompletedCallback>; -class MockObserver : public GaiaCookieManagerService::Observer { +class MockObserver { public: - explicit MockObserver(GaiaCookieManagerService* helper) : helper_(helper) { - helper_->AddObserver(this); + explicit MockObserver(GaiaCookieManagerService* helper) { + helper->SetGaiaAccountsInCookieUpdatedCallback(base::BindRepeating( + &MockObserver::OnGaiaAccountsInCookieUpdated, base::Unretained(this))); } - ~MockObserver() override { helper_->RemoveObserver(this); } - MOCK_METHOD3(OnGaiaAccountsInCookieUpdated, void(const std::vector<gaia::ListedAccount>&, const std::vector<gaia::ListedAccount>&, const GoogleServiceAuthError&)); private: - GaiaCookieManagerService* helper_; DISALLOW_COPY_AND_ASSIGN(MockObserver); };
diff --git a/components/signin/core/browser/identity_manager_wrapper.cc b/components/signin/core/browser/identity_manager_wrapper.cc index 2025ebc..fab2d43 100644 --- a/components/signin/core/browser/identity_manager_wrapper.cc +++ b/components/signin/core/browser/identity_manager_wrapper.cc
@@ -5,6 +5,7 @@ #include "components/signin/core/browser/identity_manager_wrapper.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "services/identity/public/cpp/accounts_cookie_mutator.h" #include "services/identity/public/cpp/accounts_mutator.h" #include "services/identity/public/cpp/diagnostics_provider.h"
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 699e44e0..37dcc28 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -323,7 +323,7 @@ <translation id="2609632851001447353">Varianter</translation> <translation id="2618023639789766142">C10 (Envelope)</translation> <translation id="2625385379895617796">Dit ur er foran</translation> -<translation id="2634124572758952069">IP-adressen på serveren for <ph name="HOST_NAME" /> kunne ikke findes.</translation> +<translation id="2634124572758952069">IP-adressen på serveren for <ph name="HOST_NAME" /> blev ikke fundet.</translation> <translation id="2639739919103226564">Status:</translation> <translation id="2649204054376361687"><ph name="CITY" />, <ph name="COUNTRY" /></translation> <translation id="2650446666397867134">Der blev nægtet adgang til filen</translation>
diff --git a/components/sync/driver/sync_session_durations_metrics_recorder.h b/components/sync/driver/sync_session_durations_metrics_recorder.h index f4860817..b69ed49 100644 --- a/components/sync/driver/sync_session_durations_metrics_recorder.h +++ b/components/sync/driver/sync_session_durations_metrics_recorder.h
@@ -20,8 +20,7 @@ // Tracks the active browsing time that the user spends signed in and/or syncing // as fraction of their total browsing time. class SyncSessionDurationsMetricsRecorder - : public GaiaCookieManagerService::Observer, - public syncer::SyncServiceObserver, + : public syncer::SyncServiceObserver, public identity::IdentityManager::Observer { public: // Callers must ensure that the parameters outlive this object.
diff --git a/components/sync/protocol/proto_enum_conversions.cc b/components/sync/protocol/proto_enum_conversions.cc index dafaa2f..108c50f 100644 --- a/components/sync/protocol/proto_enum_conversions.cc +++ b/components/sync/protocol/proto_enum_conversions.cc
@@ -539,8 +539,10 @@ const char* ProtoEnumToString( sync_pb::WifiConfigurationSpecificsData::SecurityType security_type) { ASSERT_ENUM_BOUNDS(sync_pb::WifiConfigurationSpecificsData, SecurityType, - SECURITY_TYPE_NONE, SECURITY_TYPE_PSK); + SECURITY_TYPE_UNSPECIFIED, SECURITY_TYPE_PSK); switch (security_type) { + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, + SECURITY_TYPE_UNSPECIFIED); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, SECURITY_TYPE_NONE); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, SECURITY_TYPE_WEP); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, SECURITY_TYPE_PSK); @@ -552,11 +554,13 @@ const char* ProtoEnumToString( sync_pb::WifiConfigurationSpecificsData::AutomaticallyConnectOption automatically_connect_option) { - ASSERT_ENUM_BOUNDS(sync_pb::WifiConfigurationSpecificsData, - AutomaticallyConnectOption, AUTOMATICALLY_CONNECT_DISABLED, - AUTOMATICALLY_CONNECT_ENABLED); + ASSERT_ENUM_BOUNDS( + sync_pb::WifiConfigurationSpecificsData, AutomaticallyConnectOption, + AUTOMATICALLY_CONNECT_UNSPECIFIED, AUTOMATICALLY_CONNECT_ENABLED); switch (automatically_connect_option) { ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, + AUTOMATICALLY_CONNECT_UNSPECIFIED); + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, AUTOMATICALLY_CONNECT_DISABLED); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, AUTOMATICALLY_CONNECT_ENABLED); @@ -569,8 +573,10 @@ sync_pb::WifiConfigurationSpecificsData::IsPreferredOption is_preferred_option) { ASSERT_ENUM_BOUNDS(sync_pb::WifiConfigurationSpecificsData, IsPreferredOption, - IS_PREFERRED_DISABLED, IS_PREFERRED_ENABLED); + IS_PREFERRED_UNSPECIFIED, IS_PREFERRED_ENABLED); switch (is_preferred_option) { + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, + IS_PREFERRED_UNSPECIFIED); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, IS_PREFERRED_DISABLED); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, IS_PREFERRED_ENABLED); } @@ -579,13 +585,30 @@ } const char* ProtoEnumToString( + sync_pb::WifiConfigurationSpecificsData::MeteredOption metered_option) { + ASSERT_ENUM_BOUNDS(sync_pb::WifiConfigurationSpecificsData, MeteredOption, + METERED_OPTION_UNSPECIFIED, METERED_OPTION_AUTO); + switch (metered_option) { + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, + METERED_OPTION_UNSPECIFIED); + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, METERED_OPTION_NO); + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, METERED_OPTION_YES); + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData, METERED_OPTION_AUTO); + } + NOTREACHED(); + return ""; +} + +const char* ProtoEnumToString( sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration::ProxyOption proxy_option) { ASSERT_ENUM_BOUNDS( sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration, ProxyOption, - PROXY_OPTION_DISABLED, PROXY_OPTION_MANUAL); + PROXY_OPTION_UNSPECIFIED, PROXY_OPTION_MANUAL); switch (proxy_option) { ENUM_CASE(sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration, + PROXY_OPTION_UNSPECIFIED); + ENUM_CASE(sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration, PROXY_OPTION_DISABLED); ENUM_CASE(sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration, PROXY_OPTION_AUTOMATIC);
diff --git a/components/sync/protocol/proto_enum_conversions_unittest.cc b/components/sync/protocol/proto_enum_conversions_unittest.cc index f8e26a7..127a084 100644 --- a/components/sync/protocol/proto_enum_conversions_unittest.cc +++ b/components/sync/protocol/proto_enum_conversions_unittest.cc
@@ -42,6 +42,38 @@ sync_pb::SyncEnums::PageTransitionRedirectType_MAX); } +TEST_F(ProtoEnumConversionsTest, GetWifiConfigurationSecurityTypeString) { + TestEnumStringFunction( + sync_pb::WifiConfigurationSpecificsData::SecurityType_MIN, + sync_pb::WifiConfigurationSpecificsData::SecurityType_MAX); +} + +TEST_F(ProtoEnumConversionsTest, + GetWifiConfigurationAutomaticallyConnectOptionString) { + TestEnumStringFunction( + sync_pb::WifiConfigurationSpecificsData::AutomaticallyConnectOption_MIN, + sync_pb::WifiConfigurationSpecificsData::AutomaticallyConnectOption_MAX); +} + +TEST_F(ProtoEnumConversionsTest, GetWifiConfigurationIsPreferredOptionString) { + TestEnumStringFunction( + sync_pb::WifiConfigurationSpecificsData::IsPreferredOption_MIN, + sync_pb::WifiConfigurationSpecificsData::IsPreferredOption_MAX); +} + +TEST_F(ProtoEnumConversionsTest, GetWifiConfigurationMeteredOptionString) { + TestEnumStringFunction( + sync_pb::WifiConfigurationSpecificsData::MeteredOption_MIN, + sync_pb::WifiConfigurationSpecificsData::MeteredOption_MAX); +} + +TEST_F(ProtoEnumConversionsTest, GetWifiConfigurationProxyOptionString) { + TestEnumStringFunction(sync_pb::WifiConfigurationSpecificsData:: + ProxyConfiguration::ProxyOption_MIN, + sync_pb::WifiConfigurationSpecificsData:: + ProxyConfiguration::ProxyOption_MAX); +} + TEST_F(ProtoEnumConversionsTest, GetWifiCredentialSecurityClassString) { TestEnumStringFunction(sync_pb::WifiCredentialSpecifics::SecurityClass_MIN, sync_pb::WifiCredentialSpecifics::SecurityClass_MAX);
diff --git a/components/sync/protocol/wifi_configuration_specifics.proto b/components/sync/protocol/wifi_configuration_specifics.proto index 2c91c45..1a81327 100644 --- a/components/sync/protocol/wifi_configuration_specifics.proto +++ b/components/sync/protocol/wifi_configuration_specifics.proto
@@ -19,38 +19,43 @@ // May contain NUL, not necessarily UTF-8 encoded. optional bytes ssid = 1; enum SecurityType { - SECURITY_TYPE_NONE = 0; - SECURITY_TYPE_WEP = 1; - SECURITY_TYPE_PSK = 2; // WPA-PSK or RSN-PSK + SECURITY_TYPE_UNSPECIFIED = 0; + SECURITY_TYPE_NONE = 1; + SECURITY_TYPE_WEP = 2; + SECURITY_TYPE_PSK = 3; // WPA-PSK or RSN-PSK } optional SecurityType security_type = 2; // The passphrase can be ASCII, UTF-8, or a string of hex digits. optional bytes passphrase = 3; enum AutomaticallyConnectOption { - AUTOMATICALLY_CONNECT_DISABLED = 0; - AUTOMATICALLY_CONNECT_ENABLED = 1; + AUTOMATICALLY_CONNECT_UNSPECIFIED = 0; + AUTOMATICALLY_CONNECT_DISABLED = 1; + AUTOMATICALLY_CONNECT_ENABLED = 2; } optional AutomaticallyConnectOption automatically_connect = 4; enum IsPreferredOption { - IS_PREFERRED_DISABLED = 0; - IS_PREFERRED_ENABLED = 1; + IS_PREFERRED_UNSPECIFIED = 0; + IS_PREFERRED_DISABLED = 1; + IS_PREFERRED_ENABLED = 2; } optional IsPreferredOption is_preferred = 5; enum MeteredOption { - METERED_OPTION_NO = 0; - METERED_OPTION_YES = 1; + METERED_OPTION_UNSPECIFIED = 0; + METERED_OPTION_NO = 1; + METERED_OPTION_YES = 2; // Allows the device to use heuristics to determine if network is metered. - METERED_OPTION_AUTO = 2; + METERED_OPTION_AUTO = 3; } optional MeteredOption metered = 6; message ProxyConfiguration { enum ProxyOption { - PROXY_OPTION_DISABLED = 0; + PROXY_OPTION_UNSPECIFIED = 0; + PROXY_OPTION_DISABLED = 1; // Use a Proxy Auto-config(PAC) Url, set in proxy_url - PROXY_OPTION_AUTOMATIC = 1; + PROXY_OPTION_AUTOMATIC = 2; // Uses Web Proxy Auto-Discovery Protocol (WPAD) to discover the proxy // settings using DHCP/DNS. - PROXY_OPTION_AUTODISCOVERY = 2; + PROXY_OPTION_AUTODISCOVERY = 3; // User sets proxy_url, proxy_port, and whitelisted_domains manually. PROXY_OPTION_MANUAL = 4; }
diff --git a/components/test/DEPS b/components/test/DEPS index 3350f447..f5279c7 100644 --- a/components/test/DEPS +++ b/components/test/DEPS
@@ -6,6 +6,7 @@ "+jni", "+media", "+net", + "+services/network/public/cpp", "+ui", ]
diff --git a/components/test/components_test_suite.cc b/components/test/components_test_suite.cc index bace6e0..15d451e5 100644 --- a/components/test/components_test_suite.cc +++ b/components/test/components_test_suite.cc
@@ -17,6 +17,7 @@ #include "build/buildflag.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "mojo/core/embedder/embedder.h" +#include "services/network/public/cpp/features.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_paths.h" @@ -145,7 +146,8 @@ // components_unittests don't currently work with the Network Service enabled. // https://crbug.com/966633. auto test_suite = std::make_unique<content::UnitTestTestSuite>( - new ComponentsTestSuite(argc, argv), "NetworkService"); + new ComponentsTestSuite(argc, argv), + network::features::kNetworkServiceFeatureName); #else auto test_suite = std::make_unique<ComponentsTestSuite>(argc, argv); #endif
diff --git a/components/unified_consent/feature.cc b/components/unified_consent/feature.cc index 74762648..5767912 100644 --- a/components/unified_consent/feature.cc +++ b/components/unified_consent/feature.cc
@@ -11,7 +11,7 @@ // base::Feature definition. const base::Feature kUnifiedConsent { "UnifiedConsent", -#if defined(OS_CHROMEOS) || defined(OS_IOS) +#if defined(OS_CHROMEOS) base::FEATURE_DISABLED_BY_DEFAULT #else base::FEATURE_ENABLED_BY_DEFAULT
diff --git a/components/unified_consent/feature_unittest.cc b/components/unified_consent/feature_unittest.cc index 89aa50b..b0e550b 100644 --- a/components/unified_consent/feature_unittest.cc +++ b/components/unified_consent/feature_unittest.cc
@@ -30,8 +30,8 @@ // Apple platforms #if defined(OS_IOS) - // Unified consent is disabled by default. - EXPECT_FALSE(IsUnifiedConsentFeatureEnabled()); + // Unified consent is enabled by default. + EXPECT_TRUE(IsUnifiedConsentFeatureEnabled()); #endif #if defined(OS_MACOSX) && !defined(OS_IOS)
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index 8e426c5..25b644c 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -15,6 +15,10 @@ #include "content/shell/browser/shell.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "testing/gmock/include/gmock/gmock.h" + +using testing::Each; +using testing::Not; namespace content { @@ -43,6 +47,23 @@ base::test::ScopedFeatureList feature_list_; }; +// Match RenderFrameHostImpl* that are in the BackForwardCache. +MATCHER(InBackForwardCache, "") { + return arg->is_in_back_forward_cache(); +} + +// Match RenderFrameDeleteObserver* which observed deletion of the RenderFrame. +MATCHER(Deleted, "") { + return arg->deleted(); +} + +// Helper function to pass an initializer list to the EXPECT_THAT macro. This is +// indeed the identity function. +std::initializer_list<RenderFrameHostImpl*> Elements( + std::initializer_list<RenderFrameHostImpl*> t) { + return t; +} + } // namespace // Navigate from A to B and go back. @@ -52,12 +73,12 @@ GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); // 1) Navigate to A. - NavigateToURL(shell(), url_a); + EXPECT_TRUE(NavigateToURL(shell(), url_a)); RenderFrameHostImpl* rfh_a = current_frame_host(); RenderFrameDeletedObserver delete_rfh_a(rfh_a); // 2) Navigate to B. - NavigateToURL(shell(), url_b); + EXPECT_TRUE(NavigateToURL(shell(), url_b)); RenderFrameHostImpl* rfh_b = current_frame_host(); RenderFrameDeletedObserver delete_rfh_b(rfh_b); EXPECT_FALSE(delete_rfh_a.deleted()); @@ -82,14 +103,14 @@ GURL url_c(embedded_test_server()->GetURL("c.com", "/title1.html")); // 1) Navigate to A(B). - NavigateToURL(shell(), url_a); + EXPECT_TRUE(NavigateToURL(shell(), url_a)); RenderFrameHostImpl* rfh_a = current_frame_host(); RenderFrameHostImpl* rfh_b = rfh_a->child_at(0)->current_frame_host(); RenderFrameDeletedObserver delete_rfh_a(rfh_a); RenderFrameDeletedObserver delete_rfh_b(rfh_b); // 2) Navigate to C. - NavigateToURL(shell(), url_c); + EXPECT_TRUE(NavigateToURL(shell(), url_c)); RenderFrameHostImpl* rfh_c = current_frame_host(); RenderFrameDeletedObserver delete_rfh_c(rfh_c); EXPECT_FALSE(delete_rfh_a.deleted()); @@ -117,12 +138,12 @@ GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); // 1) Navigate to A. - NavigateToURL(shell(), url_a); + EXPECT_TRUE(NavigateToURL(shell(), url_a)); RenderFrameHostImpl* rfh_a = current_frame_host(); RenderFrameDeletedObserver delete_rfh_a(rfh_a); // 2) Navigate to B. - NavigateToURL(shell(), url_b); + EXPECT_TRUE(NavigateToURL(shell(), url_b)); RenderFrameHostImpl* rfh_b = current_frame_host(); RenderFrameDeletedObserver delete_rfh_b(rfh_b); EXPECT_FALSE(delete_rfh_a.deleted()); @@ -151,10 +172,10 @@ GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); // 1) Go to A. - NavigateToURL(shell(), url_a); + EXPECT_TRUE(NavigateToURL(shell(), url_a)); // 2) Go to B. - NavigateToURL(shell(), url_b); + EXPECT_TRUE(NavigateToURL(shell(), url_b)); // 3) Go back to A. web_contents()->GetController().GoBack(); @@ -171,11 +192,11 @@ GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html")); GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); - NavigateToURL(shell(), url_a); // BackForwardCache size is 0. + EXPECT_TRUE(NavigateToURL(shell(), url_a)); // BackForwardCache size is 0. RenderFrameHostImpl* rfh_a = current_frame_host(); RenderFrameDeletedObserver delete_rfh_a(rfh_a); - NavigateToURL(shell(), url_b); // BackForwardCache size is 1. + EXPECT_TRUE(NavigateToURL(shell(), url_b)); // BackForwardCache size is 1. RenderFrameHostImpl* rfh_b = current_frame_host(); RenderFrameDeletedObserver delete_rfh_b(rfh_b); @@ -192,4 +213,195 @@ } } +// Similar to BackForwardCacheBrowserTest.SubframeSurviveCache* +// Test case: a1(b2) -> c3 -> a1(b2) +IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, SubframeSurviveCache1) { + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_a(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(b)")); + GURL url_c(embedded_test_server()->GetURL("c.com", "/title1.html")); + + std::vector<RenderFrameDeletedObserver*> rfh_observer; + + // 1) Navigate to a1(b2). + NavigateToURL(shell(), url_a); + RenderFrameHostImpl* a1 = current_frame_host(); + RenderFrameHostImpl* b2 = a1->child_at(0)->current_frame_host(); + RenderFrameDeletedObserver a1_observer(a1), b2_observer(b2); + rfh_observer.insert(rfh_observer.end(), {&a1_observer, &b2_observer}); + EXPECT_TRUE(ExecJs(b2, "window.alive = 'I am alive';")); + + // 2) Navigate to c3. + NavigateToURL(shell(), url_c); + RenderFrameHostImpl* c3 = current_frame_host(); + RenderFrameDeletedObserver c3_observer(c3); + rfh_observer.push_back(&c3_observer); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({a1, b2}), Each(InBackForwardCache())); + EXPECT_THAT(c3, Not(InBackForwardCache())); + + // 3) Go back to a1(b2). + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({a1, b2}), Each(Not(InBackForwardCache()))); + EXPECT_THAT(c3, InBackForwardCache()); + + // Even after a new IPC round trip with the renderer, b2 must still be alive. + EXPECT_EQ("I am alive", EvalJs(b2, "window.alive")); + EXPECT_FALSE(b2_observer.deleted()); +} + +// Similar to BackForwardCacheBrowserTest.SubframeSurviveCache* +// Test case: a1(b2) -> b3 -> a1(b2). +IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, SubframeSurviveCache2) { + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_a(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(b)")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); + + std::vector<RenderFrameDeletedObserver*> rfh_observer; + + // 1) Navigate to a1(b2). + NavigateToURL(shell(), url_a); + RenderFrameHostImpl* a1 = current_frame_host(); + RenderFrameHostImpl* b2 = a1->child_at(0)->current_frame_host(); + RenderFrameDeletedObserver a1_observer(a1), b2_observer(b2); + rfh_observer.insert(rfh_observer.end(), {&a1_observer, &b2_observer}); + EXPECT_TRUE(ExecJs(b2, "window.alive = 'I am alive';")); + + // 2) Navigate to b3. + NavigateToURL(shell(), url_b); + RenderFrameHostImpl* b3 = current_frame_host(); + RenderFrameDeletedObserver b3_observer(b3); + rfh_observer.push_back(&b3_observer); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({a1, b2}), Each(InBackForwardCache())); + EXPECT_THAT(b3, Not(InBackForwardCache())); + + // 3) Go back to a1(b2). + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_EQ(a1, current_frame_host()); + EXPECT_THAT(Elements({a1, b2}), Each(Not(InBackForwardCache()))); + EXPECT_THAT(b3, InBackForwardCache()); + + // Even after a new IPC round trip with the renderer, b2 must still be alive. + EXPECT_EQ("I am alive", EvalJs(b2, "window.alive")); + EXPECT_FALSE(b2_observer.deleted()); +} + +// Similar to BackForwardCacheBrowserTest.tSubframeSurviveCache* +// Test case: a1(b2) -> b3(a4) -> a1(b2) -> b3(a4) +IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, SubframeSurviveCache3) { + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_a(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(b)")); + GURL url_b(embedded_test_server()->GetURL( + "b.com", "/cross_site_iframe_factory.html?b(a)")); + + std::vector<RenderFrameDeletedObserver*> rfh_observer; + + // 1) Navigate to a1(b2). + NavigateToURL(shell(), url_a); + RenderFrameHostImpl* a1 = current_frame_host(); + RenderFrameHostImpl* b2 = a1->child_at(0)->current_frame_host(); + RenderFrameDeletedObserver a1_observer(a1), b2_observer(b2); + rfh_observer.insert(rfh_observer.end(), {&a1_observer, &b2_observer}); + EXPECT_TRUE(ExecJs(b2, "window.alive = 'I am alive';")); + + // 2) Navigate to b3(a4) + NavigateToURL(shell(), url_b); + RenderFrameHostImpl* b3 = current_frame_host(); + RenderFrameHostImpl* a4 = b3->child_at(0)->current_frame_host(); + RenderFrameDeletedObserver b3_observer(b3), a4_observer(a4); + rfh_observer.insert(rfh_observer.end(), {&b3_observer, &a4_observer}); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({a1, b2}), Each(InBackForwardCache())); + EXPECT_THAT(Elements({b3, a4}), Each(Not(InBackForwardCache()))); + EXPECT_TRUE(ExecJs(a4, "window.alive = 'I am alive';")); + + // 3) Go back to a1(b2). + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_EQ(a1, current_frame_host()); + EXPECT_THAT(Elements({a1, b2}), Each(Not(InBackForwardCache()))); + EXPECT_THAT(Elements({b3, a4}), Each(InBackForwardCache())); + + // Even after a new IPC round trip with the renderer, b2 must still be alive. + EXPECT_EQ("I am alive", EvalJs(b2, "window.alive")); + EXPECT_FALSE(b2_observer.deleted()); + + // 4) Go forward to b3(a4). + web_contents()->GetController().GoForward(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_EQ(b3, current_frame_host()); + EXPECT_THAT(Elements({a1, b2}), Each(InBackForwardCache())); + EXPECT_THAT(Elements({b3, a4}), Each(Not(InBackForwardCache()))); + + // Even after a new IPC round trip with the renderer, a4 must still be alive. + EXPECT_EQ("I am alive", EvalJs(a4, "window.alive")); + EXPECT_FALSE(a4_observer.deleted()); +} + +// Similar to BackForwardCacheBrowserTest.SubframeSurviveCache* +// Test case: a1(b2) -> b3 -> a4 -> b5 -> a1(b2). +IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, SubframeSurviveCache4) { + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_ab(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(b)")); + GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); + + std::vector<RenderFrameDeletedObserver*> rfh_observer; + + // 1) Navigate to a1(b2). + NavigateToURL(shell(), url_ab); + RenderFrameHostImpl* a1 = current_frame_host(); + RenderFrameHostImpl* b2 = a1->child_at(0)->current_frame_host(); + RenderFrameDeletedObserver a1_observer(a1), b2_observer(b2); + rfh_observer.insert(rfh_observer.end(), {&a1_observer, &b2_observer}); + EXPECT_TRUE(ExecJs(b2, "window.alive = 'I am alive';")); + + // 2) Navigate to b3. + NavigateToURL(shell(), url_b); + RenderFrameHostImpl* b3 = current_frame_host(); + RenderFrameDeletedObserver b3_observer(b3); + rfh_observer.push_back(&b3_observer); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({a1, b2}), Each(InBackForwardCache())); + EXPECT_THAT(b3, Not(InBackForwardCache())); + + // 3) Navigate to a4. + NavigateToURL(shell(), url_a); + RenderFrameHostImpl* a4 = current_frame_host(); + RenderFrameDeletedObserver a4_observer(a4); + rfh_observer.push_back(&a4_observer); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + + // 4) Navigate to b5 + NavigateToURL(shell(), url_b); + RenderFrameHostImpl* b5 = current_frame_host(); + RenderFrameDeletedObserver b5_observer(b5); + rfh_observer.push_back(&b5_observer); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({a1, b2, b3, a4}), Each(InBackForwardCache())); + EXPECT_THAT(b5, Not(InBackForwardCache())); + + // 3) Go back to a1(b2). + web_contents()->GetController().GoToOffset(-3); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + EXPECT_EQ(a1, current_frame_host()); + ASSERT_THAT(rfh_observer, Each(Not(Deleted()))); + EXPECT_THAT(Elements({b3, a4, b5}), Each(InBackForwardCache())); + EXPECT_THAT(Elements({a1, b2}), Each(Not(InBackForwardCache()))); + + // Even after a new IPC round trip with the renderer, b2 must still be alive. + EXPECT_EQ("I am alive", EvalJs(b2, "window.alive")); + EXPECT_FALSE(b2_observer.deleted()); +} + } // namespace content
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc index 41d2063..ef01e844 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.cc +++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -410,6 +410,15 @@ } } +void WebBluetoothServiceImpl::OnVisibilityChanged(Visibility visibility) { + if (visibility == content::Visibility::HIDDEN || + visibility == content::Visibility::OCCLUDED) { + allowed_scan_filters_.clear(); + accept_all_advertisements_ = false; + scanning_clients_.clear(); + } +} + void WebBluetoothServiceImpl::AdapterPoweredChanged( device::BluetoothAdapter* adapter, bool powered) {
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.h b/content/browser/bluetooth/web_bluetooth_service_impl.h index 890b0cc..356c24f9 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.h +++ b/content/browser/bluetooth/web_bluetooth_service_impl.h
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/optional.h" #include "content/browser/bad_message.h" @@ -81,7 +82,12 @@ BluetoothDeviceScanningPromptController* prompt_controller); private: + FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplTest, + BluetoothScanningPermissionRevokedWhenTabHidden); + FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplTest, + BluetoothScanningPermissionRevokedWhenTabOccluded); friend class FrameConnectedBluetoothDevicesTest; + friend class WebBluetoothServiceImplTest; using PrimaryServicesRequestCallback = base::OnceCallback<void(device::BluetoothDevice*)>; using ScanFilters = std::vector<blink::mojom::WebBluetoothLeScanFilterPtr>; @@ -133,6 +139,7 @@ // These functions should always check that the affected RenderFrameHost // is this->render_frame_host_ and not some other frame in the same tab. void DidFinishNavigation(NavigationHandle* navigation_handle) override; + void OnVisibilityChanged(Visibility visibility) override; // BluetoothAdapter::Observer: void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc new file mode 100644 index 0000000..d633a748 --- /dev/null +++ b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
@@ -0,0 +1,150 @@ +// 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. + +#include "content/browser/bluetooth/web_bluetooth_service_impl.h" + +#include "base/macros.h" +#include "base/test/bind_test_util.h" +#include "content/public/browser/web_contents_delegate.h" +#include "content/test/test_render_view_host.h" +#include "content/test/test_web_contents.h" +#include "device/bluetooth/bluetooth_adapter_factory_wrapper.h" +#include "device/bluetooth/test/mock_bluetooth_adapter.h" +#include "mojo/public/cpp/bindings/associated_interface_ptr.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::Return; + +namespace content { + +namespace { + +const char kBatteryServiceUUIDString[] = "0000180f-0000-1000-8000-00805f9b34fb"; + +class FakeBluetoothScanningPrompt : public BluetoothScanningPrompt { + public: + explicit FakeBluetoothScanningPrompt(const EventHandler& event_handler) { + event_handler.Run(content::BluetoothScanningPrompt::Event::kAllow); + } + ~FakeBluetoothScanningPrompt() override = default; + + private: + DISALLOW_COPY_AND_ASSIGN(FakeBluetoothScanningPrompt); +}; + +class FakeBluetoothAdapter : public device::MockBluetoothAdapter { + public: + FakeBluetoothAdapter() = default; + + // device::BluetoothAdapter: + void StartScanWithFilter( + std::unique_ptr<device::BluetoothDiscoveryFilter> discovery_filter, + DiscoverySessionResultCallback callback) override { + std::move(callback).Run( + /*is_error=*/false, + device::UMABluetoothDiscoverySessionOutcome::SUCCESS); + } + + protected: + ~FakeBluetoothAdapter() override = default; + + private: + DISALLOW_COPY_AND_ASSIGN(FakeBluetoothAdapter); +}; + +class FakeWebContentsDelegate : public content::WebContentsDelegate { + public: + FakeWebContentsDelegate() = default; + ~FakeWebContentsDelegate() override = default; + + std::unique_ptr<BluetoothScanningPrompt> ShowBluetoothScanningPrompt( + RenderFrameHost* frame, + const BluetoothScanningPrompt::EventHandler& event_handler) override { + return std::make_unique<FakeBluetoothScanningPrompt>(event_handler); + } + + private: + DISALLOW_COPY_AND_ASSIGN(FakeWebContentsDelegate); +}; + +} // namespace + +class WebBluetoothServiceImplTest : public RenderViewHostImplTestHarness { + public: + WebBluetoothServiceImplTest() = default; + ~WebBluetoothServiceImplTest() override = default; + + void SetUp() override { + RenderViewHostImplTestHarness::SetUp(); + + // Set up an adapter. + scoped_refptr<FakeBluetoothAdapter> adapter(new FakeBluetoothAdapter()); + EXPECT_CALL(*adapter, IsPresent()).WillRepeatedly(Return(true)); + device::BluetoothAdapterFactoryWrapper::Get().SetBluetoothAdapterForTesting( + adapter); + + contents()->GetMainFrame()->InitializeRenderFrameIfNeeded(); + contents()->SetDelegate(&delegate_); + + // Simulate a frame connected to a bluetooth service. + service_ = + contents()->GetMainFrame()->CreateWebBluetoothServiceForTesting(); + + blink::mojom::WebBluetoothScanClientAssociatedPtrInfo client_info; + mojo::MakeRequest(&client_info); + auto options = blink::mojom::WebBluetoothRequestLEScanOptions::New(); + base::Optional<std::vector<device::BluetoothUUID>> services; + services.emplace(); + services->push_back(device::BluetoothUUID(kBatteryServiceUUIDString)); + auto filter = + blink::mojom::WebBluetoothLeScanFilter::New(services, "a", "b"); + options->filters.emplace(); + options->filters->push_back(filter.Clone()); + filters_.emplace(); + filters_->push_back(filter.Clone()); + service_->RequestScanningStart( + std::move(client_info), std::move(options), + base::BindLambdaForTesting( + [&](blink::mojom::RequestScanningStartResultPtr p) { + loop_.Quit(); + })); + loop_.Run(); + } + + void TearDown() override { + service_ = nullptr; + RenderViewHostImplTestHarness::TearDown(); + } + + protected: + WebBluetoothServiceImpl* service_; + base::Optional<WebBluetoothServiceImpl::ScanFilters> filters_; + FakeWebContentsDelegate delegate_; + base::RunLoop loop_; + + private: + DISALLOW_COPY_AND_ASSIGN(WebBluetoothServiceImplTest); +}; + +TEST_F(WebBluetoothServiceImplTest, + BluetoothScanningPermissionRevokedWhenTabHidden) { + EXPECT_TRUE(service_->AreScanFiltersAllowed(filters_)); + + contents()->SetVisibility(content::Visibility::HIDDEN); + + // The previously granted Bluetooth scanning permission should be revoked. + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_)); +} + +TEST_F(WebBluetoothServiceImplTest, + BluetoothScanningPermissionRevokedWhenTabOccluded) { + EXPECT_TRUE(service_->AreScanFiltersAllowed(filters_)); + + contents()->SetVisibility(content::Visibility::OCCLUDED); + + // The previously granted Bluetooth scanning permission should be revoked. + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_)); +} + +} // namespace content
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage.cc b/content/browser/cache_storage/legacy/legacy_cache_storage.cc index f91df0d1..422f0f5a 100644 --- a/content/browser/cache_storage/legacy/legacy_cache_storage.cc +++ b/content/browser/cache_storage/legacy/legacy_cache_storage.cc
@@ -259,7 +259,7 @@ int64_t cache_size, int64_t cache_padding, std::unique_ptr<SymmetricKey> cache_padding_key) override { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(base::ContainsKey(cache_name_to_cache_dir_, cache_name)); std::string cache_dir = cache_name_to_cache_dir_[cache_name]; @@ -272,7 +272,7 @@ void PrepareNewCacheDestination(const std::string& cache_name, CacheCallback callback) override { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); PostTaskAndReplyWithResult( cache_task_runner_.get(), FROM_HERE, @@ -311,7 +311,7 @@ } void CleanUpDeletedCache(CacheStorageCache* cache) override { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(base::ContainsKey(doomed_cache_to_path_, cache)); base::FilePath cache_path = @@ -330,7 +330,7 @@ void WriteIndex(const CacheStorageIndex& index, BoolCallback callback) override { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // 1. Create the index file as a string. (WriteIndex) // 2. Write the file to disk. (WriteIndexWriteToFileInPool) @@ -387,7 +387,7 @@ } void LoadIndex(CacheStorageIndexLoadCallback callback) override { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); PostTaskAndReplyWithResult( cache_task_runner_.get(), FROM_HERE, @@ -399,7 +399,7 @@ void LoadIndexDidReadIndex(CacheStorageIndexLoadCallback callback, proto::CacheStorageIndex protobuf_index) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<std::set<std::string>> cache_dirs( new std::set<std::string>); @@ -549,6 +549,7 @@ std::map<std::string, std::string> cache_name_to_cache_dir_; std::map<CacheStorageCache*, std::string> doomed_cache_to_path_; + SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<SimpleCacheLoader> weak_ptr_factory_; }; @@ -610,7 +611,7 @@ void LegacyCacheStorage::OpenCache(const std::string& cache_name, int64_t trace_id, CacheAndErrorCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -633,7 +634,7 @@ void LegacyCacheStorage::HasCache(const std::string& cache_name, int64_t trace_id, BoolAndErrorCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -652,7 +653,7 @@ void LegacyCacheStorage::DoomCache(const std::string& cache_name, int64_t trace_id, ErrorCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -670,7 +671,7 @@ void LegacyCacheStorage::EnumerateCaches(int64_t trace_id, EnumerateCachesCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -692,7 +693,7 @@ blink::mojom::CacheQueryOptionsPtr match_options, int64_t trace_id, CacheStorageCache::ResponseCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -714,7 +715,7 @@ blink::mojom::CacheQueryOptionsPtr match_options, int64_t trace_id, CacheStorageCache::ResponseCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -737,7 +738,7 @@ blink::mojom::FetchAPIResponsePtr response, int64_t trace_id, LegacyCacheStorage::ErrorCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -755,7 +756,7 @@ } void LegacyCacheStorage::GetSizeThenCloseAllCaches(SizeCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -768,7 +769,7 @@ } void LegacyCacheStorage::Size(LegacyCacheStorage::SizeCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!initialized_) LazyInit(); @@ -791,7 +792,7 @@ void LegacyCacheStorage::ScheduleWriteIndex() { static const int64_t kWriteIndexDelaySecs = 5; - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); index_write_task_.Reset(base::BindOnce(&LegacyCacheStorage::WriteIndex, weak_factory_.GetWeakPtr(), base::DoNothing::Once<bool>())); @@ -801,7 +802,7 @@ } void LegacyCacheStorage::WriteIndex(base::OnceCallback<void(bool)> callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); scheduler_->ScheduleOperation( CacheStorageSchedulerOp::kWriteIndex, base::BindOnce(&LegacyCacheStorage::WriteIndexImpl, @@ -811,13 +812,13 @@ void LegacyCacheStorage::WriteIndexImpl( base::OnceCallback<void(bool)> callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); cache_loader_->WriteIndex(*cache_index_, std::move(callback)); } bool LegacyCacheStorage::InitiateScheduledIndexWriteForTest( base::OnceCallback<void(bool)> callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (index_write_pending()) { index_write_task_.Cancel(); WriteIndex(std::move(callback)); @@ -842,7 +843,7 @@ } void LegacyCacheStorage::ReleaseUnreferencedCaches() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); for (auto& entry : cache_map_) { if (entry.second && entry.second->IsUnreferenced()) entry.second.reset(); @@ -886,7 +887,7 @@ // Init is run lazily so that it is called on the proper MessageLoop. void LegacyCacheStorage::LazyInit() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!initialized_); if (initializing_) @@ -902,7 +903,7 @@ } void LegacyCacheStorage::LazyInitImpl() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!initialized_); DCHECK(initializing_); @@ -917,7 +918,7 @@ void LegacyCacheStorage::LazyInitDidLoadIndex( std::unique_ptr<CacheStorageIndex> index) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(cache_map_.empty()); for (const auto& cache_metadata : index->ordered_cache_metadata()) { @@ -958,7 +959,7 @@ int64_t trace_id, CacheAndErrorCallback callback, std::unique_ptr<LegacyCacheStorageCache> cache) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT_WITH_FLOW0("CacheStorage", "LegacyCacheStorage::CreateCacheDidCreateCache", @@ -999,7 +1000,7 @@ CacheStorageCacheHandle cache_handle, int64_t trace_id, bool success) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(cache_handle.value()); TRACE_EVENT_WITH_FLOW0("CacheStorage", @@ -1052,7 +1053,7 @@ ErrorCallback callback, int64_t trace_id, bool success) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); auto* impl = LegacyCacheStorageCache::From(cache_handle); TRACE_EVENT_WITH_FLOW0("CacheStorage", @@ -1264,7 +1265,7 @@ CacheStorageCacheHandle LegacyCacheStorage::GetLoadedCache( const std::string& cache_name) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(initialized_); auto map_iter = cache_map_.find(cache_name); @@ -1303,7 +1304,7 @@ } void LegacyCacheStorage::GetSizeThenCloseAllCachesImpl(SizeCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(initialized_); std::unique_ptr<int64_t> accumulator(new int64_t(0)); @@ -1332,7 +1333,7 @@ } void LegacyCacheStorage::SizeImpl(SizeCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(initialized_); if (cache_index_->GetPaddedStorageSize() != kSizeUnknown) {
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc index abd1706..c196ca8 100644 --- a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc +++ b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc
@@ -26,7 +26,6 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "base/trace_event/traced_value.h" #include "content/browser/cache_storage/cache_storage.pb.h" @@ -42,7 +41,6 @@ #include "content/browser/cache_storage/legacy/legacy_cache_storage.h" #include "content/common/background_fetch/background_fetch_types.h" #include "content/common/service_worker/service_worker_utils.h" -#include "content/public/browser/browser_thread.h" #include "content/public/common/content_features.h" #include "content/public/common/referrer.h" #include "content/public/common/referrer_type_converters.h" @@ -577,7 +575,7 @@ scoped_refptr<net::IOBuffer> buffer, int buf_len) { if (backend_state_ == BACKEND_CLOSED) { - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce( std::move(callback), @@ -588,7 +586,7 @@ // GetUsageAndQuota is called before entering a scheduled operation since it // can call Size, another scheduled operation. quota_manager_proxy_->GetUsageAndQuota( - base::ThreadTaskRunnerHandle::Get().get(), origin_, + scheduler_task_runner_.get(), origin_, blink::mojom::StorageType::kTemporary, base::BindOnce(&LegacyCacheStorageCache::WriteSideDataDidGetQuota, weak_ptr_factory_.GetWeakPtr(), std::move(callback), url, @@ -606,7 +604,7 @@ base::Optional<std::string> message; if (backend_state_ == BACKEND_CLOSED) { - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce( std::move(callback), @@ -633,7 +631,7 @@ message.emplace( base::StringPrintf("duplicate requests (%s)", url_list_string.c_str())); - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(callback), CacheStorageVerboseError::New( @@ -655,9 +653,9 @@ } } if (!safe_space_required.IsValid() || !safe_side_data_size.IsValid()) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, std::move(bad_message_callback)); - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask(FROM_HERE, + std::move(bad_message_callback)); + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce( std::move(callback), @@ -675,7 +673,7 @@ // Put runs, the cache might already be full and the origin will be larger // than it's supposed to be. quota_manager_proxy_->GetUsageAndQuota( - base::ThreadTaskRunnerHandle::Get().get(), origin_, + scheduler_task_runner_.get(), origin_, blink::mojom::StorageType::kTemporary, base::BindOnce(&LegacyCacheStorageCache::BatchDidGetUsageAndQuota, weak_ptr_factory_.GetWeakPtr(), std::move(operations), @@ -714,9 +712,9 @@ safe_space_required_with_side_data = safe_space_required + side_data_size; if (!safe_space_required.IsValid() || !safe_space_required_with_side_data.IsValid()) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, std::move(bad_message_callback)); - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask(FROM_HERE, + std::move(bad_message_callback)); + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce( std::move(callback), @@ -728,7 +726,7 @@ } if (status_code != blink::mojom::QuotaStatusCode::kOk || safe_space_required.ValueOrDie() > quota) { - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(callback), CacheStorageVerboseError::New( CacheStorageError::kErrorQuotaExceeded, @@ -849,8 +847,8 @@ void LegacyCacheStorageCache::Size(SizeCallback callback) { if (backend_state_ == BACKEND_CLOSED) { // TODO(jkarlin): Delete caches that can't be initialized. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), 0)); + scheduler_task_runner_->PostTask(FROM_HERE, + base::BindOnce(std::move(callback), 0)); return; } @@ -863,8 +861,8 @@ void LegacyCacheStorageCache::GetSizeThenClose(SizeCallback callback) { if (backend_state_ == BACKEND_CLOSED) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), 0)); + scheduler_task_runner_->PostTask(FROM_HERE, + base::BindOnce(std::move(callback), 0)); return; } @@ -924,10 +922,11 @@ cache_name_(cache_name), path_(path), cache_storage_(cache_storage), + scheduler_task_runner_(std::move(scheduler_task_runner)), quota_manager_proxy_(std::move(quota_manager_proxy)), blob_storage_context_(blob_context), scheduler_(new CacheStorageScheduler(CacheStorageSchedulerClient::kCache, - std::move(scheduler_task_runner))), + scheduler_task_runner_)), cache_size_(cache_size), cache_padding_(cache_padding), cache_padding_key_(std::move(cache_padding_key)), @@ -1071,7 +1070,7 @@ return; } - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(open_entry_callback), rv)); } @@ -1356,7 +1355,7 @@ if (status_code != blink::mojom::QuotaStatusCode::kOk || (buf_len > quota - usage)) { - base::ThreadTaskRunnerHandle::Get()->PostTask( + scheduler_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(callback), CacheStorageError::kErrorQuotaExceeded)); return; @@ -2185,14 +2184,14 @@ // TODO(cmumford): Can CacheStorage::kSizeUnknown be returned instead of zero? if (backend_state_ != BACKEND_OPEN) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), 0)); + scheduler_task_runner_->PostTask(FROM_HERE, + base::BindOnce(std::move(callback), 0)); return; } int64_t size = backend_state_ == BACKEND_OPEN ? PaddedCacheSize() : 0; - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), size)); + scheduler_task_runner_->PostTask(FROM_HERE, + base::BindOnce(std::move(callback), size)); } void LegacyCacheStorageCache::GetSizeThenCloseDidGetSize(SizeCallback callback,
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.h b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.h index 3764aab..429bb9d 100644 --- a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.h +++ b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.h
@@ -513,6 +513,7 @@ // as long this cache object is also referenced. CacheStorageHandle cache_storage_handle_; + const scoped_refptr<base::SequencedTaskRunner> scheduler_task_runner_; scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; base::WeakPtr<storage::BlobStorageContext> blob_storage_context_; BackendState backend_state_ = BACKEND_UNINITIALIZED;
diff --git a/content/browser/devtools/protocol/DEPS b/content/browser/devtools/protocol/DEPS new file mode 100644 index 0000000..e001bd2 --- /dev/null +++ b/content/browser/devtools/protocol/DEPS
@@ -0,0 +1,5 @@ +include_rules = [ + # For parsing and validating fido enums in protocol/webauthn_handler.cc. + "+device/fido/fido_constants.h", + "+device/fido/fido_transport_protocol.h", +]
diff --git a/content/browser/devtools/protocol/webauthn_handler.cc b/content/browser/devtools/protocol/webauthn_handler.cc index 0895ce10c..15eed14 100644 --- a/content/browser/devtools/protocol/webauthn_handler.cc +++ b/content/browser/devtools/protocol/webauthn_handler.cc
@@ -4,12 +4,36 @@ #include "content/browser/devtools/protocol/webauthn_handler.h" +#include "base/strings/string_piece.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/webauth/authenticator_environment_impl.h" +#include "content/browser/webauth/virtual_authenticator.h" +#include "content/browser/webauth/virtual_fido_discovery_factory.h" +#include "device/fido/fido_constants.h" +#include "device/fido/fido_transport_protocol.h" namespace content { namespace protocol { +namespace { +static constexpr char kAuthenticatorNotFound[] = + "Could not find a Virtual Authenticator matching the ID"; +static constexpr char kInvalidProtocol[] = "The protocol is not valid"; +static constexpr char kInvalidTransport[] = "The transport is not valid"; +static constexpr char kVirtualEnvironmentNotEnabled[] = + "The Virtual Authenticator Environment has not been enabled for this " + "session"; + +device::ProtocolVersion ConvertToProtocolVersion(base::StringPiece protocol) { + if (protocol == WebAuthn::AuthenticatorProtocolEnum::Ctap2) + return device::ProtocolVersion::kCtap2; + if (protocol == WebAuthn::AuthenticatorProtocolEnum::U2f) + return device::ProtocolVersion::kU2f; + return device::ProtocolVersion::kUnknown; +} + +} // namespace + WebAuthnHandler::WebAuthnHandler() : DevToolsDomainHandler(WebAuthn::Metainfo::domainName) {} @@ -26,13 +50,54 @@ Response WebAuthnHandler::Enable() { AuthenticatorEnvironmentImpl::GetInstance()->EnableVirtualAuthenticatorFor( - frame_host_); + frame_host_->frame_tree_node()); + virtual_discovery_factory_ = + AuthenticatorEnvironmentImpl::GetInstance()->GetVirtualFactoryFor( + frame_host_->frame_tree_node()); return Response::OK(); } Response WebAuthnHandler::Disable() { AuthenticatorEnvironmentImpl::GetInstance()->DisableVirtualAuthenticatorFor( - frame_host_); + frame_host_->frame_tree_node()); + virtual_discovery_factory_ = nullptr; + return Response::OK(); +} + +Response WebAuthnHandler::AddVirtualAuthenticator( + std::unique_ptr<WebAuthn::VirtualAuthenticatorOptions> options, + String* out_authenticator_id) { + if (!virtual_discovery_factory_) + return Response::Error(kVirtualEnvironmentNotEnabled); + + auto transport = + device::ConvertToFidoTransportProtocol(options->GetTransport()); + if (!transport) + return Response::InvalidParams(kInvalidTransport); + + auto protocol = ConvertToProtocolVersion(options->GetProtocol()); + if (protocol == device::ProtocolVersion::kUnknown) + return Response::InvalidParams(kInvalidProtocol); + + auto* authenticator = virtual_discovery_factory_->CreateAuthenticator( + protocol, *transport, + transport == device::FidoTransportProtocol::kInternal + ? device::AuthenticatorAttachment::kPlatform + : device::AuthenticatorAttachment::kCrossPlatform, + options->GetHasResidentKey(), options->GetHasUserVerification()); + + *out_authenticator_id = authenticator->unique_id(); + return Response::OK(); +} + +Response WebAuthnHandler::RemoveVirtualAuthenticator( + const String& authenticator_id) { + if (!virtual_discovery_factory_) + return Response::Error(kVirtualEnvironmentNotEnabled); + + if (!virtual_discovery_factory_->RemoveAuthenticator(authenticator_id)) + return Response::Error(kAuthenticatorNotFound); + return Response::OK(); }
diff --git a/content/browser/devtools/protocol/webauthn_handler.h b/content/browser/devtools/protocol/webauthn_handler.h index a6b7505..f5dac07 100644 --- a/content/browser/devtools/protocol/webauthn_handler.h +++ b/content/browser/devtools/protocol/webauthn_handler.h
@@ -5,11 +5,14 @@ #ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_WEBAUTHN_HANDLER_H_ #define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_WEBAUTHN_HANDLER_H_ +#include <memory> + #include "base/macros.h" #include "content/browser/devtools/protocol/devtools_domain_handler.h" #include "content/browser/devtools/protocol/web_authn.h" namespace content { +class VirtualFidoDiscoveryFactory; namespace protocol { class WebAuthnHandler : public DevToolsDomainHandler, public WebAuthn::Backend { @@ -25,9 +28,14 @@ // WebAuthn::Backend Response Enable() override; Response Disable() override; + Response AddVirtualAuthenticator( + std::unique_ptr<WebAuthn::VirtualAuthenticatorOptions> options, + String* out_authenticator_id) override; + Response RemoveVirtualAuthenticator(const String& authenticator_id) override; private: RenderFrameHostImpl* frame_host_; + VirtualFidoDiscoveryFactory* virtual_discovery_factory_ = nullptr; DISALLOW_COPY_AND_ASSIGN(WebAuthnHandler); };
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json index 252a0fab..d6b8c0c 100644 --- a/content/browser/devtools/protocol_config.json +++ b/content/browser/devtools/protocol_config.json
@@ -102,7 +102,7 @@ }, { "domain": "WebAuthn", - "include": ["enable", "disable"] + "include": ["enable", "disable", "addVirtualAuthenticator", "removeVirtualAuthenticator"] } ] },
diff --git a/content/browser/frame_host/origin_policy_throttle.cc b/content/browser/frame_host/origin_policy_throttle.cc index b99786b..68d6799a 100644 --- a/content/browser/frame_host/origin_policy_throttle.cc +++ b/content/browser/frame_host/origin_policy_throttle.cc
@@ -16,6 +16,7 @@ #include "content/browser/frame_host/navigation_handle_impl.h" #include "content/browser/frame_host/navigation_request.h" #include "content/browser/storage_partition_impl.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/origin_policy_error_reason.h" @@ -34,15 +35,20 @@ static constexpr const char* kDeletePolicy = "0"; static constexpr const char* kReportTo = "report-to"; static constexpr const char* kPolicy = "policy"; + +// Marker for (temporarily) exempted origins. +// TODO(vogelheim): Make sure this is outside the value space for policy +// names. A name with a comma in it shouldn't be allowed, but +// I don't think we presently check this anywhere. +static constexpr const char* kExemptedOriginPolicyVersion = "exception,"; } // namespace namespace content { // Implement the public "API" from // content/public/browser/origin_policy_commands.h: -void OriginPolicyAddExceptionFor(BrowserContext* browser_context, - const GURL& url) { - OriginPolicyThrottle::AddExceptionFor(browser_context, url); +void OriginPolicyAddExceptionFor(const GURL& url) { + OriginPolicyThrottle::AddExceptionFor(url); } // static @@ -81,15 +87,8 @@ } // static -void OriginPolicyThrottle::AddExceptionFor(BrowserContext* browser_context, - const GURL& url) { - DCHECK(browser_context); - StoragePartitionImpl* storage_partition = static_cast<StoragePartitionImpl*>( - BrowserContext::GetStoragePartitionForSite(browser_context, url)); - network::mojom::OriginPolicyManager* origin_policy_manager = - storage_partition->GetOriginPolicyManagerForBrowserProcess(); - - origin_policy_manager->AddExceptionFor(url::Origin::Create(url)); +void OriginPolicyThrottle::AddExceptionFor(const GURL& url) { + GetKnownVersions()[url::Origin::Create(url)] = kExemptedOriginPolicyVersion; } OriginPolicyThrottle::~OriginPolicyThrottle() {} @@ -115,24 +114,80 @@ if (!navigation_handle()->GetResponseHeaders()) return NavigationThrottle::PROCEED; + // TODO(andypaicu): + // This entire logic needs to be moved to OriginPolicyManager with the + // store migration. + + // This determines whether and which policy version applies and fetches it. + // + // Inputs are the kSecOriginPolicy HTTP header, and the version + // we've last seen from this particular origin. + // + // - header with kDeletePolicy received: No policy applies, and delete the + // last-known policy for this origin. + // - header received: Use header version and update last-known policy. + // - no header received, last-known version exists: Use last-known version + // - no header, no last-known version: No policy applies. + + std::string response_version = + GetRequestedPolicyAndReportGroupFromHeader().policy_version; + bool header_found = !response_version.empty(); + + url::Origin origin = GetRequestOrigin(); + DCHECK(!origin.Serialize().empty()); + DCHECK(!origin.opaque()); + KnownVersionMap& versions = GetKnownVersions(); + auto iter = versions.find(origin); + + // Process policy deletion first! + if (header_found && response_version == kDeletePolicy) { + if (iter != versions.end()) + versions.erase(iter); + return NavigationThrottle::PROCEED; + } + + // Process policy exceptions. + if (iter != versions.end() && iter->second == kExemptedOriginPolicyVersion) { + return NavigationThrottle::PROCEED; + } + + // No policy applies to this request? + if (!header_found && iter == versions.end()) { + return NavigationThrottle::PROCEED; + } + std::string header; navigation_handle()->GetResponseHeaders()->GetNormalizedHeader( net::HttpRequestHeaders::kSecOriginPolicy, &header); + if (!header_found) { + // TODO(andypaicu): + // This is an absolute hack that will go away when we move the in-memory + // store to the network service OriginPolicyManager. Until then, if we have + // a cached policy version and we receive a request with no header set, we + // build this artificial header to let OriginPolicyManager know where to + // retrieve the policy from. + header = base::StrCat({"policy=", iter->second}); + } else if (iter == versions.end()) { + versions.insert(std::make_pair(origin, response_version)); + } else { + iter->second = response_version; + } + network::OriginPolicyManager::RetrieveOriginPolicyCallback origin_policy_manager_done = base::BindOnce( &OriginPolicyThrottle::OnOriginPolicyManagerRetrieveDone, base::Unretained(this)); - SiteInstance* site_instance = navigation_handle()->GetStartingSiteInstance(); StoragePartitionImpl* storage_partition = static_cast<StoragePartitionImpl*>(BrowserContext::GetStoragePartition( site_instance->GetBrowserContext(), site_instance)); + network::mojom::OriginPolicyManager* origin_policy_manager = storage_partition->GetOriginPolicyManagerForBrowserProcess(); origin_policy_manager->RetrieveOriginPolicy( - GetRequestOrigin(), header, std::move(origin_policy_manager_done)); + origin, header, std::move(origin_policy_manager_done)); return NavigationThrottle::DEFER; } @@ -141,11 +196,27 @@ return "OriginPolicyThrottle"; } +// static +OriginPolicyThrottle::KnownVersionMap& +OriginPolicyThrottle::GetKnownVersionsForTesting() { + return GetKnownVersions(); +} + OriginPolicyThrottle::OriginPolicyThrottle(NavigationHandle* handle) : NavigationThrottle(handle) {} -// TODO(andypaicu): Remove when we have moved reporting logic to the network -// service. +OriginPolicyThrottle::KnownVersionMap& +OriginPolicyThrottle::GetKnownVersions() { + static base::NoDestructor<KnownVersionMap> map_instance; + return *map_instance; +} + +OriginPolicyThrottle::PolicyVersionAndReportTo OriginPolicyThrottle:: + GetRequestedPolicyAndReportGroupFromHeaderStringForTesting( + const std::string& header) { + return GetRequestedPolicyAndReportGroupFromHeaderString(header); +} + OriginPolicyThrottle::PolicyVersionAndReportTo OriginPolicyThrottle::GetRequestedPolicyAndReportGroupFromHeader() const { std::string header; @@ -246,38 +317,30 @@ const GURL& policy_url) {} #endif // BUILDFLAG(ENABLE_REPORTING) +bool OriginPolicyThrottle::IsExemptedForTesting(const url::Origin& origin) { + KnownVersionMap& versions = GetKnownVersions(); + auto iter = versions.find(origin); + if (iter != versions.end()) + return iter->second == kExemptedOriginPolicyVersion; + + return false; +} + void OriginPolicyThrottle::OnOriginPolicyManagerRetrieveDone( const network::mojom::OriginPolicyPtr origin_policy) { - switch (origin_policy->state) { - case network::mojom::OriginPolicyState::kCannotLoadPolicy: - // TODO(andypaicu): OriginPolicyErrorReason is obsolete and we should use - // network::mojom::OriginPolicyState instead. - CancelNavigation(OriginPolicyErrorReason::kCannotLoadPolicy, - origin_policy->policy_url); - return; - - case network::mojom::OriginPolicyState::kInvalidRedirect: - // TODO(andypaicu): OriginPolicyErrorReason is obsolete and we should use - // network::mojom::OriginPolicyState instead. - CancelNavigation(OriginPolicyErrorReason::kPolicyShouldNotRedirect, - origin_policy->policy_url); - return; - - case network::mojom::OriginPolicyState::kNoPolicyApplies: - Resume(); - return; - - case network::mojom::OriginPolicyState::kLoaded: - DCHECK(origin_policy->contents); - static_cast<NavigationHandleImpl*>(navigation_handle()) - ->navigation_request() - ->SetOriginPolicy(origin_policy->contents->raw_policy); - Resume(); - return; - - default: - NOTREACHED(); + if (origin_policy->state != network::mojom::OriginPolicyState::kLoaded) { + CancelNavigation(OriginPolicyErrorReason::kCannotLoadPolicy, + origin_policy->policy_url); + return; } + + DCHECK(origin_policy->contents); + // TODO(vogelheim): Determine whether we need to parse or sanity check + // the policy content at this point. + static_cast<NavigationHandleImpl*>(navigation_handle()) + ->navigation_request() + ->SetOriginPolicy(origin_policy->contents->raw_policy); + Resume(); } } // namespace content
diff --git a/content/browser/frame_host/origin_policy_throttle.h b/content/browser/frame_host/origin_policy_throttle.h index ed72e6a1..1b984824 100644 --- a/content/browser/frame_host/origin_policy_throttle.h +++ b/content/browser/frame_host/origin_policy_throttle.h
@@ -12,7 +12,6 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" -#include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_throttle.h" #include "services/network/public/mojom/origin_policy_manager.mojom.h" @@ -60,7 +59,7 @@ // otherwise invalid) policy. This is meant to be called by the security // interstitial. // This will exempt the entire origin, rather than only the given URL. - static void AddExceptionFor(BrowserContext* browser_context, const GURL& url); + static void AddExceptionFor(const GURL& url); ~OriginPolicyThrottle() override; @@ -71,11 +70,20 @@ using KnownVersionMap = std::map<url::Origin, std::string>; static KnownVersionMap& GetKnownVersionsForTesting(); + // TODO(andypaicu): Remove this when we move the store to the network + // service layer. + static PolicyVersionAndReportTo + GetRequestedPolicyAndReportGroupFromHeaderStringForTesting( + const std::string& header); + + static bool IsExemptedForTesting(const url::Origin& origin); + private: explicit OriginPolicyThrottle(NavigationHandle* handle); - // TODO(andypaicu): Remove when we have moved reporting logic to the network - // service. + static KnownVersionMap& GetKnownVersions(); + + // Get the policy name and the reporting group from the header string. PolicyVersionAndReportTo GetRequestedPolicyAndReportGroupFromHeader() const; static PolicyVersionAndReportTo GetRequestedPolicyAndReportGroupFromHeaderString(const std::string& header);
diff --git a/content/browser/frame_host/origin_policy_throttle_unittest.cc b/content/browser/frame_host/origin_policy_throttle_unittest.cc index 703a82b8..6e1cc94 100644 --- a/content/browser/frame_host/origin_policy_throttle_unittest.cc +++ b/content/browser/frame_host/origin_policy_throttle_unittest.cc
@@ -4,7 +4,6 @@ #include "content/browser/frame_host/origin_policy_throttle.h" -#include <set> #include <utility> #include "base/feature_list.h" @@ -41,8 +40,10 @@ features_.InitWithFeatureState(features::kOriginPolicy, GetParam()); RenderViewHostTestHarness::SetUp(); + OriginPolicyThrottle::GetKnownVersionsForTesting().clear(); } void TearDown() override { + OriginPolicyThrottle::GetKnownVersionsForTesting().clear(); nav_handle_.reset(); RenderViewHostTestHarness::TearDown(); } @@ -71,28 +72,20 @@ const std::string& header_value, RetrieveOriginPolicyCallback callback) override { auto result = network::mojom::OriginPolicy::New(); - - if (origin_exceptions_.find(origin) == origin_exceptions_.end()) { - result->state = network::mojom::OriginPolicyState::kLoaded; - result->contents = network::mojom::OriginPolicyContents::New(); - result->contents->raw_policy = kExampleManifestString; - result->policy_url = origin.GetURL(); - } else { - result->state = network::mojom::OriginPolicyState::kNoPolicyApplies; - result->policy_url = origin.GetURL(); - } + result->state = network::mojom::OriginPolicyState::kLoaded; + result->contents = network::mojom::OriginPolicyContents::New(); + result->contents->raw_policy = kExampleManifestString; + result->policy_url = origin.GetURL(); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&TestOriginPolicyManager::RunCallback, base::Unretained(this), std::move(callback), std::move(result))); } - void RunCallback(RetrieveOriginPolicyCallback callback, network::mojom::OriginPolicyPtr result) { std::move(callback).Run(std::move(result)); } - network::mojom::OriginPolicyManagerPtr GetPtr() { network::mojom::OriginPolicyManagerPtr ptr; auto request = mojo::MakeRequest(&ptr); @@ -102,14 +95,7 @@ return ptr; } - - void AddExceptionFor(const url::Origin& origin) override { - origin_exceptions_.insert(origin); - } - - private: std::unique_ptr<mojo::Binding<network::mojom::OriginPolicyManager>> binding_; - std::set<url::Origin> origin_exceptions_; }; INSTANTIATE_TEST_SUITE_P(OriginPolicyThrottleTests, @@ -196,10 +182,25 @@ ->ResetOriginPolicyManagerForBrowserProcessForTesting(); } +TEST_P(OriginPolicyThrottleTest, AddException) { + if (!enabled()) + return; + + GURL url("https://example.org/bla"); + OriginPolicyThrottle::GetKnownVersionsForTesting()[url::Origin::Create(url)] = + "abcd"; + + OriginPolicyThrottle::AddExceptionFor(url); + EXPECT_TRUE( + OriginPolicyThrottle::IsExemptedForTesting(url::Origin::Create(url))); +} + TEST_P(OriginPolicyThrottleTest, AddExceptionEndToEnd) { if (!enabled()) return; + OriginPolicyThrottle::AddExceptionFor(GURL("https://example.org/blubb")); + // Start the navigation. auto navigation = NavigationSimulator::CreateBrowserInitiated( GURL("https://example.org/bla"), web_contents()); @@ -209,47 +210,88 @@ EXPECT_EQ(NavigationThrottle::PROCEED, navigation->GetLastThrottleCheckResult().action()); - // We set a test origin policy manager as during unit tests we can't reach - // the network service to retrieve a valid origin policy manager. - TestOriginPolicyManager test_origin_policy_manager; - test_origin_policy_manager.AddExceptionFor( - url::Origin::Create(GURL("https://example.org/blubb"))); - NavigationHandleImpl* nav_handle = - static_cast<NavigationHandleImpl*>(navigation->GetNavigationHandle()); - SiteInstance* site_instance = nav_handle->GetStartingSiteInstance(); - static_cast<StoragePartitionImpl*>( - BrowserContext::GetStoragePartition(site_instance->GetBrowserContext(), - site_instance)) - ->SetOriginPolicyManagerForBrowserProcessForTesting( - test_origin_policy_manager.GetPtr()); - // Fake a response with a policy header. const char* raw_headers = "HTTP/1.1 200 OK\nSec-Origin-Policy: policy=policy-1\n\n"; auto headers = base::MakeRefCounted<net::HttpResponseHeaders>( net::HttpUtil::AssembleRawHeaders(raw_headers)); + NavigationHandleImpl* nav_handle = + static_cast<NavigationHandleImpl*>(navigation->GetNavigationHandle()); nav_handle->set_response_headers_for_testing(headers); navigation->ReadyToCommit(); - // The policy manager has to be called even though this is an exception - // because the throttle has no way of knowing that. - EXPECT_TRUE(navigation->IsDeferred()); - OriginPolicyThrottle* policy_throttle = static_cast<OriginPolicyThrottle*>( - nav_handle->GetDeferringThrottleForTesting()); - EXPECT_TRUE(policy_throttle); + // Due to the exception, we expect the policy to not defer. + EXPECT_FALSE(navigation->IsDeferred()); - // Wait until the navigation has been allowed to proceed. - navigation->Wait(); + // Also check that the header policy did not overwrite the exemption: + EXPECT_TRUE(OriginPolicyThrottle::IsExemptedForTesting( + url::Origin::Create(GURL("https://example.org/bla")))); +} - // At the end of the navigation, the navigation handle should have no policy - // as this origin should be exempted. - EXPECT_EQ("", - nav_handle->navigation_request()->common_params().origin_policy); +TEST(OriginPolicyThrottleTest, ParseHeaders) { + const struct { + const char* header; + const char* policy_version; + const char* report_to; + } testcases[] = { + // The common cases: We expect >99% of headers to look like these: + {"policy=policy", "policy", ""}, + {"policy=policy, report-to=endpoint", "policy", "endpoint"}, - static_cast<StoragePartitionImpl*>( - BrowserContext::GetStoragePartition(site_instance->GetBrowserContext(), - site_instance)) - ->ResetOriginPolicyManagerForBrowserProcessForTesting(); + // Delete a policy. This better work. + {"0", "0", ""}, + {"policy=0", "0", ""}, + {"policy=\"0\"", "0", ""}, + {"policy=0, report-to=endpoint", "0", "endpoint"}, + + // Order, please! + {"policy=policy, report-to=endpoint", "policy", "endpoint"}, + {"report-to=endpoint, policy=policy", "policy", "endpoint"}, + + // Quoting: + {"policy=\"policy\"", "policy", ""}, + {"policy=\"policy\", report-to=endpoint", "policy", "endpoint"}, + {"policy=\"policy\", report-to=\"endpoint\"", "policy", "endpoint"}, + {"policy=policy, report-to=\"endpoint\"", "policy", "endpoint"}, + + // Whitespace, and funky but valid syntax: + {" policy = policy ", "policy", ""}, + {" policy = \t policy ", "policy", ""}, + {" policy \t= \t \"policy\" ", "policy", ""}, + {" policy = \" policy \" ", "policy", ""}, + {" , policy = policy , report-to=endpoint , ", "policy", "endpoint"}, + + // Valid policy, invalid report-to: + {"policy=policy, report-to endpoint", "", ""}, + {"policy=policy, report-to=here, report-to=there", "", ""}, + {"policy=policy, \"report-to\"=endpoint", "", ""}, + + // Invalid policy, valid report-to: + {"policy=policy1, policy=policy2", "", ""}, + {"policy, report-to=r", "", ""}, + {"report-to=endpoint", "", "endpoint"}, + + // Invalid everything: + {"one two three", "", ""}, + {"one, two, three", "", ""}, + {"policy report-to=endpoint", "", ""}, + {"policy=policy report-to=endpoint", "", ""}, + + // Forward compatibility, ignore unknown keywords: + {"policy=pol, report-to=endpoint, unknown=keyword", "pol", "endpoint"}, + {"unknown=keyword, policy=pol, report-to=endpoint", "pol", "endpoint"}, + {"policy=pol, unknown=keyword", "pol", ""}, + {"policy=policy, report_to=endpoint", "policy", ""}, + {"policy=policy, reportto=endpoint", "policy", ""}, + }; + for (const auto& testcase : testcases) { + SCOPED_TRACE(testcase.header); + const auto result = OriginPolicyThrottle:: + GetRequestedPolicyAndReportGroupFromHeaderStringForTesting( + testcase.header); + EXPECT_EQ(result.policy_version, testcase.policy_version); + EXPECT_EQ(result.report_to, testcase.report_to); + } } } // namespace content
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index d5f1f0e..fffd340 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -84,6 +84,7 @@ #include "content/browser/picture_in_picture/picture_in_picture_service_impl.h" #include "content/browser/portal/portal.h" #include "content/browser/presentation/presentation_service_impl.h" +#include "content/browser/push_messaging/push_messaging_manager.h" #include "content/browser/quota_dispatcher_host.h" #include "content/browser/renderer_host/dip_util.h" #include "content/browser/renderer_host/input/input_router.h" @@ -942,11 +943,6 @@ if (delegate_ && was_created) delegate_->RenderFrameDeleted(this); -#if !defined(OS_ANDROID) - AuthenticatorEnvironmentImpl::GetInstance()->DisableVirtualAuthenticatorFor( - this); -#endif // !defined(OS_ANDROID) - // Ensure that the render process host has been notified that all audio // streams from this frame have terminated. This is required to ensure the // process host has the correct media stream count, which affects its @@ -6015,6 +6011,21 @@ this, std::move(request)); } +void RenderFrameHostImpl::GetPushMessaging( + blink::mojom::PushMessagingRequest request) { + if (!push_messaging_manager_) { + push_messaging_manager_.reset(new PushMessagingManager( + GetProcess()->GetID(), routing_id_, + static_cast<StoragePartitionImpl*>(GetProcess()->GetStoragePartition()) + ->GetServiceWorkerContext())); + } + + base::PostTaskWithTraits( + FROM_HERE, {BrowserThread::IO}, + base::BindOnce(&PushMessagingManager::BindRequest, + push_messaging_manager_->AsWeakPtr(), std::move(request))); +} + void RenderFrameHostImpl::GetVirtualAuthenticatorManager( blink::test::mojom::VirtualAuthenticatorManagerRequest request) { #if !defined(OS_ANDROID) @@ -6022,8 +6033,8 @@ if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableWebAuthTestingAPI)) { auto* environment_singleton = AuthenticatorEnvironmentImpl::GetInstance(); - environment_singleton->EnableVirtualAuthenticatorFor(this); - environment_singleton->AddVirtualAuthenticatorBinding(this, + environment_singleton->EnableVirtualAuthenticatorFor(frame_tree_node_); + environment_singleton->AddVirtualAuthenticatorBinding(frame_tree_node_, std::move(request)); } }
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index ef6c0ed2..7413bd6 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -144,6 +144,7 @@ class PermissionServiceContext; class PrefetchedSignedExchangeCache; class PresentationServiceImpl; +class PushMessagingManager; class RenderFrameHostDelegate; class RenderFrameHostImpl; class RenderFrameProxyHost; @@ -1390,6 +1391,7 @@ void GetCredentialManager( blink::mojom::CredentialManagerRequest request) override; void GetAuthenticator(blink::mojom::AuthenticatorRequest request) override; + void GetPushMessaging(blink::mojom::PushMessagingRequest request) override; void GetVirtualAuthenticatorManager( blink::test::mojom::VirtualAuthenticatorManagerRequest request) override; void RegisterAppCacheHost(blink::mojom::AppCacheHostRequest host_request, @@ -1951,6 +1953,10 @@ std::unique_ptr<FileSystemManagerImpl, BrowserThread::DeleteOnIOThread> file_system_manager_; + // Hosts blink::mojom::PushMessaging for the RenderFrame. + std::unique_ptr<PushMessagingManager, BrowserThread::DeleteOnIOThread> + push_messaging_manager_; + #if !defined(OS_ANDROID) std::unique_ptr<AuthenticatorImpl> authenticator_impl_; #endif
diff --git a/content/browser/loader/prefetch_browsertest_base.cc b/content/browser/loader/prefetch_browsertest_base.cc index e39eafd..88c0293 100644 --- a/content/browser/loader/prefetch_browsertest_base.cc +++ b/content/browser/loader/prefetch_browsertest_base.cc
@@ -30,8 +30,14 @@ const std::vector<std::pair<std::string, std::string>>& headers) : content(content), content_type(content_type), headers(headers) {} +PrefetchBrowserTestBase::ResponseEntry::ResponseEntry(ResponseEntry&& other) = + default; + PrefetchBrowserTestBase::ResponseEntry::~ResponseEntry() = default; +PrefetchBrowserTestBase::ResponseEntry& PrefetchBrowserTestBase::ResponseEntry:: +operator=(ResponseEntry&& other) = default; + PrefetchBrowserTestBase::ScopedSignedExchangeHandlerFactory:: ScopedSignedExchangeHandlerFactory(SignedExchangeHandlerFactory* factory) { SignedExchangeLoader::SetSignedExchangeHandlerFactoryForTest(factory); @@ -61,8 +67,8 @@ } void PrefetchBrowserTestBase::RegisterResponse(const std::string& url, - const ResponseEntry& entry) { - response_map_[url] = entry; + ResponseEntry&& entry) { + response_map_[url] = std::move(entry); } std::unique_ptr<net::test_server::HttpResponse>
diff --git a/content/browser/loader/prefetch_browsertest_base.h b/content/browser/loader/prefetch_browsertest_base.h index 0a755cd..eb478ea 100644 --- a/content/browser/loader/prefetch_browsertest_base.h +++ b/content/browser/loader/prefetch_browsertest_base.h
@@ -29,10 +29,14 @@ public: struct ResponseEntry { ResponseEntry(); - explicit ResponseEntry( + ResponseEntry( const std::string& content, const std::string& content_types = "text/html", const std::vector<std::pair<std::string, std::string>>& headers = {}); + ResponseEntry(const ResponseEntry&) = delete; + ResponseEntry(ResponseEntry&& other); + ResponseEntry& operator=(const ResponseEntry&) = delete; + ResponseEntry& operator=(ResponseEntry&&); ~ResponseEntry(); std::string content; @@ -52,7 +56,7 @@ void SetUpOnMainThread() override; protected: - void RegisterResponse(const std::string& url, const ResponseEntry& entry); + void RegisterResponse(const std::string& url, ResponseEntry&& entry); std::unique_ptr<net::test_server::HttpResponse> ServeResponses( const net::test_server::HttpRequest& request);
diff --git a/content/browser/native_file_system/native_file_system_directory_handle_impl.cc b/content/browser/native_file_system/native_file_system_directory_handle_impl.cc index bc77b0e..f0e1185 100644 --- a/content/browser/native_file_system/native_file_system_directory_handle_impl.cc +++ b/content/browser/native_file_system/native_file_system_directory_handle_impl.cc
@@ -26,6 +26,27 @@ namespace content { +namespace { + +// Returns true when |name| contains a path separator like "/". +bool ContainsPathSeparator(const std::string& name) { + const base::FilePath filepath_name = storage::StringToFilePath(name); + + const size_t separator_position = + filepath_name.value().find_first_of(base::FilePath::kSeparators); + + return separator_position != base::FilePath::StringType::npos; +} + +// Returns true when |name| is "." or "..". +bool IsCurrentOrParentDirectory(const std::string& name) { + const base::FilePath filepath_name = storage::StringToFilePath(name); + return filepath_name.value() == base::FilePath::kCurrentDirectory || + filepath_name.value() == base::FilePath::kParentDirectory; +} + +} // namespace + struct NativeFileSystemDirectoryHandleImpl::ReadDirectoryState { GetEntriesCallback callback; std::vector<NativeFileSystemEntryPtr> entries; @@ -48,7 +69,14 @@ bool create, GetFileCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - storage::FileSystemURL child_url = GetChildURL(name); + + storage::FileSystemURL child_url; + const base::File::Error file_error = GetChildURL(name, &child_url); + if (file_error != base::File::FILE_OK) { + std::move(callback).Run(NativeFileSystemError::New(file_error), nullptr); + return; + } + if (create) { operation_runner()->CreateFile( child_url, /*exclusive=*/false, @@ -70,7 +98,13 @@ GetDirectoryCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - storage::FileSystemURL child_url = GetChildURL(name); + storage::FileSystemURL child_url; + const base::File::Error file_error = GetChildURL(name, &child_url); + if (file_error != base::File::FILE_OK) { + std::move(callback).Run(NativeFileSystemError::New(file_error), nullptr); + return; + } + if (create) { operation_runner()->CreateDirectory( child_url, /*exclusive=*/false, /*recursive=*/false, @@ -189,8 +223,16 @@ for (const auto& entry : file_list) { std::string name = storage::FilePathToString(entry.name); + + storage::FileSystemURL child_url; + const base::File::Error file_error = GetChildURL(name, &child_url); + + // All entries must exist in this directory as a direct child with a valid + // |name|. + CHECK_EQ(file_error, base::File::FILE_OK); + state->entries.push_back( - CreateEntry(name, GetChildURL(name), + CreateEntry(name, child_url, entry.type == filesystem::mojom::FsFileType::DIRECTORY)); } @@ -216,7 +258,13 @@ return; } - storage::FileSystemURL url = GetChildURL(new_name); + storage::FileSystemURL url; + const base::File::Error file_error = GetChildURL(new_name, &url); + if (file_error != base::File::FILE_OK) { + std::move(callback).Run(NativeFileSystemError::New(file_error), nullptr); + return; + } + if (url == source->url()) { std::move(callback).Run( NativeFileSystemError::New(base::File::FILE_ERROR_INVALID_OPERATION), @@ -258,12 +306,21 @@ CreateEntry(new_name, new_url, is_directory)); } -storage::FileSystemURL NativeFileSystemDirectoryHandleImpl::GetChildURL( - const std::string& name) { +base::File::Error NativeFileSystemDirectoryHandleImpl::GetChildURL( + const std::string& name, + storage::FileSystemURL* result) { // TODO(mek): Rather than doing URL serialization and parsing we should just // have a way to get a child FileSystemURL directly from its parent. - // TODO(https://crbug.com/960411): Also we need a way for GetChildURL to fail, - // to indicate invalid input, for example containing ".." or "/". + + if (name.empty()) { + return base::File::FILE_ERROR_NOT_FOUND; + } + + if (ContainsPathSeparator(name) || IsCurrentOrParentDirectory(name)) { + // |name| must refer to a entry that exists in this directory as a direct + // child. + return base::File::FILE_ERROR_SECURITY; + } std::string escaped_name = net::EscapeQueryParamValue(name, /*use_plus=*/false); @@ -274,7 +331,8 @@ replacements.SetPathStr(path); GURL child_url = parent_url.ReplaceComponents(replacements); - return file_system_context()->CrackURL(child_url); + *result = file_system_context()->CrackURL(child_url); + return base::File::FILE_OK; } NativeFileSystemEntryPtr NativeFileSystemDirectoryHandleImpl::CreateEntry(
diff --git a/content/browser/native_file_system/native_file_system_directory_handle_impl.h b/content/browser/native_file_system/native_file_system_directory_handle_impl.h index a84b51d..4b7c612e 100644 --- a/content/browser/native_file_system/native_file_system_directory_handle_impl.h +++ b/content/browser/native_file_system/native_file_system_directory_handle_impl.h
@@ -6,13 +6,13 @@ #define CONTENT_BROWSER_NATIVE_FILE_SYSTEM_NATIVE_FILE_SYSTEM_DIRECTORY_HANDLE_IMPL_H_ #include "base/files/file.h" +#include "base/macros.h" #include "base/memory/weak_ptr.h" #include "components/services/filesystem/public/interfaces/types.mojom.h" #include "content/browser/native_file_system/native_file_system_handle_base.h" #include "storage/browser/fileapi/file_system_url.h" #include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom.h" - namespace content { class NativeFileSystemTransferTokenImpl; @@ -79,9 +79,11 @@ bool is_directory, base::File::Error result); - // Returns a FileSystemURL for a (direct) child of this directory with the - // given name. - storage::FileSystemURL GetChildURL(const std::string& name); + // Calculates a FileSystemURL for a (direct) child of this directory with the + // given name. Returns an error when |name| includes invalid input like "/". + base::File::Error GetChildURL(const std::string& name, + storage::FileSystemURL* result) + WARN_UNUSED_RESULT; // Helper to create a blink::mojom::NativeFileSystemEntry struct. blink::mojom::NativeFileSystemEntryPtr CreateEntry(
diff --git a/content/browser/push_messaging/push_messaging_manager.cc b/content/browser/push_messaging/push_messaging_manager.cc index ea0d8eb7..04f0798 100644 --- a/content/browser/push_messaging/push_messaging_manager.cc +++ b/content/browser/push_messaging/push_messaging_manager.cc
@@ -130,23 +130,22 @@ return std::string(); } +bool IsRequestFromDocument(int render_frame_id) { + return render_frame_id != ChildProcessHost::kInvalidUniqueID; +} + } // namespace struct PushMessagingManager::RegisterData { RegisterData(); RegisterData(RegisterData&& other) = default; - bool FromDocument() const; - GURL requesting_origin; int64_t service_worker_registration_id; base::Optional<std::string> existing_subscription_id; blink::WebPushSubscriptionOptions options; SubscribeCallback callback; - // The following member should only be read if FromDocument() is true. - int render_frame_id; - // True if the call to register was made with a user gesture. bool user_gesture; }; @@ -155,7 +154,8 @@ class PushMessagingManager::Core { public: Core(const base::WeakPtr<PushMessagingManager>& io_parent, - int render_process_id); + int render_process_id, + int render_frame_id); // Public Register methods on UI thread -------------------------------------- @@ -236,6 +236,7 @@ base::WeakPtr<PushMessagingManager> io_parent_; int render_process_id_; + int render_frame_id_; bool is_incognito_; @@ -245,18 +246,15 @@ }; PushMessagingManager::RegisterData::RegisterData() - : service_worker_registration_id(0), - render_frame_id(ChildProcessHost::kInvalidUniqueID) {} - -bool PushMessagingManager::RegisterData::FromDocument() const { - return render_frame_id != ChildProcessHost::kInvalidUniqueID; -} + : service_worker_registration_id(0) {} PushMessagingManager::Core::Core( const base::WeakPtr<PushMessagingManager>& io_parent, - int render_process_id) + int render_process_id, + int render_frame_id) : io_parent_(io_parent), render_process_id_(render_process_id), + render_frame_id_(render_frame_id), weak_factory_ui_to_ui_(this) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderProcessHost* process_host = @@ -268,16 +266,18 @@ PushMessagingManager::PushMessagingManager( int render_process_id, + int render_frame_id, ServiceWorkerContextWrapper* service_worker_context) : service_worker_context_(service_worker_context), - weak_factory_io_to_io_(this) { + render_frame_id_(render_frame_id), + weak_factory_(this) { // Although this class is used only on the IO thread, it is constructed on UI. DCHECK_CURRENTLY_ON(BrowserThread::UI); // Normally, it would be unsafe to obtain a weak pointer from the UI thread, // but it's ok in the constructor since we can't be destroyed before our // constructor finishes. - ui_core_.reset( - new Core(weak_factory_io_to_io_.GetWeakPtr(), render_process_id)); + ui_core_.reset(new Core(weak_factory_.GetWeakPtr(), render_process_id, + render_frame_id_)); ui_core_weak_ptr_ = ui_core_->GetWeakPtrFromIOParentConstructor(); PushMessagingService* service = ui_core_->service(); @@ -311,9 +311,6 @@ // TODO(mvanouwerkerk): Validate arguments? RegisterData data; - // Will be ChildProcessHost::kInvalidUniqueID in requests from Service Worker. - data.render_frame_id = render_frame_id; - data.service_worker_registration_id = service_worker_registration_id; data.callback = std::move(callback); data.options = options; @@ -331,14 +328,15 @@ } data.requesting_origin = service_worker_registration->scope().GetOrigin(); - DCHECK(!(data.options.application_server_key.empty() && data.FromDocument())); + DCHECK(!(data.options.application_server_key.empty() && + IsRequestFromDocument(render_frame_id_))); int64_t registration_id = data.service_worker_registration_id; service_worker_context_->GetRegistrationUserData( registration_id, {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey}, base::BindOnce(&PushMessagingManager::DidCheckForExistingRegistration, - weak_factory_io_to_io_.GetWeakPtr(), std::move(data))); + weak_factory_.GetWeakPtr(), std::move(data))); } void PushMessagingManager::DidCheckForExistingRegistration( @@ -389,7 +387,7 @@ service_worker_context_->GetRegistrationUserData( registration_id, {kPushSenderIdServiceWorkerKey}, base::BindOnce(&PushMessagingManager::DidGetSenderIdFromStorage, - weak_factory_io_to_io_.GetWeakPtr(), std::move(data))); + weak_factory_.GetWeakPtr(), std::move(data))); } } @@ -437,7 +435,8 @@ } else { // Prevent websites from detecting incognito mode, by emulating what would // have happened if we had a PushMessagingService available. - if (!data.FromDocument() || !data.options.user_visible_only) { + if (!IsRequestFromDocument(render_frame_id_) || + !data.options.user_visible_only) { // Throw a permission denied error under the same circumstances. base::PostTaskWithTraits( FROM_HERE, {BrowserThread::IO}, @@ -447,7 +446,7 @@ INCOGNITO_PERMISSION_DENIED)); } else { RenderFrameHost* render_frame_host = - RenderFrameHost::FromID(render_process_id_, data.render_frame_id); + RenderFrameHost::FromID(render_process_id_, render_frame_id_); WebContents* web_contents = WebContents::FromRenderFrameHost(render_frame_host); if (web_contents) { @@ -477,11 +476,10 @@ int64_t registration_id = data.service_worker_registration_id; GURL requesting_origin = data.requesting_origin; blink::WebPushSubscriptionOptions options = data.options; - int render_frame_id = data.render_frame_id; - if (data.FromDocument()) { + if (IsRequestFromDocument(render_frame_id_)) { push_service->SubscribeFromDocument( - requesting_origin, registration_id, render_process_id_, render_frame_id, - options, data.user_gesture, + requesting_origin, registration_id, render_process_id_, + render_frame_id_, options, data.user_gesture, base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(), base::Passed(&data))); } else { @@ -557,7 +555,7 @@ {{kPushRegistrationIdServiceWorkerKey, push_subscription_id}, {kPushSenderIdServiceWorkerKey, application_server_key}}, base::BindOnce(&PushMessagingManager::DidPersistRegistrationOnIO, - weak_factory_io_to_io_.GetWeakPtr(), std::move(data), + weak_factory_.GetWeakPtr(), std::move(data), push_subscription_id, p256dh, auth, status)); } @@ -634,7 +632,7 @@ service_worker_context_->GetRegistrationUserData( service_worker_registration_id, {kPushSenderIdServiceWorkerKey}, base::BindOnce(&PushMessagingManager::UnsubscribeHavingGottenSenderId, - weak_factory_io_to_io_.GetWeakPtr(), std::move(callback), + weak_factory_.GetWeakPtr(), std::move(callback), service_worker_registration_id, service_worker_registration->scope().GetOrigin())); } @@ -745,7 +743,7 @@ service_worker_registration_id, {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey}, base::BindOnce(&PushMessagingManager::DidGetSubscription, - weak_factory_io_to_io_.GetWeakPtr(), std::move(callback), + weak_factory_.GetWeakPtr(), std::move(callback), service_worker_registration_id)); }
diff --git a/content/browser/push_messaging/push_messaging_manager.h b/content/browser/push_messaging/push_messaging_manager.h index ec6c0a55..674ca47 100644 --- a/content/browser/push_messaging/push_messaging_manager.h +++ b/content/browser/push_messaging/push_messaging_manager.h
@@ -40,10 +40,15 @@ class PushMessagingManager : public blink::mojom::PushMessaging { public: PushMessagingManager(int render_process_id, + int render_frame_id, ServiceWorkerContextWrapper* service_worker_context); void BindRequest(blink::mojom::PushMessagingRequest request); + base::WeakPtr<PushMessagingManager> AsWeakPtr() { + return weak_factory_.GetWeakPtr(); + } + // blink::mojom::PushMessaging impl, run on IO thread. void Subscribe(int32_t render_frame_id, int64_t service_worker_registration_id, @@ -137,12 +142,15 @@ // Whether the PushMessagingService was available when constructed. bool service_available_; + // Will be ChildProcessHost::kInvalidUniqueID in requests from Service Worker. + int render_frame_id_; + GURL default_endpoint_; GURL web_push_protocol_endpoint_; mojo::BindingSet<blink::mojom::PushMessaging> bindings_; - base::WeakPtrFactory<PushMessagingManager> weak_factory_io_to_io_; + base::WeakPtrFactory<PushMessagingManager> weak_factory_; DISALLOW_COPY_AND_ASSIGN(PushMessagingManager); };
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 515e148c..f1e6ad7 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1531,8 +1531,12 @@ storage_partition_impl_->GetPath())); } + // This instance of PushMessagingManager is only used from clients bound to + // service workers (i.e. PushProvider), since frame-bound clients will rely on + // DocumentInterfaceBroker instead. Therefore, pass an invalid frame ID here. push_messaging_manager_.reset(new PushMessagingManager( - GetID(), storage_partition_impl_->GetServiceWorkerContext())); + GetID(), /* render_frame_id= */ ChildProcessHost::kInvalidUniqueID, + storage_partition_impl_->GetServiceWorkerContext())); AddObserver(indexed_db_factory_.get()); #if defined(OS_MACOSX)
diff --git a/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc b/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc index c2c6b2a..c16c8f9 100644 --- a/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc +++ b/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc
@@ -10,6 +10,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/stl_util.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/task_runner.h" #include "base/test/metrics/histogram_tester.h" @@ -72,6 +73,48 @@ return results; } +PrefetchBrowserTestBase::ResponseEntry CreateSignedExchangeResponseEntry( + const std::string& content, + const std::vector<std::pair<std::string, std::string>>& additional_headers = + {}) { + std::vector<std::pair<std::string, std::string>> headers = { + {"x-content-type-options", "nosniff"}}; + + for (const auto& additional_header : additional_headers) { + headers.emplace_back( + std::make_pair(additional_header.first, additional_header.second)); + } + + // We mock the SignedExchangeHandler, so just return the content as + // "application/signed-exchange;v=b3". + return PrefetchBrowserTestBase::ResponseEntry( + content, "application/signed-exchange;v=b3", headers); +} + +std::string CreateAlternateLinkHeader(const GURL& sxg_url, + const GURL& inner_url) { + return base::StringPrintf( + "<%s>;" + "rel=\"alternate\";" + "type=\"application/signed-exchange;v=b3\";" + "anchor=\"%s\"", + sxg_url.spec().c_str(), inner_url.spec().c_str()); +} + +std::string CreateAllowedAltSxgLinkHeader( + const GURL& inner_url, + const net::SHA256HashValue& header_integrity) { + return base::StringPrintf( + "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"", + inner_url.spec().c_str(), + GetHeaderIntegrityString(header_integrity).c_str()); +} + +std::string CreatePreloadLinkHeader(const GURL& url, const char* as) { + return base::StringPrintf("<%s>;rel=\"preload\";as=\"%s\"", + url.spec().c_str(), as); +} + } // namespace class SignedExchangePrefetchBrowserTest @@ -131,6 +174,84 @@ blob_context)); } + void RunPrefetchMainResourceSXGTest(const std::string& prefetch_page_hostname, + const std::string& prefetch_page_path, + const std::string& sxg_hostname, + const std::string& sxg_path, + const std::string& inner_url_hostname, + const std::string& inner_url_path) { + const net::SHA256HashValue header_integrity = {{0x01}}; + const std::string content = + "<head><title>Prefetch Target (SXG)</title></head>"; + LoadPrefetchMainResourceSXGTestPage( + prefetch_page_hostname, prefetch_page_path, sxg_hostname, sxg_path, + inner_url_hostname, inner_url_path, header_integrity, content); + + const GURL sxg_url = embedded_test_server()->GetURL(sxg_hostname, sxg_path); + const GURL inner_url = + embedded_test_server()->GetURL(inner_url_hostname, inner_url_path); + + const auto cached_exchanges = GetCachedExchanges(shell()); + EXPECT_EQ(1u, cached_exchanges.size()); + const auto it = cached_exchanges.find(sxg_url); + ASSERT_TRUE(it != cached_exchanges.end()); + EXPECT_EQ(sxg_url, it->second->outer_url()); + EXPECT_EQ(inner_url, it->second->inner_url()); + EXPECT_EQ(header_integrity, *it->second->header_integrity()); + + // Shutdown the server. + EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); + + // Subsequent navigation to the target URL wouldn't hit the network for + // the target URL. The target content should still be read correctly. + // The content is loaded from PrefetchedSignedExchangeCache. + NavigateToURLAndWaitTitle(sxg_url, "Prefetch Target (SXG)"); + } + + void LoadPrefetchMainResourceSXGTestPage( + const std::string& prefetch_page_hostname, + const std::string& prefetch_page_path, + const std::string& sxg_hostname, + const std::string& sxg_path, + const std::string& inner_url_hostname, + const std::string& inner_url_path, + const net::SHA256HashValue& header_integrity, + const std::string& content) { + int sxg_fetch_count = 0; + base::RunLoop sxg_prefetch_waiter; + RegisterRequestMonitor(embedded_test_server(), sxg_path, &sxg_fetch_count, + &sxg_prefetch_waiter); + RegisterRequestHandler(embedded_test_server()); + ASSERT_TRUE(embedded_test_server()->Start()); + + const GURL prefetch_page_url = embedded_test_server()->GetURL( + prefetch_page_hostname, prefetch_page_path); + const GURL sxg_url = embedded_test_server()->GetURL(sxg_hostname, sxg_path); + const GURL inner_url = + embedded_test_server()->GetURL(inner_url_hostname, inner_url_path); + + RegisterResponse(prefetch_page_path, + ResponseEntry(base::StringPrintf( + "<body><link rel='prefetch' href='%s'></body>", + sxg_url.spec().c_str()))); + RegisterResponse(sxg_path, CreateSignedExchangeResponseEntry(content)); + + MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams( + sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, inner_url, + "text/html", {}, header_integrity)}); + ScopedSignedExchangeHandlerFactory scoped_factory(&factory); + + EXPECT_EQ(0, prefetch_url_loader_called_); + + NavigateToURL(shell(), prefetch_page_url); + sxg_prefetch_waiter.Run(); + EXPECT_EQ(1, sxg_fetch_count); + + WaitUntilLoaded(sxg_url); + + EXPECT_EQ(1, prefetch_url_loader_called_); + } + private: static void SetBlobLimitsOnIO( scoped_refptr<ChromeBlobStorageContext> context) { @@ -150,327 +271,152 @@ }; IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, - PrefetchedSignedExchangeCache) { - int target_sxg_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.sxg"; - const char* target_path = "/target.html"; - - base::RunLoop target_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), target_sxg_path, - &target_sxg_fetch_count, &target_sxg_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = embedded_test_server()->GetURL(target_sxg_path); - const GURL target_url = embedded_test_server()->GetURL(target_path); - - RegisterResponse( - prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML content - // as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - - const net::SHA256HashValue target_header_integrity = {{0x01}}; - MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, target_url, - "text/html", {}, target_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - target_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, target_sxg_fetch_count); - - WaitUntilLoaded(target_sxg_url); - - EXPECT_EQ(1, prefetch_url_loader_called_); - - const auto cached_exchanges = GetCachedExchanges(shell()); - EXPECT_EQ(1u, cached_exchanges.size()); - const auto it = cached_exchanges.find(target_sxg_url); - ASSERT_TRUE(it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, it->second->outer_url()); - EXPECT_EQ(target_url, it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *it->second->header_integrity()); - - // Shutdown the server. - EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - - // Subsequent navigation to the target URL wouldn't hit the network for - // the target URL. The target content should still be read correctly. - // The content is loaded from PrefetchedSignedExchangeCache. - NavigateToURLAndWaitTitle(target_sxg_url, "Prefetch Target (SXG)"); + PrefetchMainResourceSXG_SameOrigin) { + RunPrefetchMainResourceSXGTest("example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "example.com" /* sxg_hostname */, + "/target.sxg" /* sxg_path */, + "example.com" /* inner_url_hostname */, + "/target.html" /* inner_url_path */); } -IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, CrossOrigin) { - int target_sxg_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.sxg"; - const char* target_path = "/target.html"; - - base::RunLoop target_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), target_sxg_path, - &target_sxg_fetch_count, &target_sxg_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = - embedded_test_server()->GetURL("sxg.example.com", target_sxg_path); - const GURL target_url = - embedded_test_server()->GetURL("publisher.example.com", target_path); - - RegisterResponse(prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", - target_sxg_url.spec().c_str()))); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML content - // as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - - const net::SHA256HashValue target_header_integrity = {{0x01}}; - MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, target_url, - "text/html", {}, target_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - target_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, target_sxg_fetch_count); - - WaitUntilLoaded(target_sxg_url); - - EXPECT_EQ(1, prefetch_url_loader_called_); - - const auto cached_exchanges = GetCachedExchanges(shell()); - EXPECT_EQ(1u, cached_exchanges.size()); - const auto it = cached_exchanges.find(target_sxg_url); - ASSERT_TRUE(it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, it->second->outer_url()); - EXPECT_EQ(target_url, it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *it->second->header_integrity()); - - // Shutdown the server. - EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - - // Subsequent navigation to the target URL wouldn't hit the network for - // the target URL. The target content should still be read correctly. - // The content is loaded from PrefetchedSignedExchangeCache. - NavigateToURLAndWaitTitle(target_sxg_url, "Prefetch Target (SXG)"); +IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, + PrefetchMainResourceSXG_CrossOrigin) { + RunPrefetchMainResourceSXGTest( + "aggregator.example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "distoributor.example.com" /* sxg_hostname */, + "/target.sxg" /* sxg_path */, + "publisher.example.com" /* inner_url_hostname */, + "/target.html" /* inner_url_path */); } -IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, SameUrl) { - int target_sxg_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.html"; - const char* target_path = "/target.html"; - - base::RunLoop target_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), target_sxg_path, - &target_sxg_fetch_count, &target_sxg_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = embedded_test_server()->GetURL(target_sxg_path); - const GURL target_url = embedded_test_server()->GetURL(target_path); - - RegisterResponse( - prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML content - // as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - - const net::SHA256HashValue target_header_integrity = {{0x01}}; - MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, target_url, - "text/html", {}, target_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - target_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, target_sxg_fetch_count); - - WaitUntilLoaded(target_sxg_url); - - EXPECT_EQ(1, prefetch_url_loader_called_); - - const auto cached_exchanges = GetCachedExchanges(shell()); - EXPECT_EQ(1u, cached_exchanges.size()); - const auto it = cached_exchanges.find(target_sxg_url); - ASSERT_TRUE(it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, it->second->outer_url()); - EXPECT_EQ(target_url, it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *it->second->header_integrity()); - - // Shutdown the server. - EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - - // Subsequent navigation to the target URL wouldn't hit the network for - // the target URL. The target content should still be read correctly. - // The content is loaded from PrefetchedSignedExchangeCache. - NavigateToURLAndWaitTitle(target_sxg_url, "Prefetch Target (SXG)"); +IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, + PrefetchMainResourceSXG_SameURL) { + RunPrefetchMainResourceSXGTest("example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "example.com" /* sxg_hostname */, + "/target.html" /* sxg_path */, + "example.com" /* inner_url_hostname */, + "/target.html" /* inner_url_path */); } -IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, BlobStorageLimit) { +IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, + PrefetchMainResourceSXG_BlobStorageLimit) { SetBlobLimits(); - int target_sxg_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.sxg"; - const char* target_path = "/target.html"; - base::RunLoop target_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), target_sxg_path, - &target_sxg_fetch_count, &target_sxg_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = embedded_test_server()->GetURL(target_sxg_path); - const GURL target_url = embedded_test_server()->GetURL(target_path); std::string content = "<head><title>Prefetch Target (SXG)</title></head>"; // Make the content larger than the disk space. content.resize(kTestBlobStorageMaxDiskSpace + 1, ' '); - RegisterResponse( - prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse(target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry(content, "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - const net::SHA256HashValue target_header_integrity = {{0x01}}; - MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, target_url, - "text/html", {}, target_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - target_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, target_sxg_fetch_count); - - WaitUntilLoaded(target_sxg_url); - - EXPECT_EQ(1, prefetch_url_loader_called_); - + LoadPrefetchMainResourceSXGTestPage( + "example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "example.com" /* sxg_hostname */, "/target.sxg" /* sxg_path */, + "example.com" /* inner_url_hostname */, + "/target.html" /* inner_url_path */, + net::SHA256HashValue({{0x01}}) /* header_integrity */, content); const auto cached_exchanges = GetCachedExchanges(shell()); // The content of prefetched SXG is larger than the Blob storage limit. // So the SXG should not be stored to the cache. EXPECT_EQ(0u, cached_exchanges.size()); } +// This test is almost same as SignedExchangeSubresourcePrefetchBrowserTest's +// MainResourceSXGAndScriptSXG_SameOrigin. The only difference is that this test +// is executed without SignedExchangeSubresourcePrefetch but with +// SignedExchangePrefetchCacheForNavigations when +// |sxg_subresource_prefetch_enabled| is false to check the behavior of +// SignedExchangePrefetchCacheForNavigations feature. IN_PROC_BROWSER_TEST_P(SignedExchangePrefetchBrowserTest, PrefetchAlternativeSubresourceSXG) { + const char* prefetch_page_path = "/prefetch.html"; + const char* page_sxg_path = "/target.sxg"; + const char* page_inner_url_path = "/target.html"; + const char* script_sxg_path = "/script_js.sxg"; + const char* script_inner_url_path = "/script.js"; + int script_sxg_fetch_count = 0; int script_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.sxg"; - const char* target_path = "/target.html"; - const char* script_sxg_path = "/script_js.sxg"; - const char* script_path = "/script.js"; base::RunLoop script_sxg_prefetch_waiter; RegisterRequestMonitor(embedded_test_server(), script_sxg_path, &script_sxg_fetch_count, &script_sxg_prefetch_waiter); base::RunLoop script_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), script_path, + RegisterRequestMonitor(embedded_test_server(), script_inner_url_path, &script_fetch_count, &script_prefetch_waiter); RegisterRequestHandler(embedded_test_server()); ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - const GURL target_sxg_url = embedded_test_server()->GetURL(target_sxg_path); - const GURL target_url = embedded_test_server()->GetURL(target_path); - const GURL script_sxg_url = embedded_test_server()->GetURL(script_sxg_path); - const GURL script_url = embedded_test_server()->GetURL(script_path); + const GURL prefetch_page_url = + embedded_test_server()->GetURL(prefetch_page_path); + const GURL sxg_page_url = embedded_test_server()->GetURL(page_sxg_path); + const GURL inner_url_page_url = + embedded_test_server()->GetURL(page_inner_url_path); + const GURL sxg_script_url = embedded_test_server()->GetURL(script_sxg_path); + const GURL inner_url_script_url = + embedded_test_server()->GetURL(script_inner_url_path); - const net::SHA256HashValue target_header_integrity = {{0x01}}; + const net::SHA256HashValue page_header_integrity = {{0x01}}; const net::SHA256HashValue script_header_integrity = {{0x02}}; - const std::string script_header_integrity_string = - GetHeaderIntegrityString(script_header_integrity); - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script_sxg_url.spec().c_str(), script_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script_url.spec().c_str(), script_header_integrity_string.c_str(), - script_url.spec().c_str()); + const std::string outer_link_header = + CreateAlternateLinkHeader(sxg_script_url, inner_url_script_url); + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString( + {CreateAllowedAltSxgLinkHeader(inner_url_script_url, + script_header_integrity), + CreatePreloadLinkHeader(inner_url_script_url, "script")}, + ","); + RegisterResponse(prefetch_page_path, + ResponseEntry(base::StringPrintf( + "<body><link rel='prefetch' href='%s'></body>", + sxg_page_url.spec().c_str()))); RegisterResponse( - prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse( - script_path, + script_inner_url_path, ResponseEntry("document.title=\"from server\";", "text/javascript", {{"cache-control", "public, max-age=600"}})); - RegisterResponse(target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + RegisterResponse(page_sxg_path, + CreateSignedExchangeResponseEntry( + "<head><title>Prefetch Target (SXG)</title>" + "<script src=\"./script.js\"></script></head>", + {{"link", outer_link_header}})); + RegisterResponse(script_sxg_path, CreateSignedExchangeResponseEntry( + "document.title=\"done\";")); MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, - target_header_integrity), + sxg_page_url, SignedExchangeLoadResult::kSuccess, net::OK, + inner_url_page_url, "text/html", {inner_link_headers}, + page_header_integrity), MockSignedExchangeHandlerParams( - script_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - script_url, "text/javascript", {}, script_header_integrity)}); + sxg_script_url, SignedExchangeLoadResult::kSuccess, net::OK, + inner_url_script_url, "text/javascript", {}, + script_header_integrity)}); ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - + EXPECT_EQ(0, prefetch_url_loader_called_); + NavigateToURL(shell(), prefetch_page_url); if (base::FeatureList::IsEnabled( features::kSignedExchangeSubresourcePrefetch)) { script_sxg_prefetch_waiter.Run(); EXPECT_EQ(1, script_sxg_fetch_count); EXPECT_EQ(0, script_fetch_count); + EXPECT_EQ(2, prefetch_url_loader_called_); } else { script_prefetch_waiter.Run(); EXPECT_EQ(0, script_sxg_fetch_count); EXPECT_EQ(1, script_fetch_count); + EXPECT_EQ(1, prefetch_url_loader_called_); } - WaitUntilLoaded(target_sxg_url); + WaitUntilLoaded(sxg_page_url); if (base::FeatureList::IsEnabled( features::kSignedExchangeSubresourcePrefetch)) { - WaitUntilLoaded(script_sxg_url); + WaitUntilLoaded(sxg_script_url); } else { - WaitUntilLoaded(script_url); + WaitUntilLoaded(inner_url_script_url); } const auto cached_exchanges = GetCachedExchanges(shell()); @@ -478,20 +424,20 @@ features::kSignedExchangeSubresourcePrefetch)) { EXPECT_EQ(2u, cached_exchanges.size()); - const auto script_it = cached_exchanges.find(script_sxg_url); + const auto script_it = cached_exchanges.find(sxg_script_url); ASSERT_TRUE(script_it != cached_exchanges.end()); - EXPECT_EQ(script_sxg_url, script_it->second->outer_url()); - EXPECT_EQ(script_url, script_it->second->inner_url()); + EXPECT_EQ(sxg_script_url, script_it->second->outer_url()); + EXPECT_EQ(inner_url_script_url, script_it->second->inner_url()); EXPECT_EQ(script_header_integrity, *script_it->second->header_integrity()); } else { EXPECT_EQ(1u, cached_exchanges.size()); } - const auto target_it = cached_exchanges.find(target_sxg_url); + const auto target_it = cached_exchanges.find(sxg_page_url); ASSERT_TRUE(target_it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, target_it->second->outer_url()); - EXPECT_EQ(target_url, target_it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *target_it->second->header_integrity()); + EXPECT_EQ(sxg_page_url, target_it->second->outer_url()); + EXPECT_EQ(inner_url_page_url, target_it->second->inner_url()); + EXPECT_EQ(page_header_integrity, *target_it->second->header_integrity()); if (base::FeatureList::IsEnabled( features::kSignedExchangeSubresourcePrefetch)) { @@ -499,11 +445,15 @@ // the target URL. The target content should still be read correctly. // The content is loaded from PrefetchedSignedExchangeCache. And the script // is also loaded from PrefetchedSignedExchangeCache. - NavigateToURLAndWaitTitle(target_sxg_url, "done"); + NavigateToURLAndWaitTitle(sxg_page_url, "done"); EXPECT_EQ(1, script_sxg_fetch_count); EXPECT_EQ(0, script_fetch_count); } else { - NavigateToURLAndWaitTitle(target_sxg_url, "from server"); + // Subsequent navigation to the target URL wouldn't hit the network for + // the target URL. The target content should still be read correctly. + // The content is loaded from PrefetchedSignedExchangeCache. But the script + // is loaded from the server. + NavigateToURLAndWaitTitle(sxg_page_url, "from server"); EXPECT_EQ(0, script_sxg_fetch_count); EXPECT_EQ(1, script_fetch_count); } @@ -543,6 +493,137 @@ } protected: + // This test prefetches a main SXG which has appropriate subresrouce signed + // exchange related headers, and navigate to the main SXG. If the subresource + // signed exchange was prefetched and used, |expected_title| should be "done", + // otherwise |expected_title| should be "from server" which is set by the + // subresource script. + // When |expected_script_fetch_count| is -1 this test doesn't check the script + // fetch count. + void RunPrefetchMainResourceSXGAndScriptSXGTest( + const std::string& prefetch_page_hostname, + const std::string& prefetch_page_path, + const std::string& page_sxg_hostname, + const std::string& page_sxg_path, + const std::string& script_sxg_hostname, + const std::string& script_sxg_path, + const std::string& inner_url_hostname, + const std::string& page_inner_url_path, + const std::string& script_inner_url_path, + const std::string& expected_title, + int expected_script_fetch_count) { + int script_sxg_fetch_count = 0; + int script_fetch_count = 0; + + // When |expected_script_fetch_count| is -1, we don't check the script fetch + // count. + const bool check_script_fetch_count = expected_script_fetch_count != -1; + + base::RunLoop script_sxg_prefetch_waiter; + RegisterRequestMonitor(embedded_test_server(), script_sxg_path, + &script_sxg_fetch_count, + &script_sxg_prefetch_waiter); + base::RunLoop script_prefetch_waiter; + if (check_script_fetch_count) { + RegisterRequestMonitor(embedded_test_server(), script_inner_url_path, + &script_fetch_count, &script_prefetch_waiter); + } + RegisterRequestHandler(embedded_test_server()); + ASSERT_TRUE(embedded_test_server()->Start()); + + const GURL prefetch_page_url = embedded_test_server()->GetURL( + prefetch_page_hostname, prefetch_page_path); + const GURL sxg_page_url = + embedded_test_server()->GetURL(page_sxg_hostname, page_sxg_path); + const GURL inner_url_page_url = + embedded_test_server()->GetURL(inner_url_hostname, page_inner_url_path); + const GURL sxg_script_url = + embedded_test_server()->GetURL(script_sxg_hostname, script_sxg_path); + const GURL inner_url_script_url = embedded_test_server()->GetURL( + inner_url_hostname, script_inner_url_path); + + const net::SHA256HashValue page_header_integrity = {{0x01}}; + const net::SHA256HashValue script_header_integrity = {{0x02}}; + + const std::string outer_link_header = + CreateAlternateLinkHeader(sxg_script_url, inner_url_script_url); + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString( + {CreateAllowedAltSxgLinkHeader(inner_url_script_url, + script_header_integrity), + CreatePreloadLinkHeader(inner_url_script_url, "script")}, + ","); + + RegisterResponse(prefetch_page_path, + ResponseEntry(base::StringPrintf( + "<body><link rel='prefetch' href='%s'></body>", + sxg_page_url.spec().c_str()))); + RegisterResponse( + script_inner_url_path, + ResponseEntry("document.title=\"from server\";", "text/javascript", + {{"cache-control", "public, max-age=600"}})); + RegisterResponse(page_sxg_path, + CreateSignedExchangeResponseEntry( + "<head><title>Prefetch Target (SXG)</title>" + "<script src=\"./script.js\"></script></head>", + {{"link", outer_link_header}})); + RegisterResponse(script_sxg_path, CreateSignedExchangeResponseEntry( + "document.title=\"done\";")); + MockSignedExchangeHandlerFactory factory( + {MockSignedExchangeHandlerParams( + sxg_page_url, SignedExchangeLoadResult::kSuccess, net::OK, + inner_url_page_url, "text/html", {inner_link_headers}, + page_header_integrity), + MockSignedExchangeHandlerParams( + sxg_script_url, SignedExchangeLoadResult::kSuccess, net::OK, + inner_url_script_url, "text/javascript", {}, + script_header_integrity)}); + ScopedSignedExchangeHandlerFactory scoped_factory(&factory); + + EXPECT_EQ(0, prefetch_url_loader_called_); + NavigateToURL(shell(), prefetch_page_url); + script_sxg_prefetch_waiter.Run(); + EXPECT_EQ(1, script_sxg_fetch_count); + if (check_script_fetch_count) { + EXPECT_EQ(0, script_fetch_count); + } + EXPECT_EQ(2, prefetch_url_loader_called_); + + WaitUntilLoaded(sxg_page_url); + WaitUntilLoaded(sxg_script_url); + + const auto cached_exchanges = GetCachedExchanges(shell()); + EXPECT_EQ(2u, cached_exchanges.size()); + + const auto target_it = cached_exchanges.find(sxg_page_url); + ASSERT_TRUE(target_it != cached_exchanges.end()); + EXPECT_EQ(sxg_page_url, target_it->second->outer_url()); + EXPECT_EQ(inner_url_page_url, target_it->second->inner_url()); + EXPECT_EQ(page_header_integrity, *target_it->second->header_integrity()); + + const auto script_it = cached_exchanges.find(sxg_script_url); + ASSERT_TRUE(script_it != cached_exchanges.end()); + EXPECT_EQ(sxg_script_url, script_it->second->outer_url()); + EXPECT_EQ(inner_url_script_url, script_it->second->inner_url()); + EXPECT_EQ(script_header_integrity, *script_it->second->header_integrity()); + + // Subsequent navigation to the target URL wouldn't hit the network for + // the target URL. The target content should still be read correctly. + // The content is loaded from PrefetchedSignedExchangeCache. + // + // When |expected_title| == "done": + // The script is also loaded from PrefetchedSignedExchangeCache. + // When |expected_title| == "from server": + // The script is loaded from the server. + NavigateToURLAndWaitTitle(sxg_page_url, expected_title); + + EXPECT_EQ(1, script_sxg_fetch_count); + if (check_script_fetch_count) { + EXPECT_EQ(expected_script_fetch_count, script_fetch_count); + } + } + // Test that CORB logic works well with prefetched signed exchange // subresources. This test loads a main SXG which signed by // "publisher.example.com", and loads a SXG subresource using a <script> tag. @@ -593,22 +674,15 @@ const net::SHA256HashValue target_header_integrity = {{0x01}}; const net::SHA256HashValue script_header_integrity = {{0x02}}; - const std::string script_header_integrity_string = - GetHeaderIntegrityString(script_header_integrity); - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script_sxg_url.spec().c_str(), script_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script_url.spec().c_str(), script_header_integrity_string.c_str(), - script_url.spec().c_str()); - + const std::string outer_link_header = + CreateAlternateLinkHeader(script_sxg_url, script_url); + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString( + {CreateAllowedAltSxgLinkHeader(script_url, script_header_integrity), + CreatePreloadLinkHeader(script_url, "script")}, + ","); RegisterResponse( prefetch_path, ResponseEntry(base::StringPrintf( @@ -616,19 +690,15 @@ RegisterResponse( script_path, ResponseEntry("document.title=\"from server\";", "text/javascript")); - RegisterResponse( - target_sxg_path, - ResponseEntry(base::StringPrintf( - "<head><script src=\"%s\"></script><title>original " - "title</title>" - "</head>", - script_url.spec().c_str()), - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); + RegisterResponse(target_sxg_path, + CreateSignedExchangeResponseEntry( + base::StringPrintf("<head><script src=\"%s\"></script>" + "<title>original title</title>" + "</head>", + script_url.spec().c_str()), + {{"link", outer_link_header}})); RegisterResponse(script_sxg_path, - ResponseEntry(content, "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + CreateSignedExchangeResponseEntry(content)); std::vector<std::string> script_inner_response_headers; if (has_nosniff) { script_inner_response_headers.emplace_back( @@ -676,6 +746,73 @@ }; IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, + MainResourceSXGAndScriptSXG_SameOrigin) { + RunPrefetchMainResourceSXGAndScriptSXGTest( + "example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "example.com" /* page_sxg_hostname */, "/target.sxg" /* page_sxg_path */, + "example.com" /* script_sxg_hostname */, + "/script.sxg" /* script_sxg_path */, + "example.com" /* inner_url_hostname */, + "/target.html" /* page_inner_url_path */, + "/script.js" /* script_inner_url_path */, "done" /* expected_title */, + 0 /* expected_script_fetch_count */); +} + +IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, + MainResourceSXGAndScriptSXG_SameUrl) { + // This test checks the behavior of subresource signed exchange prefetching + // when the inner URL and the outer URL of signed exchanges are same. + RunPrefetchMainResourceSXGAndScriptSXGTest( + "example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "example.com" /* page_sxg_hostname */, "/target.html" /* page_sxg_path */, + "example.com" /* script_sxg_hostname */, + "/script.js" /* script_sxg_path */, + "example.com" /* inner_url_hostname */, + "/target.html" /* page_inner_url_path */, + "/script.js" /* script_inner_url_path */, "done" /* expected_title */, + // Note that we don't check the script fetch count in this test. + -1 /* expected_script_fetch_count */); +} + +IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, + MainResourceSXGAndScriptSXG_CrossOrigin) { + // This test checks the behavior of subresource signed exchange prefetching + // when the inner URL's origin (= publisher) and the outer URL's origin + // (= distoributor) of signed exchanges is different from the prefetching page + // (= aggregator). + RunPrefetchMainResourceSXGAndScriptSXGTest( + "aggregator.example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "distoributor.example.com" /* page_sxg_hostname */, + "/target.sxg" /* page_sxg_path */, + "distoributor.example.com" /* script_sxg_hostname */, + "/script.sxg" /* script_sxg_path */, + "publisher.example.com" /* inner_url_hostname */, + "/target.html" /* page_inner_url_path */, + "/script.js" /* script_inner_url_path */, "done" /* expected_title */, + 0 /* expected_script_fetch_count */); +} + +IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, + MainResourceSXGAndScriptSXG_DifferentOriginScriptSXG) { + // When the subresource SXG was served from different origin from the main + // SXG, the subresource should be loaded from the server. + RunPrefetchMainResourceSXGAndScriptSXGTest( + "aggregator.example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "distoributor1.example.com" /* page_sxg_hostname */, + "/target.sxg" /* page_sxg_path */, + "distoributor2.example.com" /* script_sxg_hostname */, + "/script.sxg" /* script_sxg_path */, + "publisher.example.com" /* inner_url_hostname */, + "/target.html" /* page_inner_url_path */, + "/script.js" /* script_inner_url_path */, + "from server" /* expected_title */, 1 /* expected_script_fetch_count */); +} + +IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, ImageSrcsetAndSizes) { int image1_sxg_fetch_count = 0; int image1_fetch_count = 0; @@ -724,62 +861,44 @@ const net::SHA256HashValue target_header_integrity = {{0x01}}; const net::SHA256HashValue image1_header_integrity = {{0x02}}; const net::SHA256HashValue image2_header_integrity = {{0x03}}; - const std::string image1_header_integrity_string = - GetHeaderIntegrityString(image1_header_integrity); - const std::string image2_header_integrity_string = - GetHeaderIntegrityString(image2_header_integrity); - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"," - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - image1_sxg_url.spec().c_str(), image1_url.spec().c_str(), - image2_sxg_url.spec().c_str(), image2_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"image\";" - // imagesrcset says the size of image1 is 320, and the size of image2 is - // 160. - "imagesrcset=\"%s 320w, %s 160w\";" - // imagesizes says the size of the image is 320. So image1 is selected. - "imagesizes=\"320px\"", - image1_url.spec().c_str(), image1_header_integrity_string.c_str(), - image2_url.spec().c_str(), image2_header_integrity_string.c_str(), - image2_url.spec().c_str(), image1_url.spec().c_str(), - image2_url.spec().c_str()); - + const std::string outer_link_header = + base::JoinString({CreateAlternateLinkHeader(image1_sxg_url, image1_url), + CreateAlternateLinkHeader(image2_sxg_url, image2_url)}, + ","); + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString( + {CreateAllowedAltSxgLinkHeader(image1_url, image1_header_integrity), + CreateAllowedAltSxgLinkHeader(image2_url, image2_header_integrity), + base::StringPrintf("<%s>;rel=\"preload\";as=\"image\";" + // imagesrcset says the size of image1 is 320, and + // the size of image2 is 160. + "imagesrcset=\"%s 320w, %s 160w\";" + // imagesizes says the size of the image is 320. + // So image1 is selected. + "imagesizes=\"320px\"", + image2_url.spec().c_str(), + image1_url.spec().c_str(), + image2_url.spec().c_str())}, + ","); RegisterResponse( prefetch_path, ResponseEntry(base::StringPrintf( "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); RegisterResponse(image1_path, ResponseEntry(image_contents, "image/png")); RegisterResponse(image2_path, ResponseEntry(image_contents, "image/png")); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry(base::StringPrintf( - "<head>" - "<title>Prefetch Target (SXG)</title>" - "</head>" - "<img src=\"%s\" onload=\"document.title='done'\">", - image1_url.spec().c_str()), - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse( - image1_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry(image_contents, "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + RegisterResponse(target_sxg_path, + CreateSignedExchangeResponseEntry( + base::StringPrintf( + "<head>" + "<title>Prefetch Target (SXG)</title>" + "</head>" + "<img src=\"%s\" onload=\"document.title='done'\">", + image1_url.spec().c_str()), + {{"link", outer_link_header}})); + RegisterResponse(image1_sxg_path, + CreateSignedExchangeResponseEntry(image_contents)); MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -827,222 +946,6 @@ } IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, - CrossOrigin) { - int script_sxg_fetch_count = 0; - int script_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.sxg"; - const char* target_path = "/target.html"; - const char* script_sxg_path = "/script_js.sxg"; - const char* script_path = "/script.js"; - - base::RunLoop script_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), script_sxg_path, - &script_sxg_fetch_count, &script_sxg_prefetch_waiter); - base::RunLoop script_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), script_path, - &script_fetch_count, &script_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = - embedded_test_server()->GetURL("sxg.example.com", target_sxg_path); - const GURL target_url = - embedded_test_server()->GetURL("publisher.example.com", target_path); - const GURL script_sxg_url = - embedded_test_server()->GetURL("sxg.example.com", script_sxg_path); - const GURL script_url = - embedded_test_server()->GetURL("publisher.example.com", script_path); - - const net::SHA256HashValue target_header_integrity = {{0x01}}; - const net::SHA256HashValue script_header_integrity = {{0x02}}; - const std::string script_header_integrity_string = - GetHeaderIntegrityString(script_header_integrity); - - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script_sxg_url.spec().c_str(), script_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script_url.spec().c_str(), script_header_integrity_string.c_str(), - script_url.spec().c_str()); - - RegisterResponse(prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", - target_sxg_url.spec().c_str()))); - RegisterResponse(script_path, ResponseEntry("document.title=\"from server\";", - "text/javascript")); - RegisterResponse(target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - MockSignedExchangeHandlerFactory factory( - {MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, - target_header_integrity), - MockSignedExchangeHandlerParams( - script_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - script_url, "text/javascript", {}, script_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - script_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, script_sxg_fetch_count); - EXPECT_EQ(0, script_fetch_count); - - WaitUntilLoaded(target_sxg_url); - WaitUntilLoaded(script_sxg_url); - - const auto cached_exchanges = GetCachedExchanges(shell()); - EXPECT_EQ(2u, cached_exchanges.size()); - - const auto target_it = cached_exchanges.find(target_sxg_url); - ASSERT_TRUE(target_it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, target_it->second->outer_url()); - EXPECT_EQ(target_url, target_it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *target_it->second->header_integrity()); - - const auto script_it = cached_exchanges.find(script_sxg_url); - ASSERT_TRUE(script_it != cached_exchanges.end()); - EXPECT_EQ(script_sxg_url, script_it->second->outer_url()); - EXPECT_EQ(script_url, script_it->second->inner_url()); - EXPECT_EQ(script_header_integrity, *script_it->second->header_integrity()); - - // Subsequent navigation to the target URL wouldn't hit the network for - // the target URL. The target content should still be read correctly. - // The content is loaded from PrefetchedSignedExchangeCache. And the script - // is also loaded from PrefetchedSignedExchangeCache. - NavigateToURLAndWaitTitle(target_sxg_url, "done"); - - EXPECT_EQ(1, script_sxg_fetch_count); - EXPECT_EQ(0, script_fetch_count); -} - -IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, - DifferentOrigin) { - int script_sxg_fetch_count = 0; - int script_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.sxg"; - const char* target_path = "/target.html"; - const char* script_sxg_path = "/script_js.sxg"; - const char* script_path = "/script.js"; - - base::RunLoop script_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), script_sxg_path, - &script_sxg_fetch_count, &script_sxg_prefetch_waiter); - base::RunLoop script_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), script_path, - &script_fetch_count, &script_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = embedded_test_server()->GetURL(target_sxg_path); - const GURL target_url = embedded_test_server()->GetURL(target_path); - // script_js.sxg is served from different origin. - const GURL script_sxg_url = - embedded_test_server()->GetURL("example.com", script_sxg_path); - const GURL script_url = embedded_test_server()->GetURL(script_path); - - const net::SHA256HashValue target_header_integrity = {{0x01}}; - const net::SHA256HashValue script_header_integrity = {{0x02}}; - const std::string script_header_integrity_string = - GetHeaderIntegrityString(script_header_integrity); - - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script_sxg_url.spec().c_str(), script_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script_url.spec().c_str(), script_header_integrity_string.c_str(), - script_url.spec().c_str()); - - RegisterResponse( - prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse(script_path, ResponseEntry("document.title=\"from server\";", - "text/javascript")); - RegisterResponse(target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - MockSignedExchangeHandlerFactory factory( - {MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, - target_header_integrity), - MockSignedExchangeHandlerParams( - script_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - script_url, "text/javascript", {}, script_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - script_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, script_sxg_fetch_count); - EXPECT_EQ(0, script_fetch_count); - - WaitUntilLoaded(target_sxg_url); - WaitUntilLoaded(script_sxg_url); - - const auto cached_exchanges = GetCachedExchanges(shell()); - EXPECT_EQ(2u, cached_exchanges.size()); - - const auto target_it = cached_exchanges.find(target_sxg_url); - ASSERT_TRUE(target_it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, target_it->second->outer_url()); - EXPECT_EQ(target_url, target_it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *target_it->second->header_integrity()); - - const auto script_it = cached_exchanges.find(script_sxg_url); - ASSERT_TRUE(script_it != cached_exchanges.end()); - EXPECT_EQ(script_sxg_url, script_it->second->outer_url()); - EXPECT_EQ(script_url, script_it->second->inner_url()); - EXPECT_EQ(script_header_integrity, *script_it->second->header_integrity()); - - // script_js.sxg was served from different origin from target.sxg. So - // script.js is loaded from the server. - NavigateToURLAndWaitTitle(target_sxg_url, "from server"); - - EXPECT_EQ(1, script_sxg_fetch_count); - EXPECT_EQ(1, script_fetch_count); -} - -IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, MultipleResources) { int script1_sxg_fetch_count = 0; int script1_fetch_count = 0; @@ -1083,29 +986,20 @@ const net::SHA256HashValue target_header_integrity = {{0x01}}; const net::SHA256HashValue script1_header_integrity = {{0x02}}; - const std::string script1_header_integrity_string = - GetHeaderIntegrityString(script1_header_integrity); const net::SHA256HashValue script2_header_integrity = {{0x03}}; - const std::string script2_header_integrity_string = - GetHeaderIntegrityString(script2_header_integrity); - const std::string outer_link_header = base::StringPrintf( - "<%s>;rel=\"alternate\";type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"," - "<%s>;rel=\"alternate\";type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script1_sxg_url.spec().c_str(), script1_url.spec().c_str(), - script2_sxg_url.spec().c_str(), script2_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"," - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script1_url.spec().c_str(), script1_header_integrity_string.c_str(), - script1_url.spec().c_str(), script2_url.spec().c_str(), - script2_header_integrity_string.c_str(), script2_url.spec().c_str()); - + const std::string outer_link_header = base::JoinString( + {CreateAlternateLinkHeader(script1_sxg_url, script1_url), + CreateAlternateLinkHeader(script2_sxg_url, script2_url)}, + ","); + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString( + {CreateAllowedAltSxgLinkHeader(script1_url, script1_header_integrity), + CreateAllowedAltSxgLinkHeader(script2_url, script2_header_integrity), + CreatePreloadLinkHeader(script1_url, "script"), + CreatePreloadLinkHeader(script2_url, "script")}, + ","); RegisterResponse( prefetch_path, ResponseEntry(base::StringPrintf( @@ -1115,28 +1009,16 @@ RegisterResponse(script2_path, ResponseEntry("document.title=test_title+\"server\";", "text/javascript")); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script1.js\"></script>" - "<script src=\"./script2.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script1_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("var test_title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - RegisterResponse(script2_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=test_title;", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + RegisterResponse(target_sxg_path, + CreateSignedExchangeResponseEntry( + "<head><title>Prefetch Target (SXG)</title>" + "<script src=\"./script1.js\"></script>" + "<script src=\"./script2.js\"></script></head>", + {{"link", outer_link_header}})); + RegisterResponse(script1_sxg_path, CreateSignedExchangeResponseEntry( + "var test_title=\"done\";")); + RegisterResponse(script2_sxg_path, CreateSignedExchangeResponseEntry( + "document.title=test_title;")); MockSignedExchangeHandlerFactory factory({ MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1196,105 +1078,6 @@ EXPECT_EQ(0, script2_fetch_count); } -IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, SameUrl) { - int script_sxg_fetch_count = 0; - int script_fetch_count = 0; - const char* prefetch_path = "/prefetch.html"; - const char* target_sxg_path = "/target.html"; - const char* target_path = "/target.html"; - const char* script_sxg_path = "/script.js"; - const char* script_path = "/script.js"; - - base::RunLoop script_sxg_prefetch_waiter; - RegisterRequestMonitor(embedded_test_server(), script_sxg_path, - &script_sxg_fetch_count, &script_sxg_prefetch_waiter); - RegisterRequestHandler(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_EQ(0, prefetch_url_loader_called_); - - const GURL target_sxg_url = embedded_test_server()->GetURL(target_sxg_path); - const GURL target_url = embedded_test_server()->GetURL(target_path); - const GURL script_sxg_url = embedded_test_server()->GetURL(script_sxg_path); - const GURL script_url = embedded_test_server()->GetURL(script_path); - - const net::SHA256HashValue target_header_integrity = {{0x01}}; - const net::SHA256HashValue script_header_integrity = {{0x02}}; - const std::string script_header_integrity_string = - GetHeaderIntegrityString(script_header_integrity); - - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script_sxg_url.spec().c_str(), script_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script_url.spec().c_str(), script_header_integrity_string.c_str(), - script_url.spec().c_str()); - - RegisterResponse( - prefetch_path, - ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse(script_path, ResponseEntry("document.title=\"from server\";", - "text/javascript")); - RegisterResponse(target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - MockSignedExchangeHandlerFactory factory( - {MockSignedExchangeHandlerParams( - target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, - target_header_integrity), - MockSignedExchangeHandlerParams( - script_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - script_url, "text/javascript", {}, script_header_integrity)}); - ScopedSignedExchangeHandlerFactory scoped_factory(&factory); - - NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)); - script_sxg_prefetch_waiter.Run(); - EXPECT_EQ(1, script_sxg_fetch_count); - EXPECT_EQ(0, script_fetch_count); - - WaitUntilLoaded(target_sxg_url); - WaitUntilLoaded(script_sxg_url); - - const auto cached_exchanges = GetCachedExchanges(shell()); - EXPECT_EQ(2u, cached_exchanges.size()); - - const auto target_it = cached_exchanges.find(target_sxg_url); - ASSERT_TRUE(target_it != cached_exchanges.end()); - EXPECT_EQ(target_sxg_url, target_it->second->outer_url()); - EXPECT_EQ(target_url, target_it->second->inner_url()); - EXPECT_EQ(target_header_integrity, *target_it->second->header_integrity()); - - const auto script_it = cached_exchanges.find(script_sxg_url); - ASSERT_TRUE(script_it != cached_exchanges.end()); - EXPECT_EQ(script_sxg_url, script_it->second->outer_url()); - EXPECT_EQ(script_url, script_it->second->inner_url()); - EXPECT_EQ(script_header_integrity, *script_it->second->header_integrity()); - - // Subsequent navigation to the target URL wouldn't hit the network for - // the target URL. The target content should still be read correctly. - // The content is loaded from PrefetchedSignedExchangeCache. And the script - // is also loaded from PrefetchedSignedExchangeCache. - NavigateToURLAndWaitTitle(target_sxg_url, "done"); -} - IN_PROC_BROWSER_TEST_P(SignedExchangeSubresourcePrefetchBrowserTest, IntegrityMismatch) { int script_sxg_fetch_count = 0; @@ -1323,23 +1106,17 @@ const net::SHA256HashValue target_header_integrity = {{0x01}}; const net::SHA256HashValue script_header_integrity = {{0x02}}; const net::SHA256HashValue wrong_script_header_integrity = {{0x03}}; + + const std::string outer_link_header = + CreateAlternateLinkHeader(script_sxg_url, script_url); // Use the wrong header integrity value for "allowed-alt-sxg" link header to // trigger the integrity mismatch fallback logic. - const std::string script_header_integrity_string = - GetHeaderIntegrityString(wrong_script_header_integrity); - - const std::string outer_link_header = base::StringPrintf( - "<%s>;" - "rel=\"alternate\";" - "type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script_sxg_url.spec().c_str(), script_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script_url.spec().c_str(), script_header_integrity_string.c_str(), - script_url.spec().c_str()); + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString({CreateAllowedAltSxgLinkHeader( + script_url, wrong_script_header_integrity), + CreatePreloadLinkHeader(script_url, "script")}, + ","); RegisterResponse( prefetch_path, @@ -1348,19 +1125,12 @@ RegisterResponse(script_path, ResponseEntry("document.title=\"from server\";", "text/javascript")); RegisterResponse(target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + CreateSignedExchangeResponseEntry( + "<head><title>Prefetch Target (SXG)</title>" + "<script src=\"./script.js\"></script></head>", + {{"link", outer_link_header}})); + RegisterResponse(script_sxg_path, CreateSignedExchangeResponseEntry( + "document.title=\"done\";")); MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1428,31 +1198,24 @@ const net::SHA256HashValue target_header_integrity = {{0x01}}; const net::SHA256HashValue script1_header_integrity = {{0x02}}; - const std::string script1_header_integrity_string = - GetHeaderIntegrityString(script1_header_integrity); const net::SHA256HashValue script2_header_integrity = {{0x03}}; const net::SHA256HashValue wrong_script2_header_integrity = {{0x04}}; - // Use the wrong header integrity value for "allowed-alt-sxg" link header to - // trigger the integrity mismatch fallback logic. - const std::string script2_header_integrity_string = - GetHeaderIntegrityString(wrong_script2_header_integrity); - const std::string outer_link_header = base::StringPrintf( - "<%s>;rel=\"alternate\";type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"," - "<%s>;rel=\"alternate\";type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - script1_sxg_url.spec().c_str(), script1_url.spec().c_str(), - script2_sxg_url.spec().c_str(), script2_url.spec().c_str()); - const std::string inner_link_headers = base::StringPrintf( - "Link: " - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"," - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"script\"", - script1_url.spec().c_str(), script1_header_integrity_string.c_str(), - script1_url.spec().c_str(), script2_url.spec().c_str(), - script2_header_integrity_string.c_str(), script2_url.spec().c_str()); + const std::string outer_link_header = base::JoinString( + {CreateAlternateLinkHeader(script1_sxg_url, script1_url), + CreateAlternateLinkHeader(script2_sxg_url, script2_url)}, + ","); + // Use the wrong header integrity value for "allowed-alt-sxg" link header for + // script2 to trigger the integrity mismatch fallback logic. + const std::string inner_link_headers = + std::string("Link: ") + + base::JoinString( + {CreateAllowedAltSxgLinkHeader(script1_url, script1_header_integrity), + CreateAllowedAltSxgLinkHeader(script2_url, + wrong_script2_header_integrity), + CreatePreloadLinkHeader(script1_url, "script"), + CreatePreloadLinkHeader(script2_url, "script")}, + ","); RegisterResponse( prefetch_path, @@ -1463,28 +1226,16 @@ RegisterResponse(script2_path, ResponseEntry("document.title=test_title+\" server\";", "text/javascript")); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry("<head><title>Prefetch Target (SXG)</title>" - "<script src=\"./script1.js\"></script>" - "<script src=\"./script2.js\"></script></head>", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", outer_link_header}})); - RegisterResponse(script1_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("var test_title=\"done\";", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); - RegisterResponse(script2_sxg_path, - // We mock the SignedExchangeHandler, so just return a JS - // content as "application/signed-exchange;v=b3". - ResponseEntry("document.title=test_title;", - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + RegisterResponse(target_sxg_path, + CreateSignedExchangeResponseEntry( + "<head><title>Prefetch Target (SXG)</title>" + "<script src=\"./script1.js\"></script>" + "<script src=\"./script2.js\"></script></head>", + {{"link", outer_link_header}})); + RegisterResponse(script1_sxg_path, CreateSignedExchangeResponseEntry( + "var test_title=\"done\";")); + RegisterResponse(script2_sxg_path, CreateSignedExchangeResponseEntry( + "document.title=test_title;")); MockSignedExchangeHandlerFactory factory({ MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1650,26 +1401,18 @@ "new Request('%s', {credentials: '%s'})", data_url.spec().c_str(), kTestCases[i].request_credentials); const net::SHA256HashValue data_header_integrity = {{0x02 + i}}; - const std::string data_header_integrity_string = - GetHeaderIntegrityString(data_header_integrity); - target_sxg_outer_link_header += base::StringPrintf( - "<%s>;rel=\"alternate\";type=\"application/signed-exchange;v=b3\";" - "anchor=\"%s\"", - data_sxg_url.spec().c_str(), data_url.spec().c_str()); - - target_sxg_inner_link_header += base::StringPrintf( - "<%s>;rel=\"allowed-alt-sxg\";header-integrity=\"%s\"," - "<%s>;rel=\"preload\";as=\"fetch\"", - data_url.spec().c_str(), data_header_integrity_string.c_str(), - data_url.spec().c_str()); + target_sxg_outer_link_header += + CreateAlternateLinkHeader(data_sxg_url, data_url); + target_sxg_inner_link_header += base::JoinString( + {CreateAllowedAltSxgLinkHeader(data_url, data_header_integrity), + CreatePreloadLinkHeader(data_url, "fetch")}, + ","); if (kTestCases[i].crossorigin_preload_header) { target_sxg_inner_link_header += base::StringPrintf(";%s", kTestCases[i].crossorigin_preload_header); } - RegisterResponse(data_sxg_path, - ResponseEntry("sxg", "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}})); + RegisterResponse(data_sxg_path, CreateSignedExchangeResponseEntry("sxg")); RegisterResponse( data_path, ResponseEntry( @@ -1703,11 +1446,9 @@ prefetch_path, ResponseEntry(base::StringPrintf( "<body><link rel='prefetch' href='%s'></body>", target_sxg_path))); - RegisterResponse( - target_sxg_path, - // We mock the SignedExchangeHandler, so just return a HTML - // content as "application/signed-exchange;v=b3". - ResponseEntry(base::StringPrintf(R"( + RegisterResponse(target_sxg_path, + CreateSignedExchangeResponseEntry( + base::StringPrintf(R"( <head><title>Prefetch Target (SXG)</title><script> let results = []; (async function(requests) { @@ -1722,10 +1463,8 @@ document.title = 'done'; })([%s]); </script></head>)", - requests_list_string.c_str()), - "application/signed-exchange;v=b3", - {{"x-content-type-options", "nosniff"}, - {"link", target_sxg_outer_link_header}})); + requests_list_string.c_str()), + {{"link", target_sxg_outer_link_header}})); ScopedSignedExchangeHandlerFactory scoped_factory(&factory);
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc index 7a71640..a03ec6c8 100644 --- a/content/browser/webauth/authenticator_common.cc +++ b/content/browser/webauth/authenticator_common.cc
@@ -20,6 +20,7 @@ #include "base/timer/timer.h" #include "build/build_config.h" #include "content/browser/bad_message.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/webauth/authenticator_environment_impl.h" #include "content/browser/webauth/authenticator_type_converters.h" #include "content/public/browser/browser_context.h" @@ -565,7 +566,8 @@ request_ = std::make_unique<device::MakeCredentialRequestHandler>( connector_, AuthenticatorEnvironmentImpl::GetInstance()->GetFactory( - render_frame_host_), + static_cast<RenderFrameHostImpl*>(render_frame_host_) + ->frame_tree_node()), GetTransports(caller_origin_, transports_), *ctap_make_credential_request_, *authenticator_selection_criteria_, base::BindOnce(&AuthenticatorCommon::OnRegisterResponse, @@ -601,7 +603,8 @@ request_ = std::make_unique<device::GetAssertionRequestHandler>( connector_, AuthenticatorEnvironmentImpl::GetInstance()->GetFactory( - render_frame_host_), + static_cast<RenderFrameHostImpl*>(render_frame_host_) + ->frame_tree_node()), GetTransports(caller_origin_, transports_), *ctap_get_assertion_request_, base::BindOnce(&AuthenticatorCommon::OnSignResponse, weak_factory_.GetWeakPtr()));
diff --git a/content/browser/webauth/authenticator_environment_impl.cc b/content/browser/webauth/authenticator_environment_impl.cc index 6bb72968..92c5123a 100644 --- a/content/browser/webauth/authenticator_environment_impl.cc +++ b/content/browser/webauth/authenticator_environment_impl.cc
@@ -10,7 +10,6 @@ #include "base/stl_util.h" #include "content/browser/webauth/virtual_discovery.h" #include "content/browser/webauth/virtual_fido_discovery_factory.h" -#include "content/public/browser/render_frame_host.h" #include "content/public/common/content_switches.h" #include "device/fido/fido_discovery_factory.h" @@ -39,8 +38,8 @@ AuthenticatorEnvironmentImpl::~AuthenticatorEnvironmentImpl() = default; device::FidoDiscoveryFactory* AuthenticatorEnvironmentImpl::GetFactory( - RenderFrameHost* host) { - auto* factory = GetVirtualFactoryFor(host); + FrameTreeNode* node) { + auto* factory = GetVirtualFactoryFor(node); if (factory) return factory; return discovery_factory_.get(); @@ -51,34 +50,44 @@ } void AuthenticatorEnvironmentImpl::EnableVirtualAuthenticatorFor( - RenderFrameHost* host) { + FrameTreeNode* node) { // Do not create a new virtual authenticator if there is one already defined - // for the |host|. - if (base::ContainsKey(virtual_discovery_factories_, host)) + // for the |node|. + if (base::ContainsKey(virtual_discovery_factories_, node)) return; - virtual_discovery_factories_[host] = + + node->AddObserver(this); + virtual_discovery_factories_[node] = std::make_unique<VirtualFidoDiscoveryFactory>(); } void AuthenticatorEnvironmentImpl::DisableVirtualAuthenticatorFor( - RenderFrameHost* host) { - if (base::ContainsKey(virtual_discovery_factories_, host)) - virtual_discovery_factories_.erase(host); + FrameTreeNode* node) { + if (!base::ContainsKey(virtual_discovery_factories_, node)) + return; + + node->RemoveObserver(this); + virtual_discovery_factories_.erase(node); +} + +VirtualFidoDiscoveryFactory* AuthenticatorEnvironmentImpl::GetVirtualFactoryFor( + FrameTreeNode* node) { + do { + if (base::ContainsKey(virtual_discovery_factories_, node)) { + return virtual_discovery_factories_[node].get(); + } + } while ((node = node->parent())); + return nullptr; } void AuthenticatorEnvironmentImpl::AddVirtualAuthenticatorBinding( - RenderFrameHost* host, + FrameTreeNode* node, blink::test::mojom::VirtualAuthenticatorManagerRequest request) { - auto* factory = GetVirtualFactoryFor(host); + auto* factory = GetVirtualFactoryFor(node); DCHECK(factory); factory->AddBinding(std::move(request)); } -void AuthenticatorEnvironmentImpl::ReplaceDefaultDiscoveryFactoryForTesting( - std::unique_ptr<device::FidoDiscoveryFactory> factory) { - discovery_factory_ = std::move(factory); -} - void AuthenticatorEnvironmentImpl::OnDiscoveryDestroyed( VirtualFidoDiscovery* discovery) { for (auto& it : virtual_discovery_factories_) { @@ -86,14 +95,14 @@ } } -VirtualFidoDiscoveryFactory* AuthenticatorEnvironmentImpl::GetVirtualFactoryFor( - RenderFrameHost* host) { - do { - if (base::ContainsKey(virtual_discovery_factories_, host)) { - return virtual_discovery_factories_[host].get(); - } - } while ((host = host->GetParent())); - return nullptr; +void AuthenticatorEnvironmentImpl::ReplaceDefaultDiscoveryFactoryForTesting( + std::unique_ptr<device::FidoDiscoveryFactory> factory) { + discovery_factory_ = std::move(factory); +} + +void AuthenticatorEnvironmentImpl::OnFrameTreeNodeDestroyed( + FrameTreeNode* node) { + DisableVirtualAuthenticatorFor(node); } } // namespace content
diff --git a/content/browser/webauth/authenticator_environment_impl.h b/content/browser/webauth/authenticator_environment_impl.h index 9615929b..8d4194d 100644 --- a/content/browser/webauth/authenticator_environment_impl.h +++ b/content/browser/webauth/authenticator_environment_impl.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/no_destructor.h" +#include "content/browser/frame_host/frame_tree_node.h" #include "content/common/content_export.h" #include "content/public/browser/authenticator_environment.h" #include "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom.h" @@ -20,7 +21,6 @@ namespace content { -class RenderFrameHost; class VirtualFidoDiscovery; class VirtualFidoDiscoveryFactory; @@ -29,31 +29,36 @@ // // This class is a singleton. class CONTENT_EXPORT AuthenticatorEnvironmentImpl - : public AuthenticatorEnvironment { + : public AuthenticatorEnvironment, + FrameTreeNode::Observer { public: static AuthenticatorEnvironmentImpl* GetInstance(); - // Returns a FidoDiscoveryFactory for the given frame host. - device::FidoDiscoveryFactory* GetFactory(RenderFrameHost* host); + // Returns a FidoDiscoveryFactory for the given node. + device::FidoDiscoveryFactory* GetFactory(FrameTreeNode* node); // Returns the default FidoDiscoveryFactory. device::FidoDiscoveryFactory* GetFactory(); - // Enables the scoped virtual authenticator environment for the frame host and - // its descendants. - // Does not have any effect if the |host| already has the virtual environment + // Enables the scoped virtual authenticator environment for the |node| and its + // descendants. + // Does not have any effect if the |node| already has the virtual environment // enabled. - void EnableVirtualAuthenticatorFor(RenderFrameHost* host); + void EnableVirtualAuthenticatorFor(FrameTreeNode* node); - // Disables the scoped virtual authenticator environment for this |host|, - // resetting the state. If the environment is set on one of the |host|'s + // Disables the scoped virtual authenticator environment for this |node|, + // resetting the state. If the environment is set on one of the |node|'s // parents instead, this won't have any effect. - void DisableVirtualAuthenticatorFor(RenderFrameHost* host); + void DisableVirtualAuthenticatorFor(FrameTreeNode* node); - // Binds the request to the virtual authenticator enabled for the frame host. - // The virtual authenticator must be enabled beforehand. + // Returns the virtual fido discovery factory for the |node| if the virtual + // environment is enabled for it, otherwise returns nullptr. + VirtualFidoDiscoveryFactory* GetVirtualFactoryFor(FrameTreeNode* node); + + // Binds the request to the virtual authenticator enabled for the |node|. The + // virtual authenticator must be enabled beforehand. void AddVirtualAuthenticatorBinding( - RenderFrameHost* host, + FrameTreeNode* node, blink::test::mojom::VirtualAuthenticatorManagerRequest request); // Called by VirtualFidoDiscoveries when they are destructed. @@ -63,6 +68,9 @@ void ReplaceDefaultDiscoveryFactoryForTesting( std::unique_ptr<device::FidoDiscoveryFactory> factory) override; + // FrameTreeNode::Observer: + void OnFrameTreeNodeDestroyed(FrameTreeNode* node) override; + protected: AuthenticatorEnvironmentImpl(); ~AuthenticatorEnvironmentImpl() override; @@ -70,13 +78,9 @@ private: friend class base::NoDestructor<AuthenticatorEnvironmentImpl>; - // Returns the virtual fido discovery factory for the host if the virtual - // environment is enabled for it, otherwise returns nullptr. - VirtualFidoDiscoveryFactory* GetVirtualFactoryFor(RenderFrameHost* host); - std::unique_ptr<device::FidoDiscoveryFactory> discovery_factory_; - std::map<RenderFrameHost*, std::unique_ptr<VirtualFidoDiscoveryFactory>> + std::map<FrameTreeNode*, std::unique_ptr<VirtualFidoDiscoveryFactory>> virtual_discovery_factories_; DISALLOW_COPY_AND_ASSIGN(AuthenticatorEnvironmentImpl);
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index 1b94179..5126e51 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -2495,29 +2495,38 @@ TEST_F(AuthenticatorImplTest, Transports) { TestServiceManagerContext smc; NavigateAndCommit(GURL(kTestOrigin1)); + AuthenticatorPtr authenticator = ConnectToAuthenticator(); + auto bluetooth_values = SetUpMockBluetooth(); + SetTransports(device::GetAllTransportProtocols()); for (auto protocol : {device::ProtocolVersion::kU2f, device::ProtocolVersion::kCtap2}) { SCOPED_TRACE(static_cast<int>(protocol)); - virtual_device_factory_->SetSupportedProtocol(protocol); - AuthenticatorPtr authenticator = ConnectToAuthenticator(); - PublicKeyCredentialCreationOptionsPtr options = - GetTestPublicKeyCredentialCreationOptions(); - TestMakeCredentialCallback callback_receiver; - authenticator->MakeCredential(std::move(options), - callback_receiver.callback()); - callback_receiver.WaitForCallback(); - EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status()); + for (const auto transport : std::map<device::FidoTransportProtocol, + blink::mojom::AuthenticatorTransport>( + {{device::FidoTransportProtocol::kUsbHumanInterfaceDevice, + blink::mojom::AuthenticatorTransport::USB}, + {device::FidoTransportProtocol::kBluetoothLowEnergy, + blink::mojom::AuthenticatorTransport::BLE}, + {device::FidoTransportProtocol::kNearFieldCommunication, + blink::mojom::AuthenticatorTransport::NFC}})) { + virtual_device_factory_->SetTransport(transport.first); - const std::vector<blink::mojom::AuthenticatorTransport>& transports( - callback_receiver.value()->transports); - ASSERT_EQ(2u, transports.size()); - EXPECT_EQ(blink::mojom::AuthenticatorTransport::USB, transports[0]); - // VirtualFidoDevice generates an attestation certificate that asserts NFC - // support via an extension. - EXPECT_EQ(blink::mojom::AuthenticatorTransport::NFC, transports[1]); + PublicKeyCredentialCreationOptionsPtr options = + GetTestPublicKeyCredentialCreationOptions(); + TestMakeCredentialCallback callback_receiver; + authenticator->MakeCredential(std::move(options), + callback_receiver.callback()); + callback_receiver.WaitForCallback(); + EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status()); + + const std::vector<blink::mojom::AuthenticatorTransport>& transports( + callback_receiver.value()->transports); + ASSERT_EQ(1u, transports.size()); + EXPECT_EQ(transport.second, transports[0]); + } } }
diff --git a/content/browser/webauth/virtual_fido_discovery_factory.cc b/content/browser/webauth/virtual_fido_discovery_factory.cc index f011655..fec0452 100644 --- a/content/browser/webauth/virtual_fido_discovery_factory.cc +++ b/content/browser/webauth/virtual_fido_discovery_factory.cc
@@ -32,6 +32,36 @@ VirtualFidoDiscoveryFactory::~VirtualFidoDiscoveryFactory() = default; +VirtualAuthenticator* VirtualFidoDiscoveryFactory::CreateAuthenticator( + device::ProtocolVersion protocol, + device::FidoTransportProtocol transport, + device::AuthenticatorAttachment attachment, + bool has_resident_key, + bool has_user_verification) { + auto authenticator = std::make_unique<VirtualAuthenticator>( + protocol, transport, attachment, has_resident_key, has_user_verification); + auto* authenticator_ptr = authenticator.get(); + authenticators_.emplace(authenticator_ptr->unique_id(), + std::move(authenticator)); + + for (auto* discovery : discoveries_) { + if (discovery->transport() != authenticator_ptr->transport()) + continue; + discovery->AddVirtualDevice(authenticator_ptr->ConstructDevice()); + } + return authenticator_ptr; +} + +bool VirtualFidoDiscoveryFactory::RemoveAuthenticator(const std::string& id) { + const bool removed = authenticators_.erase(id); + if (removed) { + for (auto* discovery : discoveries_) + discovery->RemoveVirtualDevice(id); + } + + return removed; +} + void VirtualFidoDiscoveryFactory::AddBinding( blink::test::mojom::VirtualAuthenticatorManagerRequest request) { bindings_.AddBinding(this, std::move(request)); @@ -48,20 +78,21 @@ ::service_manager::Connector* connector) { auto discovery = std::make_unique<VirtualFidoDiscovery>(transport); - if (bindings_.empty()) { - // If no bindings are active then create a virtual device. This is useful - // for web-platform tests which assume that they can make webauthn calls, - // but which don't implement the Chromium-specific mock Mojo interfaces. - device::VirtualCtap2Device::Config default_config; - auto device = std::make_unique<device::VirtualCtap2Device>( - virtual_device_state_, default_config); - discovery->AddVirtualDevice(std::move(device)); - } else { - for (auto& authenticator : authenticators_) { - if (discovery->transport() != authenticator.second->transport()) - continue; - discovery->AddVirtualDevice(authenticator.second->ConstructDevice()); - } + if (bindings_.empty() && authenticators_.empty()) { + // If no bindings are active then create a virtual device. This is a + // stop-gap measure for web-platform tests which assume that they can make + // webauthn calls until the WebAuthn Testing API is released. + CreateAuthenticator( + ::device::ProtocolVersion::kCtap2, + ::device::FidoTransportProtocol::kUsbHumanInterfaceDevice, + ::device::AuthenticatorAttachment::kCrossPlatform, + false /* has_resident_key */, false /* has_user_verification */); + } + + for (auto& authenticator : authenticators_) { + if (discovery->transport() != authenticator.second->transport()) + continue; + discovery->AddVirtualDevice(authenticator.second->ConstructDevice()); } discoveries_.insert(discovery.get()); @@ -78,22 +109,13 @@ void VirtualFidoDiscoveryFactory::CreateAuthenticator( blink::test::mojom::VirtualAuthenticatorOptionsPtr options, CreateAuthenticatorCallback callback) { - auto authenticator = std::make_unique<VirtualAuthenticator>( + auto* authenticator = CreateAuthenticator( mojo::ConvertTo<::device::ProtocolVersion>(options->protocol), mojo::ConvertTo<::device::FidoTransportProtocol>(options->transport), mojo::ConvertTo<::device::AuthenticatorAttachment>(options->attachment), options->has_resident_key, options->has_user_verification); - auto* authenticator_ptr = authenticator.get(); - authenticators_.emplace(authenticator_ptr->unique_id(), - std::move(authenticator)); - for (auto* discovery : discoveries_) { - if (discovery->transport() != authenticator_ptr->transport()) - continue; - discovery->AddVirtualDevice(authenticator_ptr->ConstructDevice()); - } - - std::move(callback).Run(GetMojoPtrToVirtualAuthenticator(authenticator_ptr)); + std::move(callback).Run(GetMojoPtrToVirtualAuthenticator(authenticator)); } void VirtualFidoDiscoveryFactory::GetAuthenticators( @@ -112,13 +134,7 @@ void VirtualFidoDiscoveryFactory::RemoveAuthenticator( const std::string& id, RemoveAuthenticatorCallback callback) { - const bool removed = authenticators_.erase(id); - if (removed) { - for (auto* discovery : discoveries_) - discovery->RemoveVirtualDevice(id); - } - - std::move(callback).Run(removed); + std::move(callback).Run(RemoveAuthenticator(id)); } void VirtualFidoDiscoveryFactory::ClearAuthenticators(
diff --git a/content/browser/webauth/virtual_fido_discovery_factory.h b/content/browser/webauth/virtual_fido_discovery_factory.h index 8c22c535..832ddd6 100644 --- a/content/browser/webauth/virtual_fido_discovery_factory.h +++ b/content/browser/webauth/virtual_fido_discovery_factory.h
@@ -37,6 +37,19 @@ VirtualFidoDiscoveryFactory(); ~VirtualFidoDiscoveryFactory() override; + // Create an authenticator that will generate virtual devices for the given + // parameters. + VirtualAuthenticator* CreateAuthenticator( + device::ProtocolVersion protocol, + device::FidoTransportProtocol transport, + device::AuthenticatorAttachment attachment, + bool has_resident_key, + bool has_user_verification); + + // Removes the authenticator with the given |id|. Returns true if an + // authenticator matched the |id|, false otherwise. + bool RemoveAuthenticator(const std::string& id); + void AddBinding( blink::test::mojom::VirtualAuthenticatorManagerRequest request);
diff --git a/content/public/browser/origin_policy_commands.h b/content/public/browser/origin_policy_commands.h index 7533193..358f1f7 100644 --- a/content/public/browser/origin_policy_commands.h +++ b/content/public/browser/origin_policy_commands.h
@@ -11,14 +11,11 @@ namespace content { -class BrowserContext; - // Instruct the Origin Policy throttle to disregard errors for the given URL. // // Intended use: This should be called by the browser when the user selects // "proceed" on the security interstitial page for the given URL. -CONTENT_EXPORT void OriginPolicyAddExceptionFor(BrowserContext* browser_context, - const GURL& url); +CONTENT_EXPORT void OriginPolicyAddExceptionFor(const GURL& url); } // namespace content
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index d4ce9482..9c9e8c96 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -439,7 +439,7 @@ ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface( mojom::kNetworkServiceName, &network_service_test); - base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed}; network_service_test.set_connection_error_handler(run_loop.QuitClosure()); network_service_test->SimulateCrash(); @@ -631,12 +631,10 @@ ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface( mojom::kNetworkServiceName, &network_service_test); - // Allow nested tasks so that the mojo reply is dispatched. - base::MessageLoopCurrent::ScopedNestableTaskAllower allow; // Send the DNS rules to network service process. Android needs the RunLoop // to dispatch a Java callback that makes network process to enter native // code. - base::RunLoop loop; + base::RunLoop loop{base::RunLoop::Type::kNestableTasksAllowed}; network_service_test->AddRules(std::move(mojo_rules), loop.QuitClosure()); loop.Run(); }
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 823024d2..2d34e18 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -1844,7 +1844,7 @@ void WaitForInterstitialAttach(content::WebContents* web_contents) { if (web_contents->ShowingInterstitialPage()) return; - base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed}; InterstitialObserver observer(web_contents, run_loop.QuitClosure(), base::OnceClosure()); run_loop.Run(); @@ -2246,7 +2246,7 @@ DCHECK(message); if (!renderer_crashed_ && message_queue_.empty()) { // This will be quit when a new message comes in. - base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed}; quit_closure_ = run_loop.QuitClosure(); run_loop.Run(); } @@ -2423,7 +2423,7 @@ } void RenderFrameSubmissionObserver::Wait() { - base::RunLoop run_loop; + base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed}; quit_closure_ = run_loop.QuitClosure(); run_loop.Run(); }
diff --git a/content/public/test/frame_load_waiter.h b/content/public/test/frame_load_waiter.h index e9fcb3e2..46af120 100644 --- a/content/public/test/frame_load_waiter.h +++ b/content/public/test/frame_load_waiter.h
@@ -28,7 +28,7 @@ void DidFinishLoad() override; void OnDestruct() override; - base::RunLoop run_loop_; + base::RunLoop run_loop_{base::RunLoop::Type::kNestableTasksAllowed}; bool did_load_ = false; DISALLOW_COPY_AND_ASSIGN(FrameLoadWaiter);
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc index 44c5f66..11ded7d 100644 --- a/content/renderer/pepper/pepper_video_decoder_host.cc +++ b/content/renderer/pepper/pepper_video_decoder_host.cc
@@ -22,6 +22,7 @@ #include "media/base/media_util.h" #include "media/gpu/ipc/client/gpu_video_decode_accelerator_host.h" #include "media/video/video_decode_accelerator.h" +#include "mojo/public/cpp/base/shared_memory_utils.h" #include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/pp_errors.h" #include "ppapi/host/dispatch_host_message.h" @@ -87,6 +88,17 @@ PepperVideoDecoderHost::PendingDecode::~PendingDecode() {} +PepperVideoDecoderHost::MappedBuffer::MappedBuffer( + base::UnsafeSharedMemoryRegion region, + base::WritableSharedMemoryMapping mapping) + : region(std::move(region)), mapping(std::move(mapping)) {} + +PepperVideoDecoderHost::MappedBuffer::~MappedBuffer() {} + +PepperVideoDecoderHost::MappedBuffer::MappedBuffer(MappedBuffer&&) = default; +PepperVideoDecoderHost::MappedBuffer& PepperVideoDecoderHost::MappedBuffer:: +operator=(MappedBuffer&&) = default; + PepperVideoDecoderHost::PepperVideoDecoderHost(RendererPpapiHost* host, PP_Instance instance, PP_Resource resource) @@ -194,26 +206,24 @@ if (shm_id > shm_buffers_.size()) return PP_ERROR_FAILED; // Reject an attempt to reallocate a busy shm buffer. - if (shm_id < shm_buffers_.size() && shm_buffer_busy_[shm_id]) + if (shm_id < shm_buffers_.size() && shm_buffers_[shm_id].busy) return PP_ERROR_FAILED; - content::RenderThread* render_thread = content::RenderThread::Get(); - std::unique_ptr<base::SharedMemory> shm( - render_thread->HostAllocateSharedMemoryBuffer(shm_size)); - if (!shm || !shm->Map(shm_size)) + auto shm = mojo::CreateUnsafeSharedMemoryRegion(shm_size); + auto mapping = shm.Map(); + if (!shm.IsValid() || !mapping.IsValid()) return PP_ERROR_FAILED; - base::SharedMemoryHandle shm_handle = shm->handle(); - if (shm_id == shm_buffers_.size()) { - shm_buffers_.push_back(std::move(shm)); - shm_buffer_busy_.push_back(false); - } else { - shm_buffers_[shm_id] = std::move(shm); - } - SerializedHandle handle( - renderer_ppapi_host_->ShareSharedMemoryHandleWithRemote(shm_handle), - shm_size); + base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( + renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(shm))); + if (shm_id == shm_buffers_.size()) { + shm_buffers_.emplace_back(std::move(shm), std::move(mapping)); + } else { + // Note by the check above this buffer cannot be busy. + shm_buffers_[shm_id] = MappedBuffer(std::move(shm), std::move(mapping)); + } + ppapi::host::ReplyMessageContext reply_context = context->MakeReplyMessageContext(); reply_context.params.AppendHandle(std::move(handle)); @@ -235,7 +245,7 @@ if (static_cast<size_t>(shm_id) >= shm_buffers_.size()) return PP_ERROR_FAILED; // Reject an attempt to pass a busy buffer to the decoder again. - if (shm_buffer_busy_[shm_id]) + if (shm_buffers_[shm_id].busy) return PP_ERROR_FAILED; // Reject non-unique decode_id values. if (GetPendingDecodeById(decode_id) != pending_decodes_.end()) @@ -247,12 +257,12 @@ pending_decodes_.push_back(PendingDecode(decode_id, shm_id, size, context->MakeReplyMessageContext())); - shm_buffer_busy_[shm_id] = true; - // TODO(crbug.com/844456): The decode buffer should probably be read-only, but - // then shm_buffers_ will need to be refactored to use a - // ReadOnlySharedMemoryRegion with an associated writable mapping. + shm_buffers_[shm_id].busy = true; decoder_->Decode(media::BitstreamBuffer( - decode_id, shm_buffers_[shm_id]->handle(), false /* read_only */, size)); + decode_id, + base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( + shm_buffers_[shm_id].region.Duplicate()), + size)); return PP_OK_COMPLETIONPENDING; } @@ -443,7 +453,7 @@ } host()->SendReply(it->reply_context, PpapiPluginMsg_VideoDecoder_DecodeReply(it->shm_id)); - shm_buffer_busy_[it->shm_id] = false; + shm_buffers_[it->shm_id].busy = false; pending_decodes_.erase(it); } @@ -492,7 +502,7 @@ PendingDecodeList::const_iterator it = GetPendingDecodeById(decode_id); DCHECK(it != pending_decodes_.end()); uint32_t shm_id = it->shm_id; - return static_cast<uint8_t*>(shm_buffers_[shm_id]->memory()); + return static_cast<uint8_t*>(shm_buffers_[shm_id].mapping.memory()); } bool PepperVideoDecoderHost::TryFallbackToSoftwareDecoder() { @@ -538,8 +548,8 @@ const PendingDecode& decode = pending_decodes_.front(); host()->SendReply(decode.reply_context, PpapiPluginMsg_VideoDecoder_DecodeReply(decode.shm_id)); - DCHECK(shm_buffer_busy_[decode.shm_id]); - shm_buffer_busy_[decode.shm_id] = false; + DCHECK(shm_buffers_[decode.shm_id].busy); + shm_buffers_[decode.shm_id].busy = false; pending_decodes_.pop_front(); } NotifyResetDone(); @@ -547,12 +557,12 @@ // Resubmit all pending decodes. for (const PendingDecode& decode : pending_decodes_) { - DCHECK(shm_buffer_busy_[decode.shm_id]); - // TODO(crbug.com/844456): As with OnHostMsgDecode, the decode buffer should - // probably be read-only (see the todo there for more details). + DCHECK(shm_buffers_[decode.shm_id].busy); decoder_->Decode(media::BitstreamBuffer( - decode.decode_id, shm_buffers_[decode.shm_id]->handle(), - false /* read_only */, decode.size)); + decode.decode_id, + base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( + shm_buffers_[decode.shm_id].region.Duplicate()), + decode.size)); } // Flush the new decoder if Flush() was pending.
diff --git a/content/renderer/pepper/pepper_video_decoder_host.h b/content/renderer/pepper/pepper_video_decoder_host.h index 26d802f..b7f3d87 100644 --- a/content/renderer/pepper/pepper_video_decoder_host.h +++ b/content/renderer/pepper/pepper_video_decoder_host.h
@@ -22,10 +22,6 @@ #include "ppapi/host/resource_host.h" #include "ppapi/proxy/resource_message_params.h" -namespace base { -class SharedMemory; -} - namespace content { class RendererPpapiHost; @@ -61,6 +57,19 @@ }; typedef std::list<PendingDecode> PendingDecodeList; + struct MappedBuffer { + MappedBuffer(base::UnsafeSharedMemoryRegion region, + base::WritableSharedMemoryMapping mapping); + ~MappedBuffer(); + + MappedBuffer(MappedBuffer&&); + MappedBuffer& operator=(MappedBuffer&&); + + base::UnsafeSharedMemoryRegion region; + base::WritableSharedMemoryMapping mapping; + bool busy = false; + }; + friend class VideoDecoderShim; // ResourceHost implementation. @@ -137,10 +146,13 @@ // resource. We use a buffer's index in these vectors as its id on both sides // of the proxy. Only add buffers or update them in place so as not to // invalidate these ids. - std::vector<std::unique_ptr<base::SharedMemory>> shm_buffers_; - // A vector of true/false indicating if a shm buffer is in use by the decoder. - // This is parallel to |shm_buffers_|. - std::vector<uint8_t> shm_buffer_busy_; + // + // These regions are created here, in the host, and shared with the other side + // of the proxy who will write into them. While they are only used in a + // read-only way in the host, using a ReadOnlySharedMemoryRegion would involve + // an extra round-trip to allow the other side of the proxy to map the region + // writable before sending a read-only region back to the host. + std::vector<MappedBuffer> shm_buffers_; uint32_t min_picture_count_; typedef std::map<uint32_t, PictureBufferState> PictureBufferMap;
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 2a006f4..ef9675c 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -859,6 +859,7 @@ void GetCredentialManager( blink::mojom::CredentialManagerRequest request) override {} void GetAuthenticator(blink::mojom::AuthenticatorRequest request) override {} + void GetPushMessaging(blink::mojom::PushMessagingRequest request) override {} void GetVirtualAuthenticatorManager( blink::test::mojom::VirtualAuthenticatorManagerRequest request) override { }
diff --git a/content/renderer/resource_timing_info_conversions.cc b/content/renderer/resource_timing_info_conversions.cc index fa5c48d..b6cf507 100644 --- a/content/renderer/resource_timing_info_conversions.cc +++ b/content/renderer/resource_timing_info_conversions.cc
@@ -116,6 +116,9 @@ info.decoded_body_size = resource_timing.decoded_body_size; info.did_reuse_connection = resource_timing.did_reuse_connection; + // TODO(https://crbug.com/970242): This may result in errounous reporting of + // iframes with different schemes than its parent frame. + info.is_secure_context = false; info.allow_timing_details = resource_timing.allow_timing_details; info.allow_redirect_details = resource_timing.allow_redirect_details;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index f14ca1b..318394f4 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1441,6 +1441,7 @@ "../browser/bluetooth/bluetooth_device_chooser_controller_unittest.cc", "../browser/bluetooth/bluetooth_util_unittest.cc", "../browser/bluetooth/frame_connected_bluetooth_devices_unittest.cc", + "../browser/bluetooth/web_bluetooth_service_impl_unittest.cc", "../browser/browser_associated_interface_unittest.cc", "../browser/browser_main_loop_unittest.cc", "../browser/browser_thread_unittest.cc",
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt index f2378955..602cd91 100644 --- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -34,3 +34,4 @@ # Flaky for unknown reason. crbug.com/960007 [ win10 nvidia ] OverlayModeTraceTest_DirectComposition_Nonroot [ RetryOnFailure ] crbug.com/965730 [ android qualcomm-adreno-(tm)-418 ] TraceTest_Video_Context_Loss_VP9 [ Skip ] +crbug.com/969117 [ win10 intel ] OverlayModeTraceTest_DirectComposition_Video_MP4_FourColors_Aspect_4x3 [ RetryOnFailure ]
diff --git a/dbus/bus.cc b/dbus/bus.cc index d16bdc3..858fb04 100644 --- a/dbus/bus.cc +++ b/dbus/bus.cc
@@ -976,7 +976,7 @@ // Check if the callback has already been added. std::vector<GetServiceOwnerCallback>& callbacks = it->second; for (size_t i = 0; i < callbacks.size(); ++i) { - if (callbacks[i].Equals(callback)) + if (callbacks[i] == callback) return; } callbacks.push_back(callback); @@ -1008,7 +1008,7 @@ std::vector<GetServiceOwnerCallback>& callbacks = it->second; for (size_t i = 0; i < callbacks.size(); ++i) { - if (callbacks[i].Equals(callback)) { + if (callbacks[i] == callback) { callbacks.erase(callbacks.begin() + i); break; // There can be only one. }
diff --git a/device/fido/virtual_fido_device.cc b/device/fido/virtual_fido_device.cc index 81c1b45..037fd63 100644 --- a/device/fido/virtual_fido_device.cc +++ b/device/fido/virtual_fido_device.cc
@@ -150,11 +150,27 @@ // https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-authenticator-transports-extension-v1.2-ps-20170411.html#fido-u2f-certificate-transports-extension static constexpr uint8_t kTransportTypesOID[] = { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0xe5, 0x1c, 0x02, 0x01, 0x01}; - static constexpr uint8_t kTransportTypesContents[] = { - 3, // BIT STRING - 2, // two bytes long - 4, // four trailing bits unused - 0b00110000, // USB + NFC asserted + uint8_t transport_bit; + switch (DeviceTransport()) { + case FidoTransportProtocol::kBluetoothLowEnergy: + case FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy: + transport_bit = 1; + break; + case FidoTransportProtocol::kUsbHumanInterfaceDevice: + transport_bit = 2; + break; + case FidoTransportProtocol::kNearFieldCommunication: + transport_bit = 3; + break; + case FidoTransportProtocol::kInternal: + transport_bit = 4; + break; + } + const uint8_t kTransportTypesContents[] = { + 3, // BIT STRING + 2, // two bytes long + 8 - transport_bit - 1, // trailing bits unused + 0b10000000 >> transport_bit, // transport }; const std::vector<net::x509_util::Extension> extensions = { {kTransportTypesOID, false /* not critical */, kTransportTypesContents},
diff --git a/device/vr/test/test_hook.h b/device/vr/test/test_hook.h index ff078e5..e98bdb61 100644 --- a/device/vr/test/test_hook.h +++ b/device/vr/test/test_hook.h
@@ -6,6 +6,7 @@ #define DEVICE_VR_TEST_TEST_HOOK_H_ #include "base/logging.h" +#include "ui/gfx/transform.h" #include <cstdint> @@ -120,6 +121,18 @@ bool is_valid = false; }; +inline gfx::Transform PoseFrameDataToTransform(PoseFrameData data) { + // The gfx::Transform constructor takes arguments in row-major order, but + // we're given data in column-major order. Construct in column-major order and + // transpose since it looks cleaner than manually transposing the arguments + // passed to the constructor. + float* t = data.device_to_origin; + gfx::Transform transform(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], + t[9], t[10], t[11], t[12], t[13], t[14], t[15]); + transform.Transpose(); + return transform; +} + // Tests may implement this, and register it to control behavior of VR runtime. class VRTestHook { public:
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.cc b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.cc index 955b38be..6870e84b 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.cc +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.cc
@@ -5,28 +5,40 @@ #include "device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.h" #include "base/logging.h" +#include "device/vr/test/test_hook.h" +#include "ui/gfx/geometry/vector3d_f.h" +#include "ui/gfx/transform_util.h" namespace device { MockWMRInputLocation::MockWMRInputLocation(ControllerFrameData data) - : data_(data) {} + : data_(data) { + DecomposeTransform(&decomposed_device_to_origin_, + PoseFrameDataToTransform(data.pose_data)); +} MockWMRInputLocation::~MockWMRInputLocation() = default; bool MockWMRInputLocation::TryGetPosition( ABI::Windows::Foundation::Numerics::Vector3* position) const { DCHECK(position); - // TODO(https://crbug.com/926048): Properly implement. - position->X = 0; - position->Y = 0; - position->Z = 0; + if (!data_.pose_data.is_valid) + return false; + + position->X = decomposed_device_to_origin_.translate[0]; + position->Y = decomposed_device_to_origin_.translate[1]; + position->Z = decomposed_device_to_origin_.translate[2]; return true; } bool MockWMRInputLocation::TryGetVelocity( ABI::Windows::Foundation::Numerics::Vector3* velocity) const { DCHECK(velocity); - // TODO(https://crbug.com/926048): Properly implement. + if (!data_.pose_data.is_valid) + return false; + // We could potentially store a history of poses and calculate the velocity, + // but that is more complicated and doesn't currently provide any benefit for + // tests. So, just report 0s. velocity->X = 0; velocity->Y = 0; velocity->Z = 0; @@ -36,18 +48,24 @@ bool MockWMRInputLocation::TryGetOrientation( ABI::Windows::Foundation::Numerics::Quaternion* orientation) const { DCHECK(orientation); - // TODO(https://crbug.com/926048): Properly implement. - orientation->X = 0; - orientation->Y = 0; - orientation->Z = 0; - orientation->W = 1; + if (!data_.pose_data.is_valid) + return false; + + orientation->X = decomposed_device_to_origin_.quaternion.x(); + orientation->Y = decomposed_device_to_origin_.quaternion.y(); + orientation->Z = decomposed_device_to_origin_.quaternion.z(); + orientation->W = decomposed_device_to_origin_.quaternion.w(); return true; } bool MockWMRInputLocation::TryGetAngularVelocity( ABI::Windows::Foundation::Numerics::Vector3* angular_velocity) const { DCHECK(angular_velocity); - // TODO(https://crbug.com/926048): Properly implement. + if (!data_.pose_data.is_valid) + return false; + // We could potentially store a history of poses and calculate the angular + // velocity, but that is more complicated and doesn't currently provide any + // benefit for tests. So, just report 0s. angular_velocity->X = 0; angular_velocity->Y = 0; angular_velocity->Z = 0;
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.h b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.h index 69ddd97..fe60e37d 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.h +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.h
@@ -6,6 +6,7 @@ #include "device/vr/test/test_hook.h" #include "device/vr/windows_mixed_reality/wrappers/wmr_input_location.h" +#include "ui/gfx/transform_util.h" namespace device { @@ -25,6 +26,7 @@ private: ControllerFrameData data_; + gfx::DecomposedTransform decomposed_device_to_origin_; }; } // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_source_state.cc b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_source_state.cc index 07feee5b..a410918 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_source_state.cc +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_source_state.cc
@@ -19,7 +19,7 @@ std::unique_ptr<WMRPointerPose> MockWMRInputSourceState::TryGetPointerPose( const WMRCoordinateSystem* origin) const { - return std::make_unique<MockWMRPointerPose>(); + return std::make_unique<MockWMRPointerPose>(data_); } std::unique_ptr<WMRInputSource> MockWMRInputSourceState::GetSource() const {
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.cc b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.cc index c9aacbaa..f132bf3 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.cc +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.cc
@@ -9,18 +9,19 @@ namespace device { -MockWMRPointerPose::MockWMRPointerPose() {} +MockWMRPointerPose::MockWMRPointerPose(ControllerFrameData data) + : data_(data) {} MockWMRPointerPose::~MockWMRPointerPose() = default; bool MockWMRPointerPose::IsValid() const { - return true; + return data_.pose_data.is_valid; } std::unique_ptr<WMRPointerSourcePose> MockWMRPointerPose::TryGetInteractionSourcePose( const WMRInputSource* source) const { - return std::make_unique<MockWMRPointerSourcePose>(); + return std::make_unique<MockWMRPointerSourcePose>(data_); } ABI::Windows::Foundation::Numerics::Vector3 MockWMRPointerPose::HeadForward()
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.h b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.h index d543040..49ac5b0fa 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.h +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_pose.h
@@ -4,13 +4,14 @@ #ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_TEST_MOCK_WMR_POINTER_POSE_H_ #define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_TEST_MOCK_WMR_POINTER_POSE_H_ +#include "device/vr/test/test_hook.h" #include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h" namespace device { class MockWMRPointerPose : public WMRPointerPose { public: - MockWMRPointerPose(); + MockWMRPointerPose(ControllerFrameData data); ~MockWMRPointerPose() override; bool IsValid() const override; @@ -19,6 +20,7 @@ ABI::Windows::Foundation::Numerics::Vector3 HeadForward() const override; private: + ControllerFrameData data_; DISALLOW_COPY(MockWMRPointerPose); };
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.cc b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.cc index 7e5d149..ea8de4d4 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.cc +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.cc
@@ -4,27 +4,36 @@ #include "device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.h" +#include "device/vr/windows_mixed_reality/wrappers/test/mock_wmr_input_location.h" + namespace device { -MockWMRPointerSourcePose::MockWMRPointerSourcePose() {} +MockWMRPointerSourcePose::MockWMRPointerSourcePose(ControllerFrameData data) + : data_(data) {} MockWMRPointerSourcePose::~MockWMRPointerSourcePose() = default; bool MockWMRPointerSourcePose::IsValid() const { - return true; + return data_.pose_data.is_valid; } ABI::Windows::Foundation::Numerics::Vector3 MockWMRPointerSourcePose::Position() const { - // TODO(https://crbug.com/926048): Actually implement. - return {1, 1, 1}; + // Providing the same position and orientation as the controller should be + // valid and make it easy to actually point at things in tests if ever + // necessary. + ABI::Windows::Foundation::Numerics::Vector3 ret; + MockWMRInputLocation loc(data_); + loc.TryGetPosition(&ret); + return ret; } ABI::Windows::Foundation::Numerics::Quaternion MockWMRPointerSourcePose::Orientation() const { - // TODO(https://crbug.com/926048): Actually implement. - // For whatever reason, W is first? - return {1, 0, 0, 0}; + ABI::Windows::Foundation::Numerics::Quaternion ret; + MockWMRInputLocation loc(data_); + loc.TryGetOrientation(&ret); + return ret; } } // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.h b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.h index a63c611c..c9adaf2 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.h +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_pointer_source_pose.h
@@ -4,13 +4,14 @@ #ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_TEST_MOCK_WMR_POINTER_SOURCE_POSE_H_ #define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_TEST_MOCK_WMR_POINTER_SOURCE_POSE_H_ +#include "device/vr/test/test_hook.h" #include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h" namespace device { class MockWMRPointerSourcePose : public WMRPointerSourcePose { public: - MockWMRPointerSourcePose(); + MockWMRPointerSourcePose(ControllerFrameData data); ~MockWMRPointerSourcePose() override; bool IsValid() const override; @@ -18,6 +19,7 @@ ABI::Windows::Foundation::Numerics::Quaternion Orientation() const override; private: + ControllerFrameData data_; DISALLOW_COPY(MockWMRPointerSourcePose); };
diff --git a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_rendering.cc b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_rendering.cc index 0eb3a82..76528e0 100644 --- a/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_rendering.cc +++ b/device/vr/windows_mixed_reality/wrappers/test/mock_wmr_rendering.cc
@@ -128,15 +128,7 @@ // We need to get the inverse of the given transform, as it's the // device-to-origin transform and we need the origin-to-device transform. - float* t = pose_data.device_to_origin; - // The gfx::Transform constructor takes arguments in row-major order, but - // we're given data in column-major order. Construct in column-major order and - // transpose since it looks cleaner than manually transposing the arguments - // passed to the constructor. - gfx::Transform device_to_origin(t[0], t[1], t[2], t[3], t[4], t[5], t[6], - t[7], t[8], t[9], t[10], t[11], t[12], t[13], - t[14], t[15]); - device_to_origin.Transpose(); + gfx::Transform device_to_origin = PoseFrameDataToTransform(pose_data); gfx::Transform origin_to_device = device_to_origin; auto success = origin_to_device.GetInverse(&origin_to_device); DCHECK(success);
diff --git a/extensions/browser/api/virtual_keyboard/OWNERS b/extensions/browser/api/virtual_keyboard/OWNERS index ba5a3bd..ca1e0f59 100644 --- a/extensions/browser/api/virtual_keyboard/OWNERS +++ b/extensions/browser/api/virtual_keyboard/OWNERS
@@ -1,4 +1,4 @@ tbarzic@chromium.org -file://ui/keyboard/OWNERS +file://ash/keyboard/OWNERS # COMPONENT: UI>Input>VirtualKeyboard
diff --git a/extensions/browser/api/virtual_keyboard_private/OWNERS b/extensions/browser/api/virtual_keyboard_private/OWNERS index 4198610..94fbd75 100644 --- a/extensions/browser/api/virtual_keyboard_private/OWNERS +++ b/extensions/browser/api/virtual_keyboard_private/OWNERS
@@ -1,3 +1,3 @@ -file://ui/keyboard/OWNERS +file://ash/keyboard/OWNERS # COMPONENT: UI>Input>VirtualKeyboard
diff --git a/gpu/command_buffer/service/framebuffer_manager.cc b/gpu/command_buffer/service/framebuffer_manager.cc index 03cf41b..30a62773a 100644 --- a/gpu/command_buffer/service/framebuffer_manager.cc +++ b/gpu/command_buffer/service/framebuffer_manager.cc
@@ -386,7 +386,8 @@ draw_buffer_bound_mask_(0u), adjusted_draw_buffer_bound_mask_(0u), last_color_attachment_id_(-1), - read_buffer_(GL_COLOR_ATTACHMENT0) { + read_buffer_(GL_COLOR_ATTACHMENT0), + flip_y_(false) { manager->StartTracking(this); DCHECK_GT(manager->max_draw_buffers_, 0u); draw_buffers_.reset(new GLenum[manager->max_draw_buffers_]);
diff --git a/gpu/command_buffer/service/framebuffer_manager.h b/gpu/command_buffer/service/framebuffer_manager.h index 794df67..1670640 100644 --- a/gpu/command_buffer/service/framebuffer_manager.h +++ b/gpu/command_buffer/service/framebuffer_manager.h
@@ -236,6 +236,9 @@ void UnmarkAsComplete() { framebuffer_complete_state_count_id_ = 0; } + bool GetFlipY() const { return flip_y_; } + void SetFlipY(bool flip_y) { flip_y_ = flip_y; } + private: friend class FramebufferManager; friend class base::RefCounted<Framebuffer>; @@ -315,6 +318,8 @@ GLenum read_buffer_; + bool flip_y_; + DISALLOW_COPY_AND_ASSIGN(Framebuffer); };
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc index cceecc6..d549220 100644 --- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc +++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
@@ -26,6 +26,7 @@ supports_usampler_(true), supports_r8_image_(true), is_gles31_compatible_(false), + flip_y_(false), frame_id_(0), width_(0), height_(0), @@ -226,7 +227,7 @@ GLenum internal_format = attachment->internal_format(); // Resize internal structures - only if needed. - OnSize(width, height); + OnSize(width, height, framebuffer->GetFlipY()); // CMAA internally expects GL_RGBA8 textures. // Process using a GL_RGBA8 copy if this is not the case. @@ -500,14 +501,16 @@ } void ApplyFramebufferAttachmentCMAAINTELResourceManager::OnSize(GLint width, - GLint height) { - if (height_ == height && width_ == width) + GLint height, + bool flip_y) { + if (height_ == height && width_ == width && flip_y_ == flip_y) return; ReleaseTextures(); height_ = height; width_ = width; + flip_y_ = flip_y; glGenTextures(1, &rgba8_texture_); glBindTexture(GL_TEXTURE_2D, rgba8_texture_); @@ -549,6 +552,10 @@ // Create the FBO glGenFramebuffersEXT(1, &cmaa_framebuffer_); glBindFramebufferEXT(GL_FRAMEBUFFER, cmaa_framebuffer_); + if (flip_y_) { + glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, + GL_TRUE); + } // We need to clear the textures before they are first used. // The algorithm self-clears them later.
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h index 33bade3..11ded04 100644 --- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h +++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h
@@ -44,7 +44,7 @@ GLuint dest_texture, bool do_copy); - void OnSize(GLint width, GLint height); + void OnSize(GLint width, GLint height, bool flip_y); void ReleaseTextures(); GLuint CreateProgram(const char* defines, @@ -58,6 +58,7 @@ bool supports_usampler_; bool supports_r8_image_; bool is_gles31_compatible_; + bool flip_y_; int frame_id_;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 16b2185..406678ff 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -8259,12 +8259,19 @@ GLenum pname, GLint param) { const char* func_name = "glFramebufferParameteri"; + DCHECK(pname == GL_FRAMEBUFFER_FLIP_Y_MESA); Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); if (!framebuffer) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, "no framebuffer bound"); return; } + if (param != GL_TRUE && param != GL_FALSE) { + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, + "invalid parameter, only GL_TRUE or GL_FALSE accepted"); + return; + } api()->glFramebufferParameteriFn(target, pname, param); + framebuffer->SetFlipY(param == GL_TRUE); } void GLES2DecoderImpl::DoFramebufferRenderbuffer(
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 208fb4b5..8822580a 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -2274,9 +2274,9 @@ locked_handles_.clear(); // We just flushed a tile's worth of GPU work from the SkSurface in - // flush above. Use kDeferLaterCommands to ensure we yield to - // the Scheduler before processing more commands. - current_decoder_error_ = error::kDeferLaterCommands; + // flush above. Yield to the Scheduler to allow pre-emption before + // processing more commands. + ExitCommandProcessingEarly(); } void RasterDecoderImpl::DoCreateTransferCacheEntryINTERNAL( @@ -2340,6 +2340,12 @@ "Failure to deserialize transfer cache entry."); return; } + + // The only entry using the GrContext are image transfer cache entries for + // image uploads. Since this tends to a slow operation, yield to allow the + // decoder to be pre-empted. + if (context_for_entry) + ExitCommandProcessingEarly(); } void RasterDecoderImpl::DoUnlockTransferCacheEntryINTERNAL(
diff --git a/gpu/command_buffer/service/raster_decoder_unittest.cc b/gpu/command_buffer/service/raster_decoder_unittest.cc index e6caf57..06bb255 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest.cc
@@ -257,13 +257,6 @@ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); } -TEST_P(RasterDecoderTest, YieldAfterEndRasterCHROMIUM) { - GetDecoder()->SetUpForRasterCHROMIUMForTest(); - cmds::EndRasterCHROMIUM end_raster_cmd; - end_raster_cmd.Init(); - EXPECT_EQ(error::kDeferLaterCommands, ExecuteCmd(end_raster_cmd)); -} - class RasterDecoderOOPTest : public testing::Test, DecoderClient { public: void SetUp() override {
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index 6ab0bbb..0148747e 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -416,13 +416,6 @@ } builder_mixins { - name: "chromedriver-ci" - recipe { - properties: "mastername:chromium.chromedriver" - } -} - -builder_mixins { name: "chromeos-ci" # All CrOS building is done via cross-compilation on linux hosts, so use the # linux mixin. @@ -1195,7 +1188,8 @@ builders { name: "android-marshmallow-arm64-rel" mixins: "android-ci" - dimensions: "os:Ubuntu-14.04" + mixins: "builderless" + dimensions: "os:Ubuntu-16.04" } builders { @@ -1406,14 +1400,14 @@ builders { name: "Deterministic Linux" mixins: "deterministic" - mixins: "linux-ci" + mixins: "linux-ci-goma-rbe-prod" mixins: "builderless" } builders { name: "Deterministic Linux (dbg)" mixins: "deterministic" - mixins: "linux-ci" + mixins: "linux-ci-goma-rbe-prod" mixins: "builderless" # This builder does local build, so needs large number of cores. @@ -1564,6 +1558,7 @@ builders { name: "GPU Linux Builder (dbg)" mixins: "linux-gpu-ci" + mixins: "goma-rbe-prod" } builders { @@ -1580,21 +1575,25 @@ builders { name: "GPU FYI Linux Builder" mixins: "linux-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "GPU FYI Linux Builder (dbg)" mixins: "linux-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "GPU FYI Linux Ozone Builder" mixins: "linux-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "GPU FYI Linux dEQP Builder" mixins: "linux-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { @@ -1640,6 +1639,7 @@ builders { name: "Linux FYI GPU TSAN Release" mixins: "linux-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { @@ -1721,6 +1721,7 @@ builders { name: "GPU Mac Builder (dbg)" mixins: "mac-gpu-ci" + mixins: "goma-rbe-prod" } builders { name: "Mac Debug (Intel)" @@ -1735,14 +1736,17 @@ builders { name: "GPU FYI Mac Builder" mixins: "mac-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "GPU FYI Mac Builder (dbg)" mixins: "mac-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "GPU FYI Mac dEQP Builder" mixins: "mac-gpu-fyi-ci" + mixins: "goma-rbe-prod" } # Note that the Mac testers are all thin Linux VMs, triggering jobs on the # physical Mac hardware in the Swarming pool, and therefore use the @@ -1807,6 +1811,7 @@ name: "Mac FYI GPU ASAN Release" # Builder/tester, thus needs Mac (not Linux like testers-only) mixins: "mac-gpu-fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "Mac FYI dEQP Release AMD" @@ -2204,6 +2209,7 @@ builders { name: "Dawn Linux x64 Builder" mixins: "linux-dawn-ci" + mixins: "goma-rbe-prod" } builders { name: "Dawn Linux x64 Release (Intel HD 630)" @@ -2216,6 +2222,7 @@ builders { name: "Dawn Linux x64 DEPS Builder" mixins: "linux-dawn-ci" + mixins: "goma-rbe-prod" } builders { name: "Dawn Linux x64 DEPS Release (Intel HD 630)" @@ -2228,10 +2235,12 @@ builders { name: "Dawn Mac x64 Builder" mixins: "mac-dawn-ci" + mixins: "goma-rbe-prod" } builders { name: "Dawn Mac x64 DEPS Builder" mixins: "mac-dawn-ci" + mixins: "goma-rbe-prod" } # Note that the Mac testers are all thin Linux VMs, triggering jobs on the # physical Mac hardware in the Swarming pool, and therefore use the @@ -2327,11 +2336,6 @@ mixins: "fuzz-ci" } builders { - name: "Win7" - dimensions: "os:Windows-7" - mixins: "chromedriver-ci" - } - builders { name: "TSAN Release" dimensions: "os:Ubuntu-14.04" mixins: "fuzz-ci" @@ -2539,6 +2543,7 @@ dimensions: "cores:" mixins: "fyi-ci" mixins: "deterministic" + mixins: "goma-rbe-prod" } builders { name: "Site Isolation Android" @@ -2572,6 +2577,7 @@ dimensions: "os:Mac-10.13" dimensions: "cores:4" mixins: "fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "Libfuzzer Upload Linux UBSan" @@ -2597,6 +2603,7 @@ dimensions: "cores:" mixins: "fyi-ci" mixins: "deterministic" + mixins: "goma-rbe-prod" } builders { name: "ASAN Release" @@ -2619,6 +2626,7 @@ name: "Closure Compilation Linux" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" + mixins: "goma-rbe-prod" recipe { name: "closure_compilation" } @@ -2691,11 +2699,6 @@ mixins: "libfuzzer" } builders { - name: "Mac 10.6" - dimensions: "os:Mac-10.12.2" - mixins: "chromedriver-ci" - } - builders { name: "Android CFI" dimensions: "os:Ubuntu-14.04" dimensions: "cores:32" @@ -2740,6 +2743,7 @@ name: "Linux remote_run Builder" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "Win ASan Release Media" @@ -2781,8 +2785,7 @@ } builders { name: "ios-device-goma-canary-clobber" - dimensions: "os:Mac" - dimensions: "cores:4" + mixins: "ios" mixins: "fyi-ci" recipe { name: "ios/unified_builder_tester" @@ -2814,6 +2817,7 @@ name: "Linux Viz" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "Linux ARM" @@ -2822,14 +2826,10 @@ mixins: "goma-rbe-prod-ats" } builders { - name: "Linux" - dimensions: "os:Ubuntu-14.04" - mixins: "chromedriver-ci" - } - builders { name: "Jumbo Linux x64" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" + mixins: "goma-rbe-prod" } builders { name: "Mojo Android" @@ -3255,8 +3255,7 @@ } builders { name: "ios-device-goma-latest-clobber" - dimensions: "os:Mac" - dimensions: "cores:4" + mixins: "ios" mixins: "fyi-ci" recipe { name: "ios/unified_builder_tester" @@ -3471,10 +3470,11 @@ dimensions: "os:Ubuntu-16.04" } builders { - mixins: "android-try" - mixins: "goma-j300" name: "android-marshmallow-arm64-rel" - dimensions: "os:Ubuntu-14.04" + mixins: "android-try" + mixins: "builderless" + mixins: "goma-j300" + dimensions: "os:Ubuntu-16.04" dimensions: "cores:16" } builders { @@ -3699,6 +3699,7 @@ } builders { mixins: "linux-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-fyi-try-linux-nvidia-tsn" } builders { @@ -3711,9 +3712,18 @@ name: "leak_detection_linux" } builders { mixins: "linux-angle-try" name: "fuchsia-angle-rel" } - builders { mixins: "linux-angle-try" name: "linux-angle-rel" } - builders { mixins: "linux-angle-try" name: "linux_angle_deqp_rel_ng" } - builders { mixins: "linux-angle-try" name: "linux_angle_ozone_rel_ng" } + builders { + mixins: "linux-angle-try" + name: "linux-angle-rel" + } + builders { + mixins: "linux-angle-try" + name: "linux_angle_deqp_rel_ng" + } + builders { + mixins: "linux-angle-try" + name: "linux_angle_ozone_rel_ng" + } builders { mixins: "builderless" mixins: "linux-try" @@ -3743,7 +3753,7 @@ builders { mixins: "linux-try" mixins: "goma-rbe-prod" - name: "linux-trusty-webkit-msan-rel" + name: "linux-webkit-msan-rel" } builders { mixins: "linux-try" @@ -3822,7 +3832,11 @@ name: "linux_chromium_tsan_rel_ng" } builders { mixins: "linux-try" name: "linux_chromium_ubsan_rel_ng" } - builders { mixins: "linux-dawn-try" name: "linux-dawn-rel" } + builders { + mixins: "linux-dawn-try" + mixins: "goma-rbe-prod" + name: "linux-dawn-rel" + } builders { mixins: "linux-try" name: "linux_layout_tests_composite_after_paint" } builders { mixins: "linux-try" name: "linux_layout_tests_layout_ng" } builders { @@ -3850,9 +3864,14 @@ builders { mixins: "ios-try" name: "ios-simulator-eg" } builders { mixins: "ios-try" name: "ios-simulator-xcode-clang" } builders { mixins: "ios-try" name: "ios-slimnav" } - builders { mixins: "mac-dawn-try" name: "dawn-mac-x64-deps-rel" } + builders { + mixins: "mac-dawn-try" + mixins: "goma-rbe-prod" + name: "dawn-mac-x64-deps-rel" + } builders { mixins: "mac-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-fyi-try-mac-amd-dqp" } builders { @@ -3861,6 +3880,7 @@ } builders { mixins: "mac-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-fyi-try-mac-amd-retina-dbg" } builders { @@ -3873,15 +3893,18 @@ } builders { mixins: "mac-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-fyi-try-mac-asan" } builders { mixins: "mac-optional-gpu-try" name: "gpu-fyi-try-mac-intel-dbg" + mixins: "goma-rbe-prod" } builders { mixins: "mac-optional-gpu-try" name: "gpu-fyi-try-mac-intel-dqp" + mixins: "goma-rbe-prod" } builders { mixins: "mac-optional-gpu-try" @@ -3893,6 +3916,7 @@ } builders { mixins: "mac-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-fyi-try-mac-nvidia-retina-dbg" } builders { @@ -3909,13 +3933,19 @@ } builders { mixins: "mac-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-try-mac-amd-retina-dbg" } builders { mixins: "mac-optional-gpu-try" + mixins: "goma-rbe-prod" name: "gpu-try-mac-intel-dbg" } - builders { mixins: "mac-angle-try" name: "mac-angle-rel" } + builders { + mixins: "mac-angle-try" + mixins: "goma-rbe-prod" + name: "mac-angle-rel" + } builders { mixins: "mac-try" name: "mac-jumbo-rel" @@ -3950,7 +3980,11 @@ mixins: "goma-j150" name: "mac-rel" } - builders { mixins: "mac-dawn-try" name: "mac-dawn-rel" } + builders { + mixins: "mac-dawn-try" + mixins: "goma-rbe-prod" + name: "mac-dawn-rel" + } builders { mixins: "mac-optional-gpu-try" name: "mac_optional_gpu_tests_rel"
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg index dc391cd..bba9264 100644 --- a/infra/config/luci-milo.cfg +++ b/infra/config/luci-milo.cfg
@@ -130,11 +130,6 @@ alt: "Chromium Android console" } links { - text: "chromedriver" - url: "/p/chromium/g/chromium.chromedriver" - alt: "Chromium Chromedriver console" - } - links { text: "dawn" url: "/p/chromium/g/chromium.dawn" alt: "Chromium Dawn console" @@ -1617,30 +1612,6 @@ consoles { header_id: "chromium" - id: "chromium.chromedriver" - name: "chromium.chromedriver" - repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "refs/heads/master" - manifest_name: "REVISION" - builders { - name: "buildbot/chromium.chromedriver/Linux" - name: "buildbucket/luci.chromium.ci/Linux" - } - builders { - name: "buildbucket/luci.chromium.ci/Linux32" - } - builders { - name: "buildbot/chromium.chromedriver/Mac 10.6" - name: "buildbucket/luci.chromium.ci/Mac 10.6" - } - builders { - name: "buildbot/chromium.chromedriver/Win7" - name: "buildbucket/luci.chromium.ci/Win7" - } -} - -consoles { - header_id: "chromium" id: "chromium.clang" name: "chromium.clang" repo_url: "https://chromium.googlesource.com/chromium/src" @@ -2900,6 +2871,120 @@ category: "week2c|android|dbg|webview" short_name: "o net" } + builders { + name: "buildbucket/luci.chromium.ci/Dawn Linux x64 Builder" + category: "week2d|linux|dawn" + } + builders { + name: "buildbucket/luci.chromium.ci/Dawn Linux x64 DEPS Builder" + category: "week2d|linux|dawn" + short_name: "deps" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Linux Builder" + category: "week2d|linux|gpu|fyi" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Linux Builder (dbg)" + category: "week2d|linux|gpu|fyi" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Linux Ozone Builder" + category: "week2d|linux|gpu|fyi" + short_name: "ozone" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Linux eDQP Builder" + category: "week2d|linux|gpu|fyi" + short_name: "edqp" + } + builders { + name: "buildbucket/luci.chromium.ci/Linux FYI GPU TSAN Release" + category: "week2d|linux|gpu|fyi" + short_name: "tsan" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU Linux Builder (dbg)" + category: "week2d|linux|gpu" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/Linux Viz" + category: "week2d|linux" + short_name: "viz" + } + builders { + name: "buildbucket/luci.chromium.ci/Linux remote_run Builder" + category: "week2d|linux" + short_name: "rem" + } + builders { + name: "buildbucket/luci.chromium.ci/Closure Compilation Linux" + category: "week2d|linux" + short_name: "clsr" + } + builders { + name: "buildbucket/luci.chromium.ci/Deterministic Linux" + category: "week2d|linux|det" + } + builders { + name: "buildbucket/luci.chromium.ci/Deterministic Linux (dbg)" + category: "week2d|linux|det" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/Jumbo Linux x64" + category: "week2d|linux" + short_name: "jumbo" + } + builders { + name: "buildbucket/luci.chromium.ci/Dawn Mac x64 Builder" + category: "week2d|mac|dawn" + } + builders { + name: "buildbucket/luci.chromium.ci/Dawn Mac x64 DEPS Builder" + category: "week2d|mac|dawn" + short_name: "deps" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Mac Builder" + category: "week2d|mac|gpu|fyi" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Mac Builder (dbg)" + category: "week2d|mac|gpu|fyi" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Mac eDQP Builder" + category: "week2d|mac|gpu|fyi" + short_name: "edqp" + } + builders { + name: "buildbucket/luci.chromium.ci/Mac FYI GPU ASAN Release" + category: "week2d|mac|gpu|fyi" + short_name: "asan" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU Mac Builder (dbg)" + category: "week2d|mac|gpu" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/Mac Deterministic" + category: "week2d|mac|det" + } + builders { + name: "buildbucket/luci.chromium.ci/Mac Deterministic (dbg)" + category: "week2d|mac|det" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/Jumbo Mac" + category: "week2d|mac" + short_name: "jumbo" + } } consoles { @@ -3482,45 +3567,6 @@ consoles { header_id: "chromium" - id: "chromium.tools.build" - name: "chromium.tools.build" - repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "refs/heads/master" - manifest_name: "REVISION" - builders { - name: "buildbot/chromium.tools.build/build-repo-real-try_mac" - name: "buildbucket/luci.chromium.ci/build-repo-real-try_mac" - category: "real-try" - } - builders { - name: "buildbot/chromium.tools.build/build-repo-real-try_trusty64" - name: "buildbucket/luci.chromium.ci/build-repo-real-try_trusty64" - category: "real-try" - } - builders { - name: "buildbot/chromium.tools.build/build-repo-real-try_win64" - name: "buildbucket/luci.chromium.ci/build-repo-real-try_win64" - category: "real-try" - } - builders { - name: "buildbot/chromium.tools.build/recipe-simulation_mac" - name: "buildbucket/luci.chromium.ci/recipe-simulation_mac" - category: "simulation" - } - builders { - name: "buildbot/chromium.tools.build/recipe-simulation_trusty64" - name: "buildbucket/luci.chromium.ci/recipe-simulation_trusty64" - category: "simulation" - } - builders { - name: "buildbot/chromium.tools.build/v8-linux-end-to-end" - name: "buildbucket/luci.chromium.ci/v8-linux-end-to-end" - category: "v8" - } -} - -consoles { - header_id: "chromium" id: "chromium.webrtc" name: "chromium.webrtc" repo_url: "https://chromium.googlesource.com/chromium/src"
diff --git a/infra/config/luci-scheduler.cfg b/infra/config/luci-scheduler.cfg index 9ff02b0..e0c9bfc 100644 --- a/infra/config/luci-scheduler.cfg +++ b/infra/config/luci-scheduler.cfg
@@ -3589,16 +3589,6 @@ } job { - id: "Linux" - acl_sets: "default" - buildbucket: { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Linux" - } -} - -job { id: "Linux ARM" acl_sets: "default" buildbucket: { @@ -3819,16 +3809,6 @@ } job { - id: "Mac 10.6" - acl_sets: "default" - buildbucket: { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Mac 10.6" - } -} - -job { id: "Mac ASAN Release" acl_sets: "default" buildbucket: { @@ -4359,16 +4339,6 @@ } job { - id: "Win7" - acl_sets: "default" - buildbucket: { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Win7" - } -} - -job { id: "Win7 Builder (dbg) Goma Canary" acl_sets: "default" buildbucket: {
diff --git a/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json b/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json index 66acc6a1..19951f2 100644 --- a/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json +++ b/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
@@ -2,7 +2,7 @@ "comments": [ "Runs tests on 64-bit iOS 11.4 and 12.1 and 13.0 tests" ], - "xcode build version": "10e125", + "xcode build version": "11m336w", "gn_args": [ "goma_dir=\"$(goma_dir)\"", "is_component_build=false", @@ -22,7 +22,7 @@ "xcode parallelization": true, "include": "eg2_tests.json", "device type": "iPhone X", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -35,7 +35,7 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone 6s Plus", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -48,7 +48,7 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone 6s", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -61,7 +61,7 @@ { "include": "common_tests.json", "device type": "iPhone 6s", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -74,7 +74,7 @@ { "include": "eg_tests.json", "device type": "iPhone 7", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -87,7 +87,7 @@ { "include": "eg_tests.json", "device type": "iPad Air 2", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -100,7 +100,7 @@ { "include": "eg_tests.json", "device type": "iPhone X", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -113,7 +113,7 @@ { "include": "eg_cq_tests.json", "device type": "iPhone X", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -126,7 +126,7 @@ { "include": "eg_cq_tests.json", "device type": "iPad Air 2", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": {
diff --git a/ios/build/bots/chromium.mac/ios13-sdk-simulator.json b/ios/build/bots/chromium.mac/ios13-sdk-simulator.json index 66acc6a1..19951f2 100644 --- a/ios/build/bots/chromium.mac/ios13-sdk-simulator.json +++ b/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
@@ -2,7 +2,7 @@ "comments": [ "Runs tests on 64-bit iOS 11.4 and 12.1 and 13.0 tests" ], - "xcode build version": "10e125", + "xcode build version": "11m336w", "gn_args": [ "goma_dir=\"$(goma_dir)\"", "is_component_build=false", @@ -22,7 +22,7 @@ "xcode parallelization": true, "include": "eg2_tests.json", "device type": "iPhone X", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -35,7 +35,7 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone 6s Plus", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -48,7 +48,7 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone 6s", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -61,7 +61,7 @@ { "include": "common_tests.json", "device type": "iPhone 6s", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -74,7 +74,7 @@ { "include": "eg_tests.json", "device type": "iPhone 7", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -87,7 +87,7 @@ { "include": "eg_tests.json", "device type": "iPad Air 2", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -100,7 +100,7 @@ { "include": "eg_tests.json", "device type": "iPhone X", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -113,7 +113,7 @@ { "include": "eg_cq_tests.json", "device type": "iPhone X", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": { @@ -126,7 +126,7 @@ { "include": "eg_cq_tests.json", "device type": "iPad Air 2", - "os": "12.2", + "os": "13.0", "pool":"Chrome", "host os": "Mac-10.14.3", "optional_dimensions": {
diff --git a/ios/build/bots/tests/eg_tests.json b/ios/build/bots/tests/eg_tests.json index 4563ca0d..565bc49 100644 --- a/ios/build/bots/tests/eg_tests.json +++ b/ios/build/bots/tests/eg_tests.json
@@ -34,10 +34,6 @@ "app": "ios_showcase_egtests", "xctest": true, "xcode parallelization": true - }, - { - "app": "ios_chrome_unified_consent_egtests", - "xctest": true } ] }
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index cd27b6bd..546643b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -499,7 +499,7 @@ <translation id="8532105204136943229">గడువు ముగింపు సంవత్సరం</translation> <translation id="8534481786647257214">Google+ పోస్ట్ పూర్తయింది.</translation> <translation id="8548878600947630424">పేజీలో కనుగొను...</translation> -<translation id="8583866649835978847"><ph name="TITLE" />ను మీ పరికరాలలో ఒకదానికి పంపించండి.</translation> +<translation id="8583866649835978847"><ph name="TITLE" />ను మీ పరికరాలలో ఒక దానికి పంపించండి.</translation> <translation id="8605219856220328675">ట్యాబ్ను మూసివేయండి.</translation> <translation id="8620640915598389714">సవరించు</translation> <translation id="8636825310635137004">మీ ఇతర పరికరాల నుండి మీ ట్యాబ్లను పొందడానికి, సమకాలీకరణను ఆన్ చేయండి</translation>
diff --git a/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm b/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm index 64b37b44..871b5b1 100644 --- a/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm +++ b/ios/chrome/browser/ui/alert_view_controller/alert_view_controller.mm
@@ -64,6 +64,10 @@ constexpr int kButtonTextDestructiveColor = 0xdf322f; constexpr int kTextfieldBackgroundColor = 0xf7f7f7; +// This is how many bits UIViewAnimationCurve needs to be shifted to be in +// UIViewAnimationOptions format. Must match the one in UIView.h. +constexpr NSUInteger kUIViewAnimationCurveToOptionsShift = 16; + } // namespace @interface AlertViewController () <UITextFieldDelegate, @@ -464,6 +468,7 @@ if (additionalBottomInset > 0) { self.additionalSafeAreaInsets = UIEdgeInsetsMake(0, 0, additionalBottomInset, 0); + [self animateLayoutFromKeyboardNotification:notification]; } self.tapRecognizer.enabled = YES; @@ -472,11 +477,31 @@ - (void)handleKeyboardWillHide:(NSNotification*)notification { self.additionalSafeAreaInsets = UIEdgeInsetsZero; + [self animateLayoutFromKeyboardNotification:notification]; self.tapRecognizer.enabled = NO; self.swipeRecognizer.enabled = NO; } +- (void)animateLayoutFromKeyboardNotification:(NSNotification*)notification { + double duration = + [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] + doubleValue]; + UIViewAnimationCurve animationCurve = static_cast<UIViewAnimationCurve>( + [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] + integerValue]); + UIViewAnimationOptions options = animationCurve + << kUIViewAnimationCurveToOptionsShift; + + [UIView animateWithDuration:duration + delay:0 + options:options + animations:^{ + [self.view layoutIfNeeded]; + } + completion:nil]; +} + - (void)didSelectActionForButton:(UIButton*)button { AlertAction* action = self.buttonAlertActionsDictionary[@(button.tag)]; if (action.handler) {
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm index dccca27..fb0317c 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
@@ -210,7 +210,6 @@ CGRect keyboardContainerFrame = KeyboardContainerForLayout(layout).frame; CGPoint pointToKey = {keyFrame.origin.x - keyboardContainerFrame.origin.x, keyFrame.origin.y - keyboardContainerFrame.origin.y}; - CGRectIntersection(keyFrame, keyboardContainerFrame); CGPoint startPoint = CGPointMake((pointToKey.x + keyFrame.size.width / 2.0) / keyboardContainerFrame.size.width, (pointToKey.y + keyFrame.size.height / 2.0) /
diff --git a/ios/chrome/browser/ui/settings/language/BUILD.gn b/ios/chrome/browser/ui/settings/language/BUILD.gn index c3d1565..d6b0aaa 100644 --- a/ios/chrome/browser/ui/settings/language/BUILD.gn +++ b/ios/chrome/browser/ui/settings/language/BUILD.gn
@@ -55,3 +55,27 @@ "//ui/base", ] } + +source_set("unit_tests") { + configs += [ "//build/config/compiler:enable_arc" ] + testonly = true + sources = [ + "language_settings_mediator_unittest.mm", + ] + deps = [ + "//base/test:test_support", + "//components/language/core/browser", + "//components/pref_registry", + "//components/prefs", + "//components/sync_preferences", + "//components/sync_preferences:test_support", + "//components/translate/core/browser", + "//ios/chrome/browser/browser_state:test_support", + "//ios/chrome/browser/prefs:browser_prefs", + "//ios/chrome/browser/translate", + "//ios/chrome/browser/ui/settings/language", + "//ios/chrome/browser/ui/settings/language:language_ui", + "//ios/chrome/browser/ui/settings/language/cells", + "//testing/gtest", + ] +}
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_data_source.h b/ios/chrome/browser/ui/settings/language/language_settings_data_source.h index 19d3104d..1a78570 100644 --- a/ios/chrome/browser/ui/settings/language/language_settings_data_source.h +++ b/ios/chrome/browser/ui/settings/language/language_settings_data_source.h
@@ -25,6 +25,9 @@ // Returns whether or not Translate is enabled. - (BOOL)translateEnabled; +// Stops observing the model. This is required during the shutdown. +- (void)stopObservingModel; + // The consumer for this protocol. @property(nonatomic, weak) id<LanguageSettingsConsumer> consumer;
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_mediator.mm b/ios/chrome/browser/ui/settings/language/language_settings_mediator.mm index 6a5e811..7b370df 100644 --- a/ios/chrome/browser/ui/settings/language/language_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/language/language_settings_mediator.mm
@@ -26,8 +26,6 @@ #import "ios/chrome/browser/ui/settings/language/cells/language_item.h" #import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h" #import "ios/chrome/browser/ui/settings/language/language_settings_histograms.h" -#import "ios/chrome/browser/ui/settings/utils/observable_boolean.h" -#import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -35,10 +33,13 @@ #error "This file requires ARC support." #endif -@interface LanguageSettingsMediator () <BooleanObserver, PrefObserverDelegate> { +@interface LanguageSettingsMediator () <PrefObserverDelegate> { // Registrar for pref change notifications. std::unique_ptr<PrefChangeRegistrar> _prefChangeRegistrar; + // Pref observer to track changes to prefs::kOfferTranslateEnabled. + std::unique_ptr<PrefObserverBridge> _offerTranslatePrefObserverBridge; + // Pref observer to track changes to language::prefs::kAcceptLanguages. std::unique_ptr<PrefObserverBridge> _acceptLanguagesPrefObserverBridge; @@ -52,9 +53,6 @@ // The BrowserState passed to this instance. @property(nonatomic, assign) ios::ChromeBrowserState* browserState; -// An observable boolean backed by prefs::kOfferTranslateEnabled. -@property(nonatomic, strong) PrefBackedBoolean* translateEnabledPref; - @end @implementation LanguageSettingsMediator @@ -67,13 +65,12 @@ if (self) { _browserState = browserState; - _translateEnabledPref = [[PrefBackedBoolean alloc] - initWithPrefService:browserState->GetPrefs() - prefName:prefs::kOfferTranslateEnabled]; - [_translateEnabledPref setObserver:self]; - _prefChangeRegistrar = std::make_unique<PrefChangeRegistrar>(); _prefChangeRegistrar->Init(browserState->GetPrefs()); + _offerTranslatePrefObserverBridge = + std::make_unique<PrefObserverBridge>(self); + _offerTranslatePrefObserverBridge->ObserveChangesForPreference( + prefs::kOfferTranslateEnabled, _prefChangeRegistrar.get()); _acceptLanguagesPrefObserverBridge = std::make_unique<PrefObserverBridge>(self); _acceptLanguagesPrefObserverBridge->ObserveChangesForPreference( @@ -89,26 +86,27 @@ return self; } -#pragma mark - BooleanObserver - -// Called when the value of prefs::kOfferTranslateEnabled changes. -- (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean { - DCHECK_EQ(self.translateEnabledPref, observableBoolean); - - // Inform the consumer. - [self.consumer translateEnabled:observableBoolean.value]; +- (void)dealloc { + // In case this has not been explicitly called. + [self stopObservingModel]; } #pragma mark - PrefObserverDelegate -// Called when the value of language::prefs::kAcceptLanguages or +// Called when the value of prefs::kOfferTranslateEnabled, +// language::prefs::kAcceptLanguages or // language::prefs::kFluentLanguages change. - (void)onPreferenceChanged:(const std::string&)preferenceName { - DCHECK(preferenceName == language::prefs::kAcceptLanguages || + DCHECK(preferenceName == prefs::kOfferTranslateEnabled || + preferenceName == language::prefs::kAcceptLanguages || preferenceName == language::prefs::kFluentLanguages); - // Inform the consumer - [self.consumer languagePrefsChanged]; + // Inform the consumer. + if (preferenceName == prefs::kOfferTranslateEnabled) { + [self.consumer translateEnabled:[self translateEnabled]]; + } else { + [self.consumer languagePrefsChanged]; + } } #pragma mark - LanguageSettingsDataSource @@ -205,13 +203,22 @@ } - (BOOL)translateEnabled { - return self.translateEnabledPref.value; + return self.browserState->GetPrefs()->GetBoolean( + prefs::kOfferTranslateEnabled); +} + +- (void)stopObservingModel { + _offerTranslatePrefObserverBridge.reset(); + _acceptLanguagesPrefObserverBridge.reset(); + _fluentLanguagesPrefObserverBridge.reset(); + _prefChangeRegistrar.reset(); } #pragma mark - LanguageSettingsCommands - (void)setTranslateEnabled:(BOOL)enabled { - [self.translateEnabledPref setValue:enabled]; + self.browserState->GetPrefs()->SetBoolean(prefs::kOfferTranslateEnabled, + enabled); UMA_HISTOGRAM_ENUMERATION( kLanguageSettingsActionsHistogram,
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_mediator_unittest.mm b/ios/chrome/browser/ui/settings/language/language_settings_mediator_unittest.mm new file mode 100644 index 0000000..4f74b4c --- /dev/null +++ b/ios/chrome/browser/ui/settings/language/language_settings_mediator_unittest.mm
@@ -0,0 +1,279 @@ +// 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. + +#include <memory> +#include <string> +#include <vector> + +#include "base/strings/sys_string_conversions.h" +#import "base/test/ios/wait_util.h" +#include "base/test/scoped_task_environment.h" +#include "components/language/core/browser/language_prefs.h" +#include "components/language/core/browser/pref_names.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/prefs/pref_service.h" +#include "components/sync_preferences/pref_service_mock_factory.h" +#include "components/sync_preferences/pref_service_syncable.h" +#include "components/translate/core/browser/translate_pref_names.h" +#include "components/translate/core/browser/translate_prefs.h" +#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#include "ios/chrome/browser/prefs/browser_prefs.h" +#import "ios/chrome/browser/translate/chrome_ios_translate_client.h" +#import "ios/chrome/browser/ui/settings/language/cells/language_item.h" +#import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h" +#import "ios/chrome/browser/ui/settings/language/language_settings_mediator.h" +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::WaitUntilConditionOrTimeout; +using language::prefs::kAcceptLanguages; +using sync_preferences::PrefServiceMockFactory; +using sync_preferences::PrefServiceSyncable; +using user_prefs::PrefRegistrySyncable; + +namespace { + +// Constant for timeout while waiting for asynchronous sync operations. +const NSTimeInterval kSyncOperationTimeout = 10.0; + +std::vector<std::string> ExtractDisplayNamesFromLanguageItems( + NSArray<LanguageItem*>* language_items) { + __block std::vector<std::string> output; + [language_items enumerateObjectsUsingBlock:^(LanguageItem* item, + NSUInteger index, BOOL* stop) { + output.push_back(base::SysNSStringToUTF8(item.text)); + }]; + return output; +} + +std::vector<std::string> ExtractLanguageCodesFromLanguageItems( + NSArray<LanguageItem*>* language_items) { + __block std::vector<std::string> output; + [language_items enumerateObjectsUsingBlock:^(LanguageItem* item, + NSUInteger index, BOOL* stop) { + output.push_back(item.languageCode); + }]; + return output; +} + +} // namespace + +// Test class that conforms to LanguageSettingsConsumer in order to test the +// consumer methods are called correctly. +@interface FakeLanguageSettingsConsumer : NSObject <LanguageSettingsConsumer> + +@property(nonatomic, assign) BOOL translateEnabled; +@property(nonatomic, assign) BOOL translateEnabledWasCalled; +@property(nonatomic, assign) BOOL languagePrefsChangedWasCalled; + +@end + +@implementation FakeLanguageSettingsConsumer + +- (void)translateEnabled:(BOOL)enabled { + self.translateEnabled = enabled; + self.translateEnabledWasCalled = YES; +} + +- (void)languagePrefsChanged { + self.languagePrefsChangedWasCalled = YES; +} + +@end + +class LanguageSettingsMediatorTest : public PlatformTest { + protected: + LanguageSettingsMediatorTest() + : scoped_task_environment_( + base::test::ScopedTaskEnvironment::MainThreadType::UI) { + // Create BrowserState. + TestChromeBrowserState::Builder test_cbs_builder; + test_cbs_builder.SetPrefService(CreatePrefService()); + chrome_browser_state_ = test_cbs_builder.Build(); + + // Create TranslatePrefs. + translate_prefs_ = ChromeIOSTranslateClient::CreateTranslatePrefs( + chrome_browser_state_->GetPrefs()); + + // Make sure the accept languages list is empty. + std::vector<std::string> languages; + translate_prefs_->GetLanguageList(&languages); + for (const auto& language : languages) { + translate_prefs_->RemoveFromLanguageList(language); + } + + consumer_ = [[FakeLanguageSettingsConsumer alloc] init]; + + mediator_ = [[LanguageSettingsMediator alloc] + initWithBrowserState:chrome_browser_state_.get()]; + mediator_.consumer = consumer_; + } + + ~LanguageSettingsMediatorTest() override { [mediator_ stopObservingModel]; } + + PrefService* GetPrefs() { return chrome_browser_state_->GetPrefs(); } + + translate::TranslatePrefs* translate_prefs() { + return translate_prefs_.get(); + } + + FakeLanguageSettingsConsumer* consumer() { return consumer_; } + + LanguageSettingsMediator* mediator() { return mediator_; } + + std::unique_ptr<PrefServiceSyncable> CreatePrefService() { + scoped_refptr<PrefRegistrySyncable> registry = new PrefRegistrySyncable(); + // Registers Translate and Language related prefs. + RegisterBrowserStatePrefs(registry.get()); + PrefServiceMockFactory factory; + return factory.CreateSyncable(registry.get()); + } + + private: + base::test::ScopedTaskEnvironment scoped_task_environment_; + std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; + std::unique_ptr<translate::TranslatePrefs> translate_prefs_; + FakeLanguageSettingsConsumer* consumer_; + LanguageSettingsMediator* mediator_; +}; + +// Tests that the mediator notifies its consumer when the value of +// prefs::kOfferTranslateEnabled, language::prefs::kAcceptLanguages or +// language::prefs::kFluentLanguages change. +TEST_F(LanguageSettingsMediatorTest, TestPrefsChanged) { + consumer().translateEnabledWasCalled = NO; + EXPECT_FALSE([consumer() translateEnabled]); + GetPrefs()->SetBoolean(prefs::kOfferTranslateEnabled, true); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kSyncOperationTimeout, ^bool() { + return consumer().translateEnabledWasCalled; + })); + EXPECT_TRUE([consumer() translateEnabled]); + + consumer().translateEnabledWasCalled = NO; + EXPECT_TRUE([consumer() translateEnabled]); + GetPrefs()->SetBoolean(prefs::kOfferTranslateEnabled, false); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kSyncOperationTimeout, ^bool() { + return consumer().translateEnabledWasCalled; + })); + EXPECT_FALSE([consumer() translateEnabled]); + + consumer().languagePrefsChangedWasCalled = NO; + EXPECT_FALSE(translate_prefs()->IsBlockedLanguage("fa")); + translate_prefs()->AddToLanguageList("fa", /*force_blocked=*/false); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kSyncOperationTimeout, ^bool() { + return consumer().languagePrefsChangedWasCalled; + })); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("fa")); + + consumer().languagePrefsChangedWasCalled = NO; + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("fa")); + translate_prefs()->UnblockLanguage("fa"); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kSyncOperationTimeout, ^bool() { + return consumer().languagePrefsChangedWasCalled; + })); + EXPECT_FALSE(translate_prefs()->IsBlockedLanguage("fa")); +} + +// Tests that the list of supported language items are sorted by display names +// and excludes languages already in the accept languages list. +TEST_F(LanguageSettingsMediatorTest, TestSupportedLanguagesItems) { + NSArray<LanguageItem*>* language_items = [mediator() supportedLanguagesItems]; + std::vector<std::string> display_names = + ExtractDisplayNamesFromLanguageItems(language_items); + EXPECT_TRUE(std::is_sorted(display_names.begin(), display_names.end())); + + std::vector<std::string> language_codes = + ExtractLanguageCodesFromLanguageItems(language_items); + EXPECT_TRUE(std::find(language_codes.begin(), language_codes.end(), "fa") != + language_codes.end()); + + translate_prefs()->AddToLanguageList("fa", /*force_blocked=*/false); + language_items = [mediator() supportedLanguagesItems]; + language_codes = ExtractLanguageCodesFromLanguageItems(language_items); + EXPECT_FALSE(std::find(language_codes.begin(), language_codes.end(), "fa") != + language_codes.end()); +} + +// Tests that the list of accept language items is as expected. +TEST_F(LanguageSettingsMediatorTest, TestAcceptLanguagesItems) { + translate_prefs()->AddToLanguageList("fa", /*force_blocked=*/false); + translate_prefs()->AddToLanguageList("en-US", /*force_blocked=*/false); + translate_prefs()->AddToLanguageList("ug", /*force_blocked=*/false); + translate_prefs()->SetRecentTargetLanguage("fa"); + translate_prefs()->UnblockLanguage("en-US"); + + NSArray<LanguageItem*>* acceptLanguagesItems = + [mediator() acceptLanguagesItems]; + ASSERT_EQ(3U, [acceptLanguagesItems count]); + + EXPECT_EQ("fa", acceptLanguagesItems[0].languageCode); + EXPECT_TRUE(acceptLanguagesItems[0].supportsTranslate); + EXPECT_TRUE(acceptLanguagesItems[0].targetLanguage); + EXPECT_TRUE(acceptLanguagesItems[0].blocked); + + EXPECT_EQ("en-US", acceptLanguagesItems[1].languageCode); + EXPECT_TRUE(acceptLanguagesItems[1].supportsTranslate); + EXPECT_FALSE(acceptLanguagesItems[1].targetLanguage); + EXPECT_FALSE(acceptLanguagesItems[1].blocked); + + EXPECT_EQ("ug", acceptLanguagesItems[2].languageCode); + EXPECT_FALSE(acceptLanguagesItems[2].supportsTranslate); + EXPECT_FALSE(acceptLanguagesItems[2].targetLanguage); + EXPECT_TRUE(acceptLanguagesItems[2].blocked); +} + +// Tests that the mediator updates the model upon receiving the UI commands. +TEST_F(LanguageSettingsMediatorTest, TestLanguageSettingsCommands) { + [mediator() setTranslateEnabled:NO]; + EXPECT_FALSE(GetPrefs()->GetBoolean(prefs::kOfferTranslateEnabled)); + + [mediator() setTranslateEnabled:YES]; + EXPECT_TRUE(GetPrefs()->GetBoolean(prefs::kOfferTranslateEnabled)); + + [mediator() addLanguage:"fa"]; + [mediator() addLanguage:"en-US"]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("fa")); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("en-US")); + + [mediator() unblockLanguage:"en-US"]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("fa")); + EXPECT_FALSE(translate_prefs()->IsBlockedLanguage("en-US")); + + // The last fluent language cannot be unblocked. + [mediator() unblockLanguage:"fa"]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("fa")); + EXPECT_FALSE(translate_prefs()->IsBlockedLanguage("en-US")); + + [mediator() blockLanguage:"en-US"]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("fa")); + EXPECT_TRUE(translate_prefs()->IsBlockedLanguage("en-US")); + + [mediator() moveLanguage:"fa" downward:YES withOffset:1]; + EXPECT_EQ("en-US,fa", GetPrefs()->GetString(kAcceptLanguages)); + + [mediator() moveLanguage:"fa" downward:NO withOffset:1]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + + // Moving the first language up in order has no effect. + [mediator() moveLanguage:"fa" downward:NO withOffset:1]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + + // Moving the last language down in order has no effect. + [mediator() moveLanguage:"en-US" downward:YES withOffset:1]; + EXPECT_EQ("fa,en-US", GetPrefs()->GetString(kAcceptLanguages)); + + [mediator() removeLanguage:"fa"]; + EXPECT_EQ("en-US", GetPrefs()->GetString(kAcceptLanguages)); + + [mediator() removeLanguage:"en-US"]; + EXPECT_EQ("", GetPrefs()->GetString(kAcceptLanguages)); +}
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h b/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h index 01cc3cc..23eb2523 100644 --- a/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_LANGUAGE_SETTINGS_TABLE_VIEW_CONTROLLER_H_ #import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h" +#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" @protocol LanguageSettingsDataSource; @@ -14,7 +15,8 @@ // Controller for the UI that allows the user to change language settings such // as the ordered list of accept languages and their Translate preferences. @interface LanguageSettingsTableViewController - : SettingsRootTableViewController <LanguageSettingsConsumer> + : SettingsRootTableViewController <LanguageSettingsConsumer, + SettingsControllerProtocol> // The designated initializer. |dataSource| and |commandHandler| must not be // nil. |commandHandler| will not be retained.
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm index 7e9dac7..3add4835 100644 --- a/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm
@@ -159,6 +159,12 @@ [self setTranslateSwitchItemEnabled:!self.isEditing]; } +#pragma mark - SettingsControllerProtocol + +- (void)settingsWillBeDismissed { + [self.dataSource stopObservingModel]; +} + #pragma mark - UITableViewDelegate - (UITableViewCellEditingStyle)tableView:(UITableView*)tableView
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.h b/ios/chrome/browser/ui/settings/settings_navigation_controller.h index d3943246..b215b33 100644 --- a/ios/chrome/browser/ui/settings/settings_navigation_controller.h +++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.h
@@ -143,6 +143,11 @@ - (instancetype)initWithRootViewController:(UIViewController*)rootViewController NS_UNAVAILABLE; +- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass + toolbarClass:(Class)toolbarClass NS_UNAVAILABLE; +- (instancetype)initWithNibName:(NSString*)nibNameOrNil + bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE; +- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE; // Returns a new Done button for a UINavigationItem which will call // closeSettings when it is pressed. Should only be called by view controllers
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm index e6e3af0..0e069fb 100644 --- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -249,9 +249,13 @@ delegate:(id<SettingsNavigationControllerDelegate>)delegate { DCHECK(browserState); DCHECK(!browserState->IsOffTheRecord()); +#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0) + self = [super initWithRootViewController:rootViewController]; +#else self = rootViewController ? [super initWithRootViewController:rootViewController] : [super init]; +#endif if (self) { mainBrowserState_ = browserState; delegate_ = delegate;
diff --git a/ios/chrome/browser/ui/signin_interaction/BUILD.gn b/ios/chrome/browser/ui/signin_interaction/BUILD.gn index ccd205bf..3790c4d 100644 --- a/ios/chrome/browser/ui/signin_interaction/BUILD.gn +++ b/ios/chrome/browser/ui/signin_interaction/BUILD.gn
@@ -55,37 +55,6 @@ testonly = true sources = [ "signin_interaction_controller_egtest.mm", - "signin_interaction_controller_unity_disabled_egtest.mm", - ] - deps = [ - ":eg_test_support", - "//base", - "//base/test:test_support", - "//components/unified_consent", - "//ios/chrome/app/strings", - "//ios/chrome/browser", - "//ios/chrome/browser/signin", - "//ios/chrome/browser/ui/authentication", - "//ios/chrome/browser/ui/authentication:eg_test_support", - "//ios/chrome/browser/ui/authentication/cells", - "//ios/chrome/browser/ui/commands", - "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant", - "//ios/chrome/browser/ui/settings", - "//ios/chrome/browser/ui/util", - "//ios/chrome/test/app:test_support", - "//ios/chrome/test/earl_grey:test_support", - "//ios/public/provider/chrome/browser/signin:test_support", - "//ios/testing/earl_grey:earl_grey_support", - "//ios/third_party/earl_grey:earl_grey+link", - ] - libs = [ "XCTest.framework" ] -} - -source_set("unity_eg_tests") { - configs += [ "//build/config/compiler:enable_arc" ] - testonly = true - sources = [ - "signin_interaction_controller_egtest.mm", "signin_interaction_controller_unity_egtest.mm", ] deps = [ @@ -94,7 +63,6 @@ "//base/test:test_support", "//components/unified_consent", "//ios/chrome/app/strings", - "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser", "//ios/chrome/browser/signin", "//ios/chrome/browser/ui/authentication", @@ -114,16 +82,3 @@ ] libs = [ "XCTest.framework" ] } - -source_set("unified_consent_enabled_hooks") { - configs += [ "//build/config/compiler:enable_arc" ] - testonly = true - sources = [ - "unified_consent_enabled_egtests_hook.mm", - ] - deps = [ - "//components/unified_consent", - "//components/unified_consent:test_support", - "//ios/chrome/app:tests_hook", - ] -}
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_disabled_egtest.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_disabled_egtest.mm deleted file mode 100644 index f8621bb..0000000 --- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_disabled_egtest.mm +++ /dev/null
@@ -1,218 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <EarlGrey/EarlGrey.h> -#import <XCTest/XCTest.h> - -#include "base/auto_reset.h" -#include "base/strings/sys_string_conversions.h" -#import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" -#include "components/unified_consent/feature.h" -#import "ios/chrome/browser/ui/authentication/chrome_signin_view_controller.h" -#import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h" -#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h" -#import "ios/chrome/browser/ui/commands/application_commands.h" -#import "ios/chrome/browser/ui/commands/open_new_tab_command.h" -#import "ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.h" -#include "ios/chrome/browser/ui/util/ui_util.h" -#include "ios/chrome/grit/ios_strings.h" -#import "ios/chrome/test/app/chrome_test_util.h" -#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" -#import "ios/chrome/test/earl_grey/chrome_matchers.h" -#import "ios/chrome/test/earl_grey/chrome_test_case.h" -#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h" -#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -using chrome_test_util::SecondarySignInButton; -using chrome_test_util::SettingsDoneButton; - -// Sign-in interaction tests that requires Unified Consent to be disabled. -@interface SigninInteractionControllerUnityDisabledTestCase : ChromeTestCase -@end - -@implementation SigninInteractionControllerUnityDisabledTestCase - -- (void)setUp { - [super setUp]; - - CHECK(!unified_consent::IsUnifiedConsentFeatureEnabled()) - << "This test suite must be run with Unified Consent feature disabled."; -} - -// Tests that switching from a managed account to a non-managed account works -// correctly and displays the expected warnings. -- (void)testSignInSwitchManagedAccount { - // Set up the fake identities. - ios::FakeChromeIdentityService* identity_service = - ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); - ChromeIdentity* managed_identity = [SigninEarlGreyUtils fakeManagedIdentity]; - ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1]; - identity_service->AddIdentity(managed_identity); - identity_service->AddIdentity(identity); - - [ChromeEarlGreyUI openSettingsMenu]; - [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()]; - [SigninEarlGreyUI selectIdentityWithEmail:managed_identity.userEmail]; - - // Accept warning for signing into a managed identity, with synchronization - // off due to an infinite spinner. - SetEarlGreySynchronizationEnabled(NO); - WaitForMatcher(chrome_test_util::ButtonWithAccessibilityLabelId( - IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON)); - TapButtonWithLabelId(IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON); - SetEarlGreySynchronizationEnabled(YES); - - [SigninEarlGreyUI confirmSigninConfirmationDialog]; - CHROME_EG_ASSERT_NO_ERROR( - [SigninEarlGreyUtils checkSignedInWithIdentity:managed_identity]); - - // Switch Sync account to |identity|. - [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()] - performAction:grey_tap()]; - - TapButtonWithAccessibilityLabel(identity.userEmail); - - SetEarlGreySynchronizationEnabled(NO); - WaitForMatcher(chrome_test_util::ButtonWithAccessibilityLabelId( - IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON)); - TapButtonWithLabelId(IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON); - SetEarlGreySynchronizationEnabled(YES); - - CHROME_EG_ASSERT_NO_ERROR( - [SigninEarlGreyUtils checkSignedInWithIdentity:identity]); - - [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] - performAction:grey_tap()]; -} - -// Tests signing in with one account, switching sync account to a second and -// choosing to keep the browsing data separate during the switch. -- (void)testSignInSwitchAccountsAndKeepDataSeparate { - // Set up the fake identities. - ios::FakeChromeIdentityService* identity_service = - ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); - ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1]; - ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2]; - identity_service->AddIdentity(identity1); - identity_service->AddIdentity(identity2); - - [SigninEarlGreyUI signinWithIdentity:identity1]; - [ChromeEarlGreyUI openSettingsMenu]; - - // Open accounts settings, then sync settings. - [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()] - performAction:grey_tap()]; - - // Switch Sync account to |identity2|. - TapButtonWithAccessibilityLabel(identity2.userEmail); - [[EarlGrey selectElementWithMatcher: - chrome_test_util::SettingsImportDataKeepSeparateButton()] - performAction:grey_tap()]; - id<GREYMatcher> matcher = grey_allOf( - chrome_test_util::ButtonWithAccessibilityLabelId( - IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON), - grey_not(grey_accessibilityTrait(UIAccessibilityTraitNotEnabled)), nil); - [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; - - // Check the signed-in user did change. - CHROME_EG_ASSERT_NO_ERROR( - [SigninEarlGreyUtils checkSignedInWithIdentity:identity2]); - - [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] - performAction:grey_tap()]; -} - -// Tests signing in with one account, switching sync account to a second and -// choosing to import the browsing data during the switch. -- (void)testSignInSwitchAccountsAndImportData { - // Set up the fake identities. - ios::FakeChromeIdentityService* identity_service = - ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); - ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1]; - ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2]; - identity_service->AddIdentity(identity1); - identity_service->AddIdentity(identity2); - - // Sign in to |identity1|. - [SigninEarlGreyUI signinWithIdentity:identity1]; - [ChromeEarlGreyUI openSettingsMenu]; - - // Open accounts settings, then sync settings. - [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()] - performAction:grey_tap()]; - - // Switch Sync account to |identity2|. - TapButtonWithAccessibilityLabel(identity2.userEmail); - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - SettingsImportDataImportButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher: - grey_allOf(chrome_test_util::ButtonWithAccessibilityLabelId( - IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON), - grey_userInteractionEnabled(), nil)] - performAction:grey_tap()]; - - // Check the signed-in user did change. - CHROME_EG_ASSERT_NO_ERROR( - [SigninEarlGreyUtils checkSignedInWithIdentity:identity2]); - - [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] - performAction:grey_tap()]; -} - -// Opens the add account screen and then cancels it by opening a new tab. -// Ensures that the add account screen is correctly dismissed. crbug.com/462200 -- (void)testSignInCancelAddAccount { - // Add an identity to avoid arriving on the Add Account screen when opening - // sign-in. - ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1]; - ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( - identity); - - [ChromeEarlGreyUI openSettingsMenu]; - [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()]; - - // Open Add Account screen. - id<GREYMatcher> add_account_matcher = - chrome_test_util::StaticTextWithAccessibilityLabelId( - unified_consent::IsUnifiedConsentFeatureEnabled() - ? IDS_IOS_ACCOUNT_IDENTITY_CHOOSER_ADD_ACCOUNT - : IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_ADD_ACCOUNT_BUTTON); - [[EarlGrey selectElementWithMatcher:add_account_matcher] - performAction:grey_tap()]; - [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; - - // Open new tab to cancel sign-in. - OpenNewTabCommand* command = - [OpenNewTabCommand commandWithURLFromChrome:GURL("about:blank")]; - [chrome_test_util::DispatcherForActiveBrowserViewController() - openURLInNewTab:command]; - - // Re-open the sign-in screen. If it wasn't correctly dismissed previously, - // this will fail. - [ChromeEarlGreyUI openSettingsMenu]; - [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()]; - if (unified_consent::IsUnifiedConsentFeatureEnabled()) - [SigninEarlGreyUI selectIdentityWithEmail:identity.userEmail]; - VerifyChromeSigninViewVisible(); - - // Close sign-in screen and Settings. - TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON); - [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] - performAction:grey_tap()]; -} - -@end
diff --git a/ios/chrome/browser/ui/signin_interaction/unified_consent_enabled_egtests_hook.mm b/ios/chrome/browser/ui/signin_interaction/unified_consent_enabled_egtests_hook.mm deleted file mode 100644 index b5a7e81..0000000 --- a/ios/chrome/browser/ui/signin_interaction/unified_consent_enabled_egtests_hook.mm +++ /dev/null
@@ -1,57 +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. - -#include "components/unified_consent/scoped_unified_consent.h" -#include "ios/chrome/app/tests_hook.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { -unified_consent::ScopedUnifiedConsent* gScopedUnifiedConsent = nullptr; -} - -namespace tests_hook { - -bool DisableAppGroupAccess() { - return true; -} - -bool DisableContentSuggestions() { - return true; -} - -bool DisableContextualSearch() { - return true; -} - -bool DisableFirstRun() { - return true; -} - -bool DisableGeolocation() { - return true; -} - -bool DisableSigninRecallPromo() { - return true; -} - -bool DisableUpdateService() { - return true; -} - -void SetUpTestsIfPresent() { - // Enables unified consent feature. - CHECK(!gScopedUnifiedConsent); - gScopedUnifiedConsent = new unified_consent::ScopedUnifiedConsent( - unified_consent::UnifiedConsentFeatureState::kEnabled); -} - -void RunTestsIfPresent() { - // No-op for Earl Grey. -} - -} // namespace tests_hook
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index 25b1e541..e59f877 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -302,6 +302,7 @@ } self.bvcContainer = [[BVCContainerViewController alloc] init]; + self.bvcContainer.modalPresentationStyle = UIModalPresentationFullScreen; self.bvcContainer.currentBVC = viewController; self.bvcContainer.transitioningDelegate = self.transitionHandler; BOOL animated = !self.animationsDisabledForTesting;
diff --git a/ios/chrome/browser/ui/table_view/table_view_navigation_controller.h b/ios/chrome/browser/ui/table_view/table_view_navigation_controller.h index bf70cd2..9038b35 100644 --- a/ios/chrome/browser/ui/table_view/table_view_navigation_controller.h +++ b/ios/chrome/browser/ui/table_view/table_view_navigation_controller.h
@@ -15,6 +15,10 @@ - (instancetype)initWithTable:(ChromeTableViewController*)table NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithRootViewController:(UIViewController*)rootViewController + NS_UNAVAILABLE; +- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass + toolbarClass:(Class)toolbarClass NS_UNAVAILABLE; - (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE; - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index f7d3439..43de4175 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -238,6 +238,7 @@ "//ios/chrome/browser/ui/settings/autofill:unit_tests", "//ios/chrome/browser/ui/settings/cells:unit_tests", "//ios/chrome/browser/ui/settings/clear_browsing_data:unit_tests", + "//ios/chrome/browser/ui/settings/language:unit_tests", "//ios/chrome/browser/ui/settings/password:unit_tests", "//ios/chrome/browser/ui/settings/sync:unit_tests", "//ios/chrome/browser/ui/side_swipe:unit_tests",
diff --git a/ios/chrome/test/OWNERS b/ios/chrome/test/OWNERS index bd6fe7d6..aad2329 100644 --- a/ios/chrome/test/OWNERS +++ b/ios/chrome/test/OWNERS
@@ -1,4 +1,8 @@ eugenebut@chromium.org +# This is for the common case of adding or renaming files. If you're doing +# structural changes, use usual OWNERS rules. +per-file BUILD.gn=* + # TEAM: ios-directory-owners@chromium.org # OS: iOS
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index b2fee1d..755f81b8 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -21,7 +21,6 @@ ":ios_chrome_tab_grid_egtests", ":ios_chrome_translate_egtests", ":ios_chrome_ui_egtests", - ":ios_chrome_unified_consent_egtests", ":ios_chrome_web_egtests", ] } @@ -201,19 +200,6 @@ ] } -chrome_ios_eg_test("ios_chrome_unified_consent_egtests") { - deps = [ - "//ios/chrome/browser/ui/bookmarks:eg_tests", - "//ios/chrome/browser/ui/first_run:eg_tests", - "//ios/chrome/browser/ui/settings:eg_tests", - "//ios/chrome/browser/ui/settings/google_services:eg_tests", - "//ios/chrome/browser/ui/settings/google_services:unified_consent_eg_tests", - "//ios/chrome/browser/ui/signin_interaction:unity_eg_tests", - ] - hooks_target = - "//ios/chrome/browser/ui/signin_interaction:unified_consent_enabled_hooks" -} - source_set("test_support") { defines = [ "CHROME_EARL_GREY_1" ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/test/fakes/fake_document_interaction_controller.h b/ios/chrome/test/fakes/fake_document_interaction_controller.h index ce6ddd0..33879c2 100644 --- a/ios/chrome/test/fakes/fake_document_interaction_controller.h +++ b/ios/chrome/test/fakes/fake_document_interaction_controller.h
@@ -21,7 +21,7 @@ // Fake implementations of UIDocumentInteractionController properties: @property(nonatomic, copy) NSString* UTI; -@property(nonatomic, weak) id<UIDocumentInteractionControllerDelegate> delegate; +@property(nonatomic, weak) id delegate; // Whether or not this controller can present Open In... menu. Defaults to YES. @property(nonatomic) BOOL presentsOpenInMenu;
diff --git a/ios/web/navigation/crw_wk_navigation_handler.h b/ios/web/navigation/crw_wk_navigation_handler.h index fb81e91..c143a4f 100644 --- a/ios/web/navigation/crw_wk_navigation_handler.h +++ b/ios/web/navigation/crw_wk_navigation_handler.h
@@ -26,7 +26,6 @@ struct Referrer; class WebStateImpl; class NavigationContextImpl; -class NavigationItemImpl; class UserInteractionState; class WKBackForwardListItemHolder; } @@ -42,11 +41,6 @@ - (web::UserInteractionState*)userInteractionStateForNavigationHandler: (CRWWKNavigationHandler*)navigationHandler; -// Returns associated certificate verification errors. -- (web::CertVerificationErrorsCacheType*) - certVerificationErrorsForNavigationHandler: - (CRWWKNavigationHandler*)navigationHandler; - // Returns associated certificate verificatio controller. - (CRWCertVerificationController*) certVerificationControllerForNavigationHandler: @@ -61,10 +55,6 @@ legacyNativeContentControllerForNavigationHandler: (CRWWKNavigationHandler*)navigationHandler; -// Returns YES if WKWebView is halted. -- (BOOL)navigationHandlerWebViewIsHalted: - (CRWWKNavigationHandler*)navigationHandler; - // Returns YES if WKWebView was deallocated or is being deallocated. - (BOOL)navigationHandlerWebViewBeingDestroyed: (CRWWKNavigationHandler*)navigationHandler; @@ -85,10 +75,6 @@ // Stop Loading current page. - (void)navigationHandlerStopLoading:(CRWWKNavigationHandler*)navigationHandler; -// Aborts any load for both the web view and its controller. -- (void)navigationHandlerAbortLoading: - (CRWWKNavigationHandler*)navigationHandler; - // Returns YES if |url| should be loaded in a native view. - (BOOL)navigationHandler:(CRWWKNavigationHandler*)navigationHandler shouldLoadURLInNativeView:(const GURL&)url; @@ -107,23 +93,6 @@ rendererInitiated:(BOOL)renderedInitiated placeholderNavigation:(BOOL)placeholderNavigation; -// Notifies the delegate that load has been cancelled. -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleCancelledError:(NSError*)error - forNavigation:(WKNavigation*)navigation - provisionalLoad:(BOOL)provisionalLoad; - -// Notifies the delegate that load ends in an SSL error and certificate chain. -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleSSLCertError:(NSError*)error - forNavigation:(WKNavigation*)navigation; - -// Notifies the delegate that load ends in error. -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleLoadError:(NSError*)error - forNavigation:(WKNavigation*)navigation - provisionalLoad:(BOOL)provisionalLoad; - // Instructs the delegate to clear the web frames list. - (void)navigationHandlerRemoveAllWebFrames: (CRWWKNavigationHandler*)navigationHandler; @@ -155,14 +124,6 @@ - (void)navigationHandlerUpdateHTML5HistoryState: (CRWWKNavigationHandler*)navigationHandler; -// Instructs the delegate to execute the command specified by the -// ErrorRetryStateMachine. -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleErrorRetryCommand:(web::ErrorRetryCommand)command - navigationItem:(web::NavigationItemImpl*)item - navigationContext:(web::NavigationContextImpl*)context - originalNavigation:(WKNavigation*)originalNavigation; - // Notifies the delegate that navigation has finished. - (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler didFinishNavigation:(web::NavigationContextImpl*)context; @@ -171,6 +132,19 @@ - (void)navigationHandlerWebProcessDidCrash: (CRWWKNavigationHandler*)navigationHandler; +// Instructs the delegate to load current URL. +- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler + loadCurrentURLWithRendererInitiatedNavigation:(BOOL)rendererInitiated; + +// Notifies the delegate that load has completed. +- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler + didCompleteLoadWithSuccess:(BOOL)loadSuccess + forContext:(web::NavigationContextImpl*)context; + +// Instructs the delegate to create a web view if it's not yet created. +- (WKWebView*)navigationHandlerEnsureWebViewCreated: + (CRWWKNavigationHandler*)navigationHandler; + @end // Handler class for WKNavigationDelegate, deals with navigation callbacks from @@ -230,6 +204,16 @@ - (ui::PageTransition)pageTransitionFromNavigationType: (WKNavigationType)navigationType; +// Loads a blank page directly into WKWebView as a placeholder to create a new +// back forward item (f.e. for error page). This page has the URL +// about:blank?for=<encoded original URL>. If |originalContext| is provided, +// reuse it for the placeholder navigation instead of creating a new one. +- (web::NavigationContextImpl*) + loadPlaceholderInWebViewForURL:(const GURL&)originalURL + rendererInitiated:(BOOL)rendererInitiated + forContext:(std::unique_ptr<web::NavigationContextImpl>) + originalContext; + @end #endif // IOS_WEB_NAVIGATION_CRW_WK_NAVIGATION_HANDLER_H_
diff --git a/ios/web/navigation/crw_wk_navigation_handler.mm b/ios/web/navigation/crw_wk_navigation_handler.mm index f0de60c..3e8c9a9 100644 --- a/ios/web/navigation/crw_wk_navigation_handler.mm +++ b/ios/web/navigation/crw_wk_navigation_handler.mm
@@ -31,10 +31,12 @@ #import "ios/web/public/web_client.h" #import "ios/web/security/crw_cert_verification_controller.h" #import "ios/web/security/wk_web_view_security_util.h" +#import "ios/web/session/session_certificate_policy_cache_impl.h" #import "ios/web/web_state/ui/controller/crw_legacy_native_content_controller.h" #import "ios/web/web_state/user_interaction_state.h" #import "ios/web/web_state/web_state_impl.h" #include "ios/web/web_view/content_type_util.h" +#import "ios/web/web_view/error_translation_util.h" #import "ios/web/web_view/wk_web_view_util.h" #import "net/base/mac/url_conversions.h" #include "net/cert/x509_util_ios.h" @@ -51,6 +53,13 @@ using web::wk_navigation_util::IsRestoreSessionUrl; using web::wk_navigation_util::IsWKInternalUrl; +namespace { +// Maximum number of errors to store in cert verification errors cache. +// Cache holds errors only for pending navigations, so the actual number of +// stored errors is not expected to be high. +const web::CertVerificationErrorsCacheType::size_type kMaxCertErrorsCount = 100; +} + @interface CRWWKNavigationHandler () { // Used to poll for a SafeBrowsing warning being displayed. This is created in // |decidePolicyForNavigationAction| and destroyed once any of the following @@ -65,6 +74,13 @@ // WebController.EmptyNavigationManagerCausedByStopLoading UMA metric which // helps with diagnosing a navigation related crash (crbug.com/565457). __weak WKNavigation* _stoppedWKNavigation; + + // CertVerification errors which happened inside + // |webView:didReceiveAuthenticationChallenge:completionHandler:|. + // Key is leaf-cert/host pair. This storage is used to carry calculated + // cert status from |didReceiveAuthenticationChallenge:| to + // |didFailProvisionalNavigation:| delegate method. + std::unique_ptr<web::CertVerificationErrorsCacheType> _certVerificationErrors; } // Returns the WebStateImpl from self.delegate. @@ -75,9 +91,6 @@ // Returns the UserInteractionState from self.delegate. @property(nonatomic, readonly, assign) web::UserInteractionState* userInteractionState; -// Returns the CertVerificationErrorsCacheType from self.delegate. -@property(nonatomic, readonly, assign) - web::CertVerificationErrorsCacheType* certVerificationErrors; // Returns the CRWCertVerificationController from self.delegate. @property(nonatomic, readonly, weak) CRWCertVerificationController* certVerificationController; @@ -100,6 +113,10 @@ // Load phase when no WebView present is 'loaded' because this represents // the idle state. _navigationState = web::WKNavigationState::FINISHED; + + _certVerificationErrors = + std::make_unique<web::CertVerificationErrorsCacheType>( + kMaxCertErrorsCount); } return self; } @@ -573,7 +590,8 @@ // process (which may potentially be controller by an attacker) is // dangerous. if (web::GetWebClient()->IsAppSpecificURL(self.documentURL)) { - [self.delegate navigationHandlerAbortLoading:self]; + [webView stopLoading]; + [self stopLoading]; web::NavigationManager::WebLoadParams params(webViewURL); self.navigationManagerImpl->LoadURLWithParams(params); } @@ -659,10 +677,9 @@ // Handle load cancellation for directly cancelled navigations without // handling their potential errors. Otherwise, handle the error. if (self.pendingNavigationInfo.cancelled) { - [self.delegate navigationHandler:self - handleCancelledError:error - forNavigation:navigation - provisionalLoad:YES]; + [self handleCancelledError:error + forNavigation:navigation + provisionalLoad:YES]; } else if (error.code == NSURLErrorUnsupportedURL && self.webStateImpl->HasWebUI()) { // This is a navigation to WebUI page. @@ -670,14 +687,12 @@ net::GURLWithNSURL(error.userInfo[NSURLErrorFailingURLErrorKey]))); } else { if (web::IsWKWebViewSSLCertError(error)) { - [self.delegate navigationHandler:self - handleSSLCertError:error - forNavigation:navigation]; + [self handleSSLCertError:error forNavigation:navigation webView:webView]; } else { - [self.delegate navigationHandler:self - handleLoadError:error - forNavigation:navigation - provisionalLoad:YES]; + [self handleLoadError:error + forNavigation:navigation + webView:webView + provisionalLoad:YES]; } } @@ -685,7 +700,7 @@ // This must be reset at the end, since code above may need information about // the pending load. self.pendingNavigationInfo = nil; - self.certVerificationErrors->Clear(); + _certVerificationErrors->Clear(); if (web::features::StorePendingItemInContext()) { // Remove the navigation to immediately get rid of pending item. if (web::WKNavigationState::NONE != @@ -717,7 +732,7 @@ forNavigation:navigation]; } - self.certVerificationErrors->Clear(); + _certVerificationErrors->Clear(); // Invariant: Every |navigation| should have a |context|. Note that violation // of this invariant is currently observed in production, but the cause is not @@ -1034,17 +1049,16 @@ web::ErrorRetryCommand command = item->error_retry_state_machine().DidFinishNavigation(webViewURL); - [self.delegate navigationHandler:self - handleErrorRetryCommand:command - navigationItem:item - navigationContext:context - originalNavigation:navigation]; + [self handleErrorRetryCommand:command + navigationItem:item + navigationContext:context + originalNavigation:navigation + webView:webView]; } [self.navigationStates setState:web::WKNavigationState::FINISHED forNavigation:navigation]; - DCHECK(![self.delegate navigationHandlerWebViewIsHalted:self]); // Trigger JavaScript driven post-document-load-completion tasks. // TODO(crbug.com/546350): Investigate using // WKUserScriptInjectionTimeAtDocumentEnd to inject this material at the @@ -1071,12 +1085,12 @@ [self.navigationStates setState:web::WKNavigationState::FAILED forNavigation:navigation]; - [self.delegate navigationHandler:self - handleLoadError:error - forNavigation:navigation - provisionalLoad:NO]; + [self handleLoadError:error + forNavigation:navigation + webView:webView + provisionalLoad:NO]; [self.delegate navigationHandlerRemoveAllWebFrames:self]; - self.certVerificationErrors->Clear(); + _certVerificationErrors->Clear(); [self forgetNullWKNavigation:navigation]; } @@ -1126,7 +1140,7 @@ - (void)webViewWebContentProcessDidTerminate:(WKWebView*)webView { [self didReceiveWKNavigationDelegateCallback]; - self.certVerificationErrors->Clear(); + _certVerificationErrors->Clear(); self.webProcessCrashed = YES; [self.delegate navigationHandlerWebProcessDidCrash:self]; @@ -1146,10 +1160,6 @@ return [self.delegate userInteractionStateForNavigationHandler:self]; } -- (web::CertVerificationErrorsCacheType*)certVerificationErrors { - return [self.delegate certVerificationErrorsForNavigationHandler:self]; -} - - (CRWJSInjector*)JSInjector { return [self.delegate JSInjectorForNavigationHandler:self]; } @@ -1490,7 +1500,7 @@ policy == web::CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_UNDECIDED_BY_USER; std::string host = base::SysNSStringToUTF8(challenge.protectionSpace.host); - self.certVerificationErrors->Put( + _certVerificationErrors->Put( web::CertHostPair(leafCert, host), web::CertVerificationError(is_recoverable, certStatus)); } @@ -1539,6 +1549,423 @@ persistence:NSURLCredentialPersistenceForSession]); } +// Called when a load ends in an SSL error and certificate chain. +- (void)handleSSLCertError:(NSError*)error + forNavigation:(WKNavigation*)navigation + webView:(WKWebView*)webView { + CHECK(web::IsWKWebViewSSLCertError(error)); + + net::SSLInfo info; + web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); + + if (!info.cert) { + // |info.cert| can be null if certChain in NSError is empty or can not be + // parsed, in this case do not ask delegate if error should be allowed, it + // should not be. + [self handleLoadError:error + forNavigation:navigation + webView:webView + provisionalLoad:YES]; + return; + } + + // Retrieve verification results from _certVerificationErrors cache to avoid + // unnecessary recalculations. Verification results are cached for the leaf + // cert, because the cert chain in |didReceiveAuthenticationChallenge:| is + // the OS constructed chain, while |chain| is the chain from the server. + NSArray* chain = error.userInfo[web::kNSErrorPeerCertificateChainKey]; + NSURL* requestURL = error.userInfo[web::kNSErrorFailingURLKey]; + NSString* host = requestURL.host; + scoped_refptr<net::X509Certificate> leafCert; + bool recoverable = false; + if (chain.count && host.length) { + // The complete cert chain may not be available, so the leaf cert is used + // as a key to retrieve _certVerificationErrors, as well as for storing the + // cert decision. + leafCert = web::CreateCertFromChain(@[ chain.firstObject ]); + if (leafCert) { + auto error = _certVerificationErrors->Get( + {leafCert, base::SysNSStringToUTF8(host)}); + bool cacheHit = error != _certVerificationErrors->end(); + if (cacheHit) { + recoverable = error->second.is_recoverable; + info.cert_status = error->second.status; + } + UMA_HISTOGRAM_BOOLEAN("WebController.CertVerificationErrorsCacheHit", + cacheHit); + } + } + + // If the current navigation item is in error state, update the error retry + // state machine to indicate that SSL interstitial error will be displayed to + // make sure subsequent back/forward navigation to this item starts with the + // correct error retry state. + web::NavigationContextImpl* context = + [self.navigationStates contextForNavigation:navigation]; + if (context) { + if (web::features::StorePendingItemInContext()) { + // This NavigationContext will be destroyed, so return pending item + // ownership to NavigationManager. NavigationContext can only own pending + // item until the navigation has committed or aborted. + self.navigationManagerImpl->SetPendingItem(context->ReleaseItem()); + } + web::NavigationItemImpl* item = + web::GetItemWithUniqueID(self.navigationManagerImpl, context); + if (item && item->error_retry_state_machine().state() == + web::ErrorRetryState::kRetryFailedNavigationItem) { + item->error_retry_state_machine().SetDisplayingWebError(); + } + } + + // Ask web client if this cert error should be allowed. + web::GetWebClient()->AllowCertificateError( + self.webStateImpl, net::MapCertStatusToNetError(info.cert_status), info, + net::GURLWithNSURL(requestURL), recoverable, + base::BindRepeating(^(bool proceed) { + if (proceed) { + DCHECK(recoverable); + [self.certVerificationController allowCert:leafCert + forHost:host + status:info.cert_status]; + self.webStateImpl->GetSessionCertificatePolicyCacheImpl() + .RegisterAllowedCertificate( + leafCert, base::SysNSStringToUTF8(host), info.cert_status); + // New navigation is a different navigation from the original one. + // The new navigation is always browser-initiated and happens when + // the browser allows to proceed with the load. + [self.delegate navigationHandler:self + loadCurrentURLWithRendererInitiatedNavigation:NO]; + } else { + [self.legacyNativeContentController handleSSLError]; + } + })); + + [self loadCancelled]; +} + +// Called when a load ends in an error. +- (void)handleLoadError:(NSError*)error + forNavigation:(WKNavigation*)navigation + webView:(WKWebView*)webView + provisionalLoad:(BOOL)provisionalLoad { + if (error.code == NSURLErrorCancelled) { + [self handleCancelledError:error + forNavigation:navigation + provisionalLoad:provisionalLoad]; + // TODO(crbug.com/957032): This might get fixed at some point. Check if + // there is a iOS version for which we don't need it any more. + if (@available(iOS 12.2, *)) { + if (![webView.backForwardList.currentItem.URL isEqual:webView.URL] && + [self isCurrentNavigationItemPOST]) { + UMA_HISTOGRAM_BOOLEAN("WebController.BackForwardListOutOfSync", true); + // Sometimes on error the backForward list is out of sync with the + // webView, go back or forward to fix it. See crbug.com/951880. + if ([webView.backForwardList.backItem.URL isEqual:webView.URL]) { + [webView goBack]; + } else if ([webView.backForwardList.forwardItem.URL + isEqual:webView.URL]) { + [webView goForward]; + } + } + } + // NSURLErrorCancelled errors that aren't handled by aborting the load will + // automatically be retried by the web view, so early return in this case. + return; + } + + web::NavigationContextImpl* navigationContext = + [self.navigationStates contextForNavigation:navigation]; + navigationContext->SetError(error); + navigationContext->SetIsPost([self isCurrentNavigationItemPOST]); + // TODO(crbug.com/803631) DCHECK that self.currentNavItem is the navigation + // item associated with navigationContext. + + if ([error.domain isEqual:base::SysUTF8ToNSString(web::kWebKitErrorDomain)]) { + if (error.code == web::kWebKitErrorPlugInLoadFailed) { + // In cases where a Plug-in handles the load do not take any further + // action. + return; + } + + ui::PageTransition transition = navigationContext->GetPageTransition(); + if (error.code == web::kWebKitErrorUrlBlockedByContentFilter) { + DCHECK(provisionalLoad); + if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) { + // If URL is blocked due to Restriction, do not take any further + // action as WKWebView will show a built-in error. + if (!web::RequiresContentFilterBlockingWorkaround()) { + return; + } else if (!PageTransitionIsNewNavigation(transition)) { + if (transition & ui::PAGE_TRANSITION_RELOAD) { + self.webStateImpl->SetIsLoading(false); + } + return; + } + } else if (web::features::StorePendingItemInContext()) { + if (transition & ui::PAGE_TRANSITION_RELOAD && + !(transition & ui::PAGE_TRANSITION_FORWARD_BACK)) { + // There is no pending item for reload (see crbug.com/676129). So + // the is nothing to do. + DCHECK(!self.navigationManagerImpl->GetPendingItem()); + } else { + // A new or back-forward navigation, which requires navigation item + // commit. + DCHECK(self.navigationManagerImpl->GetPendingItem()); + DCHECK(transition & ui::PAGE_TRANSITION_FORWARD_BACK || + PageTransitionIsNewNavigation(transition)); + self.navigationManagerImpl->CommitPendingItem( + navigationContext->ReleaseItem()); + } + // WKWebView will show the error page, so no further action is required. + return; + } + } + + if (error.code == web::kWebKitErrorFrameLoadInterruptedByPolicyChange) { + // This method should not be called if the navigation was cancelled by + // embedder. + DCHECK(self.pendingNavigationInfo && + !self.pendingNavigationInfo.cancelled); + + // Handle Frame Load Interrupted errors from WebView. This block is + // executed when web controller rejected the load inside + // decidePolicyForNavigationResponse: to handle download or WKWebView + // opened a Universal Link. + if (!navigationContext->IsDownload()) { + // Non-download navigation was cancelled because WKWebView has opened a + // Universal Link and called webView:didFailProvisionalNavigation:. + self.navigationManagerImpl->DiscardNonCommittedItems(); + } + self.webStateImpl->SetIsLoading(false); + return; + } + } + + web::NavigationManager* navManager = + self.webStateImpl->GetNavigationManager(); + web::NavigationItem* lastCommittedItem = navManager->GetLastCommittedItem(); + if (lastCommittedItem) { + // Reset SSL status for last committed navigation to avoid showing security + // status for error pages. + if (!lastCommittedItem->GetSSL().Equals(web::SSLStatus())) { + lastCommittedItem->GetSSL() = web::SSLStatus(); + self.webStateImpl->DidChangeVisibleSecurityState(); + } + } + + web::NavigationItemImpl* item = + web::GetItemWithUniqueID(self.navigationManagerImpl, navigationContext); + + if (item) { + GURL errorURL = + net::GURLWithNSURL(error.userInfo[NSURLErrorFailingURLErrorKey]); + web::ErrorRetryCommand command = web::ErrorRetryCommand::kDoNothing; + if (provisionalLoad) { + command = item->error_retry_state_machine().DidFailProvisionalNavigation( + net::GURLWithNSURL(webView.URL), errorURL); + } else { + command = item->error_retry_state_machine().DidFailNavigation( + net::GURLWithNSURL(webView.URL), errorURL); + } + [self handleErrorRetryCommand:command + navigationItem:item + navigationContext:navigationContext + originalNavigation:navigation + webView:webView]; + } + + // Don't commit the pending item or call OnNavigationFinished until the + // placeholder navigation finishes loading. +} + +// Handles cancelled load in WKWebView (error with NSURLErrorCancelled code). +- (void)handleCancelledError:(NSError*)error + forNavigation:(WKNavigation*)navigation + provisionalLoad:(BOOL)provisionalLoad { + web::NavigationContextImpl* navigationContext = + [self.navigationStates contextForNavigation:navigation]; + if ([self shouldCancelLoadForCancelledError:error + provisionalLoad:provisionalLoad]) { + [self loadCancelled]; + self.navigationManagerImpl->DiscardNonCommittedItems(); + + [self.legacyNativeContentController + handleCancelledErrorForContext:navigationContext]; + + if (provisionalLoad) { + self.webStateImpl->OnNavigationFinished(navigationContext); + } + } else if (!provisionalLoad) { + web::NavigationItemImpl* item = + web::GetItemWithUniqueID(self.navigationManagerImpl, navigationContext); + if (item) { + // Since the navigation has already been committed, it will retain its + // back / forward item even though the load has been cancelled. Update the + // error state machine so that if future loads of this item fail, the same + // item will be reused for the error view rather than loading a + // placeholder URL into a new navigation item, since the latter would + // destroy the forward list. + item->error_retry_state_machine().SetNoNavigationError(); + } + } +} + +// Executes the command specified by the ErrorRetryStateMachine. +- (void)handleErrorRetryCommand:(web::ErrorRetryCommand)command + navigationItem:(web::NavigationItemImpl*)item + navigationContext:(web::NavigationContextImpl*)context + originalNavigation:(WKNavigation*)originalNavigation + webView:(WKWebView*)webView { + if (command == web::ErrorRetryCommand::kDoNothing) + return; + + DCHECK_EQ(item->GetUniqueID(), context->GetNavigationItemUniqueID()); + switch (command) { + case web::ErrorRetryCommand::kLoadPlaceholder: { + // This case only happens when a new request failed in provisional + // navigation. Disassociate the navigation context from the original + // request and resuse it for the placeholder navigation. + std::unique_ptr<web::NavigationContextImpl> originalContext = + [self.navigationStates removeNavigation:originalNavigation]; + [self loadPlaceholderInWebViewForURL:item->GetURL() + rendererInitiated:context->IsRendererInitiated() + forContext:std::move(originalContext)]; + } break; + + case web::ErrorRetryCommand::kLoadErrorView: + [self loadErrorPageForNavigationItem:item + navigationContext:context + webView:webView]; + break; + + case web::ErrorRetryCommand::kReload: + [webView reload]; + break; + + case web::ErrorRetryCommand::kRewriteToWebViewURL: { + std::unique_ptr<web::NavigationContextImpl> navigationContext = + [self.delegate navigationHandler:self + registerLoadRequestForURL:item->GetURL() + sameDocumentNavigation:NO + hasUserGesture:NO + rendererInitiated:context->IsRendererInitiated() + placeholderNavigation:NO]; + WKNavigation* navigation = + [webView loadHTMLString:@"" + baseURL:net::NSURLWithGURL(item->GetURL())]; + navigationContext->SetError(context->GetError()); + navigationContext->SetIsPost(context->IsPost()); + [self.navigationStates setContext:std::move(navigationContext) + forNavigation:navigation]; + } break; + + case web::ErrorRetryCommand::kRewriteToPlaceholderURL: { + std::unique_ptr<web::NavigationContextImpl> originalContext = + [self.navigationStates removeNavigation:originalNavigation]; + originalContext->SetPlaceholderNavigation(YES); + GURL placeholderURL = CreatePlaceholderUrlForUrl(item->GetURL()); + + WKNavigation* navigation = + [webView loadHTMLString:@"" + baseURL:net::NSURLWithGURL(placeholderURL)]; + [self.navigationStates setContext:std::move(originalContext) + forNavigation:navigation]; + } break; + + case web::ErrorRetryCommand::kDoNothing: + NOTREACHED(); + } +} + +// Used to decide whether a load that generates errors with the +// NSURLErrorCancelled code should be cancelled. +- (BOOL)shouldCancelLoadForCancelledError:(NSError*)error + provisionalLoad:(BOOL)provisionalLoad { + DCHECK(error.code == NSURLErrorCancelled || + error.code == web::kWebKitErrorFrameLoadInterruptedByPolicyChange); + // Do not cancel the load if it is for an app specific URL, as such errors + // are produced during the app specific URL load process. + const GURL errorURL = + net::GURLWithNSURL(error.userInfo[NSURLErrorFailingURLErrorKey]); + if (web::GetWebClient()->IsAppSpecificURL(errorURL)) + return NO; + + return provisionalLoad; +} + +// Loads the error page. +- (void)loadErrorPageForNavigationItem:(web::NavigationItemImpl*)item + navigationContext:(web::NavigationContextImpl*)context + webView:(WKWebView*)webView { + const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); + NSError* error = context->GetError(); + DCHECK(error); + DCHECK_EQ(item->GetUniqueID(), context->GetNavigationItemUniqueID()); + + if (web::IsWKWebViewSSLCertError(error)) { + // This could happen only if certificate is absent or could not be parsed. + error = web::NetErrorFromError(error, net::ERR_SSL_SERVER_CERT_BAD_FORMAT); +#if defined(DEBUG) + net::SSLInfo info; + web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); + CHECK(!error.cert); +#endif + } else { + error = web::NetErrorFromError(error); + } + NSString* failingURLString = + error.userInfo[NSURLErrorFailingURLStringErrorKey]; + GURL failingURL(base::SysNSStringToUTF8(failingURLString)); + NSString* errorHTML = nil; + web::GetWebClient()->PrepareErrorPage( + self.webStateImpl, failingURL, error, context->IsPost(), + self.webStateImpl->GetBrowserState()->IsOffTheRecord(), &errorHTML); + + WKNavigation* navigation = + [webView loadHTMLString:errorHTML baseURL:net::NSURLWithGURL(failingURL)]; + + auto loadHTMLContext = web::NavigationContextImpl::CreateNavigationContext( + self.webStateImpl, failingURL, + /*has_user_gesture=*/false, ui::PAGE_TRANSITION_FIRST, + /*is_renderer_initiated=*/false); + loadHTMLContext->SetLoadingErrorPage(true); + loadHTMLContext->SetNavigationItemUniqueID(item->GetUniqueID()); + + [self.navigationStates setContext:std::move(loadHTMLContext) + forNavigation:navigation]; + [self.navigationStates setState:web::WKNavigationState::REQUESTED + forNavigation:navigation]; + + // TODO(crbug.com/803503): only call these for placeholder navigation because + // they should have already been triggered during navigation commit for + // failures that happen after commit. + [self.delegate navigationHandlerDidStartLoading:self]; + self.navigationManagerImpl->CommitPendingItem(context->ReleaseItem()); + web::NavigationItem* lastCommittedItem = + self.navigationManagerImpl->GetLastCommittedItem(); + [self.delegate navigationHandler:self + setDocumentURL:lastCommittedItem->GetURL() + context:context]; + + // If |context| is a placeholder navigation, this is the second part of the + // error page load for a provisional load failure. Rewrite the context URL to + // actual URL and trigger the deferred |OnNavigationFinished| callback. This + // is also needed if |context| is not yet committed, which can happen on a + // reload/back/forward load that failed in provisional navigation. + if (context->IsPlaceholderNavigation() || !context->HasCommitted()) { + context->SetUrl(item->GetURL()); + context->SetPlaceholderNavigation(false); + context->SetHasCommitted(true); + self.webStateImpl->OnNavigationFinished(context); + } + + [self.delegate navigationHandler:self + didCompleteLoadWithSuccess:NO + forContext:context]; + self.webStateImpl->SetIsLoading(false); + self.webStateImpl->OnPageLoaded(failingURL, NO); +} + #pragma mark - Public methods - (void)stopLoading { @@ -1546,13 +1973,14 @@ self.pendingNavigationInfo.cancelled = YES; _safeBrowsingWarningDetectionTimer.Stop(); [self loadCancelled]; + _certVerificationErrors->Clear(); } - (void)loadCancelled { // TODO(crbug.com/821995): Check if this function should be removed. if (self.navigationState != web::WKNavigationState::FINISHED) { self.navigationState = web::WKNavigationState::FINISHED; - if (![self.delegate navigationHandlerWebViewIsHalted:self]) { + if (![self.delegate navigationHandlerWebViewBeingDestroyed:self]) { self.webStateImpl->SetIsLoading(false); } } @@ -1717,4 +2145,53 @@ } } +- (web::NavigationContextImpl*) + loadPlaceholderInWebViewForURL:(const GURL&)originalURL + rendererInitiated:(BOOL)rendererInitiated + forContext:(std::unique_ptr<web::NavigationContextImpl>) + originalContext { + GURL placeholderURL = CreatePlaceholderUrlForUrl(originalURL); + // TODO(crbug.com/956511): Remove this code when NativeContent support is + // removed. + WKWebView* webView = + [self.delegate navigationHandlerEnsureWebViewCreated:self]; + + NSURLRequest* request = + [NSURLRequest requestWithURL:net::NSURLWithGURL(placeholderURL)]; + WKNavigation* navigation = [webView loadRequest:request]; + + NSError* error = originalContext ? originalContext->GetError() : nil; + if (web::RequiresContentFilterBlockingWorkaround() && + [error.domain isEqual:base::SysUTF8ToNSString(web::kWebKitErrorDomain)] && + error.code == web::kWebKitErrorUrlBlockedByContentFilter) { + GURL currentWKItemURL = + net::GURLWithNSURL(webView.backForwardList.currentItem.URL); + if (currentWKItemURL.SchemeIs(url::kAboutScheme)) { + // WKWebView will pass nil WKNavigation objects to WKNavigationDelegate + // callback for this navigation. TODO(crbug.com/954332): Remove the + // workaround when https://bugs.webkit.org/show_bug.cgi?id=196930 is + // fixed. + navigation = nil; + } + } + + [self.navigationStates setState:web::WKNavigationState::REQUESTED + forNavigation:navigation]; + std::unique_ptr<web::NavigationContextImpl> navigationContext; + if (originalContext) { + navigationContext = std::move(originalContext); + navigationContext->SetPlaceholderNavigation(YES); + } else { + navigationContext = [self.delegate navigationHandler:self + registerLoadRequestForURL:originalURL + sameDocumentNavigation:NO + hasUserGesture:NO + rendererInitiated:rendererInitiated + placeholderNavigation:YES]; + } + [self.navigationStates setContext:std::move(navigationContext) + forNavigation:navigation]; + return [self.navigationStates contextForNavigation:navigation]; +} + @end
diff --git a/ios/web/test/fakes/crw_fake_nsurl_session_task.h b/ios/web/test/fakes/crw_fake_nsurl_session_task.h index e34a29a..5d5fe620 100644 --- a/ios/web/test/fakes/crw_fake_nsurl_session_task.h +++ b/ios/web/test/fakes/crw_fake_nsurl_session_task.h
@@ -21,7 +21,7 @@ @property(nonatomic, nullable, copy) NSURLResponse* response; - (nullable instancetype)initWithURL:(NSURL*)URL NS_DESIGNATED_INITIALIZER; -- (nullable instancetype)init NS_UNAVAILABLE; +- (nonnull instancetype)init NS_UNAVAILABLE; @end
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index d5456bb..196e05a 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -171,11 +171,6 @@ BACK_FORWARD_NAVIGATION_TYPE_COUNT }; -// Maximum number of errors to store in cert verification errors cache. -// Cache holds errors only for pending navigations, so the actual number of -// stored errors is not expected to be high. -const web::CertVerificationErrorsCacheType::size_type kMaxCertErrorsCount = 100; - // URLs that are fed into UIWebView as history push/replace get escaped, // potentially changing their format. Code that attempts to determine whether a // URL hasn't changed can be confused by those differences though, so method @@ -210,7 +205,6 @@ // and after web usage was disabled. Used by |-loadCurrentURLIfNecessary| to // prevent extra loads. BOOL _currentURLLoadWasTrigerred; - BOOL _isHalted; // YES if halted. Halting happens prior to destruction. BOOL _isBeingDestroyed; // YES if in the process of closing. // The actual URL of the document object (i.e., the last committed URL). // TODO(crbug.com/549616): Remove this in favor of just updating the @@ -246,13 +240,6 @@ // Navigation Items. CRWCertVerificationController* _certVerificationController; - // CertVerification errors which happened inside - // |webView:didReceiveAuthenticationChallenge:completionHandler:|. - // Key is leaf-cert/host pair. This storage is used to carry calculated - // cert status from |didReceiveAuthenticationChallenge:| to - // |didFailProvisionalNavigation:| delegate method. - std::unique_ptr<web::CertVerificationErrorsCacheType> _certVerificationErrors; - // State of user interaction with web content. web::UserInteractionState _userInteractionState; } @@ -336,26 +323,6 @@ // Returns a NSMutableURLRequest that represents the current NavigationItem. - (NSMutableURLRequest*)requestForCurrentNavigationItem; -// Loads a blank page directly into WKWebView as a placeholder for a Native View -// or WebUI URL. This page has the URL about:blank?for=<encoded original URL>. -// If |originalContext| is provided, reuse it for the placeholder navigation -// instead of creating a new one. See "Handling App-specific URLs" -// section of go/bling-navigation-experiment for details. -- (web::NavigationContextImpl*) - loadPlaceholderInWebViewForURL:(const GURL&)originalURL - rendererInitiated:(BOOL)rendererInitiated - forContext:(std::unique_ptr<web::NavigationContextImpl>) - originalContext; -// Executes the command specified by the ErrorRetryStateMachine. -- (void)handleErrorRetryCommand:(web::ErrorRetryCommand)command - navigationItem:(web::NavigationItemImpl*)item - navigationContext:(web::NavigationContextImpl*)context - originalNavigation:(WKNavigation*)originalNavigation; -// Loads the error page. -- (void)loadErrorPageForNavigationItem:(web::NavigationItemImpl*)item - navigationContext:(web::NavigationContextImpl*)context; -// Aborts any load for both the web view and web controller. -- (void)abortLoad; // Called following navigation completion to generate final navigation lifecycle // events. Navigation is considered complete when the document has finished // loading, or when other page load mechanics are completed on a @@ -427,9 +394,6 @@ // Updates SSL status for the current navigation item based on the information // provided by web view. - (void)updateSSLStatusForCurrentNavigationItem; -// Called when a load ends in an SSL error and certificate chain. -- (void)handleSSLCertError:(NSError*)error - forNavigation:(WKNavigation*)navigation; // Loads request for the URL of the current navigation item. Subclasses may // choose to build a new NSURLRequest and call |loadRequest| on the underlying // web view, or use native web view navigation where possible (for example, @@ -470,9 +434,6 @@ web::BrowserState* browserState = _webStateImpl->GetBrowserState(); _certVerificationController = [[CRWCertVerificationController alloc] initWithBrowserState:browserState]; - _certVerificationErrors = - std::make_unique<web::CertVerificationErrorsCacheType>( - kMaxCertErrorsCount); web::BrowsingDataRemover::FromBrowserState(browserState)->AddObserver(self); web::WebFramesManagerImpl::CreateForWebState(_webStateImpl); web::FindInPageManagerImpl::CreateForWebState(_webStateImpl); @@ -777,9 +738,6 @@ // Stop doing stuff, especially network stuff. Close the request tracker. - (void)terminateNetworkActivity { - DCHECK(!_isHalted); - _isHalted = YES; - // Cancel all outstanding perform requests, and clear anything already queued // (since this may be called from within the handling loop) to prevent any // asynchronous JavaScript invocation handling from continuing. @@ -800,9 +758,7 @@ self.swipeRecognizerProvider = nil; [self.legacyNativeController close]; - if (!_isHalted) { - [self terminateNetworkActivity]; - } + [self terminateNetworkActivity]; // Mark the destruction sequence has started, in case someone else holds a // strong reference and tries to continue using the tab. @@ -936,9 +892,10 @@ - (void)stopLoading { base::RecordAction(base::UserMetricsAction("Stop")); // Discard the pending and transient entried before notifying the tab model - // observers of the change via |-abortLoad|. + // observers of the change. self.navigationManagerImpl->DiscardNonCommittedItems(); - [self abortLoad]; + [self.webView stopLoading]; + [self.navigationHandler stopLoading]; [self.legacyNativeController stopLoading]; } @@ -966,10 +923,11 @@ // Abort any outstanding page load. This ensures the delegate gets informed // about the outgoing page, and further messages from the page are suppressed. if (self.navigationHandler.navigationState != - web::WKNavigationState::FINISHED) - [self abortLoad]; + web::WKNavigationState::FINISHED) { + [self.webView stopLoading]; + [self.navigationHandler stopLoading]; + } - DCHECK(!_isHalted); self.webStateImpl->ClearTransientContent(); web::NavigationItem* item = self.currentNavItem; @@ -1141,7 +1099,7 @@ - (void)wasHidden { self.visible = NO; - if (_isHalted) + if (_isBeingDestroyed) return; [self recordStateInHistory]; [self.legacyNativeController wasHidden]; @@ -1762,62 +1720,8 @@ return request; } -- (web::NavigationContextImpl*) - loadPlaceholderInWebViewForURL:(const GURL&)originalURL - rendererInitiated:(BOOL)rendererInitiated - forContext:(std::unique_ptr<web::NavigationContextImpl>) - originalContext { - GURL placeholderURL = CreatePlaceholderUrlForUrl(originalURL); - [self ensureWebViewCreated]; - - NSURLRequest* request = - [NSURLRequest requestWithURL:net::NSURLWithGURL(placeholderURL)]; - WKNavigation* navigation = [self.webView loadRequest:request]; - - NSError* error = originalContext ? originalContext->GetError() : nil; - if (web::RequiresContentFilterBlockingWorkaround() && - [error.domain isEqual:base::SysUTF8ToNSString(web::kWebKitErrorDomain)] && - error.code == web::kWebKitErrorUrlBlockedByContentFilter) { - GURL currentWKItemURL = - net::GURLWithNSURL(self.webView.backForwardList.currentItem.URL); - if (currentWKItemURL.SchemeIs(url::kAboutScheme)) { - // WKWebView will pass nil WKNavigation objects to WKNavigationDelegate - // callback for this navigation. TODO(crbug.com/954332): Remove the - // workaround when https://bugs.webkit.org/show_bug.cgi?id=196930 is - // fixed. - navigation = nil; - } - } - - [self.navigationHandler.navigationStates - setState:web::WKNavigationState::REQUESTED - forNavigation:navigation]; - std::unique_ptr<web::NavigationContextImpl> navigationContext; - if (originalContext) { - navigationContext = std::move(originalContext); - navigationContext->SetPlaceholderNavigation(YES); - } else { - navigationContext = [self registerLoadRequestForURL:originalURL - sameDocumentNavigation:NO - hasUserGesture:NO - rendererInitiated:rendererInitiated - placeholderNavigation:YES]; - } - [self.navigationHandler.navigationStates - setContext:std::move(navigationContext) - forNavigation:navigation]; - return - [self.navigationHandler.navigationStates contextForNavigation:navigation]; -} - #pragma mark - End of loading -- (void)abortLoad { - [self.webView stopLoading]; - [self.navigationHandler stopLoading]; - _certVerificationErrors->Clear(); -} - - (void)didFinishNavigation:(web::NavigationContextImpl*)context { // This can be called at multiple times after the document has loaded. Do // nothing if the document has already loaded. @@ -1909,142 +1813,6 @@ self.webStateImpl->OnPageLoaded(currentURL, YES); } -#pragma mark - Error Helpers - -- (void)loadErrorPageForNavigationItem:(web::NavigationItemImpl*)item - navigationContext:(web::NavigationContextImpl*)context { - const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); - NSError* error = context->GetError(); - DCHECK(error); - DCHECK_EQ(item->GetUniqueID(), context->GetNavigationItemUniqueID()); - - if (web::IsWKWebViewSSLCertError(error)) { - // This could happen only if certificate is absent or could not be parsed. - error = web::NetErrorFromError(error, net::ERR_SSL_SERVER_CERT_BAD_FORMAT); -#if defined(DEBUG) - net::SSLInfo info; - web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); - CHECK(!error.cert); -#endif - } else { - error = web::NetErrorFromError(error); - } - NSString* failingURLString = - error.userInfo[NSURLErrorFailingURLStringErrorKey]; - GURL failingURL(base::SysNSStringToUTF8(failingURLString)); - NSString* errorHTML = nil; - web::GetWebClient()->PrepareErrorPage( - self.webStateImpl, failingURL, error, context->IsPost(), - self.webStateImpl->GetBrowserState()->IsOffTheRecord(), &errorHTML); - - WKNavigation* navigation = - [self.webView loadHTMLString:errorHTML - baseURL:net::NSURLWithGURL(failingURL)]; - - auto loadHTMLContext = web::NavigationContextImpl::CreateNavigationContext( - self.webStateImpl, failingURL, - /*has_user_gesture=*/false, ui::PAGE_TRANSITION_FIRST, - /*is_renderer_initiated=*/false); - loadHTMLContext->SetLoadingErrorPage(true); - loadHTMLContext->SetNavigationItemUniqueID(item->GetUniqueID()); - - [self.navigationHandler.navigationStates setContext:std::move(loadHTMLContext) - forNavigation:navigation]; - [self.navigationHandler.navigationStates - setState:web::WKNavigationState::REQUESTED - forNavigation:navigation]; - - // TODO(crbug.com/803503): only call these for placeholder navigation because - // they should have already been triggered during navigation commit for - // failures that happen after commit. - [self didStartLoading]; - self.navigationManagerImpl->CommitPendingItem(context->ReleaseItem()); - web::NavigationItem* lastCommittedItem = - self.navigationManagerImpl->GetLastCommittedItem(); - [self setDocumentURL:lastCommittedItem->GetURL() context:context]; - - // If |context| is a placeholder navigation, this is the second part of the - // error page load for a provisional load failure. Rewrite the context URL to - // actual URL and trigger the deferred |OnNavigationFinished| callback. This - // is also needed if |context| is not yet committed, which can happen on a - // reload/back/forward load that failed in provisional navigation. - if (context->IsPlaceholderNavigation() || !context->HasCommitted()) { - context->SetUrl(item->GetURL()); - context->SetPlaceholderNavigation(false); - context->SetHasCommitted(true); - self.webStateImpl->OnNavigationFinished(context); - } - - [self loadCompleteWithSuccess:NO forContext:context]; - self.webStateImpl->SetIsLoading(false); - self.webStateImpl->OnPageLoaded(failingURL, NO); -} - -- (void)handleErrorRetryCommand:(web::ErrorRetryCommand)command - navigationItem:(web::NavigationItemImpl*)item - navigationContext:(web::NavigationContextImpl*)context - originalNavigation:(WKNavigation*)originalNavigation { - if (command == web::ErrorRetryCommand::kDoNothing) - return; - - DCHECK_EQ(item->GetUniqueID(), context->GetNavigationItemUniqueID()); - switch (command) { - case web::ErrorRetryCommand::kLoadPlaceholder: { - // This case only happens when a new request failed in provisional - // navigation. Disassociate the navigation context from the original - // request and resuse it for the placeholder navigation. - std::unique_ptr<web::NavigationContextImpl> originalContext = - [self.navigationHandler.navigationStates - removeNavigation:originalNavigation]; - [self loadPlaceholderInWebViewForURL:item->GetURL() - rendererInitiated:context->IsRendererInitiated() - forContext:std::move(originalContext)]; - } break; - - case web::ErrorRetryCommand::kLoadErrorView: - [self loadErrorPageForNavigationItem:item navigationContext:context]; - break; - - case web::ErrorRetryCommand::kReload: - [self.webView reload]; - break; - - case web::ErrorRetryCommand::kRewriteToWebViewURL: { - std::unique_ptr<web::NavigationContextImpl> navigationContext = - [self registerLoadRequestForURL:item->GetURL() - sameDocumentNavigation:NO - hasUserGesture:NO - rendererInitiated:context->IsRendererInitiated() - placeholderNavigation:NO]; - WKNavigation* navigation = - [self.webView loadHTMLString:@"" - baseURL:net::NSURLWithGURL(item->GetURL())]; - navigationContext->SetError(context->GetError()); - navigationContext->SetIsPost(context->IsPost()); - [self.navigationHandler.navigationStates - setContext:std::move(navigationContext) - forNavigation:navigation]; - } break; - - case web::ErrorRetryCommand::kRewriteToPlaceholderURL: { - std::unique_ptr<web::NavigationContextImpl> originalContext = - [self.navigationHandler.navigationStates - removeNavigation:originalNavigation]; - originalContext->SetPlaceholderNavigation(YES); - GURL placeholderURL = CreatePlaceholderUrlForUrl(item->GetURL()); - - WKNavigation* navigation = - [self.webView loadHTMLString:@"" - baseURL:net::NSURLWithGURL(placeholderURL)]; - [self.navigationHandler.navigationStates - setContext:std::move(originalContext) - forNavigation:navigation]; - } break; - - case web::ErrorRetryCommand::kDoNothing: - NOTREACHED(); - } -} #pragma mark - BrowsingDataRemoverObserver @@ -2202,9 +1970,10 @@ rendererInitiated:(BOOL)rendererInitiated forContext:(std::unique_ptr<web::NavigationContextImpl>) originalContext { - return [self loadPlaceholderInWebViewForURL:originalURL - rendererInitiated:rendererInitiated - forContext:std::move(originalContext)]; + return [self.navigationHandler + loadPlaceholderInWebViewForURL:originalURL + rendererInitiated:rendererInitiated + forContext:std::move(originalContext)]; } - (std::unique_ptr<web::NavigationContextImpl>) @@ -3108,94 +2877,6 @@ hasOnlySecureContent:hasOnlySecureContent]; } -- (void)handleSSLCertError:(NSError*)error - forNavigation:(WKNavigation*)navigation { - CHECK(web::IsWKWebViewSSLCertError(error)); - - net::SSLInfo info; - web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); - - if (!info.cert) { - // |info.cert| can be null if certChain in NSError is empty or can not be - // parsed, in this case do not ask delegate if error should be allowed, it - // should not be. - [self handleLoadError:error forNavigation:navigation provisionalLoad:YES]; - return; - } - - // Retrieve verification results from _certVerificationErrors cache to avoid - // unnecessary recalculations. Verification results are cached for the leaf - // cert, because the cert chain in |didReceiveAuthenticationChallenge:| is - // the OS constructed chain, while |chain| is the chain from the server. - NSArray* chain = error.userInfo[web::kNSErrorPeerCertificateChainKey]; - NSURL* requestURL = error.userInfo[web::kNSErrorFailingURLKey]; - NSString* host = [requestURL host]; - scoped_refptr<net::X509Certificate> leafCert; - bool recoverable = false; - if (chain.count && host.length) { - // The complete cert chain may not be available, so the leaf cert is used - // as a key to retrieve _certVerificationErrors, as well as for storing the - // cert decision. - leafCert = web::CreateCertFromChain(@[ chain.firstObject ]); - if (leafCert) { - auto error = _certVerificationErrors->Get( - {leafCert, base::SysNSStringToUTF8(host)}); - bool cacheHit = error != _certVerificationErrors->end(); - if (cacheHit) { - recoverable = error->second.is_recoverable; - info.cert_status = error->second.status; - } - UMA_HISTOGRAM_BOOLEAN("WebController.CertVerificationErrorsCacheHit", - cacheHit); - } - } - - // If the current navigation item is in error state, update the error retry - // state machine to indicate that SSL interstitial error will be displayed to - // make sure subsequent back/forward navigation to this item starts with the - // correct error retry state. - web::NavigationContextImpl* context = - [self.navigationHandler.navigationStates contextForNavigation:navigation]; - if (context) { - if (web::features::StorePendingItemInContext()) { - // This NavigationContext will be destroyed, so return pending item - // ownership to NavigationManager. NavigationContext can only own pending - // item until the navigation has committed or aborted. - self.navigationManagerImpl->SetPendingItem(context->ReleaseItem()); - } - web::NavigationItemImpl* item = - web::GetItemWithUniqueID(self.navigationManagerImpl, context); - if (item && item->error_retry_state_machine().state() == - web::ErrorRetryState::kRetryFailedNavigationItem) { - item->error_retry_state_machine().SetDisplayingWebError(); - } - } - - // Ask web client if this cert error should be allowed. - web::GetWebClient()->AllowCertificateError( - self.webStateImpl, net::MapCertStatusToNetError(info.cert_status), info, - net::GURLWithNSURL(requestURL), recoverable, - base::BindRepeating(^(bool proceed) { - if (proceed) { - DCHECK(recoverable); - [_certVerificationController allowCert:leafCert - forHost:host - status:info.cert_status]; - self.webStateImpl->GetSessionCertificatePolicyCacheImpl() - .RegisterAllowedCertificate( - leafCert, base::SysNSStringToUTF8(host), info.cert_status); - // New navigation is a different navigation from the original one. - // The new navigation is always browser-initiated and happens when - // the browser allows to proceed with the load. - [self loadCurrentURLWithRendererInitiatedNavigation:NO]; - } else { - [self.legacyNativeController handleSSLError]; - } - })); - - [self.navigationHandler loadCancelled]; -} - #pragma mark - WebView Helpers // Creates a container view if it's not yet created. @@ -3312,8 +2993,9 @@ self.webStateImpl->CancelDialogs(); self.navigationManagerImpl->DetachFromWebView(); - [self abortLoad]; + [self.webView stopLoading]; [self.webView removeFromSuperview]; + [self.navigationHandler stopLoading]; [_containerView resetContent]; [self setWebView:nil]; @@ -3424,189 +3106,6 @@ _pageHasZoomed = NO; } -// Called when a load ends in an error. -- (void)handleLoadError:(NSError*)error - forNavigation:(WKNavigation*)navigation - provisionalLoad:(BOOL)provisionalLoad { - if (error.code == NSURLErrorCancelled) { - [self handleCancelledError:error - forNavigation:navigation - provisionalLoad:provisionalLoad]; - // TODO(crbug.com/957032): This might get fixed at some point. Check if - // there is a iOS version for which we don't need it any more. - if (@available(iOS 12.2, *)) { - if (![self.webView.backForwardList.currentItem.URL - isEqual:self.webView.URL] && - [self.navigationHandler isCurrentNavigationItemPOST]) { - UMA_HISTOGRAM_BOOLEAN("WebController.BackForwardListOutOfSync", true); - // Sometimes on error the backForward list is out of sync with the - // webView, go back or forward to fix it. See crbug.com/951880. - if ([self.webView.backForwardList.backItem.URL - isEqual:self.webView.URL]) { - [self.webView goBack]; - } else if ([self.webView.backForwardList.forwardItem.URL - isEqual:self.webView.URL]) { - [self.webView goForward]; - } - } - } - // NSURLErrorCancelled errors that aren't handled by aborting the load will - // automatically be retried by the web view, so early return in this case. - return; - } - - web::NavigationContextImpl* navigationContext = - [self.navigationHandler.navigationStates contextForNavigation:navigation]; - navigationContext->SetError(error); - navigationContext->SetIsPost( - [self.navigationHandler isCurrentNavigationItemPOST]); - // TODO(crbug.com/803631) DCHECK that self.currentNavItem is the navigation - // item associated with navigationContext. - - if ([error.domain isEqual:base::SysUTF8ToNSString(web::kWebKitErrorDomain)]) { - if (error.code == web::kWebKitErrorPlugInLoadFailed) { - // In cases where a Plug-in handles the load do not take any further - // action. - return; - } - - ui::PageTransition transition = navigationContext->GetPageTransition(); - if (error.code == web::kWebKitErrorUrlBlockedByContentFilter) { - DCHECK(provisionalLoad); - if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) { - // If URL is blocked due to Restriction, do not take any further - // action as WKWebView will show a built-in error. - if (!web::RequiresContentFilterBlockingWorkaround()) { - return; - } else if (!PageTransitionIsNewNavigation(transition)) { - if (transition & ui::PAGE_TRANSITION_RELOAD) { - self.webStateImpl->SetIsLoading(false); - } - return; - } - } else if (web::features::StorePendingItemInContext()) { - if (transition & ui::PAGE_TRANSITION_RELOAD && - !(transition & ui::PAGE_TRANSITION_FORWARD_BACK)) { - // There is no pending item for reload (see crbug.com/676129). So - // the is nothing to do. - DCHECK(!self.navigationManagerImpl->GetPendingItem()); - } else { - // A new or back-forward navigation, which requires navigation item - // commit. - DCHECK(self.navigationManagerImpl->GetPendingItem()); - DCHECK(transition & ui::PAGE_TRANSITION_FORWARD_BACK || - PageTransitionIsNewNavigation(transition)); - self.navigationManagerImpl->CommitPendingItem( - navigationContext->ReleaseItem()); - } - // WKWebView will show the error page, so no further action is required. - return; - } - } - - if (error.code == web::kWebKitErrorFrameLoadInterruptedByPolicyChange) { - // This method should not be called if the navigation was cancelled by - // embedder. - DCHECK(self.navigationHandler.pendingNavigationInfo && - !self.navigationHandler.pendingNavigationInfo.cancelled); - - // Handle Frame Load Interrupted errors from WebView. This block is - // executed when web controller rejected the load inside - // decidePolicyForNavigationResponse: to handle download or WKWebView - // opened a Universal Link. - if (!navigationContext->IsDownload()) { - // Non-download navigation was cancelled because WKWebView has opened a - // Universal Link and called webView:didFailProvisionalNavigation:. - self.navigationManagerImpl->DiscardNonCommittedItems(); - } - self.webStateImpl->SetIsLoading(false); - return; - } - } - - NavigationManager* navManager = self.webState->GetNavigationManager(); - web::NavigationItem* lastCommittedItem = navManager->GetLastCommittedItem(); - if (lastCommittedItem) { - // Reset SSL status for last committed navigation to avoid showing security - // status for error pages. - if (!lastCommittedItem->GetSSL().Equals(web::SSLStatus())) { - lastCommittedItem->GetSSL() = web::SSLStatus(); - self.webStateImpl->DidChangeVisibleSecurityState(); - } - } - - web::NavigationItemImpl* item = - web::GetItemWithUniqueID(self.navigationManagerImpl, navigationContext); - - if (item) { - GURL errorURL = - net::GURLWithNSURL(error.userInfo[NSURLErrorFailingURLErrorKey]); - web::ErrorRetryCommand command = web::ErrorRetryCommand::kDoNothing; - if (provisionalLoad) { - command = item->error_retry_state_machine().DidFailProvisionalNavigation( - net::GURLWithNSURL(self.webView.URL), errorURL); - } else { - command = item->error_retry_state_machine().DidFailNavigation( - net::GURLWithNSURL(self.webView.URL), errorURL); - } - [self handleErrorRetryCommand:command - navigationItem:item - navigationContext:navigationContext - originalNavigation:navigation]; - } - - // Don't commit the pending item or call OnNavigationFinished until the - // placeholder navigation finishes loading. -} - -// Handles cancelled load in WKWebView (error with NSURLErrorCancelled code). -- (void)handleCancelledError:(NSError*)error - forNavigation:(WKNavigation*)navigation - provisionalLoad:(BOOL)provisionalLoad { - web::NavigationContextImpl* navigationContext = - [self.navigationHandler.navigationStates contextForNavigation:navigation]; - if ([self shouldCancelLoadForCancelledError:error - provisionalLoad:provisionalLoad]) { - [self.navigationHandler loadCancelled]; - self.navigationManagerImpl->DiscardNonCommittedItems(); - - [self.legacyNativeController - handleCancelledErrorForContext:navigationContext]; - - if (provisionalLoad) { - self.webStateImpl->OnNavigationFinished(navigationContext); - } - } else if (!provisionalLoad) { - web::NavigationItemImpl* item = - web::GetItemWithUniqueID(self.navigationManagerImpl, navigationContext); - if (item) { - // Since the navigation has already been committed, it will retain its - // back / forward item even though the load has been cancelled. Update the - // error state machine so that if future loads of this item fail, the same - // item will be reused for the error view rather than loading a - // placeholder URL into a new navigation item, since the latter would - // destroy the forward list. - item->error_retry_state_machine().SetNoNavigationError(); - } - } -} - -// Used to decide whether a load that generates errors with the -// NSURLErrorCancelled code should be cancelled. -- (BOOL)shouldCancelLoadForCancelledError:(NSError*)error - provisionalLoad:(BOOL)provisionalLoad { - DCHECK(error.code == NSURLErrorCancelled || - error.code == web::kWebKitErrorFrameLoadInterruptedByPolicyChange); - // Do not cancel the load if it is for an app specific URL, as such errors - // are produced during the app specific URL load process. - const GURL errorURL = - net::GURLWithNSURL(error.userInfo[NSURLErrorFailingURLErrorKey]); - if (web::GetWebClient()->IsAppSpecificURL(errorURL)) - return NO; - - return provisionalLoad; -} - #pragma mark - CRWSSLStatusUpdaterDataSource - (void)SSLStatusUpdater:(CRWSSLStatusUpdater*)SSLStatusUpdater @@ -4103,11 +3602,6 @@ #pragma mark - CRWWKNavigationHandlerDelegate -- (BOOL)navigationHandlerWebViewIsHalted: - (CRWWKNavigationHandler*)navigationHandler { - return _isHalted; -} - - (BOOL)navigationHandlerWebViewBeingDestroyed: (CRWWKNavigationHandler*)navigationHandler { return _isBeingDestroyed; @@ -4134,12 +3628,6 @@ return self.legacyNativeController; } -- (web::CertVerificationErrorsCacheType*) - certVerificationErrorsForNavigationHandler: - (CRWWKNavigationHandler*)navigationHandler { - return _certVerificationErrors.get(); -} - - (CRWCertVerificationController*) certVerificationControllerForNavigationHandler: (CRWWKNavigationHandler*)navigationHandler { @@ -4161,11 +3649,6 @@ [self stopLoading]; } -- (void)navigationHandlerAbortLoading: - (CRWWKNavigationHandler*)navigationHandler { - [self abortLoad]; -} - - (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler setDocumentURL:(const GURL&)newURL context:(web::NavigationContextImpl*)context { @@ -4196,29 +3679,6 @@ placeholderNavigation:placeholderNavigation]; } -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleCancelledError:(NSError*)error - forNavigation:(WKNavigation*)navigation - provisionalLoad:(BOOL)provisionalLoad { - [self handleCancelledError:error - forNavigation:navigation - provisionalLoad:provisionalLoad]; -} - -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleSSLCertError:(NSError*)error - forNavigation:(WKNavigation*)navigation { - [self handleSSLCertError:error forNavigation:navigation]; -} - -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleLoadError:(NSError*)error - forNavigation:(WKNavigation*)navigation - provisionalLoad:(BOOL)provisionalLoad { - [self handleLoadError:error - forNavigation:navigation - provisionalLoad:provisionalLoad]; -} - (void)navigationHandlerRemoveAllWebFrames: (CRWWKNavigationHandler*)navigationHandler { [self removeAllWebFrames]; @@ -4255,17 +3715,6 @@ } - (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler - handleErrorRetryCommand:(web::ErrorRetryCommand)command - navigationItem:(web::NavigationItemImpl*)item - navigationContext:(web::NavigationContextImpl*)context - originalNavigation:(WKNavigation*)originalNavigation { - [self handleErrorRetryCommand:command - navigationItem:item - navigationContext:context - originalNavigation:originalNavigation]; -} - -- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler didFinishNavigation:(web::NavigationContextImpl*)context { [self didFinishNavigation:context]; } @@ -4282,6 +3731,23 @@ self.webStateImpl->OnRenderProcessGone(); } +- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler + loadCurrentURLWithRendererInitiatedNavigation:(BOOL)rendererInitiated { + [self loadCurrentURLWithRendererInitiatedNavigation:rendererInitiated]; +} + +- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler + didCompleteLoadWithSuccess:(BOOL)loadSuccess + forContext:(web::NavigationContextImpl*)context { + [self loadCompleteWithSuccess:loadSuccess forContext:context]; +} + +- (WKWebView*)navigationHandlerEnsureWebViewCreated: + (CRWWKNavigationHandler*)navigationHandler { + [self ensureWebViewCreated]; + return self.webView; +} + #pragma mark - Testing-Only Methods - (void)injectWebViewContentView:(CRWWebViewContentView*)webViewContentView {
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java index e695617..1e158b7 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -18,6 +18,7 @@ import android.support.annotation.IntDef; import android.support.annotation.Nullable; +import org.chromium.base.BuildInfo; import org.chromium.base.Log; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; @@ -434,6 +435,8 @@ if (Build.MODEL.equals("Nexus Player")) { return false; } + } else if (mime.equals("video/av01")) { + if (!BuildInfo.isAtLeastQ()) return false; } else if (mime.equals("audio/opus") && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return false;
diff --git a/media/base/android/media_codec_util.cc b/media/base/android/media_codec_util.cc index a6d6ee7..2c45991 100644 --- a/media/base/android/media_codec_util.cc +++ b/media/base/android/media_codec_util.cc
@@ -47,6 +47,7 @@ const char kHevcMimeType[] = "video/hevc"; const char kVp8MimeType[] = "video/x-vnd.on2.vp8"; const char kVp9MimeType[] = "video/x-vnd.on2.vp9"; +const char kAv1MimeType[] = "video/av01"; } // namespace static CodecProfileLevel MediaCodecProfileLevelToChromiumProfileLevel( @@ -63,8 +64,8 @@ static bool IsSupportedAndroidMimeType(const std::string& mime_type) { std::vector<std::string> supported{ - kMp3MimeType, kAacMimeType, kOpusMimeType, kVorbisMimeType, - kAvcMimeType, kHevcMimeType, kVp8MimeType, kVp9MimeType}; + kMp3MimeType, kAacMimeType, kOpusMimeType, kVorbisMimeType, kAvcMimeType, + kHevcMimeType, kVp8MimeType, kVp9MimeType, kAv1MimeType}; return std::find(supported.begin(), supported.end(), mime_type) != supported.end(); } @@ -132,6 +133,8 @@ return kVp8MimeType; case kCodecVP9: return kVp9MimeType; + case kCodecAV1: + return kAv1MimeType; default: return std::string(); } @@ -339,6 +342,11 @@ } // static +bool MediaCodecUtil::IsAv1DecoderAvailable() { + return IsMediaCodecAvailable() && IsDecoderSupportedByDevice(kAv1MimeType); +} + +// static bool MediaCodecUtil::IsH264EncoderAvailable() { return IsMediaCodecAvailable() && IsEncoderSupportedByDevice(kAvcMimeType); }
diff --git a/media/base/android/media_codec_util.h b/media/base/android/media_codec_util.h index c1b8c4be..3d34875 100644 --- a/media/base/android/media_codec_util.h +++ b/media/base/android/media_codec_util.h
@@ -78,6 +78,9 @@ // Indicates if the vp9 decoder is available on this device. static bool IsVp9DecoderAvailable(); + // Indicates if the av1 decoder is available on this device. + static bool IsAv1DecoderAvailable(); + // Indicates if the h264 encoder is available on this device. static bool IsH264EncoderAvailable();
diff --git a/media/base/supported_types.cc b/media/base/supported_types.cc index d6802e7..13d3fe51 100644 --- a/media/base/supported_types.cc +++ b/media/base/supported_types.cc
@@ -4,8 +4,8 @@ #include "media/base/supported_types.h" -#include "base/command_line.h" #include "base/feature_list.h" +#include "build/build_config.h" #include "media/base/media_client.h" #include "media/base/media_switches.h" #include "media/media_buildflags.h" @@ -16,6 +16,10 @@ #include "third_party/libvpx/source/libvpx/vpx/vpx_codec.h" #endif +#if defined(OS_ANDROID) +#include "base/android/build_info.h" +#endif + namespace media { bool IsSupportedAudioType(const AudioType& type) { @@ -232,11 +236,16 @@ switch (type.codec) { case media::kCodecAV1: + // If the AV1 decoder is enabled, or if we're on Q or later, yes. #if BUILDFLAG(ENABLE_AV1_DECODER) return IsColorSpaceSupported(type.color_space); -#else - return false; +#elif defined(OS_ANDROID) + if (base::android::BuildInfo::GetInstance()->is_at_least_q() && + IsColorSpaceSupported(type.color_space)) { + return true; + } #endif + return false; case media::kCodecVP9: // Color management required for HDR to not look terrible.
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index e679efd..bb118ad 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -97,14 +97,14 @@ "android/android_video_surface_chooser.h", "android/android_video_surface_chooser_impl.cc", "android/android_video_surface_chooser_impl.h", - "android/avda_surface_bundle.cc", - "android/avda_surface_bundle.h", "android/codec_allocator.cc", "android/codec_allocator.h", "android/codec_image.cc", "android/codec_image.h", "android/codec_image_group.cc", "android/codec_image_group.h", + "android/codec_surface_bundle.cc", + "android/codec_surface_bundle.h", "android/codec_wrapper.cc", "android/codec_wrapper.h", "android/device_info.cc",
diff --git a/media/gpu/android/avda_surface_bundle.cc b/media/gpu/android/avda_surface_bundle.cc deleted file mode 100644 index 3ae0e80..0000000 --- a/media/gpu/android/avda_surface_bundle.cc +++ /dev/null
@@ -1,71 +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. - -#include "media/gpu/android/avda_surface_bundle.h" - -#include "base/bind.h" -#include "base/threading/sequenced_task_runner_handle.h" -#include "media/base/android/android_overlay.h" - -namespace media { - -AVDASurfaceBundle::AVDASurfaceBundle() - : RefCountedDeleteOnSequence<AVDASurfaceBundle>( - base::SequencedTaskRunnerHandle::Get()), - weak_factory_(this) {} - -AVDASurfaceBundle::AVDASurfaceBundle(std::unique_ptr<AndroidOverlay> overlay) - : RefCountedDeleteOnSequence<AVDASurfaceBundle>( - base::SequencedTaskRunnerHandle::Get()), - overlay(std::move(overlay)), - weak_factory_(this) {} - -AVDASurfaceBundle::AVDASurfaceBundle(scoped_refptr<TextureOwner> texture_owner) - : RefCountedDeleteOnSequence<AVDASurfaceBundle>( - base::SequencedTaskRunnerHandle::Get()), - texture_owner_(std::move(texture_owner)), - texture_owner_surface(texture_owner_->CreateJavaSurface()), - weak_factory_(this) {} - -AVDASurfaceBundle::~AVDASurfaceBundle() { - // Explicitly free the surface first, just to be sure that it's deleted before - // the TextureOwner is. - texture_owner_surface = gl::ScopedJavaSurface(); - - // Also release the back buffers. - if (texture_owner_) { - auto task_runner = texture_owner_->task_runner(); - if (task_runner->RunsTasksInCurrentSequence()) { - texture_owner_->ReleaseBackBuffers(); - } else { - task_runner->PostTask( - FROM_HERE, base::BindRepeating(&TextureOwner::ReleaseBackBuffers, - texture_owner_)); - } - } -} - -const base::android::JavaRef<jobject>& AVDASurfaceBundle::GetJavaSurface() - const { - if (overlay) - return overlay->GetJavaSurface(); - else - return texture_owner_surface.j_surface(); -} - -AVDASurfaceBundle::ScheduleLayoutCB AVDASurfaceBundle::GetScheduleLayoutCB() { - return base::BindRepeating(&AVDASurfaceBundle::ScheduleLayout, - weak_factory_.GetWeakPtr()); -} - -void AVDASurfaceBundle::ScheduleLayout(gfx::Rect rect) { - if (layout_rect_ == rect) - return; - layout_rect_ = rect; - - if (overlay) - overlay->ScheduleLayout(rect); -} - -} // namespace media
diff --git a/media/gpu/android/avda_surface_bundle.h b/media/gpu/android/avda_surface_bundle.h deleted file mode 100644 index 4772a76..0000000 --- a/media/gpu/android/avda_surface_bundle.h +++ /dev/null
@@ -1,63 +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. - -#ifndef MEDIA_GPU_ANDROID_AVDA_SURFACE_BUNDLE_H_ -#define MEDIA_GPU_ANDROID_AVDA_SURFACE_BUNDLE_H_ - -#include "base/memory/ref_counted_delete_on_sequence.h" -#include "media/base/android/android_overlay.h" -#include "media/gpu/android/surface_texture_gl_owner.h" -#include "media/gpu/media_gpu_export.h" -#include "ui/gl/android/scoped_java_surface.h" - -namespace media { - -// AVDASurfaceBundle is a Java surface, and the TextureOwner or Overlay that -// backs it. -// -// Once a MediaCodec is configured with an output surface, the corresponding -// AVDASurfaceBundle should be kept alive as long as the codec to prevent -// crashes due to the codec losing its output surface. -// TODO(watk): Remove AVDA from the name. -struct MEDIA_GPU_EXPORT AVDASurfaceBundle - : public base::RefCountedDeleteOnSequence<AVDASurfaceBundle> { - public: - using ScheduleLayoutCB = base::RepeatingCallback<void(gfx::Rect)>; - - // Create an empty bundle to be manually populated. - explicit AVDASurfaceBundle(); - explicit AVDASurfaceBundle(std::unique_ptr<AndroidOverlay> overlay); - explicit AVDASurfaceBundle(scoped_refptr<TextureOwner> texture_owner); - - const base::android::JavaRef<jobject>& GetJavaSurface() const; - - // Returns a callback that can be used to position this overlay. It must be - // called on the correct thread for the overlay. It will not keep a ref to - // |this|; the cb will do nothing if |this| is destroyed. - ScheduleLayoutCB GetScheduleLayoutCB(); - - // The Overlay or TextureOwner. - std::unique_ptr<AndroidOverlay> overlay; - scoped_refptr<TextureOwner> texture_owner_; - - // The Java surface for |texture_owner_|. - gl::ScopedJavaSurface texture_owner_surface; - - private: - ~AVDASurfaceBundle(); - friend class base::RefCountedDeleteOnSequence<AVDASurfaceBundle>; - friend class base::DeleteHelper<AVDASurfaceBundle>; - - void ScheduleLayout(gfx::Rect rect); - - // The last updated layout rect position for the |overlay|. - gfx::Rect layout_rect_; - base::WeakPtrFactory<AVDASurfaceBundle> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(AVDASurfaceBundle); -}; - -} // namespace media - -#endif // MEDIA_GPU_ANDROID_AVDA_SURFACE_BUNDLE_H_
diff --git a/media/gpu/android/codec_allocator.cc b/media/gpu/android/codec_allocator.cc index 5d3660d..b65ada28 100644 --- a/media/gpu/android/codec_allocator.cc +++ b/media/gpu/android/codec_allocator.cc
@@ -206,22 +206,6 @@ return threads_[task_type]->thread.task_runner(); } -std::unique_ptr<MediaCodecBridge> CodecAllocator::CreateMediaCodecSync( - scoped_refptr<CodecConfig> codec_config) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - - auto task_type = - TaskTypeForAllocation(codec_config->software_codec_forbidden); - if (!task_type) - return nullptr; - - auto codec = CreateMediaCodecInternal(factory_cb_, codec_config, - task_type == SW_CODEC); - if (codec) - codec_task_types_[codec.get()] = *task_type; - return codec; -} - void CodecAllocator::CreateMediaCodecAsync( base::WeakPtr<CodecAllocatorClient> client, scoped_refptr<CodecConfig> codec_config) { @@ -282,7 +266,7 @@ scoped_refptr<base::SequencedTaskRunner> client_task_runner, base::WeakPtr<CodecAllocatorClient> client, TaskType task_type, - scoped_refptr<AVDASurfaceBundle> surface_bundle, + scoped_refptr<CodecSurfaceBundle> surface_bundle, std::unique_ptr<MediaCodecBridge> media_codec) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); @@ -317,7 +301,7 @@ CodecAllocator::MediaCodecAndSurface::MediaCodecAndSurface( std::unique_ptr<MediaCodecBridge> codec, - scoped_refptr<AVDASurfaceBundle> surface) + scoped_refptr<CodecSurfaceBundle> surface) : media_codec(std::move(codec)), surface_bundle(std::move(surface)) {} CodecAllocator::MediaCodecAndSurface::~MediaCodecAndSurface() { @@ -353,7 +337,7 @@ void CodecAllocator::ReleaseMediaCodec( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) { + scoped_refptr<CodecSurfaceBundle> surface_bundle) { DCHECK(media_codec); if (!task_runner_->RunsTasksInCurrentSequence()) { @@ -375,14 +359,14 @@ // Save a waitable event for the release if the codec is attached to an // overlay so we can block on it in WaitForPendingReleaseForTesting(). base::WaitableEvent* released_event = nullptr; - if (surface_bundle->overlay) { + if (surface_bundle->overlay()) { pending_codec_releases_.emplace( std::piecewise_construct, - std::forward_as_tuple(surface_bundle->overlay.get()), + std::forward_as_tuple(surface_bundle->overlay()), std::forward_as_tuple(base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent::InitialState::NOT_SIGNALED)); released_event = - &pending_codec_releases_.find(surface_bundle->overlay.get())->second; + &pending_codec_releases_.find(surface_bundle->overlay())->second; } // Note that we forward |surface_bundle|, too, so that the surface outlasts @@ -405,11 +389,11 @@ } void CodecAllocator::OnMediaCodecReleased( - scoped_refptr<AVDASurfaceBundle> surface_bundle) { + scoped_refptr<CodecSurfaceBundle> surface_bundle) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); // This is a no-op if it's a non overlay bundle. - pending_codec_releases_.erase(surface_bundle->overlay.get()); + pending_codec_releases_.erase(surface_bundle->overlay()); } bool CodecAllocator::IsAnyRegisteredAVDA() {
diff --git a/media/gpu/android/codec_allocator.h b/media/gpu/android/codec_allocator.h index b53a489..c98e8ad 100644 --- a/media/gpu/android/codec_allocator.h +++ b/media/gpu/android/codec_allocator.h
@@ -26,7 +26,7 @@ #include "media/base/android/media_crypto_context.h" #include "media/base/media.h" #include "media/base/video_codecs.h" -#include "media/gpu/android/avda_surface_bundle.h" +#include "media/gpu/android/codec_surface_bundle.h" #include "media/gpu/media_gpu_export.h" #include "ui/gfx/geometry/size.h" #include "ui/gl/android/scoped_java_surface.h" @@ -54,7 +54,7 @@ VideoCodec codec = kUnknownVideoCodec; // The surface that MediaCodec is configured to output to. - scoped_refptr<AVDASurfaceBundle> surface_bundle; + scoped_refptr<CodecSurfaceBundle> surface_bundle; // The MediaCrypto that MediaCodec is configured with for an encrypted stream. JavaObjectPtr media_crypto; @@ -110,7 +110,7 @@ // |media_codec| will be null if configuration failed. virtual void OnCodecConfigured( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) = 0; + scoped_refptr<CodecSurfaceBundle> surface_bundle) = 0; protected: ~CodecAllocatorClient() {} @@ -144,10 +144,6 @@ virtual void StartThread(CodecAllocatorClient* client); virtual void StopThread(CodecAllocatorClient* client); - // Create and configure a MediaCodec synchronously. - virtual std::unique_ptr<MediaCodecBridge> CreateMediaCodecSync( - scoped_refptr<CodecConfig> codec_config); - // Create and configure a MediaCodec asynchronously. The result is delivered // via OnCodecConfigured(). virtual void CreateMediaCodecAsync(base::WeakPtr<CodecAllocatorClient> client, @@ -161,7 +157,7 @@ // that it outlives |media_codec|. virtual void ReleaseMediaCodec( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle); + scoped_refptr<CodecSurfaceBundle> surface_bundle); // Return true if and only if there is any AVDA registered. bool IsAnyRegisteredAVDA(); @@ -186,10 +182,10 @@ // destruction to the right thread. struct MediaCodecAndSurface { MediaCodecAndSurface(std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle); + scoped_refptr<CodecSurfaceBundle> surface_bundle); ~MediaCodecAndSurface(); std::unique_ptr<MediaCodecBridge> media_codec; - scoped_refptr<AVDASurfaceBundle> surface_bundle; + scoped_refptr<CodecSurfaceBundle> surface_bundle; }; // Forward |media_codec|, which is configured to output to |surface_bundle|, @@ -200,7 +196,7 @@ scoped_refptr<base::SequencedTaskRunner> client_task_runner, base::WeakPtr<CodecAllocatorClient> client, TaskType task_type, - scoped_refptr<AVDASurfaceBundle> surface_bundle, + scoped_refptr<CodecSurfaceBundle> surface_bundle, std::unique_ptr<MediaCodecBridge> media_codec); // Forward |surface_bundle| and |media_codec| to |client| on the right thread @@ -262,7 +258,7 @@ // |surface_bundle| is the surface bundle that the codec was using. It's // important to pass this through to ensure a) it outlives the codec, and b) // it's deleted on the right thread. - void OnMediaCodecReleased(scoped_refptr<AVDASurfaceBundle> surface_bundle); + void OnMediaCodecReleased(scoped_refptr<CodecSurfaceBundle> surface_bundle); // Stop the thread indicated by |index|. This signals stop_event_for_testing_ // after both threads are stopped.
diff --git a/media/gpu/android/codec_allocator_unittest.cc b/media/gpu/android/codec_allocator_unittest.cc index b13d79e..1406d52 100644 --- a/media/gpu/android/codec_allocator_unittest.cc +++ b/media/gpu/android/codec_allocator_unittest.cc
@@ -59,7 +59,7 @@ MOCK_METHOD1(OnCodecConfiguredMock, void(MediaCodecBridge* media_codec)); void OnCodecConfigured( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) override { + scoped_refptr<CodecSurfaceBundle> surface_bundle) override { media_codec_ = std::move(media_codec); OnCodecConfiguredMock(media_codec.get()); codec_arrived_event_.Signal(); @@ -138,7 +138,7 @@ allocator->WaitForPendingReleaseForTesting(overlay); return true; }, - allocator_, surface_bundle_->overlay.get())); + allocator_, surface_bundle_->overlay())); } protected: @@ -171,7 +171,7 @@ scoped_refptr<CodecConfig> codec_config(new CodecConfig); ON_CALL(*overlay, GetJavaSurface()) .WillByDefault(ReturnRef(null_java_ref_)); - surface_bundle_ = new AVDASurfaceBundle(std::move(overlay)); + surface_bundle_ = new CodecSurfaceBundle(std::move(overlay)); } void TearDown() override { @@ -280,7 +280,7 @@ NiceMock<MockClient>* avda3_ = &client3_; // Surface bundle that has an overlay. - scoped_refptr<AVDASurfaceBundle> surface_bundle_; + scoped_refptr<CodecSurfaceBundle> surface_bundle_; base::android::JavaRef<jobject> null_java_ref_; };
diff --git a/media/gpu/android/codec_image_group.cc b/media/gpu/android/codec_image_group.cc index 21b48b3a..97b6c0b 100644 --- a/media/gpu/android/codec_image_group.cc +++ b/media/gpu/android/codec_image_group.cc
@@ -6,20 +6,20 @@ #include "base/bind.h" #include "base/sequenced_task_runner.h" -#include "media/gpu/android/avda_surface_bundle.h" +#include "media/gpu/android/codec_surface_bundle.h" namespace media { CodecImageGroup::CodecImageGroup( scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<AVDASurfaceBundle> surface_bundle) + scoped_refptr<CodecSurfaceBundle> surface_bundle) : surface_bundle_(std::move(surface_bundle)), weak_this_factory_(this) { // If the surface bundle has an overlay, then register for destruction // callbacks. We thread-hop to the right thread, which means that we might // find out about destruction asynchronously. Remember that the wp will be // cleared on |task_runner|. - if (surface_bundle_->overlay) { - surface_bundle_->overlay->AddSurfaceDestroyedCallback(base::BindOnce( + if (surface_bundle_->overlay()) { + surface_bundle_->overlay()->AddSurfaceDestroyedCallback(base::BindOnce( [](scoped_refptr<base::SequencedTaskRunner> task_runner, base::OnceCallback<void(AndroidOverlay*)> cb, AndroidOverlay* overlay) -> void {
diff --git a/media/gpu/android/codec_image_group.h b/media/gpu/android/codec_image_group.h index e463c51..34470c2 100644 --- a/media/gpu/android/codec_image_group.h +++ b/media/gpu/android/codec_image_group.h
@@ -20,8 +20,8 @@ namespace media { class AndroidOverlay; -struct AVDASurfaceBundle; class CodecImage; +class CodecSurfaceBundle; // Object that lives on the GPU thread that knows about all CodecImages that // share the same bundle. We are responsible for keeping the surface bundle @@ -42,7 +42,7 @@ // any overlay it contains. All other access to this class will happen on // |task_runner|, including destruction. CodecImageGroup(scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<AVDASurfaceBundle> bundle); + scoped_refptr<CodecSurfaceBundle> bundle); // Set the callback that we'll notify when any image is destroyed. void SetDestructionCb(CodecImage::DestructionCb destruction_cb); @@ -63,7 +63,7 @@ private: // Remember that this lives on some other thread. Do not actually use it. - scoped_refptr<AVDASurfaceBundle> surface_bundle_; + scoped_refptr<CodecSurfaceBundle> surface_bundle_; // All the images that use |surface_bundle_|. std::unordered_set<CodecImage*> images_;
diff --git a/media/gpu/android/codec_image_group_unittest.cc b/media/gpu/android/codec_image_group_unittest.cc index d2b16eb..813d8f8 100644 --- a/media/gpu/android/codec_image_group_unittest.cc +++ b/media/gpu/android/codec_image_group_unittest.cc
@@ -12,7 +12,7 @@ #include "base/test/test_simple_task_runner.h" #include "base/threading/thread.h" #include "media/base/android/mock_android_overlay.h" -#include "media/gpu/android/avda_surface_bundle.h" +#include "media/gpu/android/codec_surface_bundle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -24,7 +24,7 @@ public: CodecImageGroupWithDestructionHook( scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<AVDASurfaceBundle> surface_bundle) + scoped_refptr<CodecSurfaceBundle> surface_bundle) : CodecImageGroup(std::move(task_runner), std::move(surface_bundle)) {} void SetDestructionCallback(base::OnceClosure cb) { @@ -67,11 +67,11 @@ void TearDown() override {} struct Record { - scoped_refptr<AVDASurfaceBundle> surface_bundle; + scoped_refptr<CodecSurfaceBundle> surface_bundle; scoped_refptr<CodecImageGroupWithDestructionHook> image_group; MockAndroidOverlay* overlay() const { - return static_cast<MockAndroidOverlay*>(surface_bundle->overlay.get()); + return static_cast<MockAndroidOverlay*>(surface_bundle->overlay()); } }; @@ -82,7 +82,7 @@ EXPECT_CALL(*overlay.get(), MockAddSurfaceDestroyedCallback()); Record rec; rec.surface_bundle = - base::MakeRefCounted<AVDASurfaceBundle>(std::move(overlay)); + base::MakeRefCounted<CodecSurfaceBundle>(std::move(overlay)); rec.image_group = base::MakeRefCounted<CodecImageGroupWithDestructionHook>( gpu_task_runner_, rec.surface_bundle); @@ -118,8 +118,8 @@ TEST_F(CodecImageGroupTest, SurfaceBundleWithoutOverlayDoesntCrash) { // Make sure that it's okay not to have an overlay. CodecImageGroup should // handle ST surface bundles without crashing. - scoped_refptr<AVDASurfaceBundle> surface_bundle = - base::MakeRefCounted<AVDASurfaceBundle>(); + scoped_refptr<CodecSurfaceBundle> surface_bundle = + base::MakeRefCounted<CodecSurfaceBundle>(); scoped_refptr<CodecImageGroup> image_group = base::MakeRefCounted<CodecImageGroup>(gpu_task_runner_, surface_bundle); // TODO(liberato): we should also make sure that adding an image doesn't call
diff --git a/media/gpu/android/codec_image_unittest.cc b/media/gpu/android/codec_image_unittest.cc index 42794da..7d68c6d6 100644 --- a/media/gpu/android/codec_image_unittest.cc +++ b/media/gpu/android/codec_image_unittest.cc
@@ -43,7 +43,7 @@ auto codec = std::make_unique<NiceMock<MockMediaCodecBridge>>(); codec_ = codec.get(); wrapper_ = std::make_unique<CodecWrapper>( - CodecSurfacePair(std::move(codec), new AVDASurfaceBundle()), + CodecSurfacePair(std::move(codec), new CodecSurfaceBundle()), base::DoNothing(), base::SequencedTaskRunnerHandle::Get()); ON_CALL(*codec_, DequeueOutputBuffer(_, _, _, _, _, _, _)) .WillByDefault(Return(MEDIA_CODEC_OK));
diff --git a/media/gpu/android/codec_surface_bundle.cc b/media/gpu/android/codec_surface_bundle.cc new file mode 100644 index 0000000..16093ae --- /dev/null +++ b/media/gpu/android/codec_surface_bundle.cc
@@ -0,0 +1,71 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/gpu/android/codec_surface_bundle.h" + +#include "base/bind.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "media/base/android/android_overlay.h" + +namespace media { + +CodecSurfaceBundle::CodecSurfaceBundle() + : RefCountedDeleteOnSequence<CodecSurfaceBundle>( + base::SequencedTaskRunnerHandle::Get()), + weak_factory_(this) {} + +CodecSurfaceBundle::CodecSurfaceBundle(std::unique_ptr<AndroidOverlay> overlay) + : RefCountedDeleteOnSequence<CodecSurfaceBundle>( + base::SequencedTaskRunnerHandle::Get()), + overlay_(std::move(overlay)), + weak_factory_(this) {} + +CodecSurfaceBundle::CodecSurfaceBundle( + scoped_refptr<TextureOwner> texture_owner) + : RefCountedDeleteOnSequence<CodecSurfaceBundle>( + base::SequencedTaskRunnerHandle::Get()), + texture_owner_(std::move(texture_owner)), + texture_owner_surface_(texture_owner_->CreateJavaSurface()), + weak_factory_(this) {} + +CodecSurfaceBundle::~CodecSurfaceBundle() { + // Explicitly free the surface first, just to be sure that it's deleted before + // the TextureOwner is. + texture_owner_surface_ = gl::ScopedJavaSurface(); + + // Also release the back buffers. + if (!texture_owner_) + return; + + auto task_runner = texture_owner_->task_runner(); + if (task_runner->RunsTasksInCurrentSequence()) { + texture_owner_->ReleaseBackBuffers(); + } else { + task_runner->PostTask( + FROM_HERE, + base::BindRepeating(&TextureOwner::ReleaseBackBuffers, texture_owner_)); + } +} + +const base::android::JavaRef<jobject>& CodecSurfaceBundle::GetJavaSurface() + const { + return overlay_ ? overlay_->GetJavaSurface() + : texture_owner_surface_.j_surface(); +} + +CodecSurfaceBundle::ScheduleLayoutCB CodecSurfaceBundle::GetScheduleLayoutCB() { + return base::BindRepeating(&CodecSurfaceBundle::ScheduleLayout, + weak_factory_.GetWeakPtr()); +} + +void CodecSurfaceBundle::ScheduleLayout(const gfx::Rect& rect) { + if (layout_rect_ == rect) + return; + layout_rect_ = rect; + + if (overlay_) + overlay_->ScheduleLayout(rect); +} + +} // namespace media
diff --git a/media/gpu/android/codec_surface_bundle.h b/media/gpu/android/codec_surface_bundle.h new file mode 100644 index 0000000..a8ee763bc --- /dev/null +++ b/media/gpu/android/codec_surface_bundle.h
@@ -0,0 +1,67 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_GPU_ANDROID_CODEC_SURFACE_BUNDLE_H_ +#define MEDIA_GPU_ANDROID_CODEC_SURFACE_BUNDLE_H_ + +#include "base/memory/ref_counted_delete_on_sequence.h" +#include "media/base/android/android_overlay.h" +#include "media/gpu/android/surface_texture_gl_owner.h" +#include "media/gpu/media_gpu_export.h" +#include "ui/gl/android/scoped_java_surface.h" + +namespace media { + +// CodecSurfaceBundle is a Java surface, and the TextureOwner or Overlay that +// backs it. +// +// Once a MediaCodec is configured with an output surface, the corresponding +// CodecSurfaceBundle should be kept alive as long as the codec to prevent +// crashes due to the codec losing its output surface. +class MEDIA_GPU_EXPORT CodecSurfaceBundle + : public base::RefCountedDeleteOnSequence<CodecSurfaceBundle> { + public: + using ScheduleLayoutCB = base::RepeatingCallback<void(const gfx::Rect&)>; + + // Create an empty bundle to be manually populated. + CodecSurfaceBundle(); + explicit CodecSurfaceBundle(std::unique_ptr<AndroidOverlay> overlay); + explicit CodecSurfaceBundle(scoped_refptr<TextureOwner> texture_owner); + + const base::android::JavaRef<jobject>& GetJavaSurface() const; + + // Returns a callback that can be used to position this overlay. It must be + // called on the correct thread for the overlay. It will not keep a ref to + // |this|; the cb will do nothing if |this| is destroyed. + ScheduleLayoutCB GetScheduleLayoutCB(); + + scoped_refptr<TextureOwner> texture_owner() const { return texture_owner_; } + AndroidOverlay* overlay() const { return overlay_.get(); } + + private: + ~CodecSurfaceBundle(); + friend class base::RefCountedDeleteOnSequence<CodecSurfaceBundle>; + friend class base::DeleteHelper<CodecSurfaceBundle>; + + void ScheduleLayout(const gfx::Rect& rect); + + // The Overlay or TextureOwner. + std::unique_ptr<AndroidOverlay> overlay_; + + scoped_refptr<TextureOwner> texture_owner_; + + // The Java surface for |texture_owner_|. + gl::ScopedJavaSurface texture_owner_surface_; + + // The last updated layout rect position for the |overlay|. + gfx::Rect layout_rect_; + + base::WeakPtrFactory<CodecSurfaceBundle> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(CodecSurfaceBundle); +}; + +} // namespace media + +#endif // MEDIA_GPU_ANDROID_CODEC_SURFACE_BUNDLE_H_
diff --git a/media/gpu/android/codec_wrapper.cc b/media/gpu/android/codec_wrapper.cc index 3da6c19..90eccf28 100644 --- a/media/gpu/android/codec_wrapper.cc +++ b/media/gpu/android/codec_wrapper.cc
@@ -40,8 +40,8 @@ bool IsDrained() const; bool SupportsFlush(DeviceInfo* device_info) const; bool Flush(); - bool SetSurface(scoped_refptr<AVDASurfaceBundle> surface_bundle); - scoped_refptr<AVDASurfaceBundle> SurfaceBundle(); + bool SetSurface(scoped_refptr<CodecSurfaceBundle> surface_bundle); + scoped_refptr<CodecSurfaceBundle> SurfaceBundle(); QueueStatus QueueInputBuffer(const DecoderBuffer& buffer, const EncryptionScheme& encryption_scheme); DequeueStatus DequeueOutputBuffer( @@ -74,7 +74,7 @@ std::unique_ptr<MediaCodecBridge> codec_; // The currently configured surface. - scoped_refptr<AVDASurfaceBundle> surface_bundle_; + scoped_refptr<CodecSurfaceBundle> surface_bundle_; // Buffer ids are unique for a given CodecWrapper and map to MediaCodec buffer // indices. @@ -359,7 +359,7 @@ } bool CodecWrapperImpl::SetSurface( - scoped_refptr<AVDASurfaceBundle> surface_bundle) { + scoped_refptr<CodecSurfaceBundle> surface_bundle) { DVLOG(2) << __func__; base::AutoLock l(lock_); DCHECK(surface_bundle); @@ -373,7 +373,7 @@ return true; } -scoped_refptr<AVDASurfaceBundle> CodecWrapperImpl::SurfaceBundle() { +scoped_refptr<CodecSurfaceBundle> CodecWrapperImpl::SurfaceBundle() { base::AutoLock l(lock_); return surface_bundle_; } @@ -487,11 +487,12 @@ codec_buffer); } -bool CodecWrapper::SetSurface(scoped_refptr<AVDASurfaceBundle> surface_bundle) { +bool CodecWrapper::SetSurface( + scoped_refptr<CodecSurfaceBundle> surface_bundle) { return impl_->SetSurface(std::move(surface_bundle)); } -scoped_refptr<AVDASurfaceBundle> CodecWrapper::SurfaceBundle() { +scoped_refptr<CodecSurfaceBundle> CodecWrapper::SurfaceBundle() { return impl_->SurfaceBundle(); }
diff --git a/media/gpu/android/codec_wrapper.h b/media/gpu/android/codec_wrapper.h index 865d18a..4ac14173 100644 --- a/media/gpu/android/codec_wrapper.h +++ b/media/gpu/android/codec_wrapper.h
@@ -17,7 +17,7 @@ #include "base/synchronization/lock.h" #include "media/base/android/media_codec_bridge.h" #include "media/base/decoder_buffer.h" -#include "media/gpu/android/avda_surface_bundle.h" +#include "media/gpu/android/codec_surface_bundle.h" #include "media/gpu/android/device_info.h" #include "media/gpu/media_gpu_export.h" @@ -25,7 +25,7 @@ class CodecWrapperImpl; using CodecSurfacePair = std::pair<std::unique_ptr<MediaCodecBridge>, - scoped_refptr<AVDASurfaceBundle>>; + scoped_refptr<CodecSurfaceBundle>>; // A MediaCodec output buffer that can be released on any thread. Releasing a // CodecOutputBuffer implicitly discards all CodecOutputBuffers that @@ -110,11 +110,11 @@ bool Flush(); // Sets the given surface and returns true on success. - bool SetSurface(scoped_refptr<AVDASurfaceBundle> surface_bundle); + bool SetSurface(scoped_refptr<CodecSurfaceBundle> surface_bundle); // Returns the surface bundle that the codec is currently configured with. // Returns null after TakeCodecSurfacePair() is called. - scoped_refptr<AVDASurfaceBundle> SurfaceBundle(); + scoped_refptr<CodecSurfaceBundle> SurfaceBundle(); // Queues |buffer| if the codec has an available input buffer. enum class QueueStatus { kOk, kError, kTryAgainLater, kNoKey };
diff --git a/media/gpu/android/codec_wrapper_unittest.cc b/media/gpu/android/codec_wrapper_unittest.cc index 222a567..2abcd6c 100644 --- a/media/gpu/android/codec_wrapper_unittest.cc +++ b/media/gpu/android/codec_wrapper_unittest.cc
@@ -34,7 +34,7 @@ CodecWrapperTest() : other_thread_("Other thread") { auto codec = std::make_unique<NiceMock<MockMediaCodecBridge>>(); codec_ = codec.get(); - surface_bundle_ = base::MakeRefCounted<AVDASurfaceBundle>(); + surface_bundle_ = base::MakeRefCounted<CodecSurfaceBundle>(); wrapper_ = std::make_unique<CodecWrapper>( CodecSurfacePair(std::move(codec), surface_bundle_), output_buffer_release_cb_.Get(), @@ -70,7 +70,7 @@ NiceMock<MockMediaCodecBridge>* codec_; std::unique_ptr<CodecWrapper> wrapper_; - scoped_refptr<AVDASurfaceBundle> surface_bundle_; + scoped_refptr<CodecSurfaceBundle> surface_bundle_; NiceMock<base::MockCallback<CodecWrapper::OutputReleasedCB>> output_buffer_release_cb_; scoped_refptr<DecoderBuffer> fake_decoder_buffer_; @@ -108,7 +108,7 @@ TEST_F(CodecWrapperTest, SetSurfaceInvalidatesCodecOutputBuffers) { auto codec_buffer = DequeueCodecOutputBuffer(); - wrapper_->SetSurface(base::MakeRefCounted<AVDASurfaceBundle>()); + wrapper_->SetSurface(base::MakeRefCounted<CodecSurfaceBundle>()); ASSERT_FALSE(codec_buffer->ReleaseToSurface()); } @@ -295,7 +295,7 @@ } TEST_F(CodecWrapperTest, SurfaceBundleIsUpdatedBySetSurface) { - auto new_bundle = base::MakeRefCounted<AVDASurfaceBundle>(); + auto new_bundle = base::MakeRefCounted<CodecSurfaceBundle>(); EXPECT_CALL(*codec_, SetSurface(_)).WillOnce(Return(true)); wrapper_->SetSurface(new_bundle); ASSERT_EQ(new_bundle.get(), wrapper_->SurfaceBundle());
diff --git a/media/gpu/android/device_info.cc b/media/gpu/android/device_info.cc index dbff9393..c5005f3 100644 --- a/media/gpu/android/device_info.cc +++ b/media/gpu/android/device_info.cc
@@ -15,17 +15,22 @@ } int DeviceInfo::SdkVersion() { - static int result = base::android::BuildInfo::GetInstance()->sdk_int(); + static const int result = base::android::BuildInfo::GetInstance()->sdk_int(); return result; } bool DeviceInfo::IsVp8DecoderAvailable() { - static bool result = MediaCodecUtil::IsVp8DecoderAvailable(); + static const bool result = MediaCodecUtil::IsVp8DecoderAvailable(); return result; } bool DeviceInfo::IsVp9DecoderAvailable() { - static bool result = MediaCodecUtil::IsVp9DecoderAvailable(); + static const bool result = MediaCodecUtil::IsVp9DecoderAvailable(); + return result; +} + +bool DeviceInfo::IsAv1DecoderAvailable() { + static const bool result = MediaCodecUtil::IsAv1DecoderAvailable(); return result; } @@ -35,12 +40,12 @@ } bool DeviceInfo::IsSetOutputSurfaceSupported() { - static bool result = MediaCodecUtil::IsSetOutputSurfaceSupported(); + static const bool result = MediaCodecUtil::IsSetOutputSurfaceSupported(); return result; } bool DeviceInfo::SupportsOverlaySurfaces() { - static bool result = MediaCodecUtil::IsSurfaceViewOutputSupported(); + static const bool result = MediaCodecUtil::IsSurfaceViewOutputSupported(); return result; }
diff --git a/media/gpu/android/device_info.h b/media/gpu/android/device_info.h index 095a5c1..487b1aa 100644 --- a/media/gpu/android/device_info.h +++ b/media/gpu/android/device_info.h
@@ -19,6 +19,7 @@ virtual int SdkVersion(); virtual bool IsVp8DecoderAvailable(); virtual bool IsVp9DecoderAvailable(); + virtual bool IsAv1DecoderAvailable(); virtual bool IsDecoderKnownUnaccelerated(VideoCodec codec); virtual bool IsSetOutputSurfaceSupported(); virtual bool SupportsOverlaySurfaces();
diff --git a/media/gpu/android/fake_codec_allocator.cc b/media/gpu/android/fake_codec_allocator.cc index 0bbd0a4..f20e9fa 100644 --- a/media/gpu/android/fake_codec_allocator.cc +++ b/media/gpu/android/fake_codec_allocator.cc
@@ -28,25 +28,6 @@ void FakeCodecAllocator::StopThread(CodecAllocatorClient* client) {} -std::unique_ptr<MediaCodecBridge> FakeCodecAllocator::CreateMediaCodecSync( - scoped_refptr<CodecConfig> config) { - CopyCodecConfig(config); - MockCreateMediaCodecSync(most_recent_overlay, most_recent_texture_owner); - - std::unique_ptr<MockMediaCodecBridge> codec; - if (allow_sync_creation) { - codec = std::make_unique<MockMediaCodecBridge>(); - most_recent_codec = codec.get(); - most_recent_codec_destruction_observer = codec->CreateDestructionObserver(); - most_recent_codec_destruction_observer->DoNotAllowDestruction(); - } else { - most_recent_codec = nullptr; - most_recent_codec_destruction_observer = nullptr; - } - - return std::move(codec); -} - void FakeCodecAllocator::CreateMediaCodecAsync( base::WeakPtr<CodecAllocatorClient> client, scoped_refptr<CodecConfig> config) { @@ -63,9 +44,9 @@ void FakeCodecAllocator::ReleaseMediaCodec( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) { - MockReleaseMediaCodec(media_codec.get(), surface_bundle->overlay.get(), - surface_bundle->texture_owner_.get()); + scoped_refptr<CodecSurfaceBundle> surface_bundle) { + MockReleaseMediaCodec(media_codec.get(), surface_bundle->overlay(), + surface_bundle->texture_owner().get()); } MockMediaCodecBridge* FakeCodecAllocator::ProvideMockCodecAsync( @@ -97,8 +78,8 @@ void FakeCodecAllocator::CopyCodecConfig(scoped_refptr<CodecConfig> config) { // CodecConfig isn't copyable, since it has unique_ptrs and such. - most_recent_overlay = config->surface_bundle->overlay.get(); - most_recent_texture_owner = config->surface_bundle->texture_owner_.get(); + most_recent_overlay = config->surface_bundle->overlay(); + most_recent_texture_owner = config->surface_bundle->texture_owner().get(); most_recent_config->media_crypto = config->media_crypto ? std::make_unique<base::android::ScopedJavaGlobalRef<jobject>>(
diff --git a/media/gpu/android/fake_codec_allocator.h b/media/gpu/android/fake_codec_allocator.h index 39e311b..e2a3714 100644 --- a/media/gpu/android/fake_codec_allocator.h +++ b/media/gpu/android/fake_codec_allocator.h
@@ -9,8 +9,8 @@ #include "base/sequenced_task_runner.h" #include "media/base/android/mock_media_codec_bridge.h" -#include "media/gpu/android/avda_surface_bundle.h" #include "media/gpu/android/codec_allocator.h" +#include "media/gpu/android/codec_surface_bundle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/android/surface_texture.h" @@ -30,7 +30,6 @@ // These are called with some parameters of the codec config by our // implementation of their respective functions. This allows tests to set // expectations on them. - MOCK_METHOD2(MockCreateMediaCodecSync, void(AndroidOverlay*, TextureOwner*)); MOCK_METHOD2(MockCreateMediaCodecAsync, void(AndroidOverlay*, TextureOwner*)); // Note that this doesn't exactly match the signature, since unique_ptr @@ -39,13 +38,11 @@ MOCK_METHOD3(MockReleaseMediaCodec, void(MediaCodecBridge*, AndroidOverlay*, TextureOwner*)); - std::unique_ptr<MediaCodecBridge> CreateMediaCodecSync( - scoped_refptr<CodecConfig> config) override; void CreateMediaCodecAsync(base::WeakPtr<CodecAllocatorClient> client, scoped_refptr<CodecConfig> config) override; void ReleaseMediaCodec( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) override; + scoped_refptr<CodecSurfaceBundle> surface_bundle) override; // Satisfies the pending codec creation with |codec| if given, or a new // MockMediaCodecBridge if not. Returns a raw pointer to the codec, or nullptr @@ -85,7 +82,7 @@ base::WeakPtr<CodecAllocatorClient> client_; // The surface bundle of the pending codec creation. - scoped_refptr<AVDASurfaceBundle> pending_surface_bundle_; + scoped_refptr<CodecSurfaceBundle> pending_surface_bundle_; DISALLOW_COPY_AND_ASSIGN(FakeCodecAllocator); };
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc index a63fa947..f483d64 100644 --- a/media/gpu/android/media_codec_video_decoder.cc +++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -81,6 +81,8 @@ return true; } + case kCodecAV1: + return device_info->IsAv1DecoderAvailable(); #if BUILDFLAG(USE_PROPRIETARY_CODECS) case kCodecH264: return true; @@ -163,6 +165,13 @@ true); // require_encrypted } + if (MediaCodecUtil::IsAv1DecoderAvailable()) { + supported_configs.emplace_back(AV1PROFILE_MIN, AV1PROFILE_MAX, + gfx::Size(0, 0), gfx::Size(3840, 2160), + true, // allow_encrypted + false); // require_encrypted + } + #if BUILDFLAG(USE_PROPRIETARY_CODECS) // MediaCodec is only guaranteed to support baseline, but some devices may // support others. Advertise support for all H.264 profiles and let the @@ -419,7 +428,7 @@ EnterTerminalState(State::kError); return; } - texture_owner_bundle_ = new AVDASurfaceBundle(std::move(texture_owner)); + texture_owner_bundle_ = new CodecSurfaceBundle(std::move(texture_owner)); // Overlays are disabled when |enable_threaded_texture_mailboxes| is true // (http://crbug.com/582170). @@ -467,7 +476,7 @@ overlay->AddSurfaceDestroyedCallback( base::Bind(&MediaCodecVideoDecoder::OnSurfaceDestroyed, weak_factory_.GetWeakPtr())); - target_surface_bundle_ = new AVDASurfaceBundle(std::move(overlay)); + target_surface_bundle_ = new CodecSurfaceBundle(std::move(overlay)); } else { target_surface_bundle_ = texture_owner_bundle_; } @@ -497,10 +506,8 @@ } // Reset the target bundle if it is the one being destroyed. - if (target_surface_bundle_ && - target_surface_bundle_->overlay.get() == overlay) { + if (target_surface_bundle_ && target_surface_bundle_->overlay() == overlay) target_surface_bundle_ = texture_owner_bundle_; - } // Transition the codec away from the overlay if necessary. if (SurfaceTransitionPending()) @@ -562,7 +569,7 @@ void MediaCodecVideoDecoder::OnCodecConfigured( std::unique_ptr<MediaCodecBridge> codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) { + scoped_refptr<CodecSurfaceBundle> surface_bundle) { DCHECK(!codec_); DCHECK_EQ(state_, State::kRunning); @@ -1027,7 +1034,7 @@ // inline L1 content will fall into this case. return BindToCurrentLoop(base::BindRepeating( [](base::WeakPtr<MediaCodecVideoDecoder> mcvd, - AVDASurfaceBundle::ScheduleLayoutCB layout_cb, + CodecSurfaceBundle::ScheduleLayoutCB layout_cb, PromotionHintAggregator::Hint hint) { // If we're promotable, and we have a surface bundle, then also // position the overlay. We could do this even if the overlay is @@ -1045,7 +1052,8 @@ } bool MediaCodecVideoDecoder::IsUsingOverlay() const { - return codec_ && codec_->SurfaceBundle() && codec_->SurfaceBundle()->overlay; + return codec_ && codec_->SurfaceBundle() && + codec_->SurfaceBundle()->overlay(); } void MediaCodecVideoDecoder::NotifyPromotionHint(
diff --git a/media/gpu/android/media_codec_video_decoder.h b/media/gpu/android/media_codec_video_decoder.h index abb5c63..329da3a 100644 --- a/media/gpu/android/media_codec_video_decoder.h +++ b/media/gpu/android/media_codec_video_decoder.h
@@ -151,7 +151,7 @@ // CodecAllocatorClient implementation. void OnCodecConfigured( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<AVDASurfaceBundle> surface_bundle) override; + scoped_refptr<CodecSurfaceBundle> surface_bundle) override; // Flushes the codec, or if flush() is not supported, releases it and creates // a new one. @@ -250,11 +250,11 @@ // reflects the latest surface choice by |surface_chooser_|. If the codec is // configured with some other surface, then a transition is pending. It's // non-null from the first surface choice. - scoped_refptr<AVDASurfaceBundle> target_surface_bundle_; + scoped_refptr<CodecSurfaceBundle> target_surface_bundle_; // A TextureOwner bundle that is kept for the lifetime of MCVD so that if we // have to synchronously switch surfaces we always have one available. - scoped_refptr<AVDASurfaceBundle> texture_owner_bundle_; + scoped_refptr<CodecSurfaceBundle> texture_owner_bundle_; // A callback for requesting overlay info updates. RequestOverlayInfoCB request_overlay_info_cb_;
diff --git a/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc index 145dd8b..2c347d9 100644 --- a/media/gpu/android/media_codec_video_decoder_unittest.cc +++ b/media/gpu/android/media_codec_video_decoder_unittest.cc
@@ -59,7 +59,7 @@ class MockVideoFrameFactory : public VideoFrameFactory { public: MOCK_METHOD2(Initialize, void(OverlayMode overlay_mode, InitCb init_cb)); - MOCK_METHOD1(MockSetSurfaceBundle, void(scoped_refptr<AVDASurfaceBundle>)); + MOCK_METHOD1(MockSetSurfaceBundle, void(scoped_refptr<CodecSurfaceBundle>)); MOCK_METHOD5( MockCreateVideoFrame, void(CodecOutputBuffer* raw_output_buffer, @@ -72,13 +72,13 @@ MOCK_METHOD0(CancelPendingCallbacks, void()); void SetSurfaceBundle( - scoped_refptr<AVDASurfaceBundle> surface_bundle) override { + scoped_refptr<CodecSurfaceBundle> surface_bundle) override { MockSetSurfaceBundle(surface_bundle); if (!surface_bundle) { texture_owner_ = nullptr; } else { texture_owner_ = - surface_bundle->overlay ? nullptr : surface_bundle->texture_owner_; + surface_bundle->overlay() ? nullptr : surface_bundle->texture_owner(); } } @@ -312,6 +312,10 @@ ASSERT_FALSE(Initialize(TestVideoConfig::Normal())); } +TEST_P(MediaCodecVideoDecoderH264Test, Av1IsSupported) { + ASSERT_TRUE(Initialize(TestVideoConfig::Normal(kCodecAV1))); +} + TEST_P(MediaCodecVideoDecoderTest, InitializeDoesntInitSurfaceOrCodec) { CreateMcvd(); EXPECT_CALL(*video_frame_factory_, Initialize(ExpectedOverlayMode(), _))
diff --git a/media/gpu/android/mock_device_info.cc b/media/gpu/android/mock_device_info.cc index c3a9aa0..14a668e 100644 --- a/media/gpu/android/mock_device_info.cc +++ b/media/gpu/android/mock_device_info.cc
@@ -16,6 +16,7 @@ .WillByDefault(Return(base::android::SDK_VERSION_MARSHMALLOW)); ON_CALL(*this, IsVp8DecoderAvailable()).WillByDefault(Return(true)); ON_CALL(*this, IsVp9DecoderAvailable()).WillByDefault(Return(true)); + ON_CALL(*this, IsAv1DecoderAvailable()).WillByDefault(Return(true)); ON_CALL(*this, IsDecoderKnownUnaccelerated(_)).WillByDefault(Return(false)); ON_CALL(*this, IsSetOutputSurfaceSupported()).WillByDefault(Return(true)); ON_CALL(*this, SupportsOverlaySurfaces()).WillByDefault(Return(true));
diff --git a/media/gpu/android/mock_device_info.h b/media/gpu/android/mock_device_info.h index eaa85f8f..41758e9 100644 --- a/media/gpu/android/mock_device_info.h +++ b/media/gpu/android/mock_device_info.h
@@ -20,6 +20,7 @@ MOCK_METHOD0(SdkVersion, int()); MOCK_METHOD0(IsVp8DecoderAvailable, bool()); MOCK_METHOD0(IsVp9DecoderAvailable, bool()); + MOCK_METHOD0(IsAv1DecoderAvailable, bool()); MOCK_METHOD1(IsDecoderKnownUnaccelerated, bool(VideoCodec codec)); MOCK_METHOD0(IsSetOutputSurfaceSupported, bool()); MOCK_METHOD0(SupportsOverlaySurfaces, bool());
diff --git a/media/gpu/android/video_frame_factory.h b/media/gpu/android/video_frame_factory.h index 1650038..b341ae4 100644 --- a/media/gpu/android/video_frame_factory.h +++ b/media/gpu/android/video_frame_factory.h
@@ -21,8 +21,8 @@ namespace media { -struct AVDASurfaceBundle; class CodecOutputBuffer; +class CodecSurfaceBundle; class TextureOwner; class VideoFrame; @@ -60,7 +60,7 @@ // Notify us about the current surface bundle that subsequent video frames // should use. virtual void SetSurfaceBundle( - scoped_refptr<AVDASurfaceBundle> surface_bundle) = 0; + scoped_refptr<CodecSurfaceBundle> surface_bundle) = 0; // Creates a new VideoFrame backed by |output_buffer|. Runs |output_cb| on // the calling sequence to return the frame.
diff --git a/media/gpu/android/video_frame_factory_impl.cc b/media/gpu/android/video_frame_factory_impl.cc index 1f99f89..c94ac66 100644 --- a/media/gpu/android/video_frame_factory_impl.cc +++ b/media/gpu/android/video_frame_factory_impl.cc
@@ -119,7 +119,7 @@ } void VideoFrameFactoryImpl::SetSurfaceBundle( - scoped_refptr<AVDASurfaceBundle> surface_bundle) { + scoped_refptr<CodecSurfaceBundle> surface_bundle) { scoped_refptr<CodecImageGroup> image_group; if (!surface_bundle) { // Clear everything, just so we're not holding a reference. @@ -127,7 +127,7 @@ } else { // If |surface_bundle| is using a TextureOwner, then get it. texture_owner_ = - surface_bundle->overlay ? nullptr : surface_bundle->texture_owner_; + surface_bundle->overlay() ? nullptr : surface_bundle->texture_owner(); // Start a new image group. Note that there's no reason that we can't have // more than one group per surface bundle; it's okay if we're called
diff --git a/media/gpu/android/video_frame_factory_impl.h b/media/gpu/android/video_frame_factory_impl.h index 85e5a7aa..b099cdb 100644 --- a/media/gpu/android/video_frame_factory_impl.h +++ b/media/gpu/android/video_frame_factory_impl.h
@@ -52,7 +52,7 @@ void Initialize(OverlayMode overlay_mode, InitCb init_cb) override; void SetSurfaceBundle( - scoped_refptr<AVDASurfaceBundle> surface_bundle) override; + scoped_refptr<CodecSurfaceBundle> surface_bundle) override; void CreateVideoFrame( std::unique_ptr<CodecOutputBuffer> output_buffer, base::TimeDelta timestamp,
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc index bc1c9c3..369adbc 100644 --- a/media/gpu/video_encode_accelerator_unittest.cc +++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -26,10 +26,12 @@ #include "base/numerics/safe_conversions.h" #include "base/process/process_handle.h" #include "base/single_thread_task_runner.h" +#include "base/strings/pattern.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/system/sys_info.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/scoped_feature_list.h" #include "base/test/scoped_task_environment.h" @@ -327,6 +329,44 @@ return profile >= VP9PROFILE_MIN && profile <= VP9PROFILE_MAX; } +#if defined(OS_CHROMEOS) +// Determine the test is known-to-fail and should be skipped. +bool ShouldSkipTest() { + struct Pattern { + const char* board_pattern; + const char* suite_name_prefix; + }; + + // Warning: The list should be only used as a last resort for known vendor + // issues that will never be fixed. + constexpr Pattern kSkipTestPatterns[] = { + // crbug.com/769722: MTK driver doesn't compute bitrate correctly. + // Disable mid_stream_bitrate_switch test cases for elm/hana. + {"elm", "MidStreamParamSwitchBitrate"}, + {"elm", "MultipleEncoders"}, + {"hana", "MidStreamParamSwitchBitrate"}, + {"hana", "MultipleEncoders"}, + }; + + const std::string board = base::SysInfo::GetLsbReleaseBoard(); + if (board == "unknown") { + LOG(WARNING) << "Cannot get CrOS board name. Do you run at CrOS device?"; + return false; + } + + const std::string suite_name = ::testing::UnitTest::GetInstance() + ->current_test_info() + ->test_suite_name(); + for (const auto& pattern : kSkipTestPatterns) { + if (suite_name.find(pattern.suite_name_prefix) == 0 && + base::MatchPattern(board, pattern.board_pattern)) { + return true; + } + } + return false; +} +#endif // defined(OS_CHROMEOS) + // Helper functions to do string conversions. static base::FilePath::StringType StringToFilePathStringType( const std::string& str) { @@ -2675,6 +2715,11 @@ const bool verify_output_timestamp = std::get<8>(GetParam()); const bool force_level = std::get<9>(GetParam()); +#if defined(OS_CHROMEOS) + if (ShouldSkipTest()) + GTEST_SKIP(); +#endif // defined(OS_CHROMEOS) + if (force_level) { // Skip ForceLevel test if "--force_level=false". if (!g_force_level) { @@ -2801,6 +2846,11 @@ const int test_type = GetParam(); ASSERT_LT(test_type, 2) << "Invalid test type=" << test_type; +#if defined(OS_CHROMEOS) + if (ShouldSkipTest()) + GTEST_SKIP(); +#endif // defined(OS_CHROMEOS) + if (test_type == 0) SimpleTestFunc<VEANoInputClient>(); else if (test_type == 1)
diff --git a/net/base/network_isolation_key.h b/net/base/network_isolation_key.h index ced5858..68f3784 100644 --- a/net/base/network_isolation_key.h +++ b/net/base/network_isolation_key.h
@@ -35,6 +35,10 @@ return top_frame_origin_ == other.top_frame_origin_; } + bool operator!=(const NetworkIsolationKey& other) const { + return !(top_frame_origin_ == other.top_frame_origin_); + } + bool operator<(const NetworkIsolationKey& other) const { return top_frame_origin_ < other.top_frame_origin_; }
diff --git a/net/http/http_auth_handler_ntlm.h b/net/http/http_auth_handler_ntlm.h index 799a026..8403ee0 100644 --- a/net/http/http_auth_handler_ntlm.h +++ b/net/http/http_auth_handler_ntlm.h
@@ -40,6 +40,18 @@ namespace net { +#if defined(NTLM_PORTABLE) +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class NtlmV2Usage : int { + kDisabledOverInsecure = 0, + kDisabledOverSecure, + kEnabledOverInsecure, + kEnabledOverSecure, + kMaxValue = kEnabledOverSecure +}; +#endif + class HttpAuthPreferences; // Code for handling HTTP NTLM authentication.
diff --git a/net/http/http_auth_handler_ntlm_portable.cc b/net/http/http_auth_handler_ntlm_portable.cc index 1b13f78..3a52b575 100644 --- a/net/http/http_auth_handler_ntlm_portable.cc +++ b/net/http/http_auth_handler_ntlm_portable.cc
@@ -4,12 +4,15 @@ #include "net/http/http_auth_handler_ntlm.h" +#include "base/metrics/histogram_macros.h" #include "base/rand_util.h" #include "base/time/time.h" #include "net/base/net_errors.h" #include "net/base/network_interfaces.h" #include "net/dns/host_resolver.h" +#include "net/http/http_auth_handler_ntlm.h" #include "net/http/http_auth_preferences.h" +#include "net/ssl/ssl_info.h" namespace net { @@ -23,6 +26,14 @@ base::RandBytes(output, n); } +void RecordNtlmV2Usage(bool is_v2, bool is_secure) { + auto bucket = is_v2 ? is_secure ? NtlmV2Usage::kEnabledOverSecure + : NtlmV2Usage::kEnabledOverInsecure + : is_secure ? NtlmV2Usage::kDisabledOverSecure + : NtlmV2Usage::kDisabledOverInsecure; + UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthNtlmV2Usage", bucket); +} + } // namespace // static @@ -133,6 +144,9 @@ if (!tmp_handler->InitFromChallenge(challenge, target, ssl_info, origin, net_log)) return ERR_INVALID_RESPONSE; + RecordNtlmV2Usage( + http_auth_preferences() ? http_auth_preferences()->NtlmV2Enabled() : true, + ssl_info.is_valid()); handler->swap(tmp_handler); return OK; }
diff --git a/net/http/http_auth_handler_ntlm_portable_unittest.cc b/net/http/http_auth_handler_ntlm_portable_unittest.cc index ff42aff..c48b815 100644 --- a/net/http/http_auth_handler_ntlm_portable_unittest.cc +++ b/net/http/http_auth_handler_ntlm_portable_unittest.cc
@@ -9,6 +9,7 @@ #include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" #include "net/base/test_completion_callback.h" #include "net/dns/mock_host_resolver.h" @@ -163,8 +164,11 @@ }; TEST_F(HttpAuthHandlerNtlmPortableTest, SimpleConstruction) { + base::HistogramTester histogram_tester; ASSERT_EQ(OK, CreateHandler()); ASSERT_TRUE(GetAuthHandler() != nullptr); + histogram_tester.ExpectBucketCount("Net.HttpAuthNtlmV2Usage", + NtlmV2Usage::kDisabledOverInsecure, 1); } TEST_F(HttpAuthHandlerNtlmPortableTest, DoNotAllowDefaultCreds) { @@ -217,6 +221,7 @@ } TEST_F(HttpAuthHandlerNtlmPortableTest, NtlmV1AuthenticationSuccess) { + base::HistogramTester histogram_tester; HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGetMSTime, MockRandom, MockGetHostName); ASSERT_EQ(OK, CreateHandler()); @@ -236,6 +241,8 @@ ASSERT_EQ(0, memcmp(decoded.data(), ntlm::test::kExpectedAuthenticateMsgSpecResponseV1, decoded.size())); + histogram_tester.ExpectBucketCount("Net.HttpAuthNtlmV2Usage", + NtlmV2Usage::kDisabledOverInsecure, 1); } } // namespace net
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc index d488656..e436396c 100644 --- a/net/http/http_proxy_connect_job.cc +++ b/net/http/http_proxy_connect_job.cc
@@ -663,7 +663,7 @@ common_connect_job_params()->quic_supported_versions->front(); return quic_stream_request_->Request( proxy_server, quic_version.transport_version, ssl_params->privacy_mode(), - kH2QuicTunnelPriority, socket_tag(), + kH2QuicTunnelPriority, socket_tag(), params_->network_isolation_key(), ssl_params->ssl_config().GetCertVerifyFlags(), GURL("https://" + proxy_server.ToString()), net_log(), &quic_net_error_details_,
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc index e176dfd..0994bf1 100644 --- a/net/http/http_stream_factory_job.cc +++ b/net/http/http_stream_factory_job.cc
@@ -775,7 +775,8 @@ int rv = quic_request_.Request( destination, quic_version_.transport_version, request_info_.privacy_mode, priority_, request_info_.socket_tag, - ssl_config->GetCertVerifyFlags(), url, net_log_, &net_error_details_, + request_info_.network_isolation_key, ssl_config->GetCertVerifyFlags(), + url, net_log_, &net_error_details_, base::BindOnce(&Job::OnFailedOnDefaultNetwork, ptr_factory_.GetWeakPtr()), io_callback_);
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc index d208cd01..ad0ad9d 100644 --- a/net/http/http_stream_factory_job_controller.cc +++ b/net/http/http_stream_factory_job_controller.cc
@@ -1067,7 +1067,8 @@ HostPortPair mapped_origin(origin.host(), origin.port()); ignore_result(ApplyHostMappingRules(original_url, &mapped_origin)); QuicSessionKey session_key(mapped_origin, request_info.privacy_mode, - request_info.socket_tag); + request_info.socket_tag, + request_info.network_isolation_key); HostPortPair destination(alternative_service_info.host_port_pair()); if (session_key.host() != destination.host() &&
diff --git a/net/ntlm/ntlm_client.h b/net/ntlm/ntlm_client.h index 317f40d..16f4833 100644 --- a/net/ntlm/ntlm_client.h +++ b/net/ntlm/ntlm_client.h
@@ -148,7 +148,7 @@ // |negotiate_message_|. void GenerateNegotiateMessage(); - NtlmFeatures features_; + const NtlmFeatures features_; NegotiateFlags negotiate_flags_; std::vector<uint8_t> negotiate_message_;
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 1d7b2bf..c216b1f8 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/feature_list.h" #include "base/location.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_functions.h" @@ -20,9 +21,11 @@ #include "base/time/tick_clock.h" #include "base/trace_event/memory_usage_estimator.h" #include "base/values.h" +#include "net/base/features.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/base/network_activity_monitor.h" +#include "net/base/network_isolation_key.h" #include "net/base/url_util.h" #include "net/http/transport_security_state.h" #include "net/log/net_log_event_type.h" @@ -1285,12 +1288,17 @@ return crypto_stream_->num_sent_client_hellos(); } -bool QuicChromiumClientSession::CanPool(const std::string& hostname, - PrivacyMode privacy_mode, - const SocketTag& socket_tag) const { +bool QuicChromiumClientSession::CanPool( + const std::string& hostname, + PrivacyMode privacy_mode, + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key) const { DCHECK(connection()->connected()); if (privacy_mode != session_key_.privacy_mode() || - socket_tag != session_key_.socket_tag()) { + socket_tag != session_key_.socket_tag() || + (network_isolation_key != session_key_.network_isolation_key() && + base::FeatureList::IsEnabled( + features::kPartitionConnectionsByNetworkIsolationKey))) { // Privacy mode and socket tag must always match. return false; } @@ -3010,7 +3018,8 @@ bool QuicChromiumClientSession::IsAuthorized(const std::string& hostname) { bool result = - CanPool(hostname, session_key_.privacy_mode(), session_key_.socket_tag()); + CanPool(hostname, session_key_.privacy_mode(), session_key_.socket_tag(), + session_key_.network_isolation_key()); if (result) streams_pushed_count_++; return result;
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h index e1c9398..05610e4 100644 --- a/net/quic/quic_chromium_client_session.h +++ b/net/quic/quic_chromium_client_session.h
@@ -52,6 +52,7 @@ class CertVerifyResult; class DatagramClientSocket; class NetLog; +class NetworkIsolationKey; class QuicCryptoClientStreamFactory; class QuicServerInfo; class QuicStreamFactory; @@ -555,7 +556,8 @@ // presented during the handshake. bool CanPool(const std::string& hostname, PrivacyMode privacy_mode, - const SocketTag& socket_tag) const; + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key) const; const quic::QuicServerId& server_id() const { return session_key_.server_id();
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc index cb20853..17ae6e8 100644 --- a/net/quic/quic_chromium_client_session_test.cc +++ b/net/quic/quic_chromium_client_session_test.cc
@@ -11,9 +11,12 @@ #include "base/run_loop.h" #include "base/stl_util.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_tick_clock.h" #include "build/build_config.h" +#include "net/base/features.h" +#include "net/base/network_isolation_key.h" #include "net/base/test_completion_callback.h" #include "net/cert/cert_verify_result.h" #include "net/http/transport_security_state.h" @@ -1309,24 +1312,102 @@ CompleteCryptoHandshake(); session_->OnProofVerifyDetailsAvailable(details); - EXPECT_TRUE( - session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, SocketTag())); - EXPECT_FALSE( - session_->CanPool("www.example.org", PRIVACY_MODE_ENABLED, SocketTag())); + EXPECT_TRUE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, + SocketTag(), NetworkIsolationKey())); + EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_ENABLED, + SocketTag(), NetworkIsolationKey())); #if defined(OS_ANDROID) SocketTag tag1(SocketTag::UNSET_UID, 0x12345678); SocketTag tag2(getuid(), 0x87654321); - EXPECT_FALSE( - session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, tag1)); - EXPECT_FALSE( - session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, tag2)); + EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, tag1, + NetworkIsolationKey())); + EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, tag2, + NetworkIsolationKey())); #endif EXPECT_TRUE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED, - SocketTag())); + SocketTag(), NetworkIsolationKey())); EXPECT_TRUE(session_->CanPool("mail.example.com", PRIVACY_MODE_DISABLED, - SocketTag())); - EXPECT_FALSE( - session_->CanPool("mail.google.com", PRIVACY_MODE_DISABLED, SocketTag())); + SocketTag(), NetworkIsolationKey())); + EXPECT_FALSE(session_->CanPool("mail.google.com", PRIVACY_MODE_DISABLED, + SocketTag(), NetworkIsolationKey())); + + // Check that NetworkIsolationKey is respected when feature is enabled. + { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + features::kPartitionConnectionsByNetworkIsolationKey); + EXPECT_TRUE(session_->CanPool( + "mail.example.com", PRIVACY_MODE_DISABLED, SocketTag(), + NetworkIsolationKey(url::Origin::Create(GURL("http://foo.test/"))))); + } + { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + features::kPartitionConnectionsByNetworkIsolationKey); + EXPECT_FALSE(session_->CanPool( + "mail.example.com", PRIVACY_MODE_DISABLED, SocketTag(), + NetworkIsolationKey(url::Origin::Create(GURL("http://foo.test/"))))); + } +} + +// Much as above, but uses a non-empty NetworkIsolationKey. +TEST_P(QuicChromiumClientSessionTest, CanPoolWithNetworkIsolationKey) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + features::kPartitionConnectionsByNetworkIsolationKey); + + const NetworkIsolationKey kNetworkIsolationKey1( + url::Origin::Create(GURL("http://foo.test/"))); + const NetworkIsolationKey kNetworkIsolationKey2( + url::Origin::Create(GURL("http://bar.test/"))); + + session_key_ = + QuicSessionKey(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED, + SocketTag(), kNetworkIsolationKey1); + + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; + std::unique_ptr<quic::QuicEncryptedPacket> settings_packet( + client_maker_.MakeInitialSettingsPacket(1, nullptr)); + MockWrite writes[] = { + MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; + socket_data_.reset(new SequencedSocketData(reads, writes)); + Initialize(); + // Load a cert that is valid for: + // www.example.org + // mail.example.org + // www.example.com + + ProofVerifyDetailsChromium details; + details.cert_verify_result.verified_cert = + ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); + ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); + + CompleteCryptoHandshake(); + session_->OnProofVerifyDetailsAvailable(details); + + EXPECT_TRUE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, + SocketTag(), kNetworkIsolationKey1)); + EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_ENABLED, + SocketTag(), kNetworkIsolationKey1)); +#if defined(OS_ANDROID) + SocketTag tag1(SocketTag::UNSET_UID, 0x12345678); + SocketTag tag2(getuid(), 0x87654321); + EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, tag1, + kNetworkIsolationKey1)); + EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED, tag2, + kNetworkIsolationKey1)); +#endif + EXPECT_TRUE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED, + SocketTag(), kNetworkIsolationKey1)); + EXPECT_TRUE(session_->CanPool("mail.example.com", PRIVACY_MODE_DISABLED, + SocketTag(), kNetworkIsolationKey1)); + EXPECT_FALSE(session_->CanPool("mail.google.com", PRIVACY_MODE_DISABLED, + SocketTag(), kNetworkIsolationKey1)); + + EXPECT_FALSE(session_->CanPool("mail.example.com", PRIVACY_MODE_DISABLED, + SocketTag(), kNetworkIsolationKey2)); + EXPECT_FALSE(session_->CanPool("mail.example.com", PRIVACY_MODE_DISABLED, + SocketTag(), NetworkIsolationKey())); } TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) { @@ -1366,8 +1447,8 @@ session_->OnProofVerifyDetailsAvailable(details); QuicChromiumClientSessionPeer::SetHostname(session_.get(), kNoPinsHost); - EXPECT_FALSE( - session_->CanPool(kPreloadedPKPHost, PRIVACY_MODE_DISABLED, SocketTag())); + EXPECT_FALSE(session_->CanPool(kPreloadedPKPHost, PRIVACY_MODE_DISABLED, + SocketTag(), NetworkIsolationKey())); } TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithMatchingPin) { @@ -1399,7 +1480,7 @@ QuicChromiumClientSessionPeer::SetHostname(session_.get(), "www.example.org"); EXPECT_TRUE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED, - SocketTag())); + SocketTag(), NetworkIsolationKey())); } TEST_P(QuicChromiumClientSessionTest, MigrateToSocket) {
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index 40c5d9d8..712f11a 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc
@@ -17,8 +17,10 @@ #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "net/base/chunked_upload_data_stream.h" #include "net/base/completion_once_callback.h" +#include "net/base/features.h" #include "net/base/ip_endpoint.h" #include "net/base/mock_network_change_notifier.h" #include "net/base/test_completion_callback.h" @@ -8718,5 +8720,405 @@ EXPECT_TRUE(mock_quic_data.AllWriteDataConsumed()); } +// Test that NetworkIsolationKey is respected by QUIC connections, when +// kPartitionConnectionsByNetworkIsolationKey is enabled. +TEST_P(QuicNetworkTransactionTest, NetworkIsolation) { + NetworkIsolationKey network_isolation_key1( + url::Origin::Create(GURL("http://origin1/"))); + NetworkIsolationKey network_isolation_key2( + url::Origin::Create(GURL("http://origin2/"))); + + session_params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("mail.example.org:443")); + + // Whether to use an H2 proxy. When false, uses HTTPS H2 requests without a + // proxy, when true, uses HTTP requests over an H2 proxy. It's unnecessary to + // test tunneled HTTPS over an H2 proxy, since that path sets up H2 sessions + // the same way as the HTTP over H2 proxy case. + for (bool use_proxy : {false, true}) { + SCOPED_TRACE(use_proxy); + + if (use_proxy) { + proxy_resolution_service_ = + ProxyResolutionService::CreateFixedFromPacResult( + "QUIC mail.example.org:443", TRAFFIC_ANNOTATION_FOR_TESTS); + } else { + proxy_resolution_service_ = ProxyResolutionService::CreateDirect(); + } + + GURL url1; + GURL url2; + GURL url3; + if (use_proxy) { + url1 = GURL("http://mail.example.org/1"); + url2 = GURL("http://mail.example.org/2"); + url3 = GURL("http://mail.example.org/3"); + } else { + url1 = GURL("https://mail.example.org/1"); + url2 = GURL("https://mail.example.org/2"); + url3 = GURL("https://mail.example.org/3"); + } + + for (bool partition_connections : {false, true}) { + SCOPED_TRACE(partition_connections); + + base::test::ScopedFeatureList feature_list; + if (partition_connections) { + feature_list.InitAndEnableFeature( + features::kPartitionConnectionsByNetworkIsolationKey); + } else { + feature_list.InitAndDisableFeature( + features::kPartitionConnectionsByNetworkIsolationKey); + } + + // Reads and writes for the unpartitioned case, where only one socket is + // used. + + session_params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("mail.example.org:443")); + + MockQuicData unpartitioned_mock_quic_data; + quic::QuicStreamOffset request_header_offset = 0; + quic::QuicStreamOffset response_header_offset = 0; + QuicTestPacketMaker client_maker1( + version_, + quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_CLIENT, + client_headers_include_h2_stream_dependency_); + QuicTestPacketMaker server_maker1( + version_, + quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_SERVER, false); + + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, + client_maker1.MakeInitialSettingsPacket(1, &request_header_offset)); + + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, + client_maker1.MakeRequestHeadersPacketWithOffsetTracking( + 2, GetNthClientInitiatedBidirectionalStreamId(0), true, true, + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), + GetRequestHeaders("GET", url1.scheme(), "/1"), 0, + &request_header_offset)); + unpartitioned_mock_quic_data.AddRead( + ASYNC, + server_maker1.MakeResponseHeadersPacketWithOffsetTracking( + 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false, + GetResponseHeaders("200 OK"), &response_header_offset)); + unpartitioned_mock_quic_data.AddRead( + ASYNC, server_maker1.MakeDataPacket( + 2, GetNthClientInitiatedBidirectionalStreamId(0), false, + true, 0, ConstructDataHeader(1) + "1")); + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); + + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, + client_maker1.MakeRequestHeadersPacketWithOffsetTracking( + 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), + GetRequestHeaders("GET", url2.scheme(), "/2"), 0, + &request_header_offset)); + unpartitioned_mock_quic_data.AddRead( + ASYNC, + server_maker1.MakeResponseHeadersPacketWithOffsetTracking( + 3, GetNthClientInitiatedBidirectionalStreamId(1), false, false, + GetResponseHeaders("200 OK"), &response_header_offset)); + unpartitioned_mock_quic_data.AddRead( + ASYNC, server_maker1.MakeDataPacket( + 4, GetNthClientInitiatedBidirectionalStreamId(1), false, + true, 0, ConstructDataHeader(1) + "2")); + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); + + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, + client_maker1.MakeRequestHeadersPacketWithOffsetTracking( + 6, GetNthClientInitiatedBidirectionalStreamId(2), false, true, + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), + GetRequestHeaders("GET", url3.scheme(), "/3"), 0, + &request_header_offset)); + unpartitioned_mock_quic_data.AddRead( + ASYNC, + server_maker1.MakeResponseHeadersPacketWithOffsetTracking( + 5, GetNthClientInitiatedBidirectionalStreamId(2), false, false, + GetResponseHeaders("200 OK"), &response_header_offset)); + unpartitioned_mock_quic_data.AddRead( + ASYNC, server_maker1.MakeDataPacket( + 6, GetNthClientInitiatedBidirectionalStreamId(2), false, + true, 0, ConstructDataHeader(1) + "3")); + unpartitioned_mock_quic_data.AddWrite( + SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(7, 6, 5, 1)); + + unpartitioned_mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + + // Reads and writes for the partitioned case, where two sockets are used. + + MockQuicData partitioned_mock_quic_data1; + request_header_offset = 0; + response_header_offset = 0; + QuicTestPacketMaker client_maker2( + version_, + quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_CLIENT, + client_headers_include_h2_stream_dependency_); + QuicTestPacketMaker server_maker2( + version_, + quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_SERVER, false); + + partitioned_mock_quic_data1.AddWrite( + SYNCHRONOUS, + client_maker2.MakeInitialSettingsPacket(1, &request_header_offset)); + + partitioned_mock_quic_data1.AddWrite( + SYNCHRONOUS, + client_maker2.MakeRequestHeadersPacketWithOffsetTracking( + 2, GetNthClientInitiatedBidirectionalStreamId(0), true, true, + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), + GetRequestHeaders("GET", url1.scheme(), "/1"), 0, + &request_header_offset)); + partitioned_mock_quic_data1.AddRead( + ASYNC, + server_maker2.MakeResponseHeadersPacketWithOffsetTracking( + 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false, + GetResponseHeaders("200 OK"), &response_header_offset)); + partitioned_mock_quic_data1.AddRead( + ASYNC, server_maker2.MakeDataPacket( + 2, GetNthClientInitiatedBidirectionalStreamId(0), false, + true, 0, ConstructDataHeader(1) + "1")); + partitioned_mock_quic_data1.AddWrite( + SYNCHRONOUS, client_maker2.MakeAckPacket(3, 2, 1, 1, true)); + + partitioned_mock_quic_data1.AddWrite( + SYNCHRONOUS, + client_maker2.MakeRequestHeadersPacketWithOffsetTracking( + 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), + GetRequestHeaders("GET", url3.scheme(), "/3"), 0, + &request_header_offset)); + partitioned_mock_quic_data1.AddRead( + ASYNC, + server_maker2.MakeResponseHeadersPacketWithOffsetTracking( + 3, GetNthClientInitiatedBidirectionalStreamId(1), false, false, + GetResponseHeaders("200 OK"), &response_header_offset)); + partitioned_mock_quic_data1.AddRead( + ASYNC, server_maker2.MakeDataPacket( + 4, GetNthClientInitiatedBidirectionalStreamId(1), false, + true, 0, ConstructDataHeader(1) + "3")); + partitioned_mock_quic_data1.AddWrite( + SYNCHRONOUS, client_maker2.MakeAckPacket(5, 4, 3, 1, true)); + + partitioned_mock_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + + MockQuicData partitioned_mock_quic_data2; + request_header_offset = 0; + response_header_offset = 0; + QuicTestPacketMaker client_maker3( + version_, + quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_CLIENT, + client_headers_include_h2_stream_dependency_); + QuicTestPacketMaker server_maker3( + version_, + quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_SERVER, false); + + partitioned_mock_quic_data2.AddWrite( + SYNCHRONOUS, + client_maker3.MakeInitialSettingsPacket(1, &request_header_offset)); + + partitioned_mock_quic_data2.AddWrite( + SYNCHRONOUS, + client_maker3.MakeRequestHeadersPacketWithOffsetTracking( + 2, GetNthClientInitiatedBidirectionalStreamId(0), true, true, + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), + GetRequestHeaders("GET", url2.scheme(), "/2"), 0, + &request_header_offset)); + partitioned_mock_quic_data2.AddRead( + ASYNC, + server_maker3.MakeResponseHeadersPacketWithOffsetTracking( + 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false, + GetResponseHeaders("200 OK"), &response_header_offset)); + partitioned_mock_quic_data2.AddRead( + ASYNC, server_maker3.MakeDataPacket( + 2, GetNthClientInitiatedBidirectionalStreamId(0), false, + true, 0, ConstructDataHeader(1) + "2")); + partitioned_mock_quic_data2.AddWrite( + SYNCHRONOUS, client_maker3.MakeAckPacket(3, 2, 1, 1, true)); + + partitioned_mock_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + + if (partition_connections) { + partitioned_mock_quic_data1.AddSocketDataToFactory(&socket_factory_); + partitioned_mock_quic_data2.AddSocketDataToFactory(&socket_factory_); + } else { + unpartitioned_mock_quic_data.AddSocketDataToFactory(&socket_factory_); + } + + CreateSession(); + + TestCompletionCallback callback; + HttpRequestInfo request1; + request1.method = "GET"; + request1.url = GURL(url1); + request1.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + request1.network_isolation_key = network_isolation_key1; + HttpNetworkTransaction trans1(LOWEST, session_.get()); + int rv = trans1.Start(&request1, callback.callback(), NetLogWithSource()); + EXPECT_THAT(callback.GetResult(rv), IsOk()); + std::string response_data1; + EXPECT_THAT(ReadTransaction(&trans1, &response_data1), IsOk()); + EXPECT_EQ("1", response_data1); + + HttpRequestInfo request2; + request2.method = "GET"; + request2.url = GURL(url2); + request2.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + request2.network_isolation_key = network_isolation_key2; + HttpNetworkTransaction trans2(LOWEST, session_.get()); + rv = trans2.Start(&request2, callback.callback(), NetLogWithSource()); + EXPECT_THAT(callback.GetResult(rv), IsOk()); + std::string response_data2; + EXPECT_THAT(ReadTransaction(&trans2, &response_data2), IsOk()); + EXPECT_EQ("2", response_data2); + + HttpRequestInfo request3; + request3.method = "GET"; + request3.url = GURL(url3); + request3.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + request3.network_isolation_key = network_isolation_key1; + HttpNetworkTransaction trans3(LOWEST, session_.get()); + rv = trans3.Start(&request3, callback.callback(), NetLogWithSource()); + EXPECT_THAT(callback.GetResult(rv), IsOk()); + std::string response_data3; + EXPECT_THAT(ReadTransaction(&trans3, &response_data3), IsOk()); + EXPECT_EQ("3", response_data3); + + if (partition_connections) { + EXPECT_TRUE(partitioned_mock_quic_data1.AllReadDataConsumed()); + EXPECT_TRUE(partitioned_mock_quic_data1.AllWriteDataConsumed()); + EXPECT_TRUE(partitioned_mock_quic_data2.AllReadDataConsumed()); + EXPECT_TRUE(partitioned_mock_quic_data2.AllWriteDataConsumed()); + } else { + EXPECT_TRUE(unpartitioned_mock_quic_data.AllReadDataConsumed()); + EXPECT_TRUE(unpartitioned_mock_quic_data.AllWriteDataConsumed()); + } + } + } +} + +// Test that two requests to the same origin over QUIC tunnels use different +// QUIC sessions if their NetworkIsolationKeys don't match, and +// kPartitionConnectionsByNetworkIsolationKey is enabled. +TEST_P(QuicNetworkTransactionTest, NetworkIsolationTunnel) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + features::kPartitionConnectionsByNetworkIsolationKey); + + session_params_.enable_quic = true; + session_params_.enable_quic_proxies_for_https_urls = true; + proxy_resolution_service_ = ProxyResolutionService::CreateFixedFromPacResult( + "QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS); + + const char kGetRequest[] = + "GET / HTTP/1.1\r\n" + "Host: mail.example.org\r\n" + "Connection: keep-alive\r\n\r\n"; + const char kGetResponse[] = + "HTTP/1.1 200 OK\r\n" + "Content-Length: 10\r\n\r\n"; + + MockQuicData mock_quic_data[2]; + + for (int index : {0, 1}) { + QuicTestPacketMaker client_maker( + version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_CLIENT, + client_headers_include_h2_stream_dependency_); + QuicTestPacketMaker server_maker( + version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_), + &clock_, kDefaultServerHostName, quic::Perspective::IS_SERVER, false); + + quic::QuicStreamOffset header_stream_offset = 0; + mock_quic_data[index].AddWrite( + SYNCHRONOUS, + client_maker.MakeInitialSettingsPacket(1, &header_stream_offset)); + + mock_quic_data[index].AddWrite( + SYNCHRONOUS, + client_maker.MakeRequestHeadersPacketWithOffsetTracking( + 2, GetNthClientInitiatedBidirectionalStreamId(0), true, false, + ConvertRequestPriorityToQuicPriority( + HttpProxyConnectJob::kH2QuicTunnelPriority), + ConnectRequestHeaders("mail.example.org:443"), 0, + &header_stream_offset)); + mock_quic_data[index].AddRead( + ASYNC, server_maker.MakeResponseHeadersPacketWithOffsetTracking( + 1, GetNthClientInitiatedBidirectionalStreamId(0), false, + false, GetResponseHeaders("200 OK"), nullptr)); + + std::string header = ConstructDataHeader(strlen(kGetRequest)); + if (version_.transport_version != quic::QUIC_VERSION_99) { + mock_quic_data[index].AddWrite( + SYNCHRONOUS, + client_maker.MakeAckAndDataPacket( + 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, + false, 0, quic::QuicStringPiece(kGetRequest))); + } else { + mock_quic_data[index].AddWrite( + SYNCHRONOUS, + client_maker.MakeAckAndMultipleDataFramesPacket( + 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, + false, 0, {header, std::string(kGetRequest)})); + } + + std::string header2 = ConstructDataHeader(strlen(kGetResponse)); + mock_quic_data[index].AddRead( + ASYNC, server_maker.MakeDataPacket( + 2, GetNthClientInitiatedBidirectionalStreamId(0), false, + false, 0, header2 + std::string(kGetResponse))); + mock_quic_data[index].AddRead( + SYNCHRONOUS, server_maker.MakeDataPacket( + 3, GetNthClientInitiatedBidirectionalStreamId(0), + false, false, strlen(kGetResponse) + header2.length(), + ConstructDataHeader(10) + std::string("0123456789"))); + mock_quic_data[index].AddWrite( + SYNCHRONOUS, client_maker.MakeAckPacket(4, 3, 2, 1, true)); + mock_quic_data[index].AddRead(SYNCHRONOUS, + ERR_IO_PENDING); // No more data to read + + mock_quic_data[index].AddSocketDataToFactory(&socket_factory_); + } + + socket_factory_.AddSSLSocketDataProvider(&ssl_data_); + SSLSocketDataProvider ssl_data2(ASYNC, OK); + socket_factory_.AddSSLSocketDataProvider(&ssl_data2); + + CreateSession(); + + request_.url = GURL("https://mail.example.org/"); + AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); + HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get()); + RunTransaction(&trans); + CheckResponseData(&trans, "0123456789"); + + HttpRequestInfo request2; + request_.network_isolation_key = + NetworkIsolationKey(url::Origin::Create(GURL("http://origin1/"))); + HttpNetworkTransaction trans2(DEFAULT_PRIORITY, session_.get()); + RunTransaction(&trans2); + CheckResponseData(&trans2, "0123456789"); + + EXPECT_TRUE(mock_quic_data[0].AllReadDataConsumed()); + EXPECT_TRUE(mock_quic_data[0].AllWriteDataConsumed()); + EXPECT_TRUE(mock_quic_data[1].AllReadDataConsumed()); + EXPECT_TRUE(mock_quic_data[1].AllWriteDataConsumed()); +} + } // namespace test } // namespace net
diff --git a/net/quic/quic_session_key.cc b/net/quic/quic_session_key.cc index da9a601..d7907d6b 100644 --- a/net/quic/quic_session_key.cc +++ b/net/quic/quic_session_key.cc
@@ -4,34 +4,50 @@ #include "net/quic/quic_session_key.h" +#include "base/feature_list.h" +#include "net/base/features.h" + namespace net { QuicSessionKey::QuicSessionKey(const HostPortPair& host_port_pair, PrivacyMode privacy_mode, - const SocketTag& socket_tag) + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key) : QuicSessionKey(host_port_pair.host(), host_port_pair.port(), privacy_mode, - socket_tag) {} + socket_tag, + network_isolation_key) {} QuicSessionKey::QuicSessionKey(const std::string& host, uint16_t port, PrivacyMode privacy_mode, - const SocketTag& socket_tag) + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key) : QuicSessionKey( quic::QuicServerId(host, port, privacy_mode == PRIVACY_MODE_ENABLED), - socket_tag) {} + socket_tag, + network_isolation_key) {} QuicSessionKey::QuicSessionKey(const quic::QuicServerId& server_id, - const SocketTag& socket_tag) - : server_id_(server_id), socket_tag_(socket_tag) {} + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key) + : server_id_(server_id), + socket_tag_(socket_tag), + network_isolation_key_( + base::FeatureList::IsEnabled( + features::kPartitionConnectionsByNetworkIsolationKey) + ? network_isolation_key + : NetworkIsolationKey()) {} bool QuicSessionKey::operator<(const QuicSessionKey& other) const { - return std::tie(server_id_, socket_tag_) < - std::tie(other.server_id_, other.socket_tag_); + return std::tie(server_id_, socket_tag_, network_isolation_key_) < + std::tie(other.server_id_, other.socket_tag_, + other.network_isolation_key_); } bool QuicSessionKey::operator==(const QuicSessionKey& other) const { - return server_id_ == other.server_id_ && socket_tag_ == other.socket_tag_; + return server_id_ == other.server_id_ && socket_tag_ == other.socket_tag_ && + network_isolation_key_ == other.network_isolation_key_; } size_t QuicSessionKey::EstimateMemoryUsage() const {
diff --git a/net/quic/quic_session_key.h b/net/quic/quic_session_key.h index 127726ca..5065564 100644 --- a/net/quic/quic_session_key.h +++ b/net/quic/quic_session_key.h
@@ -6,6 +6,7 @@ #define NET_QUIC_QUIC_SESSION_KEY_H_ #include "net/base/host_port_pair.h" +#include "net/base/network_isolation_key.h" #include "net/base/privacy_mode.h" #include "net/socket/socket_tag.h" #include "net/third_party/quiche/src/quic/core/quic_server_id.h" @@ -16,16 +17,24 @@ // tag. class QUIC_EXPORT_PRIVATE QuicSessionKey { public: + // TODO(mmenke): Remove default NetworkIsolationKey() values, which are only + // used in tests. QuicSessionKey() = default; - QuicSessionKey(const HostPortPair& host_port_pair, - PrivacyMode privacy_mode, - const SocketTag& socket_tag); - QuicSessionKey(const std::string& host, - uint16_t port, - PrivacyMode privacy_mode, - const SocketTag& socket_tag); - QuicSessionKey(const quic::QuicServerId& server_id, - const SocketTag& socket_tag); + QuicSessionKey( + const HostPortPair& host_port_pair, + PrivacyMode privacy_mode, + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key = NetworkIsolationKey()); + QuicSessionKey( + const std::string& host, + uint16_t port, + PrivacyMode privacy_mode, + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key = NetworkIsolationKey()); + QuicSessionKey( + const quic::QuicServerId& server_id, + const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key = NetworkIsolationKey()); ~QuicSessionKey() = default; // Needed to be an element of std::set. @@ -43,11 +52,17 @@ SocketTag socket_tag() const { return socket_tag_; } + const NetworkIsolationKey& network_isolation_key() const { + return network_isolation_key_; + } + size_t EstimateMemoryUsage() const; private: quic::QuicServerId server_id_; SocketTag socket_tag_; + // Used to separate requests made in different contexts. + NetworkIsolationKey network_isolation_key_; }; } // namespace net
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index 0688be7..55c5305 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc
@@ -921,6 +921,7 @@ PrivacyMode privacy_mode, RequestPriority priority, const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key, int cert_verify_flags, const GURL& url, const NetLogWithSource& net_log, @@ -936,8 +937,8 @@ net_error_details_ = net_error_details; failed_on_default_network_callback_ = std::move(failed_on_default_network_callback); - session_key_ = - QuicSessionKey(HostPortPair::FromURL(url), privacy_mode, socket_tag); + session_key_ = QuicSessionKey(HostPortPair::FromURL(url), privacy_mode, + socket_tag, network_isolation_key); int rv = factory_->Create(session_key_, destination, quic_version, priority, cert_verify_flags, url, net_log, this); @@ -1251,7 +1252,8 @@ QuicChromiumClientSession* session = key_value.second; if (destination.Equals(all_sessions_[session].destination()) && session->CanPool(session_key.host(), session_key.privacy_mode(), - session_key.socket_tag())) { + session_key.socket_tag(), + session_key.network_isolation_key())) { return true; } } @@ -1334,7 +1336,8 @@ session_key.server_id().privacy_mode_enabled() ? PRIVACY_MODE_ENABLED : PRIVACY_MODE_DISABLED, - session_key.socket_tag())) { + session_key.socket_tag(), + session_key.network_isolation_key())) { request->SetSession(session->CreateHandle(destination)); return OK; } @@ -1413,12 +1416,11 @@ const SessionSet& sessions = ip_aliases_[address]; for (QuicChromiumClientSession* session : sessions) { - if (!session->CanPool(server_id.host(), - server_id.privacy_mode_enabled() - ? PRIVACY_MODE_ENABLED - : PRIVACY_MODE_DISABLED, - key.session_key().socket_tag())) + if (!session->CanPool(server_id.host(), key.session_key().privacy_mode(), + key.session_key().socket_tag(), + key.session_key().network_isolation_key())) { continue; + } active_sessions_[key.session_key()] = session; session_aliases_[session].insert(key); return true;
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h index bae47ec..207d20b 100644 --- a/net/quic/quic_stream_factory.h +++ b/net/quic/quic_stream_factory.h
@@ -65,6 +65,7 @@ class HostResolver; class HttpServerProperties; class NetLog; +class NetworkIsolationKey; class QuicChromiumConnectionHelper; class QuicCryptoClientStreamFactory; class QuicServerInfo; @@ -128,6 +129,7 @@ PrivacyMode privacy_mode, RequestPriority priority, const SocketTag& socket_tag, + const NetworkIsolationKey& network_isolation_key, int cert_verify_flags, const GURL& url, const NetLogWithSource& net_log,
diff --git a/net/quic/quic_stream_factory_fuzzer.cc b/net/quic/quic_stream_factory_fuzzer.cc index 60d828b..b91b834 100644 --- a/net/quic/quic_stream_factory_fuzzer.cc +++ b/net/quic/quic_stream_factory_fuzzer.cc
@@ -7,6 +7,7 @@ #include "base/test/fuzzed_data_provider.h" #include "base/stl_util.h" +#include "net/base/network_isolation_key.h" #include "net/base/test_completion_callback.h" #include "net/cert/ct_policy_enforcer.h" #include "net/cert/do_nothing_ct_verifier.h" @@ -162,8 +163,9 @@ request.Request( env->host_port_pair, data_provider.PickValueInArray(quic::kSupportedTransportVersions), - PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY, SocketTag(), kCertVerifyFlags, - GURL(kUrl), env->net_log, &net_error_details, + PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY, SocketTag(), + NetworkIsolationKey(), kCertVerifyFlags, GURL(kUrl), env->net_log, + &net_error_details, /*failed_on_default_network_callback=*/CompletionOnceCallback(), callback.callback());
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index 2850d4d0..e6b6afe 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc
@@ -17,6 +17,7 @@ #include "base/test/test_mock_time_task_runner.h" #include "build/build_config.h" #include "net/base/mock_network_change_notifier.h" +#include "net/base/network_isolation_key.h" #include "net/cert/ct_policy_enforcer.h" #include "net/cert/do_nothing_ct_verifier.h" #include "net/cert/mock_cert_verifier.h" @@ -390,7 +391,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( destination, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -549,7 +550,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -737,7 +738,7 @@ request.Request( HostPortPair(quic_server_id.host(), quic_server_id.port()), version_.transport_version, privacy_mode_, DEFAULT_PRIORITY, - SocketTag(), + SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -773,7 +774,7 @@ request2.Request( HostPortPair(quic_server_id2.host(), quic_server_id2.port()), version_.transport_version, privacy_mode_, DEFAULT_PRIORITY, - SocketTag(), + SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, GURL("https://mail.example.org/"), net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -931,7 +932,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -942,12 +943,12 @@ EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority()); QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); // Will reset stream 3. stream = CreateStream(&request2); @@ -956,12 +957,12 @@ // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result // in streams on different sessions. QuicStreamRequest request3(factory_.get()); - EXPECT_EQ(OK, request3.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request3.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); stream = CreateStream(&request3); // Will reset stream 5. stream.reset(); // Will reset stream 7. @@ -986,12 +987,12 @@ "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); @@ -1013,7 +1014,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1041,7 +1042,7 @@ EXPECT_EQ(ERR_IO_PENDING, request->Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); request.reset(); @@ -1071,7 +1072,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1112,7 +1113,7 @@ QuicStreamRequest request(factory_.get()); EXPECT_THAT(request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback()), IsOk()); @@ -1152,7 +1153,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1185,7 +1186,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1218,7 +1219,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1246,7 +1247,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1278,7 +1279,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1322,23 +1323,23 @@ host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); TestCompletionCallback callback; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -1387,7 +1388,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( server2, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback.callback())); EXPECT_EQ(OK, callback.WaitForResult()); @@ -1421,23 +1422,23 @@ host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); TestCompletionCallback callback; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -1447,12 +1448,12 @@ TestCompletionCallback callback3; QuicStreamRequest request3(factory_.get()); - EXPECT_EQ(OK, request3.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback3.callback())); + EXPECT_EQ(OK, + request3.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback3.callback())); std::unique_ptr<HttpStream> stream3 = CreateStream(&request3); EXPECT_TRUE(stream3.get()); @@ -1483,23 +1484,23 @@ host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(server1, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + server1, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); TestCompletionCallback callback; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -1533,23 +1534,23 @@ host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(server1, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + server1, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); TestCompletionCallback callback; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -1594,23 +1595,23 @@ host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(server1, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + server1, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); TestCompletionCallback callback; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -1641,7 +1642,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1663,7 +1664,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -1727,7 +1728,7 @@ QuicStreamRequest request(factory_.get()); int rv = request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback()); if (i == 0) { @@ -1745,12 +1746,12 @@ } QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - CompletionOnceCallback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, CompletionOnceCallback())); std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream); EXPECT_EQ(ERR_IO_PENDING, @@ -1787,7 +1788,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1808,7 +1809,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1829,7 +1830,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); } @@ -1837,12 +1838,12 @@ base::RunLoop().RunUntilIdle(); QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream = CreateStream(&request2); EXPECT_TRUE(stream.get()); @@ -1877,7 +1878,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1902,7 +1903,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -1938,7 +1939,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult()); @@ -1959,7 +1960,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_FALSE(HasActiveSession(host_port_pair_)); @@ -2004,7 +2005,7 @@ EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); // Check no active session, or active jobs left for this server. @@ -2025,7 +2026,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_FALSE(HasActiveSession(host_port_pair_)); @@ -2074,7 +2075,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -2109,7 +2110,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -2167,7 +2168,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2213,7 +2214,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2252,7 +2253,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -2274,12 +2275,12 @@ // Attempting a new request to the same origin uses the same connection. QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); stream = CreateStream(&request2); stream.reset(); @@ -2353,7 +2354,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2532,7 +2533,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2676,7 +2677,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2793,7 +2794,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2858,7 +2859,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -2950,7 +2951,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3014,7 +3015,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3103,7 +3104,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3171,7 +3172,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3244,7 +3245,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3363,7 +3364,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3526,7 +3527,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3700,7 +3701,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3838,7 +3839,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3879,7 +3880,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -3955,7 +3956,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4097,7 +4098,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4254,7 +4255,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4392,23 +4393,23 @@ // Create request and QuicHttpStream to create session1. QuicStreamRequest request1(factory_.get()); - EXPECT_EQ(OK, request1.Request(server1, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request1.Request( + server1, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream1 = CreateStream(&request1); EXPECT_TRUE(stream1.get()); // Create request and QuicHttpStream to create session2. QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -4520,7 +4521,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4634,7 +4635,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4700,7 +4701,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4802,7 +4803,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -4821,12 +4822,12 @@ // Request #2 returns synchronously because it pools to existing session. TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -4939,7 +4940,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -5061,7 +5062,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -5122,7 +5123,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -5244,7 +5245,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -5361,7 +5362,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult()); @@ -5382,7 +5383,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_FALSE(HasActiveSession(host_port_pair_)); @@ -5456,7 +5457,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); // Ensure that the session is alive but not active. @@ -5526,7 +5527,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -5623,7 +5624,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -5760,7 +5761,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -5779,12 +5780,12 @@ // Second request returns synchronously because it pools to existing session. TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); HttpRequestInfo request_info2; @@ -5896,7 +5897,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -5915,12 +5916,12 @@ // Second request returns synchronously because it pools to existing session. TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -6043,7 +6044,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -6062,12 +6063,12 @@ // Second request returns synchronously because it pools to existing session. TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -6176,7 +6177,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -6263,7 +6264,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -6389,7 +6390,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -6484,7 +6485,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); // Deliver the network notification, which should cause the connection to be @@ -6523,7 +6524,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -6657,7 +6658,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -6797,7 +6798,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -6928,7 +6929,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7032,7 +7033,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7146,7 +7147,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7314,7 +7315,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7474,7 +7475,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7623,7 +7624,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7758,7 +7759,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -7899,7 +7900,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -8036,7 +8037,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -8129,7 +8130,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -8274,7 +8275,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -8366,12 +8367,12 @@ ->NotifyNetworkMadeDefault(kNewNetworkForTests); QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -8453,7 +8454,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -8567,7 +8568,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -8645,7 +8646,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -8793,7 +8794,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -8851,7 +8852,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -8874,7 +8875,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -8991,12 +8992,12 @@ "192.168.0.1", ""); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); // If we are waiting for disk cache, we would have posted a task. Verify that // the CancelWaitForDataReady task hasn't been posted. @@ -9042,12 +9043,12 @@ EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs), QuicStreamFactoryPeer::GetPingTimeout(factory_.get())); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs), @@ -9080,12 +9081,12 @@ DVLOG(1) << "Create 2nd session and timeout with open stream"; TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(server2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + server2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); QuicChromiumClientSession* session2 = GetActiveSession(server2); EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10), session2->connection()->ping_timeout()); @@ -9155,7 +9156,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -9201,12 +9202,12 @@ "StartReading"); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets // called. @@ -9250,12 +9251,12 @@ "StartReading"); QuicStreamRequest request(factory_.get()); - EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets // called. @@ -9287,7 +9288,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -9307,12 +9308,12 @@ ->promised_by_url())[kDefaultUrl] = &promised; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request( + host_port_pair_, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get())); } @@ -9341,7 +9342,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -9366,12 +9367,13 @@ // Doing the request should not use the push stream, but rather // cancel it because the privacy modes do not match. QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(ERR_IO_PENDING, - request2.Request( - host_port_pair_, version_.transport_version, - PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, - failed_on_default_network_callback_, callback_.callback())); + EXPECT_EQ( + ERR_IO_PENDING, + request2.Request( + host_port_pair_, version_.transport_version, PRIVACY_MODE_ENABLED, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get())); EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr); @@ -9406,7 +9408,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( destination1, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -9417,12 +9419,12 @@ // Second request returns synchronously because it pools to existing session. TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(destination2, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url_, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + destination2, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -9527,7 +9529,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( destination, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -9572,7 +9574,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( destination, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -9584,12 +9586,12 @@ // Second request returns synchronously because it pools to existing session. TestCompletionCallback callback2; QuicStreamRequest request2(factory_.get()); - EXPECT_EQ(OK, request2.Request(destination, version_.transport_version, - privacy_mode_, DEFAULT_PRIORITY, SocketTag(), - /*cert_verify_flags=*/0, url2, net_log_, - &net_error_details_, - failed_on_default_network_callback_, - callback2.callback())); + EXPECT_EQ(OK, + request2.Request( + destination, version_.transport_version, privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), + /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback2.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); @@ -9651,7 +9653,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( destination, version_.transport_version, PRIVACY_MODE_DISABLED, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); @@ -9664,7 +9666,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( destination, version_.transport_version, PRIVACY_MODE_ENABLED, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_, failed_on_default_network_callback_, callback2.callback())); EXPECT_EQ(OK, callback2.WaitForResult()); @@ -9738,7 +9740,7 @@ EXPECT_EQ(ERR_IO_PENDING, request1.Request( destination, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_THAT(callback_.WaitForResult(), IsOk()); @@ -9751,7 +9753,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( destination, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_, failed_on_default_network_callback_, callback2.callback())); EXPECT_THAT(callback2.WaitForResult(), IsOk()); @@ -9862,7 +9864,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - MAXIMUM_PRIORITY, SocketTag(), + MAXIMUM_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -9890,7 +9892,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - MAXIMUM_PRIORITY, SocketTag(), + MAXIMUM_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -9901,7 +9903,7 @@ EXPECT_EQ(ERR_IO_PENDING, request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority()); @@ -9946,7 +9948,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10000,7 +10002,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10051,7 +10053,7 @@ EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10089,7 +10091,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10123,7 +10125,7 @@ EXPECT_EQ(ERR_NAME_NOT_RESOLVED, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10149,7 +10151,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10202,7 +10204,7 @@ QuicStreamRequest request(factory_.get()); EXPECT_THAT(request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback()), IsOk()); @@ -10238,7 +10240,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); TestCompletionCallback host_resolution_callback; @@ -10296,7 +10298,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10357,7 +10359,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10424,7 +10426,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10495,7 +10497,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10565,7 +10567,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10639,7 +10641,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); // Finish dns resolution, but need to wait for stale connection. @@ -10681,7 +10683,7 @@ EXPECT_EQ(ERR_NAME_NOT_RESOLVED, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); } @@ -10706,7 +10708,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10753,7 +10755,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10808,7 +10810,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); EXPECT_FALSE(HasLiveSession(host_port_pair_)); @@ -10857,7 +10859,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10919,7 +10921,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -10973,7 +10975,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -11026,7 +11028,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -11061,7 +11063,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); @@ -11113,7 +11115,7 @@ EXPECT_EQ(ERR_IO_PENDING, request.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, SocketTag(), + DEFAULT_PRIORITY, SocketTag(), NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback())); base::RunLoop().RunUntilIdle(); @@ -11179,7 +11181,7 @@ QuicStreamRequest request1(factory_.get()); int rv = request1.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, tag1, + DEFAULT_PRIORITY, tag1, NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback()); EXPECT_THAT(callback_.GetResult(rv), IsOk()); @@ -11195,7 +11197,7 @@ QuicStreamRequest request2(factory_.get()); rv = request2.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, tag1, + DEFAULT_PRIORITY, tag1, NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback()); EXPECT_THAT(callback_.GetResult(rv), IsOk()); @@ -11209,7 +11211,7 @@ QuicStreamRequest request3(factory_.get()); rv = request3.Request( host_port_pair_, version_.transport_version, privacy_mode_, - DEFAULT_PRIORITY, tag2, + DEFAULT_PRIORITY, tag2, NetworkIsolationKey(), /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_, failed_on_default_network_callback_, callback_.callback()); EXPECT_THAT(callback_.GetResult(rv), IsOk());
diff --git a/ppapi/proxy/resource_message_params.cc b/ppapi/proxy/resource_message_params.cc index 253ff36..fa4df10 100644 --- a/ppapi/proxy/resource_message_params.cc +++ b/ppapi/proxy/resource_message_params.cc
@@ -113,6 +113,18 @@ return true; } +bool ResourceMessageParams::TakeUnsafeSharedMemoryRegionAtIndex( + size_t index, + base::UnsafeSharedMemoryRegion* region) const { + SerializedHandle serialized = + TakeHandleOfTypeAtIndex(index, SerializedHandle::SHARED_MEMORY_REGION); + if (!serialized.is_shmem_region()) + return false; + *region = base::UnsafeSharedMemoryRegion::Deserialize( + serialized.TakeSharedMemoryRegion()); + return true; +} + bool ResourceMessageParams::TakeSocketHandleAtIndex( size_t index, IPC::PlatformFileForTransit* handle) const {
diff --git a/ppapi/proxy/resource_message_params.h b/ppapi/proxy/resource_message_params.h index c7d469b..db3fefc8 100644 --- a/ppapi/proxy/resource_message_params.h +++ b/ppapi/proxy/resource_message_params.h
@@ -67,6 +67,9 @@ bool TakeReadOnlySharedMemoryRegionAtIndex( size_t index, base::ReadOnlySharedMemoryRegion* region) const; + bool TakeUnsafeSharedMemoryRegionAtIndex( + size_t index, + base::UnsafeSharedMemoryRegion* region) const; bool TakeSocketHandleAtIndex(size_t index, IPC::PlatformFileForTransit* handle) const; bool TakeFileHandleAtIndex(size_t index,
diff --git a/ppapi/proxy/serialized_handle.cc b/ppapi/proxy/serialized_handle.cc index 92f945d..ee06d0a 100644 --- a/ppapi/proxy/serialized_handle.cc +++ b/ppapi/proxy/serialized_handle.cc
@@ -66,6 +66,16 @@ open_flags_(0), file_io_(0) {} +SerializedHandle::SerializedHandle(base::ReadOnlySharedMemoryRegion region) + : SerializedHandle( + base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( + std::move(region))) {} + +SerializedHandle::SerializedHandle(base::UnsafeSharedMemoryRegion region) + : SerializedHandle( + base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( + std::move(region))) {} + SerializedHandle::SerializedHandle( base::subtle::PlatformSharedMemoryRegion region) : type_(SHARED_MEMORY_REGION),
diff --git a/ppapi/proxy/serialized_handle.h b/ppapi/proxy/serialized_handle.h index 82518831..8829678 100644 --- a/ppapi/proxy/serialized_handle.h +++ b/ppapi/proxy/serialized_handle.h
@@ -13,8 +13,10 @@ #include "base/atomicops.h" #include "base/logging.h" #include "base/memory/platform_shared_memory_region.h" +#include "base/memory/read_only_shared_memory_region.h" #include "base/memory/ref_counted.h" #include "base/memory/shared_memory.h" +#include "base/memory/unsafe_shared_memory_region.h" #include "build/build_config.h" #include "ipc/ipc_platform_file.h" #include "ppapi/c/pp_resource.h" @@ -66,6 +68,8 @@ SerializedHandle(const base::SharedMemoryHandle& handle, uint32_t size); // Create a shared memory region handle. + explicit SerializedHandle(base::ReadOnlySharedMemoryRegion region); + explicit SerializedHandle(base::UnsafeSharedMemoryRegion region); explicit SerializedHandle(base::subtle::PlatformSharedMemoryRegion region); // Create a socket or file handle.
diff --git a/ppapi/proxy/video_decoder_resource.cc b/ppapi/proxy/video_decoder_resource.cc index 94548e14..ad00255 100644 --- a/ppapi/proxy/video_decoder_resource.cc +++ b/ppapi/proxy/video_decoder_resource.cc
@@ -32,12 +32,12 @@ namespace proxy { VideoDecoderResource::ShmBuffer::ShmBuffer( - std::unique_ptr<base::SharedMemory> shm_ptr, - uint32_t size, + base::UnsafeSharedMemoryRegion region, uint32_t shm_id) - : shm(std::move(shm_ptr)), addr(NULL), shm_id(shm_id) { - if (shm->Map(size)) - addr = shm->memory(); + : region(std::move(region)), shm_id(shm_id) { + mapping = this->region.Map(); + if (mapping.IsValid()) + addr = mapping.memory(); } VideoDecoderResource::ShmBuffer::~ShmBuffer() { @@ -199,7 +199,7 @@ decode_ids_[uid % kMaximumPictureDelay] = decode_id; if (available_shm_buffers_.empty() || - available_shm_buffers_.back()->shm->mapped_size() < size) { + available_shm_buffers_.back()->mapping.size() < size) { uint32_t shm_id; if (shm_buffers_.size() < kMaximumPendingDecodes) { // Signal the host to create a new shm buffer by passing an index outside @@ -227,13 +227,12 @@ if (!UnpackMessage<PpapiPluginMsg_VideoDecoder_GetShmReply>(reply, &shm_size)) return PP_ERROR_FAILED; - base::SharedMemoryHandle shm_handle; - if (!reply_params.TakeSharedMemoryHandleAtIndex(0, &shm_handle)) + base::UnsafeSharedMemoryRegion shm_region; + if (!reply_params.TakeUnsafeSharedMemoryRegionAtIndex(0, &shm_region) || + !shm_region.IsValid() || shm_region.GetSize() != shm_size) return PP_ERROR_NOMEMORY; - std::unique_ptr<base::SharedMemory> shm( - new base::SharedMemory(shm_handle, false /* read_only */)); std::unique_ptr<ShmBuffer> shm_buffer( - new ShmBuffer(std::move(shm), shm_size, shm_id)); + new ShmBuffer(std::move(shm_region), shm_id)); if (!shm_buffer->addr) return PP_ERROR_NOMEMORY; @@ -246,7 +245,7 @@ // At this point we should have shared memory to hold the plugin's buffer. DCHECK(!available_shm_buffers_.empty() && - available_shm_buffers_.back()->shm->mapped_size() >= size); + available_shm_buffers_.back()->mapping.size() >= size); ShmBuffer* shm_buffer = available_shm_buffers_.back(); available_shm_buffers_.pop_back();
diff --git a/ppapi/proxy/video_decoder_resource.h b/ppapi/proxy/video_decoder_resource.h index caa45a6..29e6b307 100644 --- a/ppapi/proxy/video_decoder_resource.h +++ b/ppapi/proxy/video_decoder_resource.h
@@ -83,13 +83,12 @@ private: // Struct to hold a shared memory buffer. struct ShmBuffer { - ShmBuffer(std::unique_ptr<base::SharedMemory> shm, - uint32_t size, - uint32_t shm_id); + ShmBuffer(base::UnsafeSharedMemoryRegion region, uint32_t shm_id); ~ShmBuffer(); - const std::unique_ptr<base::SharedMemory> shm; - void* addr; + base::UnsafeSharedMemoryRegion region; + base::WritableSharedMemoryMapping mapping; + void* addr = nullptr; // Index into shm_buffers_ vector, used as an id. This should map 1:1 to // the index on the host side of the proxy. const uint32_t shm_id;
diff --git a/ppapi/proxy/video_decoder_resource_unittest.cc b/ppapi/proxy/video_decoder_resource_unittest.cc index 9b3efee8..3d4e082 100644 --- a/ppapi/proxy/video_decoder_resource_unittest.cc +++ b/ppapi/proxy/video_decoder_resource_unittest.cc
@@ -6,7 +6,7 @@ #include <stddef.h> #include <stdint.h> -#include "base/memory/shared_memory.h" +#include "base/memory/unsafe_shared_memory_region.h" #include "build/build_config.h" #include "ppapi/c/pp_errors.h" #include "ppapi/c/ppb_video_decoder.h" @@ -137,11 +137,10 @@ sink().AddFilter(&shm_msg_handler); if (expected_shm_msg) { - std::unique_ptr<SerializedHandle> serialized_handle; - base::SharedMemory shm; - shm.CreateAnonymous(kShmSize); - base::SharedMemoryHandle shm_handle = shm.handle().Duplicate(); - serialized_handle.reset(new SerializedHandle(shm_handle, kShmSize)); + auto region = base::UnsafeSharedMemoryRegion::Create(kShmSize); + auto serialized_handle = std::make_unique<SerializedHandle>( + base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( + std::move(region))); shm_msg_handler.set_serialized_handle(std::move(serialized_handle)); }
diff --git a/services/identity/public/cpp/identity_manager.cc b/services/identity/public/cpp/identity_manager.cc index 7bdf6ab..12bd2ad 100644 --- a/services/identity/public/cpp/identity_manager.cc +++ b/services/identity/public/cpp/identity_manager.cc
@@ -8,6 +8,7 @@ #include "build/build_config.h" #include "components/signin/core/browser/account_fetcher_service.h" +#include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "components/signin/core/browser/ubertoken_fetcher_impl.h" #include "google_apis/gaia/gaia_auth_util.h" #include "services/identity/public/cpp/accounts_cookie_mutator.h" @@ -65,7 +66,15 @@ token_service_->AddDiagnosticsObserver(this); token_service_->AddObserver(this); account_tracker_service_->AddObserver(this); - gaia_cookie_manager_service_->AddObserver(this); + + // IdentityManager owns gaia_cookie_manager_service_ and will outlive it, so + // base::Unretained is safe. + gaia_cookie_manager_service_->SetGaiaAccountsInCookieUpdatedCallback( + base::BindRepeating(&IdentityManager::OnGaiaAccountsInCookieUpdated, + base::Unretained(this))); + gaia_cookie_manager_service_->SetGaiaCookieDeletedByUserActionCallback( + base::BindRepeating(&IdentityManager::OnGaiaCookieDeletedByUserAction, + base::Unretained(this))); // Seed the primary account with any state that |signin_manager_| loaded from // prefs. @@ -86,7 +95,6 @@ token_service_->RemoveObserver(this); token_service_->RemoveDiagnosticsObserver(this); account_tracker_service_->RemoveObserver(this); - gaia_cookie_manager_service_->RemoveObserver(this); } // TODO(862619) change return type to base::Optional<CoreAccountInfo>
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h index 7f575e6..1fe4c55 100644 --- a/services/identity/public/cpp/identity_manager.h +++ b/services/identity/public/cpp/identity_manager.h
@@ -13,7 +13,6 @@ #include "components/signin/core/browser/account_fetcher_service.h" #include "components/signin/core/browser/account_info.h" #include "components/signin/core/browser/account_tracker_service.h" -#include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_manager_base.h" #include "components/signin/core/browser/signin_metrics.h" @@ -36,6 +35,8 @@ class PrefRegistrySimple; class SigninManagerAndroid; +class GaiaCookieManagerService; + namespace identity { class AccountsMutator; @@ -52,7 +53,6 @@ class IdentityManager : public SigninManagerBase::Observer, public OAuth2TokenService::DiagnosticsObserver, public OAuth2TokenService::Observer, - public GaiaCookieManagerService::Observer, public AccountTrackerService::Observer { public: class Observer { @@ -596,12 +596,12 @@ void OnAuthErrorChanged(const std::string& account_id, const GoogleServiceAuthError& auth_error) override; - // GaiaCookieManagerService::Observer: + // GaiaCookieManagerService callbacks: void OnGaiaAccountsInCookieUpdated( const std::vector<gaia::ListedAccount>& signed_in_accounts, const std::vector<gaia::ListedAccount>& signed_out_accounts, - const GoogleServiceAuthError& error) override; - void OnGaiaCookieDeletedByUserAction() override; + const GoogleServiceAuthError& error); + void OnGaiaCookieDeletedByUserAction(); // OAuth2TokenService::DiagnosticsObserver: void OnAccessTokenRequested(
diff --git a/services/identity/public/cpp/identity_test_utils.cc b/services/identity/public/cpp/identity_test_utils.cc index 641f11e..5e94362 100644 --- a/services/identity/public/cpp/identity_test_utils.cc +++ b/services/identity/public/cpp/identity_test_utils.cc
@@ -10,6 +10,7 @@ #include "base/run_loop.h" #include "base/strings/string_split.h" #include "components/signin/core/browser/account_tracker_service.h" +#include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "components/signin/core/browser/list_accounts_test_utils.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "google_apis/gaia/gaia_auth_util.h"
diff --git a/services/network/origin_policy/origin_policy_constants.h b/services/network/origin_policy/origin_policy_constants.h index c9f4600..1fe98db 100644 --- a/services/network/origin_policy/origin_policy_constants.h +++ b/services/network/origin_policy/origin_policy_constants.h
@@ -10,7 +10,6 @@ const char kOriginPolicyDeletePolicy[] = "0"; const char kOriginPolicyReportTo[] = "report-to"; const char kOriginPolicyPolicy[] = "policy"; - // Maximum policy size (implementation-defined limit in bytes). // (Limit copied from network::SimpleURLLoader::kMaxBoundedStringDownloadSize.) static const size_t kOriginPolicyMaxPolicySize = 1024 * 1024;
diff --git a/services/network/origin_policy/origin_policy_fetcher.cc b/services/network/origin_policy/origin_policy_fetcher.cc index d7fba35..ea3e03e 100644 --- a/services/network/origin_policy/origin_policy_fetcher.cc +++ b/services/network/origin_policy/origin_policy_fetcher.cc
@@ -8,8 +8,11 @@ #include "base/strings/strcat.h" #include "net/base/load_flags.h" #include "net/http/http_util.h" +#include "services/network/origin_policy/origin_policy_constants.h" #include "services/network/origin_policy/origin_policy_manager.h" +#include "services/network/public/cpp/resource_response.h" #include "services/network/public/cpp/simple_url_loader.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" namespace network { @@ -86,6 +89,7 @@ std::vector<std::string>* to_be_removed_headers) { if (IsValidRedirect(redirect_info)) { must_redirect_ = false; + // TODO(andypaicu): should we callback with the original url or the new url? fetch_url_ = redirect_info.new_url; return; } @@ -143,17 +147,20 @@ void OriginPolicyFetcher::WorkDone(std::unique_ptr<std::string> policy_content, mojom::OriginPolicyState state) { - auto result = mojom::OriginPolicy::New(); - result->state = state; - if (policy_content) { - result->contents = mojom::OriginPolicyContents::New(); - result->contents->raw_policy = *policy_content; + if (callback_) { + auto result = mojom::OriginPolicy::New(); + result->state = state; + if (policy_content) { + result->contents = mojom::OriginPolicyContents::New(); + result->contents->raw_policy = *policy_content; + } + result->policy_url = fetch_url_; + + std::move(callback_).Run(std::move(result)); } - result->policy_url = fetch_url_; // Do not add code after this call as it will destroy this object. - owner_policy_manager_->FetcherDone(this, std::move(result), - std::move(callback_)); + owner_policy_manager_->FetcherDone(this); } bool OriginPolicyFetcher::IsValidRedirect(
diff --git a/services/network/origin_policy/origin_policy_fetcher.h b/services/network/origin_policy/origin_policy_fetcher.h index 87681a08..97ac857 100644 --- a/services/network/origin_policy/origin_policy_fetcher.h +++ b/services/network/origin_policy/origin_policy_fetcher.h
@@ -88,7 +88,7 @@ mojom::OriginPolicyManager::RetrieveOriginPolicyCallback callback_; // Will be true if we started a fetch at <origin>/well-known/origin-policy - // which must redirect to the latest origin policy. + // which will redirect to the latest origin policy. bool must_redirect_; DISALLOW_COPY_AND_ASSIGN(OriginPolicyFetcher);
diff --git a/services/network/origin_policy/origin_policy_fetcher_unittest.cc b/services/network/origin_policy/origin_policy_fetcher_unittest.cc index 8eed79c0..042bfc3 100644 --- a/services/network/origin_policy/origin_policy_fetcher_unittest.cc +++ b/services/network/origin_policy/origin_policy_fetcher_unittest.cc
@@ -53,13 +53,6 @@ manager_ = std::make_unique<OriginPolicyManager>( network_context_->CreateUrlLoaderFactoryForNetworkService()); - - test_server_.RegisterRequestHandler(base::BindRepeating( - &OriginPolicyFetcherTest::HandleResponse, base::Unretained(this))); - - EXPECT_TRUE(test_server_.Start()); - - test_server_origin_ = url::Origin::Create(test_server_.base_url()); } const url::Origin& test_server_origin() const { return test_server_origin_; } @@ -71,6 +64,16 @@ } protected: + // testing::Test implementation. + void SetUp() override { + test_server_.RegisterRequestHandler(base::BindRepeating( + &OriginPolicyFetcherTest::HandleResponse, base::Unretained(this))); + + EXPECT_TRUE(test_server_.Start()); + + test_server_origin_ = url::Origin::Create(test_server_.base_url()); + } + const net::test_server::EmbeddedTestServer& test_server() const { return test_server_; }
diff --git a/services/network/origin_policy/origin_policy_manager.cc b/services/network/origin_policy/origin_policy_manager.cc index 17f7662..ec19690 100644 --- a/services/network/origin_policy/origin_policy_manager.cc +++ b/services/network/origin_policy/origin_policy_manager.cc
@@ -7,18 +7,9 @@ #include <memory> #include <utility> -#include "base/logging.h" #include "base/optional.h" #include "net/http/http_util.h" -#include "services/network/origin_policy/origin_policy_fetcher.h" - -namespace { - -// Marker for (temporarily) exempted origins. The presence of the "?" guarantees -// that this is not a valid policy as it is not a valid http token. -const char kExemptedOriginPolicyVersion[] = "exception?"; - -} // namespace +#include "services/network/origin_policy/origin_policy_constants.h" namespace network { @@ -37,82 +28,47 @@ const url::Origin& origin, const std::string& header_value, RetrieveOriginPolicyCallback callback) { - DCHECK(origin.GetURL().is_valid()); - DCHECK(!origin.opaque()); - OriginPolicyHeaderValues header_info = GetRequestedPolicyAndReportGroupFromHeaderString(header_value); - - auto iter = latest_version_map_.find(origin); - - // Process policy deletion first! - if (header_info.policy_version == kOriginPolicyDeletePolicy) { - if (iter != latest_version_map_.end()) - latest_version_map_.erase(iter); - InvokeCallbackWithPolicyState(origin, - mojom::OriginPolicyState::kNoPolicyApplies, - std::move(callback)); - return; - } - - // Process policy exceptions. - if (iter != latest_version_map_.end() && - iter->second == kExemptedOriginPolicyVersion) { - InvokeCallbackWithPolicyState(origin, - mojom::OriginPolicyState::kNoPolicyApplies, - std::move(callback)); - return; - } - - // No policy applies to this request or invalid header present. if (header_info.policy_version.empty()) { - // If there header has no policy version is present, use cached version, if - // there is one. Otherwise, fail. - if (iter == latest_version_map_.end()) { - InvokeCallbackWithPolicyState( - origin, - header_value.empty() ? mojom::OriginPolicyState::kNoPolicyApplies - : mojom::OriginPolicyState::kCannotLoadPolicy, - std::move(callback)); - return; + if (callback) { + auto result = mojom::OriginPolicy::New(); + result->state = mojom::OriginPolicyState::kCannotLoadPolicy; + std::move(callback).Run(std::move(result)); } - header_info.policy_version = iter->second; - } else if (iter == latest_version_map_.end()) { - latest_version_map_.emplace(origin, header_info.policy_version); - } else { - iter->second = header_info.policy_version; + return; } - origin_policy_fetchers_.emplace(std::make_unique<OriginPolicyFetcher>( - this, header_info.policy_version, header_info.report_to, origin, - url_loader_factory_.get(), std::move(callback))); -} - -void OriginPolicyManager::AddExceptionFor(const url::Origin& origin) { - latest_version_map_[origin] = kExemptedOriginPolicyVersion; -} - -void OriginPolicyManager::FetcherDone(OriginPolicyFetcher* fetcher, - mojom::OriginPolicyPtr origin_policy, - RetrieveOriginPolicyCallback callback) { - std::move(callback).Run(std::move(origin_policy)); - - auto it = origin_policy_fetchers_.find(fetcher); - DCHECK(it != origin_policy_fetchers_.end()); - origin_policy_fetchers_.erase(it); + // Here we might check the cache and only then start the fetch. + StartPolicyFetch(origin, header_info, std::move(callback)); } void OriginPolicyManager::RetrieveDefaultOriginPolicy( const url::Origin& origin, RetrieveOriginPolicyCallback callback) { - origin_policy_fetchers_.emplace(std::make_unique<OriginPolicyFetcher>( - this, std::string() /* report_to */, origin, url_loader_factory_.get(), - std::move(callback))); + // Here we might check the cache and only then start the fetch. + StartPolicyFetch(origin, OriginPolicyHeaderValues(), std::move(callback)); } -// static -const char* OriginPolicyManager::GetExemptedVersionForTesting() { - return kExemptedOriginPolicyVersion; +void OriginPolicyManager::StartPolicyFetch( + const url::Origin& origin, + const OriginPolicyHeaderValues& header_info, + RetrieveOriginPolicyCallback callback) { + if (header_info.policy_version.empty()) { + origin_policy_fetchers_.emplace(std::make_unique<OriginPolicyFetcher>( + this, header_info.report_to, origin, url_loader_factory_.get(), + std::move(callback))); + } else { + origin_policy_fetchers_.emplace(std::make_unique<OriginPolicyFetcher>( + this, header_info.policy_version, header_info.report_to, origin, + url_loader_factory_.get(), std::move(callback))); + } +} + +void OriginPolicyManager::FetcherDone(OriginPolicyFetcher* fetcher) { + auto it = origin_policy_fetchers_.find(fetcher); + DCHECK(it != origin_policy_fetchers_.end()); + origin_policy_fetchers_.erase(it); } // static @@ -146,15 +102,4 @@ return OriginPolicyHeaderValues({policy.value(), report_to.value_or("")}); } -// static -void OriginPolicyManager::InvokeCallbackWithPolicyState( - const url::Origin& origin, - mojom::OriginPolicyState state, - RetrieveOriginPolicyCallback callback) { - mojom::OriginPolicyPtr result = mojom::OriginPolicy::New(); - result->state = state; - result->policy_url = OriginPolicyFetcher::GetDefaultPolicyURL(origin); - std::move(callback).Run(std::move(result)); -} - } // namespace network
diff --git a/services/network/origin_policy/origin_policy_manager.h b/services/network/origin_policy/origin_policy_manager.h index 950d29d1..7b352ce 100644 --- a/services/network/origin_policy/origin_policy_manager.h +++ b/services/network/origin_policy/origin_policy_manager.h
@@ -5,7 +5,6 @@ #ifndef SERVICES_NETWORK_ORIGIN_POLICY_ORIGIN_POLICY_MANAGER_H_ #define SERVICES_NETWORK_ORIGIN_POLICY_ORIGIN_POLICY_MANAGER_H_ -#include <map> #include <memory> #include <set> #include <string> @@ -14,14 +13,12 @@ #include "base/containers/unique_ptr_adapters.h" #include "base/macros.h" #include "mojo/public/cpp/bindings/binding_set.h" -#include "services/network/origin_policy/origin_policy_constants.h" +#include "services/network/origin_policy/origin_policy_fetcher.h" #include "services/network/public/mojom/origin_policy_manager.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" namespace network { -class OriginPolicyFetcher; - // The OriginPolicyManager is the entry point for all Origin Policy related // API calls. Spec: https://wicg.github.io/origin-policy/ // A client will likely call AddBinding (or use the NetworkContext function) @@ -47,17 +44,14 @@ // coming through the associated pipe will be served by this object. void AddBinding(mojom::OriginPolicyManagerRequest request); - // mojom::OriginPolicyManager + // mojom::OriginPolicy void RetrieveOriginPolicy(const url::Origin& origin, const std::string& header_value, RetrieveOriginPolicyCallback callback) override; - void AddExceptionFor(const url::Origin& origin) override; // To be called by fetcher when it has finished its work. // This removes the fetcher which results in the fetcher being destroyed. - void FetcherDone(OriginPolicyFetcher* fetcher, - mojom::OriginPolicyPtr origin_policy, - RetrieveOriginPolicyCallback callback); + void FetcherDone(OriginPolicyFetcher* fetcher); // Retrieves an origin's default origin policy by attempting to fetch it // from "<origin>/.well-known/origin-policy". @@ -75,28 +69,17 @@ return GetRequestedPolicyAndReportGroupFromHeaderString(header_value); } - // Get the version used for exempted policies. For testing purposes only. - static const char* GetExemptedVersionForTesting(); - private: - using KnownVersionMap = std::map<url::Origin, std::string>; - // Parses a header and returns the result. If a parsed result does not contain // a non-empty policy version it means the `header_value` is invalid. static OriginPolicyHeaderValues GetRequestedPolicyAndReportGroupFromHeaderString( const std::string& header_value); - // Returns an origin policy with the specified state. The contents is empty - // and the `policy_url` is the default policy url for the specified origin. - static void InvokeCallbackWithPolicyState( - const url::Origin& origin, - mojom::OriginPolicyState state, - RetrieveOriginPolicyCallback callback); - - // In memory cache of current policy version per origin. - // TODO(andypaicu): clear this when the disk cache is cleaned. - KnownVersionMap latest_version_map_; + // Will start a fetch based on the provided origin and info. + void StartPolicyFetch(const url::Origin& origin, + const OriginPolicyHeaderValues& header_info, + RetrieveOriginPolicyCallback callback); // A list of fetchers owned by this object std::set<std::unique_ptr<OriginPolicyFetcher>, base::UniquePtrComparator>
diff --git a/services/network/origin_policy/origin_policy_manager_unittest.cc b/services/network/origin_policy/origin_policy_manager_unittest.cc index 0848a63..1a04b27 100644 --- a/services/network/origin_policy/origin_policy_manager_unittest.cc +++ b/services/network/origin_policy/origin_policy_manager_unittest.cc
@@ -5,16 +5,13 @@ #include <memory> #include <utility> -#include "base/strings/strcat.h" #include "base/test/scoped_task_environment.h" #include "net/http/http_status_code.h" -#include "net/http/http_util.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "services/network/network_context.h" #include "services/network/network_service.h" -#include "services/network/origin_policy/origin_policy_fetcher.h" #include "services/network/origin_policy/origin_policy_manager.h" #include "testing/gtest/include/gtest/gtest.h" @@ -44,26 +41,9 @@ std::move(context_params)); manager_ = std::make_unique<OriginPolicyManager>( network_context_->CreateUrlLoaderFactoryForNetworkService()); - - test_server_.RegisterRequestHandler(base::BindRepeating( - &OriginPolicyManagerTest::HandleResponse, base::Unretained(this))); - - EXPECT_TRUE(test_server_.Start()); - - test_server_origin_ = url::Origin::Create(test_server_.base_url()); - - test_server_2_.RegisterRequestHandler(base::BindRepeating( - &OriginPolicyManagerTest::HandleResponse, base::Unretained(this))); - - EXPECT_TRUE(test_server_2_.Start()); - - test_server_origin_2_ = url::Origin::Create(test_server_2_.base_url()); } const url::Origin& test_server_origin() const { return test_server_origin_; } - const url::Origin& test_server_origin_2() const { - return test_server_origin_2_; - } OriginPolicyManager* manager() { return manager_.get(); } @@ -72,17 +52,23 @@ void WaitUntilResponseHandled() { response_run_loop.Run(); } protected: + // testing::Test implementation. + void SetUp() override { + test_server_.RegisterRequestHandler(base::BindRepeating( + &OriginPolicyManagerTest::HandleResponse, base::Unretained(this))); + + EXPECT_TRUE(test_server_.Start()); + + test_server_origin_ = url::Origin::Create(test_server_.base_url()); + } + std::unique_ptr<net::test_server::HttpResponse> HandleResponse( const net::test_server::HttpRequest& request) { response_run_loop.Quit(); std::unique_ptr<net::test_server::BasicHttpResponse> response = std::make_unique<net::test_server::BasicHttpResponse>(); - if (request.relative_url == "/.well-known/origin-policy") { - response->set_code(net::HTTP_FOUND); - response->AddCustomHeader("Location", - "/.well-known/origin-policy/policy-1"); - } else if (request.relative_url == "/.well-known/origin-policy/policy-1") { + if (request.relative_url == "/.well-known/origin-policy/policy-1") { response->set_code(net::HTTP_OK); response->set_content("manifest-1"); } else if (request.relative_url == "/.well-known/origin-policy/policy-2") { @@ -113,11 +99,9 @@ std::unique_ptr<NetworkContext> network_context_; mojom::NetworkContextPtr network_context_ptr_; std::unique_ptr<OriginPolicyManager> manager_; - base::RunLoop response_run_loop; net::test_server::EmbeddedTestServer test_server_; - net::test_server::EmbeddedTestServer test_server_2_; url::Origin test_server_origin_; - url::Origin test_server_origin_2_; + base::RunLoop response_run_loop; DISALLOW_COPY_AND_ASSIGN(OriginPolicyManagerTest); }; @@ -135,10 +119,8 @@ } TEST_F(OriginPolicyManagerTest, ParseHeaders) { - const std::string kExemptedOriginPolicyVersion = - OriginPolicyManager::GetExemptedVersionForTesting(); const struct { - const std::string header; + const char* header; const char* expected_policy_version; const char* expected_report_to; } kTests[] = { @@ -214,13 +196,6 @@ {"policy=, policy=p2, report-to=r1", "", ""}, {"policy=, policy=, report-to=r1", "", ""}, {"policy=p1, report-to=r1, report-to=r2", "", ""}, - - // kExemptedOriginPolicyVersion is not a valid version - {base::StrCat({"policy=", kExemptedOriginPolicyVersion}), "", ""}, - {base::StrCat({"report-to=r, policy=", kExemptedOriginPolicyVersion}), "", - ""}, - {base::StrCat({"policy=", kExemptedOriginPolicyVersion, ", report-to=r"}), - "", ""}, }; for (const auto& test : kTests) { SCOPED_TRACE(test.header); @@ -229,21 +204,17 @@ EXPECT_EQ(test.expected_policy_version, result.policy_version); EXPECT_EQ(test.expected_report_to, result.report_to); } - - EXPECT_FALSE(net::HttpUtil::IsToken(kExemptedOriginPolicyVersion)); } // Helper class for starting saving a retrieved policy result class TestOriginPolicyManagerResult { public: - TestOriginPolicyManagerResult(OriginPolicyManagerTest* fixture, - OriginPolicyManager* manager = nullptr) - : fixture_(fixture), manager_(manager ? manager : fixture->manager()) {} + TestOriginPolicyManagerResult() {} void RetrieveOriginPolicy(const std::string& header_value, - const url::Origin* origin = nullptr) { - manager_->RetrieveOriginPolicy( - origin ? *origin : fixture_->test_server_origin(), header_value, + OriginPolicyManagerTest* fixture) { + fixture->manager()->RetrieveOriginPolicy( + fixture->test_server_origin(), header_value, base::BindOnce(&TestOriginPolicyManagerResult::Callback, base::Unretained(this))); run_loop_.Run(); @@ -260,8 +231,6 @@ } base::RunLoop run_loop_; - OriginPolicyManagerTest* fixture_; - OriginPolicyManager* manager_; mojom::OriginPolicyPtr origin_policy_result_; DISALLOW_COPY_AND_ASSIGN(TestOriginPolicyManagerResult); @@ -280,7 +249,7 @@ {"policy=policy-2, report-to=endpoint", mojom::OriginPolicyState::kLoaded, "manifest-2"}, - {"", mojom::OriginPolicyState::kNoPolicyApplies, ""}, + {"", mojom::OriginPolicyState::kCannotLoadPolicy, ""}, {"unknown=keyword", mojom::OriginPolicyState::kCannotLoadPolicy, ""}, {"report_to=endpoint", mojom::OriginPolicyState::kCannotLoadPolicy, ""}, {"policy=policy/policy-3", mojom::OriginPolicyState::kCannotLoadPolicy, @@ -297,11 +266,8 @@ for (const auto& test : kTests) { SCOPED_TRACE(test.header); - OriginPolicyManager manager( - network_context()->CreateUrlLoaderFactoryForNetworkService()); - - TestOriginPolicyManagerResult tester(this, &manager); - tester.RetrieveOriginPolicy(test.header); + TestOriginPolicyManagerResult tester; + tester.RetrieveOriginPolicy(test.header, this); EXPECT_EQ(test.expected_state, tester.origin_policy_result()->state); if (test.expected_raw_policy.empty()) { EXPECT_FALSE(tester.origin_policy_result()->contents); @@ -336,92 +302,4 @@ // the test has passed. } -TEST_F(OriginPolicyManagerTest, CacheStatesAfterPolicyFetches) { - const struct { - std::string header; - mojom::OriginPolicyState expected_state; - std::string expected_raw_policy; - const url::Origin& origin; - } kTests[] = { - // The order of these tests is important as the cache is not cleared in - // between tests and some tests rely on the state left over by previous - // tests. - - // Nothing in the cache, no policy applies if header unspecified. - {"", mojom::OriginPolicyState::kNoPolicyApplies, "", - test_server_origin()}, - - // An invalid header and nothing in the cache means an error. - {"invalid", mojom::OriginPolicyState::kCannotLoadPolicy, "", - test_server_origin()}, - - // A valid header results in loaded policy. - {"policy=policy-1", mojom::OriginPolicyState::kLoaded, "manifest-1", - test_server_origin()}, - - // With a valid header, we use that version if header unspecified. - {"", mojom::OriginPolicyState::kLoaded, "manifest-1", - test_server_origin()}, - - // A second valid header results in loaded policy. Changes cached last - // version. - {"policy=policy-2", mojom::OriginPolicyState::kLoaded, "manifest-2", - test_server_origin()}, - - // The latest version is correctly uses when header is unspecified. - {"", mojom::OriginPolicyState::kLoaded, "manifest-2", - test_server_origin()}, - - // Same as above for invalid header. - {"invalid", mojom::OriginPolicyState::kLoaded, "manifest-2", - test_server_origin()}, - - // Delete the policy. - {base::StrCat({"policy=", kOriginPolicyDeletePolicy}), - mojom::OriginPolicyState::kNoPolicyApplies, "", test_server_origin()}, - - // We are the back to the initial status quo, no policy applies if header - // unspecified. - {"", mojom::OriginPolicyState::kNoPolicyApplies, "", - test_server_origin()}, - - // Load a new policy to have something in the cache. - {"policy=policy-1", mojom::OriginPolicyState::kLoaded, "manifest-1", - test_server_origin()}, - - // Check that the version in the cache is used. - {"", mojom::OriginPolicyState::kLoaded, "manifest-1", - test_server_origin()}, - - // In a different origin, it should not pick up the initial origin's - // cached version. - {"", mojom::OriginPolicyState::kNoPolicyApplies, "", - test_server_origin_2()}, - - // Load a new policy to have something in the cache for the second origin. - {"policy=policy-2", mojom::OriginPolicyState::kLoaded, "manifest-2", - test_server_origin_2()}, - - // Check that the version in the cache is used for the second origin. - {"", mojom::OriginPolicyState::kLoaded, "manifest-2", - test_server_origin_2()}, - - // The initial origins cached state is unaffected. - {"", mojom::OriginPolicyState::kLoaded, "manifest-1", - test_server_origin()}, - }; - - for (const auto& test : kTests) { - TestOriginPolicyManagerResult tester(this); - tester.RetrieveOriginPolicy(test.header, &test.origin); - EXPECT_EQ(test.expected_state, tester.origin_policy_result()->state); - if (test.expected_raw_policy.empty()) { - EXPECT_FALSE(tester.origin_policy_result()->contents); - } else { - EXPECT_EQ(test.expected_raw_policy, - tester.origin_policy_result()->contents->raw_policy); - } - } -} - } // namespace network
diff --git a/services/network/public/cpp/data_element.h b/services/network/public/cpp/data_element.h index 28de27d..bad163b 100644 --- a/services/network/public/cpp/data_element.h +++ b/services/network/public/cpp/data_element.h
@@ -44,7 +44,10 @@ DataElement& operator=(DataElement&& other); mojom::DataElementType type() const { return type_; } - const char* bytes() const { return bytes_ ? bytes_ : buf_.data(); } + const char* bytes() const { + return bytes_ ? reinterpret_cast<const char*>(bytes_) + : reinterpret_cast<const char*>(buf_.data()); + } const base::FilePath& path() const { return path_; } const base::File& file() const { return file_; } const std::string& blob_uuid() const { return blob_uuid_; } @@ -56,18 +59,19 @@ // For use with SetToAllocatedBytes. Should only be used after calling // SetToAllocatedBytes. - char* mutable_bytes() { return &buf_[0]; } + char* mutable_bytes() { return reinterpret_cast<char*>(&buf_[0]); } // Sets TYPE_BYTES data. This copies the given data into the element. void SetToBytes(const char* bytes, int bytes_len) { type_ = mojom::DataElementType::kBytes; bytes_ = nullptr; - buf_.assign(bytes, bytes + bytes_len); + buf_.assign(reinterpret_cast<const uint8_t*>(bytes), + reinterpret_cast<const uint8_t*>(bytes + bytes_len)); length_ = buf_.size(); } // Sets TYPE_BYTES data. This moves the given data vector into the element. - void SetToBytes(std::vector<char> bytes) { + void SetToBytes(std::vector<uint8_t> bytes) { type_ = mojom::DataElementType::kBytes; bytes_ = nullptr; buf_ = std::move(bytes); @@ -89,7 +93,8 @@ DCHECK_EQ(type_, mojom::DataElementType::kBytes); DCHECK_NE(length_, std::numeric_limits<uint64_t>::max()); DCHECK(!bytes_); - buf_.insert(buf_.end(), bytes, bytes + bytes_len); + buf_.insert(buf_.end(), reinterpret_cast<const uint8_t*>(bytes), + reinterpret_cast<const uint8_t*>(bytes + bytes_len)); length_ = buf_.size(); } @@ -98,7 +103,7 @@ // You cannot use AppendBytes with this method. void SetToSharedBytes(const char* bytes, int bytes_len) { type_ = mojom::DataElementType::kBytes; - bytes_ = bytes; + bytes_ = reinterpret_cast<const uint8_t*>(bytes); length_ = bytes_len; } @@ -175,12 +180,10 @@ friend struct mojo::StructTraits<network::mojom::DataElementDataView, network::DataElement>; mojom::DataElementType type_; - // TODO(Richard): Use uint8_t instead of char to align with mojom type // For TYPE_BYTES. - std::vector<char> buf_; - // TODO(Richard): Use uint8_t instead of char to align with mojom type + std::vector<uint8_t> buf_; // For TYPE_BYTES. - const char* bytes_; + const uint8_t* bytes_; // For TYPE_FILE and TYPE_RAW_FILE. base::FilePath path_; // For TYPE_RAW_FILE.
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc index 6d52910..fc98e3f 100644 --- a/services/network/public/cpp/features.cc +++ b/services/network/public/cpp/features.cc
@@ -9,6 +9,15 @@ namespace network { namespace features { +const char kNetworkServiceFeatureName[] = +#if defined(OS_ANDROID) + "NetworkService"; +#else + // Rename the flag so that shortcuts with the old name don't work. + // This codepath doesn't work anymore on desktop. + "NetworkServiceNotSupported"; +#endif + // Enables Expect CT reporting, which sends reports for opted-in sites // that don't serve sufficient Certificate Transparency information. const base::Feature kExpectCTReporting{"ExpectCTReporting", @@ -17,7 +26,7 @@ const base::Feature kNetworkErrorLogging{"NetworkErrorLogging", base::FEATURE_ENABLED_BY_DEFAULT}; // Enables the network service. -const base::Feature kNetworkService{"NetworkService", +const base::Feature kNetworkService{kNetworkServiceFeatureName, base::FEATURE_ENABLED_BY_DEFAULT}; // Out of Blink CORS
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h index 1fe733d..361a088 100644 --- a/services/network/public/cpp/features.h +++ b/services/network/public/cpp/features.h
@@ -12,6 +12,9 @@ namespace features { COMPONENT_EXPORT(NETWORK_CPP) +extern const char kNetworkServiceFeatureName[]; + +COMPONENT_EXPORT(NETWORK_CPP) extern const base::Feature kExpectCTReporting; COMPONENT_EXPORT(NETWORK_CPP) extern const base::Feature kNetworkErrorLogging;
diff --git a/services/network/public/cpp/resource_request_body.cc b/services/network/public/cpp/resource_request_body.cc index 2c7cec65..0b67ad8 100644 --- a/services/network/public/cpp/resource_request_body.cc +++ b/services/network/public/cpp/resource_request_body.cc
@@ -21,7 +21,7 @@ return result; } -void ResourceRequestBody::AppendBytes(std::vector<char> bytes) { +void ResourceRequestBody::AppendBytes(std::vector<uint8_t> bytes) { DCHECK(elements_.empty() || elements_.front().type() != mojom::DataElementType::kChunkedDataPipe); @@ -32,8 +32,9 @@ } void ResourceRequestBody::AppendBytes(const char* bytes, int bytes_len) { - std::vector<char> vec; - vec.assign(bytes, bytes + bytes_len); + std::vector<uint8_t> vec; + vec.assign(reinterpret_cast<const uint8_t*>(bytes), + reinterpret_cast<const uint8_t*>(bytes + bytes_len)); AppendBytes(std::move(vec)); }
diff --git a/services/network/public/cpp/resource_request_body.h b/services/network/public/cpp/resource_request_body.h index fc6e9ff3..eae9bc8 100644 --- a/services/network/public/cpp/resource_request_body.h +++ b/services/network/public/cpp/resource_request_body.h
@@ -31,7 +31,7 @@ static scoped_refptr<ResourceRequestBody> CreateFromBytes(const char* bytes, size_t length); - void AppendBytes(std::vector<char> bytes); + void AppendBytes(std::vector<uint8_t> bytes); void AppendBytes(const char* bytes, int bytes_len); void AppendFileRange(const base::FilePath& file_path, uint64_t offset,
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc index 0a270b8..08e1563f 100644 --- a/services/network/public/cpp/url_request_mojom_traits.cc +++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -233,12 +233,8 @@ !data.ReadExpectedModificationTime(&out->expected_modification_time_)) { return false; } - // TODO(Richard): Fix this workaround once |buf_| becomes vector<uint8_t> if (data.type() == network::mojom::DataElementType::kBytes) { - out->buf_.resize(data.length()); - auto buf = base::make_span(reinterpret_cast<uint8_t*>(out->buf_.data()), - out->buf_.size()); - if (!data.ReadBuf(&buf)) + if (!data.ReadBuf(&out->buf_)) return false; } out->type_ = data.type();
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h index b39b668..9825b1f 100644 --- a/services/network/public/cpp/url_request_mojom_traits.h +++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -266,14 +266,12 @@ const network::DataElement& element) { return element.type_; } - static base::span<const uint8_t> buf(const network::DataElement& element) { + static std::vector<uint8_t> buf(const network::DataElement& element) { if (element.bytes_) { - return base::make_span(reinterpret_cast<const uint8_t*>(element.bytes_), - element.length_); + return std::vector<uint8_t>(element.bytes_, + element.bytes_ + element.length_); } - return base::make_span( - reinterpret_cast<const uint8_t*>(element.buf_.data()), - element.buf_.size()); + return std::move(element.buf_); } static const base::FilePath& path(const network::DataElement& element) { return element.path_;
diff --git a/services/network/public/mojom/origin_policy_manager.mojom b/services/network/public/mojom/origin_policy_manager.mojom index 5785a8f4..94e8e6a 100644 --- a/services/network/public/mojom/origin_policy_manager.mojom +++ b/services/network/public/mojom/origin_policy_manager.mojom
@@ -81,14 +81,7 @@ interface OriginPolicyManager { // Attempts to retrieve the origin policy for an origin and // `Sec-Origin-Policy` HTTP header value. Calls back with the result. - // The header_value needs to contain a proper policy version or be empty. An - // invalid header_value will result in a returned empty policy with the state - // of `kCannotLoadPolicy`. // https://wicg.github.io/origin-policy/#origin-policy-header RetrieveOriginPolicy(url.mojom.Origin origin, string header_value) => (OriginPolicy origin_policy); - - // Adds an exception for the specified origin. This means that no policy will - // apply for the specified origin from this point forward. - AddExceptionFor(url.mojom.Origin origin); };
diff --git a/services/network/throttling/throttling_network_interceptor.cc b/services/network/throttling/throttling_network_interceptor.cc index 88a57ca..a5236b0 100644 --- a/services/network/throttling/throttling_network_interceptor.cc +++ b/services/network/throttling/throttling_network_interceptor.cc
@@ -277,7 +277,7 @@ const ThrottleCallback& callback) { records->erase(std::remove_if(records->begin(), records->end(), [&callback](const ThrottleRecord& record) { - return record.callback.Equals(callback); + return record.callback == callback; }), records->end()); }
diff --git a/services/tracing/perfetto/json_exporter_main.cc b/services/tracing/perfetto/json_exporter_main.cc index 50057ff6..90868ec 100644 --- a/services/tracing/perfetto/json_exporter_main.cc +++ b/services/tracing/perfetto/json_exporter_main.cc
@@ -30,7 +30,6 @@ bool has_more) { CHECK_EQ(output_file->WriteAtCurrentPos(json->data(), json->size()), static_cast<int>(json->size())); - LOG(ERROR) << "Finished writing " << json->size() << " bytes to file."; } void WriteJsonTrace(const std::string& data, base::File* output_file) {
diff --git a/services/tracing/perfetto/track_event_json_exporter.cc b/services/tracing/perfetto/track_event_json_exporter.cc index 8b18c30..2dfb388 100644 --- a/services/tracing/perfetto/track_event_json_exporter.cc +++ b/services/tracing/perfetto/track_event_json_exporter.cc
@@ -15,6 +15,7 @@ namespace { using ::perfetto::protos::ChromeTracePacket; +using ::perfetto::protos::ThreadDescriptor; using ::perfetto::protos::TrackEvent; const std::string& GetInternedName( @@ -25,6 +26,40 @@ return iter->second; } +const char* ThreadTypeToName(ThreadDescriptor::ChromeThreadType type) { + switch (type) { + case ThreadDescriptor::CHROME_THREAD_MAIN: + return "CrProcessMain"; + case ThreadDescriptor::CHROME_THREAD_IO: + return "ChromeIOThread"; + case ThreadDescriptor::CHROME_THREAD_POOL_FG_WORKER: + return "ThreadPoolForegroundWorker&"; + case ThreadDescriptor::CHROME_THREAD_POOL_BG_WORKER: + return "ThreadPoolBackgroundWorker&"; + case ThreadDescriptor::CHROME_THREAD_POOL_FB_BLOCKING: + return "ThreadPoolSingleThreadForegroundBlocking&"; + case ThreadDescriptor::CHROME_THREAD_POOL_BG_BLOCKING: + return "ThreadPoolSingleThreadBackgroundBlocking&"; + case ThreadDescriptor::CHROME_THREAD_POOL_SERVICE: + return "ThreadPoolService"; + case ThreadDescriptor::CHROME_THREAD_COMPOSITOR_WORKER: + return "CompositorTileWorker&"; + case ThreadDescriptor::CHROME_THREAD_COMPOSITOR: + return "Compositor"; + case ThreadDescriptor::CHROME_THREAD_VIZ_COMPOSITOR: + return "VizCompositorThread"; + case ThreadDescriptor::CHROME_THREAD_SERVICE_WORKER: + return "ServiceWorkerThread&"; + case ThreadDescriptor::CHROME_THREAD_MEMORY_INFRA: + return "MemoryInfra"; + case ThreadDescriptor::CHROME_THREAD_SAMPLING_PROFILER: + return "StackSamplingProfiler"; + + case ThreadDescriptor::CHROME_THREAD_UNSPECIFIED: + return nullptr; + } +} + } // namespace TrackEventJSONExporter::TrackEventJSONExporter( @@ -313,18 +348,13 @@ add_arg->AppendF("\"%s\"", name); } }; - switch (thread.chrome_thread_type()) { - // TODO(nuskos): As we add more thread types we will add handling here to - // switch the enum to a string and call |emit_thread_name()| - case perfetto::protos::ThreadDescriptor::THREAD_TYPE_UNSPECIFIED: - // No thread type enum so check to see if a explicit thread name was - // provided.. - if (thread.has_thread_name()) { - emit_thread_name(thread.thread_name().c_str()); - } - break; - default: - break; + if (thread.has_thread_name()) { + emit_thread_name(thread.thread_name().c_str()); + } else { + const char* name = ThreadTypeToName(thread.chrome_thread_type()); + if (name) { + emit_thread_name(name); + } } }
diff --git a/services/tracing/perfetto/track_event_json_exporter_unittest.cc b/services/tracing/perfetto/track_event_json_exporter_unittest.cc index fd3c5a280..35a7476 100644 --- a/services/tracing/perfetto/track_event_json_exporter_unittest.cc +++ b/services/tracing/perfetto/track_event_json_exporter_unittest.cc
@@ -494,7 +494,7 @@ std::vector<perfetto::protos::TracePacket> trace_packet_protos; trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); FinalizePackets(trace_packet_protos); @@ -507,7 +507,7 @@ std::vector<perfetto::protos::TracePacket> trace_packet_protos; trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket( - /* sort_index = */ 2, ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + /* sort_index = */ 2, ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); FinalizePackets(trace_packet_protos); @@ -527,7 +527,7 @@ std::vector<perfetto::protos::TracePacket> trace_packet_protos; trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, kThreadName, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); FinalizePackets(trace_packet_protos); @@ -542,11 +542,30 @@ EXPECT_EQ(kThreadName, events[0]->GetKnownArgAsString("name")); } +TEST_F(TrackEventJsonExporterTest, MainThreadNameThreadDescriptor) { + std::vector<perfetto::protos::TracePacket> trace_packet_protos; + trace_analyzer::TraceEventVector events; + AddThreadDescriptorPacket( + /* sort_index = */ base::nullopt, ThreadDescriptor::CHROME_THREAD_MAIN, + base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, + &trace_packet_protos); + FinalizePackets(trace_packet_protos); + ASSERT_EQ(1u, trace_analyzer()->FindEvents( + Query(Query::EVENT_NAME) == Query::String("thread_name"), + &events)); + EXPECT_EQ("thread_name", events[0]->name); + EXPECT_EQ("__metadata", events[0]->category); + EXPECT_EQ('M', events[0]->phase); + EXPECT_EQ(0, events[0]->timestamp); + ASSERT_TRUE(events[0]->HasArg("name")); + EXPECT_EQ("CrProcessMain", events[0]->GetKnownArgAsString("name")); +} + TEST_F(TrackEventJsonExporterTest, MultipleThreadDescriptors) { std::vector<perfetto::protos::TracePacket> trace_packet_protos; trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket( - /* sort_index = */ 2, ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + /* sort_index = */ 2, ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, kThreadName, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); // This packet will be ignored because we've already emitted the sort_index of @@ -554,13 +573,13 @@ // isn't supposed to have changed (even if reset). ASSERT_NE("different_thread_name", kThreadName); AddThreadDescriptorPacket( - /* sort_index = */ 3, ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + /* sort_index = */ 3, ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, "different_thread_name", kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); trace_packet_protos.back().set_incremental_state_cleared(true); // Empty packet doesn't change anything. AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); FinalizePackets(trace_packet_protos); @@ -699,7 +718,7 @@ // This provides the pid & tid, as well as the timestamps reference points. AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); // To correctly use the state the thread descriptor has to come @@ -732,7 +751,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -770,7 +789,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -805,7 +824,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -835,7 +854,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -916,7 +935,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -955,7 +974,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1001,7 +1020,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1040,7 +1059,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1085,7 +1104,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1132,7 +1151,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1189,7 +1208,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1243,7 +1262,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1269,7 +1288,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1310,7 +1329,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1345,7 +1364,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1380,7 +1399,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1426,7 +1445,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1460,7 +1479,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1494,7 +1513,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1562,7 +1581,7 @@ trace_analyzer::TraceEventVector events; AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "legacy_event_name_3", &trace_packet_protos); @@ -1732,7 +1751,7 @@ // timestamps and one with an absolute timestamps 1 us further than the delta // events. AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(1, "sequence_1", &trace_packet_protos); @@ -1757,7 +1776,7 @@ // Sequence 2 alternates between emitting an event dropping packets and // clearing incremental state. AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(2, "sequence_2", &trace_packet_protos); @@ -1783,7 +1802,7 @@ // Reset the state. AddThreadDescriptorPacket( /* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs + 4 * 3, kReferenceThreadTimeUs + 3 * 3, &trace_packet_protos); trace_packet_protos.back().set_incremental_state_cleared(true); @@ -1802,7 +1821,7 @@ // Sequence 3 emits a single event to ensure that sequence 2 doesn't prevent // these events from being emitted. AddThreadDescriptorPacket(/* sort_index = */ base::nullopt, - ThreadDescriptor::THREAD_TYPE_UNSPECIFIED, + ThreadDescriptor::CHROME_THREAD_UNSPECIFIED, /* thread_name = */ base::nullopt, kReferenceTimeUs, kReferenceThreadTimeUs, &trace_packet_protos); AddInternedLegacyEventName(3, "sequence_3", &trace_packet_protos);
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc index 3d7f0ad..e4a55a6 100644 --- a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc +++ b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc
@@ -16,6 +16,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/scoped_task_environment.h" +#include "base/threading/thread_id_name_manager.h" #include "base/trace_event/trace_event.h" #include "components/tracing/common/tracing_switches.h" #include "services/tracing/public/mojom/perfetto_service.mojom.h" @@ -26,6 +27,7 @@ #include "third_party/perfetto/include/perfetto/protozero/scattered_stream_writer.h" #include "third_party/perfetto/protos/perfetto/trace/trace_packet.pb.h" #include "third_party/perfetto/protos/perfetto/trace/trace_packet.pbzero.h" +#include "third_party/perfetto/protos/perfetto/trace/track_event/thread_descriptor.pb.h" using TrackEvent = perfetto::protos::TrackEvent; @@ -33,6 +35,7 @@ namespace { +constexpr char kTestThread[] = "CrTestMain"; constexpr const char kCategoryGroup[] = "foo"; class MockProducerClient : public ProducerClient { @@ -188,6 +191,7 @@ scoped_task_environment_.GetMainThreadTaskRunner()); producer_client_ = std::make_unique<MockProducerClient>(std::move(perfetto_wrapper)); + base::ThreadIdNameManager::GetInstance()->SetName(kTestThread); } void TearDown() override { @@ -223,7 +227,8 @@ void ExpectThreadDescriptor(const perfetto::protos::TracePacket* packet, int64_t min_timestamp = 1u, - int64_t min_thread_time = 1u) { + int64_t min_thread_time = 1u, + bool filtering_enabled = false) { EXPECT_TRUE(packet->has_thread_descriptor()); EXPECT_NE(packet->thread_descriptor().pid(), 0); EXPECT_NE(packet->thread_descriptor().tid(), 0); @@ -237,6 +242,13 @@ EXPECT_LE(packet->thread_descriptor().reference_thread_time_us(), base::ThreadTicks::Now().since_origin().InMicroseconds()); } + if (filtering_enabled) { + EXPECT_FALSE(packet->thread_descriptor().has_thread_name()); + } else { + EXPECT_EQ(kTestThread, packet->thread_descriptor().thread_name()); + } + EXPECT_EQ(perfetto::protos::ThreadDescriptor::CHROME_THREAD_MAIN, + packet->thread_descriptor().chrome_thread_type()); last_timestamp_ = packet->thread_descriptor().reference_timestamp_us(); last_thread_time_ = packet->thread_descriptor().reference_thread_time_us(); @@ -928,7 +940,7 @@ EXPECT_EQ(producer_client()->GetFinalizedPacketCount(), 2u); auto* td_packet = producer_client()->GetFinalizedPacket(); - ExpectThreadDescriptor(td_packet); + ExpectThreadDescriptor(td_packet, 1u, 1u, /*filtering_enabled=*/true); auto* e_packet = producer_client()->GetFinalizedPacket(1); ExpectTraceEvent(e_packet, /*category_iid=*/1u, /*name_iid=*/1u,
diff --git a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc index 6bb3dec..e2bc055 100644 --- a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc +++ b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
@@ -5,6 +5,9 @@ #include "services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h" #include "base/stl_util.h" +#include "base/strings/pattern.h" +#include "base/strings/strcat.h" +#include "base/threading/thread_id_name_manager.h" #include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/trace_buffer.h" #include "base/trace_event/trace_log.h" @@ -23,6 +26,7 @@ using TraceLog = base::trace_event::TraceLog; using TrackEvent = perfetto::protos::pbzero::TrackEvent; +using perfetto::protos::pbzero::ThreadDescriptor; namespace tracing { @@ -108,6 +112,40 @@ } } +ThreadDescriptor::ChromeThreadType GetThreadType( + const char* const thread_name) { + if (base::MatchPattern(thread_name, "Cr*Main")) { + return ThreadDescriptor::CHROME_THREAD_MAIN; + } else if (base::MatchPattern(thread_name, "Chrome*IOThread")) { + return ThreadDescriptor::CHROME_THREAD_IO; + } else if (base::MatchPattern(thread_name, "ThreadPoolForegroundWorker*")) { + return ThreadDescriptor::CHROME_THREAD_POOL_FG_WORKER; + } else if (base::MatchPattern(thread_name, "ThreadPoolBackgroundWorker*")) { + return ThreadDescriptor::CHROME_THREAD_POOL_BG_WORKER; + } else if (base::MatchPattern(thread_name, + "ThreadPool*ForegroundBlocking*")) { + return ThreadDescriptor::CHROME_THREAD_POOL_FB_BLOCKING; + } else if (base::MatchPattern(thread_name, + "ThreadPool*BackgroundBlocking*")) { + return ThreadDescriptor::CHROME_THREAD_POOL_BG_BLOCKING; + } else if (base::MatchPattern(thread_name, "ThreadPoolService*")) { + return ThreadDescriptor::CHROME_THREAD_POOL_SERVICE; + } else if (base::MatchPattern(thread_name, "CompositorTileWorker*")) { + return ThreadDescriptor::CHROME_THREAD_COMPOSITOR_WORKER; + } else if (base::MatchPattern(thread_name, "Compositor")) { + return ThreadDescriptor::CHROME_THREAD_COMPOSITOR; + } else if (base::MatchPattern(thread_name, "VizCompositor*")) { + return ThreadDescriptor::CHROME_THREAD_VIZ_COMPOSITOR; + } else if (base::MatchPattern(thread_name, "ServiceWorker*")) { + return ThreadDescriptor::CHROME_THREAD_SERVICE_WORKER; + } else if (base::MatchPattern(thread_name, "MemoryInfra")) { + return ThreadDescriptor::CHROME_THREAD_MEMORY_INFRA; + } else if (base::MatchPattern(thread_name, "StackSamplingProfiler")) { + return ThreadDescriptor::CHROME_THREAD_SAMPLING_PROFILER; + } + return ThreadDescriptor::CHROME_THREAD_UNSPECIFIED; +} + } // namespace // static @@ -182,38 +220,7 @@ } if (reset_incremental_state_) { - interned_event_categories_.ResetEmittedState(); - interned_event_names_.ResetEmittedState(); - interned_annotation_names_.ResetEmittedState(); - interned_source_locations_.ResetEmittedState(); - - // Emit a new thread descriptor in a separate packet, where we also set - // the |reset_incremental_state| field. - auto trace_packet = trace_writer_->NewTracePacket(); - trace_packet->set_incremental_state_cleared(true); - auto* thread_descriptor = trace_packet->set_thread_descriptor(); - thread_descriptor->set_pid(process_id_); - thread_descriptor->set_tid(thread_id_); - if (explicit_timestamp) { - // Don't use a user-provided timestamp as a reference timestamp. - last_timestamp_ = TRACE_TIME_TICKS_NOW(); - } else { - last_timestamp_ = trace_event->timestamp(); - } - if (trace_event->thread_timestamp().is_null()) { - last_thread_time_ = ThreadNow(); - } else { - // Thread timestamp is never user-provided. - DCHECK(trace_event->thread_timestamp() <= ThreadNow()); - last_thread_time_ = trace_event->thread_timestamp(); - } - thread_descriptor->set_reference_timestamp_us( - last_timestamp_.since_origin().InMicroseconds()); - thread_descriptor->set_reference_thread_time_us( - last_thread_time_.since_origin().InMicroseconds()); - // TODO(eseckler): Fill in remaining fields in ThreadDescriptor. - - reset_incremental_state_ = false; + DoResetIncrementalState(trace_event, explicit_timestamp); } const char* category_name = @@ -496,4 +503,53 @@ trace_writer_->Flush(); } +void TrackEventThreadLocalEventSink::DoResetIncrementalState( + base::trace_event::TraceEvent* trace_event, + bool explicit_timestamp) { + interned_event_categories_.ResetEmittedState(); + interned_event_names_.ResetEmittedState(); + interned_annotation_names_.ResetEmittedState(); + interned_source_locations_.ResetEmittedState(); + + // Emit a new thread descriptor in a separate packet, where we also set + // the |reset_incremental_state| field. + auto trace_packet = trace_writer_->NewTracePacket(); + trace_packet->set_incremental_state_cleared(true); + auto* thread_descriptor = trace_packet->set_thread_descriptor(); + thread_descriptor->set_pid(process_id_); + thread_descriptor->set_tid(thread_id_); + + const char* const maybe_new_name = + base::ThreadIdNameManager::GetInstance()->GetName(thread_id_); + if (maybe_new_name && base::StringPiece(thread_name_) != maybe_new_name) { + thread_name_ = maybe_new_name; + thread_type_ = GetThreadType(maybe_new_name); + } + if (!privacy_filtering_enabled_ && !thread_name_.empty()) { + thread_descriptor->set_thread_name(thread_name_.c_str()); + } + thread_descriptor->set_chrome_thread_type(thread_type_); + + if (explicit_timestamp) { + // Don't use a user-provided timestamp as a reference timestamp. + last_timestamp_ = TRACE_TIME_TICKS_NOW(); + } else { + last_timestamp_ = trace_event->timestamp(); + } + if (trace_event->thread_timestamp().is_null()) { + last_thread_time_ = ThreadNow(); + } else { + // Thread timestamp is never user-provided. + DCHECK(trace_event->thread_timestamp() <= ThreadNow()); + last_thread_time_ = trace_event->thread_timestamp(); + } + thread_descriptor->set_reference_timestamp_us( + last_timestamp_.since_origin().InMicroseconds()); + thread_descriptor->set_reference_thread_time_us( + last_thread_time_.since_origin().InMicroseconds()); + // TODO(eseckler): Fill in remaining fields in ThreadDescriptor. + + reset_incremental_state_ = false; +} + } // namespace tracing
diff --git a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h index 4582cec..b672375 100644 --- a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h +++ b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h
@@ -16,6 +16,7 @@ #include "services/tracing/public/cpp/perfetto/thread_local_event_sink.h" #include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h" #include "third_party/perfetto/include/perfetto/protozero/message_handle.h" +#include "third_party/perfetto/protos/perfetto/trace/track_event/thread_descriptor.pbzero.h" namespace perfetto { class StartupTraceWriter; @@ -49,6 +50,9 @@ private: static constexpr size_t kMaxCompleteEventDepth = 30; + void DoResetIncrementalState(base::trace_event::TraceEvent* trace_event, + bool explicit_timestamp); + // TODO(eseckler): Make it possible to register new indexes for use from // TRACE_EVENT macros. InterningIndex<const char*> interned_event_categories_; @@ -65,6 +69,9 @@ base::ThreadTicks last_thread_time_; int process_id_; int thread_id_; + std::string thread_name_; + perfetto::protos::pbzero::ThreadDescriptor::ChromeThreadType thread_type_ = + perfetto::protos::pbzero::ThreadDescriptor::CHROME_THREAD_UNSPECIFIED; base::trace_event::TraceEvent complete_event_stack_[kMaxCompleteEventDepth]; uint32_t current_stack_depth_ = 0;
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 0c6bcef..dbe4cb5 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1325,11 +1325,6 @@ "label": "//ios/showcase:ios_showcase_egtests", "type": "raw", }, - "ios_chrome_unified_consent_egtests": { - "args": [], - "label": "//ios/chrome/test/earl_grey:ios_chrome_unified_consent_egtests", - "type": "raw", - }, "ios_web_inttests": { "args": [], "label": "//ios/web:ios_web_inttests",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py index 31caf9c..8f32988 100755 --- a/testing/buildbot/manage.py +++ b/testing/buildbot/manage.py
@@ -97,7 +97,6 @@ 'ios_chrome_smoke_egtests', 'ios_chrome_translate_egtests', 'ios_chrome_ui_egtests', - 'ios_chrome_unified_consent_egtests', 'ios_chrome_unittests', 'ios_chrome_web_egtests', 'ios_chrome_smoke_eg2tests_module',
diff --git a/testing/iossim/iossim.mm b/testing/iossim/iossim.mm index 1240c62..ebe66d97 100644 --- a/testing/iossim/iossim.mm +++ b/testing/iossim/iossim.mm
@@ -113,9 +113,13 @@ NSMutableArray* runtimes = [[simctl_list[@"runtimes"] mutableCopy] autorelease]; for (NSDictionary* runtime in simctl_list[@"runtimes"]) { + BOOL available = + [runtime[@"availability"] isEqualToString:@"(available)"] || + runtime[@"isAvailable"]; + if (![runtime[@"identifier"] hasPrefix:@"com.apple.CoreSimulator.SimRuntime.iOS"] || - ![runtime[@"availability"] isEqualToString:@"(available)"]) { + !available) { [runtimes removeObject:runtime]; } } @@ -209,6 +213,18 @@ return nil; } +// Create and a redturn a device udid of |device| and |sdk_version|. +NSString* CreateDeviceBySDKAndName(NSString* device, NSString* sdk_version) { + NSString* sdk = [@"iOS" stringByAppendingString:sdk_version]; + XCRunTask* create = [[[XCRunTask alloc] + initWithArguments:@[ @"simctl", @"create", device, device, sdk ]] + autorelease]; + [create run]; + + NSDictionary* simctl_list = GetSimulatorList(); + return GetDeviceBySDKAndName(simctl_list, device, sdk_version); +} + bool FindDeviceByUDID(NSDictionary* simctl_list, NSString* udid) { NSDictionary* devices_table = simctl_list[@"devices"]; for (id runtimes in devices_table) { @@ -433,10 +449,13 @@ if (udid == nil) { udid = GetDeviceBySDKAndName(simctl_list, device_name, sdk_version); if (udid == nil) { - LogError(@"Unable to find a device %@ with SDK %@.", device_name, - sdk_version); - PrintSupportedDevices(simctl_list); - exit(kExitInvalidArguments); + udid = CreateDeviceBySDKAndName(device_name, sdk_version); + if (udid == nil) { + LogError(@"Unable to find a device %@ with SDK %@.", device_name, + sdk_version); + PrintSupportedDevices(simctl_list); + exit(kExitInvalidArguments); + } } } else { if (!FindDeviceByUDID(simctl_list, udid)) {
diff --git a/third_party/blink/public/mojom/frame/document_interface_broker.mojom b/third_party/blink/public/mojom/frame/document_interface_broker.mojom index 7121203..e2feea13 100644 --- a/third_party/blink/public/mojom/frame/document_interface_broker.mojom +++ b/third_party/blink/public/mojom/frame/document_interface_broker.mojom
@@ -8,6 +8,7 @@ import "third_party/blink/public/mojom/appcache/appcache.mojom"; import "third_party/blink/public/mojom/credentialmanager/credential_manager.mojom"; import "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom"; +import "third_party/blink/public/mojom/push_messaging/push_messaging.mojom"; import "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom"; import "third_party/blink/public/mojom/webauthn/authenticator.mojom"; import "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom"; @@ -19,6 +20,7 @@ GetAuthenticator(blink.mojom.Authenticator& request); GetCredentialManager(blink.mojom.CredentialManager& request); GetFrameHostTestInterface(blink.mojom.FrameHostTestInterface& request); + GetPushMessaging(blink.mojom.PushMessaging& request); GetVirtualAuthenticatorManager(blink.test.mojom.VirtualAuthenticatorManager& request); RegisterAppCacheHost(blink.mojom.AppCacheHost& host_request, AppCacheFrontend frontend,
diff --git a/third_party/blink/public/platform/web_data.h b/third_party/blink/public/platform/web_data.h index 597188fc..8e9724f 100644 --- a/third_party/blink/public/platform/web_data.h +++ b/third_party/blink/public/platform/web_data.h
@@ -81,7 +81,7 @@ // Same as SharedBuffer::CopyAs, copies the segmented data into a // contiguous buffer. Use GetSomeData() or ForEachSegment() whenever // possible, if a copy can be avoided. - WebVector<char> Copy() const; + WebVector<uint8_t> Copy() const; // Helper for applying a lambda to all data segments, sequentially: //
diff --git a/third_party/blink/public/platform/web_resource_timing_info.h b/third_party/blink/public/platform/web_resource_timing_info.h index 02a7c0a..7f43cefd 100644 --- a/third_party/blink/public/platform/web_resource_timing_info.h +++ b/third_party/blink/public/platform/web_resource_timing_info.h
@@ -35,7 +35,7 @@ #endif WebString name; - double duration; + double duration = 0.0; WebString description; }; @@ -64,12 +64,12 @@ base::TimeTicks last_redirect_end_time; base::TimeTicks response_end; - uint64_t transfer_size; - uint64_t encoded_body_size; - uint64_t decoded_body_size; + uint64_t transfer_size = 0U; + uint64_t encoded_body_size = 0U; + uint64_t decoded_body_size = 0U; - bool did_reuse_connection; - bool is_secure_context; + bool did_reuse_connection = false; + bool is_secure_context = false; // TODO(dcheng): The way this code works is fairly confusing: it might seem // unusual to store policy members like |allow_timing_details| inline, rather @@ -77,8 +77,8 @@ // PerformanceNavigationTiming inherits and shares many of the same fields // exposed by PerformanceResourceTiming, but the underlying behavior is a // little different. - bool allow_timing_details; - bool allow_redirect_details; + bool allow_timing_details = false; + bool allow_redirect_details = false; // Normally, the timestamps are relative to the time origin. In most cases, // these timestamps should be positive value, so 0 is used to mark invalid @@ -87,7 +87,7 @@ // However, ServiceWorker navigation preloads may be negative, since these // requests may be started before the service worker started. In those cases, // this flag should be set to true. - bool allow_negative_values; + bool allow_negative_values = false; WebVector<WebServerTimingInfo> server_timing; };
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc index 25b324c..6b53ef1 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc
@@ -46,8 +46,7 @@ size_t usage = base::ProcessMetrics::CreateCurrentProcessMetrics()->GetMallocUsage() + WTF::Partitions::TotalActiveBytes() + - blink::ProcessHeap::TotalAllocatedObjectSize() + - blink::ProcessHeap::TotalMarkedObjectSize(); + blink::ProcessHeap::TotalAllocatedObjectSize(); v8::HeapStatistics v8_heap_statistics; blink::V8PerIsolateData::MainThreadIsolate()->GetHeapStatistics( &v8_heap_statistics);
diff --git a/third_party/blink/renderer/bindings/modules/v8/generated.gni b/third_party/blink/renderer/bindings/modules/v8/generated.gni index af79523e..1622a8f 100644 --- a/third_party/blink/renderer/bindings/modules/v8/generated.gni +++ b/third_party/blink/renderer/bindings/modules/v8/generated.gni
@@ -82,6 +82,8 @@ "$bindings_modules_v8_output_dir/string_or_canvas_gradient_or_canvas_pattern.h", "$bindings_modules_v8_output_dir/string_or_string_sequence_or_constrain_dom_string_parameters.cc", "$bindings_modules_v8_output_dir/string_or_string_sequence_or_constrain_dom_string_parameters.h", + "$bindings_modules_v8_output_dir/string_or_unrestricted_double_or_array_buffer_or_dictionary.cc", + "$bindings_modules_v8_output_dir/string_or_unrestricted_double_or_array_buffer_or_dictionary.h", "$bindings_modules_v8_output_dir/string_or_unsigned_long.cc", "$bindings_modules_v8_output_dir/string_or_unsigned_long.h", "$bindings_modules_v8_output_dir/unsigned_long_or_unsigned_long_sequence.cc",
diff --git a/third_party/blink/renderer/controller/memory_usage_monitor.cc b/third_party/blink/renderer/controller/memory_usage_monitor.cc index 8e60ff0..628effa 100644 --- a/third_party/blink/renderer/controller/memory_usage_monitor.cc +++ b/third_party/blink/renderer/controller/memory_usage_monitor.cc
@@ -61,8 +61,7 @@ } void MemoryUsageMonitor::GetBlinkMemoryUsage(MemoryUsage& usage) { - usage.blink_gc_bytes = ProcessHeap::TotalAllocatedObjectSize() + - ProcessHeap::TotalMarkedObjectSize(); + usage.blink_gc_bytes = ProcessHeap::TotalAllocatedObjectSize(); usage.partition_alloc_bytes = WTF::Partitions::TotalSizeOfCommittedPages(); }
diff --git a/third_party/blink/renderer/core/editing/element_inner_text.cc b/third_party/blink/renderer/core/editing/element_inner_text.cc index eb4385a..a014585c4 100644 --- a/third_party/blink/renderer/core/editing/element_inner_text.cc +++ b/third_party/blink/renderer/core/editing/element_inner_text.cc
@@ -263,8 +263,8 @@ return; } - const NGMappingUnitRange range = mapping->GetMappingUnitsForNode(text_node); - for (const NGOffsetMappingUnit& unit : range) { + for (const NGOffsetMappingUnit& unit : + mapping->GetMappingUnitsForNode(text_node)) { result_.EmitText( StringView(mapping->GetText(), unit.TextContentStart(), unit.TextContentEnd() - unit.TextContentStart()));
diff --git a/third_party/blink/renderer/core/events/animation_event.idl b/third_party/blink/renderer/core/events/animation_event.idl index 5e1af4ec..b8e9c21 100644 --- a/third_party/blink/renderer/core/events/animation_event.idl +++ b/third_party/blink/renderer/core/events/animation_event.idl
@@ -26,7 +26,8 @@ // https://drafts.csswg.org/css-animations/#interface-animationevent [ - Constructor(DOMString type, optional AnimationEventInit eventInitDict) + Constructor(DOMString type, optional AnimationEventInit eventInitDict), + Exposed=Window ] interface AnimationEvent : Event { readonly attribute DOMString animationName; readonly attribute double elapsedTime;
diff --git a/third_party/blink/renderer/core/events/animation_playback_event.idl b/third_party/blink/renderer/core/events/animation_playback_event.idl index b26c27d..7579153e 100644 --- a/third_party/blink/renderer/core/events/animation_playback_event.idl +++ b/third_party/blink/renderer/core/events/animation_playback_event.idl
@@ -6,7 +6,8 @@ [ Constructor(DOMString type, optional AnimationPlaybackEventInit eventInitDict), - RuntimeEnabled=WebAnimationsAPI + RuntimeEnabled=WebAnimationsAPI, + Exposed=Window ] interface AnimationPlaybackEvent : Event { readonly attribute double? currentTime; readonly attribute double? timelineTime;
diff --git a/third_party/blink/renderer/core/events/pointer_event.idl b/third_party/blink/renderer/core/events/pointer_event.idl index 1cc1a41..cb9b798d 100644 --- a/third_party/blink/renderer/core/events/pointer_event.idl +++ b/third_party/blink/renderer/core/events/pointer_event.idl
@@ -5,7 +5,8 @@ // https://w3c.github.io/pointerevents/#pointerevent-interface [ - Constructor(DOMString type, optional PointerEventInit eventInitDict) + Constructor(DOMString type, optional PointerEventInit eventInitDict), + Exposed=Window ] interface PointerEvent : MouseEvent { [MeasureAs=PointerEventAttributeCount] readonly attribute long pointerId; [MeasureAs=PointerEventAttributeCount] readonly attribute double width;
diff --git a/third_party/blink/renderer/core/events/security_policy_violation_event.idl b/third_party/blink/renderer/core/events/security_policy_violation_event.idl index 42afd10..cbf041b 100644 --- a/third_party/blink/renderer/core/events/security_policy_violation_event.idl +++ b/third_party/blink/renderer/core/events/security_policy_violation_event.idl
@@ -31,7 +31,8 @@ [ Constructor(DOMString type), - Constructor(DOMString type, SecurityPolicyViolationEventInit eventInitDict) + Constructor(DOMString type, SecurityPolicyViolationEventInit eventInitDict), + Exposed=(Window,Worker) ] interface SecurityPolicyViolationEvent : Event { // TODO(foolip): The spec says "documentURL". [Measure] readonly attribute DOMString documentURI;
diff --git a/third_party/blink/renderer/core/events/transition_event.idl b/third_party/blink/renderer/core/events/transition_event.idl index 48e0674..7d09afc9 100644 --- a/third_party/blink/renderer/core/events/transition_event.idl +++ b/third_party/blink/renderer/core/events/transition_event.idl
@@ -27,7 +27,8 @@ // https://drafts.csswg.org/css-transitions/#transition-events [ - Constructor(DOMString type, optional TransitionEventInit eventInitDict) + Constructor(DOMString type, optional TransitionEventInit eventInitDict), + Exposed=Window ] interface TransitionEvent : Event { readonly attribute DOMString propertyName; readonly attribute double elapsedTime;
diff --git a/third_party/blink/renderer/core/exported/web_memory_statistics.cc b/third_party/blink/renderer/core/exported/web_memory_statistics.cc index 907463b..2e2004b 100644 --- a/third_party/blink/renderer/core/exported/web_memory_statistics.cc +++ b/third_party/blink/renderer/core/exported/web_memory_statistics.cc
@@ -14,8 +14,7 @@ statistics.partition_alloc_total_allocated_bytes = WTF::Partitions::TotalActiveBytes(); statistics.blink_gc_total_allocated_bytes = - ProcessHeap::TotalAllocatedObjectSize() + - ProcessHeap::TotalMarkedObjectSize(); + ProcessHeap::TotalAllocatedObjectSize(); return statistics; }
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index 24343bd..80c238c 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -591,6 +591,12 @@ UpdateAllLifecyclePhases(); EXPECT_EQ(Color::kBlack, frame_view->BaseBackgroundColor()); + // Don't let dark color-scheme override a transparent background. + web_view->SetBaseBackgroundColor(SK_ColorTRANSPARENT); + EXPECT_EQ(Color::kTransparent, frame_view->BaseBackgroundColor()); + web_view->SetBaseBackgroundColor(SK_ColorBLUE); + EXPECT_EQ(Color::kBlack, frame_view->BaseBackgroundColor()); + web_view->SettingsImpl()->SetPreferredColorScheme( PreferredColorScheme::kLight); UpdateAllLifecyclePhases();
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc index 907b660..4fca93e 100644 --- a/third_party/blink/renderer/core/fetch/fetch_manager.cc +++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -543,9 +543,8 @@ // "- should fetching |request| be blocked as content security returns // blocked" - if (!ContentSecurityPolicy::ShouldBypassMainWorld(execution_context_) && - !execution_context_->GetContentSecurityPolicy()->AllowConnectToSource( - fetch_request_data_->Url())) { + if (!execution_context_->GetContentSecurityPolicyForWorld() + ->AllowConnectToSource(fetch_request_data_->Url())) { // "A network error." PerformNetworkError( "Refused to connect to '" + fetch_request_data_->Url().ElidedString() +
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 67eb017..5e41377 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1655,8 +1655,10 @@ } Color LocalFrameView::BaseBackgroundColor() const { - if (use_dark_scheme_background_) + if (use_dark_scheme_background_ && + base_background_color_ != Color::kTransparent) { return Color::kBlack; + } return base_background_color_; }
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl index 4ece221..a98d0202 100644 --- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl +++ b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
@@ -6812,9 +6812,47 @@ # This domain allows configuring virtual authenticators to test the WebAuthn # API. experimental domain WebAuthn + type AuthenticatorId extends string + + type AuthenticatorProtocol extends string + enum + # Universal 2nd Factor. + u2f + # Client To Authenticator Protocol 2. + ctap2 + + type AuthenticatorTransport extends string + enum + # Cross-Platform authenticator attachments: + usb + nfc + ble + cable + # Platform authenticator attachment: + internal + + type VirtualAuthenticatorOptions extends object + properties + AuthenticatorProtocol protocol + AuthenticatorTransport transport + boolean hasResidentKey + boolean hasUserVerification + # Enable the WebAuthn domain and start intercepting credential storage and # retrieval with a virtual authenticator. command enable # Disable the WebAuthn domain. command disable + + # Creates and adds a virtual authenticator. + command addVirtualAuthenticator + parameters + VirtualAuthenticatorOptions options + returns + AuthenticatorId authenticatorId + + # Removes the given authenticator. + command removeVirtualAuthenticator + parameters + AuthenticatorId authenticatorId
diff --git a/third_party/blink/renderer/core/layout/layout_button.cc b/third_party/blink/renderer/core/layout/layout_button.cc index 2e6cbce..69728d6b 100644 --- a/third_party/blink/renderer/core/layout/layout_button.cc +++ b/third_party/blink/renderer/core/layout/layout_button.cc
@@ -90,7 +90,8 @@ // We want to call the LayoutBlock version of firstLineBoxBaseline to // avoid LayoutFlexibleBox synthesizing a baseline that we don't want. // We use this check as a proxy for "are there any line boxes in this button" - if (!HasLineIfEmpty() && LayoutBlock::FirstLineBoxBaseline() == -1) { + if (!HasLineIfEmpty() && !ShouldApplyLayoutContainment() && + LayoutBlock::FirstLineBoxBaseline() == -1) { // To ensure that we have a consistent baseline when we have no children, // even when we have the anonymous LayoutBlock child, we calculate the // baseline for the empty case manually here.
diff --git a/third_party/blink/renderer/core/layout/layout_menu_list.cc b/third_party/blink/renderer/core/layout/layout_menu_list.cc index 983eb873..9a4396f 100644 --- a/third_party/blink/renderer/core/layout/layout_menu_list.cc +++ b/third_party/blink/renderer/core/layout/layout_menu_list.cc
@@ -208,6 +208,9 @@ } void LayoutMenuList::UpdateOptionsWidth() const { + if (ShouldApplySizeContainment()) + return; + float max_option_width = 0; for (auto* const option : SelectElement()->GetOptionList()) {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc index f0cb6b1..6e00a8e 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc
@@ -101,13 +101,13 @@ // layout text of |fragment_|. const NGOffsetMapping& mapping = *NGOffsetMapping::GetFor(fragment_->GetLayoutObject()); - const NGMappingUnitRange& mapping_units = + const base::span<const NGOffsetMappingUnit> mapping_units = mapping.GetMappingUnitsForTextContentOffsetRange( text_fragment.EndOffset(), text_fragment.EndOffset() + 1); if (mapping_units.begin() == mapping_units.end()) return false; - const NGOffsetMappingUnit* const mapping_unit = mapping_units.begin(); - return mapping_unit->GetLayoutObject() == fragment_->GetLayoutObject(); + const NGOffsetMappingUnit& mapping_unit = mapping_units.front(); + return mapping_unit.GetLayoutObject() == fragment_->GetLayoutObject(); } const NGPaintFragment*
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.cc index 1e7fb8e..f8895564 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.cc
@@ -333,7 +333,7 @@ }); UnitVector result; - for (const auto& unit : NGMappingUnitRange({result_begin, result_end})) { + for (const auto& unit : base::make_span(result_begin, result_end)) { // If the unit isn't fully within the range, create a new unit that's // within the range. const unsigned clamped_start = std::max(unit.DOMStart(), start_offset); @@ -350,17 +350,19 @@ return result; } -NGMappingUnitRange NGOffsetMapping::GetMappingUnitsForNode( +base::span<const NGOffsetMappingUnit> NGOffsetMapping::GetMappingUnitsForNode( const Node& node) const { const auto it = ranges_.find(&node); if (it == ranges_.end()) { NOTREACHED() << node; - return NGMappingUnitRange(); + return {}; } - return {units_.begin() + it->value.first, units_.begin() + it->value.second}; + return base::make_span(units_.begin() + it->value.first, + units_.begin() + it->value.second); } -NGMappingUnitRange NGOffsetMapping::GetMappingUnitsForLayoutObject( +base::span<const NGOffsetMappingUnit> +NGOffsetMapping::GetMappingUnitsForLayoutObject( const LayoutObject& layout_object) const { const auto* begin = std::find_if(units_.begin(), units_.end(), @@ -374,12 +376,12 @@ return unit.GetLayoutObject() != layout_object; }); DCHECK_LT(begin, end); - return {begin, end}; + return base::make_span(begin, end); } -NGMappingUnitRange NGOffsetMapping::GetMappingUnitsForTextContentOffsetRange( - unsigned start, - unsigned end) const { +base::span<const NGOffsetMappingUnit> +NGOffsetMapping::GetMappingUnitsForTextContentOffsetRange(unsigned start, + unsigned end) const { DCHECK_LE(start, end); if (units_.front().TextContentStart() >= end || units_.back().TextContentEnd() <= start) @@ -400,7 +402,7 @@ [](unsigned offset, const NGOffsetMappingUnit& unit) { return offset <= unit.TextContentStart(); }); - return {result_begin, result_end}; + return base::make_span(result_begin, result_end); } base::Optional<unsigned> NGOffsetMapping::GetTextContentOffset(
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.h b/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.h index 743dd9d..bcdcc37 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.h
@@ -93,23 +93,6 @@ friend class NGOffsetMappingBuilder; }; -class NGMappingUnitRange { - STACK_ALLOCATED(); - - public: - const NGOffsetMappingUnit* begin() const { return begin_; } - const NGOffsetMappingUnit* end() const { return end_; } - - NGMappingUnitRange() : begin_(nullptr), end_(nullptr) {} - NGMappingUnitRange(const NGOffsetMappingUnit* begin, - const NGOffsetMappingUnit* end) - : begin_(begin), end_(end) {} - - private: - const NGOffsetMappingUnit* begin_; - const NGOffsetMappingUnit* end_; -}; - // Each inline formatting context laid out with LayoutNG has an NGOffsetMapping // object that stores the mapping information between DOM positions and offsets // in the text content string of the context. @@ -175,7 +158,8 @@ // Returns all NGOffsetMappingUnits associated to |node|. When |node| is // laid out with ::first-letter, this function returns both first-letter part // and remaining part. Note: |node| should have associated mapping. - NGMappingUnitRange GetMappingUnitsForNode(const Node& node) const; + base::span<const NGOffsetMappingUnit> GetMappingUnitsForNode( + const Node& node) const; // Returns all NGOffsetMappingUnits associated to |layout_object|. This // function works even if |layout_object| is for CSS generated content @@ -183,7 +167,7 @@ // Note: Unlike |GetMappingUnitsForNode()|, this function returns units // for first-letter or remaining part only instead of both parts. // Note: |layout_object| should have associated mapping. - NGMappingUnitRange GetMappingUnitsForLayoutObject( + base::span<const NGOffsetMappingUnit> GetMappingUnitsForLayoutObject( const LayoutObject& layout_object) const; // Returns the text content offset corresponding to the given position. @@ -228,9 +212,8 @@ // (but possibly collapsed) intersection with (start, end). Note that units // that only "touch" |start| or |end| are excluded. // Note: Returned range may include units for generated content. - NGMappingUnitRange GetMappingUnitsForTextContentOffsetRange( - unsigned start, - unsigned end) const; + base::span<const NGOffsetMappingUnit> + GetMappingUnitsForTextContentOffsetRange(unsigned start, unsigned end) const; // Returns the last |NGOffsetMappingUnit| where |TextContentStart() >= offset| // including unit for generated content.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping_test.cc index 78b74c7..9f7b8cd 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping_test.cc
@@ -22,9 +22,9 @@ // https://github.com/w3c/csswg-drafts/issues/337 #define SEGMENT_BREAK_TRANSFORMATION_FOR_EAST_ASIAN_WIDTH 0 -// Helper functions to use |EXPECT_EQ()| for |NGOffsetMappingUnit| and -// |NGMappingUnitRange|. -Vector<NGOffsetMappingUnit> ToVector(const NGMappingUnitRange& range) { +// Helper functions to use |EXPECT_EQ()| for |NGOffsetMappingUnit| and its span. +Vector<NGOffsetMappingUnit> ToVector( + const base::span<const NGOffsetMappingUnit>& range) { Vector<NGOffsetMappingUnit> units; for (const auto& unit : range) units.push_back(unit); @@ -68,7 +68,7 @@ } bool operator==(const Vector<NGOffsetMappingUnit>& units, - const NGMappingUnitRange& range) { + const base::span<const NGOffsetMappingUnit>& range) { return units == ToVector(range); } @@ -83,7 +83,8 @@ ostream << "]"; } -void PrintTo(const NGMappingUnitRange& range, std::ostream& ostream) { +void PrintTo(const base::span<const NGOffsetMappingUnit>& range, + std::ostream& ostream) { PrintTo(ToVector(range), ostream); }
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc index bc6c34b..d89adc2 100644 --- a/third_party/blink/renderer/core/timing/performance.cc +++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -78,77 +78,6 @@ return nullptr; } -Performance::MeasureParameterType StringToNavigationTimingParameterType( - const String& s) { - // The following names come from performance_user_timing.cc. - if (s == "unloadEventStart") - return Performance::MeasureParameterType::kUnloadEventStart; - if (s == "unloadEventEnd") - return Performance::MeasureParameterType::kUnloadEventEnd; - if (s == "domInteractive") - return Performance::MeasureParameterType::kDomInteractive; - if (s == "domContentLoadedEventStart") - return Performance::MeasureParameterType::kDomContentLoadedEventStart; - if (s == "domContentLoadedEventEnd") - return Performance::MeasureParameterType::kDomContentLoadedEventEnd; - if (s == "domComplete") - return Performance::MeasureParameterType::kDomComplete; - if (s == "loadEventStart") - return Performance::MeasureParameterType::kLoadEventStart; - if (s == "loadEventEnd") - return Performance::MeasureParameterType::kLoadEventEnd; - if (s == "navigationStart") - return Performance::MeasureParameterType::kNavigationStart; - if (s == "redirectStart") - return Performance::MeasureParameterType::kRedirectStart; - if (s == "redirectEnd") - return Performance::MeasureParameterType::kRedirectEnd; - if (s == "fetchStart") - return Performance::MeasureParameterType::kFetchStart; - if (s == "domainLookupStart") - return Performance::MeasureParameterType::kDomainLookupStart; - if (s == "domainLookupEnd") - return Performance::MeasureParameterType::kDomainLookupEnd; - if (s == "connectStart") - return Performance::MeasureParameterType::kConnectStart; - if (s == "connectEnd") - return Performance::MeasureParameterType::kConnectEnd; - if (s == "secureConnectionStart") - return Performance::MeasureParameterType::kSecureConnectionStart; - if (s == "requestStart") - return Performance::MeasureParameterType::kRequestStart; - if (s == "responseStart") - return Performance::MeasureParameterType::kResponseStart; - if (s == "responseEnd") - return Performance::MeasureParameterType::kResponseEnd; - if (s == "domLoading") - return Performance::MeasureParameterType::kDomLoading; - return Performance::MeasureParameterType::kOther; -} - -Performance::MeasureParameterType StartOrOptionsToParameterType( - const StringOrPerformanceMeasureOptions& start_or_options) { - if (start_or_options.IsString()) { - return StringToNavigationTimingParameterType( - start_or_options.GetAsString()); - } - // Since start_or_options cannot be number any more, we don't record number - // type as MeasureParameterType in UMA any more. - if (start_or_options.IsPerformanceMeasureOptions()) - return Performance::MeasureParameterType::kObjectObject; - // null and undefined are undistinguishable in - // StringOrPerformanceMeasureOptions. - return Performance::MeasureParameterType::kUndefinedOrNull; -} - -void LogMeasureStartToUma(Performance::MeasureParameterType type) { - UMA_HISTOGRAM_ENUMERATION("Performance.MeasureParameter.StartMark", type); -} - -void LogMeasureEndToUma(Performance::MeasureParameterType type) { - UMA_HISTOGRAM_ENUMERATION("Performance.MeasureParameter.EndMark", type); -} - const Performance::UnifiedClock* DefaultUnifiedClock() { DEFINE_THREAD_SAFE_STATIC_LOCAL(Performance::UnifiedClock, unified_clock, (base::DefaultClock::GetInstance(), @@ -761,8 +690,6 @@ PerformanceMeasure* Performance::measure(ScriptState* script_state, const AtomicString& measure_name, ExceptionState& exception_state) { - LogMeasureStartToUma(MeasureParameterType::kUnprovided); - LogMeasureEndToUma(MeasureParameterType::kUnprovided); return MeasureInternal( script_state, measure_name, NativeValueTraits<StringOrPerformanceMeasureOptions>::NullValue(), @@ -774,8 +701,6 @@ const AtomicString& measure_name, const StringOrPerformanceMeasureOptions& start_or_options, ExceptionState& exception_state) { - LogMeasureStartToUma(StartOrOptionsToParameterType(start_or_options)); - LogMeasureEndToUma(MeasureParameterType::kUnprovided); return MeasureInternal(script_state, measure_name, start_or_options, base::nullopt, exception_state); } @@ -786,8 +711,6 @@ const StringOrPerformanceMeasureOptions& start_or_options, const String& end, ExceptionState& exception_state) { - LogMeasureStartToUma(StartOrOptionsToParameterType(start_or_options)); - LogMeasureEndToUma(StringToNavigationTimingParameterType(end)); return MeasureInternal(script_state, measure_name, start_or_options, base::Optional<String>(end), exception_state); }
diff --git a/third_party/blink/renderer/core/timing/performance_test.cc b/third_party/blink/renderer/core/timing/performance_test.cc index 39e7ebd..2c238e1a 100644 --- a/third_party/blink/renderer/core/timing/performance_test.cc +++ b/third_party/blink/renderer/core/timing/performance_test.cc
@@ -183,128 +183,4 @@ GetExecutionContext())); } -TEST_F(PerformanceTest, MeasureParameters_StartEndBothUnprovided) { - base::HistogramTester histograms; - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - Initialize(scope.GetScriptState()); - base_->measure(scope.GetScriptState(), "name", exception_state); - histograms.ExpectBucketCount("Performance.MeasureParameter.StartMark", - Performance::MeasureParameterType::kUnprovided, - 1); - histograms.ExpectBucketCount("Performance.MeasureParameter.EndMark", - Performance::MeasureParameterType::kUnprovided, - 1); -} - -TEST_F(PerformanceTest, MeasureParameters_StartProvidedEndUnprovided) { - base::HistogramTester histograms; - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - Initialize(scope.GetScriptState()); - base_->measure(scope.GetScriptState(), "name", - StringOrPerformanceMeasureOptions::FromString("string"), - exception_state); - histograms.ExpectBucketCount("Performance.MeasureParameter.StartMark", - Performance::MeasureParameterType::kOther, 1); - histograms.ExpectBucketCount("Performance.MeasureParameter.EndMark", - Performance::MeasureParameterType::kUnprovided, - 1); -} - -TEST_F(PerformanceTest, MeasureParameters_StartEndBothProvided) { - base::HistogramTester histograms; - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - Initialize(scope.GetScriptState()); - base_->measure(scope.GetScriptState(), "name", - StringOrPerformanceMeasureOptions::FromString("string"), - "string", exception_state); - histograms.ExpectBucketCount("Performance.MeasureParameter.StartMark", - Performance::MeasureParameterType::kOther, 1); - histograms.ExpectBucketCount("Performance.MeasureParameter.EndMark", - Performance::MeasureParameterType::kOther, 1); -} - -TEST_F(PerformanceTest, MeasureParameters_ObjectType) { - base::HistogramTester histograms; - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - Initialize(scope.GetScriptState()); - base_->measure( - scope.GetScriptState(), "name", - StringOrPerformanceMeasureOptions::FromPerformanceMeasureOptions( - PerformanceMeasureOptions::Create()), - exception_state); - histograms.ExpectBucketCount("Performance.MeasureParameter.StartMark", - Performance::MeasureParameterType::kObjectObject, - 1); - histograms.ExpectBucketCount("Performance.MeasureParameter.EndMark", - Performance::MeasureParameterType::kUnprovided, - 1); -} - -TEST_F(PerformanceTest, MeasureParameters_NavigationTiming) { - base::HistogramTester histograms; - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - Initialize(scope.GetScriptState()); - struct { - String keyword; - Performance::MeasureParameterType measure_type; - } const test_cases[] = { - {"unloadEventStart", - Performance::MeasureParameterType::kUnloadEventStart}, - {"unloadEventEnd", Performance::MeasureParameterType::kUnloadEventEnd}, - {"domInteractive", Performance::MeasureParameterType::kDomInteractive}, - {"domContentLoadedEventStart", - Performance::MeasureParameterType::kDomContentLoadedEventStart}, - {"domContentLoadedEventEnd", - Performance::MeasureParameterType::kDomContentLoadedEventEnd}, - {"domComplete", Performance::MeasureParameterType::kDomComplete}, - {"loadEventStart", Performance::MeasureParameterType::kLoadEventStart}, - {"loadEventEnd", Performance::MeasureParameterType::kLoadEventEnd}, - {"navigationStart", Performance::MeasureParameterType::kNavigationStart}, - {"redirectStart", Performance::MeasureParameterType::kRedirectStart}, - {"fetchStart", Performance::MeasureParameterType::kFetchStart}, - {"domainLookupStart", - Performance::MeasureParameterType::kDomainLookupStart}, - {"domainLookupEnd", Performance::MeasureParameterType::kDomainLookupEnd}, - {"connectStart", Performance::MeasureParameterType::kConnectStart}, - {"connectEnd", Performance::MeasureParameterType::kConnectEnd}, - {"secureConnectionStart", - Performance::MeasureParameterType::kSecureConnectionStart}, - {"requestStart", Performance::MeasureParameterType::kRequestStart}, - {"responseStart", Performance::MeasureParameterType::kResponseStart}, - {"responseEnd", Performance::MeasureParameterType::kResponseEnd}, - {"domLoading", Performance::MeasureParameterType::kDomLoading}, - }; - int count = 0; - for (const auto& test : test_cases) { - base_->measure(scope.GetScriptState(), "name", - StringOrPerformanceMeasureOptions::FromString(test.keyword), - exception_state); - histograms.ExpectBucketCount("Performance.MeasureParameter.StartMark", - test.measure_type, 1); - histograms.ExpectBucketCount("Performance.MeasureParameter.EndMark", - Performance::MeasureParameterType::kUnprovided, - ++count); - } -} - -TEST_F(PerformanceTest, MeasureParameters_Other) { - base::HistogramTester histograms; - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - Initialize(scope.GetScriptState()); - base_->measure(scope.GetScriptState(), "name", - StringOrPerformanceMeasureOptions::FromString("aRandomString"), - exception_state); - histograms.ExpectBucketCount("Performance.MeasureParameter.StartMark", - Performance::MeasureParameterType::kOther, 1); - histograms.ExpectBucketCount("Performance.MeasureParameter.EndMark", - Performance::MeasureParameterType::kUnprovided, - 1); -} - } // namespace blink
diff --git a/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js b/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js index 2f8d2c9..1fb8918 100644 --- a/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js +++ b/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js
@@ -41,9 +41,11 @@ this.contentElement.classList.add('vbox'); const settingsLabelElement = createElement('div'); - UI.createShadowRootWithCoreStyles(settingsLabelElement, 'settings/settingsScreen.css') - .createChild('div', 'settings-window-title') - .textContent = Common.UIString('Settings'); + const settingsTitleElement = UI.createShadowRootWithCoreStyles(settingsLabelElement, 'settings/settingsScreen.css') + .createChild('div', 'settings-window-title'); + + UI.ARIAUtils.markAsHeading(settingsTitleElement, 1); + settingsTitleElement.textContent = ls`Settings`; this._tabbedLocation = UI.viewManager.createTabbedLocation(() => Settings.SettingsScreen._showSettingsScreen(), 'settings-view'); @@ -51,7 +53,7 @@ tabbedPane.leftToolbar().appendToolbarItem(new UI.ToolbarItem(settingsLabelElement)); tabbedPane.setShrinkableTabs(false); tabbedPane.makeVerticalTabLayout(); - const shortcutsView = new UI.SimpleView(Common.UIString('Shortcuts')); + const shortcutsView = new UI.SimpleView(ls`Shortcuts`); UI.shortcutsScreen.createShortcutsTabView().show(shortcutsView.element); this._tabbedLocation.appendView(shortcutsView); tabbedPane.show(this.contentElement);
diff --git a/third_party/blink/renderer/modules/modules_initializer.cc b/third_party/blink/renderer/modules/modules_initializer.cc index f8f82c2..95418fd 100644 --- a/third_party/blink/renderer/modules/modules_initializer.cc +++ b/third_party/blink/renderer/modules/modules_initializer.cc
@@ -66,7 +66,7 @@ #include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h" #include "third_party/blink/renderer/modules/presentation/presentation_controller.h" #include "third_party/blink/renderer/modules/presentation/presentation_receiver.h" -#include "third_party/blink/renderer/modules/push_messaging/push_controller.h" +#include "third_party/blink/renderer/modules/push_messaging/push_messaging_client.h" #include "third_party/blink/renderer/modules/remoteplayback/html_media_element_remote_playback.h" #include "third_party/blink/renderer/modules/remoteplayback/remote_playback.h" #include "third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl.h" @@ -175,7 +175,8 @@ WebLocalFrameImpl* web_frame = WebLocalFrameImpl::FromFrame(&frame); WebLocalFrameClient* client = web_frame->Client(); DCHECK(client); - ProvidePushControllerTo(frame, client->PushClient()); + ProvidePushMessagingClientTo( + frame, MakeGarbageCollected<PushMessagingClient>(frame)); ProvideUserMediaTo( frame, std::make_unique<UserMediaClient>(client->UserMediaClient())); ProvideIndexedDBClientTo(frame, MakeGarbageCollected<IndexedDBClient>(frame));
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record.idl b/third_party/blink/renderer/modules/nfc/ndef_record.idl index 19c67875..a335b3f 100644 --- a/third_party/blink/renderer/modules/nfc/ndef_record.idl +++ b/third_party/blink/renderer/modules/nfc/ndef_record.idl
@@ -6,9 +6,7 @@ enum NDEFRecordType { "empty", "text", "url", "json", "opaque" }; -// TODO(riju): Fix http://crbug.com/935912 -// typedef (DOMString or unrestricted double or ArrayBuffer or Dictionary) NDEFRecordData; -typedef any NDEFRecordData; +typedef (DOMString or unrestricted double or ArrayBuffer or Dictionary) NDEFRecordData; dictionary NDEFRecord { NDEFRecordType recordType;
diff --git a/third_party/blink/renderer/modules/nfc/nfc.cc b/third_party/blink/renderer/modules/nfc/nfc.cc index f3465cf..638106b 100644 --- a/third_party/blink/renderer/modules/nfc/nfc.cc +++ b/third_party/blink/renderer/modules/nfc/nfc.cc
@@ -96,21 +96,21 @@ // If NDEFRecord type is not provided, deduce NDEFRecord type from JS data type: // String or Number => 'text' record // ArrayBuffer => 'opaque' record -// JSON serializable Object => 'json' record +// Dictionary, JSON serializable Object => 'json' record NDEFRecordType deduceRecordTypeFromDataType(const blink::NDEFRecord* record) { if (record->hasData()) { - v8::Local<v8::Value> value = record->data().V8Value(); + const blink::NDEFRecordData& value = record->data(); - if (value->IsString() || - (value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value()))) { + if (value.IsString() || (value.IsUnrestrictedDouble() && + !std::isnan(value.GetAsUnrestrictedDouble()))) { return NDEFRecordType::TEXT; } - if (value->IsObject() && !value->IsArrayBuffer()) { + if (value.IsDictionary()) { return NDEFRecordType::JSON; } - if (value->IsArrayBuffer()) { + if (value.IsArrayBuffer()) { return NDEFRecordType::OPAQUE_RECORD; } } @@ -176,31 +176,27 @@ }; template <> -struct TypeConverter<base::Optional<Vector<uint8_t>>, blink::ScriptValue> { +struct TypeConverter<base::Optional<Vector<uint8_t>>, blink::NDEFRecordData> { static base::Optional<Vector<uint8_t>> Convert( - const blink::ScriptValue& scriptValue) { - v8::Local<v8::Value> value = scriptValue.V8Value(); - - if (value->IsNumber()) { + const blink::NDEFRecordData& value) { + if (value.IsUnrestrictedDouble()) { return mojo::ConvertTo<Vector<uint8_t>>( - String::Number(value.As<v8::Number>()->Value())); + String::Number(value.GetAsUnrestrictedDouble())); } - if (value->IsString()) { - blink::V8StringResource<> stringResource = value; - if (stringResource.Prepare()) { - return mojo::ConvertTo<Vector<uint8_t>>(String(stringResource)); - } + if (value.IsString()) { + return mojo::ConvertTo<Vector<uint8_t>>(value.GetAsString()); } - if (value->IsObject() && !value->IsArray() && !value->IsArrayBuffer()) { + if (value.IsDictionary()) { v8::Local<v8::String> jsonString; - v8::Isolate* isolate = scriptValue.GetIsolate(); + blink::Dictionary dictionary = value.GetAsDictionary(); + v8::Isolate* isolate = dictionary.GetIsolate(); v8::TryCatch try_catch(isolate); // https://w3c.github.io/web-nfc/#mapping-json-to-ndef // If serialization throws, reject promise with a "SyntaxError" exception. - if (!v8::JSON::Stringify(scriptValue.GetContext(), value.As<v8::Object>()) + if (!v8::JSON::Stringify(dictionary.V8Context(), dictionary.V8Value()) .ToLocal(&jsonString) || try_catch.HasCaught()) { return base::nullopt; @@ -211,9 +207,8 @@ return mojo::ConvertTo<Vector<uint8_t>>(string); } - if (value->IsArrayBuffer()) { - return mojo::ConvertTo<Vector<uint8_t>>( - blink::V8ArrayBuffer::ToImpl(value.As<v8::Object>())); + if (value.IsArrayBuffer()) { + return mojo::ConvertTo<Vector<uint8_t>>(value.GetAsArrayBuffer()); } return base::nullopt; @@ -383,9 +378,10 @@ ScriptPromise RejectIfInvalidTextRecord(ScriptState* script_state, const NDEFRecord* record) { - v8::Local<v8::Value> value = record->data().V8Value(); - if (!value->IsString() && - !(value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value()))) { + const NDEFRecordData& value = record->data(); + + if (!value.IsString() && !(value.IsUnrestrictedDouble() && + !std::isnan(value.GetAsUnrestrictedDouble()))) { return RejectWithTypeError(script_state, "The data for 'text' NDEFRecords must be of " "String or UnrestrctedDouble type."); @@ -402,14 +398,12 @@ ScriptPromise RejectIfInvalidURLRecord(ScriptState* script_state, const NDEFRecord* record) { - if (!record->data().V8Value()->IsString()) { + if (!record->data().IsString()) { return RejectWithTypeError( script_state, "The data for 'url' NDEFRecord must be of String type."); } - blink::V8StringResource<> string_resource = record->data().V8Value(); - if (!string_resource.Prepare() || - !KURL(NullURL(), string_resource).IsValid()) { + if (!KURL(NullURL(), record->data().GetAsString()).IsValid()) { return RejectWithDOMException(script_state, DOMExceptionCode::kSyntaxError, "Cannot parse data for 'url' record."); } @@ -419,8 +413,7 @@ ScriptPromise RejectIfInvalidJSONRecord(ScriptState* script_state, const NDEFRecord* record) { - v8::Local<v8::Value> value = record->data().V8Value(); - if (!value->IsObject() || value->IsArrayBuffer()) { + if (!record->data().IsDictionary()) { return RejectWithTypeError( script_state, "The data for 'json' NDEFRecord must be of Object type."); } @@ -440,7 +433,7 @@ ScriptPromise RejectIfInvalidOpaqueRecord(ScriptState* script_state, const NDEFRecord* record) { - if (!record->data().V8Value()->IsArrayBuffer()) { + if (!record->data().IsArrayBuffer()) { return RejectWithTypeError( script_state, "The data for 'opaque' NDEFRecord must be of ArrayBuffer type."); @@ -557,8 +550,10 @@ return String(); } -v8::Local<v8::Value> ToV8(ScriptState* script_state, - const device::mojom::blink::NDEFRecordPtr& record) { +NDEFRecordData BuildRecordData( + ScriptState* script_state, + const device::mojom::blink::NDEFRecordPtr& record) { + NDEFRecordData result = NDEFRecordData(); switch (record->record_type) { case device::mojom::blink::NDEFRecordType::TEXT: case device::mojom::blink::NDEFRecordType::URL: @@ -570,41 +565,51 @@ record->data.size()); } - v8::Isolate* isolate = script_state->GetIsolate(); - v8::Local<v8::String> string = V8String(isolate, string_data); + // Convert back the stringified double. + if (record->record_type == device::mojom::blink::NDEFRecordType::TEXT) { + bool can_convert = false; + double number = string_data.ToDouble(&can_convert); + if (can_convert) { + result.SetUnrestrictedDouble(number); + return result; + } + } // Stringified JSON must be converted back to an Object. if (record->record_type == device::mojom::blink::NDEFRecordType::JSON) { + v8::Isolate* isolate = script_state->GetIsolate(); + v8::Local<v8::String> string = V8String(isolate, string_data); v8::Local<v8::Value> json_object; v8::TryCatch try_catch(isolate); - if (!v8::JSON::Parse(script_state->GetContext(), string) - .ToLocal(&json_object)) { - return v8::Null(isolate); - } + NonThrowableExceptionState exception_state; - return json_object; + if (v8::JSON::Parse(script_state->GetContext(), string) + .ToLocal(&json_object)) { + result.SetDictionary( + Dictionary(isolate, json_object, exception_state)); + return result; + } } - return string; + result.SetString(string_data); + return result; } case device::mojom::blink::NDEFRecordType::OPAQUE_RECORD: { if (!record->data.IsEmpty()) { - DOMArrayBuffer* buffer = DOMArrayBuffer::Create( - static_cast<void*>(&record->data.front()), record->data.size()); - return ToV8(buffer, script_state->GetContext()->Global(), - script_state->GetIsolate()); + result.SetArrayBuffer(DOMArrayBuffer::Create( + static_cast<void*>(&record->data.front()), record->data.size())); } - return v8::Null(script_state->GetIsolate()); + return result; } case device::mojom::blink::NDEFRecordType::EMPTY: - return v8::Null(script_state->GetIsolate()); + return result; } NOTREACHED(); - return v8::Local<v8::Value>(); + return result; } NDEFRecord* ToNDEFRecord(ScriptState* script_state, @@ -612,7 +617,7 @@ NDEFRecord* nfc_record = NDEFRecord::Create(); nfc_record->setMediaType(record->media_type); nfc_record->setRecordType(ToNDEFRecordType(record->record_type)); - nfc_record->setData(ScriptValue(script_state, ToV8(script_state, record))); + nfc_record->setData(BuildRecordData(script_state, record)); return nfc_record; }
diff --git a/third_party/blink/renderer/modules/nfc/nfc.h b/third_party/blink/renderer/modules/nfc/nfc.h index a33da85e..e491839e9 100644 --- a/third_party/blink/renderer/modules/nfc/nfc.h +++ b/third_party/blink/renderer/modules/nfc/nfc.h
@@ -19,6 +19,7 @@ class NFCPushOptions; using NDEFMessageSource = StringOrArrayBufferOrNDEFMessage; +using NDEFRecordData = StringOrUnrestrictedDoubleOrArrayBufferOrDictionary; class NFCWatchOptions; class ScriptPromiseResolver;
diff --git a/third_party/blink/renderer/modules/push_messaging/BUILD.gn b/third_party/blink/renderer/modules/push_messaging/BUILD.gn index f05bf18..92fe5f15 100644 --- a/third_party/blink/renderer/modules/push_messaging/BUILD.gn +++ b/third_party/blink/renderer/modules/push_messaging/BUILD.gn
@@ -18,6 +18,8 @@ "push_message_data.h", "push_messaging_bridge.cc", "push_messaging_bridge.h", + "push_messaging_client.cc", + "push_messaging_client.h", "push_messaging_type_converters.cc", "push_messaging_type_converters.h", "push_messaging_utils.cc",
diff --git a/third_party/blink/renderer/modules/push_messaging/DEPS b/third_party/blink/renderer/modules/push_messaging/DEPS index 1e7481b..e436e79 100644 --- a/third_party/blink/renderer/modules/push_messaging/DEPS +++ b/third_party/blink/renderer/modules/push_messaging/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "-third_party/blink/renderer/modules", "+third_party/blink/renderer/modules/event_modules.h", + "+third_party/blink/renderer/modules/manifest/manifest_manager.h", "+third_party/blink/renderer/modules/modules_export.h", "+third_party/blink/renderer/modules/permissions", "+third_party/blink/renderer/modules/push_messaging",
diff --git a/third_party/blink/renderer/modules/push_messaging/push_manager.cc b/third_party/blink/renderer/modules/push_messaging/push_manager.cc index f5d79b5..d997c57 100644 --- a/third_party/blink/renderer/modules/push_messaging/push_manager.cc +++ b/third_party/blink/renderer/modules/push_messaging/push_manager.cc
@@ -8,7 +8,6 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/common/push_messaging/web_push_subscription_options.h" -#include "third_party/blink/public/platform/modules/push_messaging/web_push_client.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -16,9 +15,9 @@ #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/frame.h" #include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/modules/push_messaging/push_controller.h" #include "third_party/blink/renderer/modules/push_messaging/push_error.h" #include "third_party/blink/renderer/modules/push_messaging/push_messaging_bridge.h" +#include "third_party/blink/renderer/modules/push_messaging/push_messaging_client.h" #include "third_party/blink/renderer/modules/push_messaging/push_provider.h" #include "third_party/blink/renderer/modules/push_messaging/push_subscription.h" #include "third_party/blink/renderer/modules/push_messaging/push_subscription_callbacks.h" @@ -82,7 +81,11 @@ DOMExceptionCode::kInvalidStateError, "Document is detached from window.")); } - PushController::ClientFrom(frame).Subscribe( + + PushMessagingClient* messaging_client = PushMessagingClient::From(frame); + DCHECK(messaging_client); + + messaging_client->Subscribe( registration_->RegistrationId(), web_options, LocalFrame::HasTransientUserActivation(frame, true /* check_if_main_thread */),
diff --git a/third_party/blink/renderer/modules/push_messaging/push_messaging_client.cc b/third_party/blink/renderer/modules/push_messaging/push_messaging_client.cc new file mode 100644 index 0000000..4077fdcc --- /dev/null +++ b/third_party/blink/renderer/modules/push_messaging/push_messaging_client.cc
@@ -0,0 +1,170 @@ +// 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. + +#include "third_party/blink/renderer/modules/push_messaging/push_messaging_client.h" + +#include <string> +#include <utility> + +#include "third_party/blink/public/common/manifest/manifest.h" +#include "third_party/blink/public/common/push_messaging/web_push_subscription_options.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h" +#include "third_party/blink/public/mojom/push_messaging/push_messaging_status.mojom-shared.h" +#include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/public/platform/web_string.h" +#include "third_party/blink/public/web/web_local_frame.h" +#include "third_party/blink/public/web/web_local_frame_client.h" +#include "third_party/blink/renderer/core/frame/local_frame_client.h" +#include "third_party/blink/renderer/modules/manifest/manifest_manager.h" +#include "third_party/blink/renderer/modules/push_messaging/push_messaging_type_converters.h" +#include "third_party/blink/renderer/modules/push_messaging/push_messaging_utils.h" +#include "third_party/blink/renderer/platform/weborigin/kurl.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" + +namespace blink { + +// static +const char PushMessagingClient::kSupplementName[] = "PushMessagingClient"; + +PushMessagingClient::PushMessagingClient(LocalFrame& frame) + : Supplement<LocalFrame>(frame) { + // This class will be instantiated for every page load (rather than on push + // messaging use), so there's nothing to be done in this constructor. +} + +// static +PushMessagingClient* PushMessagingClient::From(LocalFrame* frame) { + DCHECK(frame); + return Supplement<LocalFrame>::From<PushMessagingClient>(frame); +} + +mojom::blink::PushMessaging* PushMessagingClient::GetService() { + if (!push_messaging_manager_) { + auto request = mojo::MakeRequest( + &push_messaging_manager_, + GetSupplementable()->GetTaskRunner(TaskType::kMiscPlatformAPI)); + + GetSupplementable()->GetDocumentInterfaceBroker().GetPushMessaging( + std::move(request)); + } + + return push_messaging_manager_.get(); +} + +void PushMessagingClient::Subscribe( + int64_t service_worker_registration_id, + const WebPushSubscriptionOptions& options, + bool user_gesture, + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks) { + DCHECK(callbacks); + + mojom::blink::PushSubscriptionOptionsPtr options_ptr = + mojom::blink::PushSubscriptionOptions::From(&options); + + // If a developer provided an application server key in |options|, skip + // fetching the manifest. + if (options.application_server_key.empty()) { + ManifestManager* manifest_manager = + ManifestManager::From(*GetSupplementable()); + manifest_manager->RequestManifest( + WTF::Bind(&PushMessagingClient::DidGetManifest, WrapPersistent(this), + service_worker_registration_id, std::move(options_ptr), + user_gesture, std::move(callbacks))); + } else { + DoSubscribe(service_worker_registration_id, std::move(options_ptr), + user_gesture, std::move(callbacks)); + } +} + +void PushMessagingClient::DidGetManifest( + int64_t service_worker_registration_id, + mojom::blink::PushSubscriptionOptionsPtr options, + bool user_gesture, + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks, + const WebURL& manifest_url, + const Manifest& manifest) { + // Get the application_server_key from the manifest since it wasn't provided + // by the caller. + if (manifest.IsEmpty()) { + DidSubscribe( + std::move(callbacks), + mojom::blink::PushRegistrationStatus::MANIFEST_EMPTY_OR_MISSING, + base::nullopt, nullptr, base::nullopt, base::nullopt); + return; + } + + if (!manifest.gcm_sender_id.is_null()) { + std::string gcm_sender_id_as_utf8_string = + WebString::FromUTF16(manifest.gcm_sender_id.string()).Utf8(); + WTF::Vector<uint8_t> application_server_key; + application_server_key.AppendRange(gcm_sender_id_as_utf8_string.begin(), + gcm_sender_id_as_utf8_string.end()); + options->application_server_key = std::move(application_server_key); + } + + DoSubscribe(service_worker_registration_id, std::move(options), user_gesture, + std::move(callbacks)); +} + +void PushMessagingClient::DoSubscribe( + int64_t service_worker_registration_id, + mojom::blink::PushSubscriptionOptionsPtr options, + bool user_gesture, + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks) { + DCHECK(callbacks); + + if (options->application_server_key.IsEmpty()) { + DidSubscribe(std::move(callbacks), + mojom::blink::PushRegistrationStatus::NO_SENDER_ID, + base::nullopt, nullptr, base::nullopt, base::nullopt); + return; + } + + // We use DocumentInterfaceBroker to communicate with the RenderFrame in the + // browser process now, so we don't need to pass a valid ID from here anymore. + // TODO: Remove the extra parameter |render_frame_id| from the mojo interface. + GetService()->Subscribe( + -1 /* Invalid ID */, service_worker_registration_id, std::move(options), + user_gesture, + WTF::Bind(&PushMessagingClient::DidSubscribe, WrapPersistent(this), + std::move(callbacks))); +} + +void PushMessagingClient::DidSubscribe( + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks, + mojom::blink::PushRegistrationStatus status, + const base::Optional<KURL>& endpoint, + mojom::blink::PushSubscriptionOptionsPtr options, + const base::Optional<WTF::Vector<uint8_t>>& p256dh, + const base::Optional<WTF::Vector<uint8_t>>& auth) { + DCHECK(callbacks); + + if (status == + mojom::blink::PushRegistrationStatus::SUCCESS_FROM_PUSH_SERVICE || + status == mojom::blink::PushRegistrationStatus:: + SUCCESS_NEW_SUBSCRIPTION_FROM_PUSH_SERVICE || + status == mojom::blink::PushRegistrationStatus::SUCCESS_FROM_CACHE) { + DCHECK(endpoint); + DCHECK(options); + DCHECK(p256dh); + DCHECK(auth); + + WebPushSubscriptionOptions web_options = + mojo::ConvertTo<WebPushSubscriptionOptions>(std::move(options)); + callbacks->OnSuccess(std::make_unique<WebPushSubscription>( + endpoint.value(), web_options.user_visible_only, + WebString::FromLatin1(web_options.application_server_key), + p256dh.value(), auth.value())); + } else { + callbacks->OnError(PushRegistrationStatusToWebPushError(status)); + } +} + +// static +void ProvidePushMessagingClientTo(LocalFrame& frame, + PushMessagingClient* client) { + PushMessagingClient::ProvideTo(frame, client); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/push_messaging/push_messaging_client.h b/third_party/blink/renderer/modules/push_messaging/push_messaging_client.h new file mode 100644 index 0000000..e32f1af --- /dev/null +++ b/third_party/blink/renderer/modules/push_messaging/push_messaging_client.h
@@ -0,0 +1,79 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_MODULES_PUSH_MESSAGING_PUSH_MESSAGING_CLIENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_PUSH_MESSAGING_PUSH_MESSAGING_CLIENT_H_ + +#include <stdint.h> +#include <memory> + +#include "base/macros.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" +#include "third_party/blink/public/mojom/push_messaging/push_messaging.mojom-blink.h" +#include "third_party/blink/public/platform/modules/push_messaging/web_push_subscription.h" +#include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/platform/supplementable.h" + +namespace blink { + +namespace mojom { +enum class PushRegistrationStatus; +} // namespace mojom + +class KURL; +struct Manifest; + +class PushMessagingClient final + : public GarbageCollectedFinalized<PushMessagingClient>, + public Supplement<LocalFrame> { + USING_GARBAGE_COLLECTED_MIXIN(PushMessagingClient); + + public: + static const char kSupplementName[]; + + explicit PushMessagingClient(LocalFrame& frame); + ~PushMessagingClient() = default; + + static PushMessagingClient* From(LocalFrame* frame); + + void Subscribe(int64_t service_worker_registration_id, + const WebPushSubscriptionOptions& options, + bool user_gesture, + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks); + + private: + // Returns an initialized PushMessaging service. A connection will be + // established after the first call to this method. + mojom::blink::PushMessaging* GetService(); + + void DidGetManifest(int64_t service_worker_registration_id, + mojom::blink::PushSubscriptionOptionsPtr options, + bool user_gesture, + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks, + const WebURL& manifest_url, + const Manifest& manifest); + + void DoSubscribe(int64_t service_worker_registration_id, + mojom::blink::PushSubscriptionOptionsPtr options, + bool user_gesture, + std::unique_ptr<WebPushSubscriptionCallbacks> callbacks); + + void DidSubscribe(std::unique_ptr<WebPushSubscriptionCallbacks> callbacks, + mojom::blink::PushRegistrationStatus status, + const base::Optional<KURL>& endpoint, + mojom::blink::PushSubscriptionOptionsPtr options, + const base::Optional<WTF::Vector<uint8_t>>& p256dh, + const base::Optional<WTF::Vector<uint8_t>>& auth); + + mojom::blink::PushMessagingPtr push_messaging_manager_; + + DISALLOW_COPY_AND_ASSIGN(PushMessagingClient); +}; + +void ProvidePushMessagingClientTo(LocalFrame& frame, + PushMessagingClient* client); + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PUSH_MESSAGING_PUSH_MESSAGING_CLIENT_H_
diff --git a/third_party/blink/renderer/platform/exported/web_data.cc b/third_party/blink/renderer/platform/exported/web_data.cc index 86a304e..ca8b8055 100644 --- a/third_party/blink/renderer/platform/exported/web_data.cc +++ b/third_party/blink/renderer/platform/exported/web_data.cc
@@ -72,10 +72,10 @@ return it->size(); } -WebVector<char> WebData::Copy() const { +WebVector<uint8_t> WebData::Copy() const { return private_.IsNull() - ? WebVector<char>() - : WebVector<char>(private_->CopyAs<std::vector<char>>()); + ? WebVector<uint8_t>() + : WebVector<uint8_t>(private_->CopyAs<std::vector<uint8_t>>()); } WebData::WebData(scoped_refptr<SharedBuffer> buffer)
diff --git a/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc b/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc index e8ef8c4e..47ac816 100644 --- a/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc +++ b/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc
@@ -29,8 +29,7 @@ // ThreadHeap::markedObjectSize() can be underestimated if we're still in the // process of lazy sweeping. objects_dump->AddScalar("size", "bytes", - ProcessHeap::TotalAllocatedObjectSize() + - ProcessHeap::TotalMarkedObjectSize()); + ProcessHeap::TotalAllocatedObjectSize()); } } // namespace
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc index ca83492..412d67c 100644 --- a/third_party/blink/renderer/platform/heap/heap.cc +++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -59,12 +59,43 @@ HeapAllocHooks::AllocationHook* HeapAllocHooks::allocation_hook_ = nullptr; HeapAllocHooks::FreeHook* HeapAllocHooks::free_hook_ = nullptr; +class ProcessHeapReporter final : public ThreadHeapStatsObserver { + public: + void IncreaseAllocatedSpace(size_t bytes) final { + ProcessHeap::IncreaseTotalAllocatedSpace(bytes); + } + + void DecreaseAllocatedSpace(size_t bytes) final { + ProcessHeap::DecreaseTotalAllocatedSpace(bytes); + } + + void ResetAllocatedObjectSize(size_t bytes) final { + ProcessHeap::DecreaseTotalAllocatedObjectSize(prev_incremented_); + ProcessHeap::IncreaseTotalAllocatedObjectSize(bytes); + prev_incremented_ = bytes; + } + + void IncreaseAllocatedObjectSize(size_t bytes) final { + ProcessHeap::IncreaseTotalAllocatedObjectSize(bytes); + prev_incremented_ += bytes; + } + + void DecreaseAllocatedObjectSize(size_t bytes) final { + ProcessHeap::DecreaseTotalAllocatedObjectSize(bytes); + prev_incremented_ -= bytes; + } + + private: + size_t prev_incremented_ = 0; +}; + ThreadHeap::ThreadHeap(ThreadState* thread_state) : thread_state_(thread_state), heap_stats_collector_(std::make_unique<ThreadHeapStatsCollector>()), region_tree_(std::make_unique<RegionTree>()), address_cache_(std::make_unique<AddressCache>()), free_page_pool_(std::make_unique<PagePool>()), + process_heap_reporter_(std::make_unique<ProcessHeapReporter>()), marking_worklist_(nullptr), not_fully_constructed_worklist_(nullptr), weak_callback_worklist_(nullptr), @@ -82,6 +113,8 @@ likely_to_be_promptly_freed_ = std::make_unique<int[]>(kLikelyToBePromptlyFreedArraySize); ClearArenaAges(); + + stats_collector()->RegisterObserver(process_heap_reporter_.get()); } ThreadHeap::~ThreadHeap() { @@ -89,26 +122,6 @@ delete arenas_[i]; } -void ThreadHeap::IncreaseAllocatedObjectSize(size_t bytes) { - stats_collector()->IncreaseAllocatedObjectSize(bytes); - ProcessHeap::IncreaseTotalAllocatedObjectSize(bytes); -} - -void ThreadHeap::DecreaseAllocatedObjectSize(size_t bytes) { - stats_collector()->DecreaseAllocatedObjectSize(bytes); - ProcessHeap::DecreaseTotalAllocatedObjectSize(bytes); -} - -void ThreadHeap::IncreaseAllocatedSpace(size_t bytes) { - stats_collector()->IncreaseAllocatedSpace(bytes); - ProcessHeap::IncreaseTotalAllocatedSpace(bytes); -} - -void ThreadHeap::DecreaseAllocatedSpace(size_t bytes) { - stats_collector()->DecreaseAllocatedSpace(bytes); - ProcessHeap::DecreaseTotalAllocatedSpace(bytes); -} - Address ThreadHeap::CheckAndMarkPointer(MarkingVisitor* visitor, Address address) { DCHECK(thread_state_->InAtomicMarkingPause());
diff --git a/third_party/blink/renderer/platform/heap/heap.h b/third_party/blink/renderer/platform/heap/heap.h index bf7872ba..aa009e32 100644 --- a/third_party/blink/renderer/platform/heap/heap.h +++ b/third_party/blink/renderer/platform/heap/heap.h
@@ -57,6 +57,7 @@ class AddressCache; class ThreadHeapStatsCollector; class PagePool; +class ProcessHeapReporter; class RegionTree; struct MarkingItem { @@ -372,11 +373,6 @@ return heap_stats_collector_.get(); } - void IncreaseAllocatedObjectSize(size_t); - void DecreaseAllocatedObjectSize(size_t); - void IncreaseAllocatedSpace(size_t); - void DecreaseAllocatedSpace(size_t); - #if defined(ADDRESS_SANITIZER) void PoisonEagerArena(); void PoisonAllHeaps(); @@ -406,6 +402,7 @@ std::unique_ptr<RegionTree> region_tree_; std::unique_ptr<AddressCache> address_cache_; std::unique_ptr<PagePool> free_page_pool_; + std::unique_ptr<ProcessHeapReporter> process_heap_reporter_; // All objects on this worklist have been fully initialized and assigned a // trace callback for iterating the body of the object. This worklist should
diff --git a/third_party/blink/renderer/platform/heap/heap_page.cc b/third_party/blink/renderer/platform/heap/heap_page.cc index 2ccddf6e..65aacaa1 100644 --- a/third_party/blink/renderer/platform/heap/heap_page.cc +++ b/third_party/blink/renderer/platform/heap/heap_page.cc
@@ -615,7 +615,8 @@ new (page_memory->WritableStart()) NormalPage(page_memory, this); swept_pages_.Push(page); - GetThreadState()->Heap().IncreaseAllocatedSpace(page->size()); + GetThreadState()->Heap().stats_collector()->IncreaseAllocatedSpace( + page->size()); #if DCHECK_IS_ON() || defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER) // Allow the following addToFreeList() to add the newly allocated memory // to the free list. @@ -629,7 +630,8 @@ } void NormalPageArena::FreePage(NormalPage* page) { - GetThreadState()->Heap().DecreaseAllocatedSpace(page->size()); + GetThreadState()->Heap().stats_collector()->DecreaseAllocatedSpace( + page->size()); PageMemory* memory = page->Storage(); page->~NormalPage(); @@ -694,7 +696,7 @@ AddToFreeList(address, size); promptly_freed_size_ += size; } - GetThreadState()->Heap().DecreaseAllocatedObjectSize(size); + GetThreadState()->Heap().stats_collector()->DecreaseAllocatedObjectSize(size); } bool NormalPageArena::ExpandObject(HeapObjectHeader* header, size_t new_size) { @@ -782,10 +784,10 @@ // - If checkpoint is larger, the allocated size has increased. // - The allocated size has decreased, otherwise. if (last_remaining_allocation_size_ > remaining_allocation_size_) { - GetThreadState()->Heap().IncreaseAllocatedObjectSize( + GetThreadState()->Heap().stats_collector()->IncreaseAllocatedObjectSize( last_remaining_allocation_size_ - remaining_allocation_size_); } else if (last_remaining_allocation_size_ != remaining_allocation_size_) { - GetThreadState()->Heap().DecreaseAllocatedObjectSize( + GetThreadState()->Heap().stats_collector()->DecreaseAllocatedObjectSize( remaining_allocation_size_ - last_remaining_allocation_size_); } last_remaining_allocation_size_ = remaining_allocation_size_; @@ -803,7 +805,7 @@ // Free and clear the old linear allocation area. if (HasCurrentAllocationArea()) { AddToFreeList(CurrentAllocationPoint(), RemainingAllocationSize()); - GetThreadState()->Heap().DecreaseAllocatedObjectSize( + GetThreadState()->Heap().stats_collector()->DecreaseAllocatedObjectSize( RemainingAllocationSize()); } // Set up a new linear allocation area. @@ -812,7 +814,8 @@ if (point) { // Only, update allocated size and object start bitmap if the area is // actually set up with a non-null address. - GetThreadState()->Heap().IncreaseAllocatedObjectSize(size); + GetThreadState()->Heap().stats_collector()->IncreaseAllocatedObjectSize( + size); // Current allocation point can never be part of the object bitmap start // because the area can grow or shrink. Will be added back before a GC when // clearing the allocation point. @@ -959,8 +962,9 @@ swept_pages_.Push(large_object); - GetThreadState()->Heap().IncreaseAllocatedSpace(large_object->size()); - GetThreadState()->Heap().IncreaseAllocatedObjectSize( + GetThreadState()->Heap().stats_collector()->IncreaseAllocatedSpace( + large_object->size()); + GetThreadState()->Heap().stats_collector()->IncreaseAllocatedObjectSize( large_object->PayloadSize()); return result; } @@ -968,7 +972,8 @@ void LargeObjectArena::FreeLargeObjectPage(LargeObjectPage* object) { ASAN_UNPOISON_MEMORY_REGION(object->Payload(), object->PayloadSize()); object->ObjectHeader()->Finalize(object->Payload(), object->PayloadSize()); - GetThreadState()->Heap().DecreaseAllocatedSpace(object->size()); + GetThreadState()->Heap().stats_collector()->DecreaseAllocatedSpace( + object->size()); // Unpoison the object header and allocationGranularity bytes after the // object before freeing.
diff --git a/third_party/blink/renderer/platform/heap/heap_stats_collector.cc b/third_party/blink/renderer/platform/heap/heap_stats_collector.cc index 9f969da..d8a8251 100644 --- a/third_party/blink/renderer/platform/heap/heap_stats_collector.cc +++ b/third_party/blink/renderer/platform/heap/heap_stats_collector.cc
@@ -4,8 +4,9 @@ #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h" +#include <cmath> + #include "base/logging.h" -#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h" #include "third_party/blink/renderer/platform/wtf/allocator/partitions.h" namespace blink { @@ -23,27 +24,68 @@ void ThreadHeapStatsCollector::IncreaseAllocatedObjectSize(size_t bytes) { // The current GC may not have been started. This is ok as recording considers // the whole time range between garbage collections. - allocated_bytes_since_prev_gc_ += static_cast<int64_t>(bytes); + pos_delta_allocated_bytes_since_prev_gc_ += bytes; +} + +void ThreadHeapStatsCollector::IncreaseAllocatedObjectSizeForTesting( + size_t bytes) { + IncreaseAllocatedObjectSize(bytes); + AllocatedObjectSizeSafepointImpl(); } void ThreadHeapStatsCollector::DecreaseAllocatedObjectSize(size_t bytes) { // See IncreaseAllocatedObjectSize. - allocated_bytes_since_prev_gc_ -= static_cast<int64_t>(bytes); + neg_delta_allocated_bytes_since_prev_gc_ += bytes; +} + +void ThreadHeapStatsCollector::DecreaseAllocatedObjectSizeForTesting( + size_t bytes) { + DecreaseAllocatedObjectSize(bytes); + AllocatedObjectSizeSafepointImpl(); } void ThreadHeapStatsCollector::AllocatedObjectSizeSafepoint() { - if (unified_heap_controller_) { - unified_heap_controller_->UpdateAllocatedObjectSize( - allocated_bytes_since_prev_gc_); + if (std::abs(pos_delta_allocated_bytes_since_prev_gc_ - + neg_delta_allocated_bytes_since_prev_gc_) > kUpdateThreshold) { + AllocatedObjectSizeSafepointImpl(); } } +void ThreadHeapStatsCollector::AllocatedObjectSizeSafepointImpl() { + allocated_bytes_since_prev_gc_ += + static_cast<int64_t>(pos_delta_allocated_bytes_since_prev_gc_) - + static_cast<int64_t>(neg_delta_allocated_bytes_since_prev_gc_); + + // These observer methods may start or finalize GC. In case they trigger a + // final GC pause, the delta counters are reset there and the following + // observer calls are called with '0' updates. + ForAllObservers([this](ThreadHeapStatsObserver* observer) { + // Recompute delta here so that a GC finalization is able to clear the + // delta for other observer calls. + int64_t delta = pos_delta_allocated_bytes_since_prev_gc_ - + neg_delta_allocated_bytes_since_prev_gc_; + if (delta < 0) { + observer->DecreaseAllocatedObjectSize(static_cast<size_t>(-delta)); + } else { + observer->IncreaseAllocatedObjectSize(static_cast<size_t>(delta)); + } + }); + pos_delta_allocated_bytes_since_prev_gc_ = 0; + neg_delta_allocated_bytes_since_prev_gc_ = 0; +} + void ThreadHeapStatsCollector::IncreaseAllocatedSpace(size_t bytes) { allocated_space_bytes_ += bytes; + ForAllObservers([bytes](ThreadHeapStatsObserver* observer) { + observer->IncreaseAllocatedSpace(bytes); + }); } void ThreadHeapStatsCollector::DecreaseAllocatedSpace(size_t bytes) { allocated_space_bytes_ -= bytes; + ForAllObservers([bytes](ThreadHeapStatsObserver* observer) { + observer->DecreaseAllocatedSpace(bytes); + }); } void ThreadHeapStatsCollector::IncreaseWrapperCount(size_t count) { @@ -66,6 +108,9 @@ } void ThreadHeapStatsCollector::NotifyMarkingCompleted(size_t marked_bytes) { + allocated_bytes_since_prev_gc_ += + static_cast<int64_t>(pos_delta_allocated_bytes_since_prev_gc_) - + static_cast<int64_t>(neg_delta_allocated_bytes_since_prev_gc_); current_.marked_bytes = marked_bytes; current_.object_size_in_bytes_before_sweeping = object_size_in_bytes(); current_.allocated_space_in_bytes_before_sweeping = allocated_space_bytes(); @@ -74,6 +119,12 @@ current_.wrapper_count_before_sweeping = wrapper_count_; allocated_bytes_since_prev_gc_ = 0; collected_wrapper_count_ = 0; + pos_delta_allocated_bytes_since_prev_gc_ = 0; + neg_delta_allocated_bytes_since_prev_gc_ = 0; + + ForAllObservers([marked_bytes](ThreadHeapStatsObserver* observer) { + observer->ResetAllocatedObjectSize(marked_bytes); + }); } void ThreadHeapStatsCollector::NotifySweepingCompleted() { @@ -157,4 +208,24 @@ return wrapper_count_; } +void ThreadHeapStatsCollector::RegisterObserver( + ThreadHeapStatsObserver* observer) { + DCHECK(!observers_.Contains(observer)); + observers_.push_back(observer); +} + +void ThreadHeapStatsCollector::UnregisterObserver( + ThreadHeapStatsObserver* observer) { + wtf_size_t index = observers_.Find(observer); + DCHECK_NE(WTF::kNotFound, index); + observers_.EraseAt(index); +} + +template <typename Callback> +void ThreadHeapStatsCollector::ForAllObservers(Callback callback) { + for (ThreadHeapStatsObserver* observer : observers_) { + callback(observer); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/heap_stats_collector.h b/third_party/blink/renderer/platform/heap/heap_stats_collector.h index d7ff70c..6dcfd08 100644 --- a/third_party/blink/renderer/platform/heap/heap_stats_collector.h +++ b/third_party/blink/renderer/platform/heap/heap_stats_collector.h
@@ -15,7 +15,30 @@ namespace blink { -class UnifiedHeapController; +// Interface for observing changes to heap sizing. +class PLATFORM_EXPORT ThreadHeapStatsObserver { + public: + // Called upon allocating/releasing chunks of memory that contain objects. + // + // Must not trigger GC or allocate. + virtual void IncreaseAllocatedSpace(size_t) = 0; + virtual void DecreaseAllocatedSpace(size_t) = 0; + + // Called once per GC cycle with the accurate number of live |bytes|. + // + // Must not trigger GC or allocate. + virtual void ResetAllocatedObjectSize(size_t bytes) = 0; + + // Called after observing at least + // |ThreadHeapStatsCollector::kUpdateThreshold| changed bytes through + // allocation or explicit free. Reports both, negative and positive + // increments, to allow observer to decide whether absolute values or only the + // deltas is interesting. + // + // May trigger GC but most not allocate. + virtual void IncreaseAllocatedObjectSize(size_t) = 0; + virtual void DecreaseAllocatedObjectSize(size_t) = 0; +}; // Manages counters and statistics across garbage collection cycles. // @@ -274,11 +297,23 @@ return TimeDelta::FromMilliseconds(current_.marking_time_in_ms()); } - void SetUnifiedHeapController(UnifiedHeapController* controller) { - unified_heap_controller_ = controller; - } + void RegisterObserver(ThreadHeapStatsObserver* observer); + void UnregisterObserver(ThreadHeapStatsObserver* observer); + + void IncreaseAllocatedObjectSizeForTesting(size_t); + void DecreaseAllocatedObjectSizeForTesting(size_t); private: + // Observers are implemented using virtual calls. Avoid notifications below + // reasonably interesting sizes. + static constexpr int64_t kUpdateThreshold = 1024; + + // Invokes |callback| for all registered observers. + template <typename Callback> + void ForAllObservers(Callback callback); + + void AllocatedObjectSizeSafepointImpl(); + // Statistics for the currently running garbage collection. Note that the // Event may not be fully populated yet as some phase may not have been run. const Event& current() const { return current_; } @@ -289,6 +324,8 @@ // Allocated bytes since the last garbage collection. These bytes are reset // after marking as they are accounted in marked_bytes then. int64_t allocated_bytes_since_prev_gc_ = 0; + int64_t pos_delta_allocated_bytes_since_prev_gc_ = 0; + int64_t neg_delta_allocated_bytes_since_prev_gc_ = 0; // Allocated space in bytes for all arenas. size_t allocated_space_bytes_ = 0; @@ -302,9 +339,7 @@ // collection cycle to make them easier to use. TimeDelta gc_nested_in_v8_; - // Unified heap observes interesting statistics and forwards them to V8 after - // some aggregation. - UnifiedHeapController* unified_heap_controller_ = nullptr; + Vector<ThreadHeapStatsObserver*> observers_; FRIEND_TEST_ALL_PREFIXES(ThreadHeapStatsCollectorTest, InitialEmpty); FRIEND_TEST_ALL_PREFIXES(ThreadHeapStatsCollectorTest, IncreaseScopeTime);
diff --git a/third_party/blink/renderer/platform/heap/heap_stats_collector_test.cc b/third_party/blink/renderer/platform/heap/heap_stats_collector_test.cc index 746a1c9e..554d4b9 100644 --- a/third_party/blink/renderer/platform/heap/heap_stats_collector_test.cc +++ b/third_party/blink/renderer/platform/heap/heap_stats_collector_test.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { @@ -104,7 +105,7 @@ TEST(ThreadHeapStatsCollectorTest, EstimatedObjectSizeInBytesNoMarkedBytes) { ThreadHeapStatsCollector stats_collector; stats_collector.NotifyMarkingStarted(BlinkGC::GCReason::kForcedGCForTesting); - stats_collector.IncreaseAllocatedObjectSize(512); + stats_collector.IncreaseAllocatedObjectSizeForTesting(512); EXPECT_EQ(512u, stats_collector.object_size_in_bytes()); stats_collector.NotifyMarkingCompleted(kNoMarkedBytes); stats_collector.NotifySweepingCompleted(); @@ -117,7 +118,7 @@ stats_collector.NotifySweepingCompleted(); stats_collector.NotifyMarkingStarted(BlinkGC::GCReason::kForcedGCForTesting); stats_collector.NotifyMarkingCompleted(kNoMarkedBytes); - stats_collector.IncreaseAllocatedObjectSize(512); + stats_collector.IncreaseAllocatedObjectSizeForTesting(512); EXPECT_EQ(640u, stats_collector.object_size_in_bytes()); stats_collector.NotifySweepingCompleted(); } @@ -131,7 +132,7 @@ stats_collector.NotifyMarkingStarted(BlinkGC::GCReason::kForcedGCForTesting); stats_collector.NotifyMarkingCompleted(128); // Currently marked bytes should not account to the estimated object size. - stats_collector.IncreaseAllocatedObjectSize(512); + stats_collector.IncreaseAllocatedObjectSizeForTesting(512); EXPECT_EQ(640u, stats_collector.object_size_in_bytes()); stats_collector.NotifySweepingCompleted(); } @@ -167,7 +168,7 @@ stats_collector.NotifyMarkingCompleted(1024); stats_collector.NotifySweepingCompleted(); stats_collector.NotifyMarkingStarted(BlinkGC::GCReason::kForcedGCForTesting); - stats_collector.IncreaseAllocatedObjectSize(512); + stats_collector.IncreaseAllocatedObjectSizeForTesting(512); EXPECT_DOUBLE_EQ(1.5, stats_collector.estimated_marking_time_in_seconds()); stats_collector.NotifyMarkingCompleted(kNoMarkedBytes); stats_collector.NotifySweepingCompleted(); @@ -403,4 +404,131 @@ stats_collector.previous().allocated_space_in_bytes_before_sweeping); } +namespace { + +class MockThreadHeapStatsObserver : public ThreadHeapStatsObserver { + public: + MOCK_METHOD1(IncreaseAllocatedSpace, void(size_t)); + MOCK_METHOD1(DecreaseAllocatedSpace, void(size_t)); + MOCK_METHOD1(ResetAllocatedObjectSize, void(size_t)); + MOCK_METHOD1(IncreaseAllocatedObjectSize, void(size_t)); + MOCK_METHOD1(DecreaseAllocatedObjectSize, void(size_t)); +}; + +void FakeGC(ThreadHeapStatsCollector* stats_collector, size_t marked_bytes) { + stats_collector->NotifyMarkingStarted(BlinkGC::GCReason::kForcedGCForTesting); + stats_collector->NotifyMarkingCompleted(marked_bytes); + stats_collector->NotifySweepingCompleted(); +} + +} // namespace + +TEST(ThreadHeapStatsCollectorTest, RegisterUnregisterObserver) { + ThreadHeapStatsCollector stats_collector; + MockThreadHeapStatsObserver observer; + stats_collector.RegisterObserver(&observer); + stats_collector.UnregisterObserver(&observer); +} + +TEST(ThreadHeapStatsCollectorTest, ObserveAllocatedSpace) { + ThreadHeapStatsCollector stats_collector; + MockThreadHeapStatsObserver observer; + stats_collector.RegisterObserver(&observer); + EXPECT_CALL(observer, IncreaseAllocatedSpace(1024)); + stats_collector.IncreaseAllocatedSpace(1024); + EXPECT_CALL(observer, DecreaseAllocatedSpace(1024)); + stats_collector.DecreaseAllocatedSpace(1024); + stats_collector.UnregisterObserver(&observer); +} + +TEST(ThreadHeapStatsCollectorTest, ObserveResetAllocatedObjectSize) { + ThreadHeapStatsCollector stats_collector; + MockThreadHeapStatsObserver observer; + stats_collector.RegisterObserver(&observer); + EXPECT_CALL(observer, ResetAllocatedObjectSize(2048)); + FakeGC(&stats_collector, 2048); + stats_collector.UnregisterObserver(&observer); +} + +TEST(ThreadHeapStatsCollectorTest, ObserveAllocatedObjectSize) { + ThreadHeapStatsCollector stats_collector; + MockThreadHeapStatsObserver observer; + stats_collector.RegisterObserver(&observer); + EXPECT_CALL(observer, IncreaseAllocatedObjectSize(1024)); + stats_collector.IncreaseAllocatedObjectSizeForTesting(1024); + EXPECT_CALL(observer, DecreaseAllocatedObjectSize(1024)); + stats_collector.DecreaseAllocatedObjectSizeForTesting(1024); + stats_collector.UnregisterObserver(&observer); +} + +namespace { + +class ObserverTriggeringGC final : public ThreadHeapStatsObserver { + public: + explicit ObserverTriggeringGC(ThreadHeapStatsCollector* stats_collector) + : stats_collector_(stats_collector) {} + + void IncreaseAllocatedObjectSize(size_t bytes) final { + increase_call_count++; + increased_size_bytes_ += bytes; + if (increase_call_count == 1) { + FakeGC(stats_collector_, bytes); + } + } + + void ResetAllocatedObjectSize(size_t marked) final { + reset_call_count++; + marked_bytes_ = marked; + } + + // Mock out the rest to trigger warnings if used. + MOCK_METHOD1(IncreaseAllocatedSpace, void(size_t)); + MOCK_METHOD1(DecreaseAllocatedSpace, void(size_t)); + MOCK_METHOD1(DecreaseAllocatedObjectSize, void(size_t)); + + size_t marked_bytes() const { return marked_bytes_; } + size_t increased_size_bytes() const { return increased_size_bytes_; } + + size_t increase_call_count = 0; + size_t reset_call_count = 0; + + private: + ThreadHeapStatsCollector* const stats_collector_; + size_t marked_bytes_ = 0; + size_t increased_size_bytes_ = 0; +}; + +} // namespace + +TEST(ThreadHeapStatsCollectorTest, ObserverTriggersGC) { + ThreadHeapStatsCollector stats_collector; + ObserverTriggeringGC gc_observer(&stats_collector); + MockThreadHeapStatsObserver mock_observer; + // Internal detail: First registered observer is also notified first. + stats_collector.RegisterObserver(&gc_observer); + stats_collector.RegisterObserver(&mock_observer); + + // mock_observer is notified after triggering GC. This means that it should + // see the reset call with the fully marked size (as gc_observer fakes a GC + // with that size). + EXPECT_CALL(mock_observer, ResetAllocatedObjectSize(1024)); + // Since the GC clears counters, it should see an increase call with a delta + // of zero bytes. + EXPECT_CALL(mock_observer, IncreaseAllocatedObjectSize(0)); + + // Trigger scenario. + stats_collector.IncreaseAllocatedObjectSizeForTesting(1024); + + // gc_observer sees both calls exactly once. + EXPECT_EQ(1u, gc_observer.increase_call_count); + EXPECT_EQ(1u, gc_observer.reset_call_count); + // gc_observer sees the increased bytes and the reset call with the fully + // marked size. + EXPECT_EQ(1024u, gc_observer.increased_size_bytes()); + EXPECT_EQ(1024u, gc_observer.marked_bytes()); + + stats_collector.UnregisterObserver(&gc_observer); + stats_collector.UnregisterObserver(&mock_observer); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/persistent_node.cc b/third_party/blink/renderer/platform/heap/persistent_node.cc index ce00cc36e..ecf770eb 100644 --- a/third_party/blink/renderer/platform/heap/persistent_node.cc +++ b/third_party/blink/renderer/platform/heap/persistent_node.cc
@@ -79,9 +79,6 @@ // list of PersistentNodes. void PersistentRegion::TracePersistentNodes(Visitor* visitor, ShouldTraceCallback should_trace) { - size_t debug_marked_object_size = ProcessHeap::TotalMarkedObjectSize(); - base::debug::Alias(&debug_marked_object_size); - free_list_head_ = nullptr; int persistent_count = 0; PersistentNodeSlots** prev_next = &slots_; @@ -103,7 +100,6 @@ if (!should_trace(visitor, node)) continue; node->TracePersistentNode(visitor); - debug_marked_object_size = ProcessHeap::TotalMarkedObjectSize(); } } if (free_count == PersistentNodeSlots::kSlotCount) {
diff --git a/third_party/blink/renderer/platform/heap/process_heap.cc b/third_party/blink/renderer/platform/heap/process_heap.cc index 023b203..604eb8d 100644 --- a/third_party/blink/renderer/platform/heap/process_heap.cc +++ b/third_party/blink/renderer/platform/heap/process_heap.cc
@@ -29,7 +29,6 @@ void ProcessHeap::Init() { total_allocated_space_ = 0; total_allocated_object_size_ = 0; - total_marked_object_size_ = 0; GCInfoTable::CreateGlobalTable(); @@ -41,7 +40,6 @@ void ProcessHeap::ResetHeapCounters() { total_allocated_object_size_ = 0; - total_marked_object_size_ = 0; } CrossThreadPersistentRegion& ProcessHeap::GetCrossThreadPersistentRegion() { @@ -63,6 +61,5 @@ std::atomic_size_t ProcessHeap::total_allocated_space_{0}; std::atomic_size_t ProcessHeap::total_allocated_object_size_{0}; -std::atomic_size_t ProcessHeap::total_marked_object_size_{0}; } // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/process_heap.h b/third_party/blink/renderer/platform/heap/process_heap.h index ec3db194..61b3c961 100644 --- a/third_party/blink/renderer/platform/heap/process_heap.h +++ b/third_party/blink/renderer/platform/heap/process_heap.h
@@ -43,15 +43,6 @@ static size_t TotalAllocatedObjectSize() { return total_allocated_object_size_.load(std::memory_order_relaxed); } - static void IncreaseTotalMarkedObjectSize(size_t delta) { - total_marked_object_size_.fetch_add(delta, std::memory_order_relaxed); - } - static void DecreaseTotalMarkedObjectSize(size_t delta) { - total_marked_object_size_.fetch_sub(delta, std::memory_order_relaxed); - } - static size_t TotalMarkedObjectSize() { - return total_marked_object_size_.load(std::memory_order_relaxed); - } static void IncreaseTotalAllocatedSpace(size_t delta) { total_allocated_space_.fetch_add(delta, std::memory_order_relaxed); } @@ -66,7 +57,6 @@ private: static std::atomic_size_t total_allocated_space_; static std::atomic_size_t total_allocated_object_size_; - static std::atomic_size_t total_marked_object_size_; friend class ThreadState; };
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc index 5ad96b6..e8f535d 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.cc +++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -1637,16 +1637,6 @@ if (ShouldVerifyMarking()) VerifyMarking(marking_type); - if (Heap().stats_collector()->allocated_bytes_since_prev_gc() > 0) { - ProcessHeap::DecreaseTotalAllocatedObjectSize(static_cast<size_t>( - Heap().stats_collector()->allocated_bytes_since_prev_gc())); - } else { - ProcessHeap::IncreaseTotalAllocatedObjectSize(static_cast<size_t>( - -Heap().stats_collector()->allocated_bytes_since_prev_gc())); - } - ProcessHeap::DecreaseTotalMarkedObjectSize( - Heap().stats_collector()->previous().marked_bytes); - ProcessHeap::IncreaseTotalMarkedObjectSize(marked_bytes); Heap().stats_collector()->NotifyMarkingCompleted(marked_bytes); WTF::Partitions::ReportMemoryUsageHistogram();
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc index ade76d5..619619e 100644 --- a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc +++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc
@@ -27,11 +27,11 @@ UnifiedHeapController::UnifiedHeapController(ThreadState* thread_state) : thread_state_(thread_state) { - thread_state->Heap().stats_collector()->SetUnifiedHeapController(this); + thread_state->Heap().stats_collector()->RegisterObserver(this); } UnifiedHeapController::~UnifiedHeapController() { - thread_state_->Heap().stats_collector()->SetUnifiedHeapController(nullptr); + thread_state_->Heap().stats_collector()->UnregisterObserver(this); } void UnifiedHeapController::TracePrologue( @@ -98,7 +98,6 @@ static_cast<size_t>(stats_collector->marked_bytes()); summary->time = stats_collector->marking_time_so_far().InMillisecondsF(); buffered_allocated_size_ = 0; - old_allocated_bytes_since_prev_gc_ = 0; if (!thread_state_->IsSweepingInProgress()) { // Sweeping was finished during the atomic pause. Update statistics needs to @@ -181,29 +180,24 @@ return IsRootForNonTracingGCInternal(handle); } -void UnifiedHeapController::UpdateAllocatedObjectSize( - int64_t allocated_bytes_since_prev_gc) { - int64_t delta = - allocated_bytes_since_prev_gc - old_allocated_bytes_since_prev_gc_; - old_allocated_bytes_since_prev_gc_ = allocated_bytes_since_prev_gc; - if (delta < 0) { - // TODO(mlippautz): Add support for negative deltas in V8. - buffered_allocated_size_ += delta; - return; - } - - constexpr int64_t kMinimumReportingSize = 1024; - buffered_allocated_size_ += static_cast<int64_t>(delta); +void UnifiedHeapController::IncreaseAllocatedObjectSize(size_t delta_bytes) { + buffered_allocated_size_ += delta_bytes; // Reported from a recursive sweeping call. if (thread_state()->IsSweepingInProgress() && - thread_state()->SweepForbidden()) + thread_state()->SweepForbidden()) { return; + } - if (buffered_allocated_size_ > kMinimumReportingSize) { + if (buffered_allocated_size_ > 0) { IncreaseAllocatedSize(static_cast<size_t>(buffered_allocated_size_)); buffered_allocated_size_ = 0; } } +void UnifiedHeapController::DecreaseAllocatedObjectSize(size_t delta_bytes) { + // TODO(mlippautz): Add support for negative deltas in V8. + buffered_allocated_size_ -= delta_bytes; +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.h b/third_party/blink/renderer/platform/heap/unified_heap_controller.h index cc27a19e..fd72cb56 100644 --- a/third_party/blink/renderer/platform/heap/unified_heap_controller.h +++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_CONTROLLER_H_ #include "base/macros.h" +#include "third_party/blink/renderer/platform/heap/heap_stats_collector.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "v8/include/v8.h" @@ -29,7 +30,8 @@ // Oilpan does not consider references from DOM wrappers (JavaScript objects on // V8's heap) as roots for such garbage collections. class PLATFORM_EXPORT UnifiedHeapController final - : public v8::EmbedderHeapTracer { + : public v8::EmbedderHeapTracer, + public ThreadHeapStatsObserver { DISALLOW_IMPLICIT_CONSTRUCTORS(UnifiedHeapController); public: @@ -47,8 +49,13 @@ ThreadState* thread_state() const { return thread_state_; } - // Forwarded from ThreadHeapStatsCollector. - void UpdateAllocatedObjectSize(int64_t); + // ThreadHeapStatsObserver implementation. + void IncreaseAllocatedObjectSize(size_t) final; + void DecreaseAllocatedObjectSize(size_t) final; + // Not needed. + void ResetAllocatedObjectSize(size_t) final {} + void IncreaseAllocatedSpace(size_t) final {} + void DecreaseAllocatedSpace(size_t) final {} private: static bool IsRootForNonTracingGCInternal( @@ -60,7 +67,6 @@ // Buffered allocated size. Only positive values are forwarded to V8. int64_t buffered_allocated_size_ = 0; - int64_t old_allocated_bytes_since_prev_gc_ = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_response.h b/third_party/blink/renderer/platform/loader/fetch/resource_response.h index 1cdb0045..11023a15 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_response.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_response.h
@@ -445,7 +445,7 @@ bool was_cached_ = false; bool connection_reused_ = false; - bool is_null_; + bool is_null_ = false; mutable bool have_parsed_age_header_ = false; mutable bool have_parsed_date_header_ = false; mutable bool have_parsed_expires_header_ = false;
diff --git a/third_party/blink/renderer/platform/shared_buffer.h b/third_party/blink/renderer/platform/shared_buffer.h index 776496d..d5310b2e 100644 --- a/third_party/blink/renderer/platform/shared_buffer.h +++ b/third_party/blink/renderer/platform/shared_buffer.h
@@ -265,6 +265,19 @@ return buffer; } +template <> +inline std::vector<uint8_t> SharedBuffer::CopyAs() const { + std::vector<uint8_t> buffer; + buffer.reserve(size_); + + for (const auto& span : *this) { + buffer.insert(buffer.end(), reinterpret_cast<const uint8_t*>(span.data()), + reinterpret_cast<const uint8_t*>(span.data() + span.size())); + } + DCHECK_EQ(buffer.size(), size_); + return buffer; +} + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SHARED_BUFFER_H_
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index b6f6746..91d2c33 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -260,6 +260,11 @@ crbug.com/853977 [ Linux ] http/tests/fetch/chromium/release-handle-crash.html [ Slow ] crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/call-extra-crash-tee.html [ Slow ] crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/release-handle-crash.html [ Slow ] +crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/response-array-buffer-gc-crash.html [ Slow ] +crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/response-blob-gc-crash.html [ Slow ] +crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/response-form-data-gc-crash.html [ Slow ] +crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/response-json-gc-crash.html [ Slow ] +crbug.com/853977 [ Linux ] virtual/blink-cors/http/tests/fetch/chromium/response-text-gc-crash.html [ Slow ] crbug.com/853977 [ Linux ] virtual/streaming-preload/http/tests/fetch/chromium/call-extra-crash-tee.html [ Slow ] crbug.com/853977 [ Linux ] virtual/streaming-preload/http/tests/fetch/chromium/release-handle-crash.html [ Slow ] crbug.com/853977 [ Linux ] virtual/streams-native/http/tests/fetch/chromium/call-extra-crash-tee.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 99c5670..35b7b8d 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -564,7 +564,6 @@ crbug.com/880802 external/wpt/css/css-contain/contain-layout-017.html [ Failure ] crbug.com/671132 external/wpt/css/css-contain/contain-layout-baseline-005.html [ Failure ] crbug.com/626703 external/wpt/css/css-contain/contain-layout-breaks-002.html [ Failure ] -crbug.com/965740 external/wpt/css/css-contain/contain-layout-button-001.html [ Failure ] crbug.com/847274 external/wpt/css/css-contain/contain-paint-005.html [ Failure ] crbug.com/847274 external/wpt/css/css-contain/contain-paint-006.html [ Failure ] crbug.com/880802 external/wpt/css/css-contain/contain-paint-021.html [ Failure ] @@ -2820,6 +2819,21 @@ crbug.com/968164 external/wpt/css/css-ui/webkit-appearance-menulist-button-002.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html [ Failure ] crbug.com/626703 [ Linux ] external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure ] crbug.com/626703 [ Win ] external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure ] @@ -5868,3 +5882,7 @@ crbug.com/970334 [ Mac ] fast/spatial-navigation/snav-tiny-table-traversal.html [ Failure ] crbug.com/970142 http/tests/security/mixedContent/insecure-css-resources.html [ Failure ] crbug.com/970142 virtual/blink-cors/http/tests/security/mixedContent/insecure-css-resources.html [ Failure ] + +# Sheriff 2019-06-05 +crbug.com/971031 [ Mac ] fast/dom/timer-throttling-hidden-page.html [ Pass Failure ] +
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index 1ed6f5f..dbd83c62 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -47423,6 +47423,138 @@ {} ] ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative.html", + [ + [ + "/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-fonts/quoted-generic-ignored.html": [ [ "css/css-fonts/quoted-generic-ignored.html", @@ -100781,6 +100913,18 @@ {} ] ], + "css/selectors/remove-hovered-element.html": [ + [ + "css/selectors/remove-hovered-element.html", + [ + [ + "/css/selectors/remove-hovered-element-ref.html", + "==" + ] + ], + {} + ] + ], "css/selectors/root-siblings.htm": [ [ "css/selectors/root-siblings.htm", @@ -137959,6 +138103,76 @@ {} ] ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative-expected.txt": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative-expected.txt": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative-expected.txt": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative-ref.html": [ + [ + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative-ref.html": [ + [ + {} + ] + ], "css/css-fonts/quoted-generic-ignored-ref.html": [ [ {} @@ -149889,6 +150103,11 @@ {} ] ], + "css/css-shapes/spec-examples/shape-outside-018-expected.txt": [ + [ + {} + ] + ], "css/css-shapes/spec-examples/support/circle-no-shadow.png": [ [ {} @@ -162489,6 +162708,11 @@ {} ] ], + "css/selectors/remove-hovered-element-ref.html": [ + [ + {} + ] + ], "css/selectors/resources/blue15x15.png": [ [ {} @@ -170479,6 +170703,11 @@ {} ] ], + "fonts/ahem.css": [ + [ + {} + ] + ], "fonts/math/axisheight5000-verticalarrow14000.woff": [ [ {} @@ -170689,6 +170918,21 @@ {} ] ], + "fonts/math/scriptpercentscaledown0-scriptscriptpercentscaledown40.woff": [ + [ + {} + ] + ], + "fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown0.woff": [ + [ + {} + ] + ], + "fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown40.woff": [ + [ + {} + ] + ], "fonts/math/scripts-spaceafterscript3000.woff": [ [ {} @@ -184944,6 +185188,11 @@ {} ] ], + "mathml/tools/percentscaledown.py": [ + [ + {} + ] + ], "mathml/tools/radicals.py": [ [ {} @@ -196359,6 +196608,11 @@ {} ] ], + "svg/geometry/svg-baseval-in-display-none-expected.txt": [ + [ + {} + ] + ], "svg/idlharness.window-expected.txt": [ [ {} @@ -204914,6 +205168,11 @@ {} ] ], + "webaudio/the-audio-api/the-audioworklet-interface/processors/input-count-processor.js": [ + [ + {} + ] + ], "webaudio/the-audio-api/the-audioworklet-interface/processors/input-length-processor.js": [ [ {} @@ -233841,6 +234100,30 @@ {} ] ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative.html", + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html", + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html", + {} + ] + ], + "css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html": [ + [ + "css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html", + {} + ] + ], "css/css-fonts/test_datafont_same_origin.html": [ [ "css/css-fonts/test_datafont_same_origin.html", @@ -236479,6 +236762,12 @@ {} ] ], + "css/css-multicol/abspos-in-multicol-with-spanner-crash.html": [ + [ + "css/css-multicol/abspos-in-multicol-with-spanner-crash.html", + {} + ] + ], "css/css-multicol/balance-table-with-fractional-height-row.html": [ [ "css/css-multicol/balance-table-with-fractional-height-row.html", @@ -237379,6 +237668,12 @@ {} ] ], + "css/css-pseudo/first-letter-crash.html": [ + [ + "css/css-pseudo/first-letter-crash.html", + {} + ] + ], "css/css-pseudo/first-letter-property-whitelist.html": [ [ "css/css-pseudo/first-letter-property-whitelist.html", @@ -316222,6 +316517,12 @@ {} ] ], + "svg/geometry/svg-baseval-in-display-none.html": [ + [ + "svg/geometry/svg-baseval-in-display-none.html", + {} + ] + ], "svg/geometry/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html": [ [ "svg/geometry/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html", @@ -322484,6 +322785,12 @@ {} ] ], + "webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https.html": [ + [ + "webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https.html", + {} + ] + ], "webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-basic.html": [ [ "webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-basic.html", @@ -351171,7 +351478,7 @@ "support" ], "client-hints/accept_ch.tentative.https.html": [ - "491ef3c71873bdc349be28deda2a3b455b10da78", + "4b46610c58103cf29734842869856df3e1d404df", "testharness" ], "client-hints/accept_ch.tentative.sub.https.html": [ @@ -351191,11 +351498,11 @@ "support" ], "client-hints/accept_ch_lifetime.tentative.https.html": [ - "0055b131f9287a8fa56330c8c6f79becddee09f5", + "678f8ea3322ec7ea02b113b1f69c29c5af042204", "testharness" ], "client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html": [ - "8273ac78b271786184f9a6dd6b48fc9072c08219", + "2e81a16697d00fb88b73bc02f7b4a4819011e885", "testharness" ], "client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html": [ @@ -351203,7 +351510,7 @@ "testharness" ], "client-hints/accept_ch_lifetime_subresource.tentative.https.html": [ - "4695135e390d7acc7b02bd6286227435291a75e1", + "4b351d176b68bcf3926827d40b832dfdeefdecaf", "testharness" ], "client-hints/accept_ch_malformed_header.https.html": [ @@ -351239,11 +351546,11 @@ "testharness" ], "client-hints/http_equiv_accept_ch_lifetime.tentative.https.html": [ - "73ca1fcdbe011b95297c0524b89657e62fb01e46", + "28bdeff3223e91547fd0f69220f18b40fa63f3c9", "testharness" ], "client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html": [ - "ab878f88961077625268d5e6a4fc4ae29b3b8e1c", + "cf4f8afc79f41d75fcb1d8f9ead6850a8ef89f87", "testharness" ], "client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html": [ @@ -351251,7 +351558,7 @@ "testharness" ], "client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html": [ - "0e56306e7a9422e9571aaaa9b573a3e88f3c432c", + "3be83cd5f77a8cb3eba90e97defa1b7881d0d2f2", "testharness" ], "client-hints/http_equiv_accept_ch_malformed_header.tentative.https.html": [ @@ -368979,7 +369286,7 @@ "visual" ], "css/CSS2/text/letter-spacing-004-ref.xht": [ - "223591ee3a4e8ed73a413b85bd7bc748ea7e9096", + "14f8a5fa70456608db855454af4521ba263fe301", "support" ], "css/CSS2/text/letter-spacing-004.xht": [ @@ -369087,7 +369394,7 @@ "reftest" ], "css/CSS2/text/letter-spacing-065.xht": [ - "b6798b19f0d02ee6ba6d8299ef4ab97c5f6c8866", + "230983d06495c81c1b1564e34f662cddef827bae", "reftest" ], "css/CSS2/text/letter-spacing-066.xht": [ @@ -383858,6 +384165,122 @@ "5cb21495ac523ee796e7b246831fd2d5bdcae798", "reftest" ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative-expected.txt": [ + "fd8dcb1134e7f2c2181bef73f7954d0ead8fc29e", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative.html": [ + "8856b2b14a910c34b04586123098896834bbd83b", + "testharness" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative-expected.txt": [ + "c2f5fb2305970956e8f7ca6e161a0acd3be72da1", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html": [ + "d5982b96070509aa3dfc1ee4df3297871aad6e5e", + "testharness" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html": [ + "c29f6e13ef19116cfcaf1c4f60305189a958256d", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html": [ + "1eb1c02083f499100c8a60c44c62254a02e0da8f", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative-expected.txt": [ + "4fcec20be8543c9ded310fd70046aa8e3a7be286", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html": [ + "496c0210a918328167682c2cf2d24a7881928a34", + "testharness" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative-ref.html": [ + "f0538695a9f5eb7d276134667b5e285508c7a7ac", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative.html": [ + "7f289ffcd81daaf0fed81b4c02e7417ee75a7e18", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html": [ + "8b09510b999702b064aa3f16cf6e428118d6305e", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html": [ + "7af90563ac691dcfa3949f4b262bf507fcedeb1d", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html": [ + "6f8786f9e50c3d4ac6d388dcfb0184a46a4cd6bc", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html": [ + "443c0a74a50958c5182a1b52e54b01bf35e53f10", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html": [ + "6f8786f9e50c3d4ac6d388dcfb0184a46a4cd6bc", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html": [ + "6722cb367f150cff0156c3a85492b4781d78f825", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html": [ + "e98e7c6dba9a9e4936a2d6e34f0f6b113fc8cb6a", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html": [ + "7d34116ce31558ca796f561307b187349db9b4ea", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html": [ + "ef5d4c0c08519c96a1b16f7c449e7e9efd30593f", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html": [ + "ce496640926122888cd5144333e6ccf197ce254d", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html": [ + "26d76a1661bf73b6b4862f2d473acc648050fd85", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html": [ + "151e1552bf23f10fbc75a22542e34b2755287746", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative-ref.html": [ + "4f695e05d1ca432db4d479e5260045e93178c732", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html": [ + "3c5416a86d3ca072c4a5f3bf175f2b782be028ef", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative-ref.html": [ + "d13d90c2b54452d24fbb0b77812e82e9c7a7b29d", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative.html": [ + "abca2487f4a21b82738dc0845efeb29c61d1bb42", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative-ref.html": [ + "de0dab2e1847894f630e834e7e3d5c536ab0dc05", + "support" + ], + "css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative.html": [ + "350f086c466de27659ac5baa861311b96c87cdea", + "reftest" + ], + "css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html": [ + "6df35170255c62bf391ce77b9629802c8969fa9b", + "testharness" + ], "css/css-fonts/quoted-generic-ignored-ref.html": [ "70e2d50cd83f61017f0f22da14065c7afa76e1d1", "support" @@ -391947,7 +392370,7 @@ "testharness" ], "css/css-grid/grid-definition/grid-inline-support-flexible-lengths-001.html": [ - "65ddb8abd5e2f5de01a2e89dda3872e1064bc25a", + "3a2c94238987b84fc99bee3c80e2ddc7fd04793c", "testharness" ], "css/css-grid/grid-definition/grid-inline-support-grid-template-areas-001.html": [ @@ -391955,19 +392378,19 @@ "testharness" ], "css/css-grid/grid-definition/grid-inline-support-grid-template-columns-rows-001.html": [ - "5a20c01c21b6269df6ff61250a62be10785a0448", + "32733e238fad58677447b44be9c5fcc934fe803d", "testharness" ], "css/css-grid/grid-definition/grid-inline-support-named-grid-lines-001.html": [ - "3763315508fb22f2523a8b41f5fd546714db3447", + "fc4caf282349776da41ee63c6a07c3a834243fdc", "testharness" ], "css/css-grid/grid-definition/grid-inline-support-repeat-001.html": [ - "77afdf4636d68d5a377b86d9e82eb9770efbff40", + "68ca0bd9b7cf7ca8e5e756a3ca2de7f4e719302f", "testharness" ], "css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html": [ - "60badb47740d7f48071ffd620884146dd6697e38", + "ff1f814309603c13248b7045d9ca0f9900bd04fe", "testharness" ], "css/css-grid/grid-definition/grid-layout-auto-tracks.html": [ @@ -391995,7 +392418,7 @@ "testharness" ], "css/css-grid/grid-definition/grid-support-flexible-lengths-001.html": [ - "7c4e1c6c41e8a4cab75f6bb5bad7d0b1346a7af1", + "0dae45b39d1acc556ed79fac3ff58562e8ce8e78", "testharness" ], "css/css-grid/grid-definition/grid-support-grid-template-areas-001.html": [ @@ -392003,15 +392426,15 @@ "testharness" ], "css/css-grid/grid-definition/grid-support-grid-template-columns-rows-001.html": [ - "a1c21a7b7227a1cfafdc4cace7182dab273080bf", + "bf818cd85eaff5b659165021e317c23b00d71f77", "testharness" ], "css/css-grid/grid-definition/grid-support-named-grid-lines-001.html": [ - "f51b924c895482d7d3bccc28de756406d8fe579a", + "bff5e8151c782060f08f8fdcf59ccd142d65547e", "testharness" ], "css/css-grid/grid-definition/grid-support-repeat-001.html": [ - "28415ab35c106863e778303dc5a7dbb9eb2758ec", + "78a44e287a7f92cbdd08816838a6b432ae19c689", "testharness" ], "css/css-grid/grid-definition/grid-support-repeat-002.html": [ @@ -392027,7 +392450,7 @@ "reftest" ], "css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html": [ - "89bdce4538e3d10eef1f7eb3ff2c8de2bf8d469f", + "c992bf66d269d0923e78b59f90da4e34395bebe2", "testharness" ], "css/css-grid/grid-definition/grid-template-rows-fit-content-001-ref.html": [ @@ -395634,6 +396057,10 @@ "6a3de9b3a5ce101a9b83f97312ddeb6d7c69274f", "support" ], + "css/css-multicol/abspos-in-multicol-with-spanner-crash.html": [ + "c30a19d001b530c304def61e1e6d55dc0f6b0318", + "testharness" + ], "css/css-multicol/balance-table-with-fractional-height-row.html": [ "434dc52ea3d731bd1393270372294cd007382e59", "testharness" @@ -399286,6 +399713,10 @@ "94f27e6a6665ab1024e1c6367c46a6976a4eec24", "reftest" ], + "css/css-pseudo/first-letter-crash.html": [ + "683d2a77662149be28c581c5de6651e776653d65", + "testharness" + ], "css/css-pseudo/first-letter-opacity-float-001-ref.html": [ "38c230045bd0cbec0d94da16b27fd56aa58456a1", "support" @@ -401670,8 +402101,12 @@ "160671c81eeec929dc979d59438874d5f9715fe9", "testharness" ], + "css/css-shapes/spec-examples/shape-outside-018-expected.txt": [ + "50c5fb4c6d830e013ffd2484141a0735d144c1f7", + "support" + ], "css/css-shapes/spec-examples/shape-outside-018.html": [ - "b95cfd1ce11b1319c378e215e632edc2123caf1b", + "058e5793e5c2e6110f51299b1041da94cb3cdc79", "testharness" ], "css/css-shapes/spec-examples/shape-outside-019.html": [ @@ -420711,7 +421146,7 @@ "testharness" ], "css/css-values/absolute_length_units.html": [ - "b0e5178bce038cea243089db95f92c1d831c6914", + "7528bbbbd4965507719093db7e18784bb20d6858", "visual" ], "css/css-values/angle-units-001.html": [ @@ -432862,6 +433297,14 @@ "46bfede1a5ba155f4c1d6750d1bc941909522b1a", "support" ], + "css/selectors/remove-hovered-element-ref.html": [ + "9527a465ea64cb106704baf3e45647d97239ef5b", + "support" + ], + "css/selectors/remove-hovered-element.html": [ + "ec2eed1d47d33ef492c601bda08f9b6d779a28fc", + "reftest" + ], "css/selectors/resources/blue15x15.png": [ "89de32fdb8a4e48b1320f40f5a75352773077cee", "support" @@ -441283,7 +441726,7 @@ "testharness" ], "element-timing/multiple-background-images.html": [ - "a762ed13396124c20decfce310b19096a4117e2e", + "626287bf0d44078d4c4cdb0b87baf1efa79260c9", "testharness" ], "element-timing/observe-background-image.html": [ @@ -441335,7 +441778,7 @@ "support" ], "element-timing/resources/element-timing-helpers.js": [ - "e378d617f20f0d2c5d815d366b9c937ab46e6bd0", + "3ab4859fb2f8b736c02399dd0fb85b4541f9fd2f", "support" ], "element-timing/resources/iframe-with-square-sends-entry.html": [ @@ -446938,6 +447381,10 @@ "742c1646d8ee0177843e96b08d17bfb499bcaf1e", "support" ], + "fonts/ahem.css": [ + "b278cc14c54af7f6a2d893c6453778bceb65a8ce", + "support" + ], "fonts/math/axisheight5000-verticalarrow14000.woff": [ "9f5d59ae6a7fbf221fd14126645f1cbc7c25d286", "support" @@ -447106,6 +447553,18 @@ "9808112c7aa934f49db078637fb082d1f0f24df5", "support" ], + "fonts/math/scriptpercentscaledown0-scriptscriptpercentscaledown40.woff": [ + "998382de1ec866ca4a66b5e23fb44649c3ec73da", + "support" + ], + "fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown0.woff": [ + "26588c516dd7aa7900fe8312f80198d491afe09a", + "support" + ], + "fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown40.woff": [ + "67af736ffaff2e0b526186b526c8c1c095961b25", + "support" + ], "fonts/math/scripts-spaceafterscript3000.woff": [ "44f9ece85703d6a94b51becf5620719618c7e90f", "support" @@ -468943,7 +469402,7 @@ "support" ], "interfaces/html.idl": [ - "b36c301428914e6b167e89fdf874c29a5fc8ea0e", + "5ae46f742922f4c455380745f124769399086eb9", "support" ], "interfaces/image-capture.idl": [ @@ -468975,7 +469434,7 @@ "support" ], "interfaces/media-capabilities.idl": [ - "8721b1c73fa4218dadfa7149f0dcd7ac2ec9194e", + "00a9e62028a8e455a50f25a6f426aa901bb007d3", "support" ], "interfaces/media-source.idl": [ @@ -469079,7 +469538,7 @@ "support" ], "interfaces/push-api.idl": [ - "e0bc5ec906876b91a7d676a5d4a60a5bffc7201e", + "2fd5e27896ca95a546b26b9675483cb9bde07758", "support" ], "interfaces/referrer-policy.idl": [ @@ -470466,6 +470925,10 @@ "ba99b595f0aa6338ba7a752801c4a32dbbefc9ef", "support" ], + "mathml/tools/percentscaledown.py": [ + "ea09c4405e48a085d04634638c9186f9dbd18e85", + "support" + ], "mathml/tools/radicals.py": [ "90fe1d9cc1e56448fc206f8cf5f2c4e2ba9d02ab", "support" @@ -483227,7 +483690,7 @@ "support" ], "preload/link-header-preload-imagesrcset.html": [ - "b41cbee431f6aece23003276764212e737897082", + "3ae53fed66041957303991f082276b5c80788f83", "testharness" ], "preload/link-header-preload-imagesrcset.html.headers": [ @@ -499978,6 +500441,14 @@ "c2ca49341c5ec5d4d96d1541999893053146eecd", "reftest" ], + "svg/geometry/svg-baseval-in-display-none-expected.txt": [ + "df45422628dfd44cdf2d615de9916cba124ca7d5", + "support" + ], + "svg/geometry/svg-baseval-in-display-none.html": [ + "fa52d1b4c3f0918ee13127decf4b2e3d878bcf67", + "testharness" + ], "svg/geometry/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html": [ "8d5e2e982e82bd73e45cf86688e637a65f5d6535", "testharness" @@ -501827,7 +502298,7 @@ "support" ], "tools/manifest/manifest.py": [ - "b5ebeed6f225927c8b83c123f0cdde7302aa2807", + "616f95eb2c692dfa0f19eb3aaad0d6fccd36baf2", "support" ], "tools/manifest/sourcefile.py": [ @@ -505999,7 +506470,7 @@ "support" ], "tools/wpt/browser.py": [ - "1b883b93bbffc5e76cb59bed3b140cd25e020598", + "e2c9341bd6756d93f8698dff5bae46fcf8c1f138", "support" ], "tools/wpt/commands.json": [ @@ -506011,7 +506482,7 @@ "support" ], "tools/wpt/install.py": [ - "be6bf81598628282959f12379ca8f392fdfc7ea8", + "b107752d81b6fd6ae6bd70bc330e8575aa3d7822", "support" ], "tools/wpt/markdown.py": [ @@ -506027,7 +506498,7 @@ "support" ], "tools/wpt/run.py": [ - "0b306aee2554385e86c5ed042d030c3b2c3b78d0", + "07376797f589da8bd2a6c58708fa955a2702067f", "support" ], "tools/wpt/testfiles.py": [ @@ -509586,6 +510057,10 @@ "9845d5eaba384cced3c63ddbf4df1400b31f4994", "testharness" ], + "webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https.html": [ + "0fa3089a3405dc491e70a43e826d6ef9cacf9d56", + "testharness" + ], "webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-basic.html": [ "6ce7eb0c103f1d087d99ff6a995976e6ff8d594b", "testharness" @@ -509922,6 +510397,10 @@ "e9e130e37414191535c0296b0705f6d49d2f99ab", "support" ], + "webaudio/the-audio-api/the-audioworklet-interface/processors/input-count-processor.js": [ + "6d53ba84c7a79aeb699e83df4aab81816559ddb8", + "support" + ], "webaudio/the-audio-api/the-audioworklet-interface/processors/input-length-processor.js": [ "cc0968d738cf557874c4f89ac2f1857d608bf109", "support"
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html index 484af7c2..3d565e9 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html
@@ -19,33 +19,36 @@ <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="100" height="50"> +<p class="fallback">FAIL (fallback content)</p> +</canvas> <ul id="d"></ul> <script> var t = async_test("Testing actualBoundingBox"); -_addTest(function(canvas, ctx) { +_addTest(function (canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxLeft)", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('A').actualBoundingBoxRight >= 50, "ctx.measureText('A').actualBoundingBoxRight >= 50"); + _assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35"); + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0"); -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - ctx.baseline = 'alphabetic' - // Some platforms may return '-0'. - _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxLeft)", "0"); - // Different platforms may render text slightly different. - _assert(ctx.measureText('A').actualBoundingBoxRight >= 50, "ctx.measureText('A').actualBoundingBoxRight >= 50"); - _assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35"); - _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0"); - - _assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0"); - _assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200"); - _assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85"); - _assert(ctx.measureText('ABCD').actualBoundingBoxDescent >= 37, "ctx.measureText('ABCD').actualBoundingBoxDescent >= 37"); -}), 500); - - + _assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0"); + _assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200"); + _assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85"); + _assert(ctx.measureText('ABCD').actualBoundingBoxDescent >= 37, "ctx.measureText('ABCD').actualBoundingBoxDescent >= 37"); + }), 0); + }); }); </script> - +</body>> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html index ed8c04d..af33dfccb 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html
@@ -19,35 +19,38 @@ <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="100" height="50"> +<p class="fallback">FAIL (fallback content)</p> +</canvas> <ul id="d"></ul> <script> var t = async_test("Testing width advances"); -_addTest(function(canvas, ctx) { +_addTest(function (canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('Hello').advances[0]), 0, "Math.abs(ctx.measureText('Hello').advances[\"" + (0) + "\"])", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('Hello').advances[1] >= 36, "ctx.measureText('Hello').advances[\"" + (1) + "\"] >= 36"); + _assert(ctx.measureText('Hello').advances[2] >= 58, "ctx.measureText('Hello').advances[\"" + (2) + "\"] >= 58"); + _assert(ctx.measureText('Hello').advances[3] >= 70, "ctx.measureText('Hello').advances[\"" + (3) + "\"] >= 70"); + _assert(ctx.measureText('Hello').advances[4] >= 80, "ctx.measureText('Hello').advances[\"" + (4) + "\"] >= 80"); -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - // Some platforms may return '-0'. - _assertSame(Math.abs(ctx.measureText('Hello').advances[0]), 0, "Math.abs(ctx.measureText('Hello').advances[\""+(0)+"\"])", "0"); - // Different platforms may render text slightly different. - _assert(ctx.measureText('Hello').advances[1] >= 36, "ctx.measureText('Hello').advances[\""+(1)+"\"] >= 36"); - _assert(ctx.measureText('Hello').advances[2] >= 58, "ctx.measureText('Hello').advances[\""+(2)+"\"] >= 58"); - _assert(ctx.measureText('Hello').advances[3] >= 70, "ctx.measureText('Hello').advances[\""+(3)+"\"] >= 70"); - _assert(ctx.measureText('Hello').advances[4] >= 80, "ctx.measureText('Hello').advances[\""+(4)+"\"] >= 80"); - - var tm = ctx.measureText('Hello'); - _assertSame(ctx.measureText('Hello').advances[0], tm.advances[0], "ctx.measureText('Hello').advances[\""+(0)+"\"]", "tm.advances[\""+(0)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[1], tm.advances[1], "ctx.measureText('Hello').advances[\""+(1)+"\"]", "tm.advances[\""+(1)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[2], tm.advances[2], "ctx.measureText('Hello').advances[\""+(2)+"\"]", "tm.advances[\""+(2)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[3], tm.advances[3], "ctx.measureText('Hello').advances[\""+(3)+"\"]", "tm.advances[\""+(3)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[4], tm.advances[4], "ctx.measureText('Hello').advances[\""+(4)+"\"]", "tm.advances[\""+(4)+"\"]"); -}), 500); - - + var tm = ctx.measureText('Hello'); + _assertSame(ctx.measureText('Hello').advances[0], tm.advances[0], "ctx.measureText('Hello').advances[\"" + (0) + "\"]", "tm.advances[\"" + (0) + "\"]"); + _assertSame(ctx.measureText('Hello').advances[1], tm.advances[1], "ctx.measureText('Hello').advances[\"" + (1) + "\"]", "tm.advances[\"" + (1) + "\"]"); + _assertSame(ctx.measureText('Hello').advances[2], tm.advances[2], "ctx.measureText('Hello').advances[\"" + (2) + "\"]", "tm.advances[\"" + (2) + "\"]"); + _assertSame(ctx.measureText('Hello').advances[3], tm.advances[3], "ctx.measureText('Hello').advances[\"" + (3) + "\"]", "tm.advances[\"" + (3) + "\"]"); + _assertSame(ctx.measureText('Hello').advances[4], tm.advances[4], "ctx.measureText('Hello').advances[\"" + (4) + "\"]", "tm.advances[\"" + (4) + "\"]"); + }), 0); + }); }); </script> - +</body>> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html index 2472889..d1ab585 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html
@@ -19,28 +19,31 @@ <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="100" height="50"> +<p class="fallback">FAIL (fallback content)</p> +</canvas> <ul id="d"></ul> <script> var t = async_test("Testing baselines"); -_addTest(function(canvas, ctx) { +_addTest(function (canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(Math.abs(ctx.measureText('A').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('A').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('A').getBaselines().ideographic, -39, "ctx.measureText('A').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('A').getBaselines().hanging, 68, "ctx.measureText('A').getBaselines().hanging", "68"); -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - _assertSame(Math.abs(ctx.measureText('A').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('A').getBaselines().alphabetic)", "0"); - _assertSame(ctx.measureText('A').getBaselines().ideographic, -39, "ctx.measureText('A').getBaselines().ideographic", "-39"); - _assertSame(ctx.measureText('A').getBaselines().hanging, 68, "ctx.measureText('A').getBaselines().hanging", "68"); - - _assertSame(Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic)", "0"); - _assertSame(ctx.measureText('ABCD').getBaselines().ideographic, -39, "ctx.measureText('ABCD').getBaselines().ideographic", "-39"); - _assertSame(ctx.measureText('ABCD').getBaselines().hanging, 68, "ctx.measureText('ABCD').getBaselines().hanging", "68"); -}), 500); - - + _assertSame(Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('ABCD').getBaselines().ideographic, -39, "ctx.measureText('ABCD').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('ABCD').getBaselines().hanging, 68, "ctx.measureText('ABCD').getBaselines().hanging", "68"); + }), 0); + }); }); </script> - +</body>> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html index 36087e7..a12f719d 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html
@@ -24,23 +24,26 @@ <ul id="d"></ul> <script> var t = async_test("Testing emHeights"); + _addTest(function(canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + _assertSame(ctx.measureText('A').emHeightAscent, 37.5, "ctx.measureText('A').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('A').emHeightDescent, 12.5, "ctx.measureText('A').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent, 50, "ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent", "50"); -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - _assertSame(ctx.measureText('A').emHeightAscent, 37.5, "ctx.measureText('A').emHeightAscent", "37.5"); - _assertSame(ctx.measureText('A').emHeightDescent, 12.5, "ctx.measureText('A').emHeightDescent", "12.5"); - _assertSame(ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent, 50, "ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent", "50"); - - _assertSame(ctx.measureText('ABCD').emHeightAscent, 37.5, "ctx.measureText('ABCD').emHeightAscent", "37.5"); - _assertSame(ctx.measureText('ABCD').emHeightDescent, 12.5, "ctx.measureText('ABCD').emHeightDescent", "12.5"); - _assertSame(ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent, 50, "ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent", "50"); -}), 500); - - + _assertSame(ctx.measureText('ABCD').emHeightAscent, 37.5, "ctx.measureText('ABCD').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent, 12.5, "ctx.measureText('ABCD').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent, 50, "ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent", "50"); + }), 0); + }); }); </script> - +</body>>
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html index 1c9bfc49..f951040 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html
@@ -19,26 +19,30 @@ <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="100" height="50"> +<p class="fallback">FAIL (fallback content)</p> +</canvas> <ul id="d"></ul> <script> var t = async_test("Testing fontBoundingBox"); -_addTest(function(canvas, ctx) { +_addTest(function (canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + _assertSame(ctx.measureText('A').fontBoundingBoxAscent, 85, "ctx.measureText('A').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('A').fontBoundingBoxDescent, 39, "ctx.measureText('A').fontBoundingBoxDescent", "39"); -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - _assertSame(ctx.measureText('A').fontBoundingBoxAscent, 85, "ctx.measureText('A').fontBoundingBoxAscent", "85"); - _assertSame(ctx.measureText('A').fontBoundingBoxDescent, 39, "ctx.measureText('A').fontBoundingBoxDescent", "39"); - - _assertSame(ctx.measureText('ABCD').fontBoundingBoxAscent, 85, "ctx.measureText('ABCD').fontBoundingBoxAscent", "85"); - _assertSame(ctx.measureText('ABCD').fontBoundingBoxDescent, 39, "ctx.measureText('ABCD').fontBoundingBoxDescent", "39"); -}), 500); - - + _assertSame(ctx.measureText('ABCD').fontBoundingBoxAscent, 85, "ctx.measureText('ABCD').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('ABCD').fontBoundingBoxDescent, 39, "ctx.measureText('ABCD').fontBoundingBoxDescent", "39"); + }), 0); + }); }); </script> - +</body>> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html index 1cfe164..1808cfe 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html
@@ -19,25 +19,28 @@ <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="100" height="50"> +<p class="fallback">FAIL (fallback content)</p> +</canvas> <ul id="d"></ul> <script> var t = async_test(""); -_addTest(function(canvas, ctx) { +_addTest(function (canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); + _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); + _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); - _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); - _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); - - ctx.font = '100px CanvasTest'; - _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); -}), 500); - - -}); + ctx.font = '100px CanvasTest'; + _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); + }), 0); + }); +}) </script> - +</body>> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html index add8ce5b..b1dcad6 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html
@@ -19,20 +19,23 @@ <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> <p class="output">Actual output:</p> -<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> +<canvas id="c" class="output" width="100" height="50"> +<p class="fallback">FAIL (fallback content)</p> +</canvas> <ul id="d"></ul> <script> var t = async_test("The empty string has zero width"); -_addTest(function(canvas, ctx) { - -deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); -}), 500); - - +_addTest(function (canvas, ctx) { + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); + }), 0); + }); }); </script> - +</body>> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch.tentative.https.html b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch.tentative.https.html index 491ef3c..4b46610 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch.tentative.https.html
@@ -38,7 +38,7 @@ }, "Precondition: Test that the browser does not have client hints preferences cached"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) { return; } @@ -46,7 +46,7 @@ return; assert_equals(e.data, "PASS"); t.done(); - }) + })); }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish."); function acceptChLoaded() {
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime.tentative.https.html b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime.tentative.https.html index 0055b13..678f8ea 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime.tentative.https.html
@@ -38,7 +38,7 @@ }, "Precondition: Test that the browser does not have client hints preferences cached"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("expect_client_hints_headers.html")) { return; } @@ -46,7 +46,7 @@ return; assert_equals(e.data, "PASS"); t.done(); -}) + })); }, "Loading of resources/expect_client_hints_headers.html did not finish.");
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html index 8273ac78..2e81a16 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
@@ -40,7 +40,7 @@ }, "Precondition: Test that the browser does not have client hints preferences cached"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) { return; } @@ -48,7 +48,7 @@ return; assert_equals(e.data, "PASS"); t.done(); - }) + })); }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish."); function acceptChLifetimeLoaded() {
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_subresource.tentative.https.html b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_subresource.tentative.https.html index 4695135e..4b351d17 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_subresource.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/accept_ch_lifetime_subresource.tentative.https.html
@@ -56,7 +56,7 @@ }, "Test receiving Accept-CH-Lifetime header"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) { return; } @@ -64,7 +64,7 @@ return; assert_equals(e.data, "PASS"); t.done(); - }) + })); }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish."); </script>
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html b/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html index 73ca1fc..28bdeff 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html
@@ -38,7 +38,7 @@ }, "Precondition: Test that the browser does not have client hints preferences cached"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("expect_client_hints_headers.html")) { return; } @@ -46,7 +46,7 @@ return; assert_equals(e.data, "PASS"); t.done(); -}) + })); }, "Loading of resources/expect_client_hints_headers.html did not finish."); function acceptChLifetimeLoaded() {
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html b/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html index ab878f88..cf4f8afc 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
@@ -40,7 +40,7 @@ }, "Precondition: Test that the browser does not have client hints preferences cached"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) { return; } @@ -48,7 +48,7 @@ return; assert_equals(e.data, "PASS"); t.done(); - }) + })); }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish."); function acceptChLifetimeLoaded() {
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html b/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html index 0e56306..3be83cd 100644 --- a/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html
@@ -58,7 +58,7 @@ }, "Test receiving Accept-CH-Lifetime header"); async_test(t => { - window.addEventListener('message', function(e) { + window.addEventListener('message', t.step_func(function(e) { if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) { return; } @@ -66,7 +66,7 @@ return; assert_equals(e.data, "PASS"); t.done(); - }) + })); }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-004-ref.xht b/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-004-ref.xht index 223591e..14f8a5f 100644 --- a/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-004-ref.xht +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-004-ref.xht
@@ -3,6 +3,7 @@ <title>CSS Reftest Reference</title> <link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com"/> <meta name="flags" content="ahem"/> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"><![CDATA[ div { font: 24px/1em Ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-065.xht b/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-065.xht index b6798b1..230983d 100644 --- a/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-065.xht +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/text/letter-spacing-065.xht
@@ -8,6 +8,7 @@ <link rel="match" href="letter-spacing-004-ref.xht" /> <meta name="flags" content="ahem" /> <meta name="assert" content="The 'letter-spacing' property sets a zero length value in inches." /> + <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"> div {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html new file mode 100644 index 0000000..071db67 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Size containment on select</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> +<link rel="match" href="reference/contain-size-select-001-ref.html"> +<meta name=assert content="<select> elements with 'contain: size' should be treated as having no contents."> +<style> +select { + color: white; + background: white; + contain: size; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<select> + <option>AVeryLongOption</option> + <option>Another Option</option> +</select>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html new file mode 100644 index 0000000..960abc1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +select { + color: white; + background: white; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<select></select>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative-expected.txt new file mode 100644 index 0000000..fd8dcb11 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL Initial value of math-script-level assert_equals: expected "0" but got "" +FAIL Inherited values of math-script-level assert_equals: expected "11" but got "" +FAIL Specified math-script-level: auto assert_equals: expected "10" but got "" +FAIL Specified math-script-level: <integer> assert_equals: expected "11" but got "" +FAIL Specified math-script-level: add(<integer>) assert_equals: expected "15" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative.html new file mode 100644 index 0000000..8856b2b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-001.tentative.html
@@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="Check the resolved value of math-script-level"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + function mathScriptLevel(id) { + return window.getComputedStyle(document.getElementById(id)). + getPropertyValue("math-script-level"); + } + setup({ explicit_done: true }); + window.addEventListener("load", function() { + test(function() { + assert_equals(mathScriptLevel("initial"), "0"); + assert_equals(mathScriptLevel("initialFrom11"), "0"); + }, "Initial value of math-script-level"); + test(function() { + assert_equals(mathScriptLevel("inherited11"), "11"); + assert_equals(mathScriptLevel("inherited-7"), "-7"); + }, "Inherited values of math-script-level"); + test(function() { + assert_equals(mathScriptLevel("inherited9specifiedAutoInline"), "10"); + assert_equals(mathScriptLevel("inherited9specifiedAutoDisplay"), "9"); + }, "Specified math-script-level: auto"); + test(function() { + assert_equals(mathScriptLevel("specified11"), "11"); + assert_equals(mathScriptLevel("specified-7"), "-7"); + }, "Specified math-script-level: <integer>"); + test(function() { + assert_equals(mathScriptLevel("specifiedAdd10From5"), "15"); + assert_equals(mathScriptLevel("specifiedAdd-15From5"), "-10"); + }, "Specified math-script-level: add(<integer>)"); + done(); + }); + </script> + </head> + <body> + <div id="log"></div> + <div id="initial"></div> + <div id="specified11" style="math-script-level: 11"> + <div id="initialFrom11" style="math-script-level: initial"></div> + <div id="inherited11"></div> + </div> + <div id="specified-7" style="math-script-level: -7"> + <div id="inherited-7"></div> + </div> + <div style="math-script-level: 9"> + <div style="math-style: inline"> + <div id="inherited9specifiedAutoInline" style="math-script-level: auto" ></div> + </div> + <div style="math-style: display"> + <div id="inherited9specifiedAutoDisplay" style="math-script-level: auto" ></div> + </div> + </div> + <div style="math-script-level: 5"> + <div id="specifiedAdd10From5" style="math-script-level: add(10)"></div> + <div id="specifiedAdd-15From5" style="math-script-level: add(-15)"></div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative-expected.txt new file mode 100644 index 0000000..c2f5fb2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +FAIL auto assert_equals: expected 355 but got 500 +FAIL auto ; starting from level 7 assert_equals: expected 355 but got 500 +FAIL add(<integer>) assert_equals: expected 100 but got 71 +FAIL add(<integer>) ; starting from level 3 assert_equals: expected 100 but got 71 +FAIL <integer> assert_equals: expected 100 but got 71 +FAIL <integer> ; starting from level 50 assert_equals: expected 100 but got 71 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html new file mode 100644 index 0000000..d5982b9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html
@@ -0,0 +1,187 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="Verify effect of math-script-level auto | add(<integer>) | <integer>, starting from different values of math-script-level."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 20px/1 Ahem; + } + </style> + <script> + function fontSize(id) { + return parseFloat((/(.+)px/).exec(getComputedStyle(document.getElementById(id)).getPropertyValue("font-size"))[1]); + } + setup({ explicit_done: true }); + window.addEventListener("load", function() { + test(function() { + assert_equals(fontSize("autoDisplay"), 200); + assert_equals(fontSize("autoInline"), 355); + }, "auto"); + test(function() { + assert_equals(fontSize("autoDisplayFrom7"), 200); + assert_equals(fontSize("autoInlineFrom7"), 355); + }, "auto ; starting from level 7"); + test(function() { + assert_equals(fontSize("add0"), 200); + assert_equals(fontSize("add-1"), 100); + assert_equals(fontSize("add1"), 355); + assert_approx_equals(fontSize("add-2"), 397, 1); + assert_approx_equals(fontSize("add2"), 504, 1); + assert_approx_equals(fontSize("add-9"), 654, 1); + assert_approx_equals(fontSize("add9"), 92, 1); + }, "add(<integer>)"); + test(function() { + assert_equals(fontSize("add0from3"), 200); + assert_equals(fontSize("add-1from3"), 100); + assert_equals(fontSize("add1from3"), 355); + assert_approx_equals(fontSize("add-2from3"), 397, 1); + assert_approx_equals(fontSize("add2from3"), 504, 1); + assert_approx_equals(fontSize("add-9from3"), 654, 1); + assert_approx_equals(fontSize("add9from3"), 92, 1); + }, "add(<integer>) ; starting from level 3"); + test(function() { + assert_equals(fontSize("set0"), 200); + assert_equals(fontSize("set-1"), 100); + assert_equals(fontSize("set1"), 355); + assert_approx_equals(fontSize("set-2"), 397, 1); + assert_approx_equals(fontSize("set2"), 504, 1); + assert_approx_equals(fontSize("set-9"), 654, 1); + assert_approx_equals(fontSize("set9"), 92, 1); + }, "<integer>"); + test(function() { + assert_equals(fontSize("set50"), 200); + assert_equals(fontSize("set49"), 100); + assert_equals(fontSize("set51"), 355); + assert_approx_equals(fontSize("set48"), 397, 1); + assert_approx_equals(fontSize("set52"), 504, 1); + assert_approx_equals(fontSize("set41"), 654, 1); + assert_approx_equals(fontSize("set59"), 92, 1); + }, "<integer> ; starting from level 50"); + done(); + }); + </script> + </head> + <body> + <div id="log"></div> + <div> + <div class="container"> + <div> + <div style="font-size: 200px; math-style: display"> + <div id="autoDisplay" style="math-script-level: auto"></div> + </div> + <div style="font-size: 500px; math-style: inline"> + <div id="autoInline" style="math-script-level: auto"></div> + </div> + </div> + <div> + <div style="font-size: 200px; math-style: display; math-script-level: 7"> + <div id="autoDisplayFrom7" style="math-script-level: auto"></div> + </div> + <div style="font-size: 500px; math-style: inline; math-script-level: 7"> + <div id="autoInlineFrom7" style="math-script-level: auto"></div> + </div> + </div> + <div> + <div style="font-size: 200px"> + <div id="add0" style="math-script-level: add(0)"></div> + </div> + <div style="font-size: 71px"> + <div id="add-1" style="math-script-level: add(-1)"></div> + </div> + <div style="font-size: 500px"> + <div id="add1" style="math-script-level: add(1)"></div> + </div> + <div style="font-size: 200px"> + <div id="add-2" style="math-script-level: add(-2)"></div> + </div> + <div style="font-size: 1000px"> + <div id="add2" style="math-script-level: add(2)"></div> + </div> + <div style="font-size: 30px"> + <div id="add-9" style="math-script-level: add(-9)"></div> + </div> + <div style="font-size: 2000px"> + <div id="add9" style="math-script-level: add(9)"></div> + </div> + </div> + <div> + <div style="font-size: 200px; math-script-level: 3;"> + <div id="add0from3" style="math-script-level: add(0)"></div> + </div> + <div style="font-size: 71px; math-script-level: 3;"> + <div id="add-1from3" style="math-script-level: add(-1)"></div> + </div> + <div style="font-size: 500px; math-script-level: 3;"> + <div id="add1from3" style="math-script-level: add(1)"></div> + </div> + <div style="font-size: 200px; math-script-level: 3;"> + <div id="add-2from3" style="math-script-level: add(-2)"></div> + </div> + <div style="font-size: 1000px; math-script-level: 3;"> + <div id="add2from3" style="math-script-level: add(2)"></div> + </div> + <div style="font-size: 30px; math-script-level: 3;"> + <div id="add-9from3" style="math-script-level: add(-9)"></div> + </div> + <div style="font-size: 2000px; math-script-level: 3;"> + <div id="add9from3" style="math-script-level: add(9)"></div> + </div> + </div> + <div> + <div style="font-size: 200px"> + <div id="set0" style="math-script-level: 0"></div> + </div> + <div style="font-size: 71px"> + <div id="set-1" style="math-script-level: -1"></div> + </div> + <div style="font-size: 500px"> + <div id="set1" style="math-script-level: 1"></div> + </div> + <div style="font-size: 200px"> + <div id="set-2" style="math-script-level: -2"></div> + </div> + <div style="font-size: 1000px"> + <div id="set2" style="math-script-level: 2"></div> + </div> + <div style="font-size: 30px"> + <div id="set-9" style="math-script-level: -9"></div> + </div> + <div style="font-size: 2000px"> + <div id="set9" style="math-script-level: 9"></div> + </div> + </div> + </div> + <div> + <div style="font-size: 200px; math-script-level: 50"> + <div id="set50" style="math-script-level: 50"></div> + </div> + <div style="font-size: 71px; math-script-level: 50"> + <div id="set49" style="math-script-level: 49"></div> + </div> + <div style="font-size: 500px; math-script-level: 50"> + <div id="set51" style="math-script-level: 51"></div> + </div> + <div style="font-size: 200px; math-script-level: 50"> + <div id="set48" style="math-script-level: 48"></div> + </div> + <div style="font-size: 1000px; math-script-level: 50"> + <div id="set52" style="math-script-level: 52"></div> + </div> + <div style="font-size: 30px; math-script-level: 50"> + <div id="set41" style="math-script-level: 41"></div> + </div> + <div style="font-size: 2000px; math-script-level: 50"> + <div id="set59" style="math-script-level: 59"></div> + </div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html new file mode 100644 index 0000000..c29f6e1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see two squares of side 100px.</p> + <div class="container"> + <div>X</div> + </div> + <br/> + <div class="container"> + <div>X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html new file mode 100644 index 0000000..1eb1c020 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="If font-size is specified or if the specified value of math-script-level is initial then math-script-level does not affect the computed value of font-size."> + <link rel="match" href="math-script-level-003.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see two squares of side 100px.</p> + <div class="container" style="math-script-level: 3;"> + <div style="math-script-level: 9; font-size: 100px;">X</div> + </div> + <br/> + <div class="container" style="math-script-level: 3;"> + <div style="math-script-level: initial;">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative-expected.txt new file mode 100644 index 0000000..4fcec20b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +FAIL scriptPercentScaleDown=80, scriptScriptPercentScaleDown=40 assert_equals: expected "0" but got "" +FAIL scriptPercentScaleDown=0, scriptScriptPercentScaleDown=40 assert_equals: expected "0" but got "" +FAIL scriptPercentScaleDown=80, scriptScriptPercentScaleDown=0 assert_equals: expected "0" but got "" +FAIL No MATH table assert_equals: expected "0" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html new file mode 100644 index 0000000..496c0210 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html
@@ -0,0 +1,398 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="Check the resolved value of math-script-level"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <style> + @font-face { + font-family: scriptpercentscaledown80-scriptscriptpercentscaledown40; + src: url("/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown40.woff"); + } + @font-face { + font-family: scriptpercentscaledown0-scriptscriptpercentscaledown40; + src: url("/fonts/math/scriptpercentscaledown0-scriptscriptpercentscaledown40.woff"); + } + @font-face { + font-family: scriptpercentscaledown80-scriptscriptpercentscaledown0; + src: url("/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown0.woff"); + } + #scale80-40-scaledown, #scale80-40-scaleup { + font-family: scriptpercentscaledown80-scriptscriptpercentscaledown40; + } + #scale0-40-scaledown, #scale0-40-scaleup { + font-family: scriptpercentscaledown0-scriptscriptpercentscaledown40; + } + #scale80-0-scaledown, #scale80-0-scaleup { + font-family: scriptpercentscaledown80-scriptscriptpercentscaledown0; + } + #default-scaledown, #default-scaleup { + /* Ahem font does not have any MATH table, so uses default scale. */ + font-family: Ahem; + } + .big { font-size: 3000px; } + .small { font-size: 150px; } + .level-3 { math-script-level: -3; } + .level-1 { math-script-level: -1; } + .level0 { math-script-level: 0; } + .level1 { math-script-level: 1; } + .level2 { math-script-level: 2; } + .level3 { math-script-level: 3; } + .level5 { math-script-level: 5; } + </style> + <script> + const big = 2000; + const small = 150; + setup({ explicit_done: true }); + window.addEventListener("load", function() { + // Delay the check to workaround WebKit's bug https://webkit.org/b/174030. + requestAnimationFrame(() => { document.fonts.ready.then(runTests); }); + }); + function mathScriptLevel(element) { + return window.getComputedStyle(element). + getPropertyValue("math-script-level"); + } + function fontSize(element) { + return parseFloat((/(.+)px/).exec(getComputedStyle(element). + getPropertyValue("font-size"))[1]); + } + function CheckFontSizes(id, sizes) { + var container = document.getElementById(id); + for (var level in sizes) { + var divs = container.getElementsByClassName(`level${level}`); + for (var i = 0; i < divs.length; i++) { + assert_equals(mathScriptLevel(divs[i]), level); + assert_approx_equals(fontSize(divs[i]), sizes[level], 1, `Wrong font-size (id=${id} ; level=${level} ; i=${i})`); + } + } + } + function runTests() { + + test(function() { + CheckFontSizes("scale80-40-scaledown", { + "-3": big, + "-1": big * .71 * .71, + "0": big * .71 * .71 * .71, + "1": big * .71 * .71 * .71 * .8, + "2": big * .71 * .71 * .71 * .4, + "3": big * .71 * .71 * .71 * .4 * .71, + "5": big * .71 * .71 * .71 * .4 * .71 * .71 * .71 + }); + CheckFontSizes("scale80-40-scaleup", { + "5": small, + "3": small / (.71 * .71), + "2": small / (.71 * .71 * .71), + "1": small / (.71 * .71 * .71 * (.4 / .8)), + "0": small / (.71 * .71 * .71 * .4), + "-1": small / (.71 * .71 * .71 * .4 * .71), + "-3": small / (.71 * .71 * .71 * .4 * .71 * .71 * .71) + }); + }, "scriptPercentScaleDown=80, scriptScriptPercentScaleDown=40"); + + test(function() { + CheckFontSizes("scale0-40-scaledown", { + "-3": big, + "-1": big * .71 * .71, + "0": big * .71 * .71 * .71, + "1": big * .71 * .71 * .71 * .71, + "2": big * .71 * .71 * .71 * .4, + "3": big * .71 * .71 * .71 * .4 * .71, + "5": big * .71 * .71 * .71 * .4 * .71 * .71 * .71 + }); + CheckFontSizes("scale0-40-scaleup", { + "5": small, + "3": small / (.71 * .71), + "2": small / (.71 * .71 * .71), + "1": small / (.71 * .71 * .71 * (.4 / .71)), + "0": small / (.71 * .71 * .71 * .4), + "-1": small / (.71 * .71 * .71 * .4 * .71), + "-3": small / (.71 * .71 * .71 * .4 * .71 * .71 * .71) + }); + }, "scriptPercentScaleDown=0, scriptScriptPercentScaleDown=40"); + + test(function() { + CheckFontSizes("scale80-0-scaledown", { + "-3": big, + "-1": big * .71 * .71, + "0": big * .71 * .71 * .71, + "1": big * .71 * .71 * .71 * .8, + "2": big * .71 * .71 * .71 * .71 * .71, + "3": big * .71 * .71 * .71 * .71 * .71 * .71, + "5": big * .71 * .71 * .71 * .71 * .71 * .71 * .71 * .71 + }); + CheckFontSizes("scale80-0-scaleup", { + "5": small, + "3": small / (.71 * .71), + "2": small / (.71 * .71 * .71), + "1": small / (.71 * .71 * .71 * (.71 / .8)), + "0": small / (.71 * .71 * .71 * .71), + "-1": small / (.71 * .71 * .71 * .71 * .71), + "-3": small / (.71 * .71 * .71 * .71 * .71 * .71 * .71) + }); + }, "scriptPercentScaleDown=80, scriptScriptPercentScaleDown=0"); + + test(function() { + CheckFontSizes("default-scaledown", { + "-3": big, + "-1": big * .71 * .71, + "0": big * .71 * .71 * .71, + "1": big * .71 * .71 * .71 * .71, + "2": big * .71 * .71 * .71 * .71 * .71, + "3": big * .71 * .71 * .71 * .71 * .71 * .71, + "5": big * .71 * .71 * .71 * .71 * .71 * .71 * .71 * .71 + }); + CheckFontSizes("default-scaleup", { + "5": small, + "3": small / (.71 * .71), + "2": small / (.71 * .71 * .71), + "1": small / (.71 * .71 * .71 * .71), + "0": small / (.71 * .71 * .71 * .71 * .71), + "-1": small / (.71 * .71 * .71 * .71 * .71 * .71), + "-3": small / (.71 * .71 * .71 * .71 * .71 * .71 * .71 * .71) + }); + }, "No MATH table"); + + done(); + } + </script> + </head> + <body> + <div id="log"></div> + + <div class="level-3 big" id="scale80-40-scaledown"> + <div class="level5"><!-- -3 to 5 --></div> + <div class="level3"><!-- -3 to 3 --></div> + <div class="level2"><!-- -3 to 2 --></div> + <div class="level1"><!-- -3 to 1 --></div> + <div class="level0"><!-- -3 to 0 --></div> + <div class="level-1"><!-- -3 to -1 --> + <div class="level5"><!-- -1 to 5 --></div> + <div class="level3"><!-- -1 to 3 --></div> + <div class="level2"><!-- -1 to 2 --></div> + <div class="level1"><!-- -1 to 1 --></div> + <div class="level0"><!-- -1 to 0 --> + <div class="level5"><!-- 0 to 5 --></div> + <div class="level3"><!-- 0 to 3 --></div> + <div class="level2"><!-- 0 to 2 --></div> + <div class="level1"><!-- 0 to 1 --> + <div class="level5"><!-- 1 to 5 --></div> + <div class="level3"><!-- 1 to 3 --></div> + <div class="level2"><!-- 1 to 2 --> + <div class="level5"><!-- 2 to 5 --></div> + <div class="level3"><!-- 2 to 3 --> + <div class="level5"><!-- 3 to 5 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level5 small" id="scale80-40-scaleup"> + <div class="level-3"><!-- 5 to -3 --></div> + <div class="level-1"><!-- 5 to -1 --></div> + <div class="level0"><!-- 5 to 0 --></div> + <div class="level1"><!-- 5 to 1 --></div> + <div class="level2"><!-- 5 to 2 --></div> + <div class="level3"><!-- 5 to 3 --> + <div class="level-3"><!-- 3 to -3 --></div> + <div class="level-1"><!-- 3 to -1 --></div> + <div class="level0"><!-- 3 to 0 --></div> + <div class="level1"><!-- 3 to 1 --></div> + <div class="level2"><!-- 3 to 2 --> + <div class="level-3"><!-- 2 to -3 --></div> + <div class="level-1"><!-- 2 to -1 --></div> + <div class="level0"><!-- 2 to 0 --></div> + <div class="level1"><!-- 2 to 1 --> + <div class="level-3"><!-- 1 to -3 --></div> + <div class="level-1"><!-- 1 to -1 --></div> + <div class="level0"><!-- 1 to 0 --> + <div class="level-3"><!-- 0 to -3 --></div> + <div class="level-1"><!-- 0 to -1 --> + <div class="level-3"><!-- -1 to -3 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level-3 big" id="scale0-40-scaledown"> + <div class="level5"><!-- -3 to 5 --></div> + <div class="level3"><!-- -3 to 3 --></div> + <div class="level2"><!-- -3 to 2 --></div> + <div class="level1"><!-- -3 to 1 --></div> + <div class="level0"><!-- -3 to 0 --></div> + <div class="level-1"><!-- -3 to -1 --> + <div class="level5"><!-- -1 to 5 --></div> + <div class="level3"><!-- -1 to 3 --></div> + <div class="level2"><!-- -1 to 2 --></div> + <div class="level1"><!-- -1 to 1 --></div> + <div class="level0"><!-- -1 to 0 --> + <div class="level5"><!-- 0 to 5 --></div> + <div class="level3"><!-- 0 to 3 --></div> + <div class="level2"><!-- 0 to 2 --></div> + <div class="level1"><!-- 0 to 1 --> + <div class="level5"><!-- 1 to 5 --></div> + <div class="level3"><!-- 1 to 3 --></div> + <div class="level2"><!-- 1 to 2 --> + <div class="level5"><!-- 2 to 5 --></div> + <div class="level3"><!-- 2 to 3 --> + <div class="level5"><!-- 3 to 5 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level5 small" id="scale0-40-scaleup"> + <div class="level-3"><!-- 5 to -3 --></div> + <div class="level-1"><!-- 5 to -1 --></div> + <div class="level0"><!-- 5 to 0 --></div> + <div class="level1"><!-- 5 to 1 --></div> + <div class="level2"><!-- 5 to 2 --></div> + <div class="level3"><!-- 5 to 3 --> + <div class="level-3"><!-- 3 to -3 --></div> + <div class="level-1"><!-- 3 to -1 --></div> + <div class="level0"><!-- 3 to 0 --></div> + <div class="level1"><!-- 3 to 1 --></div> + <div class="level2"><!-- 3 to 2 --> + <div class="level-3"><!-- 2 to -3 --></div> + <div class="level-1"><!-- 2 to -1 --></div> + <div class="level0"><!-- 2 to 0 --></div> + <div class="level1"><!-- 2 to 1 --> + <div class="level-3"><!-- 1 to -3 --></div> + <div class="level-1"><!-- 1 to -1 --></div> + <div class="level0"><!-- 1 to 0 --> + <div class="level-3"><!-- 0 to -3 --></div> + <div class="level-1"><!-- 0 to -1 --> + <div class="level-3"><!-- -1 to -3 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level-3 big" id="scale80-0-scaledown"> + <div class="level5"><!-- -3 to 5 --></div> + <div class="level3"><!-- -3 to 3 --></div> + <div class="level2"><!-- -3 to 2 --></div> + <div class="level1"><!-- -3 to 1 --></div> + <div class="level0"><!-- -3 to 0 --></div> + <div class="level-1"><!-- -3 to -1 --> + <div class="level5"><!-- -1 to 5 --></div> + <div class="level3"><!-- -1 to 3 --></div> + <div class="level2"><!-- -1 to 2 --></div> + <div class="level1"><!-- -1 to 1 --></div> + <div class="level0"><!-- -1 to 0 --> + <div class="level5"><!-- 0 to 5 --></div> + <div class="level3"><!-- 0 to 3 --></div> + <div class="level2"><!-- 0 to 2 --></div> + <div class="level1"><!-- 0 to 1 --> + <div class="level5"><!-- 1 to 5 --></div> + <div class="level3"><!-- 1 to 3 --></div> + <div class="level2"><!-- 1 to 2 --> + <div class="level5"><!-- 2 to 5 --></div> + <div class="level3"><!-- 2 to 3 --> + <div class="level5"><!-- 3 to 5 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level5 small" id="scale80-0-scaleup"> + <div class="level-3"><!-- 5 to -3 --></div> + <div class="level-1"><!-- 5 to -1 --></div> + <div class="level0"><!-- 5 to 0 --></div> + <div class="level1"><!-- 5 to 1 --></div> + <div class="level2"><!-- 5 to 2 --></div> + <div class="level3"><!-- 5 to 3 --> + <div class="level-3"><!-- 3 to -3 --></div> + <div class="level-1"><!-- 3 to -1 --></div> + <div class="level0"><!-- 3 to 0 --></div> + <div class="level1"><!-- 3 to 1 --></div> + <div class="level2"><!-- 3 to 2 --> + <div class="level-3"><!-- 2 to -3 --></div> + <div class="level-1"><!-- 2 to -1 --></div> + <div class="level0"><!-- 2 to 0 --></div> + <div class="level1"><!-- 2 to 1 --> + <div class="level-3"><!-- 1 to -3 --></div> + <div class="level-1"><!-- 1 to -1 --></div> + <div class="level0"><!-- 1 to 0 --> + <div class="level-3"><!-- 0 to -3 --></div> + <div class="level-1"><!-- 0 to -1 --> + <div class="level-3"><!-- -1 to -3 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level-3 big" id="default-scaledown"> + <div class="level5"><!-- -3 to 5 --></div> + <div class="level3"><!-- -3 to 3 --></div> + <div class="level2"><!-- -3 to 2 --></div> + <div class="level1"><!-- -3 to 1 --></div> + <div class="level0"><!-- -3 to 0 --></div> + <div class="level-1"><!-- -3 to -1 --> + <div class="level5"><!-- -1 to 5 --></div> + <div class="level3"><!-- -1 to 3 --></div> + <div class="level2"><!-- -1 to 2 --></div> + <div class="level1"><!-- -1 to 1 --></div> + <div class="level0"><!-- -1 to 0 --> + <div class="level5"><!-- 0 to 5 --></div> + <div class="level3"><!-- 0 to 3 --></div> + <div class="level2"><!-- 0 to 2 --></div> + <div class="level1"><!-- 0 to 1 --> + <div class="level5"><!-- 1 to 5 --></div> + <div class="level3"><!-- 1 to 3 --></div> + <div class="level2"><!-- 1 to 2 --> + <div class="level5"><!-- 2 to 5 --></div> + <div class="level3"><!-- 2 to 3 --> + <div class="level5"><!-- 3 to 5 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="level5 small" id="default-scaleup"> + <div class="level-3"><!-- 5 to -3 --></div> + <div class="level-1"><!-- 5 to -1 --></div> + <div class="level0"><!-- 5 to 0 --></div> + <div class="level1"><!-- 5 to 1 --></div> + <div class="level2"><!-- 5 to 2 --></div> + <div class="level3"><!-- 5 to 3 --> + <div class="level-3"><!-- 3 to -3 --></div> + <div class="level-1"><!-- 3 to -1 --></div> + <div class="level0"><!-- 3 to 0 --></div> + <div class="level1"><!-- 3 to 1 --></div> + <div class="level2"><!-- 3 to 2 --> + <div class="level-3"><!-- 2 to -3 --></div> + <div class="level-1"><!-- 2 to -1 --></div> + <div class="level0"><!-- 2 to 0 --></div> + <div class="level1"><!-- 2 to 1 --> + <div class="level-3"><!-- 1 to -3 --></div> + <div class="level-1"><!-- 1 to -1 --></div> + <div class="level0"><!-- 1 to 0 --> + <div class="level-3"><!-- 0 to -3 --></div> + <div class="level-1"><!-- 0 to -1 --> + <div class="level-3"><!-- -1 to -3 --></div> + </div> + </div> + </div> + </div> + </div> + </div> + + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative-ref.html new file mode 100644 index 0000000..f053869 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative-ref.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + </head> + </head> + <body> + <p>Test passes if you see two lines of monospace text rendered with the same font-size:</p> + <div style="font-size: xx-large; font-family: serif"> + <div style="font-family: monospace;"> + <div>level 0</div> + </div> + <div style="font-family: monospace;"> + <div>level 1</div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative.html new file mode 100644 index 0000000..7f289ff --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-005.tentative.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3906"> + <meta name="assert" content="If the computed font-size is changed because of font-family change, math-script-level does not affect the computed value of font-size."> + <link rel="match" href="math-script-level-005.tentative-ref.html"> + </head> + </head> + <body> + <p>Test passes if you see two lines of monospace text rendered with the same font-size:</p> + <div style="font-size: xx-large; font-family: serif"> + <div style="font-family: monospace;"> + <div>level 0</div> + </div> + <div style="math-script-level: 1; font-family: monospace;"> + <div>level 1</div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html new file mode 100644 index 0000000..8b09510 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 100 × 0.71^(0 − 0) = 100px.</p> + <div class="container"> + <div style="font-size: 100px">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html new file mode 100644 index 0000000..7af9056 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="If math-script-level is 'auto' and the inherited value of math-style is 'display' then the computed value of math-script-level is the inherited value."> + <link rel="match" href="math-script-level-auto-and-math-style-001.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 100 × 0.71^(0 − 0) = 100px.</p> + <div class="container" style="math-style: display;"> + <div style="math-script-level: auto">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html new file mode 100644 index 0000000..6f8786f9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 500px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 500 × 0.71^(1 − 0) = 355px.</p> + <div class="container"> + <div style="font-size: 355px">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html new file mode 100644 index 0000000..443c0a74 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="If math-script-level is 'auto' and the inherited value of math-style is 'inline' then the computed value of math-script-level is the inherited value plus one."> + <link rel="match" href="math-script-level-auto-and-math-style-002.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 500px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 500 × 0.71^(1 − 0) = 355px.</p> + <div class="container" style="math-style: inline;"> + <div style="math-script-level: auto">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html new file mode 100644 index 0000000..6f8786f9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 500px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 500 × 0.71^(1 − 0) = 355px.</p> + <div class="container"> + <div style="font-size: 355px">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html new file mode 100644 index 0000000..6722cb36 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="Initial value of math-style is 'inline'"> + <link rel="match" href="math-script-level-auto-and-math-style-003.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 500px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 500 × 0.71^(1 − 0) = 355px.</p> + <div class="container"> + <div style="math-script-level: auto">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html new file mode 100644 index 0000000..e98e7c6d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 500px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 500 × 0.71^(1 − 0) = 355px.</p> + <div class="container"> + <div> + <div> + <div style="font-size: 355px">X</div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html new file mode 100644 index 0000000..7d34116 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="Initial value of math-style is 'inline'"> + <link rel="match" href="math-script-level-auto-and-math-style-004.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 500px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 500 × 0.71^(1 − 0) = 355px.</p> + <div class="container"> + <div style="math-style: display"> + <div style="math-style: initial"> + <div style="math-script-level: auto">X</div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html new file mode 100644 index 0000000..ef5d4c0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 100 × 0.71^(0 − 0) = 100px.</p> + <div class="container"> + <div> + <div> + <div> + <div style="font-size: 100px">X</div> + </div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html new file mode 100644 index 0000000..ce49664 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level: auto and math-style</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="math-style is inherited"> + <link rel="match" href="math-script-level-auto-and-math-style-005.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 100 × 0.71^(0 − 0) = 100px.</p> + <div class="container"> + <div style="math-style: display;"> + <div> + <div> + <div style="math-script-level: auto">X</div> + </div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html new file mode 100644 index 0000000..26d76a1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-max-size (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 355px.</p> + <div class="container"> + <div style="font-size: 355px">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html new file mode 100644 index 0000000..151e155 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-max-size</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="The clamping of font-size implied by font-min-size and font-max-size must apply after the change due to math-script-level."> + <link rel="match" href="math-script-level-font-size-clamping-001.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 355px.</p> + <div class="container" style="font-size: 500px"> + <div style="math-script-level: add(1); font-max-size: 480px">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative-ref.html new file mode 100644 index 0000000..4f695e0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative-ref.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-min-size (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 520px.</p> + <div class="container"> + <div style="font-size: 520px">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html new file mode 100644 index 0000000..3c5416a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-002.tentative.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level ; font-min-size</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="The clamping of font-size implied by font-min-size and font-max-size must apply after the change due to math-script-level."> + <link rel="match" href="math-script-level-font-size-clamping-002.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 520px.</p> + <div class="container" style="font-size: 500px"> + <div style="math-script-level: add(1); font-min-size: 520px;">X</div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative-ref.html new file mode 100644 index 0000000..d13d90c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative-ref.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-max-size (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 71px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 71px.</p> + <div class="container"> + <div> + <div> + <div>X</div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative.html new file mode 100644 index 0000000..abca248 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-003.tentative.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-max-size</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3739"> + <meta name="assert" content="font-max-size only affects the used size."> + <link rel="match" href="math-script-level-font-size-clamping-003.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 71px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 71px.</p> + <div class="container"><!-- Initial size is 71px. --> + <div style="math-script-level: add(-1);"><!-- Size is 71/.71 = 100px. --> + <div style="font-max-size: 90px"><!-- This only affects used size. --> + <div style="math-script-level: add(1);">X</div><!-- back to 71px. --> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative-ref.html new file mode 100644 index 0000000..de0dab2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative-ref.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-min-size (reference)</title> + <meta charset="utf-8"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 100px.</p> + <div class="container"> + <div> + <div> + <div>X</div> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative.html new file mode 100644 index 0000000..350f086c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-004.tentative.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-script-level and font-min-size</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3739"> + <meta name="assert" content="font-min-size only affects the used size."> + <link rel="match" href="math-script-level-font-size-clamping-004.tentative-ref.html"> + <style> + .container { + /* Ahem font does not have a MATH table so the font-size scale factor + is always 0.71^{computed - inherited math script level} */ + font: 100px/1 Ahem; + } + </style> + </head> + <body> + <p>Test passes if you see a square of side 100px.</p> + <div class="container"><!-- Initial size is 100px. --> + <div style="math-script-level: add(1);"><!-- Size is 100*.71 = 71px. --> + <div style="font-min-size: 90px"><!-- This only affects used size. --> + <div style="math-script-level: add(-1);">X</div><!-- back to 100px. --> + </div> + </div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html new file mode 100644 index 0000000..6df3517 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> + <head> + <title>math-style</title> + <meta charset="utf-8"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746"> + <meta name="assert" content="Check the resolved value of math-style"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + function mathStyle(id) { + return window.getComputedStyle(document.getElementById(id)). + getPropertyValue("math-style"); + } + setup({ explicit_done: true }); + window.addEventListener("load", function() { + test(function() { + assert_equals(mathStyle("initial"), "inline"); + }, "Initial value of math-style"); + test(function() { + assert_equals(mathStyle("specifiedInline"), "inline"); + assert_equals(mathStyle("specifiedDisplay"), "display"); + }, "Specified values of math-style"); + test(function() { + assert_equals(mathStyle("inheritedInline"), "inline"); + assert_equals(mathStyle("inheritedDisplay"), "display"); + }, "Inherited values of math-style"); + done(); + }); + </script> + </head> + <body> + <div id="log"></div> + <div id="initial"></div> + <div id="specifiedInline" style="math-style: inline"> + <div id="inheritedInline"></div> + </div> + <div id="specifiedDisplay" style="math-style: display"> + <div id="inheritedDisplay"></div> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-flexible-lengths-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-flexible-lengths-001.html index 65ddb8ab..3a2c9423 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-flexible-lengths-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-flexible-lengths-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .inline-grid { display: inline-grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "1fr", "1fr", "800px", "600px"); TestingUtils.testGridTemplateColumnsRows("grid", "1fr", "1fr", "800px", "600px"); @@ -97,4 +100,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "(1fr) auto", "(1fr) auto", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "minmax(1fr, 1000px)", "minmax(1fr, 700px)", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "minmax(1fr, 1000px)", "minmax(1fr, 700px)", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-grid-template-columns-rows-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-grid-template-columns-rows-001.html index 5a20c01..32733e23 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-grid-template-columns-rows-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-grid-template-columns-rows-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .inline-grid { display: inline-grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Single values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "none", "none", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "none", "none", "90px", "10px"); @@ -81,4 +84,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "100px, 200px", "300px, 400px", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "minmax(100px, 200px, 300px)", "minmax(100px, 200px, 300px)", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "minmax(100px, 200px, 300px)", "minmax(100px, 200px, 300px)", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-named-grid-lines-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-named-grid-lines-001.html index 3763315..fc4caf28 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-named-grid-lines-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-named-grid-lines-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .inline-grid { display: inline-grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "[first] auto [last]", "[first] auto [last]", "[first] 0px [last]", "[first] 0px [last]"); TestingUtils.testGridTemplateColumnsRows("grid", "[first] auto [last]", "[first] auto [last]", "[first] 90px [last]", "[first] 10px [last]"); @@ -115,4 +118,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "[inherit] auto", "[inherit] auto", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "[default] auto", "[default] auto", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "[default] auto", "[default] auto", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-repeat-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-repeat-001.html index 77afdf46..68ca0bd 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-repeat-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-support-repeat-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .inline-grid { display: inline-grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "repeat(1, auto)", "repeat(1, auto)", "0px", "0px"); TestingUtils.testGridTemplateColumnsRows("grid", "repeat(1, auto)", "repeat(1, auto)", "90px", "10px"); @@ -75,4 +78,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "repeat(2, 50px repeat(2, 100px))", "repeat(2, 50px repeat(2, 100px))", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "100px repeat(2, [a])", "100px repeat(2, [a])", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "100px repeat(2, [a])", "100px repeat(2, [a])", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html index 60badb4..ff1f814 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .inline-grid { display: inline-grid; @@ -57,6 +58,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("grid", "", "", "110px", ["10px 10px 20px", "repeat(2, 10px) 20px"]); TestingUtils.testGridTemplateColumnsRows("grid", "auto auto", "", "100px 110px", "10px 20px"); @@ -99,4 +102,6 @@ TestingUtils.testGridTemplateColumnsRows("gridAutoFlowColumnItemsPositions", "60px", "60px 70px", ["60px 50px 0px 0px 100px", "60px 50px repeat(2, 0px) 100px"], "60px 70px 0px 20px"); TestingUtils.testGridTemplateColumnsRows("gridAutoFlowColumnItemsPositions", "60px 70px", "60px", ["60px 70px 0px 0px 100px", "60px 70px repeat(2, 0px) 100px"], ["60px 0px 0px 20px", "60px repeat(2, 0px) 20px"]); TestingUtils.testGridTemplateColumnsRows("gridAutoFlowColumnItemsPositions", "60px 70px", "60px 70px", ["60px 70px 0px 0px 100px", "60px 70px repeat(2, 0px) 100px"], "60px 70px 0px 20px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-flexible-lengths-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-flexible-lengths-001.html index 7c4e1c6..0dae45b 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-flexible-lengths-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-flexible-lengths-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .grid { display: grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "1fr", "1fr", "800px", "600px"); TestingUtils.testGridTemplateColumnsRows("grid", "1fr", "1fr", "800px", "600px"); @@ -97,4 +100,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "(1fr) auto", "(1fr) auto", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "minmax(1fr, 1000px)", "minmax(1fr, 700px)", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "minmax(1fr, 1000px)", "minmax(1fr, 700px)", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-grid-template-columns-rows-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-grid-template-columns-rows-001.html index a1c21a7b..bf818cd 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-grid-template-columns-rows-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-grid-template-columns-rows-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .grid { display: grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Single values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "none", "none", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "none", "none", "90px", "10px"); @@ -81,4 +84,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "100px, 200px", "300px, 400px", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "minmax(100px, 200px, 300px)", "minmax(100px, 200px, 300px)", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "minmax(100px, 200px, 300px)", "minmax(100px, 200px, 300px)", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-named-grid-lines-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-named-grid-lines-001.html index f51b924..bff5e81 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-named-grid-lines-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-named-grid-lines-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .grid { display: grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "[first] auto [last]", "[first] auto [last]", "[first] 0px [last]", "[first] 0px [last]"); TestingUtils.testGridTemplateColumnsRows("grid", "[first] auto [last]", "[first] auto [last]", "[first] 90px [last]", "[first] 10px [last]"); @@ -115,4 +118,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "[inherit] auto", "[inherit] auto", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "[default] auto", "[default] auto", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "[default] auto", "[default] auto", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-repeat-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-repeat-001.html index 28415ab..78a44e28 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-repeat-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-support-repeat-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .grid { display: grid; @@ -26,6 +27,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("emptyGrid", "repeat(1, auto)", "repeat(1, auto)", "0px", "0px"); TestingUtils.testGridTemplateColumnsRows("grid", "repeat(1, auto)", "repeat(1, auto)", "90px", "10px"); @@ -75,4 +78,6 @@ TestingUtils.testGridTemplateColumnsRows("grid", "repeat(2, 50px repeat(2, 100px))", "repeat(2, 50px repeat(2, 100px))", "90px", "10px"); TestingUtils.testGridTemplateColumnsRows("emptyGrid", "100px repeat(2, [a])", "100px repeat(2, [a])", "none", "none"); TestingUtils.testGridTemplateColumnsRows("grid", "100px repeat(2, [a])", "100px repeat(2, [a])", "90px", "10px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html index 89bdce4..c992bf66 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html
@@ -8,6 +8,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/testing-utils.js"></script> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> .grid { display: grid; @@ -57,6 +58,8 @@ </div> <script> +setup({explicit_done: true}); +document.fonts.ready.then(()=> { // Valid values. TestingUtils.testGridTemplateColumnsRows("grid", "", "", "110px", ["10px 10px 20px", "repeat(2, 10px) 20px"]); TestingUtils.testGridTemplateColumnsRows("grid", "auto auto", "", "100px 110px", "10px 20px"); @@ -99,4 +102,6 @@ TestingUtils.testGridTemplateColumnsRows("gridAutoFlowColumnItemsPositions", "60px", "60px 70px", ["60px 50px 0px 0px 100px", "60px 50px repeat(2, 0px) 100px"], "60px 70px 0px 20px"); TestingUtils.testGridTemplateColumnsRows("gridAutoFlowColumnItemsPositions", "60px 70px", "60px", ["60px 70px 0px 0px 100px", "60px 70px repeat(2, 0px) 100px"], ["60px 0px 0px 20px", "60px repeat(2, 0px) 20px"]); TestingUtils.testGridTemplateColumnsRows("gridAutoFlowColumnItemsPositions", "60px 70px", "60px 70px", ["60px 70px 0px 0px 100px", "60px 70px repeat(2, 0px) 100px"], "60px 70px 0px 20px"); + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018-expected.txt new file mode 100644 index 0000000..50c5fb4c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL CSS Test: shape-margin offset from a polygonal shape-outside assert_approx_equals: Line 0 is positioned properly expected 48 +/- 2 but got 180 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018.html index b95cfd1c..058e579 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/spec-examples/shape-outside-018.html
@@ -11,6 +11,7 @@ defined on a polygonal shape-outside."/> <!-- This test is derived from Example 10 in this version of the spec: http://www.w3.org/TR/2014/WD-css-shapes-1-20140211/ --> + <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"> #test { position: relative; @@ -38,12 +39,14 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/spec-example-utils.js"></script> <script> - function checkFloats() { + setup({explicit_done: true}); + document.fonts.ready.then(()=> { approxShapeTest('test', 'line-', 2, [48, 88, 128, 168, 180, 0]); - } + done(); + }); </script> </head> -<body onload="checkFloats();"> +<body> <p> The test passes if the longest green horizontal bar is beneath the triangle and the rest of them are to its right and none intersect it. There should be no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/absolute_length_units.html b/third_party/blink/web_tests/external/wpt/css/css-values/absolute_length_units.html index b0e5178b..7528bbb 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-values/absolute_length_units.html +++ b/third_party/blink/web_tests/external/wpt/css/css-values/absolute_length_units.html
@@ -3,40 +3,39 @@ <!-- Submitted from TestTWF Paris --> <head> - <title>CSS Values and Units Test: elements should be the real world size given in mm, cm, inches...</title> - <meta name="assert" content="elements are not displayed with the real world size units they should be, when specified in millimeters, centimeters, inches, ..."> - <link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com"> - <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths" title="5.1.2. Viewport-percentage lengths: the 'vw', 'vh', 'vmin', 'vmax' units"> + <meta charset="UTF-8"> - <style type="text/css"> + <title>CSS Values and Units Test: elements should be the real world size given in mm, cm, inches...</title> + <link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com"> + <link rel="help" href="https://www.w3.org/TR/css3-values/#absolute-lengths" title="5.2 Absolute lengths: the cm, mm, Q, in, pt, pc, px units"> - * { margin: 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 13px; } + <style type="text/css"> - .s1mm { background: #F00; width: 1mm; height: 1mm; } - .s10mm { background: #66F; width: 10mm; height: 10mm; } - .s1cm { background: #E90; width: 1cm; height: 1cm; } - .s254cm { background: #D0D; width: 2.54cm; height: 2.54cm; } - .s1in { background: #00F; width: 1in; height: 1in; } + .s1mm { background-color: fuchsia; width: 1mm; height: 1mm; } + .s10mm { background-color: olive; width: 10mm; height: 10mm; } + .s1cm { background-color: orange; width: 1cm; height: 1cm; } + .s254cm { background-color: gray; width: 2.54cm; height: 2.54cm; } + .s1in { background-color: blue; width: 1in; height: 1in; } - .inline { float: left; } + .inline { float: left; } - .newline { clear: left; } + .newline { clear: left; } - p { clear: both; margin: 10px 0; } + p { clear: both; margin: 10px 0; } - </style> + </style> </head> <body> <p> - This should be 1mm (width) by 1mm (height) size + There should be a 1mm (width) by 1mm (height) fuchsia square: </p> <div class="s1mm"></div> <p> - This is 10 1mm x 1mm divs, so it should be 10mm (width) by 1mm (height) size + There should be a 10mm (width) by 1mm (height) fuchsia stripe: </p> <div class="s1mm newline inline"></div> @@ -51,25 +50,25 @@ <div class="s1mm inline"></div> <p> - This should be 10mm (width) by 10mm (height) size. + There should be a 10mm (width) by 10mm (height) olive square: </p> <div class="s10mm newline "></div> <p> - This should be 1cm (width) by 1cm (height) size. So, same width as the line above. + There should be a 1cm (width) by 1cm (height) orange square. So, same width above: </p> <div class="s1cm newline "></div> <p> - This should be 2.54cm (width) by 2.54cm (height) size. + There should be a 2.54cm (width) by 2.54cm (height) gray square: </p> <div class="s254cm newline "></div> <p> - This should be 1in (width) by 1in (height) size. So, same size as above. + There should be a 1in (width) by 1in (height) blue square. So, same width as above: </p> <div class="s1in"></div>
diff --git a/third_party/blink/web_tests/external/wpt/fonts/ahem.css b/third_party/blink/web_tests/external/wpt/fonts/ahem.css new file mode 100644 index 0000000..b278cc14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fonts/ahem.css
@@ -0,0 +1,5 @@ +@font-face { + font-family: 'Ahem'; + src: url('/fonts/Ahem.ttf'); +} +
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown0-scriptscriptpercentscaledown40.woff b/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown0-scriptscriptpercentscaledown40.woff new file mode 100644 index 0000000..998382de --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown0-scriptscriptpercentscaledown40.woff Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown0.woff b/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown0.woff new file mode 100644 index 0000000..26588c5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown0.woff Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown40.woff b/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown40.woff new file mode 100644 index 0000000..67af736 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fonts/math/scriptpercentscaledown80-scriptscriptpercentscaledown40.woff Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/html.idl b/third_party/blink/web_tests/external/wpt/interfaces/html.idl index b36c3014..5ae46f74 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/html.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
@@ -1417,9 +1417,8 @@ [Exposed=(Window,Worker)] interface ImageBitmapRenderingContext { - [ImplementedAs=getHTMLOrOffscreenCanvas] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas; - - [RaisesException] void transferFromImageBitmap(ImageBitmap? bitmap); + readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas; + void transferFromImageBitmap(ImageBitmap? bitmap); }; dictionary ImageBitmapRenderingContextSettings {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/media-capabilities.idl b/third_party/blink/web_tests/external/wpt/interfaces/media-capabilities.idl index 8721b1c7..00a9e620 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/media-capabilities.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/media-capabilities.idl
@@ -33,6 +33,7 @@ required unsigned long height; required unsigned long long bitrate; required DOMString framerate; + boolean hasAlphaChannel; }; dictionary AudioConfiguration {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/push-api.idl b/third_party/blink/web_tests/external/wpt/interfaces/push-api.idl index e0bc5ec9..2fd5e27 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/push-api.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/push-api.idl
@@ -17,17 +17,17 @@ Promise<PushPermissionState> permissionState(optional PushSubscriptionOptionsInit options); }; -dictionary PushSubscriptionOptionsInit { - boolean userVisibleOnly = false; - (BufferSource or DOMString)? applicationServerKey = null; -}; - [Exposed=(Window,Worker), SecureContext] interface PushSubscriptionOptions { readonly attribute boolean userVisibleOnly; [SameObject] readonly attribute ArrayBuffer? applicationServerKey; }; +dictionary PushSubscriptionOptionsInit { + boolean userVisibleOnly = false; + (BufferSource or DOMString)? applicationServerKey = null; +}; + [Exposed=(Window,Worker), SecureContext] interface PushSubscription { readonly attribute USVString endpoint; @@ -64,15 +64,21 @@ attribute EventHandler onpushsubscriptionchange; }; +[Constructor(DOMString type, optional PushEventInit eventInitDict), Exposed=ServiceWorker, SecureContext] +interface PushEvent : ExtendableEvent { + readonly attribute PushMessageData? data; +}; + typedef (BufferSource or USVString) PushMessageDataInit; dictionary PushEventInit : ExtendableEventInit { PushMessageDataInit data; }; -[Constructor(DOMString type, optional PushEventInit eventInitDict), Exposed=ServiceWorker, SecureContext] -interface PushEvent : ExtendableEvent { - readonly attribute PushMessageData? data; +[Constructor(DOMString type, optional PushSubscriptionChangeInit eventInitDict), Exposed=ServiceWorker, SecureContext] +interface PushSubscriptionChangeEvent : ExtendableEvent { + readonly attribute PushSubscription? newSubscription; + readonly attribute PushSubscription? oldSubscription; }; dictionary PushSubscriptionChangeInit : ExtendableEventInit { @@ -80,12 +86,6 @@ PushSubscription oldSubscription = null; }; -[Constructor(DOMString type, optional PushSubscriptionChangeInit eventInitDict), Exposed=ServiceWorker, SecureContext] -interface PushSubscriptionChangeEvent : ExtendableEvent { - readonly attribute PushSubscription? newSubscription; - readonly attribute PushSubscription? oldSubscription; -}; - enum PushPermissionState { "denied", "granted",
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/percentscaledown.py b/third_party/blink/web_tests/external/wpt/mathml/tools/percentscaledown.py new file mode 100755 index 0000000..ea09c44 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mathml/tools/percentscaledown.py
@@ -0,0 +1,21 @@ +#!/usr/bin/python + +from utils import mathfont +import fontforge + +v1 = 80 +v2 = 40 +f = mathfont.create("scriptpercentscaledown%d-scriptscriptpercentscaledown%d" % (v1, v2)) +f.math.ScriptPercentScaleDown = v1 +f.math.ScriptScriptPercentScaleDown = v2 +mathfont.save(f) + +f = mathfont.create("scriptpercentscaledown0-scriptscriptpercentscaledown%d" % v2) +f.math.ScriptPercentScaleDown = 0 +f.math.ScriptScriptPercentScaleDown = v2 +mathfont.save(f) + +f = mathfont.create("scriptpercentscaledown%d-scriptscriptpercentscaledown0" % v1) +f.math.ScriptPercentScaleDown = v1 +f.math.ScriptScriptPercentScaleDown = 0 +mathfont.save(f)
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-copyTo.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-copyTo.tentative.window.js index 6ce3648..972d1da 100644 --- a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-copyTo.tentative.window.js +++ b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-copyTo.tentative.window.js
@@ -69,4 +69,64 @@ assert_array_equals(await getSortedDirectoryEntries(dir), ['old-file', 'target']); }, 'copyTo() when target file already exists should overwrite target'); +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/subdir); + + // An empty name indicates that the filename should remain unchanged. + await file.copyTo(dir, /*name=*/""); + await dir.getFile(file_name); +}, `copyTo() when target is empty`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/subdir); + + await promise_rejects(t, 'SecurityError', file.copyTo(dir, /*name=*/kCurrentDirectory)); +}, `copyTo() when target is ${kCurrentDirectory}`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const first_subdir_name = 'first-subdir-name'; + const first_subdir = await createDirectory(t, first_subdir_name, /*parent=*/dir); + + const second_subdir_name = 'second-subdir-name'; + const second_subdir = await createDirectory(t, second_subdir_name, /*parent=*/first_subdir); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/second_subdir); + + await promise_rejects(t, 'SecurityError', file.copyTo(first_subdir, /*name=*/kParentDirectory)); +}, `copyTo() when target is ${kParentDirectory}`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/dir); + + const first_subdir_name = 'first-subdir-name'; + const first_subdir = await createDirectory(t, first_subdir_name, /*parent=*/dir); + + const second_subdir_name = 'second-subdir-name'; + const second_subdir = await createDirectory(t, second_subdir_name, /*parent=*/first_subdir); + + for (let i = 0; i < kPathSeparators.length; ++i) { + const path_with_separator = `${second_subdir_name}${kPathSeparators[i]}${file_name}`; + await promise_rejects(t, 'SecurityError', file.copyTo(first_subdir, path_with_separator), + `copyTo() must reject names containing "${kPathSeparators[i]}"`); + } +}, 'copyTo() when target contains path separator'); + // TODO(mek): Tests to copy directories.
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-moveTo.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-moveTo.tentative.window.js index 13df42c..8728918 100644 --- a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-moveTo.tentative.window.js +++ b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-moveTo.tentative.window.js
@@ -43,7 +43,6 @@ assert_array_equals(await getSortedDirectoryEntries(target_dir), ['old-file']); }, 'moveTo() to move a file into a sub-directory'); - promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const handle = await createFileWithContents(t, 'old-file', '12345', dir); @@ -69,4 +68,64 @@ assert_array_equals(await getSortedDirectoryEntries(dir), ['target']); }, 'moveTo() when target file already exists should overwrite target'); +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/subdir); + + // An empty name indicates that the filename should remain unchanged. + await file.moveTo(dir, /*name=*/""); + await dir.getFile(file_name); +}, `moveTo() when target is empty`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/subdir); + + await promise_rejects(t, 'SecurityError', file.moveTo(dir, /*name=*/kCurrentDirectory)); +}, `moveTo() when target is ${kCurrentDirectory}`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const first_subdir_name = 'first-subdir-name'; + const first_subdir = await createDirectory(t, first_subdir_name, /*parent=*/dir); + + const second_subdir_name = 'second-subdir-name'; + const second_subdir = await createDirectory(t, second_subdir_name, /*parent=*/first_subdir); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/second_subdir); + + await promise_rejects(t, 'SecurityError', file.moveTo(first_subdir, /*name=*/kParentDirectory)); +}, `moveTo() when target is ${kParentDirectory}`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const file_name = 'file-name'; + const file = await createEmptyFile(t, file_name, /*parent=*/dir); + + const first_subdir_name = 'first-subdir-name'; + const first_subdir = await createDirectory(t, first_subdir_name, /*parent=*/dir); + + const second_subdir_name = 'second-subdir-name'; + const second_subdir = await createDirectory(t, second_subdir_name, /*parent=*/first_subdir); + + for (let i = 0; i < kPathSeparators.length; ++i) { + const path_with_separator = `${second_subdir_name}${kPathSeparators[i]}${file_name}`; + await promise_rejects(t, 'SecurityError', file.moveTo(first_subdir, path_with_separator), + `moveTo() must reject names containing "${kPathSeparators[i]}"`); + } +}, 'moveTo() when target contains path separator'); + // TODO(mek): Tests to move directories.
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js index 105879db..0f8c1b1 100644 --- a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js +++ b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js
@@ -55,3 +55,52 @@ await promise_rejects(t, 'TypeMismatchError', root.getDirectory('file-name', { create: false })); await promise_rejects(t, 'TypeMismatchError', root.getDirectory('file-name', { create: true })); }, 'getDirectory() when a file already exists with the same name'); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + await promise_rejects(t, 'NotFoundError', dir.getDirectory("", { create: true })); + await promise_rejects(t, 'NotFoundError', dir.getDirectory("", { create: false })); +}, 'getDirectory() with empty name'); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + await promise_rejects(t, 'SecurityError', dir.getDirectory(kCurrentDirectory)); + await promise_rejects(t, 'SecurityError', dir.getDirectory(kCurrentDirectory, { create: true })); +}, `getDirectory() with "${kCurrentDirectory}" name`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + const subdir = await createDirectory(t, 'subdir-name', /*parent=*/dir); + + await promise_rejects(t, 'SecurityError', subdir.getDirectory(kParentDirectory)); + await promise_rejects(t, 'SecurityError', subdir.getDirectory(kParentDirectory, { create: true })); +}, `getDirectory() with "${kParentDirectory}" name`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const first_subdir_name = 'first-subdir-name'; + const first_subdir = await createDirectory(t, first_subdir_name, /*parent=*/dir); + + const second_subdir_name = 'second-subdir-name'; + const second_subdir = await createDirectory(t, second_subdir_name, /*parent=*/first_subdir); + + for (let i = 0; i < kPathSeparators.length; ++i) { + const path_with_separator = `${first_subdir_name}${kPathSeparators[i]}${second_subdir_name}`; + await promise_rejects(t, 'SecurityError', dir.getDirectory(path_with_separator), + `getDirectory() must reject names containing "${kPathSeparators[i]}"`); + } +}, 'getDirectory(create=false) with a path separator when the directory exists'); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + for (let i = 0; i < kPathSeparators.length; ++i) { + const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`; + await promise_rejects(t, 'SecurityError', dir.getDirectory(path_with_separator, { create: true }), + `getDirectory(true) must reject names containing "${kPathSeparators[i]}"`); + } +}, 'getDirectory(create=true) with a path separator');
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js index 0d9bacd..0b27027 100644 --- a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js +++ b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js
@@ -1,6 +1,6 @@ // META: script=resources/test-helpers.js promise_test(async t => cleanupSandboxedFileSystem(), - 'Cleanup to setup test environment'); + 'Cleanup to setup test environment'); promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); @@ -59,4 +59,53 @@ t.add_cleanup(() => dir_handle.removeRecursively()); await promise_rejects(t, 'TypeMismatchError', dir.getFile('dir-name', { create: true })); -}, 'getFile(create=true) when a directory already exists with the same name'); \ No newline at end of file +}, 'getFile(create=true) when a directory already exists with the same name'); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + await promise_rejects(t, 'NotFoundError', dir.getFile("", { create: true })); + await promise_rejects(t, 'NotFoundError', dir.getFile("", { create: false })); +}, 'getFile() with empty name'); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + await promise_rejects(t, 'SecurityError', dir.getFile(kCurrentDirectory)); + await promise_rejects(t, 'SecurityError', dir.getFile(kCurrentDirectory, { create: true })); +}, `getFile() with "${kCurrentDirectory}" name`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + const subdir = await createDirectory(t, 'subdir-name', /*parent=*/dir); + + await promise_rejects(t, 'SecurityError', subdir.getFile(kParentDirectory)); + await promise_rejects(t, 'SecurityError', subdir.getFile(kParentDirectory, { create: true })); +}, `getFile() with "${kParentDirectory}" name`); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + const file_name = 'file-name'; + await createEmptyFile(t, file_name, /*parent=*/subdir); + + for (let i = 0; i < kPathSeparators.length; ++i) { + const path_with_separator = `${subdir_name}${kPathSeparators[i]}${file_name}`; + await promise_rejects(t, 'SecurityError', dir.getFile(path_with_separator), + `getFile() must reject names containing "${kPathSeparators[i]}"`); + } +}, 'getFile(create=false) with a path separator when the file exists.'); + +promise_test(async t => { + const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const subdir_name = 'subdir-name'; + const subdir = await createDirectory(t, subdir_name, /*parent=*/dir); + + for (let i = 0; i < kPathSeparators.length; ++i) { + const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`; + await promise_rejects(t, 'SecurityError', dir.getFile(path_with_separator, { create: true }), + `getFile(true) must reject names containing "${kPathSeparators[i]}"`); + } +}, 'getFile(create=true) with a path separator');
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/resources/test-helpers.js b/third_party/blink/web_tests/external/wpt/native-file-system/resources/test-helpers.js index dc5f376..e29927b8 100644 --- a/third_party/blink/web_tests/external/wpt/native-file-system/resources/test-helpers.js +++ b/third_party/blink/web_tests/external/wpt/native-file-system/resources/test-helpers.js
@@ -1,3 +1,18 @@ +// A special path component meaning "this directory." +const kCurrentDirectory = "."; + +// A special path component meaning "the parent directory." +const kParentDirectory = ".."; + +// Array of separators used to separate components in hierarchical paths. +let kPathSeparators; +if (navigator.userAgent.includes("Windows NT")) { + // Windows uses both '/' and '\' as path separators. + kPathSeparators = ['/', '\\' ]; +} else { + kPathSeparators = [ '/' ]; +} + async function cleanupSandboxedFileSystem() { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); for await (let entry of dir.getEntries()) { @@ -38,6 +53,22 @@ return result; } +async function createDirectory(test, name, parent) { + const parent_dir_handle = parent ? parent : + await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); + + const new_dir_handle = await parent_dir_handle.getDirectory(name, { create: true }); + test.add_cleanup(async () => { + try { + await new_dir_handle.removeRecursively(); + } catch (e) { + // Ignore any errors when removing directories, as tests might + // have already removed the directory. + } + }); + return new_dir_handle; +} + async function createEmptyFile(test, name, parent) { const dir = parent ? parent : await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const handle = await dir.getFile(name, { create: true });
diff --git a/third_party/blink/web_tests/external/wpt/preload/link-header-preload-imagesrcset.html b/third_party/blink/web_tests/external/wpt/preload/link-header-preload-imagesrcset.html index b41cbee..3ae53fe 100644 --- a/third_party/blink/web_tests/external/wpt/preload/link-header-preload-imagesrcset.html +++ b/third_party/blink/web_tests/external/wpt/preload/link-header-preload-imagesrcset.html
@@ -9,33 +9,39 @@ setup({explicit_done: true}); var iterations = 0; + var expectation = new Array(10).fill(0); + if (window.devicePixelRatio < 1.5) { + expectation[0] = expectation[5] = expectation[8] = 1; + } else if (window.devicePixelRatio >= 1.5) { + expectation[1] = expectation[6] = expectation[9] = 1; + } function check_finished() { - if (numberOfResourceTimingEntries('resources/square.png?from-header&1x') == 1 && - numberOfResourceTimingEntries('resources/square.png?from-header&2x') == 0 && - numberOfResourceTimingEntries('resources/square.png?from-header&3x') == 0 && - numberOfResourceTimingEntries('resources/square.png?from-header&base') == 0 && - numberOfResourceTimingEntries('resources/square.png?from-header&200') == 0 && - numberOfResourceTimingEntries('resources/square.png?from-header&400') == 1 && - numberOfResourceTimingEntries('resources/square.png?from-header&800') == 0 && - numberOfResourceTimingEntries('resources/square.png?from-header&150') == 0 && - numberOfResourceTimingEntries('resources/square.png?from-header&300') == 1 && - numberOfResourceTimingEntries('resources/square.png?from-header&600') == 0) { + if (numberOfResourceTimingEntries('resources/square.png?from-header&1x') == expectation[0] && + numberOfResourceTimingEntries('resources/square.png?from-header&2x') == expectation[1] && + numberOfResourceTimingEntries('resources/square.png?from-header&3x') == expectation[2] && + numberOfResourceTimingEntries('resources/square.png?from-header&base') == expectation[3] && + numberOfResourceTimingEntries('resources/square.png?from-header&200') == expectation[4] && + numberOfResourceTimingEntries('resources/square.png?from-header&400') == expectation[5] && + numberOfResourceTimingEntries('resources/square.png?from-header&800') == expectation[6] && + numberOfResourceTimingEntries('resources/square.png?from-header&150') == expectation[7] && + numberOfResourceTimingEntries('resources/square.png?from-header&300') == expectation[8] && + numberOfResourceTimingEntries('resources/square.png?from-header&600') == expectation[9]) { done(); } iterations++; if (iterations == 10) { // At least one is expected to fail, but this should give details to the exact failure(s). - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&1x', 1); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&2x', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&3x', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&base', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&200', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&400', 1); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&800', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&150', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&300', 1); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&600', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&1x', expectation[0]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&2x', expectation[1]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&3x', expectation[2]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&base', expectation[3]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&200', expectation[4]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&400', expectation[5]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&800', expectation[6]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&150', expectation[7]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&300', expectation[8]); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&600', expectation[9]); done(); } else { step_timeout(check_finished, 500);
diff --git a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-baseval-in-display-none-expected.txt b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-baseval-in-display-none-expected.txt new file mode 100644 index 0000000..df45422 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-baseval-in-display-none-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +PASS With em +FAIL With em and percentage assert_equals: r1.width expected 40 but got 0 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-baseval-in-display-none.html b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-baseval-in-display-none.html new file mode 100644 index 0000000..fa52d1b4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-baseval-in-display-none.html
@@ -0,0 +1,67 @@ +<!DOCTYPE html> +<title>baseVal in symbol and other display:none</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://svgwg.org/svg2-draft/types.html#InterfaceSVGAnimatedLength"/> +<link rel="help" href="https://svgwg.org/svg2-draft/types.html#__svg__SVGAnimatedLength__baseVal"/> +<svg width="0" height="0"> + <svg width="600" height="400" font-size="5"> + <symbol width="40em" height="20em"> + <g font-size="10px"> + <rect id="r1" x="5em" y="6em" width="20%" height="30%" /> + <circle id="c1" cx="5em" cy="6em" r="10em" /> + </g> + </symbol> + <g font-size="10px" style="display:none"> + <rect id="r2" x="5em" y="6em" width="20%" height="30%" /> + <circle id="c2" cx="5em" cy="6em" r="10em" /> + </g> + </svg> +</svg> +<script> + let r1 = document.getElementById("r1"), + c1 = document.getElementById("c1"), + r2 = document.getElementById("r2"), + c2 = document.getElementById("c2"); + + const assertBaseVal = (length, expected, info) => { + assert_equals(length.baseVal.value, expected, info); + }; + + let tEm = async_test("With em"); + let tEmDone = tEm.step_func_done(() => { + assertBaseVal(r1.x, 50, "r1.x"); + assertBaseVal(r1.y, 60, "r1.y"); + assertBaseVal(c1.cx, 50, "c1.cx"); + assertBaseVal(c1.cy, 60, "c1.cy"); + assertBaseVal(c1.r, 100, "c1.r"); + + assertBaseVal(r2.x, 50, "r2.x"); + assertBaseVal(r2.y, 60, "r2.y"); + assertBaseVal(c2.cx, 50, "c2.cx"); + assertBaseVal(c2.cy, 60, "c2.cy"); + assertBaseVal(c2.r, 100, "c2.r"); + }); + + let tEmPercentage = async_test("With em and percentage"); + let tEmPercentageDone = tEmPercentage.step_func_done(() => { + assertBaseVal(r1.width, 40, "r1.width"); + assertBaseVal(r1.height, 30, "r1.height"); + + assertBaseVal(r2.width, 120, "r2.width"); + assertBaseVal(r2.height, 120, "r2.height"); + }); + + const main = () => { + window.requestAnimationFrame(() => { + tEmDone(); + tEmPercentageDone(); + }); + }; + + if (document.readyState === "complete") { + main(); + } else { + window.addEventListener("load", main); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py index b5ebeed6..616f95e 100644 --- a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py +++ b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py
@@ -2,7 +2,7 @@ import json import os from collections import MutableMapping, defaultdict -from six import iteritems, iterkeys, itervalues, string_types +from six import iteritems, iterkeys, itervalues, string_types, binary_type, text_type from . import vcs from .item import (ConformanceCheckerTest, ManifestItem, ManualTest, RefTest, RefTestNode, Stub, @@ -323,7 +323,7 @@ for source_file, update in tree: if not update: - assert isinstance(source_file, (bytes, str)) + assert isinstance(source_file, (binary_type, text_type)) rel_path = source_file # type: Text seen_files.add(rel_path) assert rel_path in path_hash
diff --git a/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py b/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py index 1b883b9..e2c9341 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py +++ b/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
@@ -17,6 +17,16 @@ uname = platform.uname() +def _get_fileversion(binary, logger=None): + command = "(Get-Item '%s').VersionInfo.FileVersion" % binary.replace("'", "''") + try: + return call("powershell.exe", command).strip() + except (subprocess.CalledProcessError, OSError): + if logger is not None: + logger.warning("Failed to call %s in PowerShell" % command) + return None + + class Browser(object): __metaclass__ = ABCMeta @@ -108,7 +118,7 @@ ("linux", "x86"): "linux", ("linux", "x86_64"): "linux64", ("win", "x86"): "win", - ("win", "x86_64"): "win64", + ("win", "AMD64"): "win64", ("macos", "x86_64"): "osx", } os_key = (self.platform, uname[4]) @@ -149,7 +159,7 @@ installer_path = os.path.join(dest, filename) - with open(installer_path, "w") as f: + with open(installer_path, "wb") as f: f.write(resp.content) try: @@ -197,6 +207,14 @@ path = os.path.join(venv_path, "browsers", channel) binary = self.find_binary_path(path, channel) + if not binary and self.platform == "win": + winpaths = [os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Mozilla Firefox"), + os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Mozilla Firefox")] + for winpath in winpaths: + binary = self.find_binary_path(winpath, channel) + if binary is not None: + break + if not binary and self.platform == "macos": macpaths = ["/Applications/Firefox Nightly.app/Contents/MacOS", os.path.expanduser("~/Applications/Firefox Nightly.app/Contents/MacOS"), @@ -215,7 +233,7 @@ path = find_executable("certutil") if path is None: return None - if os.path.splitdrive(path)[1].split(os.path.sep) == ["", "Windows", "system32", "certutil.exe"]: + if os.path.splitdrive(os.path.normcase(path))[1].split(os.path.sep) == ["", "windows", "system32", "certutil.exe"]: return None return path @@ -418,7 +436,8 @@ return "/usr/bin/google-chrome" if uname[0] == "Darwin": return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - # TODO Windows? + if uname[0] == "Windows": + return os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe") self.logger.warning("Unable to find the browser binary.") return None @@ -521,19 +540,19 @@ def version(self, binary=None, webdriver_binary=None): binary = binary or self.binary - if uname[0] != "Windows": - try: - version_string = call(binary, "--version").strip() - except subprocess.CalledProcessError: - self.logger.warning("Failed to call %s" % binary) - return None - m = re.match(r"(?:Google Chrome|Chromium) (.*)", version_string) - if not m: - self.logger.warning("Failed to extract version from: %s" % version_string) - return None - return m.group(1) - self.logger.warning("Unable to extract version from binary on Windows.") - return None + if uname[0] == "Windows": + return _get_fileversion(binary, self.logger) + + try: + version_string = call(binary, "--version").strip() + except subprocess.CalledProcessError: + self.logger.warning("Failed to call %s" % binary) + return None + m = re.match(r"(?:Google Chrome|Chromium) (.*)", version_string) + if not m: + self.logger.warning("Failed to extract version from: %s" % version_string) + return None + return m.group(1) class ChromeAndroid(Browser): @@ -711,12 +730,7 @@ return m.group(1) else: if binary is not None: - command = "(Get-Item '%s').VersionInfo.FileVersion" % binary - try: - return call("powershell.exe", command).strip() - except (subprocess.CalledProcessError, OSError): - self.logger.warning("Failed to call %s in PowerShell" % command) - return None + return _get_fileversion(binary, self.logger) self.logger.warning("Failed to find Edge binary.") return None
diff --git a/third_party/blink/web_tests/external/wpt/tools/wpt/install.py b/third_party/blink/web_tests/external/wpt/tools/wpt/install.py index be6bf81..b107752 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wpt/install.py +++ b/third_party/blink/web_tests/external/wpt/tools/wpt/install.py
@@ -6,6 +6,7 @@ latest_channels = { 'firefox': 'nightly', 'chrome': 'dev', + 'edgechromium': 'dev', 'safari': 'preview', 'servo': 'nightly' } @@ -18,6 +19,7 @@ 'dev': latest_channels, 'preview': latest_channels, 'experimental': latest_channels, + 'canary': 'canary', }
diff --git a/third_party/blink/web_tests/external/wpt/tools/wpt/run.py b/third_party/blink/web_tests/external/wpt/tools/wpt/run.py index 0b306aee..07376797 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wpt/run.py +++ b/third_party/blink/web_tests/external/wpt/tools/wpt/run.py
@@ -576,7 +576,8 @@ kwargs["browser_channel"] = channel else: logger.info("Valid channels for %s not known; using argument unmodified" % kwargs["product"]) - del kwargs["channel"] + kwargs["browser_channel"] = kwargs["channel"] + del kwargs["channel"] if install_browser: logger.info("Installing browser")
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings-menu-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings-menu-a11y-test-expected.txt new file mode 100644 index 0000000..b63e760 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings-menu-a11y-test-expected.txt
@@ -0,0 +1,4 @@ +Tests accessibility in the settings menu using the axe-core linter. +aXe violations: [] + +
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings-menu-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings-menu-a11y-test.js new file mode 100644 index 0000000..fafc062 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings-menu-a11y-test.js
@@ -0,0 +1,23 @@ +// 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. + +(async function() { + TestRunner.addResult( + 'Tests accessibility in the settings menu using the axe-core linter.'); + + await TestRunner.loadModule('axe_core_test_runner'); + await TestRunner.loadModule('settings'); + + await UI.actionRegistry.action('settings.show').execute(); + + const tabbedPane = runtime.sharedInstance(Settings.SettingsScreen) + ._tabbedLocation.tabbedPane(); + + // force tabs to update + tabbedPane._innerUpdateTabElements(); + + await AxeCoreTestRunner.runValidation( + [tabbedPane._headerElement, tabbedPane._tabsElement]); + TestRunner.completeTest(); +})();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/resources/create-credential-test.https.html b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/resources/create-credential-test.https.html index 2895da8..37d78de 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/resources/create-credential-test.https.html +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/resources/create-credential-test.https.html
@@ -2,30 +2,37 @@ <html lang="en"> <head> <script> -async function registerCredential() { +async function registerCredential(options = {}) { + options = Object.assign({ + authenticatorSelection: { + requireResidentKey: false, + }, + rp: { + id: 'devtools.test', + name: 'DevTools Test', + }, + challenge: Uint8Array.from('challenge'), + pubKeyCredParams: [ + {type: 'public-key', alg: -7}, + ], + user: { + name: 'name', + displayName: 'displayName', + id: Uint8Array.from([1]), + }, + }, options); + try { - await navigator.credentials.create({ - publicKey: { - authenticatorSelection: { - requireResidentKey: false, - }, - rp: { - id: 'devtools.test', - name: 'DevTools Test', - }, - challenge: Uint8Array.from('challenge'), - pubKeyCredParams: [ - {type: 'public-key', alg: -7}, - ], - user: { - name: 'name', - displayName: 'displayName', - id: Uint8Array.from([1]), - } - }}); - return "OK"; + const credential = await navigator.credentials.create({publicKey: options}); + return JSON.stringify({ + status: "OK", + credential: { + id: credential.id, + transports: credential.response.getTransports(), + } + }); } catch (error) { - return error.toString(); + return JSON.stringify({status: error.toString()}); } } </script>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-errors-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-errors-expected.txt new file mode 100644 index 0000000..07762c6 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-errors-expected.txt
@@ -0,0 +1,26 @@ +Check that the WebAuthn addVirtualAuthenticator command validates parameters +{ + error : { + code : -32000 + message : The Virtual Authenticator Environment has not been enabled for this session + } + id : <number> + sessionId : <string> +} +{ + error : { + code : -32602 + message : The protocol is not valid + } + id : <number> + sessionId : <string> +} +{ + error : { + code : -32602 + message : The transport is not valid + } + id : <number> + sessionId : <string> +} +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-errors.js b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-errors.js new file mode 100644 index 0000000..aa4509ef --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-errors.js
@@ -0,0 +1,39 @@ +(async function(testRunner) { + var {page, session, dp} = + await testRunner.startBlank( + "Check that the WebAuthn addVirtualAuthenticator command validates parameters"); + + const disabledError = await dp.WebAuthn.addVirtualAuthenticator({ + options: { + protocol: "ctap2", + transport: "usb", + hasResidentKey: false, + hasUserVerification: false, + }, + }); + testRunner.log(disabledError); + + await dp.WebAuthn.enable(); + + const protocolError = await dp.WebAuthn.addVirtualAuthenticator({ + options: { + protocol: "nonsense", + transport: "usb", + hasResidentKey: false, + hasUserVerification: false, + }, + }); + testRunner.log(protocolError); + + const transportError = await dp.WebAuthn.addVirtualAuthenticator({ + options: { + protocol: "ctap2", + transport: "nonsense", + hasResidentKey: false, + hasUserVerification: false, + }, + }); + testRunner.log(transportError); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-expected.txt new file mode 100644 index 0000000..6b6db7a --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator-expected.txt
@@ -0,0 +1,10 @@ +Check that the WebAuthn command addVirtualAuthenticator works +OK +[ + [0] : nfc +] +OK +[ + [0] : ble +] +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator.js b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator.js new file mode 100644 index 0000000..baa0313 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-add-virtual-authenticator.js
@@ -0,0 +1,38 @@ +(async function(testRunner) { + var {page, session, dp} = + await testRunner.startURL( + "https://devtools.test:8443/inspector-protocol/webauthn/resources/create-credential-test.https.html", + "Check that the WebAuthn command addVirtualAuthenticator works"); + + // Create an CTAP2 NFC authenticator and verify it is the one responding to + // navigator.credentials.create(). + await dp.WebAuthn.enable(); + const authenticatorId = (await dp.WebAuthn.addVirtualAuthenticator({ + options: { + protocol: "ctap2", + transport: "nfc", + hasResidentKey: false, + hasUserVerification: false, + }, + })).result.authenticatorId; + + let result = JSON.parse(await session.evaluateAsync("registerCredential()")); + testRunner.log(result.status); + testRunner.log(result.credential.transports); + + // Try with a BLE U2F authenticator. + await dp.WebAuthn.removeVirtualAuthenticator({ authenticatorId }); + await dp.WebAuthn.addVirtualAuthenticator({ + options: { + protocol: "u2f", + transport: "ble", + hasResidentKey: false, + hasUserVerification: false, + }, + }); + result = JSON.parse(await session.evaluateAsync("registerCredential()")); + testRunner.log(result.status); + testRunner.log(result.credential.transports); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js index 9efd943..d9d1611e 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js
@@ -1,15 +1,13 @@ (async function(testRunner) { var {page, session, dp} = - await testRunner.startBlank( + await testRunner.startURL( + "https://devtools.test:8443/inspector-protocol/webauthn/resources/create-credential-test.https.html", "Check that calling WebAuthn.enable starts the WebAuthn virtual " + "authenticator environment."); - await page.navigate( - "https://devtools.test:8443/inspector-protocol/webauthn/resources/create-credential-test.https.html"); - await dp.WebAuthn.enable(); - const result = await session.evaluateAsync("registerCredential()"); - testRunner.log(result); + const result = JSON.parse(await session.evaluateAsync("registerCredential()")); + testRunner.log(result.status); testRunner.completeTest(); })
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-remove-virtual-authenticator-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-remove-virtual-authenticator-expected.txt new file mode 100644 index 0000000..6dce5b3 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-remove-virtual-authenticator-expected.txt
@@ -0,0 +1,24 @@ +Check that the WebAuthn removeVirtualAuthenticator command works +{ + error : { + code : -32000 + message : The Virtual Authenticator Environment has not been enabled for this session + } + id : <number> + sessionId : <string> +} +{ + id : <number> + result : { + } + sessionId : <string> +} +{ + error : { + code : -32000 + message : Could not find a Virtual Authenticator matching the ID + } + id : <number> + sessionId : <string> +} +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-remove-virtual-authenticator.js b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-remove-virtual-authenticator.js new file mode 100644 index 0000000..8cf95fd --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-remove-virtual-authenticator.js
@@ -0,0 +1,32 @@ +(async function(testRunner) { + var {page, session, dp} = + await testRunner.startBlank( + "Check that the WebAuthn removeVirtualAuthenticator command works"); + + const disabledError = await dp.WebAuthn.removeVirtualAuthenticator({ + authenticatorId: "id", + }); + testRunner.log(disabledError); + + await dp.WebAuthn.enable(); + const authenticatorId = (await dp.WebAuthn.addVirtualAuthenticator({ + options: { + protocol: "ctap2", + transport: "usb", + hasResidentKey: false, + hasUserVerification: false, + }, + })).result.authenticatorId; + + const response = await dp.WebAuthn.removeVirtualAuthenticator({ + authenticatorId, + }); + testRunner.log(response); + + const notFoundError = await dp.WebAuthn.removeVirtualAuthenticator({ + authenticatorId: "id", + }); + testRunner.log(notFoundError); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/isolated-world-fetch-csp-expected.txt b/third_party/blink/web_tests/http/tests/security/isolatedWorld/isolated-world-fetch-csp-expected.txt new file mode 100644 index 0000000..6717e259 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/isolated-world-fetch-csp-expected.txt
@@ -0,0 +1,25 @@ +CONSOLE MESSAGE: line 53: Testing main world. Request should be blocked by main world CSP. +CONSOLE ERROR: line 10: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE ERROR: line 10: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the document's Content Security Policy. +CONSOLE MESSAGE: line 30: PASS: Request blocked by CSP as expected. +CONSOLE MESSAGE: line 58: Testing isolated world with no csp. Request should be blocked by main world CSP. +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the document's Content Security Policy. +CONSOLE MESSAGE: PASS: Request blocked by CSP as expected. +CONSOLE MESSAGE: line 65: Testing isolated world with permissive csp. +CONSOLE MESSAGE: PASS: Request succeeded as expected. +CONSOLE MESSAGE: line 71: Testing fetch redirect in isolated world with permissive csp. +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE MESSAGE: FAIL: Request failed unexpectedly. +CONSOLE MESSAGE: line 78: Testing isolated world with strict csp. +CONSOLE MESSAGE: line 79: internals.runtimeFlags.isolatedWorldCSPEnabled is false +CONSOLE MESSAGE: PASS: Request succeeded as expected. +CONSOLE MESSAGE: line 91: Testing fetch redirect in isolated world with strict csp. +CONSOLE MESSAGE: line 92: internals.runtimeFlags.isolatedWorldCSPEnabled is false +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE MESSAGE: FAIL: Request failed unexpectedly. +This tests the interaction of the fetch API run in the isolated world with the isolated world CSP.
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/isolated-world-fetch-csp.html b/third_party/blink/web_tests/http/tests/security/isolatedWorld/isolated-world-fetch-csp.html new file mode 100644 index 0000000..fe97832 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/isolated-world-fetch-csp.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<head> +<meta http-equiv="Content-Security-Policy" content="connect-src 'none'"> +<script src="resources/isolated-world-fetch-csp.js"></script> +</head> +<body id="body"> + <p> + This tests the interaction of the fetch API run in the isolated world + with the isolated world CSP. + </p> +</body> +</html>
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/access_control_allow_origin.php b/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/access_control_allow_origin.php new file mode 100644 index 0000000..c9262a5 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/access_control_allow_origin.php
@@ -0,0 +1,6 @@ +<?php + header("Access-Control-Allow-Origin: *"); + header("Content-Type: text/plain"); + echo "Hello world"; + exit; +?>
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/isolated-world-fetch-csp.js b/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/isolated-world-fetch-csp.js new file mode 100644 index 0000000..4e0f482 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/isolated-world-fetch-csp.js
@@ -0,0 +1,126 @@ +function testFetch(expectBlocked, redirect) { + let url = + 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php'; + + if (redirect) { + url = `http://127.0.0.1:8000/resources/redirect.php?url=${ + url}&cors_allow_origin=*&delay=100`; + } + + fetch(url) + .then(function(response) { + return response.text(); + }) + .then(function(responseText) { + const success = responseText == 'Hello world'; + if (expectBlocked) { + console.log( + 'FAIL: Request succeeded unexpectedly with response ' + + responseText); + } else if (!success) { + console.log( + 'FAIL: Request succeeded with incorrect response ' + + responseText); + } else { + console.log('PASS: Request succeeded as expected.'); + } + }) + .catch(function(error) { + if (expectBlocked) + console.log('PASS: Request blocked by CSP as expected.'); + else + console.log('FAIL: Request failed unexpectedly.'); + }) + .finally(function() { + window.postMessage('next', '*'); + }); +} + +const isolatedWorldId = 1; +const isolatedWorldSecurityOrigin = 'chrome-extensions://123'; + +function testFetchInIsolatedWorld(expectBlocked, redirect) { + const expectBlockedStr = expectBlocked ? 'true' : 'false'; + const redirectStr = redirect ? 'true' : 'false'; + testRunner.evaluateScriptInIsolatedWorld( + isolatedWorldId, + String(eval('testFetch')) + + `\ntestFetch(${expectBlockedStr}, ${redirectStr});`); +} + +const tests = [ + function() { + console.log( + 'Testing main world. Request should be blocked by main world CSP.'); + testFetch(true); + }, + function() { + console.log( + 'Testing isolated world with no csp. Request should be blocked by ' + + 'main world CSP.'); + testRunner.setIsolatedWorldInfo(isolatedWorldId, null, null); + testFetchInIsolatedWorld(true); + }, + function() { + console.log('Testing isolated world with permissive csp.'); + testRunner.setIsolatedWorldInfo( + isolatedWorldId, isolatedWorldSecurityOrigin, 'connect-src *'); + testFetchInIsolatedWorld(false); + }, + function() { + console.log( + 'Testing fetch redirect in isolated world with permissive csp.'); + testRunner.setIsolatedWorldInfo( + isolatedWorldId, isolatedWorldSecurityOrigin, 'connect-src *'); + testFetchInIsolatedWorld(false, true /* redirect */); + }, + function() { + console.log('Testing isolated world with strict csp.'); + console.log( + 'internals.runtimeFlags.isolatedWorldCSPEnabled is ' + + internals.runtimeFlags.isolatedWorldCSPEnabled); + const expectBlocked = internals.runtimeFlags.isolatedWorldCSPEnabled; + testRunner.setIsolatedWorldInfo( + isolatedWorldId, isolatedWorldSecurityOrigin, 'connect-src \'self\''); + testFetchInIsolatedWorld(expectBlocked); + + // Clear the isolated world data. + testRunner.setIsolatedWorldInfo(1, null, null); + }, + function() { + console.log('Testing fetch redirect in isolated world with strict csp.'); + console.log( + 'internals.runtimeFlags.isolatedWorldCSPEnabled is ' + + internals.runtimeFlags.isolatedWorldCSPEnabled); + const expectBlocked = internals.runtimeFlags.isolatedWorldCSPEnabled; + testRunner.setIsolatedWorldInfo( + isolatedWorldId, isolatedWorldSecurityOrigin, 'connect-src \'self\''); + testFetchInIsolatedWorld(expectBlocked, true /* redirect */); + + // Clear the isolated world data. + testRunner.setIsolatedWorldInfo(1, null, null); + }, +]; + +// This test is meaningless without testRunner. +if (window.testRunner) { + testRunner.dumpAsText(); + testRunner.waitUntilDone(); + + let currentTest = 0; + window.addEventListener('message', function(e) { + if (e.data == 'next') { + // Move to the next test. + currentTest++; + if (currentTest == tests.length) { + testRunner.notifyDone(); + return; + } + + // Move to the next sub-test. + tests[currentTest](); + } + }, false); + + tests[0](); +}
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index d5f60da93..f1bf8407 100644 --- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1194,6 +1194,21 @@ method formData method json method text +interface SecurityPolicyViolationEvent : Event + attribute @@toStringTag + getter blockedURI + getter columnNumber + getter disposition + getter documentURI + getter effectiveDirective + getter lineNumber + getter originalPolicy + getter referrer + getter sample + getter sourceFile + getter statusCode + getter violatedDirective + method constructor interface ServiceWorkerGlobalScope : WorkerGlobalScope attribute @@toStringTag method constructor
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win7/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt new file mode 100644 index 0000000..e29dece9 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/external/wpt/css/css-fonts/math-script-level-and-math-style/math-style-001.tentative-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL Initial value of math-style assert_equals: expected "inline" but got "" +FAIL Specified values of math-style assert_equals: expected "inline" but got "" +FAIL Inherited values of math-style assert_equals: expected "inline" but got "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/isolated_world_csp/http/tests/security/isolatedWorld/isolated-world-fetch-csp-expected.txt b/third_party/blink/web_tests/virtual/isolated_world_csp/http/tests/security/isolatedWorld/isolated-world-fetch-csp-expected.txt new file mode 100644 index 0000000..bd1674c --- /dev/null +++ b/third_party/blink/web_tests/virtual/isolated_world_csp/http/tests/security/isolatedWorld/isolated-world-fetch-csp-expected.txt
@@ -0,0 +1,29 @@ +CONSOLE MESSAGE: line 53: Testing main world. Request should be blocked by main world CSP. +CONSOLE ERROR: line 10: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE ERROR: line 10: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the document's Content Security Policy. +CONSOLE MESSAGE: line 30: PASS: Request blocked by CSP as expected. +CONSOLE MESSAGE: line 58: Testing isolated world with no csp. Request should be blocked by main world CSP. +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the document's Content Security Policy. +CONSOLE MESSAGE: PASS: Request blocked by CSP as expected. +CONSOLE MESSAGE: line 65: Testing isolated world with permissive csp. +CONSOLE MESSAGE: PASS: Request succeeded as expected. +CONSOLE MESSAGE: line 71: Testing fetch redirect in isolated world with permissive csp. +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'none'". + +CONSOLE MESSAGE: FAIL: Request failed unexpectedly. +CONSOLE MESSAGE: line 78: Testing isolated world with strict csp. +CONSOLE MESSAGE: line 79: internals.runtimeFlags.isolatedWorldCSPEnabled is true +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the following Content Security Policy directive: "connect-src 'self'". + +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php' because it violates the document's Content Security Policy. +CONSOLE MESSAGE: PASS: Request blocked by CSP as expected. +CONSOLE MESSAGE: line 91: Testing fetch redirect in isolated world with strict csp. +CONSOLE MESSAGE: line 92: internals.runtimeFlags.isolatedWorldCSPEnabled is true +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/resources/redirect.php?url=http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php&cors_allow_origin=*&delay=100' because it violates the following Content Security Policy directive: "connect-src 'self'". + +CONSOLE ERROR: Refused to connect to 'http://127.0.0.1:8000/resources/redirect.php?url=http://127.0.0.1:8000/security/isolatedWorld/resources/access_control_allow_origin.php&cors_allow_origin=*&delay=100' because it violates the document's Content Security Policy. +CONSOLE MESSAGE: PASS: Request blocked by CSP as expected. +This tests the interaction of the fetch API run in the isolated world with the isolated world CSP.
diff --git a/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index f111ad4..f292e3a0 100644 --- a/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1065,6 +1065,21 @@ method formData method json method text +interface SecurityPolicyViolationEvent : Event + attribute @@toStringTag + getter blockedURI + getter columnNumber + getter disposition + getter documentURI + getter effectiveDirective + getter lineNumber + getter originalPolicy + getter referrer + getter sample + getter sourceFile + getter statusCode + getter violatedDirective + method constructor interface ServiceWorkerGlobalScope : WorkerGlobalScope attribute @@toStringTag method constructor
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt index 60a2a4d..16ef786 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -999,6 +999,21 @@ [Worker] method formData [Worker] method json [Worker] method text +[Worker] interface SecurityPolicyViolationEvent : Event +[Worker] attribute @@toStringTag +[Worker] getter blockedURI +[Worker] getter columnNumber +[Worker] getter disposition +[Worker] getter documentURI +[Worker] getter effectiveDirective +[Worker] getter lineNumber +[Worker] getter originalPolicy +[Worker] getter referrer +[Worker] getter sample +[Worker] getter sourceFile +[Worker] getter statusCode +[Worker] getter violatedDirective +[Worker] method constructor [Worker] interface ServiceWorkerRegistration : EventTarget [Worker] attribute @@toStringTag [Worker] getter active
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt index 7137cb3..ee82e68 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -994,6 +994,21 @@ [Worker] method formData [Worker] method json [Worker] method text +[Worker] interface SecurityPolicyViolationEvent : Event +[Worker] attribute @@toStringTag +[Worker] getter blockedURI +[Worker] getter columnNumber +[Worker] getter disposition +[Worker] getter documentURI +[Worker] getter effectiveDirective +[Worker] getter lineNumber +[Worker] getter originalPolicy +[Worker] getter referrer +[Worker] getter sample +[Worker] getter sourceFile +[Worker] getter statusCode +[Worker] getter violatedDirective +[Worker] method constructor [Worker] interface ServiceWorkerRegistration : EventTarget [Worker] attribute @@toStringTag [Worker] getter active
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt index d9eae374..15435bf 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1133,6 +1133,21 @@ [Worker] method constructor [Worker] method start [Worker] setter onchange +[Worker] interface SecurityPolicyViolationEvent : Event +[Worker] attribute @@toStringTag +[Worker] getter blockedURI +[Worker] getter columnNumber +[Worker] getter disposition +[Worker] getter documentURI +[Worker] getter effectiveDirective +[Worker] getter lineNumber +[Worker] getter originalPolicy +[Worker] getter referrer +[Worker] getter sample +[Worker] getter sourceFile +[Worker] getter statusCode +[Worker] getter violatedDirective +[Worker] method constructor [Worker] interface Serial : EventTarget [Worker] attribute @@toStringTag [Worker] getter onconnect
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt index 83b2f13..f80d638e 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1104,6 +1104,21 @@ [Worker] method formData [Worker] method json [Worker] method text +[Worker] interface SecurityPolicyViolationEvent : Event +[Worker] attribute @@toStringTag +[Worker] getter blockedURI +[Worker] getter columnNumber +[Worker] getter disposition +[Worker] getter documentURI +[Worker] getter effectiveDirective +[Worker] getter lineNumber +[Worker] getter originalPolicy +[Worker] getter referrer +[Worker] getter sample +[Worker] getter sourceFile +[Worker] getter statusCode +[Worker] getter violatedDirective +[Worker] method constructor [Worker] interface ServiceWorkerRegistration : EventTarget [Worker] attribute @@toStringTag [Worker] getter active
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 62af246..fd6906a 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-10-0-54-ge13c1f46d -Revision: e13c1f46dc1afb1b2287849be5fa74ef70e0607b +Version: VER-2-10-0-55-gc949ab075 +Revision: c949ab0757a2514cd3a37b3e1e8390fd662a025b License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses" License File: src/docs/FTL.TXT
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index ffa23105..d27010f0 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -727,7 +727,7 @@ 'linux-libfuzzer-asan-rel': 'libfuzzer_asan_release_trybot', 'linux-ozone-rel': 'ozone_linux_release_trybot', 'linux-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange', - 'linux-trusty-webkit-msan-rel': 'msan_release_bot', + 'linux-webkit-msan-rel': 'msan_release_bot', 'linux_arm': 'release_trybot_arm', 'linux_chromium_archive_rel_ng': 'release_bot', 'linux_chromium_asan_rel_ng': 'asan_lsan_release_trybot',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 83f665d..f39d7d9 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -15782,7 +15782,10 @@ <action name="PageLoad" not_user_triggered="true"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> - <description>Please enter the description of this user action.</description> + <description> + When a page load starts. This can include page loads that are not completed, + sub frames, and pre sign-in ChromeOS pages. + </description> </action> <action name="PageLoadInIncognito" not_user_triggered="true">
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 10b5908..9afcea7f 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -28905,6 +28905,13 @@ <int value="9" label="SpdyProxy Reject (Deprecated)"/> </enum> +<enum name="HttpAuthNtlmV2Usage"> + <int value="0" label="Disabled over unsecured connection"/> + <int value="1" label="Disabled over secure connection"/> + <int value="2" label="Enabled over unsecured connection"/> + <int value="3" label="Enabled over secure connection"/> +</enum> + <enum name="HttpAuthPromptType"> <int value="0" label="Main frame with interstitial"> Auth prompt displayed over a blank interstitial @@ -45730,6 +45737,9 @@ </enum> <enum name="PerformanceMeasureParameterType"> + <obsolete> + Deprecated as of June 2019. + </obsolete> <int value="0" label="OBJECT_OBJECT"/> <int value="1" label="UNLOAD_EVENT_START"/> <int value="2" label="UNLOAD_EVENT_END"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 2162b97..6745c96 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -29716,6 +29716,16 @@ </summary> </histogram> +<histogram name="Download.ResumptionAfterContentLengthMismatch.Reason" + enum="InterruptReason" expires_after="M78"> + <owner>qinmin@chromium.org</owner> + <owner>xingliu@chromium.org</owner> + <summary> + Records the interrupt reason after download is resumed after a content + length mismatch error. + </summary> +</histogram> + <histogram name="Download.ResumptionRestart.Counts" enum="DownloadResumptionRestartCountType" expires_after="M79"> <owner>qinmin@chromium.org</owner> @@ -61418,6 +61428,43 @@ </summary> </histogram> +<histogram name="MobileDownload.FirstBackground.InterruptionCount" + units="interruptions" expires_after="2019-12-05"> + <owner>hnakashima@chromium.org</owner> + <owner>hanxi@chromium.org</owner> + <owner>qinmin@chromium.org</owner> + <summary> + Android: Records the number of interruptions for the first download started + in background after it reaches a terminal state. + </summary> +</histogram> + +<histogram name="MobileDownload.FirstBackground.Reason" enum="InterruptReason" + expires_after="2019-12-05"> + <owner>hnakashima@chromium.org</owner> + <owner>hanxi@chromium.org</owner> + <owner>qinmin@chromium.org</owner> + <summary> + Android: Records all the interrupt reasons for the first download started in + background after every browser process launch. We only record the first + download so that we can compare the difference between service manager only + mode and full browser process mode. + </summary> +</histogram> + +<histogram name="MobileDownload.FirstBackground.StartedReason" + enum="InterruptReason" expires_after="2019-12-05"> + <owner>hnakashima@chromium.org</owner> + <owner>hanxi@chromium.org</owner> + <owner>qinmin@chromium.org</owner> + <summary> + Android: After every browser process launch, records the interrupt reason of + the first background download when it is started. This interrupt reason + allows us to know whether download was interrupted due to browser process + crash in an earlier attempt. + </summary> +</histogram> + <histogram name="MobileDownload.InterceptFailureReason" enum="MobileDownloadInterceptFailureReason" expires_after="2016-09-21"> <obsolete> @@ -68482,6 +68529,19 @@ </summary> </histogram> +<histogram name="Net.HttpAuthNtlmV2Usage" enum="HttpAuthNtlmV2Usage" + expires_after="M79"> + <owner>asanka@chromium.org</owner> + <owner>mmenke@chromium.org</owner> + <summary> + Whether NTLMv2 was enabled for an authentication handshake. For a given data + set the number of samples here is expected to be equivalent to the + "NTLM Start" count in the "Net.HttpAuthCount" histogram. + Note that NTLMv2 being enabled makes the client behavior equivalent to + setting LmCompatibilityLevel to 3 or higher. + </summary> +</histogram> + <histogram name="Net.HttpAuthPromptType" enum="HttpAuthPromptType" expires_after="M77"> <owner>meacer@chromium.org</owner> @@ -87109,6 +87169,22 @@ </summary> </histogram> +<histogram + name="PageLoad.Clients.Scheme.HTTP.PaintTiming.UnderStat.UserInitiated.NewNavigation" + enum="PageLoadTimingUnderStat" expires_after="2019-12-31"> + <owner>dougarnett@chromium.org</owner> + <owner>tbansal@chromium.org</owner> + <summary> + Records if the time from navigation to first contentful paint was less than + the specified threshold. Also, records the total number of first contentful + paints. For a single first contentful paint event, data may be recorded in + multiple buckets. Recorded at the time when first contentful paint happens. + Recorded only for page loads that have scheme http://, are user-initiated, + and are new navigations (that is, they are not reloads nor forward or back + navigations). + </summary> +</histogram> + <histogram name="PageLoad.Clients.Scheme.HTTPS.PaintTiming.UnderStat" enum="PageLoadTimingUnderStat"> <owner>tbansal@chromium.org</owner> @@ -87121,6 +87197,22 @@ </summary> </histogram> +<histogram + name="PageLoad.Clients.Scheme.HTTPS.PaintTiming.UnderStat.UserInitiated.NewNavigation" + enum="PageLoadTimingUnderStat" expires_after="2019-12-31"> + <owner>dougarnett@chromium.org</owner> + <owner>tbansal@chromium.org</owner> + <summary> + Records if the time from navigation to first contentful paint was less than + the specified threshold. Also, records the total number of first contentful + paints. For a single first contentful paint event, data may be recorded in + multiple buckets. Recorded at the time when first contentful paint happens. + Recorded only for page loads that have scheme https://, are user-initiated, + and are new navigations (that is, they are not reloads nor forward or back + navigations). + </summary> +</histogram> + <histogram name="PageLoad.Clients.ServiceWorker.PageTransition" enum="CorePageTransition" expires_after="2018-06-26"> <obsolete> @@ -92528,6 +92620,9 @@ <histogram name="Performance.MeasureParameter.EndMark" enum="PerformanceMeasureParameterType" expires_after="2019-06-01"> + <obsolete> + Deprecated as of June 2019. + </obsolete> <owner>maxlg@chromium.org</owner> <summary> The count of possible incoming values to the endMark parameter in @@ -92542,6 +92637,9 @@ <histogram name="Performance.MeasureParameter.StartMark" enum="PerformanceMeasureParameterType" expires_after="2019-06-01"> + <obsolete> + Deprecated as of June 2019. + </obsolete> <owner>maxlg@chromium.org</owner> <summary> The count of possible incoming values to the startMark parameter in
diff --git a/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py b/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py index c90f8cb..dd009e9 100644 --- a/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py +++ b/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py
@@ -122,6 +122,16 @@ 'The dialog is not fully loaded within 15s.', timeout=15) + def WaitForSink(self, action_runner, target_sink, error_message, timeout=5): + sink_list = action_runner.tab.GetCastSinks() + start_time = time.time() + while target_sink not in sink_list and time.time() - start_time < timeout: + action_runner.tab.EnableCast() + sink_list = action_runner.tab.GetCastSinks() + action_runner.Wait(1) + if target_sink not in sink_list: + raise RuntimeError(error_message) + def _WaitForResult(self, action_runner, verify_func, error_message, timeout=5): """Waits until the function finishes or timeout."""
diff --git a/tools/perf/contrib/media_router_benchmarks/media_router_benchmarks.py b/tools/perf/contrib/media_router_benchmarks/media_router_benchmarks.py index 656de12..60da8a8 100644 --- a/tools/perf/contrib/media_router_benchmarks/media_router_benchmarks.py +++ b/tools/perf/contrib/media_router_benchmarks/media_router_benchmarks.py
@@ -32,7 +32,7 @@ [os.path.join(path_util.GetChromiumSrcDir(), 'out', 'Release', 'mr_extension', 'release'), os.path.join(path_util.GetChromiumSrcDir(), 'out', - 'Release', 'media_router', 'media_router_telemetry_extension')]), + 'Release', 'media_router', 'telemetry_extension')]), '--disable-features=ViewsCastDialog', '--whitelisted-extension-id=enhhojjnijigcajfphajepfemndkmdlo', '--media-router=1', @@ -64,7 +64,7 @@ options.AppendExtraBrowserArgs([ '--load-extension=' + os.path.join(path_util.GetChromiumSrcDir(), 'out', - 'Release', 'media_router', 'media_router_telemetry_extension'), + 'Release', 'media_router', 'telemetry_extension'), '--disable-features=ViewsCastDialog', '--media-router=0', '--enable-stats-collection-bindings'
diff --git a/tools/perf/contrib/media_router_benchmarks/media_router_pages.py b/tools/perf/contrib/media_router_benchmarks/media_router_pages.py index d53e9d6d..e662ff1 100644 --- a/tools/perf/contrib/media_router_benchmarks/media_router_pages.py +++ b/tools/perf/contrib/media_router_benchmarks/media_router_pages.py
@@ -5,6 +5,7 @@ from telemetry import story from telemetry.page import shared_page_state from telemetry.util import js_template + from contrib.media_router_benchmarks.media_router_base_page import MediaRouterBasePage @@ -13,9 +14,9 @@ class SharedState(shared_page_state.SharedPageState): """Shared state that restarts the browser for every single story.""" - def __init__(self, test, finder_options, story_set): + def __init__(self, test, finder_options, story_set, possible_browser): super(SharedState, self).__init__( - test, finder_options, story_set) + test, finder_options, story_set, possible_browser) def DidRunStory(self, results): super(SharedState, self).DidRunStory(results) @@ -52,31 +53,30 @@ def RunPageInteractions(self, action_runner): sink_name = self._GetOSEnviron('RECEIVER_NAME') + + # Enable Cast and start to discover all sinks. + action_runner.tab.EnableCast() # Wait for 5s after Chrome is opened in order to get consistent results. action_runner.Wait(5) with action_runner.CreateInteraction('flinging'): + action_runner.tab.StopCasting(sink_name) self._WaitForResult( action_runner, lambda: action_runner.EvaluateJavaScript('initialized'), 'Failed to initialize', timeout=30) - self.CloseExistingRoute(action_runner, sink_name) + + # Wait for the sinks to appear. + self.WaitForSink( + action_runner, sink_name, + 'Targeted receiver "%s" did not showed up. Sink List: %s' % ( + sink_name, str(action_runner.tab.GetCastSinks()))) + action_runner.tab.SetCastSinkToUse(sink_name) # Start session action_runner.TapElement(selector='#start_session_button') self._WaitForResult( - action_runner, - lambda: len(action_runner.tab.browser.tabs) >= 2, - 'MR dialog never showed up.') - - for tab in action_runner.tab.browser.tabs: - # Choose sink - if tab.url == 'chrome://media-router/': - self.WaitUntilDialogLoaded(action_runner, tab) - self.ChooseSink(tab, sink_name) - - self._WaitForResult( action_runner, lambda: action_runner.EvaluateJavaScript('currentSession'), 'Failed to start session', @@ -115,40 +115,29 @@ def RunPageInteractions(self, action_runner): sink_name = self._GetOSEnviron('RECEIVER_NAME') + + # Enable Cast and start to discover all sinks. + action_runner.tab.EnableCast() # Wait for 5s after Chrome is opened in order to get consistent results. action_runner.Wait(5) with action_runner.CreateInteraction('mirroring'): - self.CloseExistingRoute(action_runner, sink_name) + action_runner.tab.StopCasting(sink_name) + + # Wait for the sinks to appear. + self.WaitForSink( + action_runner, sink_name, + 'Targeted receiver "%s" did not showed up. Sink List: %s' % ( + sink_name, str(action_runner.tab.GetCastSinks()))) # Start session - action_runner.TapElement(selector='#start_session_button') - self._WaitForResult( - action_runner, - lambda: len(action_runner.tab.browser.tabs) >= 2, - 'MR dialog never showed up.') + action_runner.tab.StartTabMirroring(sink_name) - for tab in action_runner.tab.browser.tabs: - # Choose sink - if tab.url == 'chrome://media-router/': - self.WaitUntilDialogLoaded(action_runner, tab) - self.ChooseSink(tab, sink_name) - - # Wait for 5s to make sure the route is created. - action_runner.Wait(5) - action_runner.TapElement(selector='#start_session_button') - self._WaitForResult( - action_runner, - lambda: len(action_runner.tab.browser.tabs) >= 2, - 'MR dialog never showed up.') - - for tab in action_runner.tab.browser.tabs: - if tab.url == 'chrome://media-router/': - self.WaitUntilDialogLoaded(action_runner, tab) - if not self.CheckIfExistingRoute(tab, sink_name): - raise RuntimeError('Failed to start mirroring session.') + # Make sure the route is created. + if action_runner.tab.GetCastIssue(): + raise RuntimeError(action_runner.tab.GetCastIssue()) action_runner.ExecuteJavaScript('collectPerfData();') action_runner.Wait(SESSION_TIME) - self.CloseExistingRoute(action_runner, sink_name) + action_runner.tab.StopCasting(sink_name) class MediaRouterCPUMemoryPageSet(story.StorySet):
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index ee71880..f51fbc2 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -398,6 +398,7 @@ "//base:base_java", "//base:base_java_test_support", "//base:base_junit_test_support", + "//base/test:test_support_java", ] }
diff --git a/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java b/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java index b746405..719def28 100644 --- a/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java +++ b/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java
@@ -8,7 +8,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.chromium.base.util.GarbageCollectionTestUtil.isGarbageCollected; +import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected; import android.graphics.Bitmap; @@ -47,11 +47,11 @@ WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(bitmap); mResource.setBitmap(bitmap); bitmap = null; - assertFalse(isGarbageCollected(bitmapWeakReference)); + assertFalse(canBeGarbageCollected(bitmapWeakReference)); Bitmap bitmap2 = Bitmap.createBitmap(3, 4, Bitmap.Config.ARGB_8888); mResource.setBitmap(bitmap2); - assertTrue(isGarbageCollected(bitmapWeakReference)); + assertTrue(canBeGarbageCollected(bitmapWeakReference)); } @Test @@ -60,9 +60,9 @@ WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(bitmap); mResource.setBitmap(bitmap); bitmap = null; - assertFalse(isGarbageCollected(bitmapWeakReference)); + assertFalse(canBeGarbageCollected(bitmapWeakReference)); mResource.getBitmap(); - assertTrue(isGarbageCollected(bitmapWeakReference)); + assertTrue(canBeGarbageCollected(bitmapWeakReference)); } }
diff --git a/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java b/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java index 163d762..61cf3b23 100644 --- a/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java +++ b/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java
@@ -12,7 +12,7 @@ import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import static org.chromium.base.util.GarbageCollectionTestUtil.isGarbageCollected; +import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -229,22 +229,22 @@ public void testDropCachedBitmapGCed() { WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(mAdapter.getBitmap()); assertNotNull(bitmapWeakReference.get()); - assertFalse(isGarbageCollected(bitmapWeakReference)); + assertFalse(canBeGarbageCollected(bitmapWeakReference)); mAdapter.dropCachedBitmap(); - assertTrue(isGarbageCollected(bitmapWeakReference)); + assertTrue(canBeGarbageCollected(bitmapWeakReference)); } @Test public void testResizeGCed() { WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(mAdapter.getBitmap()); assertNotNull(bitmapWeakReference.get()); - assertFalse(isGarbageCollected(bitmapWeakReference)); + assertFalse(canBeGarbageCollected(bitmapWeakReference)); mViewWidth += 10; mAdapter.invalidate(null); mAdapter.getBitmap(); - assertTrue(isGarbageCollected(bitmapWeakReference)); + assertTrue(canBeGarbageCollected(bitmapWeakReference)); } @Test
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn index e296dc2..179eabc 100644 --- a/ui/aura/BUILD.gn +++ b/ui/aura/BUILD.gn
@@ -162,13 +162,6 @@ public += [ "screen_ozone.h" ] sources += [ "screen_ozone.cc" ] } - - if (is_android) { - deps += [ - "//ui/platform_window/android", - "//ui/platform_window/android:platform_window_java", - ] - } } jumbo_static_library("test_support") {
diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc index 108ab33..7d5b515 100644 --- a/ui/aura/window_tree_host_platform.cc +++ b/ui/aura/window_tree_host_platform.cc
@@ -24,10 +24,6 @@ #include "ui/events/keycodes/dom/dom_keyboard_layout_map.h" #include "ui/platform_window/platform_window_init_properties.h" -#if defined(OS_ANDROID) -#include "ui/platform_window/android/platform_window_android.h" -#endif - #if defined(USE_OZONE) #include "ui/ozone/public/ozone_platform.h" #endif @@ -76,8 +72,6 @@ this, std::move(properties)); #elif defined(OS_WIN) platform_window_.reset(new ui::WinWindow(this, properties.bounds)); -#elif defined(OS_ANDROID) - platform_window_.reset(new ui::PlatformWindowAndroid(this)); #elif defined(USE_X11) platform_window_.reset(new ui::X11Window(this, properties.bounds)); #else
diff --git a/ui/base/ime/mojo/BUILD.gn b/ui/base/ime/mojo/BUILD.gn index bdb71a2..bca2fc1 100644 --- a/ui/base/ime/mojo/BUILD.gn +++ b/ui/base/ime/mojo/BUILD.gn
@@ -11,9 +11,6 @@ public_deps = [ "//mojo/public/mojom/base", - "//ui/events/mojo:interfaces", - "//ui/gfx/geometry/mojo", - "//ui/gfx/range/mojo", ] }
diff --git a/ui/base/ime/mojo/ime_struct_traits_test.mojom b/ui/base/ime/mojo/ime_struct_traits_test.mojom index f838693e0..b68b5c8 100644 --- a/ui/base/ime/mojo/ime_struct_traits_test.mojom +++ b/ui/base/ime/mojo/ime_struct_traits_test.mojom
@@ -9,7 +9,5 @@ interface IMEStructTraitsTest { [Sync] EchoTextInputType(TextInputType in) => (TextInputType out); - [Sync] - EchoTextInputMode(TextInputMode in) => (TextInputMode out); };
diff --git a/ui/base/ime/mojo/ime_struct_traits_unittest.cc b/ui/base/ime/mojo/ime_struct_traits_unittest.cc index 34e14de..e261476 100644 --- a/ui/base/ime/mojo/ime_struct_traits_unittest.cc +++ b/ui/base/ime/mojo/ime_struct_traits_unittest.cc
@@ -8,12 +8,9 @@ #include "base/message_loop/message_loop.h" #include "base/stl_util.h" -#include "base/strings/utf_string_conversions.h" -#include "mojo/public/cpp/base/string16_mojom_traits.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/ime/mojo/ime_struct_traits_test.mojom.h" -#include "ui/gfx/range/mojo/range_struct_traits.h" namespace ui { @@ -33,10 +30,6 @@ private: // mojom::IMEStructTraitsTest: - void EchoTextInputMode(ui::TextInputMode in, - EchoTextInputModeCallback callback) override { - std::move(callback).Run(in); - } void EchoTextInputType(ui::TextInputType in, EchoTextInputTypeCallback callback) override { std::move(callback).Run(in); @@ -50,23 +43,6 @@ } // namespace -TEST_F(IMEStructTraitsTest, TextInputMode) { - const ui::TextInputMode kTextInputModes[] = { - ui::TEXT_INPUT_MODE_DEFAULT, ui::TEXT_INPUT_MODE_NONE, - ui::TEXT_INPUT_MODE_TEXT, ui::TEXT_INPUT_MODE_TEL, - ui::TEXT_INPUT_MODE_URL, ui::TEXT_INPUT_MODE_EMAIL, - ui::TEXT_INPUT_MODE_NUMERIC, ui::TEXT_INPUT_MODE_DECIMAL, - ui::TEXT_INPUT_MODE_SEARCH, - }; - - mojom::IMEStructTraitsTestPtr proxy = GetTraitsTestProxy(); - for (size_t i = 0; i < base::size(kTextInputModes); i++) { - ui::TextInputMode mode_out; - ASSERT_TRUE(proxy->EchoTextInputMode(kTextInputModes[i], &mode_out)); - EXPECT_EQ(kTextInputModes[i], mode_out); - } -} - TEST_F(IMEStructTraitsTest, TextInputType) { const ui::TextInputType kTextInputTypes[] = { ui::TEXT_INPUT_TYPE_NONE, @@ -96,25 +72,4 @@ } } -TEST_F(IMEStructTraitsTest, CompositionText) { - ui::CompositionText input; - input.text = base::UTF8ToUTF16("abcdefghij"); - ui::ImeTextSpan ime_text_span_1(ui::ImeTextSpan::Type::kComposition, 0, 2, - ui::ImeTextSpan::Thickness::kThin); - ime_text_span_1.underline_color = SK_ColorGRAY; - input.ime_text_spans.push_back(ime_text_span_1); - ui::ImeTextSpan ime_text_span_2(ui::ImeTextSpan::Type::kComposition, 3, 6, - ui::ImeTextSpan::Thickness::kThick, - SK_ColorGREEN); - ime_text_span_2.underline_color = SK_ColorRED; - input.ime_text_spans.push_back(ime_text_span_2); - input.selection = gfx::Range(1, 7); - - ui::CompositionText output; - EXPECT_TRUE(mojom::CompositionText::Deserialize( - mojom::CompositionText::Serialize(&input), &output)); - - EXPECT_EQ(input, output); -} - } // namespace ui
diff --git a/ui/base/ime/mojo/ime_types.mojom b/ui/base/ime/mojo/ime_types.mojom index c575a30..2dd665a 100644 --- a/ui/base/ime/mojo/ime_types.mojom +++ b/ui/base/ime/mojo/ime_types.mojom
@@ -5,7 +5,6 @@ module ui.mojom; import "mojo/public/mojom/base/string16.mojom"; -import "ui/gfx/range/mojo/range.mojom"; // Text input type which is based on blink::WebTextInputType. enum TextInputType { @@ -29,35 +28,6 @@ MAX = DATE_TIME_FIELD, }; -// See comments for ui::TextInputMode for more details. -enum TextInputMode { - kDefault, - kNone, - kText, - kTel, - kUrl, - kEmail, - kNumeric, - kDecimal, - kSearch, -}; - -// Text input flag which is based on blink::WebTextInputFlags. -enum TextInputFlag { - NONE, - AUTOCOMPLETE_ON = 0x001, - AUTOCOMPLETE_OFF = 0x002, - AUTOCORRECT_ON = 0x004, - AUTOCORRECT_OFF = 0x008, - SPELLCHECK_ON = 0x010, - SPELLCHECK_OFF = 0x020, - AUTOCAPITALIZE_NONE = 0x040, - AUTOCAPITALIZE_CHARACTERS = 0x080, - AUTOCAPITALIZE_WORDS = 0x100, - AUTOCAPITALIZE_SENTENCES = 0x200, - ALL = 0x3FF, -}; - // See comments for ui::ImeTextSpan::Type for more details. enum ImeTextSpanType { kComposition, @@ -90,21 +60,3 @@ bool remove_on_finish_composing; array<string> suggestions; }; - -// Represents a text currently being composed by IME. Corresponds to -// ui::CompositionText. -struct CompositionText { - mojo_base.mojom.String16 text; - array<ImeTextSpan> ime_text_spans; - gfx.mojom.Range selection; -}; - -// Represents how a text client gets focused. Corresponds to -// ui::TextInputClient::FocusReason. -enum FocusReason { - kNone, // Not focused. - kMouse, // User initiated with mouse. - kTouch, // User initiated with touch. - kPen, // User initiated with pen. - kOther, // All other reasons (e.g. system initiated, mouse) -};
diff --git a/ui/base/ime/mojo/ime_types.typemap b/ui/base/ime/mojo/ime_types.typemap index acdc8fff..1ed364c0c 100644 --- a/ui/base/ime/mojo/ime_types.typemap +++ b/ui/base/ime/mojo/ime_types.typemap
@@ -4,10 +4,7 @@ mojom = "//ui/base/ime/mojo/ime_types.mojom" public_headers = [ - "//ui/base/ime/composition_text.h", "//ui/base/ime/ime_text_span.h", - "//ui/base/ime/text_input_client.h", - "//ui/base/ime/text_input_mode.h", "//ui/base/ime/text_input_type.h", ] traits_headers = [ "//ui/base/ime/mojo/ime_types_struct_traits.h" ] @@ -22,10 +19,7 @@ ] type_mappings = [ - "ui.mojom.CompositionText=ui::CompositionText", - "ui.mojom.FocusReason=ui::TextInputClient::FocusReason", "ui.mojom.ImeTextSpan=ui::ImeTextSpan", "ui.mojom.ImeTextSpanThickness=ui::ImeTextSpan::Thickness", "ui.mojom.TextInputType=ui::TextInputType", - "ui.mojom.TextInputMode=ui::TextInputMode", ]
diff --git a/ui/base/ime/mojo/ime_types_struct_traits.cc b/ui/base/ime/mojo/ime_types_struct_traits.cc index 3bdd895..4e9de61 100644 --- a/ui/base/ime/mojo/ime_types_struct_traits.cc +++ b/ui/base/ime/mojo/ime_types_struct_traits.cc
@@ -4,9 +4,6 @@ #include "ui/base/ime/mojo/ime_types_struct_traits.h" -#include "mojo/public/cpp/base/string16_mojom_traits.h" -#include "ui/gfx/range/mojo/range_struct_traits.h" - namespace mojo { #define UI_TO_MOJO_TYPE_CASE(name) \ @@ -75,70 +72,6 @@ } // static -ui::mojom::TextInputMode -EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode>::ToMojom( - ui::TextInputMode text_input_mode) { - switch (text_input_mode) { - case ui::TEXT_INPUT_MODE_DEFAULT: - return ui::mojom::TextInputMode::kDefault; - case ui::TEXT_INPUT_MODE_NONE: - return ui::mojom::TextInputMode::kNone; - case ui::TEXT_INPUT_MODE_TEXT: - return ui::mojom::TextInputMode::kText; - case ui::TEXT_INPUT_MODE_TEL: - return ui::mojom::TextInputMode::kTel; - case ui::TEXT_INPUT_MODE_URL: - return ui::mojom::TextInputMode::kUrl; - case ui::TEXT_INPUT_MODE_EMAIL: - return ui::mojom::TextInputMode::kEmail; - case ui::TEXT_INPUT_MODE_NUMERIC: - return ui::mojom::TextInputMode::kNumeric; - case ui::TEXT_INPUT_MODE_DECIMAL: - return ui::mojom::TextInputMode::kDecimal; - case ui::TEXT_INPUT_MODE_SEARCH: - return ui::mojom::TextInputMode::kSearch; - } - NOTREACHED(); - return ui::mojom::TextInputMode::kDefault; -} - -// static -bool EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode>::FromMojom( - ui::mojom::TextInputMode input, - ui::TextInputMode* out) { - switch (input) { - case ui::mojom::TextInputMode::kDefault: - *out = ui::TEXT_INPUT_MODE_DEFAULT; - return true; - case ui::mojom::TextInputMode::kNone: - *out = ui::TEXT_INPUT_MODE_NONE; - return true; - case ui::mojom::TextInputMode::kText: - *out = ui::TEXT_INPUT_MODE_TEXT; - return true; - case ui::mojom::TextInputMode::kTel: - *out = ui::TEXT_INPUT_MODE_TEL; - return true; - case ui::mojom::TextInputMode::kUrl: - *out = ui::TEXT_INPUT_MODE_URL; - return true; - case ui::mojom::TextInputMode::kEmail: - *out = ui::TEXT_INPUT_MODE_EMAIL; - return true; - case ui::mojom::TextInputMode::kNumeric: - *out = ui::TEXT_INPUT_MODE_NUMERIC; - return true; - case ui::mojom::TextInputMode::kDecimal: - *out = ui::TEXT_INPUT_MODE_DECIMAL; - return true; - case ui::mojom::TextInputMode::kSearch: - *out = ui::TEXT_INPUT_MODE_SEARCH; - return true; - } - return false; -} - -// static bool StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan>::Read( ui::mojom::ImeTextSpanDataView data, ui::ImeTextSpan* out) { @@ -160,61 +93,6 @@ } // static -bool StructTraits<ui::mojom::CompositionTextDataView, ui::CompositionText>:: - Read(ui::mojom::CompositionTextDataView data, ui::CompositionText* out) { - return !data.is_null() && data.ReadText(&out->text) && - data.ReadImeTextSpans(&out->ime_text_spans) && - data.ReadSelection(&out->selection); -} - -// static -ui::mojom::FocusReason -EnumTraits<ui::mojom::FocusReason, ui::TextInputClient::FocusReason>::ToMojom( - ui::TextInputClient::FocusReason input) { - switch (input) { - case ui::TextInputClient::FOCUS_REASON_NONE: - return ui::mojom::FocusReason::kNone; - case ui::TextInputClient::FOCUS_REASON_MOUSE: - return ui::mojom::FocusReason::kMouse; - case ui::TextInputClient::FOCUS_REASON_TOUCH: - return ui::mojom::FocusReason::kTouch; - case ui::TextInputClient::FOCUS_REASON_PEN: - return ui::mojom::FocusReason::kPen; - case ui::TextInputClient::FOCUS_REASON_OTHER: - return ui::mojom::FocusReason::kOther; - } - - NOTREACHED(); - return ui::mojom::FocusReason::kNone; -} - -// static -bool EnumTraits<ui::mojom::FocusReason, ui::TextInputClient::FocusReason>:: - FromMojom(ui::mojom::FocusReason input, - ui::TextInputClient::FocusReason* out) { - switch (input) { - case ui::mojom::FocusReason::kNone: - *out = ui::TextInputClient::FOCUS_REASON_NONE; - return true; - case ui::mojom::FocusReason::kMouse: - *out = ui::TextInputClient::FOCUS_REASON_MOUSE; - return true; - case ui::mojom::FocusReason::kTouch: - *out = ui::TextInputClient::FOCUS_REASON_TOUCH; - return true; - case ui::mojom::FocusReason::kPen: - *out = ui::TextInputClient::FOCUS_REASON_PEN; - return true; - case ui::mojom::FocusReason::kOther: - *out = ui::TextInputClient::FOCUS_REASON_OTHER; - return true; - } - - NOTREACHED(); - return false; -} - -// static ui::mojom::ImeTextSpanType EnumTraits<ui::mojom::ImeTextSpanType, ui::ImeTextSpan::Type>::ToMojom( ui::ImeTextSpan::Type ime_text_span_type) {
diff --git a/ui/base/ime/mojo/ime_types_struct_traits.h b/ui/base/ime/mojo/ime_types_struct_traits.h index dd0dde67..8e576da6 100644 --- a/ui/base/ime/mojo/ime_types_struct_traits.h +++ b/ui/base/ime/mojo/ime_types_struct_traits.h
@@ -7,11 +7,8 @@ #include <vector> -#include "ui/base/ime/composition_text.h" #include "ui/base/ime/ime_text_span.h" #include "ui/base/ime/mojo/ime_types.mojom.h" -#include "ui/base/ime/text_input_client.h" -#include "ui/base/ime/text_input_mode.h" #include "ui/base/ime/text_input_type.h" namespace mojo { @@ -23,32 +20,6 @@ }; template <> -struct EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode> { - static ui::mojom::TextInputMode ToMojom(ui::TextInputMode text_input_mode); - static bool FromMojom(ui::mojom::TextInputMode input, ui::TextInputMode* out); -}; - -template <> -struct StructTraits<ui::mojom::CompositionTextDataView, ui::CompositionText> { - static base::string16 text(const ui::CompositionText& c) { return c.text; } - static ui::ImeTextSpans ime_text_spans(const ui::CompositionText& c) { - return c.ime_text_spans; - } - static gfx::Range selection(const ui::CompositionText& c) { - return c.selection; - } - static bool Read(ui::mojom::CompositionTextDataView data, - ui::CompositionText* out); -}; - -template <> -struct EnumTraits<ui::mojom::FocusReason, ui::TextInputClient::FocusReason> { - static ui::mojom::FocusReason ToMojom(ui::TextInputClient::FocusReason input); - static bool FromMojom(ui::mojom::FocusReason input, - ui::TextInputClient::FocusReason* out); -}; - -template <> struct StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> { static ui::ImeTextSpan::Type type(const ui::ImeTextSpan& c) { return c.type; } static uint32_t start_offset(const ui::ImeTextSpan& c) {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb index 2a22d2b..ea9554c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -292,7 +292,7 @@ <translation id="4690246192099372265">స్వీడిష్</translation> <translation id="4693155481716051732">సుషి</translation> <translation id="4694604912444486114">కోతి</translation> -<translation id="4697043402264950621">ఫైల్ జాబితా <ph name="COLUMN_NAME" /> ప్రకారం ఆరోహణ క్రమంలో క్రమీకరించబడింది.</translation> +<translation id="4697043402264950621">ఫైల్ జాబితా <ph name="COLUMN_NAME" /> ప్రకారం ఆరోహణ క్రమంలో వర్గీకరించబడింది.</translation> <translation id="4711094779914110278">టర్కిష్</translation> <translation id="4713544552769165154">ఈ ఫైల్ Macintosh సాఫ్ట్వేర్ను ఉపయోగించే కంప్యూటర్ కోసం రూపొందించబడింది. ఇది Chrome OSను అమలు చేసే మీ పరికరానికి అనుకూలమైనది కాదు. దయచేసి తగిన ప్రత్యామ్నాయ యాప్ కోసం <ph name="BEGIN_LINK" />Chrome వెబ్ స్టోర్<ph name="END_LINK" />లో శోధించండి.<ph name="BEGIN_LINK_HELP" />మరింత తెలుసుకోండి<ph name="END_LINK_HELP" /></translation> <translation id="4724850507808590449"><ph name="FILE_COUNT" /> ఫోటోలు బ్యాకప్ చేయబడ్డాయి</translation> @@ -531,7 +531,7 @@ <translation id="7339898014177206373">కొత్త విండో</translation> <translation id="7348749398828259943">US వర్క్మాన్ అంతర్జాతీయ కీబోర్డ్</translation> <translation id="7359359531237882347"><ph name="NUMBER_OF_ITEMS" /> అంశాలను కాపీ చేస్తోంది...</translation> -<translation id="7375951387215729722">ఫైల్ జాబితా <ph name="COLUMN_NAME" /> ప్రకారం అవరోహణ క్రమంలో క్రమీకరించబడింది.</translation> +<translation id="7375951387215729722">ఫైల్ జాబితా <ph name="COLUMN_NAME" /> ప్రకారం అవరోహణ క్రమంలో వర్గీకరించబడింది.</translation> <translation id="7389722738210761877">థాయ్ కీబోర్డ్ (TIS 820-2531)</translation> <translation id="7396038720194014279">హిందీ కీబోర్డ్ (ఫొనెటిక్)</translation> <translation id="7417453074306512035">ఇథియోపిక్ కీబోర్డ్</translation>
diff --git a/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js b/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js index 4500c43..e773622 100644 --- a/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js +++ b/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js
@@ -421,11 +421,13 @@ * the first element, and so on. * @param {{shift: boolean, alt: boolean, ctrl: boolean}=} opt_keyModifiers * Object containing common key modifiers : shift, alt, and ctrl. + * @param {number=} opt_button Mouse button number as per spec, e.g.: 2 for + * right-click. * @return {boolean} True if the all events are sent to the target, false * otherwise. */ test.util.sync.fakeMouseClick = - (contentWindow, targetQuery, opt_keyModifiers) => { + (contentWindow, targetQuery, opt_keyModifiers, opt_button) => { const modifiers = opt_keyModifiers || {}; const props = { bubbles: true, @@ -435,6 +437,9 @@ shiftKey: modifiers.shift, altKey: modifiers.alt, }; + if (opt_button !== undefined) { + props.button = opt_button; + } const mouseOverEvent = new MouseEvent('mouseover', props); const resultMouseOver = test.util.sync.sendEvent(contentWindow, targetQuery, mouseOverEvent); @@ -507,28 +512,39 @@ }; /** - * Simulates a fake mouse click (right button, single click) on the element - * specified by |targetQuery|. + * Simulates a fake full mouse right-click on the element specified by + * |targetQuery|. + * + * It generates the sequence of the following MouseEvents: + * 1. mouseover + * 2. mousedown + * 3. mouseup + * 4. click + * 5. contextmenu * * @param {Window} contentWindow Window to be tested. * @param {string} targetQuery Query to specify the element. + * @param {{shift: boolean, alt: boolean, ctrl: boolean}=} opt_keyModifiers + * Object containing common key modifiers : shift, alt, and ctrl. * @return {boolean} True if the event is sent to the target, false * otherwise. */ -test.util.sync.fakeMouseRightClick = (contentWindow, targetQuery) => { - const mouseDownEvent = - new MouseEvent('mousedown', {bubbles: true, button: 2, composed: true}); - if (!test.util.sync.sendEvent(contentWindow, targetQuery, mouseDownEvent)) { - return false; - } +test.util.sync.fakeMouseRightClick = + (contentWindow, targetQuery, opt_keyModifiers) => { + const clickResult = test.util.sync.fakeMouseClick( + contentWindow, targetQuery, opt_keyModifiers, 2 /* right button */); + if (!clickResult) { + return false; + } - const contextMenuEvent = - new MouseEvent('contextmenu', {bubbles: true, composed: true}); - return test.util.sync.sendEvent(contentWindow, targetQuery, contextMenuEvent); -}; + const contextMenuEvent = + new MouseEvent('contextmenu', {bubbles: true, composed: true}); + return test.util.sync.sendEvent( + contentWindow, targetQuery, contextMenuEvent); + }; /** - * Simulates a fake touch event (touch start, touch end) on the element + * Simulates a fake touch event (touch start and touch end) on the element * specified by |targetQuery|. * * @param {Window} contentWindow Window to be tested. @@ -542,20 +558,12 @@ return false; } - const mouseDownEvent = - new MouseEvent('mousedown', {bubbles: true, button: 2, composed: true}); - if (!test.util.sync.sendEvent(contentWindow, targetQuery, mouseDownEvent)) { - return false; - } - const touchEndEvent = new TouchEvent('touchend'); if (!test.util.sync.sendEvent(contentWindow, targetQuery, touchEndEvent)) { return false; } - const contextMenuEvent = - new MouseEvent('contextmenu', {bubbles: true, composed: true}); - return test.util.sync.sendEvent(contentWindow, targetQuery, contextMenuEvent); + return true; }; /** @@ -895,3 +903,15 @@ test.util.sync.setPreferences = preferences => { chrome.fileManagerPrivate.setPreferences(preferences); }; + +/** + * Reports an enum metric. + * @param {string} name The metric name. + * @param {string} value The metric enumerator to record. + * @param {Array<string>} validValues An array containing the valid enumerators + * in order. + * + */ +test.util.sync.recordEnumMetric = (name, value, validValues) => { + metrics.recordEnum(name, value, validValues); +};
diff --git a/ui/file_manager/file_manager/test/BUILD.gn b/ui/file_manager/file_manager/test/BUILD.gn index 16cf61f..b233a5c7 100644 --- a/ui/file_manager/file_manager/test/BUILD.gn +++ b/ui/file_manager/file_manager/test/BUILD.gn
@@ -27,7 +27,6 @@ "js/strings.js", "menu.js", "progress_center.js", - "uma.js", ] args = [ "--output=" + rebase_path(output, root_build_dir) ] outputs = [ @@ -45,7 +44,6 @@ ":menu", ":plugin_vm", ":progress_center", - ":uma", ] } @@ -117,10 +115,3 @@ "//ui/webui/resources/js:webui_resource_test", ] } - -js_library("uma") { - deps = [ - "js:test_util", - "//ui/webui/resources/js:webui_resource_test", - ] -}
diff --git a/ui/file_manager/file_manager/test/uma.js b/ui/file_manager/file_manager/test/uma.js deleted file mode 100644 index ad62fe9..0000000 --- a/ui/file_manager/file_manager/test/uma.js +++ /dev/null
@@ -1,26 +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. - -const uma = {}; - -uma.testClickBreadcrumb = async (done) => { - await test.setupAndWaitUntilReady(); - - // Reset metrics. - chrome.metricsPrivate.userActions_ = []; - // Click first row which is 'photos' dir, wait for breadcrumb to show. - assertTrue(test.fakeMouseDoubleClick('#file-list li.table-row')); - await test.waitForElement( - '#location-breadcrumbs .breadcrumb-path:nth-of-type(2)'); - - // Click breadcrumb to return to parent dir. - assertTrue(test.fakeMouseClick( - '#location-breadcrumbs .breadcrumb-path:nth-of-type(1)')); - await test.waitForFiles(test.TestEntryInfo.getExpectedRows( - test.BASIC_MY_FILES_ENTRY_SET_WITH_LINUX_FILES)); - - assertArrayEquals( - ['FileBrowser.ClickBreadcrumbs'], chrome.metricsPrivate.userActions_); - done(); -};
diff --git a/ui/file_manager/integration_tests/file_manager/breadcrumbs.js b/ui/file_manager/integration_tests/file_manager/breadcrumbs.js new file mode 100644 index 0000000..a66721b --- /dev/null +++ b/ui/file_manager/integration_tests/file_manager/breadcrumbs.js
@@ -0,0 +1,30 @@ +// 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. +/** + * @fileoverview Tests that breadcrumbs work. + */ + +'use strict'; + +(() => { + testcase.breadcrumbsNavigate = async () => { + const files = [ENTRIES.hello, ENTRIES.photos]; + const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS, files, []); + + // Navigate to Downloads/photos. + await remoteCall.navigateWithDirectoryTree( + appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads'); + + // Use the breadcrumbs to navigate back to Downloads. + await remoteCall.waitAndClickElement( + appId, '#location-breadcrumbs .breadcrumb-path:nth-of-type(2)'); + + // Wait for the contents of Downloads to load again. + await remoteCall.waitForFiles(appId, TestEntryInfo.getExpectedRows(files)); + + // A user action should have been recorded for the breadcrumbs. + chrome.test.assertEq( + 1, await getUserActionCount('FileBrowser.ClickBreadcrumbs')); + }; +})();
diff --git a/ui/file_manager/integration_tests/file_manager/context_menu.js b/ui/file_manager/integration_tests/file_manager/context_menu.js index fc8ae98..30569fb8 100644 --- a/ui/file_manager/integration_tests/file_manager/context_menu.js +++ b/ui/file_manager/integration_tests/file_manager/context_menu.js
@@ -260,6 +260,9 @@ // Open FilesApp on Downloads. const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS); + // Click on the search button to display the search box. + await remoteCall.waitAndClickElement(appId, '#search-button'); + // Query all input elements. const elements = await remoteCall.callRemoteTestUtil( 'queryAllElements', appId, @@ -605,4 +608,4 @@ testcase.checkRenameEnabledInDocProvider = () => { return checkDocumentsProviderContextMenu( 'rename', 'Renamable File.txt', true); -}; \ No newline at end of file +};
diff --git a/ui/file_manager/integration_tests/file_manager/metrics.js b/ui/file_manager/integration_tests/file_manager/metrics.js new file mode 100644 index 0000000..daa494ac --- /dev/null +++ b/ui/file_manager/integration_tests/file_manager/metrics.js
@@ -0,0 +1,30 @@ +// 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. +/** + * @fileoverview Tests that enum metrics are recorded correctly. + */ + +'use strict'; + +(() => { + testcase.metricsRecordEnum = async () => { + const appId = null; + const histogramName = 'Foo'; + const fullHistogramName = `FileBrowser.${histogramName}`; + const validValues = ['a', 'b', 'c']; + const reports = []; + + // Record each enumerator once. + for (const value of validValues) { + reports.push(remoteCall.callRemoteTestUtil( + 'recordEnumMetric', appId, [histogramName, value, validValues])); + } + await Promise.all(reports); + + // Each bucket should contain exactly one sample. + for (let i = 0; i < validValues.length; ++i) { + chrome.test.assertEq(1, await getHistogramCount(fullHistogramName, i)); + } + }; +})();
diff --git a/ui/file_manager/integration_tests/file_manager_test_manifest.json b/ui/file_manager/integration_tests/file_manager_test_manifest.json index 9d33742..2c8da1a 100644 --- a/ui/file_manager/integration_tests/file_manager_test_manifest.json +++ b/ui/file_manager/integration_tests/file_manager_test_manifest.json
@@ -13,6 +13,7 @@ "test_util.js", "remote_call.js", "file_manager/background.js", + "file_manager/breadcrumbs.js", "file_manager/context_menu.js", "file_manager/copy_between_windows.js", "file_manager/create_new_folder.js", @@ -31,6 +32,7 @@ "file_manager/keyboard_operations.js", "file_manager/launcher_search.js", "file_manager/metadata.js", + "file_manager/metrics.js", "file_manager/my_files.js", "file_manager/navigation_list.js", "file_manager/open_audio_files.js",
diff --git a/ui/file_manager/integration_tests/test_util.js b/ui/file_manager/integration_tests/test_util.js index e902cc2e..19db92e0 100644 --- a/ui/file_manager/integration_tests/test_util.js +++ b/ui/file_manager/integration_tests/test_util.js
@@ -1230,3 +1230,29 @@ typeText: 'CRDOWNLOAD file' }), }; + +/** + * Returns the count for |value| for the histogram |name|. + * @param {string} name The histogram to be queried. + * @param {number} value The value within that histogram to query. + * @return {!Promise<number>} A promise fulfilled with the count. + */ +async function getHistogramCount(name, value) { + return JSON.parse(await sendTestMessage({ + 'name': 'getHistogramCount', + 'histogramName': name, + 'value': value, + })); +} + +/** + * Returns the count for the user action |name|. + * @param {string} name The user action to be queried. + * @return {!Promise<number>} A promise fulfilled with the count. + */ +async function getUserActionCount(name) { + return JSON.parse(await sendTestMessage({ + 'name': 'getUserActionCount', + 'userActionName': name, + })); +}
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc index 87fd631..b8cbbc3 100644 --- a/ui/gfx/render_text.cc +++ b/ui/gfx/render_text.cc
@@ -1698,9 +1698,11 @@ // the valid range. // |last_guess| is merely used to verify that we're not repeating guesses. const size_t last_guess = guess; - guess = lo + static_cast<size_t>(ToRoundedInt((available_width - lo_width) * - (hi - lo) / - (hi_width - lo_width))); + if (hi_width != lo_width) { + guess = lo + static_cast<size_t>( + ToRoundedInt((available_width - lo_width) * (hi - lo) / + (hi_width - lo_width))); + } guess = base::ClampToRange(guess, lo, hi); DCHECK_NE(last_guess, guess);
diff --git a/ui/ozone/platform/drm/host/drm_window_host.cc b/ui/ozone/platform/drm/host/drm_window_host.cc index 9b381904..2190f242 100644 --- a/ui/ozone/platform/drm/host/drm_window_host.cc +++ b/ui/ozone/platform/drm/host/drm_window_host.cc
@@ -134,10 +134,6 @@ cursor_->CommitBoundsChange(widget_, bounds_, bounds); } -PlatformImeController* DrmWindowHost::GetPlatformImeController() { - return nullptr; -} - void DrmWindowHost::SetRestoredBoundsInPixels(const gfx::Rect& bounds) { NOTREACHED(); }
diff --git a/ui/ozone/platform/drm/host/drm_window_host.h b/ui/ozone/platform/drm/host/drm_window_host.h index eae4e74..ca0aa336 100644 --- a/ui/ozone/platform/drm/host/drm_window_host.h +++ b/ui/ozone/platform/drm/host/drm_window_host.h
@@ -76,7 +76,6 @@ void SetCursor(PlatformCursor cursor) override; void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; - PlatformImeController* GetPlatformImeController() override; void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override; gfx::Rect GetRestoredBoundsInPixels() const override;
diff --git a/ui/ozone/platform/scenic/scenic_window.cc b/ui/ozone/platform/scenic/scenic_window.cc index 167369bf..91f0a445 100644 --- a/ui/ozone/platform/scenic/scenic_window.cc +++ b/ui/ozone/platform/scenic/scenic_window.cc
@@ -150,11 +150,6 @@ NOTIMPLEMENTED(); } -PlatformImeController* ScenicWindow::GetPlatformImeController() { - NOTIMPLEMENTED(); - return nullptr; -} - void ScenicWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) { NOTIMPLEMENTED(); }
diff --git a/ui/ozone/platform/scenic/scenic_window.h b/ui/ozone/platform/scenic/scenic_window.h index f4ca357..ad743a3 100644 --- a/ui/ozone/platform/scenic/scenic_window.h +++ b/ui/ozone/platform/scenic/scenic_window.h
@@ -60,7 +60,6 @@ void SetCursor(PlatformCursor cursor) override; void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; - PlatformImeController* GetPlatformImeController() override; void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override; gfx::Rect GetRestoredBoundsInPixels() const override;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 3d4229f4..153c8e87 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -452,11 +452,6 @@ NOTIMPLEMENTED(); } -PlatformImeController* WaylandWindow::GetPlatformImeController() { - NOTIMPLEMENTED(); - return nullptr; -} - void WaylandWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) { restored_bounds_ = bounds; }
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 3d46ba1f..be9bb33 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -121,7 +121,6 @@ void SetCursor(PlatformCursor cursor) override; void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; - PlatformImeController* GetPlatformImeController() override; void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override; gfx::Rect GetRestoredBoundsInPixels() const override;
diff --git a/ui/platform_window/BUILD.gn b/ui/platform_window/BUILD.gn index 028daa6..21f48b5 100644 --- a/ui/platform_window/BUILD.gn +++ b/ui/platform_window/BUILD.gn
@@ -6,19 +6,15 @@ source_set("platform_window") { sources = [ - "platform_ime_controller.h", "platform_window.h", "platform_window_delegate.h", "platform_window_init_properties.cc", "platform_window_init_properties.h", - "text_input_state.cc", - "text_input_state.h", ] deps = [ "//base", "//ui/base", - "//ui/base/ime:text_input_types", "//ui/gfx", ] @@ -40,12 +36,7 @@ public_deps = [ "//ui/platform_window/stub", ] - if (is_android) { - public_deps += [ - "//ui/platform_window/android", - "//ui/platform_window/android:jni_headers", - ] - } else if (use_x11) { + if (use_x11) { public_deps += [ "//ui/platform_window/x11" ] } else if (is_win) { public_deps += [ "//ui/platform_window/win" ]
diff --git a/ui/platform_window/android/BUILD.gn b/ui/platform_window/android/BUILD.gn deleted file mode 100644 index b9708a6..0000000 --- a/ui/platform_window/android/BUILD.gn +++ /dev/null
@@ -1,56 +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. - -import("//build/config/android/rules.gni") -import("//build/config/jumbo.gni") -import("//testing/test.gni") - -assert(is_android) - -jumbo_component("android") { - output_name = "android_window" - sources = [ - "android_window_export.h", - "platform_ime_controller_android.cc", - "platform_ime_controller_android.h", - "platform_window_android.cc", - "platform_window_android.h", - ] - - defines = [ "ANDROID_WINDOW_IMPLEMENTATION" ] - - deps = [ - ":jni_headers", - ":platform_window_java", - "//base", - "//skia", - "//ui/events:dom_keycode_converter", - "//ui/events:events", - "//ui/events:events_base", - "//ui/gfx", - "//ui/gfx/geometry", - "//ui/platform_window", - "//ui/platform_window/stub", - ] - - libs = [ "android" ] -} - -generate_jni("jni_headers") { - sources = [ - "java/src/org/chromium/ui/PlatformImeControllerAndroid.java", - "java/src/org/chromium/ui/PlatformWindowAndroid.java", - ] - jni_package = "android_window" -} - -android_library("platform_window_java") { - java_files = [ - "java/src/org/chromium/ui/PlatformImeControllerAndroid.java", - "java/src/org/chromium/ui/PlatformWindowAndroid.java", - ] - deps = [ - "//base:base_java", - ] -}
diff --git a/ui/platform_window/android/DEPS b/ui/platform_window/android/DEPS deleted file mode 100644 index 50b51c4..0000000 --- a/ui/platform_window/android/DEPS +++ /dev/null
@@ -1,5 +0,0 @@ -include_rules = [ - "+jni", - "+ui/events", - "+ui/gfx", -]
diff --git a/ui/platform_window/android/android_window_export.h b/ui/platform_window/android/android_window_export.h deleted file mode 100644 index 11df98c..0000000 --- a/ui/platform_window/android/android_window_export.h +++ /dev/null
@@ -1,30 +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 UI_PLATFORM_WINDOW_ANDROID_ANDROID_WINDOW_EXPORT_H_ -#define UI_PLATFORM_WINDOW_ANDROID_ANDROID_WINDOW_EXPORT_H_ - -#if defined(COMPONENT_BUILD) -#if defined(WIN32) - -#if defined(ANDROID_WINDOW_IMPLEMENTATION) -#define ANDROID_WINDOW_EXPORT __declspec(dllexport) -#else -#define ANDROID_WINDOW_EXPORT __declspec(dllimport) -#endif // defined(ANDROID_WINDOW_IMPLEMENTATION) - -#else // defined(WIN32) -#if defined(ANDROID_WINDOW_IMPLEMENTATION) -#define ANDROID_WINDOW_EXPORT __attribute__((visibility("default"))) -#else -#define ANDROID_WINDOW_EXPORT -#endif -#endif - -#else // defined(COMPONENT_BUILD) -#define ANDROID_WINDOW_EXPORT -#endif - -#endif // UI_PLATFORM_WINDOW_ANDROID_ANDROID_WINDOW_EXPORT_H_ -
diff --git a/ui/platform_window/android/java/src/org/chromium/ui/PlatformImeControllerAndroid.java b/ui/platform_window/android/java/src/org/chromium/ui/PlatformImeControllerAndroid.java deleted file mode 100644 index e81c1e7..0000000 --- a/ui/platform_window/android/java/src/org/chromium/ui/PlatformImeControllerAndroid.java +++ /dev/null
@@ -1,107 +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. - -package org.chromium.ui; - -import android.content.Context; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; - -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.JNINamespace; - -/** - * Exposes IME related code to native code. - */ -@JNINamespace("ui") -class PlatformImeControllerAndroid { - private int mInputType; - private int mInputFlags; - private String mText = ""; - private int mSelectionStart; - private int mSelectionEnd; - private int mCompositionStart; - private int mCompositionEnd; - - private final PlatformWindowAndroid mWindow; - private final long mNativeHandle; - private final InputMethodManager mInputMethodManager; - private InputConnection mInputConnection; - - PlatformImeControllerAndroid(PlatformWindowAndroid window, long nativeHandle) { - mWindow = window; - mNativeHandle = nativeHandle; - mInputMethodManager = (InputMethodManager) mWindow.getContext().getSystemService( - Context.INPUT_METHOD_SERVICE); - assert mNativeHandle != 0; - nativeInit(mNativeHandle); - } - - boolean isTextEditorType() { - return mInputType != 0; - } - - InputConnection onCreateInputConnection(EditorInfo outAttrs) { - if (mInputType == 0) { - // Although onCheckIsTextEditor will return false in this case, the EditorInfo - // is still used by the InputMethodService. Need to make sure the IME doesn't - // enter fullscreen mode. - outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN; - } - - // TODO(penghuang): Support full editor. - final boolean fullEditor = false; - mInputConnection = new BaseInputConnection(mWindow, fullEditor); - outAttrs.actionLabel = null; - // TODO(penghuang): Pass blink text input type to Android framework. - outAttrs.inputType = - EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT; - outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN - | EditorInfo.IME_ACTION_GO; - return mInputConnection; - } - - @CalledByNative - private void updateTextInputState(int textInputType, int textInputFlags, String text, - int selectionStart, int selectionEnd, int compositionStart, int compositionEnd) { - mInputType = textInputType; - mInputFlags = textInputFlags; - mText = text; - mSelectionStart = selectionStart; - mSelectionEnd = selectionEnd; - mCompositionStart = compositionStart; - mCompositionEnd = compositionEnd; - // Update keyboard visibility - if (mInputType == 0) { - dismissInput(); - } - } - - @CalledByNative - private void setImeVisibility(boolean visible) { - // The IME is visible only if |mInputType| isn't 0, so we don't need - // change the visibility if |mInputType| is 0. - if (mInputType != 0) { - if (visible) { - showKeyboard(); - } else { - dismissInput(); - } - } - } - - private void showKeyboard() { - mInputMethodManager.showSoftInput(mWindow, 0); - } - - private void dismissInput() { - mInputMethodManager.hideSoftInputFromWindow(mWindow.getWindowToken(), 0); - } - - // The generated native method implementation will call - // PlatformImeControllerAndroid::Init(JNIEnv* env, jobject self) - private native void nativeInit(long nativePlatformImeControllerAndroid); -}
diff --git a/ui/platform_window/android/java/src/org/chromium/ui/PlatformWindowAndroid.java b/ui/platform_window/android/java/src/org/chromium/ui/PlatformWindowAndroid.java deleted file mode 100644 index 26810ff..0000000 --- a/ui/platform_window/android/java/src/org/chromium/ui/PlatformWindowAndroid.java +++ /dev/null
@@ -1,207 +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. - -package org.chromium.ui; - -import android.app.Activity; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.View; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; - -import org.chromium.base.ContextUtils; -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.JNINamespace; - -/** - * Exposes SurfaceView to native code. - */ -@JNINamespace("ui") -public class PlatformWindowAndroid extends SurfaceView { - - private long mNativeMojoViewport; - private final SurfaceHolder.Callback mSurfaceCallback; - private final PlatformImeControllerAndroid mImeController; - - @CalledByNative - public static PlatformWindowAndroid createForActivity( - long nativeViewport, long nativeImeController) { - PlatformWindowAndroid rv = new PlatformWindowAndroid(nativeViewport, nativeImeController); - ((Activity) ContextUtils.getApplicationContext()).setContentView(rv); - return rv; - } - - private PlatformWindowAndroid(long nativeViewport, long nativeImeController) { - super(ContextUtils.getApplicationContext()); - - setFocusable(true); - setFocusableInTouchMode(true); - - mNativeMojoViewport = nativeViewport; - assert mNativeMojoViewport != 0; - - final float density = - ContextUtils.getApplicationContext().getResources().getDisplayMetrics().density; - - mSurfaceCallback = new SurfaceHolder.Callback() { - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - assert mNativeMojoViewport != 0; - nativeSurfaceSetSize(mNativeMojoViewport, width, height, density); - } - - @Override - public void surfaceCreated(SurfaceHolder holder) { - assert mNativeMojoViewport != 0; - nativeSurfaceCreated(mNativeMojoViewport, holder.getSurface(), density); - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) { - assert mNativeMojoViewport != 0; - nativeSurfaceDestroyed(mNativeMojoViewport); - } - }; - getHolder().addCallback(mSurfaceCallback); - - mImeController = new PlatformImeControllerAndroid(this, nativeImeController); - } - - @CalledByNative - public void detach() { - getHolder().removeCallback(mSurfaceCallback); - mNativeMojoViewport = 0; - } - - @Override - protected void onWindowVisibilityChanged(int visibility) { - super.onWindowVisibilityChanged(visibility); - if (visibility == View.VISIBLE) { - requestFocusFromTouch(); - requestFocus(); - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - final int actionMasked = event.getActionMasked(); - if (actionMasked == MotionEvent.ACTION_POINTER_DOWN - || actionMasked == MotionEvent.ACTION_POINTER_UP) { - // Up/down events identify a single point. - return notifyTouchEventAtIndex(event, event.getActionIndex()); - } - assert event.getPointerCount() != 0; - // All other types can have more than one point. - boolean result = false; - for (int i = 0, count = event.getPointerCount(); i < count; i++) { - final boolean sub_result = notifyTouchEventAtIndex(event, i); - result |= sub_result; - } - return result; - } - - @Override - public boolean onCheckIsTextEditor() { - return mImeController.isTextEditorType(); - } - - @Override - public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - return mImeController.onCreateInputConnection(outAttrs); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (privateDispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEvent(event); - } - - @Override - public boolean dispatchKeyEventPreIme(KeyEvent event) { - if (privateDispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEventPreIme(event); - } - - @Override - public boolean dispatchKeyShortcutEvent(KeyEvent event) { - if (privateDispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyShortcutEvent(event); - } - - private boolean notifyTouchEventAtIndex(MotionEvent event, int index) { - float touchMajor = event.getTouchMajor(index); - float touchMinor = event.getTouchMinor(index); - if (touchMajor < touchMinor) { - float tmp = touchMajor; - touchMajor = touchMinor; - touchMinor = tmp; - } - - return nativeTouchEvent(mNativeMojoViewport, event.getEventTime(), event.getActionMasked(), - event.getPointerId(index), event.getX(index), event.getY(index), - event.getPressure(index), touchMajor, touchMinor, - event.getOrientation(index), event.getAxisValue(MotionEvent.AXIS_HSCROLL, index), - event.getAxisValue(MotionEvent.AXIS_VSCROLL, index)); - } - - private boolean privateDispatchKeyEvent(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_MULTIPLE) { - boolean result = false; - if (event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN && event.getCharacters() != null) { - String characters = event.getCharacters(); - for (int i = 0; i < characters.length(); ++i) { - char c = characters.charAt(i); - int codepoint = c; - if (codepoint >= Character.MIN_SURROGATE - && codepoint < (Character.MAX_SURROGATE + 1)) { - i++; - char c2 = characters.charAt(i); - codepoint = Character.toCodePoint(c, c2); - } - result |= nativeKeyEvent(mNativeMojoViewport, true, 0, codepoint); - result |= nativeKeyEvent(mNativeMojoViewport, false, 0, codepoint); - } - } else { - for (int i = 0; i < event.getRepeatCount(); ++i) { - result |= nativeKeyEvent( - mNativeMojoViewport, true, event.getKeyCode(), event.getUnicodeChar()); - result |= nativeKeyEvent( - mNativeMojoViewport, false, event.getKeyCode(), event.getUnicodeChar()); - } - } - return result; - } else { - return nativeKeyEvent(mNativeMojoViewport, event.getAction() == KeyEvent.ACTION_DOWN, - event.getKeyCode(), event.getUnicodeChar()); - } - } - - private static native void nativeDestroy(long nativePlatformWindowAndroid); - - private static native void nativeSurfaceCreated( - long nativePlatformWindowAndroid, Surface surface, float devicePixelRatio); - - private static native void nativeSurfaceDestroyed( - long nativePlatformWindowAndroid); - - private static native void nativeSurfaceSetSize( - long nativePlatformWindowAndroid, int width, int height, float density); - - private static native boolean nativeTouchEvent(long nativePlatformWindowAndroid, long timeMs, - int maskedAction, int pointerId, float x, float y, float pressure, float touchMajor, - float touchMinor, float orientation, float hWheel, float vWheel); - - private static native boolean nativeKeyEvent( - long nativePlatformWindowAndroid, boolean pressed, int keyCode, int unicodeCharacter); -}
diff --git a/ui/platform_window/android/platform_ime_controller_android.cc b/ui/platform_window/android/platform_ime_controller_android.cc deleted file mode 100644 index 99cf38f..0000000 --- a/ui/platform_window/android/platform_ime_controller_android.cc +++ /dev/null
@@ -1,51 +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. - -#include "ui/platform_window/android/platform_ime_controller_android.h" - -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "jni/PlatformImeControllerAndroid_jni.h" - -using base::android::JavaParamRef; -using base::android::ScopedJavaLocalRef; - -namespace ui { - -PlatformImeControllerAndroid::PlatformImeControllerAndroid() { -} - -PlatformImeControllerAndroid::~PlatformImeControllerAndroid() { -} - -void PlatformImeControllerAndroid::Init(JNIEnv* env, - const JavaParamRef<jobject>& jobj) { - DCHECK(java_platform_ime_controller_android_.is_uninitialized()); - java_platform_ime_controller_android_ = JavaObjectWeakGlobalRef(env, jobj); -} - -void PlatformImeControllerAndroid::UpdateTextInputState( - const TextInputState& state) { - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jobject> scoped_obj = - java_platform_ime_controller_android_.get(env); - if (scoped_obj.is_null()) - return; - Java_PlatformImeControllerAndroid_updateTextInputState( - env, scoped_obj, state.type, state.flags, - base::android::ConvertUTF8ToJavaString(env, state.text), - state.selection_start, state.selection_end, state.composition_start, - state.composition_end); -} - -void PlatformImeControllerAndroid::SetImeVisibility(bool visible) { - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jobject> scoped_obj = - java_platform_ime_controller_android_.get(env); - if (scoped_obj.is_null()) - return; - Java_PlatformImeControllerAndroid_setImeVisibility(env, scoped_obj, visible); -} - -} // namespace ui
diff --git a/ui/platform_window/android/platform_ime_controller_android.h b/ui/platform_window/android/platform_ime_controller_android.h deleted file mode 100644 index ed47c62..0000000 --- a/ui/platform_window/android/platform_ime_controller_android.h +++ /dev/null
@@ -1,36 +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 UI_PLATFORM_WINDOW_ANDROID_PLATFORM_IME_CONTROLLER_ANDROID_H_ -#define UI_PLATFORM_WINDOW_ANDROID_PLATFORM_IME_CONTROLLER_ANDROID_H_ - -#include "base/android/jni_weak_ref.h" -#include "base/macros.h" -#include "ui/platform_window/android/android_window_export.h" -#include "ui/platform_window/platform_ime_controller.h" - -namespace ui { - -class ANDROID_WINDOW_EXPORT PlatformImeControllerAndroid : - public PlatformImeController { - public: - PlatformImeControllerAndroid(); - ~PlatformImeControllerAndroid() override; - - // Native methods called by Java code. - void Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj); - - private: - // Overridden from PlatformImeController: - void UpdateTextInputState(const TextInputState& state) override; - void SetImeVisibility(bool visible) override; - - JavaObjectWeakGlobalRef java_platform_ime_controller_android_; - - DISALLOW_COPY_AND_ASSIGN(PlatformImeControllerAndroid); -}; - -} // namespace ui - -#endif // UI_PLATFORM_WINDOW_ANDROID_PLATFORM_IME_CONTROLLER_ANDROID_H_
diff --git a/ui/platform_window/android/platform_window_android.cc b/ui/platform_window/android/platform_window_android.cc deleted file mode 100644 index 25f80458e..0000000 --- a/ui/platform_window/android/platform_window_android.cc +++ /dev/null
@@ -1,183 +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. - -#include "ui/platform_window/android/platform_window_android.h" - -#include <android/input.h> -#include <android/native_window_jni.h> - -#include "base/android/jni_android.h" -#include "jni/PlatformWindowAndroid_jni.h" -#include "ui/events/event.h" -#include "ui/events/keycodes/dom/dom_code.h" -#include "ui/events/keycodes/keyboard_code_conversion_android.h" -#include "ui/gfx/geometry/point.h" -#include "ui/platform_window/platform_window_delegate.h" - -using base::android::JavaParamRef; -using base::android::ScopedJavaLocalRef; - -namespace ui { - -namespace { - -ui::EventType MotionEventActionToEventType(jint action) { - switch (action) { - case AMOTION_EVENT_ACTION_DOWN: - case AMOTION_EVENT_ACTION_POINTER_DOWN: - return ui::ET_TOUCH_PRESSED; - case AMOTION_EVENT_ACTION_UP: - case AMOTION_EVENT_ACTION_POINTER_UP: - return ui::ET_TOUCH_RELEASED; - case AMOTION_EVENT_ACTION_MOVE: - return ui::ET_TOUCH_MOVED; - case AMOTION_EVENT_ACTION_CANCEL: - return ui::ET_TOUCH_CANCELLED; - case AMOTION_EVENT_ACTION_OUTSIDE: - case AMOTION_EVENT_ACTION_HOVER_MOVE: - case AMOTION_EVENT_ACTION_SCROLL: - case AMOTION_EVENT_ACTION_HOVER_ENTER: - case AMOTION_EVENT_ACTION_HOVER_EXIT: - default: - NOTIMPLEMENTED() << "Unimplemented motion action: " << action; - } - return ui::ET_UNKNOWN; -} - -} // namespace - -//////////////////////////////////////////////////////////////////////////////// -// PlatformWindowAndroid, public: - -PlatformWindowAndroid::PlatformWindowAndroid(PlatformWindowDelegate* delegate) - : StubWindow(delegate, false), window_(nullptr) {} - -PlatformWindowAndroid::~PlatformWindowAndroid() { - if (window_) - ReleaseWindow(); - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jobject> scoped_obj = - java_platform_window_android_.get(env); - if (!scoped_obj.is_null()) { - Java_PlatformWindowAndroid_detach(env, scoped_obj); - } -} - -void PlatformWindowAndroid::Destroy(JNIEnv* env, - const JavaParamRef<jobject>& obj) { - delegate()->OnClosed(); -} - -void PlatformWindowAndroid::SurfaceCreated( - JNIEnv* env, - const JavaParamRef<jobject>& obj, - const JavaParamRef<jobject>& jsurface, - float device_pixel_ratio) { - // Note: This ensures that any local references used by - // ANativeWindow_fromSurface are released immediately. This is needed as a - // workaround for https://code.google.com/p/android/issues/detail?id=68174 - { - base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); - window_ = ANativeWindow_fromSurface(env, jsurface); - } - delegate()->OnAcceleratedWidgetAvailable(window_); -} - -void PlatformWindowAndroid::SurfaceDestroyed(JNIEnv* env, - const JavaParamRef<jobject>& obj) { - DCHECK(window_); - delegate()->OnAcceleratedWidgetDestroyed(); - ReleaseWindow(); -} - -void PlatformWindowAndroid::SurfaceSetSize(JNIEnv* env, - const JavaParamRef<jobject>& obj, - jint width, - jint height, - jfloat density) { - size_ = gfx::Size(static_cast<int>(width), static_cast<int>(height)); - delegate()->OnBoundsChanged(gfx::Rect(size_)); -} - -bool PlatformWindowAndroid::TouchEvent(JNIEnv* env, - const JavaParamRef<jobject>& obj, - jlong time_ms, - jint masked_action, - jint pointer_id, - jfloat x, - jfloat y, - jfloat pressure, - jfloat touch_major, - jfloat touch_minor, - jfloat orientation, - jfloat h_wheel, - jfloat v_wheel) { - ui::EventType event_type = MotionEventActionToEventType(masked_action); - if (event_type == ui::ET_UNKNOWN) - return false; - ui::TouchEvent touch( - event_type, gfx::Point(), - base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms), - ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, pointer_id, - touch_major, touch_minor, pressure, orientation), - ui::EF_NONE); - touch.set_location_f(gfx::PointF(x, y)); - touch.set_root_location_f(gfx::PointF(x, y)); - delegate()->DispatchEvent(&touch); - return true; -} - -bool PlatformWindowAndroid::KeyEvent(JNIEnv* env, - const JavaParamRef<jobject>& obj, - bool pressed, - jint key_code, - jint unicode_character) { - ui::KeyEvent key_event(pressed ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED, - ui::KeyboardCodeFromAndroidKeyCode(key_code), 0); - delegate()->DispatchEvent(&key_event); - if (pressed && unicode_character) { - ui::KeyEvent char_event(unicode_character, - ui::KeyboardCodeFromAndroidKeyCode(key_code), - ui::DomCode::NONE, 0); - delegate()->DispatchEvent(&char_event); - } - return true; -} - -void PlatformWindowAndroid::ReleaseWindow() { - ANativeWindow_release(window_); - window_ = NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -// PlatformWindowAndroid, PlatformWindow implementation: - -void PlatformWindowAndroid::Show() { - if (!java_platform_window_android_.is_uninitialized()) - return; - JNIEnv* env = base::android::AttachCurrentThread(); - java_platform_window_android_ = JavaObjectWeakGlobalRef( - env, Java_PlatformWindowAndroid_createForActivity( - env, reinterpret_cast<jlong>(this), - reinterpret_cast<jlong>(&platform_ime_controller_)) - .obj()); -} - -void PlatformWindowAndroid::Hide() { - // Nothing to do. View is always visible. -} - -void PlatformWindowAndroid::SetBounds(const gfx::Rect& bounds) { - NOTIMPLEMENTED(); -} - -gfx::Rect PlatformWindowAndroid::GetBounds() { - return gfx::Rect(size_); -} - -PlatformImeController* PlatformWindowAndroid::GetPlatformImeController() { - return &platform_ime_controller_; -} - -} // namespace ui
diff --git a/ui/platform_window/android/platform_window_android.h b/ui/platform_window/android/platform_window_android.h deleted file mode 100644 index ec1f5a1..0000000 --- a/ui/platform_window/android/platform_window_android.h +++ /dev/null
@@ -1,83 +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 UI_PLATFORM_WINDOW_ANDROID_PLATFORM_WINDOW_ANDROID_H_ -#define UI_PLATFORM_WINDOW_ANDROID_PLATFORM_WINDOW_ANDROID_H_ - -#include "base/android/jni_weak_ref.h" -#include "base/macros.h" -#include "ui/events/event_constants.h" -#include "ui/gfx/geometry/rect.h" -#include "ui/gfx/geometry/size.h" -#include "ui/platform_window/android/android_window_export.h" -#include "ui/platform_window/android/platform_ime_controller_android.h" -#include "ui/platform_window/stub/stub_window.h" - -struct ANativeWindow; - -namespace ui { - -class PlatformWindowDelegate; - -// NOTE: This class extends StubWindow because it's very much a work in -// progress. If we make it real then it should subclass PlatformWindow directly. -class ANDROID_WINDOW_EXPORT PlatformWindowAndroid : public StubWindow { - public: - explicit PlatformWindowAndroid(PlatformWindowDelegate* delegate); - ~PlatformWindowAndroid() override; - - void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); - void SurfaceCreated(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jobject>& jsurface, - float device_pixel_ratio); - void SurfaceDestroyed(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj); - void SurfaceSetSize(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jint width, - jint height, - jfloat density); - bool TouchEvent(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jlong time_ms, - jint masked_action, - jint pointer_id, - jfloat x, - jfloat y, - jfloat pressure, - jfloat touch_major, - jfloat touch_minor, - jfloat orientation, - jfloat h_wheel, - jfloat v_wheel); - bool KeyEvent(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - bool pressed, - jint key_code, - jint unicode_character); - - private: - void ReleaseWindow(); - - // Overridden from PlatformWindow: - void Show() override; - void Hide() override; - void SetBounds(const gfx::Rect& bounds) override; - gfx::Rect GetBounds() override; - PlatformImeController* GetPlatformImeController() override; - - JavaObjectWeakGlobalRef java_platform_window_android_; - ANativeWindow* window_; - - gfx::Size size_; // Origin is always (0,0) - - PlatformImeControllerAndroid platform_ime_controller_; - - DISALLOW_COPY_AND_ASSIGN(PlatformWindowAndroid); -}; - -} // namespace ui - -#endif // UI_PLATFORM_WINDOW_ANDROID_PLATFORM_WINDOW_ANDROID_H_
diff --git a/ui/platform_window/platform_ime_controller.h b/ui/platform_window/platform_ime_controller.h deleted file mode 100644 index e9543d7..0000000 --- a/ui/platform_window/platform_ime_controller.h +++ /dev/null
@@ -1,26 +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 UI_PLATFORM_WINDOW_PLATFORM_IME_CONTROLLER_H_ -#define UI_PLATFORM_WINDOW_PLATFORM_IME_CONTROLLER_H_ - -#include "ui/platform_window/text_input_state.h" - -namespace ui { - -// Platform input method editor controller. -class PlatformImeController { - public: - virtual ~PlatformImeController() {} - - // Update the text input state. - virtual void UpdateTextInputState(const TextInputState& state) = 0; - - // Set visibility of input method editor UI (software keyboard, etc). - virtual void SetImeVisibility(bool visible) = 0; -}; - -} // namespace ui - -#endif // UI_PLATFORM_WINDOW_PLATFORM_IME_CONTROLLER_H_
diff --git a/ui/platform_window/platform_window.h b/ui/platform_window/platform_window.h index c7611ee..dd10f5ea 100644 --- a/ui/platform_window/platform_window.h +++ b/ui/platform_window/platform_window.h
@@ -19,8 +19,6 @@ namespace ui { -class PlatformImeController; - // Platform window. // // Each instance of PlatformWindow represents a single window in the @@ -64,10 +62,6 @@ // is in platform window coordinates. virtual void ConfineCursorToBounds(const gfx::Rect& bounds) = 0; - // The PlatformImeController is owned by the PlatformWindow, the ownership is - // not transferred. - virtual PlatformImeController* GetPlatformImeController() = 0; - // Sets and gets the restored bounds of the platform-window. virtual void SetRestoredBoundsInPixels(const gfx::Rect& bounds) = 0; virtual gfx::Rect GetRestoredBoundsInPixels() const = 0;
diff --git a/ui/platform_window/stub/stub_window.cc b/ui/platform_window/stub/stub_window.cc index 154d3e2..b8cb5e8 100644 --- a/ui/platform_window/stub/stub_window.cc +++ b/ui/platform_window/stub/stub_window.cc
@@ -70,10 +70,6 @@ void StubWindow::ConfineCursorToBounds(const gfx::Rect& bounds) {} -PlatformImeController* StubWindow::GetPlatformImeController() { - return nullptr; -} - void StubWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {} gfx::Rect StubWindow::GetRestoredBoundsInPixels() const {
diff --git a/ui/platform_window/stub/stub_window.h b/ui/platform_window/stub/stub_window.h index f46c8aa..88a762cd 100644 --- a/ui/platform_window/stub/stub_window.h +++ b/ui/platform_window/stub/stub_window.h
@@ -47,7 +47,6 @@ void SetCursor(PlatformCursor cursor) override; void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; - PlatformImeController* GetPlatformImeController() override; void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override; gfx::Rect GetRestoredBoundsInPixels() const override;
diff --git a/ui/platform_window/text_input_state.cc b/ui/platform_window/text_input_state.cc deleted file mode 100644 index ffc3e527..0000000 --- a/ui/platform_window/text_input_state.cc +++ /dev/null
@@ -1,48 +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. - -#include "ui/platform_window/text_input_state.h" - -namespace ui { - -TextInputState::TextInputState() - : type(TEXT_INPUT_TYPE_NONE), - flags(TEXT_INPUT_FLAG_NONE), - selection_start(0), - selection_end(0), - composition_start(0), - composition_end(0), - can_compose_inline(false) {} - -TextInputState::TextInputState(TextInputType type, - int flags, - const std::string& text, - int selection_start, - int selection_end, - int composition_start, - int composition_end, - bool can_compose_inline) - : type(type), - flags(flags), - text(text), - selection_start(selection_start), - selection_end(selection_end), - composition_start(composition_start), - composition_end(composition_end), - can_compose_inline(can_compose_inline) {} - -TextInputState::TextInputState(const TextInputState& other) = default; - -bool TextInputState::operator==(const TextInputState& other) const { - return type == other.type && - flags == other.flags && - text == other.text && - selection_start == other.selection_start && - selection_end == other.selection_end && - composition_start == other.composition_start && - composition_end == other.composition_end && - can_compose_inline == other.can_compose_inline; -} - -} // namespace ui
diff --git a/ui/platform_window/text_input_state.h b/ui/platform_window/text_input_state.h deleted file mode 100644 index c2dff0d..0000000 --- a/ui/platform_window/text_input_state.h +++ /dev/null
@@ -1,58 +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 UI_PLATFORM_WINDOW_TEXT_INPUT_STATE_H_ -#define UI_PLATFORM_WINDOW_TEXT_INPUT_STATE_H_ - -#include <string> - -#include "ui/base/ime/text_input_flags.h" -#include "ui/base/ime/text_input_type.h" - -namespace ui { - -// Text input info which is based on blink::WebTextInputInfo. -struct TextInputState { - TextInputState(); - TextInputState(TextInputType type, - int flags, - const std::string& text, - int selection_start, - int selection_end, - int composition_start, - int composition_end, - bool can_compose_inline); - TextInputState(const TextInputState& other); - bool operator==(const TextInputState& other) const; - - // The type of input field. - TextInputType type; - - // The flags of the input field (autocorrect, autocomplete, etc.). - int flags; - - // The value of the input field. - std::string text; - - // The cursor position of the current selection start, or the caret position - // if nothing is selected. - int selection_start; - - // The cursor position of the current selection end, or the caret position - // if nothing is selected. - int selection_end; - - // The start position of the current composition, or -1 if there is none. - int composition_start; - - // The end position of the current composition, or -1 if there is none. - int composition_end; - - // Whether or not inline composition can be performed for the current input. - bool can_compose_inline; -}; - -} // namespace ui - -#endif // UI_PLATFORM_WINDOW_TEXT_INPUT_STATE_H_
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc index a16635f..3ba824297 100644 --- a/ui/platform_window/win/win_window.cc +++ b/ui/platform_window/win/win_window.cc
@@ -136,10 +136,6 @@ void WinWindow::ConfineCursorToBounds(const gfx::Rect& bounds) { } -PlatformImeController* WinWindow::GetPlatformImeController() { - return nullptr; -} - void WinWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {} gfx::Rect WinWindow::GetRestoredBoundsInPixels() const {
diff --git a/ui/platform_window/win/win_window.h b/ui/platform_window/win/win_window.h index 786d36d..4a117df 100644 --- a/ui/platform_window/win/win_window.h +++ b/ui/platform_window/win/win_window.h
@@ -46,7 +46,6 @@ void SetCursor(PlatformCursor cursor) override; void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; - PlatformImeController* GetPlatformImeController() override; void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override; gfx::Rect GetRestoredBoundsInPixels() const override;
diff --git a/ui/platform_window/x11/x11_window_base.cc b/ui/platform_window/x11/x11_window_base.cc index bcbd46c..0d477a7 100644 --- a/ui/platform_window/x11/x11_window_base.cc +++ b/ui/platform_window/x11/x11_window_base.cc
@@ -295,10 +295,6 @@ has_pointer_barriers_ = true; } -PlatformImeController* X11WindowBase::GetPlatformImeController() { - return nullptr; -} - void X11WindowBase::SetRestoredBoundsInPixels(const gfx::Rect& bounds) { // TODO: https://crbug.com/848131 NOTIMPLEMENTED();
diff --git a/ui/platform_window/x11/x11_window_base.h b/ui/platform_window/x11/x11_window_base.h index 10f6a81..cd312eb4 100644 --- a/ui/platform_window/x11/x11_window_base.h +++ b/ui/platform_window/x11/x11_window_base.h
@@ -47,7 +47,6 @@ PlatformWindowState GetPlatformWindowState() const override; void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; - PlatformImeController* GetPlatformImeController() override; void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override; gfx::Rect GetRestoredBoundsInPixels() const override;
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc index bcc003f..d9ef602 100644 --- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
@@ -50,9 +50,6 @@ void SetCursor(ui::PlatformCursor cursor) override {} void MoveCursorTo(const gfx::Point& location) override {} void ConfineCursorToBounds(const gfx::Rect& bounds) override {} - ui::PlatformImeController* GetPlatformImeController() override { - return nullptr; - } void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override {} gfx::Rect GetRestoredBoundsInPixels() const override { return gfx::Rect(); }
diff --git a/ui/webui/resources/css/apps/common.css b/ui/webui/resources/css/apps/common.css index 414a899c..d2b680ed 100644 --- a/ui/webui/resources/css/apps/common.css +++ b/ui/webui/resources/css/apps/common.css
@@ -4,7 +4,8 @@ button.white-button, button.blue-button { - border: 5px solid transparent; + border: 1px solid transparent; + border-radius: 2px; box-sizing: content-box; cursor: default; font-size: 14px; @@ -14,106 +15,50 @@ min-height: 21px; min-width: 55px; outline: none; - padding: 0 10px; + padding: 4px 14px; position: relative; text-align: center; z-index: 1; } -button.white-button { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button.png) 1x, - url(chrome://resources/images/2x/apps/button.png) - 2x) 5 fill / 5px / 2px repeat; +button.white-button[disabled] { + border-color: #c6c6c6; } -button.white-button:hover { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button_hover.png) 1x, - url(chrome://resources/images/2x/apps/button_hover.png) - 2x) 5 fill / 5px / 2px repeat; +button.white-button:focus:active, +button.white-button:focus { + border-color: rgb(62, 126, 248); } button.white-button:active { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button_pressed.png) 1x, - url(chrome://resources/images/2x/apps/button_pressed.png) - 2x) 5 fill / 5px / 2px repeat; + background-color: #e6e6e6; + border-color: #a6a6a6; } -button.white-button:focus { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button_focused.png) 1x, - url(chrome://resources/images/2x/apps/button_focused.png) - 2x) 5 fill / 5px / 2px repeat; -} - -button.white-button:focus:hover { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button_focused_hover.png) 1x, - url(chrome://resources/images/2x/apps/button_focused_hover.png) - 2x) 5 fill / 5px / 2px repeat; -} - -button.white-button:focus:active { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button_focused_pressed.png) 1x, - url(chrome://resources/images/2x/apps/button_focused_pressed.png) - 2x) 5 fill / 5px / 2px repeat; -} - -button.white-button[disabled] { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/button_inactive.png) 1x, - url(chrome://resources/images/2x/apps/button_inactive.png) - 2x) 5 fill / 5px / 2px repeat; +button.white-button { + background-color: #f9f9f9; + border-color: #a4a4a4; } button.blue-button { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button.png) 1x, - url(chrome://resources/images/2x/apps/blue_button.png) - 2x) 5 fill / 5px / 2px repeat; + background-color: rgb(90, 151, 255); + border-color: rgb(43, 103, 206); } button.blue-button:hover { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button_hover.png) 1x, - url(chrome://resources/images/2x/apps/blue_button_hover.png) - 2x) 5 fill / 5px / 2px repeat; + background-color: rgb(98, 156, 255); } button.blue-button:active { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button_pressed.png) 1x, - url(chrome://resources/images/2x/apps/blue_button_pressed.png) - 2x) 5 fill / 5px / 2px repeat; + background-color: rgb(66, 121, 216); + border-color: rgb(35, 82, 162); } button.blue-button:focus { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button_focused.png) 1x, - url(chrome://resources/images/2x/apps/blue_button_focused.png) - 2x) 5 fill / 5px / 2px repeat; -} - -button.blue-button:focus:hover { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button_focused_hover.png) 1x, - url(chrome://resources/images/2x/apps/blue_button_focused_hover.png) - 2x) 5 fill / 5px / 2px repeat; -} - -button.blue-button:focus:active { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button_focused_pressed.png) 1x, - url(chrome://resources/images/2x/apps/blue_button_focused_pressed.png) - 2x) 5 fill / 5px / 2px repeat; + box-shadow: 0 0 0 1px inset rgb(173, 204, 255); } button.blue-button[disabled] { - border-image: -webkit-image-set( - url(chrome://resources/images/apps/blue_button_inactive.png) 1x, - url(chrome://resources/images/2x/apps/blue_button_inactive.png) - 2x) 5 fill / 5px / 2px repeat; + background-color: rgb(171, 201, 255); + border-color: rgb(148, 177, 229); }