diff --git a/DEPS b/DEPS index 6d393b7..76162316 100644 --- a/DEPS +++ b/DEPS
@@ -175,11 +175,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '73e334469e893688b537db80aae9b5b4e1c3d839', + 'skia_revision': '48d345fd83fd8860661cf3a3f5e57c5a61b471e7', # 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': '1eaaf11462d15e4cb0e6b01f5eff648b2570abb8', + 'v8_revision': 'f3470cbf3c469e16a0adf36fa044fdc542a9016a', # 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. @@ -187,7 +187,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'dac5cc3b6a4eb2d1c3ceb7132715185fc15e31be', + 'angle_revision': 'c68dfaf3a529d8a85793ae2951fc8207b2b621cf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -238,7 +238,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'e9a5bd129758dfd242b5c38871544ec27547843e', + 'catapult_revision': '90ff937ff645b5dde74f2fa75937e5b7f3ead7d5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -246,7 +246,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '605c93fb246ca60e4fd860a20ee89975022f7b91', + 'devtools_frontend_revision': 'b60df8ed2de8c9521e04a2f4a6f3597e7d156c29', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -298,11 +298,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'shaderc_revision': '8026364968acb2e55390f6ccf295740ab818ebda', + 'shaderc_revision': '1926de0638b6dd74b759293a5bd21c473d0b1ade', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '6574f92747a23fd7ae2a69ebaf11aade122b20b4', + 'dawn_revision': 'ab2c84ffd2a49a97abf4c22b1e88e42f8d02c1ff', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1218,7 +1218,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '83844953c4787f7f2a4b8bed6434097c2355b93a', + Var('chromium_git') + '/openscreen' + '@' + '8277ecb30334efbf1d828776f3d04a151180201b', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '9e97b73e7dd2bfc07745489d728f6a36665c648f', @@ -1235,7 +1235,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '99ccc17596688eb26319d197fc8df9866f500094', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '50f449b1dfd721402e277ee52faa861af973c0f5', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 5e4c917..73d60319 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -413,6 +413,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Aktiveer tans …</translation> <translation id="6283712521836204486">Moenie Steur Nie is af.</translation> <translation id="6284232397434400372">Resolusie het verander</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> kan later weer met 'n ouer se toestemming bygevoeg word.</translation> <translation id="6297287540776456956">Gebruik die stilus om 'n area te kies</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> is na <ph name="ROTATION" /> gedraai</translation> <translation id="6376931439017688372">Bluetooth is aan</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 00e731166..ec6ce79 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />፦ በማግበር ላይ...</translation> <translation id="6283712521836204486">አትረብሽ ጠፍቷል</translation> <translation id="6284232397434400372">ጥራቱ ተቀይሯል</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> ከወላጅ ፈቃድ ጋር እንደገና ሊታከል ይችላል።</translation> <translation id="6297287540776456956">ክልል ለመምረጥ ስቲለሱን ይጠቀሙ</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ወደ <ph name="ROTATION" /> ዞሯል</translation> <translation id="6376931439017688372">ብሉቱዝ በርቷል</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 406c9bc..4bc0bf5c 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -412,7 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Aktiviranje...</translation> <translation id="6283712521836204486">Funkcija Ne ometaj je isključena.</translation> <translation id="6284232397434400372">Rezolucija se promijenila</translation> -<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> može se kasnije ponovno dodati uz dopuštenje roditelja.</translation> +<translation id="6288235558961782912">Adresu e-pošte <ph name="USER_EMAIL_ADDRESS" /> je moguće ponovo dodati kasnije uz odobrenje roditelja.</translation> <translation id="6297287540776456956">Odaberite regiju pisaljkom</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> je zarotiran u orijentaciju <ph name="ROTATION" /></translation> <translation id="6376931439017688372">Bluetooth je uključen</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 6581424..f7039c6 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: s'està activant...</translation> <translation id="6283712521836204486">El mode No molestis està desactivat.</translation> <translation id="6284232397434400372">S'ha canviat la resolució</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> es pot tornar a afegir més endavant amb un permís dels pares.</translation> <translation id="6297287540776456956">Utilitza el llapis òptic per seleccionar una part</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> s'ha canviat a <ph name="ROTATION" /></translation> <translation id="6376931439017688372">El Bluetooth està activat</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 27a7e35..71338e8 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -413,6 +413,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Aktiverer...</translation> <translation id="6283712521836204486">Forstyr ikke er deaktiveret</translation> <translation id="6284232397434400372">Opløsningen blev ændret</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> kan tilføjes igen senere, hvis en forælder giver tilladelse til det.</translation> <translation id="6297287540776456956">Brug styluspennen til at vælge et område</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> er roteret til <ph name="ROTATION" /></translation> <translation id="6376931439017688372">Bluetooth er slået til</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 06296c7..4705670d 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -300,7 +300,7 @@ <translation id="4665114317261903604">Gaitu/Desgaitu ez molestatzeko modua. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Desblokeatu gailua gurasoen kodearekin</translation> <translation id="4702647871202761252">Desaktibatuta dago pribatutasun-pantaila</translation> -<translation id="4705716602320768426">Fitxategiari buruzko oharrak</translation> +<translation id="4705716602320768426">Bidali oharrak</translation> <translation id="4710243778082831592">IME eginbidearen ezarpenak</translation> <translation id="4731797938093519117">Gurasoen sarbidea</translation> <translation id="4734965478015604180">Horizontala</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 6033aac..5551524f 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: در حال فعالسازی…</translation> <translation id="6283712521836204486">«مزاحم نشوید» خاموش است.</translation> <translation id="6284232397434400372">وضوح تغییر کرد</translation> +<translation id="6288235558961782912">بعداً میتوانید <ph name="USER_EMAIL_ADDRESS" /> را با اجازه ولی دوباره اضافه کنید.</translation> <translation id="6297287540776456956">از قلم برای انتخاب منطقه استفاده کنید</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> به <ph name="ROTATION" /> چرخانده شد</translation> <translation id="6376931439017688372">بلوتوث روشن است</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index b082918..2b2b042 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -55,6 +55,7 @@ <translation id="1550523713251050646">વધુ વિકલ્પો માટે ક્લિક કરો</translation> <translation id="1570871743947603115">બ્લૂટૂથ ટૉગલ કરો. <ph name="STATE_TEXT" /></translation> <translation id="1589090746204042747">આ સત્રમાં તમારી બધી પ્રવૃત્તિને ઍક્સેસ કરો</translation> +<translation id="1632985212731562677">સ્વિચ ઍક્સેસને સેટિંગ > ઍક્સેસિબિલિટીમાંથી બંધ કરી શકાય છે.</translation> <translation id="1654477262762802994">વૉઇસ ક્વેરી શરૂ કરો</translation> <translation id="1658406695958299976">માફ કરશો, તમારો પાસવર્ડ હજી ચકાસી શકાયો નથી. નોંધ: જો તમે તાજેતરમાં તમારો પાસવર્ડ બદલ્યો હોય, તો તમારો નવો પાસવર્ડ તમે એક વાર સાઇન આઉટ કરી લો તે પછી લાગુ થશે, કૃપા કરીને અહીં જૂના પાસવર્ડનો ઉપયોગ કરો.</translation> <translation id="1677472565718498478"><ph name="TIME" /> બાકી</translation> @@ -181,6 +182,7 @@ <translation id="3154351730702813399">ડિવાઇસ વ્યવસ્થાપક તમારી બ્રાઉઝિંગ પ્રવૃત્તિને મોનિટર કરી શકે છે.</translation> <translation id="3181441307743005334">ફરી શરૂ થવામાં થોડો સમય લાગી શકે છે</translation> <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ઉપકરણ સાથે કનેક્ટ કર્યું}one{# ઉપકરણો સાથે કનેક્ટ કર્યું}other{# ઉપકરણો સાથે કનેક્ટ કર્યું}}</translation> +<translation id="3203405173652969239">સ્વિચ ઍક્સેસ ચાલુ કર્યો</translation> <translation id="3207953481422525583">વપરાશકર્તા સેટિંગ</translation> <translation id="3217205077783620295">વૉલ્યૂમ ચાલુ છે, ટૉગલ કરવાથી ઑડિયો મ્યૂટ થશે.</translation> <translation id="3226991577105957773">+ વધુ <ph name="COUNT" /></translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 0011ca2..99259b439 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />` ակտիվացում…</translation> <translation id="6283712521836204486">«Չանհանգստացնել» ռեժիմն անջատված է։</translation> <translation id="6284232397434400372">Լուծաչափը փոխվել է</translation> +<translation id="6288235558961782912">Ծնողների թույլտվությամբ <ph name="USER_EMAIL_ADDRESS" /> օգտատիրոջը հնարավոր կլինի նորից ավելացնել ավելի ուշ:</translation> <translation id="6297287540776456956">Հատվածն ընտրեք ստիլուսի միջոցով</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" />՝ պտտված է <ph name="ROTATION" /></translation> <translation id="6376931439017688372">Bluetooth-ը միացված է</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 0b8bfc8..72f4559 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -299,7 +299,7 @@ <translation id="4665114317261903604">'Niet storen' in-/uitschakelen. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Apparaat ontgrendelen met oudercode</translation> <translation id="4702647871202761252">Privacyscherm is uitgeschakeld</translation> -<translation id="4705716602320768426">Feedback indienen</translation> +<translation id="4705716602320768426">Feedback geven</translation> <translation id="4710243778082831592">IME-instellingen</translation> <translation id="4731797938093519117">Toegang door ouders</translation> <translation id="4734965478015604180">Horizontaal</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 9069bc76..1520a71 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -55,7 +55,7 @@ <translation id="1550523713251050646">Clique para ver mais opções</translation> <translation id="1570871743947603115">Alternar Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1589090746204042747">acessar todas as suas atividades nesta sessão;</translation> -<translation id="1632985212731562677">O "acesso com interruptor" pode ser desativado em "Config. > Acessibilidade".</translation> +<translation id="1632985212731562677">O "acesso com interruptor" pode ser desativado em Configurações > Acessibilidade.</translation> <translation id="1654477262762802994">Iniciar uma consulta por voz</translation> <translation id="1658406695958299976">Ainda não foi possível confirmar sua senha. Observação: se você alterou sua senha recentemente, a nova senha será aplicada depois que você sair da conta. Use a senha antiga aqui.</translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> @@ -105,7 +105,7 @@ <translation id="2268813581635650749">Desconectar todos</translation> <translation id="2277103315734023688">Avançar</translation> <translation id="2292698582925480719">Escala de exibição</translation> -<translation id="2295777434187870477">O microfone está ativado. Alterná-lo silenciará a entrada.</translation> +<translation id="2295777434187870477">O microfone está ativado. Desativá-lo silenciará a entrada.</translation> <translation id="2298170939937364391">Lupa de tela cheia ativada. Pressione Ctrl+Pesquisa+M novamente para desativá-la.</translation> <translation id="2302092602801625023">Esta conta é gerenciada pelo Family Link</translation> <translation id="2303600792989757991">Visão geral da janela de alternância</translation> @@ -299,7 +299,7 @@ <translation id="4665114317261903604">Alternar "Não perturbe". <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Desbloquear dispositivo usando o código de pai/mãe</translation> <translation id="4702647871202761252">A tela de privacidade está desativada</translation> -<translation id="4705716602320768426">Feedback do arquivo</translation> +<translation id="4705716602320768426">Enviar feedback</translation> <translation id="4710243778082831592">Configurações do IME</translation> <translation id="4731797938093519117">Acesso de pai/mãe</translation> <translation id="4734965478015604180">Horizontal</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index f00444c7..150ddd00 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Aktivuje sa...</translation> <translation id="6283712521836204486">Režim bez vyrušení je vypnutý.</translation> <translation id="6284232397434400372">Rozlíšenie sa zmenilo</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> môžete znova pridať neskôr s povolením rodiča.</translation> <translation id="6297287540776456956">Pomocou dotykového pera vyberte oblasť</translation> <translation id="6310121235600822547">Obrazovka <ph name="DISPLAY_NAME" /> bola otočená o <ph name="ROTATION" /></translation> <translation id="6376931439017688372">Rozhranie Bluetooth je zapnuté</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index db391ad..1bf4172 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -413,6 +413,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Etkinleştiriliyor...</translation> <translation id="6283712521836204486">Rahatsız Etmeyin modu kapalı.</translation> <translation id="6284232397434400372">Çözünürlük değiştirildi</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" />, bir ebeveynin izniyle daha sonra yeniden eklenebilir.</translation> <translation id="6297287540776456956">Alan seçmek için ekran kalemini kullanın</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> dönme ayarı <ph name="ROTATION" /> olarak değiştirildi</translation> <translation id="6376931439017688372">Bluetooth açık</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index e9bf8fc..855d1fc 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -105,7 +105,7 @@ <translation id="2268813581635650749">Hammani tizimdan chiqarish</translation> <translation id="2277103315734023688">Oldinga o‘tkazish</translation> <translation id="2292698582925480719">Ekran ko‘lami</translation> -<translation id="2295777434187870477">Yoniq, ustiga bosish orqali ovoz qilish mumkin.</translation> +<translation id="2295777434187870477">Mikrofon yoniq, uni oʻchirish uchun ustiga bosing.</translation> <translation id="2298170939937364391">Butun ekran rejimidagi lupa yoniq. Uni olib tashlash uchun Ctrl+Qidiruv+M tugmalarini bosing.</translation> <translation id="2302092602801625023">Ushbu hisob Family Link orqali boshqariladi</translation> <translation id="2303600792989757991">Ko‘rish rejimiga almashtirish</translation> @@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: faollashtirilmoqda...</translation> <translation id="6283712521836204486">Bezovta qilinmasin rejimi oʻchiq.</translation> <translation id="6284232397434400372">Piksellar sig‘imi o‘zgardi</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> hisobini keyinroq ota-ona ruxsati bilan qayta kiritish mumkin.</translation> <translation id="6297287540776456956">Ekran qismini belgilash uchun stilusdan foydalaning</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" />: joylashuv <ph name="ROTATION" /> ga o‘zgartirildi</translation> <translation id="6376931439017688372">Bluetooth yoniq</translation>
diff --git a/ash/wm/drag_details.cc b/ash/wm/drag_details.cc index a659cf2..89589c7 100644 --- a/ash/wm/drag_details.cc +++ b/ash/wm/drag_details.cc
@@ -70,7 +70,6 @@ // When drag starts, we might be in the middle of a window opacity // animation, on drag completion we must set the opacity to the target // opacity rather than the current opacity (crbug.com/687003). - initial_opacity(window->layer()->GetTargetOpacity()), window_component(window_component), bounds_change( WindowResizer::GetBoundsChangeForWindowComponent(window_component)),
diff --git a/ash/wm/drag_details.h b/ash/wm/drag_details.h index 4eecb5f..3b8ed2e1 100644 --- a/ash/wm/drag_details.h +++ b/ash/wm/drag_details.h
@@ -37,9 +37,6 @@ // Location passed to the constructor, in |window->parent()|'s coordinates. const gfx::PointF initial_location_in_parent; - // Initial opacity of the window. - const float initial_opacity; - // The component the user pressed on. const int window_component;
diff --git a/ash/wm/overview/overview_item_view.cc b/ash/wm/overview/overview_item_view.cc index fb1ee9a..6d2471c 100644 --- a/ash/wm/overview/overview_item_view.cc +++ b/ash/wm/overview/overview_item_view.cc
@@ -307,7 +307,8 @@ preview_pref_size.width() / preview_pref_size.height(); gfx::SizeF target_size(GetContentAreaBounds().size()); OverviewGridWindowFillMode fill_mode = - overview_item_->GetWindowDimensionsType(); + overview_item_ ? overview_item_->GetWindowDimensionsType() + : OverviewGridWindowFillMode::kNormal; switch (fill_mode) { case OverviewGridWindowFillMode::kNormal: break;
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc index 9a9353b..9652afe 100644 --- a/ash/wm/workspace/workspace_window_resizer.cc +++ b/ash/wm/workspace/workspace_window_resizer.cc
@@ -53,141 +53,13 @@ constexpr double kMinHorizVelocityForWindowSwipe = 1100; constexpr double kMinVertVelocityForWindowMinimize = 1000; -// Returns true if |window| can be dragged from the top of the screen in tablet -// mode. -std::unique_ptr<WindowResizer> CreateWindowResizerForTabletMode( - aura::Window* window, - const gfx::PointF& point_in_parent, - int window_component, - ::wm::WindowMoveSource source) { - // Window dragging from top and tab dragging are disabled if "WebUITabStrip" - // feature is enabled. "WebUITabStrip" will be enabled on 81 for Krane and on - // 82 for all other boards. - if (features::IsWebUITabStripEnabled()) - return nullptr; +// Snap region when dragging close to the edges. That is, as the window gets +// this close to an edge of the screen it snaps to the edge. +constexpr int kScreenEdgeInset = 8; - WindowState* window_state = WindowState::Get(window); - // Only maximized/fullscreen/snapped window can be dragged from the top of - // the screen. - if (!window_state->IsMaximized() && !window_state->IsFullscreen() && - !window_state->IsSnapped()) { - return nullptr; - } - - AppType app_type = - static_cast<AppType>(window->GetProperty(aura::client::kAppType)); - // App windows can be dragged from the client area (see - // ToplevelWindowEventHandler). - if (app_type != AppType::BROWSER && window_component == HTCLIENT) { - DCHECK_EQ(source, ::wm::WINDOW_MOVE_SOURCE_TOUCH); - window_state->CreateDragDetails(point_in_parent, HTCLIENT, - ::wm::WINDOW_MOVE_SOURCE_TOUCH); - std::unique_ptr<WindowResizer> window_resizer = - std::make_unique<TabletModeWindowResizer>( - window_state, std::make_unique<TabletModeWindowDragDelegate>()); - return std::make_unique<DragWindowResizer>(std::move(window_resizer), - window_state); - } - - // Only allow drag that happens on caption or top area. Note: for a maxmized - // or fullscreen window, the window component here is always HTCAPTION, but - // for a snapped window, the window component here can either be HTCAPTION or - // HTTOP. - if (window_component != HTCAPTION && window_component != HTTOP) - return nullptr; - - // Note: only browser windows and chrome app windows are included here. - // For browser windows, this piece of codes will be called no matter the - // drag happens on the tab(s) or on the non-tabstrip caption or top area. - // But for app window, this piece of codes will only be called if the chrome - // app window has its customized caption area and can't be hidden in tablet - // mode (and thus the drag for this type of chrome app window always happens - // on caption or top area). The case where the caption area of the chrome app - // window can be hidden is handled above. - if (app_type != AppType::BROWSER && app_type != AppType::CHROME_APP) - return nullptr; - - window_state->CreateDragDetails(point_in_parent, window_component, source); - std::unique_ptr<WindowResizer> window_resizer = - std::make_unique<TabletModeWindowResizer>( - window_state, - std::make_unique<TabletModeBrowserWindowDragDelegate>()); - return std::make_unique<DragWindowResizer>(std::move(window_resizer), - window_state); -} - -} // namespace - -std::unique_ptr<WindowResizer> CreateWindowResizer( - aura::Window* window, - const gfx::PointF& point_in_parent, - int window_component, - ::wm::WindowMoveSource source) { - DCHECK(window); - - WindowState* window_state = WindowState::Get(window); - - // A resizer already exists; don't create a new one. - if (window_state->drag_details()) - return nullptr; - - // When running in single app mode, we should not create window resizer. - if (Shell::Get()->session_controller()->IsRunningInAppMode()) - return nullptr; - - if (window_state->IsPip()) { - window_state->CreateDragDetails(point_in_parent, window_component, source); - return std::make_unique<PipWindowResizer>(window_state); - } - - if (Shell::Get()->tablet_mode_controller()->InTabletMode()) { - return CreateWindowResizerForTabletMode(window, point_in_parent, - window_component, source); - } - - // No need to return a resizer when the window cannot get resized. - if (!window_state->CanResize() && window_component != HTCAPTION) - return nullptr; - - if (!window_state->IsNormalOrSnapped()) - return nullptr; - - int bounds_change = - WindowResizer::GetBoundsChangeForWindowComponent(window_component); - if (bounds_change == WindowResizer::kBoundsChangeDirection_None) - return nullptr; - - window_state->CreateDragDetails(point_in_parent, window_component, source); - - // TODO(varkha): The chaining of window resizers causes some of the logic - // to be repeated and the logic flow difficult to control. With some windows - // classes using reparenting during drag operations it becomes challenging to - // implement proper transition from one resizer to another during or at the - // end of the drag. This also causes http://crbug.com/247085. - // We should have a better way of doing this, perhaps by having a way of - // observing drags or having a generic drag window wrapper which informs a - // layout manager that a drag has started or stopped. It may be possible to - // refactor and eliminate chaining. - std::unique_ptr<WindowResizer> window_resizer; - const auto* parent = window->parent(); - if (parent && - // TODO(afakhry): Maybe use switchable containers? - (desks_util::IsDeskContainer(parent) || - parent->id() == kShellWindowId_AlwaysOnTopContainer)) { - window_resizer.reset(WorkspaceWindowResizer::Create( - window_state, std::vector<aura::Window*>())); - } else { - window_resizer.reset(DefaultWindowResizer::Create(window_state)); - } - return std::make_unique<DragWindowResizer>(std::move(window_resizer), - window_state); -} - -namespace { - -// Snapping distance used instead of WorkspaceWindowResizer::kScreenEdgeInset -// when resizing a window using touchscreen. -const int kScreenEdgeInsetForTouchDrag = 32; +// Snapping distance used instead of kScreenEdgeInset when resizing a window +// using touchscreen. +constexpr int kScreenEdgeInsetForTouchDrag = 32; // If an edge of the work area is at an edge of the display, then you can snap a // window by dragging to a point within this far inward from that edge. This @@ -196,10 +68,15 @@ // neighboring display. For touch dragging, you may be able to drag out of the // display because the physical device has a border around the display. Either // case makes it difficult to drag to the edge without this tolerance. -const int kScreenEdgeInsetForSnapping = 32; +constexpr int kScreenEdgeInsetForSnapping = 32; + +// When dragging an attached window this is the min size we'll make sure is +// visible. In the vertical direction we take the max of this and that from +// the delegate. +constexpr int kMinOnscreenSize = 20; // Current instance for use by the WorkspaceWindowResizerTest. -WorkspaceWindowResizer* instance = NULL; +WorkspaceWindowResizer* instance = nullptr; // Returns true if the window should stick to the edge. bool ShouldStickToEdge(int distance_from_edge, int sticky_size) { @@ -336,16 +213,134 @@ return 0; } +// Returns a WindowResizer if dragging |window| is allowed in tablet mode. +std::unique_ptr<WindowResizer> CreateWindowResizerForTabletMode( + aura::Window* window, + const gfx::PointF& point_in_parent, + int window_component, + ::wm::WindowMoveSource source) { + // Window dragging from top and tab dragging are disabled if "WebUITabStrip" + // feature is enabled. "WebUITabStrip" will be enabled on 81 for Krane and on + // 82 for all other boards. + if (features::IsWebUITabStripEnabled()) + return nullptr; + + WindowState* window_state = WindowState::Get(window); + // Only maximized/fullscreen/snapped window can be dragged from the top of + // the screen. + if (!window_state->IsMaximized() && !window_state->IsFullscreen() && + !window_state->IsSnapped()) { + return nullptr; + } + + AppType app_type = + static_cast<AppType>(window->GetProperty(aura::client::kAppType)); + // App windows can be dragged from the client area (see + // ToplevelWindowEventHandler). + if (app_type != AppType::BROWSER && window_component == HTCLIENT) { + DCHECK_EQ(source, ::wm::WINDOW_MOVE_SOURCE_TOUCH); + window_state->CreateDragDetails(point_in_parent, HTCLIENT, + ::wm::WINDOW_MOVE_SOURCE_TOUCH); + std::unique_ptr<WindowResizer> window_resizer = + std::make_unique<TabletModeWindowResizer>( + window_state, std::make_unique<TabletModeWindowDragDelegate>()); + return std::make_unique<DragWindowResizer>(std::move(window_resizer), + window_state); + } + + // Only allow drag that happens on caption or top area. Note: for a maxmized + // or fullscreen window, the window component here is always HTCAPTION, but + // for a snapped window, the window component here can either be HTCAPTION or + // HTTOP. + if (window_component != HTCAPTION && window_component != HTTOP) + return nullptr; + + // Note: only browser windows and chrome app windows are included here. + // For browser windows, this piece of codes will be called no matter the + // drag happens on the tab(s) or on the non-tabstrip caption or top area. + // But for app window, this piece of codes will only be called if the chrome + // app window has its customized caption area and can't be hidden in tablet + // mode (and thus the drag for this type of chrome app window always happens + // on caption or top area). The case where the caption area of the chrome app + // window can be hidden is handled above. + if (app_type != AppType::BROWSER && app_type != AppType::CHROME_APP) + return nullptr; + + window_state->CreateDragDetails(point_in_parent, window_component, source); + std::unique_ptr<WindowResizer> window_resizer = + std::make_unique<TabletModeWindowResizer>( + window_state, + std::make_unique<TabletModeBrowserWindowDragDelegate>()); + return std::make_unique<DragWindowResizer>(std::move(window_resizer), + window_state); +} + } // namespace -// static -const int WorkspaceWindowResizer::kMinOnscreenSize = 20; +std::unique_ptr<WindowResizer> CreateWindowResizer( + aura::Window* window, + const gfx::PointF& point_in_parent, + int window_component, + ::wm::WindowMoveSource source) { + DCHECK(window); -// static -const int WorkspaceWindowResizer::kMinOnscreenHeight = 32; + WindowState* window_state = WindowState::Get(window); -// static -const int WorkspaceWindowResizer::kScreenEdgeInset = 8; + // A resizer already exists; don't create a new one. + if (window_state->drag_details()) + return nullptr; + + // When running in single app mode, we should not create window resizer. + if (Shell::Get()->session_controller()->IsRunningInAppMode()) + return nullptr; + + if (window_state->IsPip()) { + window_state->CreateDragDetails(point_in_parent, window_component, source); + return std::make_unique<PipWindowResizer>(window_state); + } + + if (Shell::Get()->tablet_mode_controller()->InTabletMode()) { + return CreateWindowResizerForTabletMode(window, point_in_parent, + window_component, source); + } + + // No need to return a resizer when the window cannot get resized. + if (!window_state->CanResize() && window_component != HTCAPTION) + return nullptr; + + if (!window_state->IsNormalOrSnapped()) + return nullptr; + + int bounds_change = + WindowResizer::GetBoundsChangeForWindowComponent(window_component); + if (bounds_change == WindowResizer::kBoundsChangeDirection_None) + return nullptr; + + window_state->CreateDragDetails(point_in_parent, window_component, source); + + // TODO(varkha): The chaining of window resizers causes some of the logic + // to be repeated and the logic flow difficult to control. With some windows + // classes using reparenting during drag operations it becomes challenging to + // implement proper transition from one resizer to another during or at the + // end of the drag. This also causes http://crbug.com/247085. + // We should have a better way of doing this, perhaps by having a way of + // observing drags or having a generic drag window wrapper which informs a + // layout manager that a drag has started or stopped. It may be possible to + // refactor and eliminate chaining. + std::unique_ptr<WindowResizer> window_resizer; + const auto* parent = window->parent(); + if (parent && + // TODO(afakhry): Maybe use switchable containers? + (desks_util::IsDeskContainer(parent) || + parent->id() == kShellWindowId_AlwaysOnTopContainer)) { + window_resizer.reset(WorkspaceWindowResizer::Create( + window_state, std::vector<aura::Window*>())); + } else { + window_resizer.reset(DefaultWindowResizer::Create(window_state)); + } + return std::make_unique<DragWindowResizer>(std::move(window_resizer), + window_state); +} WorkspaceWindowResizer* WorkspaceWindowResizer::GetInstanceForTest() { return instance; @@ -405,12 +400,14 @@ int max_; }; +constexpr int WorkspaceWindowResizer::kMinOnscreenHeight; + WorkspaceWindowResizer::~WorkspaceWindowResizer() { if (did_lock_cursor_) Shell::Get()->cursor_manager()->UnlockCursor(); if (instance == this) - instance = NULL; + instance = nullptr; } // static @@ -620,14 +617,7 @@ const std::vector<aura::Window*>& attached_windows) : WindowResizer(window_state), attached_windows_(attached_windows), - did_lock_cursor_(false), - did_move_or_resize_(false), - initial_bounds_changed_by_user_(window_state_->bounds_changed_by_user()), - total_min_(0), - total_initial_size_(0), - snap_type_(SNAP_NONE), - num_mouse_moves_since_bounds_change_(0), - magnetism_window_(nullptr) { + initial_bounds_changed_by_user_(window_state_->bounds_changed_by_user()) { DCHECK(details().is_resizable); // A mousemove should still show the cursor even if the window is
diff --git a/ash/wm/workspace/workspace_window_resizer.h b/ash/wm/workspace/workspace_window_resizer.h index 19a0737..0d5144f8 100644 --- a/ash/wm/workspace/workspace_window_resizer.h +++ b/ash/wm/workspace/workspace_window_resizer.h
@@ -34,22 +34,9 @@ // attempt to restore the old height. class ASH_EXPORT WorkspaceWindowResizer : public WindowResizer { public: - // When dragging an attached window this is the min size we'll make sure is - // visible. In the vertical direction we take the max of this and that from - // the delegate. - static const int kMinOnscreenSize; - // Min height we'll force on screen when dragging the caption. // TODO: this should come from a property on the window. - static const int kMinOnscreenHeight; - - // Snap region when dragging close to the edges. That is, as the window gets - // this close to an edge of the screen it snaps to the edge. - static const int kScreenEdgeInset; - - // Distance in pixels that the cursor must move past an edge for a window - // to move or resize beyond that edge. - static const int kStickyDistancePixels; + static constexpr int kMinOnscreenHeight = 32; ~WorkspaceWindowResizer() override; @@ -179,41 +166,36 @@ // Returns the currently used instance for test. static WorkspaceWindowResizer* GetInstanceForTest(); - bool did_lock_cursor_; + bool did_lock_cursor_ = false; // Set to true once Drag() is invoked and the bounds of the window change. - bool did_move_or_resize_; + bool did_move_or_resize_ = false; // True if the window initially had |bounds_changed_by_user_| set in state. - bool initial_bounds_changed_by_user_; + const bool initial_bounds_changed_by_user_; // The initial size of each of the windows in |attached_windows_| along the // primary axis. std::vector<int> initial_size_; // Sum of the minimum sizes of the attached windows. - int total_min_; + int total_min_ = 0; // Sum of the sizes in |initial_size_|. - int total_initial_size_; + int total_initial_size_ = 0; // Gives a previews of where the the window will end up. Only used if there // is a grid and the caption is being dragged. std::unique_ptr<PhantomWindowController> snap_phantom_window_controller_; // The edge to which the window should be snapped to at the end of the drag. - SnapType snap_type_; - - // Number of mouse moves since the last bounds change. Only used for phantom - // placement to track when the mouse is moved while pushed against the edge of - // the screen. - int num_mouse_moves_since_bounds_change_; + SnapType snap_type_ = SNAP_NONE; // The mouse location passed to Drag(). gfx::PointF last_mouse_location_; // Window the drag has magnetically attached to. - aura::Window* magnetism_window_; + aura::Window* magnetism_window_ = nullptr; // Used to verify |magnetism_window_| is still valid. aura::WindowTracker window_tracker_;
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc index c94a086..654a3b2 100644 --- a/ash/wm/workspace/workspace_window_resizer_unittest.cc +++ b/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -17,7 +17,6 @@ #include "ash/wm/workspace/phantom_window_controller.h" #include "ash/wm/workspace_controller.h" #include "base/command_line.h" -#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" #include "base/time/time.h" @@ -158,15 +157,13 @@ // Returns a string identifying the z-order of each of the known child windows // of |parent|. The returned string constains the id of the known windows and // is ordered from topmost to bottomost windows. - std::string WindowOrderAsString(aura::Window* parent) const { - std::string result; + std::vector<int> WindowOrderAsIntVector(aura::Window* parent) const { + std::vector<int> result; const aura::Window::Windows& windows = parent->children(); for (aura::Window::Windows::const_reverse_iterator i = windows.rbegin(); i != windows.rend(); ++i) { if (*i == window_.get() || *i == window2_.get() || *i == window3_.get()) { - if (!result.empty()) - result += " "; - result += base::NumberToString((*i)->id()); + result.push_back((*i)->id()); } } return result; @@ -633,10 +630,9 @@ EXPECT_EQ(root_windows[0], window_->GetRootWindow()); resizer->CompleteDrag(); EXPECT_EQ(root_windows[1], window_->GetRootWindow()); - EXPECT_EQ("0,0 250x" + base::NumberToString(bottom), - window_->bounds().ToString()); - EXPECT_EQ("820,30 400x60", - window_state->GetRestoreBoundsInScreen().ToString()); + EXPECT_EQ(gfx::Rect(250, bottom), window_->bounds()); + EXPECT_EQ(gfx::Rect(820, 30, 400, 60), + window_state->GetRestoreBoundsInScreen()); } // Restore the window to clear snapped state. @@ -658,10 +654,9 @@ screen_util::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom(); resizer->CompleteDrag(); // TODO(varkha): Insets are updated because of http://crbug.com/292238 - EXPECT_EQ("250,0 250x" + base::NumberToString(bottom), - window_->bounds().ToString()); - EXPECT_EQ("820,30 400x60", - window_state->GetRestoreBoundsInScreen().ToString()); + EXPECT_EQ(gfx::Rect(250, 0, 250, bottom), window_->bounds()); + EXPECT_EQ(gfx::Rect(820, 30, 400, 60), + window_state->GetRestoreBoundsInScreen()); } } @@ -812,7 +807,8 @@ resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); // 2 should be topmost since it's initially the highest in the stack. - EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent())); + const std::vector<int> expected_order = {2, 1, 3}; + EXPECT_EQ(expected_order, WindowOrderAsIntVector(window_->parent())); } { @@ -826,7 +822,8 @@ resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); // 2 should be topmost since it's initially the highest in the stack. - EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent())); + const std::vector<int> expected_order = {2, 3, 1}; + EXPECT_EQ(expected_order, WindowOrderAsIntVector(window_->parent())); } } @@ -844,8 +841,7 @@ resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0); int expected_y = kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; - EXPECT_EQ("100," + base::NumberToString(expected_y) + " 300x400", - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(100, expected_y, 300, 400), window_->bounds()); } // Makes sure we don't allow dragging on the work area with multidisplay. @@ -874,8 +870,7 @@ // When the mouse cursor is in the primary display, the window cannot move // on non-work area but can get all the way towards the bottom, // restricted only by the window height. - EXPECT_EQ("100," + base::NumberToString(expected_y) + " 300x20", - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(100, expected_y, 300, 20), window_->bounds()); // Revert the drag in order to not remember the restore bounds. resizer->RevertDrag(); } @@ -893,8 +888,7 @@ kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; // When the mouse cursor is in the primary display, the window cannot move // on non-work area with kMinOnscreenHeight margin. - EXPECT_EQ("100," + base::NumberToString(expected_y) + " 300x400", - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(100, expected_y, 300, 400), window_->bounds()); resizer->CompleteDrag(); } @@ -949,9 +943,8 @@ window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT)); ASSERT_TRUE(resizer.get()); resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0); - EXPECT_EQ(base::NumberToString(window_x) + ",100 " + - base::NumberToString(kMinimumOnScreenArea - window_x) + "x380", - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(window_x, 100, kMinimumOnScreenArea - window_x, 380), + window_->bounds()); } TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) { @@ -967,11 +960,11 @@ CreateResizerForTest(window_.get(), gfx::Point(window_x, 0), HTLEFT)); ASSERT_TRUE(resizer.get()); resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); - EXPECT_EQ(base::NumberToString(right - kMinimumOnScreenArea) + ",100 " + - base::NumberToString(window_width - pixels_to_right_border + - kMinimumOnScreenArea) + - "x380", - window_->bounds().ToString()); + EXPECT_EQ( + gfx::Rect(right - kMinimumOnScreenArea, 100, + window_width - pixels_to_right_border + kMinimumOnScreenArea, + 380), + window_->bounds()); } TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) { @@ -986,11 +979,9 @@ window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP)); ASSERT_TRUE(resizer.get()); resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0); - EXPECT_EQ("100," + base::NumberToString(bottom - kMinimumOnScreenArea) + - " 300x" + - base::NumberToString(height - - (delta_to_bottom - kMinimumOnScreenArea)), - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(100, bottom - kMinimumOnScreenArea, 300, + height - (delta_to_bottom - kMinimumOnScreenArea)), + window_->bounds()); } // Verifies that 'outside' check of the resizer take into account the extended @@ -1010,9 +1001,8 @@ CreateResizerForTest(window_.get(), gfx::Point(window_x, 0), HTCAPTION)); ASSERT_TRUE(resizer.get()); resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); - EXPECT_EQ(base::NumberToString(right - kMinimumOnScreenArea) + ",100 " + - base::NumberToString(window_width) + "x380", - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(right - kMinimumOnScreenArea, 100, window_width, 380), + window_->bounds()); // With secondary display. Operation itself is same but doesn't change // the position because the window is still within the secondary display. @@ -1021,9 +1011,8 @@ gfx::Insets(0, 0, 50, 0)); window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); - EXPECT_EQ(base::NumberToString(window_x + window_width) + ",100 " + - base::NumberToString(window_width) + "x380", - window_->bounds().ToString()); + EXPECT_EQ(gfx::Rect(window_x + window_width, 100, window_width, 380), + window_->bounds()); } // Verifies snapping to edges works.
diff --git a/base/fuchsia/test_component_context_for_process.cc b/base/fuchsia/test_component_context_for_process.cc index 22a30499..3f2f9ea 100644 --- a/base/fuchsia/test_component_context_for_process.cc +++ b/base/fuchsia/test_component_context_for_process.cc
@@ -9,6 +9,7 @@ #include <lib/fidl/cpp/interface_handle.h> #include <lib/sys/cpp/component_context.h> +#include "base/files/file_enumerator.h" #include "base/fuchsia/default_context.h" #include "base/fuchsia/filtered_service_directory.h" #include "base/fuchsia/fuchsia_logging.h" @@ -16,7 +17,8 @@ namespace base { -TestComponentContextForProcess::TestComponentContextForProcess() { +TestComponentContextForProcess::TestComponentContextForProcess( + InitialState initial_state) { // TODO(https://crbug.com/1038786): Migrate to sys::ComponentContextProvider // once it provides access to an sys::OutgoingDirectory or PseudoDir through // which to publish additional_services(). @@ -26,6 +28,15 @@ context_services_ = std::make_unique<fuchsia::FilteredServiceDirectory>( base::fuchsia::ComponentContextForCurrentProcess()->svc().get()); + // Push all services from /svc to the test context if requested. + if (initial_state == InitialState::kCloneAll) { + base::FileEnumerator file_enum(base::FilePath("/svc"), false, + base::FileEnumerator::FILES); + for (auto file = file_enum.Next(); !file.empty(); file = file_enum.Next()) { + AddService(file.BaseName().value()); + } + } + // Create a ServiceDirectory backed by the contents of |incoming_directory|. fidl::InterfaceHandle<::fuchsia::io::Directory> incoming_directory; context_services_->ConnectClient(incoming_directory.NewRequest()); @@ -60,10 +71,15 @@ return context_services_->outgoing_directory(); } +void TestComponentContextForProcess::AddService( + const base::StringPiece service) { + context_services_->AddService(service); +} + void TestComponentContextForProcess::AddServices( base::span<const base::StringPiece> services) { for (auto service : services) - context_services_->AddService(service); + AddService(service); } } // namespace base
diff --git a/base/fuchsia/test_component_context_for_process.h b/base/fuchsia/test_component_context_for_process.h index f2e2b42..0c35447 100644 --- a/base/fuchsia/test_component_context_for_process.h +++ b/base/fuchsia/test_component_context_for_process.h
@@ -41,18 +41,25 @@ // test base-class: // // TEST(MyFunkyTest, IsFunky) { -// TestComponentContextForTest test_context; +// TestComponentContextForProcess test_context; // // Configure the |test_context|. // // Run tests of code that uses ComponentContextForProcess(). // } // -// Services from the original process-global ComponentContext (usually the -// environment in which the test process is running), can be exposed through the -// |test_context| with AddServices(), during test setup: +// By default created context doesn't expose any services. Services from the +// original process-global ComponentContext (usually the environment in which +// the test process is running), can be exposed through the |test_context| with +// AddServices(), during test setup: // // test_context.AddServices({fuchsia::memorypressure::Provider::Name_, ...}); // // ... Execute tests which use fuchsia.memorypressure.Provider ... // +// Alternatively InitialState::kEmpty can be passed to the constructor to expose +// all services listed in /svc, e.g.: +// +// TestComponentContextForProcess test_context( +// TestComponentContextForProcess::InitialState::kEmpty); +// // Fake/mock implementations can be exposed via additional_services(): // // ScopedServiceBinding<funky::Service> binding( @@ -68,7 +75,13 @@ // class BASE_EXPORT TestComponentContextForProcess { public: - TestComponentContextForProcess(); + enum class InitialState { + kEmpty, + kCloneAll, + }; + + TestComponentContextForProcess( + InitialState initial_state = InitialState::kEmpty); ~TestComponentContextForProcess(); TestComponentContextForProcess(const TestComponentContextForProcess&) = @@ -80,8 +93,9 @@ // published for use by the code-under test. sys::OutgoingDirectory* additional_services(); - // Allows the specified services from the original ComponentContext to be + // Allows the specified service(s) from the original ComponentContext to be // exposed via the test default ComponentContext. + void AddService(const base::StringPiece service); void AddServices(base::span<const base::StringPiece> services); // Returns the directory of services that the code under test has published
diff --git a/base/json/json_reader.h b/base/json/json_reader.h index 730d6e5..104ab50e 100644 --- a/base/json/json_reader.h +++ b/base/json/json_reader.h
@@ -1,29 +1,39 @@ // Copyright (c) 2012 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. + +// A JSON parser, converting from a base::StringPiece to a base::Value. // -// A JSON parser. Converts strings of JSON into a Value object (see -// base/values.h). -// http://www.ietf.org/rfc/rfc4627.txt?number=4627 +// The JSON spec is: +// https://tools.ietf.org/rfc/rfc8259.txt +// which obsoletes the earlier RFCs 4627, 7158 and 7159. // -// Known limitations/deviations from the RFC: -// - Only knows how to parse ints within the range of a signed 32 bit int and -// decimal numbers within a double. -// - Assumes input is encoded as UTF8. The spec says we should allow UTF-16 -// (BE or LE) and UTF-32 (BE or LE) as well. -// - We limit nesting to 100 levels to prevent stack overflow (this is allowed -// by the RFC). -// - A Unicode FAQ ("http://unicode.org/faq/utf_bom.html") writes a data -// stream may start with a Unicode Byte-Order-Mark (U+FEFF), i.e. the input -// UTF-8 string for the JSONReader::JsonToValue() function may start with a -// UTF-8 BOM (0xEF, 0xBB, 0xBF). -// To avoid the function from mis-treating a UTF-8 BOM as an invalid -// character, the function skips a Unicode BOM at the beginning of the -// Unicode string (converted from the input UTF-8 string) before parsing it. +// This RFC should be equivalent to the informal spec: +// https://www.json.org/json-en.html // -// TODO(tc): Add a parsing option to to relax object keys being wrapped in -// double quotes -// TODO(tc): Add an option to disable comment stripping +// Implementation choices permitted by the RFC: +// - Nesting is limited (to a configurable depth, 200 by default). +// - Numbers are limited to those representable by a finite double. The +// conversion from a JSON number (in the base::StringPiece input) to a +// double-flavored base::Value may also be lossy. +// - The input (which must be UTF-8) may begin with a BOM (Byte Order Mark). +// - Duplicate object keys (strings) are silently allowed. Last key-value pair +// wins. Previous pairs are discarded. +// +// Configurable (see the JSONParserOptions type) deviations from the RFC: +// - Allow trailing commas: "[1,2,]". +// - Replace invalid Unicode with U+FFFD REPLACEMENT CHARACTER. +// +// Non-configurable deviations from the RFC: +// - Allow "// etc\n" and "/* etc */" C-style comments. +// - Allow ASCII control characters, including literal (not escaped) NUL bytes +// and new lines, within a JSON string. +// - Allow "\\v" escapes within a JSON string, producing a vertical tab. +// - Allow "\\x23" escapes within a JSON string. Subtly, the 2-digit hex value +// is a Unicode code point, not a UTF-8 byte. For example, "\\xFF" in the +// JSON source decodes to a base::Value whose string contains "\xC3\xBF", the +// UTF-8 encoding of U+00FF LATIN SMALL LETTER Y WITH DIAERESIS. Converting +// from UTF-8 to UTF-16, e.g. via UTF8ToWide, will recover a 16-bit 0x00FF. #ifndef BASE_JSON_JSON_READER_H_ #define BASE_JSON_JSON_READER_H_ @@ -44,7 +54,7 @@ } enum JSONParserOptions { - // Parses the input strictly according to RFC 4627, except for where noted + // Parses the input strictly according to RFC 8259, except for where noted // above. JSON_PARSE_RFC = 0,
diff --git a/base/json/json_reader_unittest.cc b/base/json/json_reader_unittest.cc index 784600a..262d03c 100644 --- a/base/json/json_reader_unittest.cc +++ b/base/json/json_reader_unittest.cc
@@ -14,6 +14,7 @@ #include "base/path_service.h" #include "base/stl_util.h" #include "base/strings/string_piece.h" +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/build_config.h" @@ -91,7 +92,7 @@ } TEST(JSONReaderTest, NonDecimalNumbers) { - // According to RFC4627, oct, hex, and leading zeros are invalid JSON. + // According to RFC 8259, oct, hex, and leading zeros are invalid JSON. EXPECT_FALSE(JSONReader::Read("043")); EXPECT_FALSE(JSONReader::Read("0x43")); EXPECT_FALSE(JSONReader::Read("00")); @@ -113,61 +114,61 @@ // storage as doubles Optional<Value> root = JSONReader::Read("2147483648"); ASSERT_TRUE(root); - double double_val; EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(2147483648.0, double_val); + EXPECT_DOUBLE_EQ(2147483648.0, root->GetDouble()); root = JSONReader::Read("-2147483649"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(-2147483649.0, double_val); + EXPECT_DOUBLE_EQ(-2147483649.0, root->GetDouble()); +} + +TEST(JSONReaderTest, LargerIntIsLossy) { + // Parse LONG_MAX as a JSON number (not a JSON string). The result of the + // parse is a base::Value, either a (32-bit) int or a (64-bit) double. + // LONG_MAX would overflow an int and can only be approximated by a double. + // In this case, parsing is lossy. + const char* etc807 = "9223372036854775807"; + const char* etc808 = "9223372036854775808.000000"; + Optional<Value> root = JSONReader::Read(etc807); + ASSERT_TRUE(root); + ASSERT_FALSE(root->is_int()); + ASSERT_TRUE(root->is_double()); + // We use StringPrintf instead of NumberToString, because the NumberToString + // function does not let you specify the precision, and its default output, + // "9.223372036854776e+18", isn't precise enough to see the lossiness. + EXPECT_EQ(std::string(etc808), StringPrintf("%f", root->GetDouble())); } TEST(JSONReaderTest, Doubles) { Optional<Value> root = JSONReader::Read("43.1"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(43.1, double_val); + EXPECT_DOUBLE_EQ(43.1, root->GetDouble()); root = JSONReader::Read("4.3e-1"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(.43, double_val); + EXPECT_DOUBLE_EQ(.43, root->GetDouble()); root = JSONReader::Read("2.1e0"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(2.1, double_val); + EXPECT_DOUBLE_EQ(2.1, root->GetDouble()); root = JSONReader::Read("2.1e+0001"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(21.0, double_val); + EXPECT_DOUBLE_EQ(21.0, root->GetDouble()); root = JSONReader::Read("0.01"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(0.01, double_val); + EXPECT_DOUBLE_EQ(0.01, root->GetDouble()); root = JSONReader::Read("1.00"); ASSERT_TRUE(root); EXPECT_TRUE(root->is_double()); - double_val = 0.0; - EXPECT_TRUE(root->GetAsDouble(&double_val)); - EXPECT_DOUBLE_EQ(1.0, double_val); + EXPECT_DOUBLE_EQ(1.0, root->GetDouble()); // This is syntaxtically valid, but out of range of a double. auto value_with_error = @@ -191,7 +192,8 @@ EXPECT_FALSE(JSONReader::Read("1e1.0")); } -TEST(JSONReaderTest, InvalidNAN) { +TEST(JSONReaderTest, InvalidInfNAN) { + // The largest finite double is roughly 1.8e308. EXPECT_FALSE(JSONReader::Read("1e1000")); EXPECT_FALSE(JSONReader::Read("-1e1000")); EXPECT_FALSE(JSONReader::Read("NaN")); @@ -200,6 +202,8 @@ } TEST(JSONReaderTest, InvalidNumbers) { + EXPECT_TRUE(JSONReader::Read("4.3")); + EXPECT_FALSE(JSONReader::Read("4.")); EXPECT_FALSE(JSONReader::Read("4.3.1")); EXPECT_FALSE(JSONReader::Read("4e3.1")); EXPECT_FALSE(JSONReader::Read("4.a")); @@ -234,12 +238,12 @@ TEST(JSONReaderTest, UnicodeEscapes) { // Test hex and unicode escapes including the null character. - Optional<Value> root = JSONReader::Read("\"\\x41\\x00\\u1234\\u0000\""); + Optional<Value> root = JSONReader::Read("\"\\x41\\xFF\\x00\\u1234\\u0000\""); ASSERT_TRUE(root); EXPECT_TRUE(root->is_string()); std::string str_val; EXPECT_TRUE(root->GetAsString(&str_val)); - EXPECT_EQ(std::wstring(L"A\0\x1234\0", 4), UTF8ToWide(str_val)); + EXPECT_EQ(std::wstring(L"A\x00FF\0\x1234\0", 5), UTF8ToWide(str_val)); // The contents of a Unicode escape may only be four hex chars. Previously the // parser accepted things like "0x01" and "0X01". @@ -435,6 +439,16 @@ EXPECT_EQ(1, *integer_value); } +TEST(JSONReaderTest, DuplicateKeys) { + Optional<Value> dict_val = JSONReader::Read("{\"x\":1,\"x\":2,\"y\":3}"); + ASSERT_TRUE(dict_val); + ASSERT_TRUE(dict_val->is_dict()); + + auto integer_value = dict_val->FindIntKey("x"); + ASSERT_TRUE(integer_value); + EXPECT_EQ(2, *integer_value); +} + TEST(JSONReaderTest, InvalidDictionaries) { // No closing brace. EXPECT_FALSE(JSONReader::Read("{\"a\": true")); @@ -723,6 +737,19 @@ EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code()); } +TEST(JSONReaderTest, ASCIIControlCodes) { + // A literal NUL byte or a literal new line, in a JSON string, should be + // rejected. RFC 8259 section 7 says "the characters that MUST be escaped + // [include]... the control characters (U+0000 through U+001F)". + // + // Nonetheless, we accept them, for backwards compatibility. + const char json[] = {'"', 'a', '\0', 'b', '\n', 'c', '"'}; + Optional<Value> root = JSONReader::Read(std::string(json, sizeof(json))); + ASSERT_TRUE(root); + ASSERT_TRUE(root->is_string()); + EXPECT_EQ(5u, root->GetString().length()); +} + TEST(JSONReaderTest, MaxNesting) { std::string json(R"({"outer": { "inner": {"foo": true}}})"); EXPECT_FALSE(JSONReader::Read(json, JSON_PARSE_RFC, 3));
diff --git a/base/json/string_escape.h b/base/json/string_escape.h index f75f475..4f62b6d 100644 --- a/base/json/string_escape.h +++ b/base/json/string_escape.h
@@ -52,7 +52,7 @@ // interpret it as UTF-16 and convert it to UTF-8. // // The output of this function takes the *appearance* of JSON but is not in -// fact valid according to RFC 4627. +// fact valid according to RFC 8259. BASE_EXPORT std::string EscapeBytesAsInvalidJSONString(StringPiece str, bool put_in_quotes);
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index f80902e..21ffcb8 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20200409.2.1 \ No newline at end of file +0.20200409.3.1 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index f80902e..21ffcb8 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20200409.2.1 \ No newline at end of file +0.20200409.3.1 \ No newline at end of file
diff --git a/build/print_python_deps.py b/build/print_python_deps.py index 17cf6de..ca32a5b 100755 --- a/build/print_python_deps.py +++ b/build/print_python_deps.py
@@ -12,7 +12,6 @@ """ import argparse -import imp import os import pipes import sys @@ -98,6 +97,22 @@ return default_version +def _ImportModuleByPath(module_path): + """Imports a module by its source file.""" + sys.path[0] = os.path.dirname(module_path) + if sys.version_info[0] == 2: + import imp # Python 2 only, since it's deprecated in Python 3. + imp.load_source('NAME', module_path) + else: + # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly + module_name = os.path.splitext(os.path.basename(module_path))[0] + import importlib.util # Python 3 only, since it's unavailable in Python 2. + spec = importlib.util.spec_from_file_location(module_name, module_path) + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + + def main(): parser = argparse.ArgumentParser( description='Prints all non-system dependencies for the given module.') @@ -155,8 +170,7 @@ # Replace the path entry for print_python_deps.py with the one for the given # module. try: - sys.path[0] = os.path.dirname(options.module) - imp.load_source('NAME', options.module) + _ImportModuleByPath(options.module) except Exception: # Output extra diagnostics when loading the script fails. sys.stderr.write('Error running print_python_deps.py.\n')
diff --git a/cc/metrics/frame_sequence_tracker_unittest.cc b/cc/metrics/frame_sequence_tracker_unittest.cc index 459c111..428d92fb 100644 --- a/cc/metrics/frame_sequence_tracker_unittest.cc +++ b/cc/metrics/frame_sequence_tracker_unittest.cc
@@ -229,7 +229,7 @@ void ReportMetrics() { tracker_->metrics_->ReportMetrics(); } - base::TimeDelta TimeDeltaToReort() const { + base::TimeDelta TimeDeltaToReport() const { return tracker_->time_delta_to_report_; } @@ -246,6 +246,7 @@ uint64_t BeginImplFrameDataPreviousSequence() const { return tracker_->begin_impl_frame_data_.previous_sequence; } + uint64_t BeginMainFrameDataPreviousSequence() const { return tracker_->begin_main_frame_data_.previous_sequence; } @@ -257,31 +258,28 @@ FrameSequenceMetrics::ThroughputData& ImplThroughput() const { return tracker_->impl_throughput(); } + FrameSequenceMetrics::ThroughputData& MainThroughput() const { return tracker_->main_throughput(); } + FrameSequenceMetrics::ThroughputData& AggregatedThroughput() const { return tracker_->aggregated_throughput(); } - void SetTerminationStatus(FrameSequenceTracker::TerminationStatus status) { - tracker_->termination_status_ = status; + FrameSequenceTracker::TerminationStatus GetTerminationStatus( + FrameSequenceTracker* tracker) { + return tracker->termination_status_; } - FrameSequenceTracker::TerminationStatus GetTerminationStatus() { return tracker_->termination_status_; } - FrameSequenceTracker::TerminationStatus GetTerminationStatusForTracker( - FrameSequenceTracker* tracker) { - return tracker->termination_status_; - } - - protected: - uint32_t number_of_frames_checkerboarded() const { + uint32_t NumberOfFramesCheckerboarded() const { return tracker_->metrics_->frames_checkerboarded(); } + protected: std::unique_ptr<CompositorFrameReportingController> compositor_frame_reporting_controller_; FrameSequenceTrackerCollection collection_; @@ -383,7 +381,7 @@ gfx::PresentationFeedback(base::TimeTicks::Now() + interval, interval, 0); collection_.NotifyFramePresented(frame_token, feedback); - EXPECT_EQ(1u, number_of_frames_checkerboarded()); + EXPECT_EQ(1u, NumberOfFramesCheckerboarded()); } // Present a single frame with checkerboarding, followed by a non-checkerboard @@ -414,7 +412,7 @@ interval, 0); collection_.NotifyFramePresented(frame_token, feedback); - EXPECT_EQ(3u, number_of_frames_checkerboarded()); + EXPECT_EQ(3u, NumberOfFramesCheckerboarded()); } // Present multiple checkerboarded frames, followed by a non-checkerboard @@ -452,7 +450,7 @@ gfx::PresentationFeedback feedback(present_now, interval, 0); collection_.NotifyFramePresented(frame_token, feedback); - EXPECT_EQ(kFrames, number_of_frames_checkerboarded()); + EXPECT_EQ(kFrames, NumberOfFramesCheckerboarded()); } TEST_F(FrameSequenceTrackerTest, ReportMetrics) { @@ -533,7 +531,7 @@ // Now args.frame_time is 5s since the tracker creation time, so this tracker // should be scheduled to report its throughput. args = CreateBeginFrameArgs(source, ++sequence, - args.frame_time + TimeDeltaToReort()); + args.frame_time + TimeDeltaToReport()); collection_.NotifyBeginImplFrame(args); collection_.NotifyImplFrameCausedNoDamage(viz::BeginFrameAck(args, false)); collection_.NotifyFrameEnd(args, args); @@ -1076,13 +1074,13 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("P(1)"); // There is still one impl-frame not processed not, so the tracker is not yet // ready for termination. EXPECT_EQ(NumberOfRemovalTrackers(), 1u); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); } @@ -1100,7 +1098,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("s(1)e(1,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1128,7 +1126,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("e(1,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1156,7 +1154,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1182,11 +1180,11 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("s(1)P(1)"); EXPECT_EQ(NumberOfRemovalTrackers(), 1u); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); } @@ -1197,11 +1195,11 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("P(1)"); EXPECT_EQ(NumberOfRemovalTrackers(), 1u); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); } @@ -1225,7 +1223,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("n(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1253,7 +1251,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1281,7 +1279,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1304,11 +1302,11 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("n(2)P(1)"); EXPECT_EQ(NumberOfRemovalTrackers(), 1u); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); } @@ -1319,11 +1317,11 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("P(1)"); EXPECT_EQ(NumberOfRemovalTrackers(), 1u); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); } @@ -1342,7 +1340,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("n(2)e(2,0)"); // Now the |removal_tracker| should have been destroyed. @@ -1370,7 +1368,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("e(2,0)"); // Now the |removal_tracker| should have been destroyed. @@ -1426,7 +1424,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("s(1)e(1,0)b(2)s(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1454,7 +1452,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("e(1,0)b(2)s(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1482,7 +1480,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("b(2)s(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1511,7 +1509,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("s(1)e(1,0)b(2)n(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1539,7 +1537,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("e(1,0)b(2)n(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1567,7 +1565,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("b(2)n(2)e(2,0)P(1)"); // Now the |removal_tracker| should have been destroyed. @@ -1597,7 +1595,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("n(1)e(1,0)"); // Ensure that this tracker is actually removed from the |removal_trackers_| @@ -1622,7 +1620,7 @@ FrameSequenceTracker* removal_tracker = collection_.GetRemovalTrackerForTesting( FrameSequenceTrackerType::kTouchScroll); - EXPECT_EQ(GetTerminationStatusForTracker(removal_tracker), + EXPECT_EQ(GetTerminationStatus(removal_tracker), FrameSequenceTracker::TerminationStatus::kScheduledForTermination); GenerateSequence("e(1,0)"); // Ensure that this tracker is actually removed from the |removal_trackers_|
diff --git a/chrome/VERSION b/chrome/VERSION index cf8de11b..7931519 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=84 MINOR=0 -BUILD=4110 +BUILD=4111 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java index e9c997b..fa8cede0 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java
@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; import java.util.ArrayList; import java.util.HashSet; @@ -150,10 +151,11 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { + public void onActivityAttachmentChanged( + Tab tab, @Nullable WindowAndroid window) { if (mWebContents == null) return; - if (!isAttached && tab.getWebContents() == mWebContents) { + if (window == null && tab.getWebContents() == mWebContents) { if (!allowTabSwitching) { safeNativeStop(DropOutReason.TAB_DETACHED); return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java index a49b5784..5a57270 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java
@@ -25,6 +25,7 @@ import org.chromium.third_party.android.swiperefresh.SwipeRefreshLayout; import org.chromium.ui.OverscrollAction; import org.chromium.ui.OverscrollRefreshHandler; +import org.chromium.ui.base.WindowAndroid; /** * An overscroll handler implemented in terms a modified version of the Android @@ -97,8 +98,8 @@ mTab = tab; mTabObserver = new EmptyTabObserver() { @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (!isAttached && mSwipeRefreshLayout != null) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window == null && mSwipeRefreshLayout != null) { cancelStopRefreshingRunnable(); detachSwipeRefreshLayoutIfNecessary(); mSwipeRefreshLayout.setOnRefreshListener(null);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java index 4ae4e80b..25b7f52 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java
@@ -8,6 +8,8 @@ import android.content.Context; import android.view.ContextMenu; +import androidx.annotation.Nullable; + import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.browser.ChromeActivity; @@ -25,6 +27,7 @@ import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.WebContents; import org.chromium.net.NetworkChangeNotifier; +import org.chromium.ui.base.WindowAndroid; /** Manages the activation and gesture listeners for ContextualSearch on a given tab. */ public class ContextualSearchTabHelper @@ -151,8 +154,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) { updateHooksForTab(tab); } else { removeContextualSearchHooks(mWebContents);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutController.java b/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutController.java index 8efd4bf21..997ed13 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutController.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.display_cutout; +import android.app.Activity; import android.graphics.Rect; import android.view.WindowManager.LayoutParams; @@ -14,14 +15,17 @@ import org.chromium.base.UserDataHost; import org.chromium.base.annotations.JNINamespace; import org.chromium.blink.mojom.ViewportFit; +import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabImpl; import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.tab.TabSelectionType; +import org.chromium.chrome.browser.tab.TabUtils; import org.chromium.components.browser_ui.widget.InsetObserverView; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; +import org.chromium.ui.base.WindowAndroid; /** * Controls the display cutout state for the tab. @@ -65,11 +69,11 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { assert tab == mTab; - if (isAttached) { - maybeAddInsetObserver(); + if (window != null) { + maybeAddInsetObserver(window.getActivity().get()); } else { maybeRemoveInsetObserver(); } @@ -93,17 +97,17 @@ mTab = tab; tab.addObserver(mTabObserver); - maybeAddInsetObserver(); + maybeAddInsetObserver(TabUtils.getActivity(tab)); } /** * Add an observer to {@link InsetObserverView} if we have not already added * one. */ - private void maybeAddInsetObserver() { - if (mInsetObserverView != null || ((TabImpl) mTab).getActivity() == null) return; + private void maybeAddInsetObserver(Activity activity) { + if (mInsetObserverView != null || activity == null) return; - mInsetObserverView = ((TabImpl) mTab).getActivity().getInsetObserverView(); + mInsetObserverView = ((ChromeActivity) activity).getInsetObserverView(); if (mInsetObserverView == null) return; mInsetObserverView.addObserver(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider.java index a376c9d..86f9d83 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider.java
@@ -13,6 +13,7 @@ import org.chromium.components.dom_distiller.content.DistillablePageUtils; import org.chromium.components.dom_distiller.content.DistillablePageUtils.PageDistillableDelegate; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; /** * A mechanism for clients interested in the distillability of a page to receive updates. @@ -145,8 +146,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) return; + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) return; resetState(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java index 0489349..cb72a92a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java
@@ -28,6 +28,7 @@ import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.KeyboardVisibilityDelegate.KeyboardVisibilityListener; +import org.chromium.ui.base.WindowAndroid; import java.util.ArrayList; @@ -118,8 +119,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) { initializeContainerView(); updateWebContents(); } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java index e5e83cf..33ae0637 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; +import org.chromium.ui.base.WindowAndroid; import java.lang.reflect.InvocationTargetException; import java.util.LinkedList; @@ -331,10 +332,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) { - dismissActivity(mActivity, METRICS_END_REASON_REPARENT); - } + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) dismissActivity(mActivity, METRICS_END_REASON_REPARENT); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java index 8a563405..1ae9df4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -7,12 +7,15 @@ import android.graphics.Bitmap; import android.view.ContextMenu; +import androidx.annotation.Nullable; + import org.chromium.components.find_in_page.FindMatchRectsDetails; import org.chromium.components.find_in_page.FindNotificationDetails; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.net.NetError; +import org.chromium.ui.base.WindowAndroid; /** * An implementation of the {@link TabObserver} which has empty implementations of all methods. @@ -126,7 +129,7 @@ String targetUrl, WebContents newWebContents) {} @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) {} + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {} @Override public void onInteractabilityChanged(Tab tab, boolean isInteractable) {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java index d77f044..cda9516 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tab; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; @@ -26,6 +27,7 @@ import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.ConsoleMessageLevel; +import org.chromium.ui.base.WindowAndroid; /** * Class that controls navigations and allows to intercept them. It is used on Android to 'convert' @@ -76,8 +78,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean attached) { - if (attached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) { setExternalNavigationHandler( mTab.getDelegateFactory().createExternalNavigationHandler(tab)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java index 293e75e9..9ad63b1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import androidx.annotation.Nullable; + import org.chromium.base.Callback; import org.chromium.base.UserData; import org.chromium.base.annotations.NativeMethods; @@ -11,6 +13,7 @@ import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.BrowserControlsState; +import org.chromium.ui.base.WindowAndroid; /** * Manages the state of tab browser controls. @@ -82,8 +85,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) updateVisibilityDelegate(); + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) updateVisibilityDelegate(); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index 79f092b..c014142 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -308,8 +308,7 @@ // Non-null delegate factory while being detached is not valid. assert !(window == null && tabDelegateFactory != null); - boolean attached = window != null; - if (attached) { + if (window != null) { updateWindowAndroid(window); if (tabDelegateFactory != null) setDelegateFactory(tabDelegateFactory); @@ -324,7 +323,7 @@ || (window == null && tabDelegateFactory == null); if (notify) { for (TabObserver observer : mObservers) { - observer.onActivityAttachmentChanged(this, attached); + observer.onActivityAttachmentChanged(this, window); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java index c6276e4..ec45486 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -7,12 +7,15 @@ import android.graphics.Bitmap; import android.view.ContextMenu; +import androidx.annotation.Nullable; + import org.chromium.chrome.browser.TabLoadStatus; import org.chromium.components.find_in_page.FindMatchRectsDetails; import org.chromium.components.find_in_page.FindNotificationDetails; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; /** * An observer that is notified of changes to a {@link Tab} object. @@ -289,9 +292,10 @@ /** * Called when the Tab is attached or detached from an {@code Activity}. * @param tab The notifying {@link Tab}. - * @param isAttached Whether the Tab is being attached or detached. + * @param window {@link WindowAndroid} which the Tab is being associated with. {@code null} if + * the tab is being detached. */ - void onActivityAttachmentChanged(Tab tab, boolean isAttached); + void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window); /** * A notification when tab changes whether or not it is interactable and is accepting input.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java index 0606eef1..ba2cb1d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java
@@ -8,6 +8,8 @@ import android.os.Handler; import android.os.Message; +import androidx.annotation.Nullable; + import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.util.AccessibilityUtil; @@ -21,6 +23,7 @@ import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.BrowserControlsState; +import org.chromium.ui.base.WindowAndroid; /** * Determines the desired visibility of the browser controls based on the current state of a given @@ -149,8 +152,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) updateVisibilityConstraints(); + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) updateVisibilityConstraints(); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java index 76513cc..5009aeb8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
@@ -17,6 +17,7 @@ import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.RenderWidgetHostView; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.util.ColorUtils; /** @@ -253,7 +254,7 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { updateDefaultColor(); updateDefaultBackgroundColor(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java index b779a7d4..283bb73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java
@@ -6,10 +6,13 @@ import android.view.ViewGroup; +import androidx.annotation.Nullable; + import org.chromium.base.Callback; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.content_public.browser.RenderWidgetHostView; import org.chromium.ui.base.ViewAndroidDelegate; +import org.chromium.ui.base.WindowAndroid; /** * Implementation of the abstract class {@link ViewAndroidDelegate} for Chrome. @@ -36,8 +39,8 @@ mTab.addObserver(new EmptyTabObserver() { @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (isAttached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window != null) { mCurrentInsetSupplier = tab.getWindowAndroid().getApplicationBottomInsetProvider(); mCurrentInsetSupplier.addObserver(insetObserver);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java index c100790..a3cd12b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java
@@ -43,6 +43,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -68,8 +69,8 @@ mActivity = activity; tab.addObserver(new EmptyTabObserver() { @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (!isAttached) mActivity = null; + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window == null) mActivity = null; } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java index fe99e90..5cff9414 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -7,6 +7,7 @@ import android.app.Activity; import android.os.Handler; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; @@ -18,6 +19,7 @@ import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver; +import org.chromium.ui.base.WindowAndroid; import java.util.concurrent.atomic.AtomicBoolean; @@ -192,8 +194,8 @@ } @Override - public void onActivityAttachmentChanged(Tab tab, boolean attached) { - if (!attached && !isReparentingInProgress()) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window == null && !isReparentingInProgress()) { getModel(tab.isIncognito()).removeTab(tab); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java index 3f0a9dc8..489d8ad 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/SuspendedTab.java
@@ -15,6 +15,7 @@ import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; @@ -29,6 +30,7 @@ import org.chromium.chrome.browser.tab.TabImpl; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsAccessibility; +import org.chromium.ui.base.WindowAndroid; /** * Represents the suspension page presented when a user tries to visit a site whose fully-qualified @@ -207,8 +209,8 @@ // TabObserver implementation. @Override - public void onActivityAttachmentChanged(Tab tab, boolean isAttached) { - if (!isAttached) { + public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) { + if (window == null) { removeViewIfPresent(); } else { attachView();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java index 2f20e2d2..f697b86 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
@@ -220,7 +220,7 @@ findApps(methods); - Assert.assertTrue("No apps should still match the query", mPaymentApps.isEmpty()); + assertPaymentAppsHaveIdentifiers(/*no identifier*/); } /** @@ -587,24 +587,14 @@ findApps(methods); - Assert.assertEquals("2 apps should match the query", 2, mPaymentApps.size()); - Set<String> appIdentifiers = new HashSet<>(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.bobpay")); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); + assertPaymentAppsHaveIdentifiers("com.bobpay", "com.alicepay"); mPaymentApps.clear(); mAllPaymentAppsCreated = false; findApps(methods); - Assert.assertEquals("2 apps should still match the query", 2, mPaymentApps.size()); - appIdentifiers.clear(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.bobpay")); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); + assertPaymentAppsHaveIdentifiers("com.bobpay", "com.alicepay"); } /** @@ -787,14 +777,7 @@ findApps(methods); - Assert.assertEquals("3 apps should still match the query", 3, mPaymentApps.size()); - appIdentifiers.clear(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(2).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); - Assert.assertTrue(appIdentifiers.contains("com.bobpay")); - Assert.assertTrue(appIdentifiers.contains("com.charliepay")); + assertPaymentAppsHaveIdentifiers("com.alicepay", "com.bobpay", "com.charliepay"); } /** @@ -877,8 +860,7 @@ findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.alicepay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.alicepay"); } /** @@ -980,12 +962,7 @@ findApps(methods); - Assert.assertEquals("2 apps should still match the query", 2, mPaymentApps.size()); - appIdentifiers.clear(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.henrypay")); - Assert.assertTrue(appIdentifiers.contains("com.bobpay")); + assertPaymentAppsHaveIdentifiers("com.henrypay", "com.bobpay"); } /** @@ -1051,24 +1028,14 @@ findApps(methods); - Assert.assertEquals("2 apps should match the query", 2, mPaymentApps.size()); - Set<String> appIdentifiers = new HashSet<>(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.ikepay")); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); + assertPaymentAppsHaveIdentifiers("com.ikepay", "com.alicepay"); mPaymentApps.clear(); mAllPaymentAppsCreated = false; findApps(methods); - Assert.assertEquals("2 apps should still match the query", 2, mPaymentApps.size()); - appIdentifiers.clear(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.ikepay")); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); + assertPaymentAppsHaveIdentifiers("com.ikepay", "com.alicepay"); } /** @@ -1096,8 +1063,7 @@ findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.henrypay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.henrypay"); } /** @@ -1117,8 +1083,42 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.merchant.twa", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.merchant.twa"); + } + + /** + * For finding app store billing app, test scenario where no payment app has been installed. The + * test setting intentionally omits the app installations. + */ + @Test + @Feature({"Payments"}) + public void testFindAppStoreBillingAppNoAppAvailable() throws Throwable { + Set<String> methods = new HashSet<>(); + methods.add("https://play.google.com/billing"); + + mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); + findApps(methods); + + assertPaymentAppsHaveIdentifiers(/*no identifiers*/); + } + + /** + * For finding app store billing app, test scenario where the app's meta data is null. The test + * setting intentionally set the payment app's meta data to null. + */ + @Test + @Feature({"Payments"}) + public void testFindAppStoreBillingAppNullMetaData() throws Throwable { + Set<String> methods = new HashSet<>(); + methods.add("https://play.google.com/billing"); + + mPackageManager.installPaymentApp( + "MerchantTwaApp", "com.merchant.twa", null, /*signature=*/"01020304050607080900"); + + mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); + findApps(methods); + + assertPaymentAppsHaveIdentifiers(/*no identifiers*/); } /** @@ -1137,8 +1137,7 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.merchant.twa", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.merchant.twa"); } /** @@ -1159,8 +1158,7 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.merchant.twa", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.merchant.twa"); } /** @@ -1186,8 +1184,7 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.another.appstore"); findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.bobpay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.bobpay"); } /** @@ -1212,8 +1209,7 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.another.appstore"); findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.bobpay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.bobpay"); } /** @@ -1238,8 +1234,7 @@ findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.bobpay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.bobpay"); } /** @@ -1265,8 +1260,7 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); findApps(noRequestedMethod); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.bobpay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.bobpay"); } /** @@ -1320,8 +1314,7 @@ mockTwaAndItsInstaller("com.merchant.twa", "com.android.vending"); findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.bobpay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.bobpay"); } /** @@ -1344,24 +1337,14 @@ findApps(methods); - Assert.assertEquals("2 apps should match the query", 2, mPaymentApps.size()); - Set<String> appIdentifiers = new HashSet<>(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); - Assert.assertTrue(appIdentifiers.contains("com.bobpay")); + assertPaymentAppsHaveIdentifiers("com.alicepay", "com.bobpay"); mPaymentApps.clear(); mAllPaymentAppsCreated = false; findApps(methods); - Assert.assertEquals("2 apps should still match the query", 2, mPaymentApps.size()); - appIdentifiers.clear(); - appIdentifiers.add(mPaymentApps.get(0).getIdentifier()); - appIdentifiers.add(mPaymentApps.get(1).getIdentifier()); - Assert.assertTrue(appIdentifiers.contains("com.alicepay")); - Assert.assertTrue(appIdentifiers.contains("com.bobpay")); + assertPaymentAppsHaveIdentifiers("com.alicepay", "com.bobpay"); } /** @@ -1402,8 +1385,7 @@ findApps(methods); - Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size()); - Assert.assertEquals("com.alicepay", mPaymentApps.get(0).getIdentifier()); + assertPaymentAppsHaveIdentifiers("com.alicepay"); Assert.assertEquals(5, mPaymentApps.get(0).getInstrumentMethodNames().size()); Assert.assertTrue(mPaymentApps.get(0).getInstrumentMethodNames().contains("basic-card")); Assert.assertTrue(mPaymentApps.get(0).getInstrumentMethodNames().contains("interledger"));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java index d9d8812..3ce26d9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java
@@ -107,11 +107,12 @@ initHelper(); Mockito.verify(mDelegateFactory, Mockito.never()) .createBrowserControlsVisibilityDelegate(mTab); - mRegisteredTabObserver.onActivityAttachmentChanged(mTab, false); + mRegisteredTabObserver.onActivityAttachmentChanged(mTab, null); Mockito.verify(mDelegateFactory, Mockito.never()) .createBrowserControlsVisibilityDelegate(mTab); - mRegisteredTabObserver.onActivityAttachmentChanged(mTab, true); + WindowAndroid window = Mockito.mock(WindowAndroid.class); + mRegisteredTabObserver.onActivityAttachmentChanged(mTab, window); Mockito.verify(mDelegateFactory, Mockito.times(1)) .createBrowserControlsVisibilityDelegate(mTab); verifyUpdateState(BrowserControlsState.BOTH); @@ -139,7 +140,8 @@ Mockito.when(newDelegateFactory.createBrowserControlsVisibilityDelegate(Mockito.any())) .thenReturn(newVisibilityDelegate); - mRegisteredTabObserver.onActivityAttachmentChanged(mTab, true); + WindowAndroid window = Mockito.mock(WindowAndroid.class); + mRegisteredTabObserver.onActivityAttachmentChanged(mTab, window); Mockito.verify(newDelegateFactory).createBrowserControlsVisibilityDelegate(mTab); verifyUpdateState(BrowserControlsState.BOTH);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java index bab279e..3623966 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
@@ -15,6 +15,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.chromium.base.supplier.ObservableSupplierImpl; @@ -88,13 +89,13 @@ assertEquals("The bottom inset for the tab should be non-zero.", 10, mViewAndroidDelegate.getViewportInsetBottom()); - mTabObserverCaptor.getValue().onActivityAttachmentChanged(mTab, false); + mTabObserverCaptor.getValue().onActivityAttachmentChanged(mTab, null); assertEquals("The bottom inset for the tab should be zero.", 0, mViewAndroidDelegate.getViewportInsetBottom()); - mTabObserverCaptor.getValue().onActivityAttachmentChanged(mTab, true); - + WindowAndroid window = Mockito.mock(WindowAndroid.class); + mTabObserverCaptor.getValue().onActivityAttachmentChanged(mTab, window); assertEquals("The bottom inset for the tab should be non-zero.", 10, mViewAndroidDelegate.getViewportInsetBottom()); }
diff --git a/chrome/android/static_initializers.gni b/chrome/android/static_initializers.gni index 3d6b7b78..6b5a9bb 100644 --- a/chrome/android/static_initializers.gni +++ b/chrome/android/static_initializers.gni
@@ -12,14 +12,7 @@ if (current_toolchain == default_toolchain && (!is_debug && !using_sanitizer && proprietary_codecs)) { # Define expectations only for target_cpu covered by trybots. - # Currently static_initializers come from: - # * iostream.cpp - # * token.cc - if (target_cpu == "arm") { + if (target_cpu == "arm" || target_cpu == "arm64") { expected_static_initializer_count = 2 - } else if (target_cpu == "arm64") { - # arm64 has additional static initializers from: - # * base_logging (https://crbug.com/1067438) - expected_static_initializer_count = 3 } }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 0a825de..88e9b20d 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -10467,9 +10467,9 @@ Learn more </message> - <!-- Speech On-Device API --> - <message name="IDS_UTILITY_PROCESS_SODA_SERVICE_NAME" desc="The name of the service process used to interface with the Speech On-Demand API."> - SODA Service + <!-- Speech Recognition --> + <message name="IDS_UTILITY_PROCESS_SPEECH_RECOGNITION_SERVICE_NAME" desc="The name of the service process used to interface with the Speech On-Demand API."> + Speech recognition service </message> <!-- App pause prompt -->
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index ff7256e..07a1030 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -128,7 +128,7 @@ <translation id="6096348254544841612">Přizpůsobte si prohlížeč Chromium a ovládejte jej. Je k dispozici aktualizace.</translation> <translation id="6120345080069858279">Chromium vám toto heslo uloží do účtu Google. Nebudete si ho muset pamatovat.</translation> <translation id="6129621093834146363">Soubor <ph name="FILE_NAME" /> je nebezpečný, proto jej prohlížeč Chromium zablokoval.</translation> -<translation id="6134968993075716475">Bezpečné prohlížení je vypnuté. Chromium doporučuje zapnout ho.</translation> +<translation id="6134968993075716475">Bezpečné prohlížení je vypnuté. Chromium ho doporučuje zapnout.</translation> <translation id="6212496753309875659">V tomto počítači je již nainstalována novější verze prohlížeče Chromium. Jestliže tento software nefunguje, odinstalujte Chromium a zkuste to znovu.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium se nyní restartuje}=1{Chromium se za 1 sekundu restartuje}few{Chromium se za # sekundy restartuje}many{Chromium se za # sekundy restartuje}other{Chromium se za # sekund restartuje}}</translation> <translation id="6248213926982192922">Nastavit Chromium jako výchozí prohlížeč</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 515be22d..f728e1c 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -124,7 +124,7 @@ <translation id="6096348254544841612">Personalize e controle o Chromium. Uma atualização está disponível.</translation> <translation id="6120345080069858279">O Chromium salvará essa senha na sua Conta do Google. Você não precisará se lembrar dela.</translation> <translation id="6129621093834146363">O arquivo <ph name="FILE_NAME" /> é perigoso. Por isso ele foi bloqueado pelo Chromium.</translation> -<translation id="6134968993075716475">O "Navegação segura" está desativado. O Chromium recomenda reativá-lo.</translation> +<translation id="6134968993075716475">O "Navegação segura" está desativado. O Chromium recomenda ativá-lo.</translation> <translation id="6212496753309875659">Este computador já tem uma versão mais recente do Chromium. Se o software não estiver funcionando, desinstale o Chromium e tente novamente.</translation> <translation id="6219195342503754812">{0,plural, =0{O Chromium será reiniciado agora}=1{O Chromium será reiniciado em 1 segundo}one{O Chromium será reiniciado em # segundo}other{O Chromium será reiniciado em # segundos}}</translation> <translation id="6248213926982192922">Tornar o Chromium o navegador padrão</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index ca82d436..aa4180c1 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Boekmerknaam</translation> <translation id="1124772482545689468">Gebruiker</translation> <translation id="1125550662859510761">Lyk soos <ph name="WIDTH" /> x <ph name="HEIGHT" /> (oorspronlik)</translation> +<translation id="1126809382673880764">Beskerm jou nie teen gevaarlike webwerwe, aflaaie en uitbreidings nie. Jy sal steeds Veiligblaai-beskerming in ander Google-dienste, soos Gmail en Search, kry waar dit beskikbaar is.</translation> <translation id="1128109161498068552">Moenie enige werwe toelaat om boodskappe wat eksklusief tot die stelsel is, te gebruik om by MIDI-toestelle in te gaan nie.</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Wysig soekenjin</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Bekende netwerke</translation> <translation id="123578888592755962">Skyf vol</translation> <translation id="1238191093934674082">Oop VPN (virtuele private netwerk)</translation> +<translation id="1239439601391236986">Wys voorstelle oor die invoer van persoonlike inligting</translation> <translation id="1239594683407221485">Verken die toestel se inhoud in die Lêers-program.</translation> <translation id="124116460088058876">Meer tale</translation> <translation id="1241753985463165747">Lees en verander al jou data op die huidige webwerf wanneer dit opgeroep word</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Sellulêre aktivering</translation> <translation id="1407489512183974736">Middel gesnoei</translation> <translation id="1408504635543854729">Verken die toestel se inhoud in die Lêers-program. Die inhoud word deur 'n administrateur beperk en kan nie gewysig word nie.</translation> +<translation id="1408980562518920698">Bestuur persoonlike inligting</translation> <translation id="1410197035576869800">Programikoon</translation> <translation id="1410616244180625362">Hou aan om <ph name="HOST" /> toe te laat om by jou kamera in te gaan</translation> <translation id="1414648216875402825">Jy dateer tans na 'n onstabiele weergawe van <ph name="PRODUCT_NAME" /> op wat kenmerke bevat wat tans besig is. Omvalle en onverwagte lêerfoute sal opduik. Gaan met omsigtigheid voort.</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">JavaScript-konsole</translation> <translation id="1587907146729660231">Raak die aan/af-skakelaar met jou vinger</translation> +<translation id="1588200577109872591">Sliminvoere</translation> <translation id="1588438908519853928">Normaal</translation> <translation id="158849752021629804">Benodig tuisnetwerk</translation> <translation id="1588870296199743671">Maak skakel oop met …</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">Meld aan as</translation> <translation id="1880905663253319515">Vee sertifikaat "<ph name="CERTIFICATE_NAME" />" uit?</translation> <translation id="1884013283844450420">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, koppel</translation> +<translation id="1884705339276589024">Verander grootte van Linux-skyf</translation> <translation id="1886996562706621347">Laat werwe toe om te vra om verstekhanteerders vir protokolle te word (aanbeveel)</translation> <translation id="1887442540531652736">Aanmeldfout</translation> <translation id="1887597546629269384">Sê weer "Hey Google"</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181">Jy verander tans na 'n kanaal met 'n ouer weergawe van <ph name="PRODUCT_NAME" />. Die kanaalverandering sal toegepas word wanneer die kanaalweergawe ooreenstem met die weergawe wat tans op jou toestel geïnstalleer is.</translation> <translation id="197989455406964291">KDC steun nie enkripsiesoort nie</translation> <translation id="1982354452682152483">Geen beskrywing is beskikbaar nie.</translation> +<translation id="1984417487208496350">Geen beskerming nie (nie aanbeveel nie)</translation> <translation id="1987317783729300807">Rekeninge</translation> <translation id="1989112275319619282">Blaai deur</translation> <translation id="1990512225220753005">Moenie kortpaaie op hierdie bladsy wys nie</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">Om jou rekeninginligting te herwin, gaan na: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Stelselsekuriteitsinstelling</translation> <translation id="2091887806945687916">Klank</translation> +<translation id="2096478741073211388">Voorstelle oor persoonlike inligting help jou om vinniger te skryf deur jou naam, adres of foonnommer voor te stel wanneer jy sekere spesifieke woorde intik. Net jy kan jou private, gepersonaliseerde voorstelle vir jou rekening sien.</translation> <translation id="2096715839409389970">Vee derdeparty-webkoekies uit</translation> <translation id="2097372108957554726">Jy moet by Chrome aanmeld om nuwe toestelle te registreer.</translation> <translation id="2099172618127234427">Jy aktiveer tans Chrome-bedryfstelselontfoutingkenmerke wat sshd daemon sal opstel en selflaai van USB-datastokkies af moontlik sal maak.</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">Herlaai raam</translation> <translation id="2114896190328250491">Foto deur <ph name="NAME" /></translation> <translation id="2119349053129246860">Maak in <ph name="APP" /> oop</translation> +<translation id="2119461801241504254">Veiligblaai is aan en beskerm jou teen skadelike werwe en aflaaie</translation> <translation id="2120297377148151361">Aktiwiteit en interaksies</translation> <translation id="2120639962942052471">Het <ph name="PERMISSION" /> geblokkeer</translation> <translation id="2121055421682309734">{COUNT,plural, =0{Webkoekies word geblokkeer}=1{Webkoekies word geblokkeer; 1 uitsondering}other{Webkoekies word geblokkeer; {COUNT} uitsonderings}}</translation> @@ -1891,6 +1899,7 @@ <translation id="3515983984924808886">Raak weer jou sekuriteitsleutel om terugstelling te bevestig. Alle inligting wat op die sekuriteitsleutel geberg is, insluitend sy PIN, sal uitgevee word.</translation> <translation id="3518985090088779359">Aanvaar, gaan voort</translation> <translation id="351952459507671940">Voeg by nuwe groep</translation> +<translation id="3521606918211282604">Verander skyfgrootte</translation> <translation id="3523642406908660543">Vra wanneer 'n werf 'n inprop wil gebruik om toegang tot jou rekenaar te verkry (aanbeveel)</translation> <translation id="3524965460886318643">Voer aktiwiteite uit</translation> <translation id="3526034519184079374">Kan nie werf se data lees of verander nie</translation> @@ -1978,6 +1987,7 @@ <translation id="3629631988386925734">Voer jou wagwoord in om Smart Lock te aktiveer. Jou foon sal volgende keer jou <ph name="DEVICE_TYPE" /> ontsluit. Jy kan Smart Lock in Instellings afskakel.</translation> <translation id="3630132874740063857">Jou foon</translation> <translation id="3630995161997703415">Voeg hierdie werf by jou rak om dit enige tyd te gebruik</translation> +<translation id="3633309367764744750">Haal inligting vooraf vanaf bladsye, insluitend bladsye wat jy nog nie besoek het nie. Inligting wat gaan haal word, kan webkoekies insluit as jy webkoekies toelaat.</translation> <translation id="3634507049637220048">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, deur jou administrateur bestuur, besonderhede</translation> <translation id="3635241501480133979">Hierdie data oortree jou organisasie se sekuriteitbeleid en kan nie gelos word nie.</translation> <translation id="3635353578505343390">Stuur terugvoer na Google</translation> @@ -3938,6 +3948,7 @@ <translation id="6298962879096096191">Gebruik Google Play om Android-programme te installeer</translation> <translation id="630065524203833229">Gaan uit</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> kon nie outomaties opgestel word nie. Spesifiseer asseblief gevorderde drukkerbesonderhede. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Voorstelle oor persoonlike inligting</translation> <translation id="6305607932814307878">Globale beleid:</translation> <translation id="6307990684951724544">Stelsel besig</translation> <translation id="6308493641021088955">Aanmelding verskaf deur <ph name="EXTENSION_NAME" /></translation> @@ -4016,6 +4027,7 @@ <translation id="641081527798843608">Voorwerppassing</translation> <translation id="6412673304250309937">Vergelyk URL'e met 'n lys onveilige werwe wat in Chrome geberg word. As 'n werf probeer om jou wagwoord te steel, of wanneer jy 'n skadelike lêer aflaai, sal Chrome dalk ook URL'e, insluitend stukkies bladsyinhoud, na Veiligblaai toe stuur.</translation> <translation id="6412931879992742813">Nuwe incognito-venster</translation> +<translation id="6413591858632097328">Dit sal alle data en webkoekies uitvee wat deur <ph name="ORIGIN_NAME" /> en sy geïnstalleerde programme geberg is.</translation> <translation id="641469293210305670">Instelleer opdaterings en programme</translation> <translation id="6414888972213066896">Jy het jou ouer gevra of dit OK is om hierdie werf te besoek</translation> <translation id="6415900369006735853">Koppel aan die internet deur jou foon</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 97753ae..db8f334 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">የዕልባት ስም</translation> <translation id="1124772482545689468">ተጠቃሚ</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> ይመስላል (ቤተኛ)</translation> +<translation id="1126809382673880764">እርስዎን አደገኛ ከሆኑ የድር ጣቢያዎች፣ ማውረዶች እና ቅጥያዎች አይጠብቀዎትም። አሁንም የሚገኝ በሆነበት ጊዜ እንደ Gmail እና ፍለጋ ባሉ ሌሎች የGoogle አገልግሎቶች ላይ የጥንቃቄ አሰሳ ጥበቃን ያገኛሉ።</translation> <translation id="1128109161498068552">ማናቸውንም ጣቢያዎች ለሚመለከተው ስርዓት የተወሰኑ መልዕክቶችን MIDI መሳሪያዎችን ለመድረስ እንዲጠቀሙ አይፍቀዱ።</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">የፍለጋ ፕሮግራምን ያርትዑ</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">የታወቁ አውታረ መረቦች</translation> <translation id="123578888592755962">ዲስክ ሙሉ ነው</translation> <translation id="1238191093934674082">Open VPN</translation> +<translation id="1239439601391236986">የግቤት የግል መረጃ አስተያየት ጥቆማዎችን አሳይ</translation> <translation id="1239594683407221485">የመሣሪያውን ይዘት በፋይሎች መተግበሪያው ውስጥ ያስሱት።</translation> <translation id="124116460088058876">ተጨማሪ ቋንቋዎች</translation> <translation id="1241753985463165747">ሲጠራ በአሁኑ ድር ጣቢያ ላይ ያለውን ውሂብ ሁሉ ያነብባል እና ይቀይራል</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">ተንቀሳቃሽ ማግበሪያ</translation> <translation id="1407489512183974736">እስከ መሃከል የተከረከመ</translation> <translation id="1408504635543854729">የመሣሪያውን ይዘት በፋይሎች መተግበሪያው ውስጥ ያስሱት። ይዘቱ በአስተዳዳሪ የተገደበ ነው እና ሊሻሻል አይችልም።</translation> +<translation id="1408980562518920698">የግል መረጃን አቀናብር</translation> <translation id="1410197035576869800">የመተግበሪያ አዶ</translation> <translation id="1410616244180625362"><ph name="HOST" /> የካሜራዎ መዳረሻ መስጠቱን ይቀጥሉ</translation> <translation id="1414648216875402825">በሂደት ላይ ያሉ ባህሪያትን የያዘ ያልተረጋጋ ወደሆነ የ<ph name="PRODUCT_NAME" /> ስሪት እያዘመኑ ነው። ብልሽቶች እና ያልተጠበቁ ሳንካዎች ያጋጥማሉ። እባክዎ በጥንቃቄ ይቀጥሉ።</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&ጃቫስክሪፕት ኮንሶል</translation> <translation id="1587907146729660231">በጣትዎ የኃይል አዝራሩን ነካ ያድርጉ</translation> +<translation id="1588200577109872591">ዘመናዊ ግቤቶች</translation> <translation id="1588438908519853928">መደበኛ</translation> <translation id="158849752021629804">የቤት አውታረ መረብ ያስፈልጋል</translation> <translation id="1588870296199743671">አገናኝ ክፈት በ...</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">በመለያ ይግቡ እንደ</translation> <translation id="1880905663253319515">«<ph name="CERTIFICATE_NAME" />» የእውቅና ማረጋገጫ ይሰረዝ?</translation> <translation id="1884013283844450420">አውታረ መረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />፣ <ph name="NETWORK_NAME" />፣ አገናኝ</translation> +<translation id="1884705339276589024">የLinux ዲስክ መጠንን ቀይር</translation> <translation id="1886996562706621347">ጣቢያዎች ለፕሮቶኮሎች ነባሪ ከዋኞች እንዲሆኑ እንዲጠይቁ ፍቀድ (የሚመከር)</translation> <translation id="1887442540531652736">የመግባት ስህተት</translation> <translation id="1887597546629269384">እንደገና «Hey Google» ይበሉ</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181">የቆየ የ<ph name="PRODUCT_NAME" /> ስሪት ወዳለው ሰርጥ እየቀየሩ ነው። የስርጡ ስሪት አሁን በመሣሪያዎ ላይ ከተጫነው ስሪት ጋር ሲዛመድ ነው የሰርጡ ለውጥ የሚተገበረው።</translation> <translation id="197989455406964291">KDC የምስጠራ ዓይነትን አይደግፍም</translation> <translation id="1982354452682152483">ምንም ዝርዝር መግለጫ አይገኝም።</translation> +<translation id="1984417487208496350">ምንም ጥበቃ የለም (አይመከርም)</translation> <translation id="1987317783729300807">መለያዎች</translation> <translation id="1989112275319619282">አስስ</translation> <translation id="1990512225220753005">በዚህ ገጽ ላይ አቋራጮችን አታሳይ</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">የጠፋብዎትን የመለያ መረጃ መልሶ ለማግኘት፣ ወደዚህ ይሂዱ፦ google.com/accounts/recovery</translation> <translation id="2090876986345970080">የስርዓት ደህንነት ቅንብር</translation> <translation id="2091887806945687916">ድምፅ</translation> +<translation id="2096478741073211388">የግል መረጃ አስተያየት ጥቆማዎች እርስዎ የተወሰኑ ቃላትን ሲተይቡ የእርስዎን ስም፣ አድራሻ ወይም የስልክ ቁጥር በመጠቆም በፍትነት እንዲጽፉ ያግዝዎታል። እርስዎ ብቻ ነዎት የራስዎን የግል፣ ለመለያዎ ግላዊነት የተላበሱ የአስተያየት ጥቆማዎችን ማየት የሚችሉት።</translation> <translation id="2096715839409389970">የሦስተኛ ወገን ኩኪዎችን አጽዳ</translation> <translation id="2097372108957554726">አዲስ መሣሪያዎችን ለማስመዝገብ በመለያ ወደ Chrome መግባት አለብዎት</translation> <translation id="2099172618127234427">የsshd ስውር አገልጋይን የሚያዋቅሩ እና ከዩኤስቢ አንጻፊዎች ማስነሳትን የሚያነቁ የChrome OS ማረሚያ ባህሪያትን እያነቁ ነው።</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">&ክፈፍን ዳግም ጫን</translation> <translation id="2114896190328250491">ፎቶ በ<ph name="NAME" /></translation> <translation id="2119349053129246860">በ<ph name="APP" /> ውስጥ ክፈት</translation> +<translation id="2119461801241504254">የጥንቃቄ አሰሳ በርቷል እና እርስዎን ከጎጂ ጣቢያዎች እና ማውረዶች እየጠበቀ ነው</translation> <translation id="2120297377148151361">እንቅስቃሴ እና መስተጋብሮች</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> ታግዷል</translation> <translation id="2121055421682309734">{COUNT,plural, =0{ኩኪዎች ታግደዋል}=1{ኩኪዎች ታግደዋል፣ 1 አልተካተተም}one{ኩኪዎች ታግደዋል፣ {COUNT} አልተካተቱም}other{ኩኪዎች ታግደዋል፣ {COUNT} አልተካተቱም}}</translation> @@ -1890,6 +1898,7 @@ <translation id="3515983984924808886">ዳግም ማስጀመርን ለማረጋገጥ የደህንነት ቁልፍዎን ይንኩ። ፒን ጨምሮ በደህንነት ቁልፉ ላይ የተከማቸው ሁሉም መረጃ ይሰረዛል።</translation> <translation id="3518985090088779359">ተቀበል እና ቀጥል</translation> <translation id="351952459507671940">ወደ አዲስ ቡድን ያክሉ</translation> +<translation id="3521606918211282604">የዲስክ መጠንን ለውጥ</translation> <translation id="3523642406908660543">አንድ ጣቢያ በኮምፒውተርዎ ላይ የተሰኪ መዳረሻ መጠቀም ሲፈልግ ጠይቅ (የሚመከር)</translation> <translation id="3524965460886318643">ወደ ውጭ የመላክ እንቅስቃሴዎች</translation> <translation id="3526034519184079374">የጣቢያውን ውሂብ ማንበብ ወይም መቀየር አልተቻለም</translation> @@ -1977,6 +1986,7 @@ <translation id="3629631988386925734">Smart Lockን ለማንቃት የይለፍ ቃልዎን ያስገቡ። በሚቀጥለው ጊዜ ስልክዎ የእርስዎን <ph name="DEVICE_TYPE" /> ይከፍታል። በቅንብሮች ውስጥ Smart Lock ማጥፋት ይችላሉ።</translation> <translation id="3630132874740063857">የእርስዎ ስልክ</translation> <translation id="3630995161997703415">ይህን ጣቢያ በማንኛውም ጊዜ ለመጠቀም ወደ መደርደሪያዎ ያክሉት</translation> +<translation id="3633309367764744750">እስካሁን ያልጎበኗቸውን ገጾች ጨምሮ ከገጾች መረጃን አስቀድሞ ያወጣል። ኩኪዎችን እርስዎ ከፈቀዱ፣ የሚገኘው መረጃ ኩኪዎችን ሊያካትት ይችላል።</translation> <translation id="3634507049637220048">አውታረመረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />፣ <ph name="CONNECTION_STATUS" />፣ በእርስዎ አስተዳዳሪ የሚተዳደር፣ ዝርዝሮች</translation> <translation id="3635241501480133979">ይህ ውሂብ ይድርጅትዎን የደንነት መመሪያዎች ይጥሳል፣ እና ተጎትቶ ሊጣል አይችልም።</translation> <translation id="3635353578505343390">ግብረመልስ ወደ Google ይላኩ</translation> @@ -3934,6 +3944,7 @@ <translation id="6298962879096096191">የAndroid መተግበሪያዎችን ለመጫን Google Playን ይጠቀሙ</translation> <translation id="630065524203833229">ው&ጣ</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> በራስ ሰር ሊዋቀር አልተቻለም። የላቀ አታሚ ዝርዝሮችን እባክዎ ይጥቀሱ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> +<translation id="630292539633944562">የግል መረጃ አስተያየት ጥቆማዎች</translation> <translation id="6305607932814307878">ሁለንተናዊ መመሪያ፦</translation> <translation id="6307990684951724544">ስርዓቱ ስራ ላይ ነው</translation> <translation id="6308493641021088955">በመለያ መግቢያ በ<ph name="EXTENSION_NAME" /> የቀረበ</translation> @@ -4012,6 +4023,7 @@ <translation id="641081527798843608">የርዕሰ ጉዳይ ተዛማጅ</translation> <translation id="6412673304250309937">በChrome ላይ የተከማቹ ድህንነታቸው ያልተጠበቁ ጣቢያዎች ዝርዝር ጋር ዩአርኤሎችን ይፈትሻል። አንድ ጣቢያ የእርስዎን የይለፍ ቃል ለመስረቅ ከሞከረ ወይም ጎጂ ፋይል ካወረደ Chrome እንዲሁም የገጽ ይዘትን ክፍሎችም ጨምሮ ዩአርኤሎችን ወደ የጥንቃቄ አሰሳ መላክ ሊልክ ይችላል።</translation> <translation id="6412931879992742813">አዲስ ስውር መስኮት</translation> +<translation id="6413591858632097328">ይህ በ<ph name="ORIGIN_NAME" /> እና የተጫኑ መተግበሪያዎች የተከማቹ ሁሉንም ውሂብ እና ኩኪዎች ያጠፋል።</translation> <translation id="641469293210305670">ዝማኔዎችን እና መተግበሪያዎችን ይጫኑ</translation> <translation id="6414888972213066896">ይህን ጣቢያ መጎብኘት ችግር ካለው ወላጅዎን ጠይቀዋል</translation> <translation id="6415900369006735853">በስልክዎ በኩል ከበይነመረቡ ጋር ይገናኙ</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index f594b32..495abad 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -94,7 +94,7 @@ <translation id="1122960773616686544">Naziv oznake</translation> <translation id="1124772482545689468">Korisnik</translation> <translation id="1125550662859510761">Izgleda kao <ph name="WIDTH" /> x <ph name="HEIGHT" /> (Izvorno)</translation> -<translation id="1126809382673880764">Ne štiti vas od opasnih web-lokacija, preuzimanja i proširenja. Bez obzira na to i gdje je primjenjivo, u drugim Googleovim uslugama, kao što su Gmail i Pretraživanje, dobit ćete zaštitu Sigurno pregledavanje.</translation> +<translation id="1126809382673880764">Ne štiti vas od opasnih web lokacija, preuzimanja i ekstenzija. I dalje ćete dobijati zaštitu Sigurno pregledanje, tamo gdje je dostupna, na drugim Googleovim uslugama kao što su Gmail i Pretraživanje.</translation> <translation id="1128109161498068552">Ne dozvoli web lokacijama da koriste sistemske poruke za pristupanje MIDI uređajima</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Uređivanje pretraživača</translation> @@ -186,7 +186,7 @@ <translation id="1235458158152011030">Poznate mreže</translation> <translation id="123578888592755962">Disk je pun</translation> <translation id="1238191093934674082">Otvoreni VPN</translation> -<translation id="1239439601391236986">Prikazivanje prijedloga unosa osobnih podataka</translation> +<translation id="1239439601391236986">Prikaži prijedloge unosa ličnih informacija</translation> <translation id="1239594683407221485">Istražite sadržaj uređaja u aplikaciji Fajlovi.</translation> <translation id="124116460088058876">Više jezika</translation> <translation id="1241753985463165747">Čita i mijenja sve vaše podatke na trenutnoj web lokaciji kada se pozove</translation> @@ -303,7 +303,7 @@ <translation id="140723521119632973">Aktiviranje mobilne mreže</translation> <translation id="1407489512183974736">Sredina s izrezanim rubovima</translation> <translation id="1408504635543854729">Istražite sadržaj uređaja u aplikaciji Files. Administrator ograničava sadržaj i ne možete ga izmijeniti.</translation> -<translation id="1408980562518920698">Upravljanje osobnim podacima</translation> +<translation id="1408980562518920698">Upravljajte ličnim informacijama</translation> <translation id="1410197035576869800">Ikona aplikacije</translation> <translation id="1410616244180625362">Nastavi omogućavati pristup kameri host računara <ph name="HOST" /></translation> <translation id="1414648216875402825">Upravo ažurirate <ph name="PRODUCT_NAME" /> na nestabilnu verziju koja sadrži funkcije trenutno u upotrebi. Doći će do padova softvera i neočekivanih grešaka. Budite pažljivi.</translation> @@ -437,7 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">Konzola za &JavaScript</translation> <translation id="1587907146729660231">Prstom dodirnite dugme za uključivanje</translation> -<translation id="1588200577109872591">Pametni ulazi</translation> +<translation id="1588200577109872591">Pametni unosi</translation> <translation id="1588438908519853928">Normalno</translation> <translation id="158849752021629804">Potrebna je matična mreža</translation> <translation id="1588870296199743671">Otvori link koristeći…</translation> @@ -673,7 +673,7 @@ <translation id="1879000426787380528">Prijavi se kao</translation> <translation id="1880905663253319515">Izbrisati potvrdu "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1884013283844450420">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, poveži</translation> -<translation id="1884705339276589024">Promjena veličine Linux Diska</translation> +<translation id="1884705339276589024">Promjena veličine Linux diska</translation> <translation id="1886996562706621347">Dozvoli web lokacijama da pitaju mogu li postati zadani obrađivači protokola (preporučeno)</translation> <translation id="1887442540531652736">Greška pri prijavljivanju</translation> <translation id="1887597546629269384">Ponovo kažite "Hej Google"</translation> @@ -743,7 +743,7 @@ <translation id="1979280758666859181">Prelazite na kanal sa starijom verzijom proizvoda <ph name="PRODUCT_NAME" />. Promjena kanala će se primijeniti kada verzija kanala bude odgovarala verziji koja je trenutno instalirana na vašem uređaju.</translation> <translation id="197989455406964291">KDC ne podržava vrstu šifriranja</translation> <translation id="1982354452682152483">Opis nije dostupan.</translation> -<translation id="1984417487208496350">Bez zaštite (ne preporučuje se)</translation> +<translation id="1984417487208496350">Bez zaštite (nije preporučeno)</translation> <translation id="1987317783729300807">Računi</translation> <translation id="1989112275319619282">Pregledaj</translation> <translation id="1990512225220753005">Ne prikazuj prečice na ovoj stranici</translation> @@ -813,7 +813,7 @@ <translation id="2090165459409185032">Za oporavak podataka o računu otvorite: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Postavke sigurnosnog sistema</translation> <translation id="2091887806945687916">Zvuk</translation> -<translation id="2096478741073211388">Prijedlozi osobnih podataka pomažu vam brže pisati zahvaljujući prijedlozima vašeg imena, adrese ili telefonskog broja kad utipkate određene riječi. Samo vi možete vidjeti privatne i prilagođene prijedloge za svoj račun.</translation> +<translation id="2096478741073211388">Pomoću prijedloga ličnih informacija brže pišete uz predlaganje vašeg imena, adrese ili broja telefona kada pišete neke određene riječi. Samo vi možete vidjeti privatne, personalizirane prijedloge za svoj račun.</translation> <translation id="2096715839409389970">Izbriši kolačiće trećih strana</translation> <translation id="2097372108957554726">Morate se prijaviti na Chrome da registrirate nove uređaje</translation> <translation id="2099172618127234427">Omogućujete funkcije za otklanjanje grešaka na Chrome OS-u kojim će se postaviti sshd daemon i omogućiti pokretanje sistema s USB uređaja.</translation> @@ -830,7 +830,7 @@ <translation id="2114326799768592691">Ponovo učitaj &okvir</translation> <translation id="2114896190328250491">Fotografija autora <ph name="NAME" /></translation> <translation id="2119349053129246860">Otvori u aplikaciji <ph name="APP" /></translation> -<translation id="2119461801241504254">Uključena je značajka Sigurno pregledavanje koja vas štiti od štetnih web-lokacija i preuzimanja</translation> +<translation id="2119461801241504254">Sigurno pregledanje je uključeno i štiti vas od štetnih web lokacija i preuzimanja</translation> <translation id="2120297377148151361">Aktivnosti i interakcije</translation> <translation id="2120639962942052471">Blokirano je odobrenje za <ph name="PERMISSION" /></translation> <translation id="2121055421682309734">{COUNT,plural, =0{Kolačići su blokirani}=1{Kolačići su blokirani, izuzev 1}one{Kolačići su blokirani, izuzev {COUNT}}few{Kolačići su blokirani, izuzev {COUNT}}other{Kolačići su blokirani, izuzev {COUNT}}}</translation> @@ -1899,7 +1899,7 @@ <translation id="3515983984924808886">Dodirnite ponovo svoj sigurnosni ključ da potvrdite vraćanje na zadano. Izbrisat će se sve informacije koje su pohranjene na sigurnosnom ključu, uključujući njegov PIN.</translation> <translation id="3518985090088779359">Prihvati i nastavi</translation> <translation id="351952459507671940">Dodaj u novu grupu</translation> -<translation id="3521606918211282604">Promjena veličine diska</translation> +<translation id="3521606918211282604">Promijeni veličinu diska</translation> <translation id="3523642406908660543">Pitaj kada web lokacija želi koristiti dodatak za pristup vašem računaru (preporučeno)</translation> <translation id="3524965460886318643">Izvezi aktivnosti</translation> <translation id="3526034519184079374">Nije moguće čitati ili izmijeniti podatke web lokacije</translation> @@ -1987,7 +1987,7 @@ <translation id="3629631988386925734">Unesite lozinku da omogućite pametno zaključavanje. Sljedeći put će vaš telefon otključati vaš uređaj <ph name="DEVICE_TYPE" />. Pametno zaključavanje možete isključiti u Postavkama.</translation> <translation id="3630132874740063857">Vaš telefon</translation> <translation id="3630995161997703415">Dodajte ovu web lokaciju na policu da je koristite bilo kada</translation> -<translation id="3633309367764744750">Unaprijed dohvaća informacije sa stranica, uključujući stranice koje još niste posjetili. Dohvaćene informacije mogu uključivati kolačiće ako ih dopustite.</translation> +<translation id="3633309367764744750">Unaprijed dohvaća informacije sa stranica, uključujući stranice koje još uvijek niste posjetili. Dohvaćene informacije mogu obuhvatati kolačiće, ako ih dozvolite.</translation> <translation id="3634507049637220048">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, upravlja vaš administrator, detalji</translation> <translation id="3635241501480133979">Ovi podaci krše sigurnosna pravila vaše organizacije te ih nije moguće spustiti.</translation> <translation id="3635353578505343390">Pošaljite povratne informacije Googleu</translation> @@ -3947,7 +3947,7 @@ <translation id="6298962879096096191">Korištenje Google Playa za instaliranje Android aplikacija</translation> <translation id="630065524203833229">I&zađi</translation> <translation id="6300718114348072351">Automatsko konfiguriranje štampača <ph name="PRINTER_NAME" /> nije uspjelo. Navedite napredne detalje za štampač. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> -<translation id="630292539633944562">Prijedlozi osobnih podataka</translation> +<translation id="630292539633944562">Prijedlozi ličnih informacija</translation> <translation id="6305607932814307878">Globalno pravilo:</translation> <translation id="6307990684951724544">Sistem je zauzet</translation> <translation id="6308493641021088955">Prijavu omogućava <ph name="EXTENSION_NAME" /></translation> @@ -4026,7 +4026,7 @@ <translation id="641081527798843608">Podudaranje predmeta</translation> <translation id="6412673304250309937">Provjerava URL-ove s listom nesigurnih web lokacija pohranjenih u Chromeu. Ako web lokacija pokuša ukrasti vašu lozinku, ili kada preuzimate štetan fajl, Chrome može slati i URL-ove, uključujući dijelove sadržaja stranice, u Sigurno pregledanje.</translation> <translation id="6412931879992742813">Novi anonimni prozor</translation> -<translation id="6413591858632097328">Izbrisat će se svi podaci i kolačići koje je spremila web-lokacija <ph name="ORIGIN_NAME" /> i njene instalirane aplikacije.</translation> +<translation id="6413591858632097328">Ovim će se obrisati svi podaci i kolačići koje je pohranila web lokacija <ph name="ORIGIN_NAME" /> i njene instalirane aplikacije.</translation> <translation id="641469293210305670">Instaliranje ažuriranja i aplikacija</translation> <translation id="6414888972213066896">Pitao/la si roditelje možeš li posjetiti ovu web lokaciju</translation> <translation id="6415900369006735853">Povežite se na internet pomoću telefona</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index fdeee79..61fa355 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Nom de l'adreça d'interès</translation> <translation id="1124772482545689468">Usuari</translation> <translation id="1125550662859510761">Resolució: <ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativa)</translation> +<translation id="1126809382673880764">No et protegeix contra baixades, extensions ni llocs web perillosos. Continuaràs obtenint protecció mitjançant Navegació segura, sempre que estigui disponible, en altres serveis de Google, com ara Gmail i la Cerca.</translation> <translation id="1128109161498068552">No permetis que cap lloc utilitzi els missatges exclusius del sistema per accedir als dispositius MIDI</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Edita el motor de cerca</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Xarxes conegudes</translation> <translation id="123578888592755962">El disc és ple</translation> <translation id="1238191093934674082">VPN oberta</translation> +<translation id="1239439601391236986">Mostra els suggeriments sobre informació personal</translation> <translation id="1239594683407221485">Explora el contingut del dispositiu a l'aplicació Fitxers.</translation> <translation id="124116460088058876">Més idiomes</translation> <translation id="1241753985463165747">Llegir i modificar totes les teves dades del lloc web que estàs visitant quan s'invoqui</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Activació d'una xarxa mòbil</translation> <translation id="1407489512183974736">Retallat al centre</translation> <translation id="1408504635543854729">Explora el contingut del dispositiu a l'aplicació Fitxers. L'administrador ha restringit el contingut i no es pot modificar.</translation> +<translation id="1408980562518920698">Gestiona informació personal</translation> <translation id="1410197035576869800">Icona de l'aplicació</translation> <translation id="1410616244180625362">Continua permetent que <ph name="HOST" /> accedeixi a la càmera</translation> <translation id="1414648216875402825">Esteu a punt de passar a una versió inestable de <ph name="PRODUCT_NAME" /> que conté funcions en curs. Es produiran bloqueigs i errors inesperats. Continueu amb precaució.</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&Consola de JavaScript</translation> <translation id="1587907146729660231">Toca el botó d'engegada amb el dit</translation> +<translation id="1588200577109872591">Entrades intel·ligents</translation> <translation id="1588438908519853928">Normal</translation> <translation id="158849752021629804">Es necessita una xarxa domèstica</translation> <translation id="1588870296199743671">Obre l'enllaç amb...</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">Inicia la sessió com a</translation> <translation id="1880905663253319515">Voleu suprimir el certificat "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1884013283844450420">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, connecta</translation> +<translation id="1884705339276589024">Canvia la mida del disc de Linux</translation> <translation id="1886996562706621347">Permet que els llocs web sol·licitin esdevenir gestors predeterminats de protocols (opció recomanada)</translation> <translation id="1887442540531652736">Error d'inici de sessió</translation> <translation id="1887597546629269384">Torna a dir "Ok Google"</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181">Esteu a punt de canviar a un canal amb una versió més antiga de <ph name="PRODUCT_NAME" />. El canvi de canal s'aplicarà quan la versió del canal coincideixi amb la versió qui hi ha instal·lada actualment en el vostre dispositiu.</translation> <translation id="197989455406964291">El Centre de distribució de claus de Kerberos no admet aquest tipus d'encriptació</translation> <translation id="1982354452682152483">No hi ha cap descripció disponible.</translation> +<translation id="1984417487208496350">Sense protecció (opció no recomanada)</translation> <translation id="1987317783729300807">Comptes</translation> <translation id="1989112275319619282">Examina</translation> <translation id="1990512225220753005">No mostris dreceres en aquesta pàgina</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">Per recuperar la informació del compte, accediu a: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Configuració de seguretat del sistema</translation> <translation id="2091887806945687916">So</translation> +<translation id="2096478741073211388">Els suggeriments sobre informació personal t'ajuden a escriure més ràpidament, ja que et suggereixen el teu nom, la teva adreça o el teu telèfon quan escrius determinades paraules. Ets l'única persona que pot veure els suggeriments personalitzats privats del teu compte.</translation> <translation id="2096715839409389970">Esborra les galetes de tercers</translation> <translation id="2097372108957554726">Inicieu la sessió a Chrome per registrar dispositius nous</translation> <translation id="2099172618127234427">Esteu activant les funcions de depuració de Chrome OS, de manera que es configurarà el dimoni sshd i es permetrà iniciar el sistema des d'unitats USB.</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">Torna a carregar el &marc</translation> <translation id="2114896190328250491">Foto feta per <ph name="NAME" /></translation> <translation id="2119349053129246860">Obre a <ph name="APP" /></translation> +<translation id="2119461801241504254">Navegació segura està activada i et protegeix contra els llocs web i les baixades perjudicials</translation> <translation id="2120297377148151361">Activitat i interaccions</translation> <translation id="2120639962942052471">S'ha bloquejat <ph name="PERMISSION" /></translation> <translation id="2121055421682309734">{COUNT,plural, =0{Les galetes estan bloquejades}=1{Les galetes estan bloquejades, 1 excepció}other{Les galetes estan bloquejades, {COUNT} excepcions}}</translation> @@ -1888,6 +1896,7 @@ <translation id="3515983984924808886">Torna a tocar la clau de seguretat per confirmar el restabliment. Se suprimirà tota la informació desada a la clau de seguretat, inclòs el PIN.</translation> <translation id="3518985090088779359">Accepta i continua</translation> <translation id="351952459507671940">Afegeix a un grup nou</translation> +<translation id="3521606918211282604">Canvia la mida del disc</translation> <translation id="3523642406908660543">Pregunta'm quan un lloc vulgui fer servir un connector per accedir a l'ordinador (opció recomanada)</translation> <translation id="3524965460886318643">Exporta les activitats</translation> <translation id="3526034519184079374">No es poden llegir o canviar les dades del lloc web</translation> @@ -1975,6 +1984,7 @@ <translation id="3629631988386925734">Introdueix la contrasenya per activar Smart Lock. La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb el telèfon. Pots desactivar Smart Lock des de Configuració.</translation> <translation id="3630132874740063857">El teu telèfon</translation> <translation id="3630995161997703415">Afegeix aquest lloc web al teu prestatge per utilitzar-lo en qualsevol moment</translation> +<translation id="3633309367764744750">Recull prèviament informació de pàgines, incloses pàgines que encara no has visitat. La informació recollida pot incloure galetes, si les permets.</translation> <translation id="3634507049637220048">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, gestionada per l'administrador, detalls</translation> <translation id="3635241501480133979">Aquestes dades infringeixen les polítiques de seguretat de la teva organització i no es poden deixar anar.</translation> <translation id="3635353578505343390">Envia suggeriments a Google</translation> @@ -3936,6 +3946,7 @@ <translation id="6298962879096096191">Utilitza Google Play per instal·lar aplicacions per a Android</translation> <translation id="630065524203833229">S&urt</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> no s'ha pogut configurar automàticament. Especifica els detalls avançats de la impressora. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Suggeriments sobre informació personal</translation> <translation id="6305607932814307878">Política global:</translation> <translation id="6307990684951724544">El sistema està ocupat</translation> <translation id="6308493641021088955">Inici de sessió proporcionat per <ph name="EXTENSION_NAME" /></translation> @@ -4014,6 +4025,7 @@ <translation id="641081527798843608">Coincidència d'assumpte</translation> <translation id="6412673304250309937">Compara els URL amb una llista de llocs web no segurs emmagatzemada a Chrome. Si un lloc web prova de robar-te la contrasenya o si baixes un fitxer maliciós, és possible que Chrome també n'enviï els URL, inclosos fragments de contingut de les pàgines, a Navegació segura.</translation> <translation id="6412931879992742813">Finestra d'incògnit nova</translation> +<translation id="6413591858632097328">Amb aquesta acció s'esborraran totes les dades i galetes emmagatzemades per <ph name="ORIGIN_NAME" /> i per les seves aplicacions instal·lades.</translation> <translation id="641469293210305670">Instal·la actualitzacions i aplicacions</translation> <translation id="6414888972213066896">Has demanat permís als teus pares per visitar aquest lloc web</translation> <translation id="6415900369006735853">Connecta't a Internet a través del telèfon</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index d3fe8e9..7d9cbcd0 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Bogmærkets navn</translation> <translation id="1124772482545689468">Bruger</translation> <translation id="1125550662859510761">Ligner <ph name="WIDTH" /> x <ph name="HEIGHT" /> (oprindelig)</translation> +<translation id="1126809382673880764">Beskytter dig ikke mod skadelige websites, downloads og udvidelser. Du er stadig beskyttet med Beskyttet browsing i andre Google-tjenester som f.eks. Gmail og Søgning, hvor dette er tilgængeligt.</translation> <translation id="1128109161498068552">Tillad ikke, at websites bruger interne systemmeddelelser til at få adgang til MIDI-enheder</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Rediger søgemaskine</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Kendte netværk</translation> <translation id="123578888592755962">Disken er fuld</translation> <translation id="1238191093934674082">Åben VPN</translation> +<translation id="1239439601391236986">Vis forslag til angivelse af personlige oplysninger</translation> <translation id="1239594683407221485">Udforsk enhedens indhold i appen Filer.</translation> <translation id="124116460088058876">Flere sprog</translation> <translation id="1241753985463165747">Læse og redigere alle dine data på det aktuelle website, når dette er aktiveret</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Aktivering af mobildata</translation> <translation id="1407489512183974736">Centrér, beskær</translation> <translation id="1408504635543854729">Udforsk enhedens indhold i appen Filer. Indholdet er begrænset af en administrator og kan ikke redigeres.</translation> +<translation id="1408980562518920698">Administrer personlige oplysninger</translation> <translation id="1410197035576869800">Appikon</translation> <translation id="1410616244180625362">Tillad fortsat, at <ph name="HOST" /> har adgang til dit kamera</translation> <translation id="1414648216875402825">Du er ved at opdatere til en ustabil version af <ph name="PRODUCT_NAME" />, der indeholder ufærdige funktioner. Nedbrud og uventede fejl kan forekomme. Vær forsigtig, hvis du fortsætter.</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&JavaScript-konsol</translation> <translation id="1587907146729660231">Sæt fingeren på afbryderknappen.</translation> +<translation id="1588200577109872591">Smarte forslag</translation> <translation id="1588438908519853928">Normal</translation> <translation id="158849752021629804">Hjemmenetværk mangler</translation> <translation id="1588870296199743671">Åbn link med...</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">Log ind som</translation> <translation id="1880905663253319515">Slet certifikatet "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1884013283844450420">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, opret forbindelse</translation> +<translation id="1884705339276589024">Juster størrelsen på Linux-disken</translation> <translation id="1886996562706621347">Tillad, at websites må bede om at håndtere protokoller som standard (anbefales)</translation> <translation id="1887442540531652736">Loginfejl</translation> <translation id="1887597546629269384">Sig "Hey Google" igen</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181">Du er ved at skifte til en kanal med en ældre version af <ph name="PRODUCT_NAME" />. Kanalskiftet træder i kraft, når kanalversionen matcher den version, der i øjeblikket er installeret på din enhed.</translation> <translation id="197989455406964291">KDC understøtter ikke krypteringstypen</translation> <translation id="1982354452682152483">Der er ingen beskrivelse.</translation> +<translation id="1984417487208496350">Ingen beskyttelse (anbefales ikke)</translation> <translation id="1987317783729300807">Konti</translation> <translation id="1989112275319619282">Gennemse</translation> <translation id="1990512225220753005">Vis ikke genveje på denne side</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">Du gendanner dine kontooplysninger ved at gå til: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Indstillinger for systemsikkerhed</translation> <translation id="2091887806945687916">Lyd</translation> +<translation id="2096478741073211388">Forslag til personlige oplysninger hjælper dig med at skrive hurtigere ved at foreslå dit navn, din adresse eller dit telefonnummer, når du skriver visse ord. Det er kun dig, der kan se din egne private, tilpassede forslag til din konto.</translation> <translation id="2096715839409389970">Slet cookies fra tredjeparter</translation> <translation id="2097372108957554726">Du skal logge ind i Chrome for at registrere nye enheder</translation> <translation id="2099172618127234427">Du aktiverer Chrome OS-fejlretningsfunktioner, som konfigurerer sshd daemon og aktiverer systemgenstart via USB-drev.</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">Genindlæs &ramme</translation> <translation id="2114896190328250491">Foto af <ph name="NAME" /></translation> <translation id="2119349053129246860">Åbn i <ph name="APP" /></translation> +<translation id="2119461801241504254">Beskyttet browsing er aktiveret og beskytter dig mod skadelige websites og downloads</translation> <translation id="2120297377148151361">Aktivitet og interaktioner</translation> <translation id="2120639962942052471">Blokerede <ph name="PERMISSION" /></translation> <translation id="2121055421682309734">{COUNT,plural, =0{Cookies er blokeret}=1{Cookies er blokeret, 1 undtagelse}one{Cookies er blokeret, {COUNT} undtagelse}other{Cookies er blokeret, {COUNT} undtagelser}}</translation> @@ -1891,6 +1899,7 @@ <translation id="3515983984924808886">Tryk på din sikkerhedsnøgle igen for at bekræfte nulstillingen. Alle de oplysninger, der er gemt på sikkerhedsnøglen, bl.a. pinkoden, slettes.</translation> <translation id="3518985090088779359">Acceptér og fortsæt</translation> <translation id="351952459507671940">Føj til ny gruppe</translation> +<translation id="3521606918211282604">Skift diskstørrelse</translation> <translation id="3523642406908660543">Spørg, når et website vil anvende et plugin til at få adgang til din computer (anbefales)</translation> <translation id="3524965460886318643">Eksportér aktiviteter</translation> <translation id="3526034519184079374">Kan hverken læse eller ændre websitedata</translation> @@ -1978,6 +1987,7 @@ <translation id="3629631988386925734">Angiv din adgangskode for at aktivere Smart Lock. Næste gang låser din telefon din <ph name="DEVICE_TYPE" /> op. Du kan deaktivere Smart Lock i Indstillinger.</translation> <translation id="3630132874740063857">Din telefon</translation> <translation id="3630995161997703415">Føj dette website til din hylde for at bruge det når som helst</translation> +<translation id="3633309367764744750">Forudhentede oplysninger fra sider, bl.a. sider, du ikke har besøgt endnu. De hentede oplysninger omfatter muligvis cookies, hvis du har tilladt cookies.</translation> <translation id="3634507049637220048">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, administreret af din administrator, oplysninger</translation> <translation id="3635241501480133979">Disse data overtræder din organisations sikkerhedspolitikker og kan ikke trækkes hertil.</translation> <translation id="3635353578505343390">Send feedback til Google</translation> @@ -3938,6 +3948,7 @@ <translation id="6298962879096096191">Brug Google Play til at installere Android-apps</translation> <translation id="630065524203833229">Af&slut</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> kunne ikke konfigureres automatisk. Angiv avancerede indstillinger for printeren. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Forslag til personlige oplysninger</translation> <translation id="6305607932814307878">Global politik:</translation> <translation id="6307990684951724544">Systemet er optaget</translation> <translation id="6308493641021088955">Login leveres af <ph name="EXTENSION_NAME" /></translation> @@ -4016,6 +4027,7 @@ <translation id="641081527798843608">Emnematch</translation> <translation id="6412673304250309937">Tjekker webadresser ift. en liste over usikre websites, der er gemt i Chrome. Hvis et website forsøger at stjæle din adgangskode, eller når du downloader en skadelig fil, sender Chrome muligvis også webadresser, bl.a. mindre mængder sideindhold, til Beskyttet browsing.</translation> <translation id="6412931879992742813">Nyt inkognitovindue</translation> +<translation id="6413591858632097328">Dette rydder alle data og cookies, der er gemt af <ph name="ORIGIN_NAME" /> og de apps, den har installeret.</translation> <translation id="641469293210305670">Installer opdateringer og apps</translation> <translation id="6414888972213066896">Du har spurgt en af dine forældre, om det er i orden, at du besøger dette website.</translation> <translation id="6415900369006735853">Opret forbindelse til internettet via din telefon</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index fe00d2f..1b44df0 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">نام نشانک</translation> <translation id="1124772482545689468">کاربر</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> × <ph name="HEIGHT" /> بهنظر میرسد (داخلی)</translation> +<translation id="1126809382673880764">دربرابر وبسایتها، بارگیریها، و افزونههای خطرناک از شما محافظت نمیکند. درصورت وجود، همچنان ویژگی حفاظتی «مرور ایمن» را در سرویسهای دیگر Google مثل Gmail و «جستجو» دریافت میکنید.</translation> <translation id="1128109161498068552">به هیچ سایتی اجازه داده نشود برای دسترسی به دستگاههای MIDI از پیامهای انحصاری سیستم استفاده کند</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">ویرایش موتور جستجو</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">شبکههای شناختهشده</translation> <translation id="123578888592755962">دیسک پر است</translation> <translation id="1238191093934674082">باز کردن VPN</translation> +<translation id="1239439601391236986">نمایش پیشنهادهای اطلاعات شخصی ورودی</translation> <translation id="1239594683407221485">محتوای دستگاه را در برنامه Files کاوش کنید.</translation> <translation id="124116460088058876">زبانهای بیشتر</translation> <translation id="1241753985463165747">خواندن و تغییر همه دادههای شما در وبسایت کنونی هنگام فراخوانی</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">فعالسازی شبکه داده تلفن همراه</translation> <translation id="1407489512183974736">برش خورده در مرکز</translation> <translation id="1408504635543854729">محتوای دستگاه را در برنامه Files کاوش کنید. محتوا توسط سرپرست محدود شده است و قابل ویرایش نیست.</translation> +<translation id="1408980562518920698">مدیریت اطلاعات شخصی</translation> <translation id="1410197035576869800">نماد برنامه</translation> <translation id="1410616244180625362">ادامه اجازه به <ph name="HOST" /> برای دسترسی به دوربین</translation> <translation id="1414648216875402825">شما نسخه ناپایداری از <ph name="PRODUCT_NAME" /> را بهروزرسانی میکنید که حاوی قابلیتهای در حال توسعه است. خرابیها و اشکالهای غیرمنتظرهای رخ خواهد داد. لطفاُ با احتیاط ادامه دهید.</translation> @@ -431,6 +434,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">کنسول &جاوا اسکریپت</translation> <translation id="1587907146729660231">دکمه روشن/خاموش را با انگشتتان لمس کنید</translation> +<translation id="1588200577109872591">ورودیهای هوشمند</translation> <translation id="1588438908519853928">معمولی</translation> <translation id="158849752021629804">شبکه خانگی مورد نیاز است</translation> <translation id="1588870296199743671">بازکردن پیوند با...</translation> @@ -666,6 +670,7 @@ <translation id="1879000426787380528">ورود به سیستم بهعنوان</translation> <translation id="1880905663253319515">مجوز "<ph name="CERTIFICATE_NAME" />" حذف شود؟</translation> <translation id="1884013283844450420">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، اتصال</translation> +<translation id="1884705339276589024">تغییر اندازه دیسک Linux</translation> <translation id="1886996562706621347">به سایتها اجازه داده شود درخواست کنند که کنترلکننده پیشفرض برای پروتکلها شوند (توصیه میشود)</translation> <translation id="1887442540531652736">خطای ورود به سیستم</translation> <translation id="1887597546629269384">دوباره بگویید «Hey Google»</translation> @@ -735,6 +740,7 @@ <translation id="1979280758666859181">شما در حال تغییر کانال به نسخه قدیمیتر <ph name="PRODUCT_NAME" /> هستید. تغییر کانال زمانی اعمال میشود که نسخه کانال با نسخه فعلی نصب شده در دستگاه یکسان باشد.</translation> <translation id="197989455406964291">KDC از نوع رمزگذاری پشتیبانی نمیکند</translation> <translation id="1982354452682152483">توضیحی دردسترس نیست.</translation> +<translation id="1984417487208496350">بدون محافظت (توصیه نمیشود)</translation> <translation id="1987317783729300807">اشتراکها</translation> <translation id="1989112275319619282">مشاهده محتوای موجود در فروشگاه ما</translation> <translation id="1990512225220753005">میانبرها در این صفحه نشان داده نشود</translation> @@ -804,6 +810,7 @@ <translation id="2090165459409185032">برای بازیابی اطلاعات حسابتان به اینجا بروید: google.com/accounts/recovery</translation> <translation id="2090876986345970080">تنظیم امنیتی سیستم</translation> <translation id="2091887806945687916">صدا</translation> +<translation id="2096478741073211388">هنگام تایپ کردن کلمههایی خاص، پیشنهادهای اطلاعات شخصی با پیشنهاد دادن نام، نشانی، و شماره تلفنتان به شما کمک میکند سریعتر بنویسید. تنها شما پیشنهادهای شخصیشده و خصوصی خود را برای حسابتان میبینید.</translation> <translation id="2096715839409389970">پاک کردن کوکیهای شخص ثالث</translation> <translation id="2097372108957554726">برای ثبت دستگاههای جدید باید به سیستم Chrome وارد شوید</translation> <translation id="2099172618127234427">ویژگیهای رفع اشکال سیستم عامل Chrome را فعال میکنید که sshd daemon را تنظیم خواهد کرد و راهاندازی از درایوهای USB را فعال میکند.</translation> @@ -820,6 +827,7 @@ <translation id="2114326799768592691">تازهسازی قاب</translation> <translation id="2114896190328250491">عکس از <ph name="NAME" /></translation> <translation id="2119349053129246860">باز کردن در <ph name="APP" /></translation> +<translation id="2119461801241504254">«مرور ایمن» روشن است و درمقابل بارگیریها و سایتهای مضر از شما محافظت میکند</translation> <translation id="2120297377148151361">فعالیت و تعاملات</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> مسدود شده است</translation> <translation id="2121055421682309734">{COUNT,plural, =0{کوکیها مسدود شدهاند}=1{کوکیها مسدود شدهاند، ۱ استثنا}one{کوکیها مسدود شدهاند، {COUNT} استثنا}other{کوکیها مسدود شدهاند، {COUNT} استثنا}}</translation> @@ -1888,6 +1896,7 @@ <translation id="3515983984924808886">برای تأیید بازنشانی، کلید امنیتیتان را لمس کنید. همه اطلاعات ذخیرهشده در کلید امنیتی (ازجمله پین) پاک میشود.</translation> <translation id="3518985090088779359">پذیرش و ادامه</translation> <translation id="351952459507671940">افزودن به گروه جدید</translation> +<translation id="3521606918211282604">تغییر اندازه دیسک</translation> <translation id="3523642406908660543">اگر سایتی میخواهد برای دسترسی به رایانهتان از افزایه استفاده کند، سؤال شود (توصیه میشود)</translation> <translation id="3524965460886318643">صادر کردن فعالیتها</translation> <translation id="3526034519184079374">خواندن دادههای سایت یا تغییر آنها امکانپذیر نیست</translation> @@ -1975,6 +1984,7 @@ <translation id="3629631988386925734">برای فعال کردن Smart Lock، گذرواژهتان را وارد کنید. دفعه بعد، تلفنتان قفل <ph name="DEVICE_TYPE" /> شما را باز خواهد کرد. میتوانید Smart Lock را در «تنظیمات» خاموش کنید.</translation> <translation id="3630132874740063857">تلفن شما</translation> <translation id="3630995161997703415">این سایت را به قفسهتان اضافه کنید تا هر زمان که بخواهید از آن استفاده کنید</translation> +<translation id="3633309367764744750">اطلاعات را از صفحهها (ازجمله صفحههایی که هنوز از آنها بازدید نکردهاید) پیشاپیش واکشی میکند. ممکن است در اطلاعات واکشیشده کوکی وجود داشته باشد، البته اگر کوکیها را مجاز کرده باشید.</translation> <translation id="3634507049637220048">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، تحتمدیریت سرپرست، جزئیات</translation> <translation id="3635241501480133979">این دادهها خطمشیهای امنیتی سازمانتان را نقض میکند و نمیتواند رها شود.</translation> <translation id="3635353578505343390">ارسال بازخورد به Google</translation> @@ -2565,7 +2575,7 @@ <translation id="4414232939543644979">پنجرهٔ جدید حالت &ناشناس</translation> <translation id="4415213869328311284">آمادهاید استفاده از <ph name="DEVICE_TYPE" /> را شروع کنید.</translation> <translation id="4415245286584082850">دستگاهی پیدا نشد. در برگه جدیدی، یک مقاله مرکز راهنمایی باز کنید.</translation> -<translation id="4415276339145661267">مدیریت حساب Google</translation> +<translation id="4415276339145661267">مدیریت «حساب Google»</translation> <translation id="4415748029120993980">منحنی بیضوی SECG مدل secp384r1 (به نام NIST P-384)</translation> <translation id="4416582610654027550">نشانی وب معتبری تایپ کنید</translation> <translation id="4419409365248380979">همیشه به <ph name="HOST" /> اجازه دهید کوکیها را تنظیم کند</translation> @@ -3934,6 +3944,7 @@ <translation id="6298962879096096191">برای نصب برنامههای Android از Google Play استفاده کنید</translation> <translation id="630065524203833229">&خروج</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> بهطور خودکار پیکربندی نشد. لطفاً جزئیات پیشرفته چاپگر را مشخص کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> +<translation id="630292539633944562">پیشنهادهای اطلاعات شخصی</translation> <translation id="6305607932814307878">خطمشی کلی:</translation> <translation id="6307990684951724544">سیستم مشغول است</translation> <translation id="6308493641021088955">ورود به سیستم ارائهشده توسط <ph name="EXTENSION_NAME" /></translation> @@ -4012,6 +4023,7 @@ <translation id="641081527798843608">مطابقت موضوع</translation> <translation id="6412673304250309937">نشانیهای وب را با فهرست سایتهای ناامنی که در Chrome ذخیره شده است مقایسه میکند. اگر سایتی تلاش کند گذرواژه شما را بهسرقت ببرد، یا وقتی فایل مخربی بارگیری میکنید، Chrome ممکن است نشانیهای وب را نیز به همراه بخشهای کوچکی از محتوای صفحه، به «مرور ایمن» ارسال کند.</translation> <translation id="6412931879992742813">پنجره جدید ناشناس</translation> +<translation id="6413591858632097328">با این کار همه دادهها و کوکیهای ذخیرهشده توسط <ph name="ORIGIN_NAME" /> و برنامههای نصبشده آن پاک میشود.</translation> <translation id="641469293210305670">نصب بهروزرسانیها و برنامهها</translation> <translation id="6414888972213066896">از والدینتان پرسیدید آیا اجازه بازدید از این سایت را دارید</translation> <translation id="6415900369006735853">اتصال به اینترنت ازطریق تلفن</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index bb2e491..bd2edcc4 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -37,6 +37,7 @@ <translation id="1041263367839475438">ઉપલબ્ધ ડિવાઇસ</translation> <translation id="1042174272890264476">તમારા કમ્પ્યુટરની સાથે <ph name="SHORT_PRODUCT_NAME" /> ની RLZ લાઇબ્રેરી બિલ્ટ ઇન પણ આવે છે. RLZ વિશેષ પ્રચારાત્મક ઝુંબેશ દ્વારા ચલાવવામાં આવતી શોધ અને <ph name="SHORT_PRODUCT_NAME" /> ઉપયોગને માપવા માટે બિન-અદ્વિતીય, બિન-વ્યક્તિગત રૂપે ઓળખી શકાય તેવા ટૅગ સોંપે છે. આ લેબલ્સ કેટલીકવાર <ph name="PRODUCT_NAME" /> માં Google શોધ ક્વેરીઝમાં દેખાય છે.</translation> <translation id="1043818413152647937">આ ઍપમાંથી પણ ડેટા સાફ કરીએ?</translation> +<translation id="1045448422538531528">ગ્રૂપમાં ઉમેરો</translation> <translation id="1046635659603195359">એવું લાગી રહ્યું છે કે તમે પહેલેથી જ કોઈ અન્ય ડિવાઇસ પર તમારા Google આસિસ્ટંટ વડે Voice Matchનું સેટઅપ કર્યું છે. અગાઉની આ બધી રેકોર્ડિંગનો ઉપયોગ આ ડિવાઇસ પર વૉઇસ મૉડલ બનાવવા માટે કરી શકાશે. આમાં એક મિનિટ કરતાં પણ ઓછો સમય લાગે છે.</translation> <translation id="104710386808485638">Linux ફરી ચાલુ કરીએ?</translation> <translation id="1047431265488717055">લિંક ટે&ક્સ્ટને કૉપિ કરો</translation> @@ -66,6 +67,7 @@ <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1079766198702302550">હંમેશા કૅમેરાની ઍક્સેસને અવરોધિત કરો</translation> <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" />, તમારા Chrome સેટિંગને એના મૂળ ડિફૉલ્ટ પર પહેલાંના જેવું કરવા માગે છે. આ તમારા હોમપેજ, નવા ટૅબ પેજ અને શોધ એંજિનને ફરીથી સેટ કરશે, તમારા એક્સ્ટેન્શનને બંધ કરશે અને તમામ ટૅબને અનપિન કરશે. તે બીજા અસ્થાયી અને કેશ કરેલા ડેટા, જેમ કે કુકી, સામગ્રી અને સાઇટ ડેટાને પણ સાફ કરશે.</translation> +<translation id="1084096383128641877">આ પાસવર્ડ કાઢી નાખવાથી <ph name="DOMAIN" />નું તમારું એકાઉન્ટ ડિલીટ થશે નહીં. અન્ય લોકોથી તમારા એકાઉન્ટને સુરક્ષિત રાખવા માટે, <ph name="DOMAIN_LINK" /> પર તમારો પાસવર્ડ બદલો અથવા તમારું એકાઉન્ટ ડિલીટ કરો.</translation> <translation id="1084824384139382525">લિંક સર&નામાંની કૉપિ કરો</translation> <translation id="1085697365578766383">વર્ચ્યુઅલ મશીન શરૂ કરવામાં ભૂલ આવી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> <translation id="1090126737595388931">કોઈપણ પૃષ્ઠભૂમિ ઍપ્લિકેશન ચાલી રહી નથી</translation> @@ -199,6 +201,7 @@ <translation id="1259152067760398571">સલામતી માટે તપાસ ગઈકાલે કરવામાં આવી હતી</translation> <translation id="1260451001046713751"><ph name="HOST" />ના પૉપ-અપ અને રીડાયરેક્ટને હંમેશાં મંજૂરી આપો</translation> <translation id="126156426083987769">ડેમો મોડ ડિવાઇસ લાઇસન્સમાં સમસ્યા આવી.</translation> +<translation id="1263490604593716556"><ph name="FIRST_PARENT_EMAIL" /> અને <ph name="SECOND_PARENT_EMAIL" /> દ્વારા મેનેજ કરાતું એકાઉન્ટ આ ડિવાઇસ પર પ્રાથમિક એકાઉન્ટમાંથી સાઇન આઉટ થવા માટે, તમારી સ્ક્રીન પર આપેલા સમય પર ક્લિક કરો. દેખાઈ રહેલા મેનૂમાં "સાઇન આઉટ કરો" પર ક્લિક કરો.</translation> <translation id="126710816202626562">અનુવાદ ભાષા:</translation> <translation id="126768002343224824">16x</translation> <translation id="1272079795634619415">રોકો</translation> @@ -865,6 +868,7 @@ <translation id="2172784515318616985">આગળ વધો</translation> <translation id="2173302385160625112">તમારું ઇન્ટરનેટ કનેક્શન ચેક કરો</translation> <translation id="2173801458090845390">આ ઉપકરણમાં માગણી ID ઉમેરો</translation> +<translation id="2174948148799307353"><ph name="PARENT_EMAIL" /> દ્વારા મેનેજ કરાતું એકાઉન્ટ. આ ડિવાઇસ પર પ્રાથમિક એકાઉન્ટમાંથી સાઇન આઉટ થવા માટે, તમારી સ્ક્રીન પર આપેલા સમય પર ક્લિક કરો. દેખાઈ રહેલા મેનૂમાં "સાઇન આઉટ કરો" પર ક્લિક કરો.</translation> <translation id="2175607476662778685">ઝડપી લૉંચ બાર</translation> <translation id="217576141146192373">પ્રિન્ટર ઉમેરી શકાયું નથી. કૃપા કરીને તમારા પ્રિન્ટરની ગોઠવણી ચેક કરો અને ફરી પ્રયાસ કરો.</translation> <translation id="2177950615300672361">છુપો ટેબ: <ph name="TAB_NAME" /></translation> @@ -1469,6 +1473,7 @@ <translation id="2948300991547862301"><ph name="PAGE_TITLE" /> પર જાઓ</translation> <translation id="29488703364906173">આધુનિક વેબ માટે બનાવવામાં આવેલું, એક ઝડપી, સરળ અને સુરક્ષિત વેબ બ્રાઉઝર.</translation> <translation id="2949289451367477459">સ્થાનનો ઉપયોગ કરો. સ્થાનની પરવાનગી ધરાવતી ઍપ અને સેવાઓને આ ડિવાઇસના સ્થાનનો ઉપયોગ કરવાની મંજૂરી આપો. Google સમય-સમય પર સ્થાન ડેટા એકત્રિત કરી શકે છે અને આ ડેટાને સ્થાન સચોટતા અને સ્થાન-આધારિત સેવાઓને બહેતર બનાવવા માટે અનામ રીતે ઉપયોગમાં લઈ શકે છે. <ph name="BEGIN_LINK1" />વધુ જાણો<ph name="END_LINK1" /></translation> +<translation id="2950666755714083615">મને સાઇન અપ કરો</translation> <translation id="2956070239128776395">ગ્રૂપમાં નેસ્ટ કરેલો વિભાગ: <ph name="ERROR_LINE" /></translation> <translation id="2957117904572187936">કોઈપણ સાઇટને તમારા ડિવાઇસમાંની ફાઇલો કે ફોલ્ડરોમાં ફેરફાર કરવાની મંજૂરી આપશો નહીં</translation> <translation id="2958721676848865875">પૅક એક્સટેન્શનની ચેતવણી</translation> @@ -1593,6 +1598,7 @@ <translation id="3139925690611372679">ડિફોલ્ટ પીળો અવતાર</translation> <translation id="3141318088920353606">સાંભળી રહ્યાં છીએ...</translation> <translation id="3141917231319778873">આપેલ વિનંતી આના પર સમર્થિત નથી: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3142562627629111859">નવું Group</translation> <translation id="3143515551205905069">સિંક કરવાનું રદ કરો</translation> <translation id="3143754809889689516">શરૂઆતથી ચલાવો</translation> <translation id="3144647712221361880">આ રીતે લિંક ખોલો</translation> @@ -1617,6 +1623,7 @@ <translation id="3159493096109238499">બૈઝ</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (હાર્ડવેર સમર્થિત)</translation> <translation id="3161522574479303604">બધી ભાષાઓ</translation> +<translation id="3162853326462195145">સ્કૂલ એકાઉન્ટ</translation> <translation id="3162899666601560689">તમને વધુ સારો બ્રાઉઝિંગ અનુભવ આપવા માટે, ઉદાહરણ તરીકે, તમને સાઇન ઇન કરીને રાખવા અથવા તમારા શૉપિંગ કાર્ટની આઇટમ યાદ રાખવા માટે, સાઇટ કુકીનો ઉપયોગ કરી શકે છે</translation> <translation id="3163201441334626963"><ph name="VENDOR_ID" /> વિક્રેતાનું અજાણ્યું ઉત્પાદન <ph name="PRODUCT_ID" /></translation> <translation id="3164329792803560526">આ ટૅબને <ph name="APP_NAME" />માં શેર કરી રહ્યાં છીએ</translation> @@ -1778,6 +1785,7 @@ <translation id="3396800784455899911">"સ્વીકારો અને ચાલુ રાખો" બટન પર ક્લિક કરીને, તમે આ Google સેવાઓ માટે ઉપર વર્ણવેલી પ્રક્રિયા સાથે સંમત થાઓ છો.</translation> <translation id="3399432415385675819">સૂચનાઓ અક્ષમ કરવામાં આવશે</translation> <translation id="3400390787768057815"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> હર્ટ્ઝ) - ઇન્ટર્લેસ</translation> +<translation id="3402585168444815892">ડેમો મોડ માટે નોંધણી કરાવી રહ્યાં છીએ</translation> <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation> <translation id="3404065873681873169">આ સાઇટ માટે કોઈ પાસવર્ડ સાચવેલા નથી</translation> <translation id="3405664148539009465">ફોન્ટ્સ કસ્ટમાઇઝ કરો </translation> @@ -1839,6 +1847,7 @@ <translation id="3468999815377931311">Android ફોન</translation> <translation id="3470442499439619530">આ વપરાશકર્તાને દૂર કરો</translation> <translation id="3471876058939596279">HDMI અને USB પ્રકાર-C પોર્ટનો ઉપયોગ સમાન સમયે વીડિયો માટે કરી શકાતો નથી. બીજા વીડિયો પોર્ટનો ઉપયોગ કરો.</translation> +<translation id="3473241910002674503">હોમ અથવા પાછળ જવા નૅવિગેટ કરો તેમજ ટૅબ્લેટ મોડમાં ઍપને બટનથી સ્વિચ કરો.</translation> <translation id="3473479545200714844">સ્ક્રીન બૃહદદર્શક</translation> <translation id="3475843873335999118">માફ કરશો, તમારી ફિંગરપ્રિંટ હજી પણ ઓળખવામાં આવી નથી. કૃપા કરીને તમારો પાસવર્ડ દાખલ કરો.</translation> <translation id="3476303763173086583">વપરાશ અને નિદાનનો ડેટા મોકલો. Googleને નિદાન, ડિવાઇસ અને ઍપ વપરાશનો ડેટા ઑટોમૅટિક રીતે મોકલીને તમારા બાળકના Android અનુભવને બહેતર બનાવવામાં સહાય કરો. આનો ઉપયોગ તમારા બાળકને ઓળખવા માટે થશે નહીં અને સિસ્ટમ અને ઍપની સ્થિરતા અને અન્ય સુધારણાઓમાં સહાય કરશે. એકત્રીકરણ કરેલો કેટલોક ડેટા Google ઍપ અને ભાગીદારોને પણ મદદ કરશે, જેમ કે Android ડેવલપર. આ <ph name="BEGIN_LINK1" />સેટિંગ<ph name="END_LINK1" /> માલિક દ્વારા લાગુ કરવામાં આવેલ છે. માલિક, Googleને આ ડિવાઇસ માટે નિદાન અને વપરાશ ડેટા મોકલવાનું પસંદ કરી શકે છે. જો તમારા બાળક માટે વધારાની વેબ અને ઍપ પ્રવૃત્તિ સેટિંગ ચાલુ હોય, તો આ ડેટા તેમના Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે. <ph name="BEGIN_LINK2" />વધુ જાણો<ph name="END_LINK2" /></translation> @@ -2263,6 +2272,7 @@ <translation id="3971764089670057203">આ સિક્યુરિટી કીમાંના ફિંગરપ્રિન્ટ</translation> <translation id="3973660817924297510">પાસવર્ડ ચેક કરી રહ્યાં છીએ (<ph name="TOTAL_PASSWORDS" />માંથી <ph name="CHECKED_PASSWORDS" />)…</translation> <translation id="3975565978598857337">ક્ષેત્ર માટે સર્વરનો સંપર્ક કરવામાં નિષ્ફળ થયાં</translation> +<translation id="3975884715086515476"><ph name="IDS_SHORT_PRODUCT_NAME" /> તમારા પાસવર્ડ ચેક કરી શકતું નથી. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation> <translation id="3976108569178263973">કોઈ પ્રિન્ટર ઉપલબ્ધ નથી.</translation> <translation id="397703832102027365">ફાઇનલ કરી રહ્યું છે...</translation> <translation id="3977886311744775419">ઑટોમૅટિક અપડેટ આ નેટવર્ક પ્રકાર પર ડાઉનલોડ થતાં નથી, પણ તમે અપડેટ મેન્યુઅલી ચેક કરી શકો છો.</translation> @@ -2326,6 +2336,7 @@ <translation id="4068506536726151626">આ પૃષ્ઠમાં તમારા સ્થાનને ટ્રૅક કરતી નીચેની સાઇટ્સનાં ઘટકો શામેલ છે:</translation> <translation id="4068776064906523561">સાચવેલ ફિંગરપ્રિન્ટ</translation> <translation id="407173827865827707">ક્લિક કરવા પર</translation> +<translation id="4073520450811433493">સેટિંગ સિંક કરો</translation> <translation id="4074900173531346617">ઇમેઇલ હસ્તાક્ષરકર્તા પ્રમાણપત્ર</translation> <translation id="407520071244661467">સ્કેલ</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" />ને કાસ્ટ કરવામાં અસમર્થ.</translation> @@ -2562,6 +2573,7 @@ <translation id="4421932782753506458">ફ્લફી</translation> <translation id="4423376891418188461">સેટિંગ્સ પુનઃસ્થાપિત કરો</translation> <translation id="442397852638519243"><ph name="USER_NAME" />, તમારા વ્યવસ્થાપક માટે આવશ્યક છે કે તમે તમારો પાસવર્ડ બદલો.</translation> +<translation id="4426209360861763174"><ph name="IDS_SHORT_PRODUCT_NAME" /> તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરો.</translation> <translation id="4429030830601238961">આ ડેટા તમારી સંસ્થાની સુરક્ષા નીતિઓનું ઉલ્લંઘન કરે છે અને તેને પેસ્ટ કરી શકાશે નહીં.</translation> <translation id="4430019312045809116">વૉલ્યૂમ</translation> <translation id="4430369329743628066">બુકમાર્ક ઉમેરાયો</translation> @@ -2574,6 +2586,7 @@ <translation id="4441124369922430666">શું જ્યારે મશીન ચાલુ થાય ત્યારે તમે આ એપ્લિકેશનને આપમેળે પ્રારંભ કરવા માંગો છો?</translation> <translation id="4441147046941420429">આગળ વધવા માટે, તમારા ડિવાઇસમાંથી તમારી સિક્યુરિટી કી કાઢી નાખો, ત્યાર બાદ તેને ફરી દાખલ કરીને તેનો સ્પર્શ કરો</translation> <translation id="444134486829715816">વિસ્તૃત કરો...</translation> +<translation id="4442329324652245220">જ્યારે તમે તમારા Google એકાઉન્ટ વડે સાઇન ઇન કરો ત્યારે <ph name="IDS_SHORT_PRODUCT_NAME" /> તમારા પાસવર્ડ ચેક કરી શકે છે</translation> <translation id="4442424173763614572">DNS લુકઅપ નિષ્ફળ ગયું</translation> <translation id="4443536555189480885">&Help</translation> <translation id="4444304522807523469">USB અથવા સ્થાનિક નેટવર્ક મારફતે જોડાયેલ દસ્તાવેજ સ્કેનર્સની ઍક્સેસ</translation> @@ -2600,11 +2613,13 @@ <translation id="4476659815936224889">આ કોડ સ્કૅન કરવા માટે, તમે તમારા ફોન પર QR સ્કૅનર ઍપ અથવા અમુક કૅમેરા ઍપનો ઉપયોગ કરી શકો છો.</translation> <translation id="4477015793815781985">Ctrl, Alt અથવા ⌘ શામેલ કરો</translation> <translation id="4478664379124702289">લિં&કને આ રીતે સાચવો...</translation> +<translation id="4478777936860197922">કોઈ સાચવેલા પાસવર્ડ નથી. જ્યારે તમે તમારા પાસવર્ડ સાચવો ત્યારે <ph name="IDS_SHORT_PRODUCT_NAME" /> તેને ચેક કરી શકે છે.</translation> <translation id="4479424953165245642">કિઓસ્ક એપ્લિકેશન્સનું સંચાલન કરો</translation> <translation id="4479639480957787382">ઇથરનેટ</translation> <translation id="4479877282574735775">વર્ચ્યુઅલ મશીનની ગોઠવણી કરી રહ્યાં છીએ. આમાં થોડો સમય લાગી શકે છે.</translation> <translation id="4480590691557335796">Chrome તમારા કમ્પ્યુટરમાંથી નુકસાનકારક સૉફ્ટવેર શોધી અને તેને કાઢી નાખી શકે છે</translation> <translation id="4481530544597605423">જોડીથી અલગ કરેલા ઉપકરણો</translation> +<translation id="4488107067273194838">સેટઅપની પ્રક્રિયા પૂર્ણ થયા પછી, બ્રાઉઝર સિંક કરવાના વિકલ્પોનો રિવ્યૂ કરો</translation> <translation id="4488502501195719518">બધો ડેટા સાફ કરીએ?</translation> <translation id="4495419450179050807">આ પૃષ્ઠ પર બતાવશો નહીં</translation> <translation id="4496054781541092778"><ph name="PERMISSION" /> ઑટોમૅટિક રીતે બ્લૉક થઈ</translation> @@ -2844,6 +2859,7 @@ <translation id="4849517651082200438">ઇન્સ્ટોલ કરશો નહીં</translation> <translation id="4850669014075537160">સ્ક્રોલિંગ</translation> <translation id="4850886885716139402">જુઓ</translation> +<translation id="485197095346966382">જ્યારે તમે ચેડાં કરવામાં આવેલા પાસવર્ડ વડે સાઇન ઇન કરશો ત્યારે <ph name="IDS_SHORT_PRODUCT_NAME" /> તમને સૂચિત કરશે</translation> <translation id="4853020600495124913">&નવી વિંડોમાં ખોલો</translation> <translation id="4854317507773910281">મંજૂરી માટે માતાપિતાનું એકાઉન્ટ પસંદ કરો</translation> <translation id="485480310608090163">વધુ સેટિંગ અને પરવાનગીઓ</translation> @@ -2862,6 +2878,7 @@ <translation id="4871322859485617074">પિનમાં અમાન્ય અક્ષરો છે</translation> <translation id="4871370605780490696">બુકમાર્ક ઉમેરો</translation> <translation id="4871719318659334896">ગ્રૂપ બંધ કરો</translation> +<translation id="4871852311166078968">Groupમાં ઉમેરો</translation> <translation id="4873312501243535625">મીડિયા ફાઇલ તપાસનાર</translation> <translation id="4876273079589074638">આ ક્રૅશની તપાસ કરવામાં અને એને ઠીક કરવામાં અમારાં એન્જિનિયરોની મદદ કરો. જો તમે કરી શકો તેમ હોય તો ચોક્કસ પગલાંની સૂચિ બનાવો. કોઈ પણ વિગત નાની નથી હોતી!</translation> <translation id="4876895919560854374">સ્ક્રીન લૉક કરો અને અનલૉક કરો</translation> @@ -3502,6 +3519,7 @@ <translation id="5739235828260127894">ચકાસણીની રાહ જોઈ રહ્યાં છીએ. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="5739458112391494395">બહુ મોટું</translation> <translation id="574209121243317957">પિચ</translation> +<translation id="5745136023067925867"><ph name="DEVICE_TYPE" /> માટે ટિપ, ઑફરો અને અપડેટ મેળવો તથા પ્રતિસાદ શેર કરો</translation> <translation id="5746169159649715125">PDF તરીકે સાચવો</translation> <translation id="5747552184818312860">સમાપ્ત થાય છે</translation> <translation id="5747785204778348146">વિકાસકર્તા - અસ્થાયી</translation> @@ -4409,6 +4427,7 @@ <translation id="6997642619627518301"><ph name="NAME_PH" /> - પ્રવૃત્તિ લૉગ</translation> <translation id="6997707937646349884">તમારા ઉપકરણો પર:</translation> <translation id="6998793565256476099">વીડિયો કૉન્ફરન્સ માટે ડિવાઇસની નોંધણી કરો</translation> +<translation id="6999956497249459195">નવું ગ્રૂપ</translation> <translation id="7000206553895739324"><ph name="PRINTER_NAME" /> કનેક્ટ કરેલું છે પણ ગોઠવણી જરૂરી છે</translation> <translation id="7000347579424117903">Ctrl, Alt અથવા શોધ શામેલ કરો</translation> <translation id="7001036685275644873">Linux ઍપ અને ફાઇલોનો બૅકઅપ લેવાઈ રહ્યો છે</translation> @@ -4706,6 +4725,7 @@ <translation id="7400418766976504921">URL</translation> <translation id="7400839060291901923">તમારા <ph name="PHONE_NAME" /> પર કનેક્શન સેટ કરો</translation> <translation id="7401778920660465883">આ સંદેશ છોડી દો</translation> +<translation id="7403642243184989645">સંસાધનો ડાઉનલોડ થઈ રહ્યાં છે</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{સલામતી માટે તપાસ 1 કલાક અગાઉ કરવામાં આવી હતી}one{સલામતી માટે તપાસ {NUM_HOURS} કલાક અગાઉ કરવામાં આવી હતી}other{સલામતી માટે તપાસ {NUM_HOURS} કલાક અગાઉ કરવામાં આવી હતી}}</translation> <translation id="740624631517654988">પૉપ-અપ બ્લૉક કરેલું છે</translation> <translation id="7407430846095439694">આયાત કરો અને પ્રતિબદ્ધ કરો</translation> @@ -4942,6 +4962,7 @@ <translation id="7716781361494605745">નેટસ્કેપ પ્રમાણન અધિકારી નીતિ URL</translation> <translation id="7717014941119698257">ડાઉનલોડ કરી રહ્યું છે: <ph name="STATUS" /></translation> <translation id="7717845620320228976">અપડેટ્સ માટે તપાસો</translation> +<translation id="7719070594859855691">કૅમેરાનો ઍક્સેસ આપો</translation> <translation id="7719367874908701697">પૃષ્ઠ ઝૂમ કરો</translation> <translation id="7721179060400456005">વિંડોને ડિસ્પ્લે વધારવાની મંજૂરી આપો</translation> <translation id="7722040605881499779">અપડેટ કરવું જરૂરી છે: <ph name="NECESSARY_SPACE" /></translation> @@ -5042,6 +5063,7 @@ <ph name="BEGIN_BOLD" />નોંધ:<ph name="END_BOLD" /> પ્રક્રિયા દરમ્યાન આ સિસ્ટમ રીબૂટ થશે.</translation> <translation id="7828731929332799387">આનાથી ત્રીજા પક્ષ સંદર્ભમાં ઉપલબ્ધ બધી કુકી અને સાઇટ ડેટા ડિલીટ થઈ જશે. શું તમે ચાલુ રાખવા માગો છો?</translation> <translation id="7829298379596169484">ઑડિઓ ઇનપુટને ઍક્સેસ કરી રહ્યું છે</translation> +<translation id="7829528495815477379"><ph name="IDS_SHORT_PRODUCT_NAME" /> તમારા પાસવર્ડ ચેક કરી શકતું નથી. તમારું ઇન્ટરનેટ કનેક્શન ચેક કરવાનો પ્રયાસ કરો.</translation> <translation id="7829877209233347340">સ્કૂલ એકાઉન્ટ ઉમેરવાની પરવાનગી આપવા માટે તમારા માતાપિતાને સાઇન ઇન કરવાનું કહો</translation> <translation id="7830594666202422257">Linux સાથે કનેક્ટ કરો</translation> <translation id="7831491651892296503">નેટવર્કની ગોઠવણી કરતી વખતે ભૂલ આવી</translation> @@ -5254,6 +5276,7 @@ <translation id="8107015733319732394">તમારા <ph name="DEVICE_TYPE" /> પર Google Play સ્ટોર ઇન્સ્ટૉલ કરી રહ્યાં છીએ. આમાં થોડી મિનિટ લાગી શકે છે.</translation> <translation id="8108526232944491552">{COUNT,plural, =0{ત્રીજા પક્ષની કોઈ કુકી નથી}=1{ત્રીજા પક્ષની 1 કુકી બ્લૉક કરવામાં આવી છે}one{ત્રીજા પક્ષની # કુકી બ્લૉક કરવામાં આવી છે}other{ત્રીજા પક્ષની # કુકી બ્લૉક કરવામાં આવી છે}}</translation> <translation id="810875025413331850">નજીકમાં કોઈ ડિવાઇસ ન મળ્યું.</translation> +<translation id="8114199541033039755">હોમ અથવા પાછળ જવા નૅવિગેટ કરો તેમજ ટૅબ્લેટ મોડમાં ઍપને બટનથી સ્વિચ કરો. જ્યારે ChromeVox અથવા ઑટોમૅટિક ક્લિક ચાલુ કરવામાં આવે છે, ત્યારે તે ચાલુ થઈ જાય છે.</translation> <translation id="8114875720387900039">સ્ક્રીનને આડી વિભાજિત કરો</translation> <translation id="8116972784401310538">&બુકમાર્ક વ્યવસ્થાપક</translation> <translation id="8117620576188476503">સ્ટેટસ ટ્રે વડે કનેક્શન, અપડેટ અને સેટિંગ મેનેજ કરો. અહીં કીબોર્ડ વડે પહોંચવા માટે, Alt + Shift + S દબાવો.</translation> @@ -5373,6 +5396,7 @@ <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> એ તમારા માઉસ કર્સરને અક્ષમ કર્યું છે.</translation> <translation id="8264024885325823677">આ સેટિંગને તમારા વ્યવસ્થાપક દ્વારા મેનેજ કરવામાં આવે છે.</translation> <translation id="8264718194193514834"><ph name="EXTENSION_NAME" /> એ પૂર્ણ સ્ક્રીનને ટ્રિગર કરેલી છે.</translation> +<translation id="826511437356419340">વિંડો ઓવરવ્યૂ મોડમાં દાખલ થયા. નૅવિગેટ કરવા માટે સ્વાઇપ કરો અથવા જો કીબોર્ડનો ઉપયોગ કરી રહ્યાં હો, તો Tab કી દબાવો.</translation> <translation id="8267961145111171918"><ph name="BEGIN_PARAGRAPH1" />આ ડિવાઇસ અને તે કેવી રીતે ઉપયોગમાં લેવાય છે (જેમ કે બૅટરીનું લેવલ, સિસ્ટમ અને ઍપ પ્રવૃત્તિ તેમજ ભૂલો) વિશેની આ સામાન્ય માહિતી છે. આ ડેટાનો ઉપયોગ Androidને બહેતર બનાવવા માટે કરવામાં આવશે અને અમુક એકીકૃત માહિતી, Google ઍપ અને ભાગીદારો, જેમ કે Android ડેવલપરને પણ તેઓની ઍપ અને પ્રોડક્ટને બહેતર બનાવવામાં સહાયરૂપ થશે.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />આ સુવિધાને બંધ કરવાથી સિસ્ટમ અપડેટ અને સુરક્ષા જેવી આવશ્યક સેવાઓ માટે આવશ્યક માહિતી મોકલવાની આ ડિવાઇસની ક્ષમતાને અસર થતી નથી.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />સેટિંગ > વિગતવાર > 'Googleને ઑટોમૅટિક રીતે ડાયગ્નોસ્ટિક અને વપરાશ ડેટા મોકલો' પરથી ડિવાઇસના માલિક આ સુવિધાનું નિયંત્રણ કરી શકે છે.<ph name="END_PARAGRAPH3" /> @@ -5481,6 +5505,7 @@ <translation id="8426713856918551002">સક્ષમ કરી રહ્યાં છીએ</translation> <translation id="8427292751741042100">કોઈ પણ હોસ્ટ પર એમ્બેડ કરેલ</translation> <translation id="8428213095426709021">સેટિંગ્સ</translation> +<translation id="8428271547607112339">શાળાનું એકાઉન્ટ ઉમેરો</translation> <translation id="8428628598981198790">આ સાઇટ સાથે તમારા સુરક્ષા કોડનો ઉપયોગ કરી શકાતો નથી</translation> <translation id="84297032718407999">તમે <ph name="LOGOUT_TIME_LEFT" />માં સાઇન આઉટ થઈ જશો</translation> <translation id="8431190899827883166">ટૅપ બતાવો</translation> @@ -5543,6 +5568,7 @@ <translation id="851263357009351303"><ph name="HOST" /> ને હંમેશા છબી બતાવવાની મંજૂરી આપો</translation> <translation id="8513108775083588393">ઑટો રોટેટ</translation> <translation id="8514746246728959655">અલગ સુરક્ષા કોડ અજમાવી જુઓ</translation> +<translation id="851960115758509829">તમારા Google એકાઉન્ટ વડે સાઇન ઇન કરેલા બધા Chrome OS ડિવાઇસમાં તમારી ઍપ, સેટિંગ અને અન્ય કસ્ટમાઇઝેશન સિંક થશે.</translation> <translation id="8521475323816527629">તમારી ઍપ સુધી ઝડપથી પહોંચો</translation> <translation id="8523493869875972733">ફેરફારો રાખો</translation> <translation id="8523849605371521713">નીતિ દ્વારા ઉમેરાયેલ</translation> @@ -5823,11 +5849,13 @@ <translation id="885701979325669005">સ્ટોરેજ</translation> <translation id="8859057652521303089">તમારી ભાષા પસંદ કરો:</translation> <translation id="8859174528519900719">સબફ્રેમ: <ph name="SUBFRAME_SITE" /></translation> +<translation id="8859662783913000679">માતાપિતાનું એકાઉન્ટ</translation> <translation id="8862003515646449717">એક ઝડપી બ્રાઉઝર પર સ્વિચ કરો</translation> <translation id="8863753581171631212">નવી <ph name="APP" />માં લિંક ખોલો</translation> <translation id="8864055848767439877"><ph name="TAB_NAME" />ને <ph name="APP_NAME" /> પર શેર કરી રહ્યાં છે</translation> <translation id="8864458770072227512">આ ડિવાઇસમાંથી <ph name="EMAIL" /> દૂર કરવામાં આવ્યું</translation> <translation id="8867228703146808825">ક્લિપબોર્ડ પર બિલ્ડની વિગતો કૉપિ કરો</translation> +<translation id="8868333925931032127">ડેમો મોડ શરૂ કરી રહ્યાં છીએ</translation> <translation id="8868626022555786497">ઉપયોગમાં</translation> <translation id="8870413625673593573">તાજેતરમાં બંધ કરેલા</translation> <translation id="8871551568777368300">વ્યવસ્થાપક દ્વારા પિન કરેલ</translation> @@ -5905,6 +5933,7 @@ <translation id="8966870118594285808">જો તમે ટૅબ અકસ્માતે બંધ કર્યું હોય, તો તે ફરી ખોલો</translation> <translation id="8967866634928501045">બતાવવા માટે Alt Shift A દબાવો</translation> <translation id="8968766641738584599">કાર્ડ સાચવો</translation> +<translation id="8971800409073702505"><ph name="IDS_SHORT_PRODUCT_NAME" /> તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરજો અથવા <ph name="BEGIN_LINK" />તમારા Google એકાઉન્ટમાં પાસવર્ડ ચેક કરો<ph name="END_LINK" />.</translation> <translation id="89720367119469899">બહાર નીકળો</translation> <translation id="8972513834460200407">ફાયરવોલ Google સર્વર્સથી ડાઉનલોડ્સ અવરોધિત તો નથી કરતું તેની ખાતરી કરવા માટે કૃપા કરીને તમારા નેટવર્ક વ્યવસ્થાપક સાથે તપાસ કરો.</translation> <translation id="8973557916016709913">ઝૂમ સ્તર દૂર કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 3580a16..4f050df 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Էջանիշի անունը</translation> <translation id="1124772482545689468">Օգտատեր</translation> <translation id="1125550662859510761"><ph name="WIDTH" />x<ph name="HEIGHT" /> (օրիգինալ)</translation> +<translation id="1126809382673880764">Չի պաշտպանում վտանգավոր կայքերից, ընդլայնումներից և ներբեռնումներից։ Անվտանգ դիտարկումը նախկինի պես կաշխատի Google-ի այլ ծառայություններում (եթե հասանելի է), օրինակ՝ Gmail-ում կամ Որոնման էջերում։</translation> <translation id="1128109161498068552">Արգելել բոլոր կայքերին օգտագործել MIDI սարքերը՝ համակարգի հաղորդագրությունների միջոցով</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Փոխել որոնման համակարգը</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Պահված ցանցեր</translation> <translation id="123578888592755962">Սկավառակը լիքն է</translation> <translation id="1238191093934674082">OpenVPN</translation> +<translation id="1239439601391236986">Ցույց տալ մուտքագրվող անձնական տեղեկությունների հուշումներ</translation> <translation id="1239594683407221485">Դիտեք սարքի բովանդակությունը «Ֆայլեր» հավելվածում:</translation> <translation id="124116460088058876">Այլ լեզուներ</translation> <translation id="1241753985463165747">Կարդալ և փոխել ձեր բոլոր տվյալներն ընթացիկ կայքում, երբ այն բացվում է</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Բջջային ցանցի ակտիվացում</translation> <translation id="1407489512183974736">Եզրատել և կենտրոնաբերել</translation> <translation id="1408504635543854729">Դիտեք սարքի բովանդակությունը «Ֆայլեր» հավելվածում: Բովանդակության հասանելիությունը սահմանափակված է ադմինիստրատորի կողմից, և այն հնարավոր չէ փոփոխել։</translation> +<translation id="1408980562518920698">Կառավարել անձնական տեղեկությունները</translation> <translation id="1410197035576869800">Հավելվածի պատկերակ</translation> <translation id="1410616244180625362">Շարունակել <ph name="HOST" />-ին թույլ տալ ձեր տեսախցիկի օգտագործումը</translation> <translation id="1414648216875402825">Դուք անցնում եք <ph name="PRODUCT_NAME" />-ի անկայուն տարբերակի, որը պարունակում է տվյալ պահին մշակվող գործառույթներ: Զգույշ եղեք: Կարող են առաջնալ խափանումներ և անսպասելի վրիպակներ:</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&JavaScript վահանակ</translation> <translation id="1587907146729660231">Մատով հպեք սնուցման կոճակին</translation> +<translation id="1588200577109872591">Խելացի մուտքագրում</translation> <translation id="1588438908519853928">Սովորական</translation> <translation id="158849752021629804">Հարկավոր է ներքին ցանց</translation> <translation id="1588870296199743671">Բացել հղումը, օգտագործելով…</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">Մուտք գործել հաշվով</translation> <translation id="1880905663253319515">Ջնջե՞լ «<ph name="CERTIFICATE_NAME" />» վկայագիրը:</translation> <translation id="1884013283844450420">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, կապակցում</translation> +<translation id="1884705339276589024">Փոխել Լինուքսի սկավառակի չափը</translation> <translation id="1886996562706621347">Թույլ տալ կայքերին հարցել հաղորդակարգերի մշակիչների ստանդարտ տեղադրում (հանձնարարելի)</translation> <translation id="1887442540531652736">Մուտքի սխալ</translation> <translation id="1887597546629269384">Նորից ասեք «Ok Google»</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181">Դուք անցնում եք <ph name="PRODUCT_NAME" />-ի ավելի թողարկման վարկածի, որի տարբերակն ավելի հին է: Որպեսզի փոփոխությունը կիրառվի, տարբերակը պետք է համընկնի ձեր սարքում տեղադրված տարբերակի հետ:</translation> <translation id="197989455406964291">KDC-ն չի աջակցում գաղտնագրման տեսակը</translation> <translation id="1982354452682152483">Նկարագրություն չկա։</translation> +<translation id="1984417487208496350">Առանց պաշտպանության (խորհուրդ չի տրվում)</translation> <translation id="1987317783729300807">Հաշիվներ</translation> <translation id="1989112275319619282">Ընտրել</translation> <translation id="1990512225220753005">Չցուցադրել դյուրանցումներ այս էջում</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">Հաշվի տեղեկությունները վերականգնելու համար այցելեք՝ google.com/accounts/recovery</translation> <translation id="2090876986345970080">Համակարգի անվտանգության կարգավորում</translation> <translation id="2091887806945687916">Ձայն</translation> +<translation id="2096478741073211388">Անձնական տեղեկությունների հուշումներն օգնում են ավելի արագ գրել՝ առաջարկելով ձեր անունը, հասցեն կամ հեռախոսահամարը, երբ դուք որոշակի բառեր եք մուտքագրում։ Միայն դուք կարող եք տեսնել ձեր անձնական, անհատականացված հուշումները հաշվի համար։</translation> <translation id="2096715839409389970">Արգելափակել երրորդ կողմի քուքիները</translation> <translation id="2097372108957554726">Նոր սարքեր գրանցելու համար դուք պետք է մուտք գործեք Chrome</translation> <translation id="2099172618127234427">Դուք միացնում եք Chrome-ի օպերացիոն համակարգի վրիպազերծման գործառույթները, որոնք կկարգավորեն sshd daemon-ը և թույլ կտան սկզբնաբեռնել USB հիշասարքերից:</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">Վերաբեռնել &շրջանակը</translation> <translation id="2114896190328250491">Լուսանկարի հեղինակ՝ <ph name="NAME" /></translation> <translation id="2119349053129246860">Բացել <ph name="APP" /> հավելվածում</translation> +<translation id="2119461801241504254">Անվտանգ դիտարկումը միացված է և պաշտպանում է ձեզ վտանգավոր կայքերից ու ներբեռնումներից</translation> <translation id="2120297377148151361">Գործողություններ դիտարկիչում</translation> <translation id="2120639962942052471"><ph name="PERMISSION" />՝ արգելափակված է</translation> <translation id="2121055421682309734">{COUNT,plural, =0{Քուքիներն արգելափակված են}=1{Բոլոր քուքիները՝ բացառությամբ 1-ի, արգելափակված են}one{Բոլոր քուքիները՝ բացառությամբ {COUNT}-ի, արգելափակված են}other{Բոլոր քուքիները՝ բացառությամբ {COUNT}-ի, արգելափակված են}}</translation> @@ -1891,6 +1899,7 @@ <translation id="3515983984924808886">Հաստատելու համար նորից հպեք անվտանգության բանալուն: Բանալու վրա պահված բոլոր տվյալները, այդ թվում՝ PIN կոդը, կջնջվեն:</translation> <translation id="3518985090088779359">Ընդունել և շարունակել</translation> <translation id="351952459507671940">Ավելացնել նոր խմբում</translation> +<translation id="3521606918211282604">Փոխել սկավառակի չափը</translation> <translation id="3523642406908660543">Հարցնել, երբ կայքն ուզում է փլագին օգտագործել ձեր համակարգիչ մուտք գործելու համար (հանձնարարելի)</translation> <translation id="3524965460886318643">Արտահանել գործողությունների պատմությունը</translation> <translation id="3526034519184079374">Չի կարող կարդալ կամ փոխել կայքի տվյալները</translation> @@ -1978,6 +1987,7 @@ <translation id="3629631988386925734">Smart Lock-ը միացնելու համար մուտքագրեք ձեր գաղտնաբառը։ Դրանից հետո ձեր հեռախոսով կարող եք ապակողպել <ph name="DEVICE_TYPE" /> սարքը։ Smart Lock-ը կարող եք անջատել կարգավորումներում։</translation> <translation id="3630132874740063857">Հեռախոս</translation> <translation id="3630995161997703415">Ավելացրեք այս կայքը ձեր դարակում՝ այն ցանկացած ժամանակ օգտագործելու համար</translation> +<translation id="3633309367764744750">Նախապես բեռնում է տեղեկություններն էջերից, այդ թվում՝ այն էջերից, որոնք դեռ չեք այցելել։ Բեռնված տեղեկությունները կարող են պարունակել քուքիներ, եթե վերջիններս թույլատրված են։</translation> <translation id="3634507049637220048">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, կառավարվում է ձեր ադմինիստրատորի կողմից, մանրամասներ</translation> <translation id="3635241501480133979">Այս տվյալները չեն տեղափոխվի, քանի որ խախտում են կազմակերպության անվտանգության կանոնները։</translation> <translation id="3635353578505343390">Հետադարձ կապ Google-ի հետ</translation> @@ -3940,6 +3950,7 @@ <translation id="6298962879096096191">Android հավելվածներ տեղադրելու համար օգտագործել Google Play-ը</translation> <translation id="630065524203833229">Ե&լք</translation> <translation id="6300718114348072351">Չհաջողվեց ավտոմատ կարգավորել <ph name="PRINTER_NAME" /> տպիչը։ Նշեք տպիչի վերաբերյալ լրացուցիչ մանրամասներ։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Անձնական տեղեկությունների հուշումներ</translation> <translation id="6305607932814307878">Գլոբալ քաղաքականություն՝</translation> <translation id="6307990684951724544">Համակարգը զբաղված է</translation> <translation id="6308493641021088955">Մուտք «<ph name="EXTENSION_NAME" />» ընդլայնման միջոցով</translation> @@ -4018,6 +4029,7 @@ <translation id="641081527798843608">Թեմաների համընկնում</translation> <translation id="6412673304250309937">Ստուգում է URL-ները Chrome-ում պահված վտանգավոր կայքերի ցանկի միջոցով։ Եթե կայքը փորձում է գողանալ ձեր գաղտնաբառը, կամ երբ վնասակար ֆայլ եք ներբեռնում, Chrome-ը կարող է ուղարկել URL-ն ու էջի բովանդակությունը՝ անվտանգ դիտարկման միջոցով ստուգելու համար։</translation> <translation id="6412931879992742813">Նոր ինկոգնիտո պատուհան</translation> +<translation id="6413591858632097328">Բոլոր տվյալներն ու քուքիները, որոնք պահվել են <ph name="ORIGIN_NAME" /> կայքի և դրա տեղադրած հավելվածների կողմից, կջնջվեն։</translation> <translation id="641469293210305670">Թարմացումների և հավելվածների տեղադրում</translation> <translation id="6414888972213066896">Դուք այս կայք այցելելու թույլտվության հարցում եք ուղարկել ձեր ծնողին</translation> <translation id="6415900369006735853">Միացեք համացանցին հեռախոսի միջոցով։</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 448570c..dc8a5473 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1859,7 +1859,7 @@ <translation id="3468999815377931311">Telefon Android</translation> <translation id="3470442499439619530">Alih Keluar Pengguna Ini</translation> <translation id="3471876058939596279">Port HDMI dan USB Jenis-C tidak boleh digunakan untuk video pada masa yang sama. Gunakan port video yang berbeza.</translation> -<translation id="3473241910002674503">Navigasi ke laman utama, ke halaman sebelumnya dan bertukar apl menggunakan butang dalam mod tablet.</translation> +<translation id="3473241910002674503">Navigasi ke laman utama, ke halaman sebelumnya dan bertukar apl dengan menggunakan butang dalam mod tablet.</translation> <translation id="3473479545200714844">Penggadang skrin</translation> <translation id="3475843873335999118">Maaf, cap jari anda masih tidak dikenali. Sila masukkan kata laluan anda.</translation> <translation id="3476303763173086583">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anak anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini tidak akan digunakan untuk mengenal pasti anak anda dan akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pemilik. Pemilik mungkin memilih untuk menghantar data diagnostik dan penggunaan bagi peranti ini kepada Google. Jika tetapan Aktiviti Web & Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan ke akaun Googlenya. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation> @@ -5296,7 +5296,7 @@ <translation id="8107015733319732394">Memasang Gedung Google Play pada <ph name="DEVICE_TYPE" /> anda. Proses ini mungkin mengambil masa beberapa minit.</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Tiada kuki pihak ketiga}=1{1 kuki pihak ketiga disekat}other{# kuki pihak ketiga disekat}}</translation> <translation id="810875025413331850">Tiada peranti berdekatan dijumpai.</translation> -<translation id="8114199541033039755">Navigasi ke laman utama, ke halaman sebelumnya dan bertukar apl menggunakan butang dalam mod tablet. Dihidupkan apabila ChromeVox atau Klik automatik didayakan.</translation> +<translation id="8114199541033039755">Navigasi ke laman utama, ke halaman sebelumnya dan bertukar apl dengan menggunakan butang dalam mod tablet. Dihidupkan apabila ChromeVox atau Klik automatik didayakan.</translation> <translation id="8114875720387900039">Pisah mendatar</translation> <translation id="8116972784401310538">&Pengurus penanda halaman</translation> <translation id="8117620576188476503">Urus sambungan, kemas kini dan tetapan dengan dulang status. Untuk ke sini menggunakan papan kekunci, tekan Alt + Shift + S.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index ddf5aed0..7bf6ab6 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Názov záložky</translation> <translation id="1124772482545689468">Používateľ</translation> <translation id="1125550662859510761">Vyzerá ako <ph name="WIDTH" /> x <ph name="HEIGHT" /> (natívne)</translation> +<translation id="1126809382673880764">Nechráni vás pred nebezpečnými webmi, stiahnutým súbormi ani rozšíreniami. Ochrana Bezpečného prehliadania vám bude poskytovaná v náležitých prípadoch v ďalších službách Googlu, ako sú napríklad Gmail alebo Vyhľadávanie.</translation> <translation id="1128109161498068552">Žadnym stránkam nepovoliť používanie exkluzívnych správ na prístup k zariadeniam MIDI</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Úprava vyhľadávača</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Známe siete</translation> <translation id="123578888592755962">Disk je plný</translation> <translation id="1238191093934674082">Open VPN</translation> +<translation id="1239439601391236986">Zobrazovanie návrhov osobných údajov pri zadávaní</translation> <translation id="1239594683407221485">Preskúmajte obsah zariadenia v aplikácii Súbory.</translation> <translation id="124116460088058876">Ďalšie jazyky</translation> <translation id="1241753985463165747">Čítať a meniť všetky údaje na aktuálnom webe (po vyvolaní)</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Aktivácia mobilnej siete</translation> <translation id="1407489512183974736">Orezať na stred</translation> <translation id="1408504635543854729">Preskúmajte obsah zariadenia v aplikácii Súbory. Tento obsah bol obmedzený správcom a nedá sa upraviť.</translation> +<translation id="1408980562518920698">Spravovať osobné údaje</translation> <translation id="1410197035576869800">Ikona aplikácie</translation> <translation id="1410616244180625362">Aj naďalej povoliť stránkam <ph name="HOST" /> prístup ku kamere</translation> <translation id="1414648216875402825">Chystáte sa vykonať aktualizáciu na nestabilnú verziu prehliadača <ph name="PRODUCT_NAME" />, ktorá obsahuje funkcie vo vývoji. Bude dochádzať ku zlyhaniam a neočakávaným chybám. Postupujte opatrne.</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&Konzola jazyka JavaScript</translation> <translation id="1587907146729660231">Dotknite sa prstom vypínača</translation> +<translation id="1588200577109872591">Inteligentné vstupy</translation> <translation id="1588438908519853928">Normálny</translation> <translation id="158849752021629804">Je potrebná domáca sieť</translation> <translation id="1588870296199743671">Otvoriť odkaz pomocou...</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">Prihlásený účet</translation> <translation id="1880905663253319515">Odstrániť certifikát „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="1884013283844450420"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, pripojenie</translation> +<translation id="1884705339276589024">Zmena veľkosti disku Linux</translation> <translation id="1886996562706621347">Povoliť webovým stránkam požiadať o nastavenie za predvolené obslužné nástroje protokolov (odporúčané)</translation> <translation id="1887442540531652736">Chyba prihlásenia.</translation> <translation id="1887597546629269384">Znova povedzte „Hej Google“</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181">Chystáte sa zmeniť na kanál so staršou verziou prehliadača <ph name="PRODUCT_NAME" />. Zmena kanála sa prejaví, keď sa verzia kanála bude zhodovať s verziou, ktorá je momentálne nainštalovaná v zariadení.</translation> <translation id="197989455406964291">KDC nepodporuje typ šifrovania</translation> <translation id="1982354452682152483">K dispozícii nie je žiadny popis.</translation> +<translation id="1984417487208496350">Bez ochrany (neodporúča sa)</translation> <translation id="1987317783729300807">Účty</translation> <translation id="1989112275319619282">Prehliadať</translation> <translation id="1990512225220753005">Nezobrazovať skratky na tejto stránke</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">Ak chcete obnoviť informácie o svojom účte, prejdite na stránku google.com/accounts/recovery</translation> <translation id="2090876986345970080">Nastavenie zabezpečenia systému</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="2096478741073211388">Návrhy osobných údajov urýchľujú písanie tým, že po zadaní niektorých konkrétnych slov navrhnú vaše meno, adresu či telefónne číslo. Súkromné prispôsobené návrhy pre svoj účet vidíte len vy.</translation> <translation id="2096715839409389970">Vymazať súbory cookie tretej strany</translation> <translation id="2097372108957554726">Ak chcete registrovať nové zariadenia, musíte sa prihlásiť do prehliadača Chrome</translation> <translation id="2099172618127234427">Aktivujete funkcie ladenia systému OS Chrome, ktoré nastavia démona sshd a umožnia spúšťanie z jednotiek USB.</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">Znova načítať prvok &Frame</translation> <translation id="2114896190328250491">Autor fotografie: <ph name="NAME" /></translation> <translation id="2119349053129246860">Otvoriť v aplikácii <ph name="APP" /></translation> +<translation id="2119461801241504254">Bezpečné prehliadanie je aktuálne a chráni vás pred škodlivými webmi a súbormi na stiahnutie</translation> <translation id="2120297377148151361">Aktivity a interakcie</translation> <translation id="2120639962942052471">Blokujete <ph name="PERMISSION" /></translation> <translation id="2121055421682309734">{COUNT,plural, =0{Súbory cookie sú blokované}=1{Súbory cookie sú blokované, 1 výnimka}few{Súbory cookie sú blokované, {COUNT} výnimky}many{Cookies are blocked, {COUNT} exceptions}other{Súbory cookie sú blokované, {COUNT} výnimiek}}</translation> @@ -1890,6 +1898,7 @@ <translation id="3515983984924808886">Resetovanie potvrďte opätovným stlačením bezpečnostného kľúča. Všetky informácie uchované v bezpečnostnom kľúči (vrátane jeho kódu PIN) budú odstránené.</translation> <translation id="3518985090088779359">Prijať a pokračovať</translation> <translation id="351952459507671940">Pridať do novej skupiny</translation> +<translation id="3521606918211282604">Zmeniť veľkosť na disku</translation> <translation id="3523642406908660543">Opýtať sa, keď budú chcieť stránky použiť doplnok na prístup do počítača (odporúčané)</translation> <translation id="3524965460886318643">Exportovať aktivity</translation> <translation id="3526034519184079374">Údaje webu sa nedajú prečítať ani zmeniť</translation> @@ -1977,6 +1986,7 @@ <translation id="3629631988386925734">Aktivujte Smart Lock zadaním hesla. Zariadenie <ph name="DEVICE_TYPE" /> nabudúce odomknete telefónom. Smart Lock vypnete v Nastaveniach.</translation> <translation id="3630132874740063857">Váš telefón</translation> <translation id="3630995161997703415">Ak chcete tento web kedykoľvek použiť, pridajte si ho na poličku</translation> +<translation id="3633309367764744750">Predbežne načíta informácie zo stránok (vrátane tých, ktoré ste zatiaľ nenavštívili). Načítané informácie môžu zahŕňať súbory cookie (ak ich máte povolené).</translation> <translation id="3634507049637220048"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ovládaná správcom, podrobnosti</translation> <translation id="3635241501480133979">Tieto údaje porušujú pravidlá zabezpečenia vašej organizácie a nie je možné ich presunúť.</translation> <translation id="3635353578505343390">Odoslanie spätnej väzby Googlu</translation> @@ -3936,6 +3946,7 @@ <translation id="6298962879096096191">Inštalácia aplikácií pre Android pomocou služby Google Play</translation> <translation id="630065524203833229">U&končiť</translation> <translation id="6300718114348072351">Tlačiareň <ph name="PRINTER_NAME" /> sa nepodarilo automaticky nakonfigurovať. Špecifikujte rozšírené podrobnosti o tlačiarni. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Návrhy osobných údajov</translation> <translation id="6305607932814307878">Globálne pravidlá:</translation> <translation id="6307990684951724544">Systém je zaneprázdnený</translation> <translation id="6308493641021088955">Prihlásenie poskytuje <ph name="EXTENSION_NAME" /></translation> @@ -4014,6 +4025,7 @@ <translation id="641081527798843608">Zhoda predmetu</translation> <translation id="6412673304250309937">Kontroluje webové adresy podľa zoznamu nebezpečných webov uloženého v Chrome. Ak sa vám určitý web pokúsi ukradnúť heslo alebo stiahnete škodlivý súbor, Chrome môže tiež odoslať webové adresy vrátane častí obsahu stránky Bezpečnému prehliadaniu.</translation> <translation id="6412931879992742813">Nové okno inkognito</translation> +<translation id="6413591858632097328">Týmto vymažete všetky dáta a súbory cookie uložené zdrojom <ph name="ORIGIN_NAME" /> a jeho nainštalovanými aplikáciami.</translation> <translation id="641469293210305670">Inštalácia aktualizácií a aplikácií</translation> <translation id="6414888972213066896">Opýtali ste sa svojho rodiča, či môžete navštíviť tento web</translation> <translation id="6415900369006735853">Pripojte sa k internetu cez telefón</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index c6306e88..ac13a589 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -201,7 +201,7 @@ <translation id="1259152067760398571">Säkerhetskontrollen kördes i går</translation> <translation id="1260451001046713751">Tillåt alltid popup-fönster och omdirigeringar från <ph name="HOST" /></translation> <translation id="126156426083987769">Ett problem med enhetslicenser för demoläge uppstod.</translation> -<translation id="1263490604593716556">Kontot hanteras av <ph name="FIRST_PARENT_EMAIL" /> och <ph name="SECOND_PARENT_EMAIL" />. Klicka på klockan på skärmen om du vill logga ut från det primära kontot. Klicka på Logga ut i menyn som visas.</translation> +<translation id="1263490604593716556">Kontot hanteras av <ph name="FIRST_PARENT_EMAIL" /> och <ph name="SECOND_PARENT_EMAIL" />. Klicka på klockan på skärmen om du vill logga ut från det primära kontot på den här enheten. Klicka på Logga ut i menyn som visas.</translation> <translation id="126710816202626562">Översättningsspråk:</translation> <translation id="126768002343224824">16x</translation> <translation id="1272079795634619415">Stopp</translation> @@ -872,7 +872,7 @@ <translation id="2172784515318616985">Fortsätt</translation> <translation id="2173302385160625112">Kontrollera internetanslutningen</translation> <translation id="2173801458090845390">Lägg till rekvirerings-id på enheten</translation> -<translation id="2174948148799307353">Kontot hanteras av <ph name="PARENT_EMAIL" />. Klicka på klockan på skärmen om du vill logga ut från det primära kontot. Klicka på Logga ut i menyn som visas.</translation> +<translation id="2174948148799307353">Kontot hanteras av <ph name="PARENT_EMAIL" />. Klicka på klockan på skärmen om du vill logga ut från det primära kontot på den här enheten. Klicka på Logga ut i menyn som visas.</translation> <translation id="2175607476662778685">Fältet Snabbstart</translation> <translation id="217576141146192373">Det gick inte att lägga till en skrivare. Kontrollera skrivarens konfiguration och försök igen.</translation> <translation id="2177950615300672361">Fliken Inkognito: <ph name="TAB_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 601d1e4..3ba7505 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Yer işareti adı</translation> <translation id="1124772482545689468">Kullanıcı</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> şeklinde görünür (Yerel)</translation> +<translation id="1126809382673880764">Sizi tehlikeli web siteleri, indirmeler ve uzantılara karşı korumaz. Gmail ve Arama gibi diğer Google hizmetlerinde, mümkün olduğunda Güvenli Tarama korumasından yararlanmaya devam edersiniz.</translation> <translation id="1128109161498068552">Hiçbir sitenin MIDI cihazlarına erişmek için sisteme özel mesajları kullanmasına izin verme</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Arama motorunu düzenleyin</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Bilinen ağlar</translation> <translation id="123578888592755962">Disk dolu</translation> <translation id="1238191093934674082">Open VPN</translation> +<translation id="1239439601391236986">Kişisel bilgi önerileri girişini göster</translation> <translation id="1239594683407221485">Cihazın içeriğini Files uygulamasında keşfedin.</translation> <translation id="124116460088058876">Diğer diller</translation> <translation id="1241753985463165747">Çağrıldığında geçerli web sitesindeki tüm verilerinizi okuma ve değiştirme</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Hücresel Etkinleştirme</translation> <translation id="1407489512183974736">Ortala ve Kırp</translation> <translation id="1408504635543854729">Cihazın içeriğini Dosyalar uygulamasında keşfedin. İçerik, bir yönetici tarafından kısıtlanmış ve üzerinde değişiklik yapılamaz.</translation> +<translation id="1408980562518920698">Kişisel bilgileri yönetin</translation> <translation id="1410197035576869800">Uygulama Simgesi</translation> <translation id="1410616244180625362">Kameranıza <ph name="HOST" /> tarafından erişilmesine izin vermeye devam edin</translation> <translation id="1414648216875402825"><ph name="PRODUCT_NAME" /> ürününün kararsız bir sürümüne güncelleme yapıyorsunuz. Bu sürüm geliştirilmekte olan özellikler içerir. Kilitlenmeler ve beklenmeyen hatalar olacaktır. Lütfen dikkatle ilerleyin.</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&JavaScript konsolu</translation> <translation id="1587907146729660231">Parmağınızla güç düğmesine dokunun</translation> +<translation id="1588200577109872591">Akıllı girişler</translation> <translation id="1588438908519853928">Normal</translation> <translation id="158849752021629804">Ev ağı gerekli</translation> <translation id="1588870296199743671">Bağlantıyı Şununla Birlikte Aç...</translation> @@ -669,6 +673,7 @@ <translation id="1879000426787380528">Farklı kullanıcı olarak oturum açın</translation> <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" sertifikası silinsin mi?</translation> <translation id="1884013283844450420">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Bağlan</translation> +<translation id="1884705339276589024">Linux Disk'i yeniden boyutlandırın</translation> <translation id="1886996562706621347">Sitelerin, protokoller için varsayılan işleyiciler olmasını sormasına izin ver (önerilir)</translation> <translation id="1887442540531652736">Oturum açma hatası</translation> <translation id="1887597546629269384">Tekrar "Hey Google" deyin</translation> @@ -738,6 +743,7 @@ <translation id="1979280758666859181"><ph name="PRODUCT_NAME" /> ürününün eski sürümünü destekleyen bir kanala geçiyorsunuz. Kanal değişikliği, kanalın sürümü cihazınızda şu an yüklenmiş olan sürümle eşleştiğinde uygulanacak.</translation> <translation id="197989455406964291">KDC, şifreleme türünü desteklemiyor</translation> <translation id="1982354452682152483">Açıklama yok.</translation> +<translation id="1984417487208496350">Koruma yok (önerilmez)</translation> <translation id="1987317783729300807">Hesaplar</translation> <translation id="1989112275319619282">Göz at</translation> <translation id="1990512225220753005">Kısayolları bu sayfada gösterme</translation> @@ -807,6 +813,7 @@ <translation id="2090165459409185032">Hesap bilgilerinizi kurtarmak için şu adrese gidin: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Sistem güvenlik ayarı</translation> <translation id="2091887806945687916">Ses</translation> +<translation id="2096478741073211388">Kişisel bilgi önerileri, belirli kelimeleri yazdığınızda adınızı, adresinizi veya telefon numaranızı önererek daha hızlı yazmanıza yardımcı olur. Size özel, hesabınız için kişiselleştirilmiş önerileri yalnızca siz görürsünüz.</translation> <translation id="2096715839409389970">Üçüncü taraf çerezlerini sil</translation> <translation id="2097372108957554726">Yeni cihazlar kaydettirebilmeniz için Chrome'da oturum açmanız gerekir</translation> <translation id="2099172618127234427">sshd yardımcı programını ayarlayacak ve USB sürücülerinden önyüklemeyi etkinleştirecek Chrome OS hata ayıklama özelliklerini etkinleştiriyorsunuz.</translation> @@ -823,6 +830,7 @@ <translation id="2114326799768592691">&Çerçeveyi Yeniden Yükle</translation> <translation id="2114896190328250491">Fotoğrafı çeken: <ph name="NAME" /></translation> <translation id="2119349053129246860"><ph name="APP" /> Uygulamasında Aç</translation> +<translation id="2119461801241504254">Güvenli Tarama açık olup sizi zararlı sitelere ve indirmelere karşı koruyor</translation> <translation id="2120297377148151361">Etkinlik ve etkileşimler</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> engellendi</translation> <translation id="2121055421682309734">{COUNT,plural, =0{Çerezler engellendi}=1{Çerezler engellendi, 1 istisna}other{Çerezler engellendi, {COUNT} istisna}}</translation> @@ -1891,6 +1899,7 @@ <translation id="3515983984924808886">Sıfırlamayı onaylamak için güvenlik anahtarınıza tekrar dokunun. PIN'i de dahil olmak üzere güvenlik anahtarında depolanan tüm bilgiler silinir.</translation> <translation id="3518985090088779359">Kabul et ve devam et</translation> <translation id="351952459507671940">Yeni gruba ekle</translation> +<translation id="3521606918211282604">Disk boyutunu değiştir</translation> <translation id="3523642406908660543">Bir site, bilgisayarıma erişmek için eklenti kullanmak istediğinde bana sor (önerilen)</translation> <translation id="3524965460886318643">Etkinlikleri Dışa Aktar</translation> <translation id="3526034519184079374">Sitenin Verileri Okunamıyor veya Değiştirilemiyor</translation> @@ -1978,6 +1987,7 @@ <translation id="3629631988386925734">Smart Lock'u açmak için şifrenizi girin. Böylece, bir dahaki sefere telefonunuzu kullanarak <ph name="DEVICE_TYPE" /> cihazınızın kilidini açabilirsiniz. Ayarlar'dan Smart Lock'u kapatabilirsiniz.</translation> <translation id="3630132874740063857">Telefonunuz</translation> <translation id="3630995161997703415">Bu siteyi istediğiniz zaman kullanmak için rafınıza ekleyin</translation> +<translation id="3633309367764744750">Daha önce ziyaret etmedikleriniz dahil olmak üzere sayfalardan bilgileri önceden getirir. Getirilen bilgiler, çerezlere izin veriyorsanız çerez de içerebilir.</translation> <translation id="3634507049637220048">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Yöneticiniz tarafından yönetiliyor, Ayrıntılar</translation> <translation id="3635241501480133979">Bu veriler kuruluşunuzun güvenlik politikalarını ihlal ettiğinden sürüklenip bırakılamaz.</translation> <translation id="3635353578505343390">Google'a geri bildirim gönder</translation> @@ -3938,6 +3948,7 @@ <translation id="6298962879096096191">Android uygulamalarını yüklemek için Google Play'i kullanın</translation> <translation id="630065524203833229">Çı&kış</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> otomatik olarak yapılandırılamıyor. Lütfen gelişmiş yazıcı ayrıntılarını belirtin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Kişisel bilgi önerileri</translation> <translation id="6305607932814307878">Genel Politika:</translation> <translation id="6307990684951724544">Sistem meşgul</translation> <translation id="6308493641021088955">Oturum açma işlemi <ph name="EXTENSION_NAME" /> tarafından sağlanmıştır</translation> @@ -4016,6 +4027,7 @@ <translation id="641081527798843608">Konu eşleştirmesi</translation> <translation id="6412673304250309937">URL'leri, Chrome'da kayıtlı güvenli olmayan siteler listesine göre kontrol eder. Chrome, bir sitenin şifrenizi çalmaya çalışması veya zararlı bir dosya indirmeniz halinde de Güvenli Tarama'ya sayfa içeriğinden parçalarla birlikte URL'ler gönderebilir.</translation> <translation id="6412931879992742813">Yeni gizli pencere</translation> +<translation id="6413591858632097328">Bu işlem, <ph name="ORIGIN_NAME" /> tarafından depolanan tüm veriler ve çerezler ile yüklemiş olduğu uygulamayı temizleyecek.</translation> <translation id="641469293210305670">Güncellemeleri ve Uygulamaları Yükle</translation> <translation id="6414888972213066896">Ebeveyninize bu siteyi ziyaret etmenizin uygun olup olmadığını sordunuz</translation> <translation id="6415900369006735853">Telefonunuz üzerinden internete bağlanın</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 8089755..bbfb368 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -204,7 +204,7 @@ <translation id="1259152067760398571">سیفٹی چیک گزشتہ روز کیا گیا</translation> <translation id="1260451001046713751"><ph name="HOST" /> سے ہمیشہ پوپ - اپس اور ری ڈائریکٹس کی اجازت دیں</translation> <translation id="126156426083987769">ڈیمو موڈ میں آلہ کے لائسنسز سے متعلق ایک مسئلہ پیش آگیا۔</translation> -<translation id="1263490604593716556"><ph name="FIRST_PARENT_EMAIL" /> اور <ph name="SECOND_PARENT_EMAIL" /> کے زیر انتظام اکاؤنٹ اس آلے پر بنیادی اکاؤنٹ سے سائن آؤٹ کرنے کیلئے، اپنی اسکرین پر 'وقت' پر کلک کریں۔ ظاہر ہونے والے مینو میں، 'سائن آؤٹ کریں' پر کلک کریں۔</translation> +<translation id="1263490604593716556"><ph name="FIRST_PARENT_EMAIL" /> اور <ph name="SECOND_PARENT_EMAIL" /> کے زیر انتظام اکاؤنٹ اس آلے پر بنیادی اکاؤنٹ سے سائن آؤٹ کرنے کیلئے، اپنی اسکرین پر وقت پر کلک کریں۔ ظاہر ہونے والے مینو میں، 'سائن آؤٹ کریں' پر کلک کریں۔</translation> <translation id="126710816202626562">ترجمہ کی زبان:</translation> <translation id="126768002343224824">16x</translation> <translation id="1272079795634619415">روکیں</translation> @@ -881,7 +881,7 @@ <translation id="2172784515318616985">جاری رکھیں</translation> <translation id="2173302385160625112">اپنا انٹرنیٹ کنکشن چیک کریں</translation> <translation id="2173801458090845390">اس آلہ میں درخواست ID شامل کریں</translation> -<translation id="2174948148799307353"><ph name="PARENT_EMAIL" /> کے زیر انتظام اکاؤنٹ۔ اس آلے پر بنیادی اکاؤنٹ سے سائن آؤٹ کرنے کیلئے، اپنی اسکرین پر 'وقت' پر کلک کریں۔ ظاہر ہونے والے مینو میں، 'سائن آؤٹ کریں' پر کلک کریں۔</translation> +<translation id="2174948148799307353"><ph name="PARENT_EMAIL" /> کے زیر انتظام اکاؤنٹ۔ اس آلے پر بنیادی اکاؤنٹ سے سائن آؤٹ کرنے کیلئے، اپنی اسکرین پر وقت پر کلک کریں۔ ظاہر ہونے والے مینو میں، 'سائن آؤٹ کریں' پر کلک کریں۔</translation> <translation id="2175607476662778685">فوری طور پر شروع کرنے کا بار</translation> <translation id="217576141146192373">پرنٹر شامل کرنے سے قاصر۔ براہ کرم اپنے پرنٹر کی کنفیگریشن چیک کریں اور دوبارہ کوشش کریں۔</translation> <translation id="2177950615300672361">پوشیدگی ٹیب: <ph name="TAB_NAME" /></translation> @@ -1861,7 +1861,7 @@ <translation id="3468999815377931311">Android فون</translation> <translation id="3470442499439619530">اس صارف کو ہٹائیں</translation> <translation id="3471876058939596279">ویڈیو کیلئے HDMI اور USB ٹائپ سی پورٹس کا ایک ہی وقت پر استعمال نہیں کیا جا سکتا۔ کوئی مختلف ویڈیو پورٹ استعمال کریں۔</translation> -<translation id="3473241910002674503">ٹیبلیٹ موڈ میں بٹنز کے ساتھ ہوم، واپس جائیں پر نیویگیٹ کریں اور ایپس سوئچ کریں۔</translation> +<translation id="3473241910002674503">ٹیبلیٹ موڈ میں بٹنز کے ساتھ ہوم پر جائیں، واپس جائیں اور ایپس سوئچ کریں۔</translation> <translation id="3473479545200714844">اسکرین میگنیفائر</translation> <translation id="3475843873335999118">معذرت، آپ کا فنگرپرنٹ ابھی بھی تسلیم شدہ نہیں ہے براہ کرم اپنا پاس ورڈ درج کریں۔</translation> <translation id="3476303763173086583">استعمال اور ڈائیگناسٹک کا ڈیٹا بھیجیں۔ Google کو خودکار طور پر ڈائیگناسٹک، آلے اور ایپ کے استعمال کا ڈیٹا بھیج کر اپنے بچے کا Android تجربہ بہتر بنانے میں مدد کریں۔ اس کا استعمال آپ کے بچے کی شناخت کیلئے نہیں کیا جائے گا اور اس سے سسٹم اور ایپ کے استحکام اور دیگر بہتریوں میں مدد ملے گی۔ کچھ مجموعی ڈیٹا Google ایپس اور پارٹنرز، جیسے Android ڈیولپرز، کی مدد بھی کرے گا۔ اس <ph name="BEGIN_LINK1" />ترتیب<ph name="END_LINK1" /> کو مالک نافذ کرتا ہے۔ مالک Google کو اس آلہ کیلئے ڈائیگناسٹک اور استعمال کا ڈیٹا بھیجنے کا انتخاب کر سکتا ہے۔ اگر آپ کے بچے کیلئے ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو اس کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔ <ph name="BEGIN_LINK2" />مزید جانیں<ph name="END_LINK2" /></translation> @@ -2635,7 +2635,7 @@ <translation id="4479877282574735775">ورچوئل مشین ترتیب دی جا رہی ہے۔ اس میں چند منٹ لگ سکتے ہیں۔</translation> <translation id="4480590691557335796">Chrome آپ کے کمپیوٹر میں نقصان دہ سافٹ ویئر تلاش کر سکتا ہے اور اسے ہٹا سکتا ہے</translation> <translation id="4481530544597605423">جوڑا ختم کیے ہوئے آلات</translation> -<translation id="4488107067273194838">سیٹ اپ کے بعد سِنک کے اختیارات کا جائزہ لیں</translation> +<translation id="4488107067273194838">سیٹ اپ کے بعد براؤزر سِنک کے اختیارات کا جائزہ لیں</translation> <translation id="4488502501195719518">سبھی ڈیٹا صاف کریں؟</translation> <translation id="4495419450179050807">اس صفحہ پر نہ دکھائیں</translation> <translation id="4496054781541092778"><ph name="PERMISSION" /> خود کار طور پر مسدود کر دی گئی</translation> @@ -5298,7 +5298,7 @@ <translation id="8107015733319732394">آپ کے <ph name="DEVICE_TYPE" /> پر Google Play اسٹور انسٹال کیا جا رہا ہے۔ اس میں کچھ منٹ کا وقت لگ سکتا ہے۔</translation> <translation id="8108526232944491552">{COUNT,plural, =0{کوئی فریق ثالث کوکی نہیں ہے}=1{1 فریق ثالث کوکی مسدود ہے}other{# فریق ثالث کوکیز مسدود ہیں}}</translation> <translation id="810875025413331850">کوئی قریبی آلہ نہیں ملا۔</translation> -<translation id="8114199541033039755">ٹیبلیٹ موڈ میں بٹنز کے ساتھ ہوم، واپس جائیں پر نیویگیٹ کریں اور ایپس سوئچ کریں۔ ChromeVox یا خودکار کلکس فعال ہونے پر آن رہتا ہے۔</translation> +<translation id="8114199541033039755">ٹیبلیٹ موڈ میں بٹنز کے ساتھ ہوم پر جائیں، واپس جائیں اور ایپس سوئچ کریں۔ ChromeVox یا خودکار کلکس فعال ہونے پر آن رہتا ہے۔</translation> <translation id="8114875720387900039">افقی تقسیم کریں</translation> <translation id="8116972784401310538">&بک مارک مینیجر</translation> <translation id="8117620576188476503">صورت حال ٹرے کے ذریعے کنکشنز، اپ ڈیٹس اور ترتیبات کا نظم کریں۔ کی بورڈ کے ذریعے یہاں پہنچنے کیلئے، Alt + Shift + S دبائیں۔</translation> @@ -5418,7 +5418,7 @@ <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> نے آپ کا ماؤس کرسر غیر فعال کر دیا ہے۔</translation> <translation id="8264024885325823677">یہ ترتیب آپ کے منتظم کے زیر انتظام ہے۔</translation> <translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" نے پوری اسکرین کو تحریک دی۔</translation> -<translation id="826511437356419340">ونڈو کے عمومی جائزہ کی وضع میں داخل ہوگئے۔ کی بورڈ استعمال کرنے پر نیویگیٹ کرنے کے لیے سوائپ کریں یا ٹیب کو دبائیں۔</translation> +<translation id="826511437356419340">ونڈو کے عمومی جائزہ کی وضع میں داخل ہوگئے۔ نیویگیٹ کرنے کے لیے سوائپ کریں، یا اگر آپ کی بورڈ استعمال کر رہے ہیں تو ٹیب کو دبائیں۔</translation> <translation id="8267961145111171918"><ph name="BEGIN_PARAGRAPH1" />یہ اس آلہ اور اس کے طریقۂ استعمال (جیسے بیٹری کی سطح، سسٹم، ایپ کی سرگرمی اور خرابیوں) کے بارے میں عام معلومات ہے۔ Android کو بہتر بنانے کی خاطر ڈیٹا کا استعمال کیا جائے گا اور کچھ مجموعی معلومات سے Google ایپس اور پارٹنرز، جیسے کہ Android ڈیولپرز، کو ان کی ایپس اور پروڈکٹس کو بہتر بنانے میں بھی مدد ملے گی۔<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />اس خصوصیت کو آف کرنے سے سسٹم اپ ڈیٹس اور سیکیورٹی جیسی لازمی سروسز کے لیے درکار معلومات بھیجنے کی اس آلے کی اہلیت متاثر نہیں ہوتی ہے۔<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />مالک ترتیبات > جدید ترین > خودکار طور پر Google کو ڈائیگناسٹک اور استعمال کا ڈیٹا بھیجیں سے اس خصوصیت کو کنٹرول کر سکتا ہے۔<ph name="END_PARAGRAPH3" /> @@ -5590,7 +5590,7 @@ <translation id="851263357009351303"><ph name="HOST" /> کو تصاویر دکھانے کی ہمیشہ اجازت دیں</translation> <translation id="8513108775083588393">خود کار طور پر گھمائیں</translation> <translation id="8514746246728959655">کوئی مختلف سیکیورٹی کلید آزمائیں</translation> -<translation id="851960115758509829">آپ کی ایپس، ترتیبات اور دیگر حسب ضرورت بنانے کی چیزیں ان تمام Chrome OS آلات میں سِنک ہوں گی جن میں آپ اپنے Google اکاؤنٹ سائن ان ہیں۔</translation> +<translation id="851960115758509829">آپ کی ایپس، ترتیبات اور دیگر حسب ضرورت تبدیلیاں ان تمام Chrome OS آلات میں سِنک ہوں گی جن میں آپ اپنے Google اکاؤنٹ سائن سے ان ہیں۔</translation> <translation id="8521475323816527629">تیزی سے اپنی ایپس تک رسائی حاصل کریں</translation> <translation id="8523493869875972733">تبدیلیاں برقرار رکھیں</translation> <translation id="8523849605371521713">پالیسی کے ذریعے شامل کیا گیا</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 22763d2..0aea2c5 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Xatcho‘p nomi</translation> <translation id="1124772482545689468">Foydalanuvchi</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> kabi (asli)</translation> +<translation id="1126809382673880764">Zararli sayt, yuklanma va kengaytmalardan himoya qila olmaydi. Gmail va Qidiruv kabi Google xizmatlarida Saytlarni xavfsiz kezish himoyasi ostida boʻlasiz.</translation> <translation id="1128109161498068552">Hech qanday saytga MIDI qurilmalarga kirish uchun tizim xabarlaridan foydalanishiga ruxsat berilmasin</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Qidiruv tizimini o‘zgartirish</translation> @@ -186,6 +187,7 @@ <translation id="1235458158152011030">Tanish tarmoqlar</translation> <translation id="123578888592755962">Diskda bo‘sh joy juda kam qoldi</translation> <translation id="1238191093934674082">OpenVPN</translation> +<translation id="1239439601391236986">Kiritilgan shaxsiy axborot takliflarini chiqarish</translation> <translation id="1239594683407221485">Qurilmadagi kontekt bilan Fayllar ilovasida tanishing.</translation> <translation id="124116460088058876">Boshqa tillar</translation> <translation id="1241753985463165747">Chaqirilganda joriy sayt ma’lumotlarini ko‘rish va o‘zgartirishga ruxsat berish</translation> @@ -302,6 +304,7 @@ <translation id="140723521119632973">Mobil tarmoqni faollashtirish</translation> <translation id="1407489512183974736">Qirqish va o‘rtaga tekislash</translation> <translation id="1408504635543854729">Qurilmadagi kontentni ko‘rish uchun Fayllar ilovasidan foydalaning. Administrator bu kontentni o‘zgartirishga ruxsat bermagan.</translation> +<translation id="1408980562518920698">Shaxsiy axborotni boshqarish</translation> <translation id="1410197035576869800">Ilova ikonkasi</translation> <translation id="1410616244180625362"><ph name="HOST" /> saytiga kamerangizdan foydalanishga ruxsat berish</translation> <translation id="1414648216875402825"><ph name="PRODUCT_NAME" />’ning beqaror versiyasiga yangilanmoqdasiz, unda yakunlanmagan xususiyatlar bor. Qotib qolishlar va kamchiliklar uchraydi. Ehtiyotkorlik bilan davom eting.</translation> @@ -432,6 +435,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&JavaScript konsoli</translation> <translation id="1587907146729660231">Quvvat tugmasiga barmoq bilan tegining</translation> +<translation id="1588200577109872591">Smart kiritmalar</translation> <translation id="1588438908519853928">Normal</translation> <translation id="158849752021629804">Uy tarmog‘i bo‘lishi lozim</translation> <translation id="1588870296199743671">Havolani bu ilovada ochish...</translation> @@ -667,6 +671,7 @@ <translation id="1879000426787380528">Hisobni tanlang</translation> <translation id="1880905663253319515">“<ph name="CERTIFICATE_NAME" />” sertifikati o‘chirilsinmi?</translation> <translation id="1884013283844450420">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Ulanish</translation> +<translation id="1884705339276589024">Linux disk hajmini oʻzgartirish</translation> <translation id="1886996562706621347">Protokollarga ishlov beruvchilarni o‘rnatish so‘rovlariga ruxsat berish (tavsiya etiladi)</translation> <translation id="1887442540531652736">Kirishda xatolik yuz berdi</translation> <translation id="1887597546629269384">Yana “Hey Google” deng</translation> @@ -736,6 +741,7 @@ <translation id="1979280758666859181">Siz <ph name="PRODUCT_NAME" />‘ning ancha eski versiyasidan yangilanish kanaliga o‘tyapsiz. O‘zgartirishlar kuchga kirishi uchun kanal versiyasi qurilmangizdagi joriy versiya bilan bir xil bo‘lishi kerak.</translation> <translation id="197989455406964291">KDC bunday shifrlash turi bilan mos emas</translation> <translation id="1982354452682152483">Tavsiflanmagan.</translation> +<translation id="1984417487208496350">Himoyasiz (tavsiya etilmaydi)</translation> <translation id="1987317783729300807">Hisoblar</translation> <translation id="1989112275319619282">Tanlash</translation> <translation id="1990512225220753005">Bu sahifada chiqmasin</translation> @@ -805,6 +811,7 @@ <translation id="2090165459409185032">Hisob ma’lumotini tiklash uchun bu yerga o‘ting: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Tizim xavfsizlik sozlamasi</translation> <translation id="2091887806945687916">Tovush</translation> +<translation id="2096478741073211388">Shaxsiy axborot takliflari maxsus soʻzlarni kiritayotganingizda ism, manzil yoki telefon raqam taklif qilish orqali tezkor yozishga yordam beradi. Faqat siz hisobingiz uchun maxfiy, moslashtirilgan takliflarni koʻrishingiz mumkin.</translation> <translation id="2096715839409389970">Tashqi cookie fayllarni tozalash</translation> <translation id="2097372108957554726">Yangi qurilmani ro‘yxatdan o‘tkazish uchun Chrome hisobingizga kiring</translation> <translation id="2099172618127234427">Siz Chrome OS tuzatish xususiyatlarini ishga tushirmoqdasiz, ular debugging features which sshd xizmatini o‘rnatib, USB disklardan yuklanishni xususiyatini yoqadi.</translation> @@ -821,6 +828,7 @@ <translation id="2114326799768592691">&Freymni qayta yuklash</translation> <translation id="2114896190328250491">Rasm muallifi: <ph name="NAME" /></translation> <translation id="2119349053129246860"><ph name="APP" /> orqali ochish</translation> +<translation id="2119461801241504254">Saytlarni xavfsiz kezish funksiyasi yoniq va u zararli sayt va yuklanmalardan himoya qilmoqda</translation> <translation id="2120297377148151361">Brauzerdagi amallar</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> ruxsati olib tashlandi</translation> <translation id="2121055421682309734">{COUNT,plural, =0{Cookie fayllari bloklandi}=1{Cookie fayllari bloklandi, 1 ta istisno}other{Cookie fayllari bloklandi, {COUNT} ta istisno}}</translation> @@ -1889,6 +1897,7 @@ <translation id="3515983984924808886">Sozlamalarni asliga qaytarishni tasdiqlash uchun elektron kalit tugmasini qayta bosing. Bunda elektron kalitdagi barcha maʼlumotlar, jumladan, PIN kodlar ham tozalab tashlanadi.</translation> <translation id="3518985090088779359">Davom etish</translation> <translation id="351952459507671940">Yangi guruhga kiritish</translation> +<translation id="3521606918211282604">Disk hajmini oʻzgartirish</translation> <translation id="3523642406908660543">Bironta sayt kompyuterga kirish uchun plagindan foydalanmoqchi bo‘lganida so‘ralsin (tavsiya etiladi)</translation> <translation id="3524965460886318643">Eksport qilishlar jurnali</translation> <translation id="3526034519184079374">Sayt axborotini ochish yoki tahrirlash imkonsiz</translation> @@ -1976,6 +1985,7 @@ <translation id="3629631988386925734">Smart Lock funksiyasini yoqish uchun parolni kiriting. Keyingi safar telefoningiz <ph name="DEVICE_TYPE" /> qurilmasini qulfdan chiqara oladi. Sozlamalar orqali Smart Lock funksiyasini faolsizlantirish mumkin.</translation> <translation id="3630132874740063857">Telefoningiz</translation> <translation id="3630995161997703415">Bu saytdan xohlagan vaqtda foydalanish uchun javoningizga qo‘shing</translation> +<translation id="3633309367764744750">Siz kirgan va hali tashrif buyurmagan sahifalardan axborotni oldindan oladi. Olingan axborot ichiga cookie fayllar kirishi mumkin (agar cookie fayllarga ruxsat bergan boʻlsangiz).</translation> <translation id="3634507049637220048">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Ulanish:<ph name="CONNECTION_STATUS" />, Administrator boshqaruvida, Batafsil</translation> <translation id="3635241501480133979">Bu maʼlumotlar tashkilot xavfsizlik siyosatiga zid va shu sababli ularni tortib tashlash imkonsiz.</translation> <translation id="3635353578505343390">Googlega fikr-mulohaza yuborish</translation> @@ -3935,6 +3945,7 @@ <translation id="6298962879096096191">Android ilovalarini o‘rnatish uchun Google Play ishlatilsin</translation> <translation id="630065524203833229">&Chiqish</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> printeri avtomatik sozlanmadi. Printer uchun batafsil axborotlarni kiriting. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Shaxsiy axborot takliflari</translation> <translation id="6305607932814307878">Global siyosat:</translation> <translation id="6307990684951724544">Tizim band</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> kengaytmasi bilan kirildi</translation> @@ -4013,6 +4024,7 @@ <translation id="641081527798843608">Mavzu mosligi</translation> <translation id="6412673304250309937">URL manzillar Chrome bilgan zararli saytlar roʻyxati orqali tekshiriladi. Agar sayt parolingizni oʻgirlashga urinsa yoki zararli fayl yuklab olsangiz, Chrome ham URL manzillar kabi sahifa elementlarini Saytlarni xavfsiz kezish tizimiga yuborishi mumkin.</translation> <translation id="6412931879992742813">Yangi inkognito oynasi</translation> +<translation id="6413591858632097328">Bunda <ph name="ORIGIN_NAME" /> saytidan saqlangan barcha maʼlumotlar, cookie fayllar va oʻrnatilgan ilovalar tozalab tashlanadi.</translation> <translation id="641469293210305670">Yangilanish va ilovalarni oʻrnatish</translation> <translation id="6414888972213066896">Bu saytni ochish uchun ruxsat so‘rovi ota-onangizga jo‘natildi</translation> <translation id="6415900369006735853">Internetga telefon orqali ulaning</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index fb5ef6c..c69dd5b 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -73,7 +73,7 @@ <translation id="2929907241665500097">Prohlížeč Chrome se neaktualizoval, něco se pokazilo. <ph name="BEGIN_LINK" />Vyřešte problémy se stahováním aktualizací Chromu a neúspěšnými aktualizacemi.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – přihlášení k síti – Chrome</translation> <translation id="3037838751736561277">Google Chrome je v režimu na pozadí.</translation> -<translation id="3059710691562604940">Bezpečné prohlížení je vypnuté. Chrome doporučuje zapnout ho.</translation> +<translation id="3059710691562604940">Bezpečné prohlížení je vypnuté. Chrome ho doporučuje zapnout.</translation> <translation id="3065168410429928842">Karta prohlížeče Chrome</translation> <translation id="3080151273017101988">Po ukončení prohlížeče Google Chrome nechat aplikace na pozadí spuštěné</translation> <translation id="3089968997497233615">K dispozici je nová, bezpečnější verze prohlížeče Google Chrome.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 00d08fc..7a4a3fc 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1211,10 +1211,6 @@ <message name="IDS_SETTINGS_SECURITY_DESCRIPTION" desc="Description of the controls available on the security settings page"> Safe Browsing (protection from dangerous sites) and other security settings </message> - <message name="IDS_SETTINGS_SECURITY_ADVANCED_SECTION_LABEL" desc="Name of the section in the - security settings page which groups advanced security settings"> - Advanced security - </message> <message name="IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM" desc="Name of the link which takes users to the Google Advanced Protection Program external webpage"> Google Advanced Protection Program
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 3bee687..53645f40 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3618,14 +3618,14 @@ "signin/signin_promo.h", "signin/signin_ui_util.cc", "signin/signin_ui_util.h", - "soda/soda_service.cc", - "soda/soda_service.h", - "soda/soda_service_factory.cc", - "soda/soda_service_factory.h", "speech/extension_api/tts_extension_api_constants.cc", # Should be moved # to extensions # section? "speech/extension_api/tts_extension_api_constants.h", + "speech/speech_recognition_service.cc", + "speech/speech_recognition_service.h", + "speech/speech_recognition_service_factory.cc", + "speech/speech_recognition_service_factory.h", "ssl/ssl_client_auth_observer.cc", "ssl/ssl_client_auth_observer.h", "status_icons/desktop_notification_balloon.cc", @@ -4551,9 +4551,6 @@ "printing/background_printing_manager.h", "printing/pdf_nup_converter_client.cc", "printing/pdf_nup_converter_client.h", - "printing/print_dialog_cloud.cc", - "printing/print_dialog_cloud.h", - "printing/print_dialog_cloud_win.cc", "printing/print_error_dialog.cc", "printing/print_error_dialog.h", "printing/print_preview_context_menu_observer.cc", @@ -4576,8 +4573,11 @@ deps += [ "//components/printing/common:mojo_interfaces" ] - if (is_posix || is_fuchsia) { - sources += [ "printing/print_dialog_cloud_posix.cc" ] + if (is_win) { + sources += [ + "printing/print_dialog_cloud_win.cc", + "printing/print_dialog_cloud_win.h", + ] } if (!is_chromeos) { @@ -5428,11 +5428,25 @@ deps += [ "//device/vr/public/mojom" ] } + if (!is_android) { + sources += [ + "vr/service/isolated_device_provider.cc", + "vr/service/isolated_device_provider.h", + ] + } + sources += [ "component_updater/vr_assets_component_installer.cc", "component_updater/vr_assets_component_installer.h", "vr/chrome_xr_integration_client.cc", "vr/chrome_xr_integration_client.h", + "vr/service/browser_xr_runtime_impl.cc", + "vr/service/browser_xr_runtime_impl.h", + "vr/service/vr_service_impl.cc", + "vr/service/vr_service_impl.h", + "vr/service/xr_runtime_manager_impl.cc", + "vr/service/xr_runtime_manager_impl.h", + "vr/xr_runtime_manager_statics.h", ] deps += [
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 0d4ea0c4..2122f24c 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -403,6 +403,10 @@ "+chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.h", "+chrome/browser/performance_manager/graph/policies/policy_features.h", + # VRService is being moved to content, this forces documentation of new + # dependencies that are added to it outside of it's own directory. + "-chrome/browser/vr/service", + # Explicitly disallow using SyncMessageFilter to prevent browser from # sending synchronous IPC messages on non-UI threads. "-ipc/ipc_sync_message_filter.h", @@ -476,5 +480,10 @@ ], "chrome_find_request_manager_browsertest\.cc": [ "+pdf/document_loader_impl.h", + ], + "chrome_browser_main\.cc" : [ + # TODO(crbug.com/1031622): Until VRService moves, ChromeBrowserMain is + # responsible for wiring these up to appropriate factories. + "+chrome/browser/vr/service/vr_service_impl.h", ] }
diff --git a/chrome/browser/android/thin_webview/internal/thin_webview.cc b/chrome/browser/android/thin_webview/internal/thin_webview.cc index edba6055..4cc9166 100644 --- a/chrome/browser/android/thin_webview/internal/thin_webview.cc +++ b/chrome/browser/android/thin_webview/internal/thin_webview.cc
@@ -11,7 +11,9 @@ #include "chrome/browser/ui/tab_helpers.h" #include "components/embedder_support/android/delegate/web_contents_delegate_android.h" #include "components/permissions/permission_request_manager.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/browser_controls_state.h" using base::android::JavaParamRef; using web_contents_delegate_android::WebContentsDelegateAndroid; @@ -81,6 +83,11 @@ ->set_web_contents_supports_permission_requests(false); ViewAndroidHelper::FromWebContents(web_contents) ->SetViewAndroid(web_contents->GetNativeView()); + + // Disable browser controls when used for thin webview. + web_contents->GetMainFrame()->UpdateBrowserControlsState( + content::BROWSER_CONTROLS_STATE_HIDDEN, + content::BROWSER_CONTROLS_STATE_HIDDEN, false); } void ThinWebView::SizeChanged(JNIEnv* env,
diff --git a/chrome/browser/android/vr/vr_shell_delegate.cc b/chrome/browser/android/vr/vr_shell_delegate.cc index 596af611..7f7d3a9b4 100644 --- a/chrome/browser/android/vr/vr_shell_delegate.cc +++ b/chrome/browser/android/vr/vr_shell_delegate.cc
@@ -16,7 +16,9 @@ #include "chrome/browser/component_updater/vr_assets_component_installer.h" #include "chrome/browser/vr/assets_loader.h" #include "chrome/browser/vr/metrics/metrics_helper.h" +#include "chrome/browser/vr/xr_runtime_manager_statics.h" #include "content/public/browser/browser_xr_runtime.h" +#include "content/public/browser/webvr_service_provider.h" #include "content/public/browser/xr_runtime_manager.h" #include "device/vr/android/gvr/gvr_delegate_provider_factory.h" #include "device/vr/android/gvr/gvr_device.h" @@ -64,12 +66,12 @@ : task_runner_(base::ThreadTaskRunnerHandle::Get()) { DVLOG(1) << __FUNCTION__ << "=" << this; j_vr_shell_delegate_.Reset(env, obj); - content::XRRuntimeManager::AddObserver(this); + XRRuntimeManagerStatics::AddObserver(this); } VrShellDelegate::~VrShellDelegate() { DVLOG(1) << __FUNCTION__ << "=" << this; - content::XRRuntimeManager::RemoveObserver(this); + XRRuntimeManagerStatics::RemoveObserver(this); device::GvrDevice* gvr_device = GetGvrDevice(); if (gvr_device) gvr_device->OnExitPresent(); @@ -99,7 +101,7 @@ // When VrShell is created, we disable magic window mode as the user is inside // the headset. As currently implemented, orientation-based magic window // doesn't make sense when the window is fixed and the user is moving. - auto* xr_runtime_manager = content::XRRuntimeManager::GetInstanceIfCreated(); + auto* xr_runtime_manager = XRRuntimeManagerStatics::GetInstanceIfCreated(); if (xr_runtime_manager) { // If the XRRuntimeManager singleton currently exists, this will disable // inline VR. Otherwise, the callback for 'XRRuntimeManager::Observer' @@ -126,7 +128,7 @@ std::move(on_present_result_callback_).Run(false); } - auto* xr_runtime_manager = content::XRRuntimeManager::GetInstanceIfCreated(); + auto* xr_runtime_manager = XRRuntimeManagerStatics::GetInstanceIfCreated(); if (xr_runtime_manager) { SetInlineVrEnabled(*xr_runtime_manager, true); }
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index cc2bb10..ef03289 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -100,13 +100,13 @@ #else #include "chrome/browser/badging/badge_manager.h" #include "chrome/browser/payments/payment_request_factory.h" -#include "chrome/browser/soda/soda_service.h" -#include "chrome/browser/soda/soda_service_factory.h" +#include "chrome/browser/speech/speech_recognition_service.h" +#include "chrome/browser/speech/speech_recognition_service_factory.h" #include "chrome/browser/ui/webui/downloads/downloads.mojom.h" #include "chrome/browser/ui/webui/downloads/downloads_ui.h" #include "chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom.h" #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h" -#include "media/mojo/mojom/soda_service.mojom.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" #endif #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ @@ -346,14 +346,16 @@ } #if !defined(OS_ANDROID) -void BindSodaContextHandler( +void BindSpeechRecognitionContextHandler( content::RenderFrameHost* frame_host, - mojo::PendingReceiver<media::mojom::SodaContext> receiver) { + mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> receiver) { Profile* profile = Profile::FromBrowserContext( frame_host->GetProcess()->GetBrowserContext()); PrefService* profile_prefs = profile->GetPrefs(); - if (profile_prefs->GetBoolean(prefs::kLiveCaptionEnabled)) - SodaServiceFactory::GetForProfile(profile)->Create(std::move(receiver)); + if (profile_prefs->GetBoolean(prefs::kLiveCaptionEnabled)) { + SpeechRecognitionServiceFactory::GetForProfile(profile)->Create( + std::move(receiver)); + } } #endif @@ -436,8 +438,8 @@ base::BindRepeating(&BindNetworkHintsHandler)); #if !defined(OS_ANDROID) - map->Add<media::mojom::SodaContext>( - base::BindRepeating(&BindSodaContextHandler)); + map->Add<media::mojom::SpeechRecognitionContext>( + base::BindRepeating(&BindSpeechRecognitionContextHandler)); #endif }
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index e09c3f5..ff954c9 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -158,6 +158,7 @@ #include "content/public/browser/notification_types.h" #include "content/public/browser/site_instance.h" #include "content/public/browser/system_connector.h" +#include "content/public/browser/webvr_service_provider.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" @@ -294,9 +295,12 @@ #include "components/rlz/rlz_tracker.h" #endif // BUILDFLAG(ENABLE_RLZ) -#if BUILDFLAG(ENABLE_VR) && defined(OS_WIN) +#if BUILDFLAG(ENABLE_VR) +#include "chrome/browser/vr/service/vr_service_impl.h" +#if defined(OS_WIN) #include "chrome/browser/vr/consent/xr_session_request_consent_manager_impl.h" #endif +#endif #if defined(USE_AURA) #include "ui/aura/env.h" @@ -950,10 +954,15 @@ SecKeychainAddCallback(&KeychainCallback, 0, NULL); #endif // defined(OS_MACOSX) -#if BUILDFLAG(ENABLE_VR) && defined(OS_WIN) +#if BUILDFLAG(ENABLE_VR) + content::WebvrServiceProvider::SetWebvrServiceCallback( + base::Bind(&vr::VRServiceImpl::Create)); + +#if defined(OS_WIN) vr::XRSessionRequestConsentManager::SetInstance( new vr::XRSessionRequestConsentManagerImpl()); -#endif // BUILDFLAG(ENABLE_VR) && OS_WIN +#endif // defined(OS_WIN) +#endif // BUILDFLAG(ENABLE_VR) // Enable Navigation Tracing only if a trace upload url is specified. if (parsed_command_line_.HasSwitch(switches::kEnableNavigationTracing) &&
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index b4aa7cf..ff2a7e5 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -3607,7 +3607,7 @@ case service_manager::SandboxType::kCdm: case service_manager::SandboxType::kPrintCompositor: case service_manager::SandboxType::kAudio: - case service_manager::SandboxType::kSoda: + case service_manager::SandboxType::kSpeechRecognition: case service_manager::SandboxType::kProxyResolver: case service_manager::SandboxType::kPdfConversion: case service_manager::SandboxType::kSharingService:
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc index 8764d632..a36b034 100644 --- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc +++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
@@ -874,17 +874,25 @@ const auto& smart_info = battery_info->smart_battery_info; if (!smart_info.is_null()) battery_info_out->set_manufacture_date(smart_info->manufacture_date); - const auto& cpu_info = probe_result->cpu_info; - if (cpu_info.has_value()) { - for (const auto& cpu : cpu_info.value()) { - em::CpuInfo* const cpu_info_out = - response_params_.device_status->add_cpu_info(); - cpu_info_out->set_model_name(cpu->model_name); - cpu_info_out->set_architecture( - em::CpuInfo::Architecture(cpu->architecture)); - cpu_info_out->set_max_clock_speed_khz(cpu->max_clock_speed_khz); + + // Process CpuResult. + const auto& cpu_result = probe_result->cpu_result; + if (!cpu_result.is_null()) { + if (cpu_result->is_error()) { + LOG(ERROR) << "cros_healthd: Error getting CPU info: " + << cpu_result->get_error()->msg; + } else { + for (const auto& cpu : cpu_result->get_cpu_info()) { + em::CpuInfo* const cpu_info_out = + response_params_.device_status->add_cpu_info(); + cpu_info_out->set_model_name(cpu->model_name); + cpu_info_out->set_architecture( + em::CpuInfo::Architecture(cpu->architecture)); + cpu_info_out->set_max_clock_speed_khz(cpu->max_clock_speed_khz); + } } } + const auto& timezone_info = probe_result->timezone_info; if (!timezone_info.is_null()) { em::TimezoneInfo* const timezone_info_out =
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc index 16ca554..3a96dee 100644 --- a/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc
@@ -469,6 +469,8 @@ kFakeModelName, kFakeMojoArchitecture, kFakeMaxClockSpeed); std::vector<chromeos::cros_healthd::mojom::CpuInfoPtr> cpu_vector; cpu_vector.push_back(cpu_info.Clone()); + auto cpu_result = chromeos::cros_healthd::mojom::CpuResult::NewCpuInfo( + std::move(cpu_vector)); chromeos::cros_healthd::mojom::NonRemovableBlockDeviceInfo storage_info( kFakeStoragePath, kFakeStorageSize, kFakeStorageType, kFakeStorageManfid, kFakeStorageName, kFakeStorageSerial); @@ -491,7 +493,7 @@ fan_vector.push_back(fan_info.Clone()); chromeos::cros_healthd::mojom::TelemetryInfo fake_info( battery_info.Clone(), std::move(block_device_info), - cached_vpd_info.Clone(), std::move(cpu_vector), timezone_info.Clone(), + cached_vpd_info.Clone(), std::move(cpu_result), timezone_info.Clone(), memory_info.Clone(), std::move(backlight_vector), std::move(fan_vector)); // Create fake SampledData.
diff --git a/chrome/browser/chromeos/profiles/profile_helper.cc b/chrome/browser/chromeos/profiles/profile_helper.cc index 6fbcd83..d52a6c6 100644 --- a/chrome/browser/chromeos/profiles/profile_helper.cc +++ b/chrome/browser/chromeos/profiles/profile_helper.cc
@@ -246,7 +246,7 @@ Profile* ProfileHelper::GetSigninProfile() { ProfileManager* profile_manager = g_browser_process->profile_manager(); return profile_manager->GetProfile(GetSigninProfileDir()) - ->GetOffTheRecordProfile(); + ->GetPrimaryOTRProfile(); } // static @@ -407,9 +407,9 @@ void ProfileHelperImpl::ProfileStartup(Profile* profile) { // Initialize Chrome OS preferences like touch pad sensitivity. For the // preferences to work in the guest mode, the initialization has to be - // done after |profile| is switched to the incognito profile (which + // done after |profile| is switched to the off-the-record profile (which // is actually GuestSessionProfile in the guest mode). See the - // GetOffTheRecordProfile() call above. + // GetPrimaryOTRProfile() call above. profile->InitChromeOSPreferences(); // Add observer so we can see when the first profile's session restore is @@ -521,9 +521,9 @@ Profile* profile = GetProfileByUserIdHash(user->username_hash()); // GetActiveUserProfile() or GetProfileByUserIdHash() returns a new instance - // of ProfileImpl(), but actually its OffTheRecordProfile() should be used. + // of ProfileImpl(), but actually its off-the-record profile should be used. if (user_manager::UserManager::Get()->IsLoggedInAsGuest()) - profile = profile->GetOffTheRecordProfile(); + profile = profile->GetPrimaryOTRProfile(); return profile; } @@ -550,9 +550,9 @@ } // GetActiveUserProfile() or GetProfileByUserIdHash() returns a new instance - // of ProfileImpl(), but actually its OffTheRecordProfile() should be used. + // of ProfileImpl(), but actually its off-the-record profile should be used. if (profile && user_manager::UserManager::Get()->IsLoggedInAsGuest()) - profile = profile->GetOffTheRecordProfile(); + profile = profile->GetPrimaryOTRProfile(); return profile; }
diff --git a/chrome/browser/component_updater/soda_component_installer.cc b/chrome/browser/component_updater/soda_component_installer.cc index e30d308..e321229 100644 --- a/chrome/browser/component_updater/soda_component_installer.cc +++ b/chrome/browser/component_updater/soda_component_installer.cc
@@ -65,7 +65,7 @@ bool SODAComponentInstallerPolicy::VerifyInstallation( const base::DictionaryValue& manifest, const base::FilePath& install_dir) const { - return base::PathExists(install_dir.Append(soda::kSodaBinaryRelativePath)); + return base::PathExists(install_dir.Append(speech::kSodaBinaryRelativePath)); } bool SODAComponentInstallerPolicy::SupportsGroupPolicyEnabledComponentUpdates() @@ -97,7 +97,7 @@ } base::FilePath SODAComponentInstallerPolicy::GetRelativeInstallDir() const { - return base::FilePath(soda::kSodaInstallationRelativePath); + return base::FilePath(speech::kSodaInstallationRelativePath); } void SODAComponentInstallerPolicy::GetHash(std::vector<uint8_t>* hash) const { @@ -122,7 +122,7 @@ const base::FilePath& install_dir) { #if !defined(OS_ANDROID) prefs->SetFilePath(prefs::kSODAPath, - install_dir.Append(soda::kSodaBinaryRelativePath)); + install_dir.Append(speech::kSodaBinaryRelativePath)); #endif }
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index 4e9a4cb..62cdb80 100644 --- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -1191,8 +1191,9 @@ // Tests that multiple enabled extensions with declarative rulesets having // blocking rules behave correctly. +// Disabled due to flake: https://crbug.com/1069665 IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, - BlockRequests_MultipleExtensions) { + DISABLED_BlockRequests_MultipleExtensions) { struct { std::string url_filter; int id; @@ -1296,7 +1297,9 @@ } // Tests a combination of blocking and redirect rules. -IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, BlockAndRedirect) { +// Disabled due to flake: https://crbug.com/1069665 +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, + DISABLED_BlockAndRedirect) { auto get_url_for_host = [this](std::string hostname) { return embedded_test_server() ->GetURL(hostname, "/pages_with_script/index.html") @@ -1542,8 +1545,9 @@ // Tests that only extensions enabled in incognito mode affect network requests // from an incognito context. +// Disabled due to flake: https://crbug.com/1069665 IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, - BlockRequests_Incognito) { + DISABLED_BlockRequests_Incognito) { // Block all main-frame requests to example.com. TestRule rule = CreateGenericRule(); rule.condition->url_filter = std::string("example.com"); @@ -1702,7 +1706,9 @@ } // Test an extension with multiple static rulesets. -IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, MultipleRulesets) { +// Disabled due to flake: https://crbug.com/1069665 +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, + DISABLED_MultipleRulesets) { set_config_flags(ConfigFlag::kConfig_HasBackgroundScript); const int kNumStaticRulesets = 5; @@ -1776,7 +1782,9 @@ } // Ensure that Blink's in-memory cache is cleared on adding/removing rulesets. -IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) { +// Disabled due to flake: https://crbug.com/1069665 +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, + DISABLED_RendererCacheCleared) { // Set-up an observer for RulesetMatcher to monitor requests to // script.js. URLRequestMonitor script_monitor( @@ -2789,8 +2797,9 @@ // Test that the badge text for an extension will update to reflect the number // of actions taken on requests matching the extension's ruleset. +// Disabled due to flake: https://crbug.com/1069665 IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, - ActionsMatchedCountAsBadgeText) { + DISABLED_ActionsMatchedCountAsBadgeText) { // Load the extension with a background script so scripts can be run from its // generated background page. Also grant the feedback permission for the // extension so it has access to the getMatchedRules API function.
diff --git a/chrome/browser/extensions/options_page_apitest.cc b/chrome/browser/extensions/options_page_apitest.cc index f3f5374..8e38ef7b 100644 --- a/chrome/browser/extensions/options_page_apitest.cc +++ b/chrome/browser/extensions/options_page_apitest.cc
@@ -20,43 +20,45 @@ namespace extensions { -// Used to simulate a click on the first element named 'Options'. -static const char kScriptClickOptionButton[] = - "(function() { " - " var button = document.querySelector('.options-link');" - " button.click();" - "})();"; - // Test that an extension with an options page makes an 'Options' button appear // on chrome://extensions, and that clicking the button opens a new tab with the // extension's options page. -// Disabled because of flakiness. See http://crbug.com/174934. -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_OptionsPage) { - ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile()); - size_t installed_extensions = registry->enabled_extensions().size(); - // Install an extension with an options page. - const Extension* extension = - InstallExtension(test_data_dir_.AppendASCII("options.crx"), 1); - ASSERT_TRUE(extension); - EXPECT_EQ(installed_extensions + 1, registry->enabled_extensions().size()); +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OptionsPage) { + TestExtensionDir extension_dir; + extension_dir.WriteFile(FILE_PATH_LITERAL("options.html"), + "<html><body><div>Options Here</div></body></html>"); - // Go to the Extension Settings page and click the Options button. - ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIExtensionsURL)); + extension_dir.WriteManifest(DictionaryBuilder() + .Set("manifest_version", 2) + .Set("name", "Options Test") + .Set("options_page", "options.html") + .Set("version", "1") + .ToJSON()); + + scoped_refptr<const Extension> extension = + InstallExtension(extension_dir.Pack(), 1); + ASSERT_TRUE(extension.get()); + + // Go to the Extension Settings page and click the button. + ui_test_utils::NavigateToURL( + browser(), GURL("chrome://extensions?id=" + extension->id())); TabStripModel* tab_strip = browser()->tab_strip_model(); ui_test_utils::TabAddedWaiter tab_add(browser()); - // NOTE: Currently the above script needs to execute in an iframe. The - // selector for that iframe may break if the layout of the extensions - // page changes. - content::RenderFrameHost* frame = content::FrameMatchingPredicate( - tab_strip->GetActiveWebContents(), - base::Bind(&content::FrameHasSourceUrl, - GURL(chrome::kChromeUIExtensionsURL))); - EXPECT_TRUE(content::ExecuteScript( - frame, - kScriptClickOptionButton)); - tab_add.Wait(); - EXPECT_EQ(2, tab_strip->count()); + // Used to simulate a click on the 'Extension options' link. + // NOTE: This relies on the layout of the chrome://extensions page, and may + // need to be updated if that layout changes. + static constexpr char kScriptClickOptionButton[] = R"( + (function() { + var button = document.querySelector('extensions-manager'). + $$('extensions-detail-view').$$('#extensions-options'); + button.click(); + })();)"; + + EXPECT_TRUE(content::ExecuteScript(tab_strip->GetActiveWebContents(), + kScriptClickOptionButton)); + tab_add.Wait(); + ASSERT_EQ(2, tab_strip->count()); EXPECT_EQ(extension->GetResourceURL("options.html"), tab_strip->GetWebContentsAt(1)->GetURL()); }
diff --git a/chrome/browser/printing/print_dialog_cloud.cc b/chrome/browser/printing/print_dialog_cloud.cc deleted file mode 100644 index af44431..0000000 --- a/chrome/browser/printing/print_dialog_cloud.cc +++ /dev/null
@@ -1,89 +0,0 @@ -// Copyright (c) 2012 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/printing/print_dialog_cloud.h" - -#include "base/bind.h" -#include "base/macros.h" -#include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/account_consistency_mode_manager.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_window.h" -#include "components/cloud_devices/common/cloud_devices_urls.h" -#include "components/google/core/common/google_util.h" -#include "components/signin/public/base/signin_metrics.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/web_contents.h" -#include "content/public/browser/web_contents_observer.h" - -namespace print_dialog_cloud { - -namespace { - -class SignInObserver : public content::WebContentsObserver { - public: - SignInObserver(content::WebContents* web_contents, base::OnceClosure callback) - : WebContentsObserver(web_contents), callback_(std::move(callback)) {} - - private: - // Overridden from content::WebContentsObserver: - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override { - if (!navigation_handle->IsInMainFrame() || - !navigation_handle->HasCommitted()) { - return; - } - - if (cloud_devices::IsCloudPrintURL(navigation_handle->GetURL())) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&SignInObserver::OnSignIn, - weak_ptr_factory_.GetWeakPtr())); - } - } - - void WebContentsDestroyed() override { delete this; } - - void OnSignIn() { - std::move(callback_).Run(); - if (web_contents()) - web_contents()->Close(); - } - - base::OnceClosure callback_; - base::WeakPtrFactory<SignInObserver> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(SignInObserver); -}; - -} // namespace - -void CreateCloudPrintSigninTab(Browser* browser, - bool add_account, - base::OnceClosure callback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (AccountConsistencyModeManager::IsMirrorEnabledForProfile( - browser->profile())) { - browser->window()->ShowAvatarBubbleFromAvatarButton( - add_account ? BrowserWindow::AVATAR_BUBBLE_MODE_ADD_ACCOUNT - : BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, - - signin_metrics::AccessPoint::ACCESS_POINT_CLOUD_PRINT, false); - } else { - GURL url = add_account ? cloud_devices::GetCloudPrintAddAccountURL() - : cloud_devices::GetCloudPrintSigninURL(); - content::WebContents* web_contents = - browser->OpenURL(content::OpenURLParams( - google_util::AppendGoogleLocaleParam( - url, g_browser_process->GetApplicationLocale()), - content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, - ui::PAGE_TRANSITION_AUTO_BOOKMARK, false)); - // This observer will delete itself after destroying the WebContents. - new SignInObserver(web_contents, std::move(callback)); - } -} - -} // namespace print_dialog_cloud
diff --git a/chrome/browser/printing/print_dialog_cloud.h b/chrome/browser/printing/print_dialog_cloud.h deleted file mode 100644 index 25de632..0000000 --- a/chrome/browser/printing/print_dialog_cloud.h +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright (c) 2012 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_PRINTING_PRINT_DIALOG_CLOUD_H_ -#define CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_H_ - -#include <string> - -#include "base/callback_forward.h" - -class Browser; -class Profile; - -namespace base { -class CommandLine; -} - -namespace print_dialog_cloud { - -// Creates a tab with Google 'sign in' or 'add account' page, based on -// passed |add_account| value. -void CreateCloudPrintSigninTab(Browser* browser, - bool add_account, - base::OnceClosure callback); - -// Parse switches from command_line and display the print dialog as appropriate. -bool CreatePrintDialogFromCommandLine(Profile* profile, - const base::CommandLine& command_line); - -} // namespace print_dialog_cloud - -#endif // CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_H_
diff --git a/chrome/browser/printing/print_dialog_cloud_posix.cc b/chrome/browser/printing/print_dialog_cloud_posix.cc deleted file mode 100644 index c99401c7..0000000 --- a/chrome/browser/printing/print_dialog_cloud_posix.cc +++ /dev/null
@@ -1,17 +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 "chrome/browser/printing/print_dialog_cloud.h" - -#include "base/logging.h" - -namespace print_dialog_cloud { - -bool CreatePrintDialogFromCommandLine(Profile* profile, - const base::CommandLine& command_line) { - NOTIMPLEMENTED(); - return false; -} - -} // namespace print_dialog_cloud
diff --git a/chrome/browser/printing/print_dialog_cloud_win.cc b/chrome/browser/printing/print_dialog_cloud_win.cc index 42181f75..797306b 100644 --- a/chrome/browser/printing/print_dialog_cloud_win.cc +++ b/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/printing/print_dialog_cloud.h" +#include "chrome/browser/printing/print_dialog_cloud_win.h" #include <stddef.h> #include <stdint.h> @@ -74,8 +74,8 @@ GURL url = web_contents()->GetURL(); if (cloud_devices::IsCloudPrintURL(url)) { base::string16 origin = base::UTF8ToUTF16(url.GetOrigin().spec()); - content::MessagePortProvider::PostMessageToFrame( - web_contents(), origin, origin, message_data_); + content::MessagePortProvider::PostMessageToFrame(web_contents(), origin, + origin, message_data_); } }
diff --git a/chrome/browser/printing/print_dialog_cloud_win.h b/chrome/browser/printing/print_dialog_cloud_win.h new file mode 100644 index 0000000..e2a6753 --- /dev/null +++ b/chrome/browser/printing/print_dialog_cloud_win.h
@@ -0,0 +1,22 @@ +// Copyright (c) 2012 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_PRINTING_PRINT_DIALOG_CLOUD_WIN_H_ +#define CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_WIN_H_ + +class Profile; + +namespace base { +class CommandLine; +} + +namespace print_dialog_cloud { + +// Parse switches from command_line and display the print dialog as appropriate. +bool CreatePrintDialogFromCommandLine(Profile* profile, + const base::CommandLine& command_line); + +} // namespace print_dialog_cloud + +#endif // CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_WIN_H_
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb index f4cedc5..b86073c 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">'n Skakel</translation> <translation id="2381733276052567791">Wissel spraak aan of af</translation> <translation id="2390264819538553347">Druk Enter om verder te gaan; druk Backspace om terug te gaan.</translation> +<translation id="2398579267367951220">Tik om op die bladsy te soek. Druk Enter om na die resultaat te spring, op- en afpyl om deur resultate te blaai, hou aan tik om jou soektog te verander, of druk Escape om te kanselleer.</translation> <translation id="240709722712693803">Bloupers</translation> <translation id="2416512023405990736">'n Ongemerkte merkblokkie</translation> <translation id="2417569100218200841">Inhoudinligting</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb index e891fea..f3dd300 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">አገናኝ</translation> <translation id="2381733276052567791">ንግግርን አብራ ወይም አጥፋ</translation> <translation id="2390264819538553347">ለመቀጠል አስገባን ይጫኑ፣ ወደኋላ ይመለሱ፣ የኋሊት ደምሳሽን ይጫኑ።</translation> +<translation id="2398579267367951220">ገጹን ለመፈለግ ይተይቡ። ወደ ውጤቱ ለመዝለል enter፣ ውጤቶችን ለማሰስ የላይ ወይም የታች ቀስቶች ይጫኑ፣ የእርስዎን ፍለጋ ለመለወጥ መተየብ ይቀጥሉ ወይም ለመሰረዝ escape ይጫኑ።</translation> <translation id="240709722712693803">ሰማያዊ ወይን ጠጅ</translation> <translation id="2416512023405990736">ምልክት ያልተደረገለት አመልካች ሳጥን</translation> <translation id="2417569100218200841">የይዘት መረጃ</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb index 1ab8c87..bcf50a07 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb
@@ -167,7 +167,7 @@ <translation id="2347456970887948350">Link</translation> <translation id="2381733276052567791">Uključivanje/isključivanje govora</translation> <translation id="2390264819538553347">Pritisnite tipku enter da idete dalje; pritisnite tipku backspace da se vratite nazad.</translation> -<translation id="2398579267367951220">Unesite za pretraživanje stranice. Pritisnite tipku Enter za prelazak na rezultat, strelice prema gore ili dolje za pretraživanje rezultata, nastavite upisivati kako biste izmijenili pretraživanje ili pritisnite tipku Escape za poništavanje.</translation> +<translation id="2398579267367951220">Pišite da pretražite stranicu. Pritisnite "enter" da preskočite na rezultate, koristite strelice gore ili dolje da pregledate rezultate, nastavite pisati da promijenite predmet pretraživanja ili pritisnite "escape" da otkažete.</translation> <translation id="240709722712693803">Plavoljubičasta</translation> <translation id="2416512023405990736">Neoznačeno polje za potvrdu</translation> <translation id="2417569100218200841">Informacije o sadržaju</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ca.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ca.xtb index 39add036..c5df3a4 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ca.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ca.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">Un enllaç</translation> <translation id="2381733276052567791">Activa o desactiva la veu</translation> <translation id="2390264819538553347">Prem Retorn per avançar i Retrocés per tornar enrere.</translation> +<translation id="2398579267367951220">Escriu per cercar la pàgina. Prem Retorn per anar directament al resultat, prem les fletxes amunt i avall per moure't pels resultats, continua escrivint per modificar la cerca o prem Esc per cancel·lar.</translation> <translation id="240709722712693803">Violeta blavós</translation> <translation id="2416512023405990736">Una casella de selecció desmarcada</translation> <translation id="2417569100218200841">Informació sobre el contingut</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb index 6d41a6a..3046a85 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">Et link</translation> <translation id="2381733276052567791">Slå tale til eller fra</translation> <translation id="2390264819538553347">Tryk på Enter for at gå videre. Tryk på backspace for at gå tilbage.</translation> +<translation id="2398579267367951220">Skriv for at søge på siden. Tryk på Enter for at gå videre til resultatet, tryk på pil op eller pil ned for at gennemse resultaterne, fortsæt med at skrive for at ændre din søgning, eller tryk på Esc for at annullere.</translation> <translation id="240709722712693803">Violetblå</translation> <translation id="2416512023405990736">Et afkrydsningsfelt uden markering</translation> <translation id="2417569100218200841">Indholdsoplysninger</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb index f2e58da5..1d7913e 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">پیوند</translation> <translation id="2381733276052567791">روشن یا خاموش کردن گفتار</translation> <translation id="2390264819538553347">برای ادامه، enter را فشار دهید، برای برگشتن به عقب، پسبر را فشار دهید.</translation> +<translation id="2398579267367951220">برای جستجو در صفحه، تایپ کنید. برای رفتن به قسمت نتایج، دکمه Enter را فشار دهید؛ برای مرور کردن نتایج، پیکان بالا یا پایین را فشار دهید؛ برای تغییر دادن نوشتار جستجو، به تایپ کردن ادامه دهید؛ برای لغو کردن، دکمه Escape را فشار دهید.</translation> <translation id="240709722712693803">آبی-بنفش</translation> <translation id="2416512023405990736">کادر تأیید لغو انتخابشده</translation> <translation id="2417569100218200841">اطلاعات محتوا</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb index 5ef9a96..9f9e4e70 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">Հղում</translation> <translation id="2381733276052567791">Միացնել/անջատել հնչեցումը</translation> <translation id="2390264819538553347">Առաջ անցնելու համար սեղմեք Enter: Հետ գնալու համար սեղմեք Backspace:</translation> +<translation id="2398579267367951220">Մուտքագրեք տեքստը, որն անհրաժեշտ է գտնել էջում։ Սեղմեք Enter ստեղնը՝ որոնման արդյունքներին անցնելու համար, վեր կամ վար սլաքով ստեղները՝ արդյունքները դիտելու համար: Շարունակեք մուտքագրել տեքստը՝ որոնման հարցումը փոխելու համար: Չեղարկելու համար սեղմեք Escape ստեղնը:</translation> <translation id="240709722712693803">Կապտամանուշակագույն</translation> <translation id="2416512023405990736">Չնշված նշավանդակ</translation> <translation id="2417569100218200841">Բովանդակության մանրամասներ</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb index 07d158b..3e0c0fd 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">Odkaz</translation> <translation id="2381733276052567791">Zapnúť alebo vypnúť hlasovú odozvu</translation> <translation id="2390264819538553347">Ak chcete pokračovať, stlačte Enter. Vrátite sa pomocou klávesa Backspace.</translation> +<translation id="2398579267367951220">Zadaním výrazu vyhľadajte požadovanú stránku. Stlačením klávesa Enter prejdete na výsledok, šípkou nahor alebo nadol prehľadáte výsledky, klávesom Escape zrušíte zobrazenie a ak chcete vyhľadávanie zmeniť, pokračujte v písaní.</translation> <translation id="240709722712693803">Modrofialová</translation> <translation id="2416512023405990736">Nezačiarknuté políčko</translation> <translation id="2417569100218200841">Informácie o obsahu</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb index 36d4f1d..9a1ad9a 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">Bağlantı</translation> <translation id="2381733276052567791">Konuşmayı açın veya kapatın</translation> <translation id="2390264819538553347">İlerlemek için enter tuşuna, geri gitmek için geri tuşuna basın.</translation> +<translation id="2398579267367951220">Sayfada aramak için yazmaya başlayın. Sonuca atlamak için enter tuşuna, sonuçlara göz atmak için yukarı veya aşağı oka basın. Aramanızı değiştirmek için yazmaya devam edin veya iptal etmek için escape tuşuna basın.</translation> <translation id="240709722712693803">Menekşe Rengi</translation> <translation id="2416512023405990736">İşaretlenmemiş onay kutusu</translation> <translation id="2417569100218200841">İçerik bilgileri</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb index a9b8efb..f5bfb2b 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
@@ -166,6 +166,7 @@ <translation id="2347456970887948350">Havola</translation> <translation id="2381733276052567791">Ovozli bildirgilarni yoqish yoki o‘chirib qo‘yish</translation> <translation id="2390264819538553347">Davom etish uchun “Enter” tugmasini, ortga qaytish uchun esa “Backspace” tugmasini bosing.</translation> +<translation id="2398579267367951220">Sahifada qidirish uchun soʻrovni kiriting. Natijaga sakrash uchun Enter tugmasini, natijalarni qarab chiqish uchun yuqoriga yoki pastga strelkalarini bosing. Qidiruvni oʻzgartirish uchun soʻrovni kiritishda davom eting yoki bekor qilish uchun escape tugmasini bosing.</translation> <translation id="240709722712693803">Koʻkimtir binafsharang</translation> <translation id="2416512023405990736">Belgilanmagan katakcha</translation> <translation id="2417569100218200841">Kontent haqida ma’lumot</translation>
diff --git a/chrome/browser/resources/new_tab_page/BUILD.gn b/chrome/browser/resources/new_tab_page/BUILD.gn index c049ce4..6d38bbc 100644 --- a/chrome/browser/resources/new_tab_page/BUILD.gn +++ b/chrome/browser/resources/new_tab_page/BUILD.gn
@@ -11,7 +11,6 @@ ":app", ":browser_proxy", ":customize_dialog", - ":doodle_share_dialog", ":fakebox", ":grid", ":logo", @@ -129,22 +128,11 @@ js_library("logo") { deps = [ - ":doodle_share_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/cr_elements/cr_button:cr_button.m", ] } -js_library("doodle_share_dialog") { - deps = [ - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements/cr_button:cr_button.m", - "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m", - "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m", - "//ui/webui/resources/cr_elements/cr_input:cr_input.m", - ] -} - polymer_modulizer("app") { js_file = "app.js" html_file = "app.html" @@ -223,12 +211,6 @@ html_type = "v3-ready" } -polymer_modulizer("doodle_share_dialog") { - js_file = "doodle_share_dialog.js" - html_file = "doodle_share_dialog.html" - html_type = "v3-ready" -} - group("polymer3_elements") { public_deps = [ ":app_module", @@ -236,7 +218,6 @@ ":customize_dialog_module", ":customize_shortcuts_module", ":customize_themes_module", - ":doodle_share_dialog_module", ":fakebox_module", ":grid_module", ":logo_module",
diff --git a/chrome/browser/resources/new_tab_page/app.html b/chrome/browser/resources/new_tab_page/app.html index f155163..566c675 100644 --- a/chrome/browser/resources/new_tab_page/app.html +++ b/chrome/browser/resources/new_tab_page/app.html
@@ -3,6 +3,7 @@ --ntp-theme-shortcut-background-color: rgb(229, 231, 232); --ntp-theme-text-color: var(--google-grey-800); --ntp-theme-text-shadow: none; + --ntp-one-google-bar-height: 64px; } @media (prefers-color-scheme: dark) { @@ -31,6 +32,7 @@ #backgroundImage { border: none; + pointer-events: none; } #backgroundGradient { @@ -41,15 +43,9 @@ align-items: center; display: flex; flex-direction: column; - } - - #oneGoogleBar { - pointer-events: none; - } - - #oneGoogleBarSpacer { - height: 56px; - width: 100%; + height: calc(100% - var(--ntp-one-google-bar-height)); + top: var(--ntp-one-google-bar-height); + z-index: 1; } #logo { @@ -172,7 +168,6 @@ </ntp-untrusted-iframe> <div id="backgroundGradient" hidden="[[!showBackgroundImage_]]"></div> <div id="content"> - <div id="oneGoogleBarSpacer"></div> <ntp-logo id="logo" doodle-allowed$="[[doodleAllowed_]]" single-colored$="[[singleColoredLogo_]]"> </ntp-logo>
diff --git a/chrome/browser/resources/new_tab_page/app.js b/chrome/browser/resources/new_tab_page/app.js index 8070019a..0007f518 100644 --- a/chrome/browser/resources/new_tab_page/app.js +++ b/chrome/browser/resources/new_tab_page/app.js
@@ -137,6 +137,7 @@ } } }); + this.setupShortcutDragDropOgbWorkaround_(); } /** @override */ @@ -286,21 +287,18 @@ /** * Handles messages from the OneGoogleBar iframe. The messages that are * handled include show bar on load and activate/deactivate. - * The activate/deactivate controls if the OneGoogleBar accepts mouse events, - * though other events need to be forwarded to support touch. + * The activate/deactivate controls if the OneGoogleBar is layered on top of + * #content. This would happen when OneGoogleBar has an overlay open. * @param {!Object} data * @private */ handleOneGoogleBarMessage_(data) { if (data.messageType === 'loaded') { this.oneGoogleBarLoaded_ = true; - this.eventTracker_.add(window, 'mousemove', ({x, y}) => { - this.$.oneGoogleBar.postMessage({type: 'mousemove', x, y}); - }); } else if (data.messageType === 'activate') { - this.$.oneGoogleBar.style.pointerEvents = 'unset'; + this.$.oneGoogleBar.style.zIndex = '1000'; } else if (data.messageType === 'deactivate') { - this.$.oneGoogleBar.style.pointerEvents = 'none'; + this.$.oneGoogleBar.style.zIndex = '0'; } } @@ -323,6 +321,50 @@ onResize(); } } + + /** + * During a shortcut drag, an iframe behind ntp-most-visited will prevent + * 'dragover' events from firing. To workaround this, 'pointer-events: none' + * can be set on the iframe. When doing this after the 'dragstart' event is + * fired is too late. We can instead set 'pointer-events: none' when the + * pointer enters ntp-most-visited. + * + * 'pointerenter' and pointerleave' events fire during drag. The iframe + * 'pointer-events' needs to be reset to the original value when 'dragend' + * fires if the pointer has left ntp-most-visited. + * @private + */ + setupShortcutDragDropOgbWorkaround_() { + const iframe = this.$.oneGoogleBar; + let resetAtDragEnd = false; + let dragging = false; + let originalPointerEvents; + this.eventTracker_.add(this.$.mostVisited, 'pointerenter', () => { + if (dragging) { + resetAtDragEnd = false; + return; + } + originalPointerEvents = getComputedStyle(iframe).pointerEvents; + iframe.style.pointerEvents = 'none'; + }); + this.eventTracker_.add(this.$.mostVisited, 'pointerleave', () => { + if (dragging) { + resetAtDragEnd = true; + return; + } + iframe.style.pointerEvents = originalPointerEvents; + }); + this.eventTracker_.add(this.$.mostVisited, 'dragstart', () => { + dragging = true; + }); + this.eventTracker_.add(this.$.mostVisited, 'dragend', () => { + dragging = false; + if (resetAtDragEnd) { + resetAtDragEnd = false; + iframe.style.pointerEvents = originalPointerEvents; + } + }); + } } customElements.define(AppElement.is, AppElement);
diff --git a/chrome/browser/resources/new_tab_page/customize_backgrounds.html b/chrome/browser/resources/new_tab_page/customize_backgrounds.html index 2370ad9f..e3943e9d 100644 --- a/chrome/browser/resources/new_tab_page/customize_backgrounds.html +++ b/chrome/browser/resources/new_tab_page/customize_backgrounds.html
@@ -33,8 +33,144 @@ margin-top: 3px; min-height: 30px; } + + .selected { + background-color: var(--ntp-selected-background-color); + border-radius: 4px; + padding: 16px; + position: relative; + } + + .selected .image { + box-shadow: 0 1px 3px 0 rgba(var(--google-grey-800-rgb), .3), + 0 4px 8px 3px rgba(var(--google-grey-800-rgb), .15); + height: 144px; + width: 144px; + } + + .selected-circle { + background-color: var(--ntp-background-override-color); + border-radius: 50%; + box-shadow: 0 3px 6px 1px rgba(0, 0, 0, .16), + 0 1px 2px 1px rgba(0, 0, 0, .23); + display: none; + height: 22px; + left: initial; + position: absolute; + right: 10px; + top: 8px; + width: 22px; + } + + :host-context([dir=rtl]) .selected-circle { + left: 10px; + right: initial; + } + + .selected-check { + -webkit-mask-image: url(icons/check_circle.svg); + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 28px; + background-color: var(--ntp-selected-border-color); + display: none; + height: 28px; + left: initial; + position: absolute; + right: 7px; + top: 5px; + width: 28px; + } + + :host-context([dir=rtl]) .selected-check { + left: 7px; + right: initial; + } + + .selected :-webkit-any(.selected-circle, .selected-check) { + display: block; + } + + @media (prefers-color-scheme: dark) { + .selected .image { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .3), + 0 4px 8px 3px rgba(0, 0, 0, .15); + } + } + + #noBackground .image { + background: var(--ntp-background-override-color); + border: 1px solid var(--ntp-border-color); + } + + .mini-page { + margin: auto; + padding-top: 32px; + width: fit-content; + } + + .mini-header { + background-image: url(icons/colored_header.svg); + background-repeat: no-repeat; + background-size: 100%; + height: 48px; + width: 156px; + } + + .mini-shortcuts { + -webkit-mask-image: url(icons/shortcut_circles.svg); + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 100%; + background: var(--google-grey-refresh-300); + height: 50px; + margin-inline-start: 8px; + margin-top: 14px; + width: 140px; + } + + .selected .mini-page { + padding-top: 26px; + } + + .selected .mini-header { + height: 40px; + width: 130px; + } + + .selected .mini-shortcuts { + height: 42px; + margin-inline-start: 7px; + margin-top: 12px; + width: 116px; + } + + @media (prefers-color-scheme: dark) { + .mini-header { + -webkit-mask-image: url(icons/header.svg); + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 100%; + background: white; + } + + .mini-shortcuts { + background: white; + } + } </style> <ntp-grid id="collections" columns="3" hidden="[[selectedCollection]]"> + <div id="noBackground" class="tile" role="button" on-click="onDefaultClick_"> + <div + class$="[[getNoBackgroundClass_(theme, backgroundSelection)]]"> + <div class="image"> + <div class="mini-page"> + <div class="mini-header"></div> + <div class="mini-shortcuts"></div> + </div> + </div> + <div class="selected-circle"></div> + <div class="selected-check"></div> + </div> + <div class="label">No background</div> + </div> <dom-repeat id="collectionsRepeat" items="[[collections_]]"> <template> <div class="tile" tabindex="0" title="[[item.label]]" role="button" @@ -48,9 +184,15 @@ </dom-repeat> </ntp-grid> <ntp-grid id="images" columns="3" hidden="[[!selectedCollection]]"> - <dom-repeat items="[[images_]]"> + <dom-repeat id="imagesRepeat" items="[[images_]]"> <template> - <div class="tile" tabindex="0" title="[[item.label]]" role="button"> + <div + class$="tile + [[getImageSelectedClass_(index, theme, backgroundSelection)]]" + tabindex="0" title="[[item.attribution1]]" role="button" + on-click="onImageClick_"> + <div class="selected-circle"></div> + <div class="selected-check"></div> <ntp-untrusted-iframe class="image" path="background_image?[[item.previewImageUrl.url]]"> </ntp-untrusted-iframe>
diff --git a/chrome/browser/resources/new_tab_page/customize_backgrounds.js b/chrome/browser/resources/new_tab_page/customize_backgrounds.js index 6779355..cd952cc 100644 --- a/chrome/browser/resources/new_tab_page/customize_backgrounds.js +++ b/chrome/browser/resources/new_tab_page/customize_backgrounds.js
@@ -7,6 +7,7 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BrowserProxy} from './browser_proxy.js'; +import {BackgroundSelection, BackgroundSelectionType} from './customize_dialog.js'; /** Element that lets the user configure the background. */ class CustomizeBackgroundsElement extends PolymerElement { @@ -20,6 +21,13 @@ static get properties() { return { + /** @type {!BackgroundSelection} */ + backgroundSelection: { + type: Object, + value: () => ({type: BackgroundSelectionType.NO_SELECTION}), + notify: true, + }, + /** @private {newTabPage.mojom.BackgroundCollection} */ selectedCollection: { notify: true, @@ -28,6 +36,9 @@ value: null, }, + /** @type {!newTabPage.mojom.Theme} */ + theme: Object, + /** @private {!Array<!newTabPage.mojom.BackgroundCollection>} */ collections_: Array, @@ -38,10 +49,56 @@ constructor() { super(); - BrowserProxy.getInstance().handler.getBackgroundCollections().then( - ({collections}) => { - this.collections_ = collections; - }); + /** @private {newTabPage.mojom.PageHandlerRemote} */ + this.pageHandler_ = BrowserProxy.getInstance().handler; + this.pageHandler_.getBackgroundCollections().then(({collections}) => { + this.collections_ = collections; + }); + } + + /** + * @return {string} + * @private + */ + getNoBackgroundClass_() { + switch (this.backgroundSelection.type) { + case BackgroundSelectionType.NO_BACKGROUND: + return 'selected'; + case BackgroundSelectionType.NO_SELECTION: + return this.theme && !this.theme.backgroundImageUrl && + !this.theme.dailyRefreshCollectionId ? + 'selected' : + ''; + case BackgroundSelectionType.IMAGE: + case BackgroundSelectionType.DAILY_REFRESH: + default: + return ''; + } + } + + /** + * @param {number} index + * @return {string} + * @private + */ + getImageSelectedClass_(index) { + const {url} = this.images_[index].imageUrl; + switch (this.backgroundSelection.type) { + case BackgroundSelectionType.IMAGE: + return this.backgroundSelection.image.imageUrl.url === url ? + 'selected' : + ''; + case BackgroundSelectionType.NO_SELECTION: + return this.theme && this.theme.backgroundImageUrl && + this.theme.backgroundImageUrl.url === url && + !this.theme.dailyRefreshCollectionId ? + 'selected' : + ''; + case BackgroundSelectionType.NO_BACKGROUND: + case BackgroundSelectionType.DAILY_REFRESH: + default: + return ''; + } } /** @@ -53,15 +110,29 @@ } /** @private */ + onDefaultClick_() { + this.backgroundSelection = {type: BackgroundSelectionType.NO_BACKGROUND}; + } + + /** + * @param {!Event} e + * @private + */ + onImageClick_(e) { + this.backgroundSelection = { + type: BackgroundSelectionType.IMAGE, + image: this.$.imagesRepeat.itemForElement(e.target), + }; + } + + /** @private */ async onSelectedCollectionChange_() { this.images_ = []; if (!this.selectedCollection) { return; } const collectionId = this.selectedCollection.id; - const {images} = - await BrowserProxy.getInstance().handler.getBackgroundImages( - collectionId); + const {images} = await this.pageHandler_.getBackgroundImages(collectionId); // We check the IDs match since the user may have already moved to a // different collection before the results come back. if (!this.selectedCollection ||
diff --git a/chrome/browser/resources/new_tab_page/customize_dialog.html b/chrome/browser/resources/new_tab_page/customize_dialog.html index f537b9c..5457dca 100644 --- a/chrome/browser/resources/new_tab_page/customize_dialog.html +++ b/chrome/browser/resources/new_tab_page/customize_dialog.html
@@ -198,7 +198,8 @@ <div id="pages"> <iron-pages selected="[[selectedPage_]]" attr-for-selected="page-name"> <ntp-customize-backgrounds id="backgrounds" page-name="backgrounds" - selected-collection="{{selectedCollection_}}"> + selected-collection="{{selectedCollection_}}" theme="[[theme]]" + background-selection="{{backgroundSelection}}"> </ntp-customize-backgrounds> <ntp-customize-shortcuts page-name="shortcuts"> </ntp-customize-shortcuts>
diff --git a/chrome/browser/resources/new_tab_page/doodle_share_dialog.html b/chrome/browser/resources/new_tab_page/doodle_share_dialog.html deleted file mode 100644 index c41b624..0000000 --- a/chrome/browser/resources/new_tab_page/doodle_share_dialog.html +++ /dev/null
@@ -1,81 +0,0 @@ -<style> - #dialog::part(dialog) { - max-width: 300px; - } - - #buttons { - display: flex; - flex-direction: row; - justify-content: center; - margin-bottom: 28px; - margin-top: 20px; - } - - #buttons cr-button { - background-position: center; - background-repeat: no-repeat; - background-size: cover; - border: none; - height: 48px; - min-width: 48px; - width: 48px; - } - - #buttons cr-button:hover { - opacity: 0.8; - } - - #buttons > :not(:last-child) { - margin-inline-end: 12px; - } - - #facebookButton { - background-image: url(icons/facebook.svg); - } - - #twitterButton { - background-image: url(icons/twitter.svg); - } - - #emailButton { - background-image: url(icons/mail.svg); - } - - #url { - --cr-input-error-display: none; - } - - #copyButton { - --cr-icon-image: url(icons/copy.svg); - margin-inline-start: 2px; - } -</style> -<cr-dialog id="dialog" show-on-attach> - <div id="title" slot="title"> - [[title]] - </div> - <div slot="body"> - <div id="buttons"> - <cr-button id="facebookButton" title="$i18n{facebook}" - on-click="onFacebookClick_"> - </cr-button> - <cr-button id="twitterButton" title="$i18n{twitter}" - on-click="onTwitterClick_"> - </cr-button> - <cr-button id="emailButton" title="$i18n{email}" - on-click="onEmailClick_"> - </cr-button> - </div> - <cr-input readonly label="$i18n{doodleLink}" id="url" - value="[[url.url]]"> - <cr-icon-button id="copyButton" slot="suffix" title="$i18n{copyLink}" - on-click="onCopyClick_"> - </cr-icon-button> - </cr-input> - </div> - <div slot="button-container"> - <cr-button id="doneButton" class="action-button" on-click="onCloseClick_"> - $i18n{doneButton} - </cr-button> - </div> -</cr-dialog>
diff --git a/chrome/browser/resources/new_tab_page/doodle_share_dialog.js b/chrome/browser/resources/new_tab_page/doodle_share_dialog.js deleted file mode 100644 index 0769090b..0000000 --- a/chrome/browser/resources/new_tab_page/doodle_share_dialog.js +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; -import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; -import 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; -import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; - -import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {BrowserProxy} from './browser_proxy.js'; - -/** - * The ID of the doodle app for Facebook. Used to share doodles to Facebook. - * @type {number} - */ -const FACEBOOK_APP_ID = 738026486351791; - -// Dialog that lets the user share the doodle. -class DoodleShareDialogElement extends PolymerElement { - static get is() { - return 'ntp-doodle-share-dialog'; - } - - static get template() { - return html`{__html_template__}`; - } - - static get properties() { - return { - /** - * Title shown on the dialog. - * @type {string} - */ - title: String, - - /** - * Share URL provided to the user. - * @type {url.mojom.Url} - */ - url: Object, - }; - } - - /** @private */ - onFacebookClick_() { - const url = 'https://www.facebook.com/dialog/share' + - `?app_id=${FACEBOOK_APP_ID}` + - `&href=${encodeURIComponent(this.url.url)}` + - `&hashtag=${encodeURIComponent('#GoogleDoodle')}`; - BrowserProxy.getInstance().open(url); - } - - /** @private */ - onTwitterClick_() { - const url = 'https://twitter.com/intent/tweet' + - `?text=${encodeURIComponent(`${this.title}\n${this.url.url}`)}`; - BrowserProxy.getInstance().open(url); - } - - /** @private */ - onEmailClick_() { - const url = `mailto:?subject=${encodeURIComponent(this.title)}` + - `&body=${encodeURIComponent(this.url.url)}`; - BrowserProxy.getInstance().navigate(url); - } - - /** @private */ - onCopyClick_() { - this.$.url.select(); - navigator.clipboard.writeText(this.url.url); - } - - /** @private */ - onCloseClick_() { - this.$.dialog.close(); - } -} - -customElements.define(DoodleShareDialogElement.is, DoodleShareDialogElement);
diff --git a/chrome/browser/resources/new_tab_page/icons/colored_header.svg b/chrome/browser/resources/new_tab_page/icons/colored_header.svg new file mode 100644 index 0000000..fdd5c826 --- /dev/null +++ b/chrome/browser/resources/new_tab_page/icons/colored_header.svg
@@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="130" height="40"><path d="M52.792 16.638c-1.558-.64-2.468-1.578-3.063-3.157-.258-.686-.303-1.064-.253-2.158.075-1.668.544-2.71 1.692-3.759 1.13-1.031 2.114-1.367 3.8-1.294 1.165.05 1.439.118 2.258.556 1.7.91 2.652 2.416 2.778 4.395.166 2.6-1.34 4.847-3.73 5.566-1.069.322-2.485.261-3.482-.149zM56.47 14.4c1.672-1.344 1.808-3.922.28-5.33-1.044-.963-2.202-1.121-3.47-.474-.664.339-.948.656-1.32 1.479-.6 1.32-.312 3.055.667 4.032.653.653 1.188.836 2.296.787.844-.037 1.066-.108 1.547-.494zM93.244 16.791c-1.323-.431-2.606-1.588-3.17-2.857-.444-.997-.539-3.115-.187-4.18.46-1.391 1.29-2.403 2.499-3.047.656-.35.897-.392 2.21-.392 1.75 0 2.262.211 3.365 1.39.739.79 1.547 2.312 1.328 2.502-.07.061-1.701.762-3.626 1.557-1.924.795-3.498 1.502-3.498 1.57 0 .286 1.09 1.3 1.564 1.457.645.213 1.77.21 2.344-.006.24-.09.684-.404.984-.696l.547-.531.816.541c.449.298.816.601.816.674 0 .245-1.458 1.446-2.169 1.786-.874.42-2.878.54-3.823.232zm1.315-6.424c1.257-.532 2.172-1.001 2.172-1.115 0-.348-.956-.944-1.67-1.042-.933-.128-1.865.242-2.511.997-.45.525-.827 1.486-.827 2.104 0 .266-.146.315 2.836-.944z" fill="#d93025"/><path d="M85.978 8.598V.643h2.209v15.91h-2.209z" fill="#1e8e3e"/><path d="M76.853 21.599a7.671 7.671 0 01-1.259-.713c-.645-.462-1.625-1.763-1.533-2.037.027-.083.437-.306.911-.497.823-.33.869-.334 1.007-.078.08.147.394.508.699.802.996.962 2.691 1.08 3.833.266.567-.403.988-1.368 1.105-2.531.11-1.085 0-1.225-.555-.707-.644.6-1.325.816-2.552.812-1.055-.004-1.277-.057-2.11-.505-3.862-2.074-3.867-7.55-.008-9.65 1.098-.598 2.689-.694 3.77-.229.417.179.872.452 1.012.606.358.397.503.35.503-.16v-.442h2.062v5.296c0 3.363-.06 5.58-.165 6.076-.36 1.69-1.29 2.955-2.612 3.55-.954.43-3.221.507-4.108.14zm3.009-6.823c1.131-.428 1.868-1.67 1.873-3.158.003-.865-.066-1.158-.426-1.816-.676-1.237-1.92-1.816-3.204-1.493-1.451.365-2.322 1.598-2.322 3.287 0 1.537.698 2.683 1.937 3.179.475.19 1.639.19 2.142 0zM37.703 16.572c-3.608-1.039-6.261-4.439-6.261-8.025 0-2.287.798-4.165 2.489-5.858 3.118-3.122 7.698-3.493 11.098-.9l.705.537-.76.77-.76.769-.463-.353c-.255-.194-.858-.538-1.34-.764-.787-.368-1.04-.41-2.433-.41-1.5 0-1.593.018-2.676.554-3.84 1.897-4.67 7.02-1.633 10.057 2.929 2.929 8.493 1.989 9.609-1.623.168-.545.306-1.084.306-1.197 0-.168-.503-.205-2.799-.205h-2.799v-2.21h7.808v1.319c0 .725-.074 1.67-.163 2.099-.548 2.629-2.66 4.78-5.383 5.482-1.198.309-3.397.289-4.545-.042z" fill="#1a73e8"/><path d="M64.866 16.648c-1.44-.592-2.16-1.252-2.901-2.657-.362-.685-.397-.898-.397-2.373 0-1.476.036-1.695.411-2.459.536-1.091 1.755-2.208 2.867-2.627.7-.264 1.076-.31 2.172-.262 1.165.05 1.44.118 2.258.556 1.688.904 2.648 2.43 2.783 4.424.13 1.939-.71 3.74-2.24 4.792-1.466 1.01-3.396 1.246-4.953.606zm3.654-2.249c1.166-.937 1.64-2.559 1.165-3.99-.89-2.68-4.316-2.984-5.576-.496-.713 1.407-.506 3.033.523 4.116.689.725 1.2.914 2.341.864.845-.037 1.067-.108 1.547-.494z" fill="#f9ab00"/><path d="M3.759 39.742c-1.016-.273-1.588-.63-2.364-1.472C.428 37.222.137 36.45.147 34.967c.006-1.008.077-1.395.362-1.989.519-1.08 1.672-2.172 2.697-2.556l.85-.318 61.165.038 61.165.037.778.41c1.996 1.052 3.042 3.124 2.657 5.262-.294 1.632-1.313 2.918-2.902 3.663l-.828.388-60.767.028c-52.87.024-60.87 0-61.565-.188z" fill="none"/><path d="M3.586 39.61c-.385-.139-1.066-.56-1.513-.935-2.708-2.273-2.233-6.47.908-8.035l1.075-.536h60.925c45.633 0 61.127.061 61.731.242.444.133 1.173.555 1.62.938 2.838 2.429 1.95 7.049-1.597 8.315-1.1.392-122.065.404-123.149.012z" fill="#dadce0"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/new_tab_page/icons/copy.svg b/chrome/browser/resources/new_tab_page/icons/copy.svg deleted file mode 100644 index fd4c870..0000000 --- a/chrome/browser/resources/new_tab_page/icons/copy.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M35.25 14a.76.76 0 0 1 .75.75v25.5a.76.76 0 0 1-.75.75h-16.5a.76.76 0 0 1-.75-.75v-25.5a.76.76 0 0 1 .75-.75h16.5m0-4h-16.5A4.77 4.77 0 0 0 14 14.75v25.5A4.77 4.77 0 0 0 18.75 45h16.5A4.77 4.77 0 0 0 40 40.25v-25.5A4.77 4.77 0 0 0 35.25 10z" fill="#666"/><path d="M9 38V9.75A4.77 4.77 0 0 1 13.75 5h19.16" fill="none" stroke="#666" stroke-miterlimit="10" stroke-width="4"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/new_tab_page/icons/facebook.svg b/chrome/browser/resources/new_tab_page/icons/facebook.svg deleted file mode 100644 index dbf2fd8..0000000 --- a/chrome/browser/resources/new_tab_page/icons/facebook.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M43.5 48h-39C2 48 0 46 0 43.5v-39C0 2 2 0 4.5 0h39C46 0 48 2 48 4.5v39c0 2.5-2 4.5-4.5 4.5z" fill="#3a589b"/><path d="M39.4 29.4l.9-7.3h-7.2v-4.7c0-2.1.6-3.5 3.6-3.5h3.8V7.5c-.7-.1-2.9-.3-5.6-.3-5.5 0-9.3 3.4-9.3 9.6v5.3h-6.2v7.3h6.2V48h7.5V29.4h6.3z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/new_tab_page/icons/mail.svg b/chrome/browser/resources/new_tab_page/icons/mail.svg deleted file mode 100644 index 8851e42..0000000 --- a/chrome/browser/resources/new_tab_page/icons/mail.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M43.5 48h-39C2 48 0 46 0 43.5v-39C0 2 2 0 4.5 0h39C46 0 48 2 48 4.5v39c0 2.5-2 4.5-4.5 4.5z" fill="#9da6aa"/><path d="M35.9 12.8H12.1c-2.2 0-4 1.8-4 4v14.4c0 2.2 1.8 4 4 4h23.8c2.2 0 4-1.8 4-4V16.8c0-2.2-1.8-4-4-4z" fill="#fff"/><path fill="none" stroke="#9da6aa" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M35.4 17.2L24 26.1l-11.4-8.9"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/new_tab_page/icons/twitter.svg b/chrome/browser/resources/new_tab_page/icons/twitter.svg deleted file mode 100644 index 4aeae35..0000000 --- a/chrome/browser/resources/new_tab_page/icons/twitter.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M43.5 48h-39C2 48 0 46 0 43.5v-39C0 2 2 0 4.5 0h39C46 0 48 2 48 4.5v39c0 2.5-2 4.5-4.5 4.5z" fill="#3aaae1"/><path d="M39.3 15.5c-1.1.5-2.3.8-3.5.9 1.2-.7 2.2-1.9 2.6-3.3-1.1.7-2.5 1.2-3.8 1.5-1.1-1.1-2.6-1.9-4.4-1.9-3.3 0-6 2.7-6 6 0 .5.1.9.1 1.3-4.9-.3-9.4-2.6-12.4-6.3-.5.9-.8 1.9-.8 3 0 2 1.1 3.9 2.7 5-1 0-1.9-.3-2.7-.8v.1c0 2.9 2 5.3 4.8 5.9-.5.1-1.1.2-1.6.2-.4 0-.8-.1-1.1-.1.8 2.4 3 4.1 5.6 4.2-2 1.6-4.7 2.5-7.4 2.5-.5 0-1 0-1.4-.1 2.7 1.7 5.8 2.7 9.2 2.7 11 0 17-9.1 17-17v-.8c1.3-.8 2.3-1.8 3.1-3z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/new_tab_page/logo.html b/chrome/browser/resources/new_tab_page/logo.html index 0c4726ef..28e7e90 100644 --- a/chrome/browser/resources/new_tab_page/logo.html +++ b/chrome/browser/resources/new_tab_page/logo.html
@@ -80,7 +80,7 @@ <div id="singleColoredLogo" hidden="[[!singleColored]]"></div> <div id="multiColoredLogo" hidden="[[singleColored]]"></div> </div> - <div id="doodle" title="[[doodle_.description]]"> + <div id="doodle"> <div id="imageContainer" hidden="[[!doodle_.content.imageDoodle]]" tabindex="1" on-click="onImageClick_" on-keydown="onImageKeydown_"> <!-- The static image is always visible and the animated image is stacked @@ -91,11 +91,13 @@ <ntp-untrusted-iframe id="animation" path="[[animationUrl_]]" hidden="[[!showAnimation_]]"> </ntp-untrusted-iframe> + <!-- TODO(crbug.com/1039910): Set focus ring that works for both dark and + light doodles. + TODO(crbug.com/1039910): Open share dialog on click. --> <cr-button id="shareButton" title="$i18n{shareDoodle}" - on-click="onShareButtonClick_" - style="background-color: [[rgbOrUnset_(doodle_.content.imageDoodle.shareButton.backgroundColor)]]; - left: [[doodle_.content.imageDoodle.shareButton.x]]px; - top: [[doodle_.content.imageDoodle.shareButton.y]]px;"> + style="background-color: [[rgbOrUnset_(doodle_.content.imageDoodle.shareButton.backgroundColor)]]; + left: [[doodle_.content.imageDoodle.shareButton.x]]px; + top: [[doodle_.content.imageDoodle.shareButton.y]]px;"> <img id="shareButtonImage" src="[[doodle_.content.imageDoodle.shareButton.iconUrl.url]]"> </img> @@ -109,11 +111,3 @@ </ntp-untrusted-iframe> </div> </iron-pages> -<dom-if if="[[showShareDialog_]]" restamp> - <template> - <ntp-doodle-share-dialog title="[[doodle_.description]]" - url="[[doodle_.content.imageDoodle.shareUrl]]" - on-close="onShareDialogClose_"> - </ntp-doodle-share-dialog> - </template> -</dom-if>
diff --git a/chrome/browser/resources/new_tab_page/logo.js b/chrome/browser/resources/new_tab_page/logo.js index 952a783b4..7f4d003a 100644 --- a/chrome/browser/resources/new_tab_page/logo.js +++ b/chrome/browser/resources/new_tab_page/logo.js
@@ -6,7 +6,6 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js'; import './untrusted_iframe.js'; -import './doodle_share_dialog.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {EventTracker} from 'chrome://resources/js/event_tracker.m.js'; @@ -99,9 +98,6 @@ type: String, value: null, }, - - /** @private */ - showShareDialog_: Boolean, }; } @@ -228,20 +224,6 @@ rgbOrUnset_(skColor) { return skColor ? skColorToRgb(skColor) : 'unset'; } - - /** - * @param {!Event} e - * @private - */ - onShareButtonClick_(e) { - e.stopPropagation(); - this.showShareDialog_ = true; - } - - /** @private */ - onShareDialogClose_() { - this.showShareDialog_ = false; - } } customElements.define(LogoElement.is, LogoElement);
diff --git a/chrome/browser/resources/new_tab_page/most_visited.js b/chrome/browser/resources/new_tab_page/most_visited.js index 5d41829d..7fe686f 100644 --- a/chrome/browser/resources/new_tab_page/most_visited.js +++ b/chrome/browser/resources/new_tab_page/most_visited.js
@@ -48,7 +48,7 @@ * @private */ function setTilePosition(tile, {x, y}) { - tile.style.position = 'absolute'; + tile.style.position = 'fixed'; tile.style.left = `${x}px`; tile.style.top = `${y}px`; }
diff --git a/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd b/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd index 2db9dd95..0124cea 100644 --- a/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd +++ b/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd
@@ -62,6 +62,8 @@ file="icons/link.svg" type="BINDATA" compress="gzip" /> <include name="IDR_NEW_TAB_PAGE_BACKGROUNDS_ICON_SVG" file="icons/backgrounds.svg" type="BINDATA" compress="gzip" /> + <include name="IDR_NEW_TAB_PAGE_COLORED_HEADER_SVG" + file="icons/colored_header.svg" type="BINDATA" compress="gzip" /> <include name="IDR_NEW_TAB_PAGE_COLORS_ICON_SVG" file="icons/colors.svg" type="BINDATA" compress="gzip" /> <include name="IDR_NEW_TAB_PAGE_COLORIZE_ICON_SVG" @@ -76,14 +78,6 @@ file="icons/mic.svg" type="BINDATA" compress="gzip" /> <include name="IDR_NEW_TAB_PAGE_LINK_SVG" file="icons/link.svg" type="BINDATA" compress="gzip" /> - <include name="IDR_NEW_TAB_PAGE_COPY_SVG" - file="icons/copy.svg" type="BINDATA" compress="gzip" /> - <include name="IDR_NEW_TAB_PAGE_FACEBOOK_SVG" - file="icons/facebook.svg" type="BINDATA" compress="gzip" /> - <include name="IDR_NEW_TAB_PAGE_TWITTER_SVG" - file="icons/twitter.svg" type="BINDATA" compress="gzip" /> - <include name="IDR_NEW_TAB_PAGE_MAIL_SVG" - file="icons/mail.svg" type="BINDATA" compress="gzip" /> <include name="IDR_NEW_TAB_PAGE_MINI_PAGE_JS" file="${root_gen_dir}/chrome/browser/resources/new_tab_page/mini_page.js" use_base_dir="false" type="BINDATA" compress="gzip" /> @@ -93,9 +87,6 @@ <include name="IDR_NEW_TAB_PAGE_LOGO_JS" file="${root_gen_dir}/chrome/browser/resources/new_tab_page/logo.js" use_base_dir="false" type="BINDATA" compress="gzip" /> - <include name="IDR_NEW_TAB_PAGE_DOODLE_SHARE_DIALOG_JS" - file="${root_gen_dir}/chrome/browser/resources/new_tab_page/doodle_share_dialog.js" - use_base_dir="false" type="BINDATA" compress="gzip" /> </includes> <structures> <structure name="IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_HTML"
diff --git a/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html b/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html index ae67db294..e813ed2 100644 --- a/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html +++ b/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html
@@ -7,11 +7,24 @@ overflow: hidden; } + #overlayBackdrop { + background: rgba(0, 0, 0, .6); + display: none; + height: 100vh; + position: fixed; + width: 100%; + } + + #overlayBackdrop[show] { + display: block; + } + $i18nRaw{inHeadStyle} </style> <script>$i18nRaw{inHeadScript}</script> </head> <body> + <div id="overlayBackdrop"></div> $i18nRaw{barHtml} <script>$i18nRaw{afterBarScript}</script> $i18nRaw{endOfBodyHtml}
diff --git a/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js b/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js index e0c0cee6..9baeb9b9 100644 --- a/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js +++ b/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js
@@ -2,11 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +const oneGoogleBarHeightInPixels = 64; + /** * The following |messageType|'s are sent to the parent frame: * - loaded: initial load - * - deactivate: the pointer is not over OneGoogleBar content - * - activate: the pointer is over OneGoogleBar content + * - activate/deactivate: When an overlay is open, 'activate' is sent to the + * to ntp-app so it can layer the OneGoogleBar over the NTP content. When + * no overlays are open, 'deactivate' is sent to ntp-app so the NTP + * content can be on top. The top bar of the OneGoogleBar is always on + * top. * * TODO(crbug.com/1039913): add support for light/dark theme. add support for * forwarding touch events when OneGoogleBar is active. @@ -14,42 +19,54 @@ * @param {string} messageType */ function postMessage(messageType) { + if (window === window.parent) { + return; + } window.parent.postMessage( {frameType: 'one-google-bar', messageType}, 'chrome://new-tab-page'); } -// Tracks if the OneGoogleBar is active and should accept pointer events. -let isActive; - -/** - * @param {number} x - * @param {number} y - */ -function updateActiveState(x, y) { - const shouldBeActive = document.elementFromPoint(x, y).tagName !== 'HTML'; - if (shouldBeActive === isActive) { - return; - } - isActive = shouldBeActive; - postMessage(shouldBeActive ? 'activate' : 'deactivate'); +function trackOverlayState() { + const overlays = new Set(); + const observer = new MutationObserver(mutations => { + // Add any mutated element that is an overlay to |overlays|. + mutations.forEach(({target}) => { + if (target.id === 'gb' || target.tagName === 'BODY' || + target.parentElement && target.parentElement.tagName === 'BODY') { + return false; + } + if (target.offsetTop + target.offsetHeight > oneGoogleBarHeightInPixels) { + overlays.add(target); + } + }); + // Remove overlays detached from DOM. + Array.from(overlays).forEach(overlay => { + if (!overlay.parentElement) { + overlays.delete(overlay); + } + }); + // Check if an overlay and its parents are visible. + const overlayShown = Array.from(overlays).some(overlay => { + if (window.getComputedStyle(overlay).visibility === 'hidden') { + return false; + } + let current = overlay; + while (current) { + if (window.getComputedStyle(current).display === 'none') { + return false; + } + current = current.parentElement; + } + return true; + }); + document.querySelector('#overlayBackdrop') + .toggleAttribute('show', overlayShown); + postMessage(overlayShown ? 'activate' : 'deactivate'); + }); + observer.observe( + document, {attributes: true, childList: true, subtree: true}); } -// Handle messages from parent frame which include forwarded mousemove events. -// The OneGoogleBar is loaded in an iframe on top of the embedder parent frame. -// The mousemove events are used to determine if the OneGoogleBar should be -// active or not. -// TODO(crbug.com/1039913): add support for touch which does not send mousemove -// events. -window.addEventListener('message', ({data}) => { - if (data.type === 'mousemove') { - updateActiveState(data.x, data.y); - } -}); - -window.addEventListener('mousemove', ({x, y}) => { - updateActiveState(x, y); -}); - document.addEventListener('DOMContentLoaded', () => { // TODO(crbug.com/1039913): remove after OneGoogleBar links are updated. // Updates <a>'s so they load on the top frame instead of the iframe. @@ -59,4 +76,5 @@ } }); postMessage('loaded'); + trackOverlayState(); });
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.html b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.html index 1541014..ceeedc5 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.html +++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.html
@@ -80,9 +80,7 @@ close-text="$i18n{close}" on-cancel="onAllowSharedDialogCancel_" on-close="onAllowSharedDialogClose_"> <div slot="title"> - [[getAllowSharedDialogTitle_(prefs.settings.use_shared_proxies.value, - '$i18n{networkProxyAllowSharedEnableWarningTitle}', - '$i18n{networkProxyAllowSharedDisableWarningTitle}')]] + [[getAllowSharedDialogTitle_(prefs.settings.use_shared_proxies.value)]] </div> <div slot="body"> $i18n{networkProxyAllowSharedWarningMessage}
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js index 582b40a2..18d3628 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
@@ -70,13 +70,14 @@ /** * @param {boolean} allowShared - * @param {string} enableStr - * @param {string} disableStr * @return {string} * @private */ - getAllowSharedDialogTitle_(allowShared, enableStr, disableStr) { - return allowShared ? disableStr : enableStr; + getAllowSharedDialogTitle_(allowShared) { + if (allowShared) { + return this.i18n('networkProxyAllowSharedDisableWarningTitle'); + } + return this.i18n('networkProxyAllowSharedEnableWarningTitle'); }, /**
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.html b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.html index 869c584..4f4bac51 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.html
@@ -38,14 +38,9 @@ flex-grow: 1; } - #resultIcon { - margin-inline-end: 20px; - margin-inline-start: 16px; - } - - #actionTypeIcon { - margin-inline-end: 16px; - margin-inline-start: 20px; + iron-icon { + margin: var(--cr-toolbar-icon-margin); + width: var(--cr-toolbar-icon-container-size); } </style> <div focus-row-container>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.html b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.html index 1918375..6f372adb 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.html
@@ -17,6 +17,8 @@ <style include="settings-shared"> :host { --cr-toolbar-field-width: 480px; + --cr-toolbar-icon-container-size: 32px; + --cr-toolbar-icon-margin: 6px 12px; display: flex; flex-basis: var(--cr-toolbar-field-width); flex-direction: row; @@ -33,7 +35,10 @@ } cr-toolbar-search-field { + --cr-toolbar-search-field-term-margin: 0; --cr-toolbar-search-field-border-radius: 20px; + --cr-toolbar-search-field-paper-spinner-margin: 0 12px; + --cr-toolbar-search-field-prompt-margin-inline-start: 140px; transition: height 150ms; } @@ -61,7 +66,7 @@ border-radius: 0 0 20px 20px; box-shadow: var(--cr-menu-shadow); display: table; - padding: 8px 0 13px 0; + padding: 8px 0 12px 0; } :host([narrow]) iron-dropdown [slot='dropdown-content'] { @@ -71,6 +76,10 @@ :host(:not([narrow])) iron-dropdown [slot='dropdown-content'] { width: var(--cr-toolbar-field-width, 680px); } + + :host([narrow]) os-search-result-row { + --cr-toolbar-icon-margin: 6px 12px 6px 18px; + } </style> <cr-toolbar-search-field id="search" narrow="[[narrow]]" label="$i18n{searchPrompt}" clear-label="$i18n{clearSearch}"
diff --git a/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chrome/browser/resources/settings/privacy_page/BUILD.gn index 41400855..87be6b94 100644 --- a/chrome/browser/resources/settings/privacy_page/BUILD.gn +++ b/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -587,7 +587,7 @@ auto_imports = settings_auto_imports + [ "ui/webui/resources/html/assert.html|assert", "chrome/browser/resources/settings/route.html|routes", - "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxyImpl", + "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxy,MetricsBrowserProxyImpl", "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl", "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteSettingsPrefsBrowserProxyImpl", "chrome/browser/resources/settings/site_settings/constants.html|ContentSettingsTypes,CookieControlsMode,ChooserType",
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js index 316757c0..741afb7 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.js +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -281,6 +281,9 @@ /** @private {?settings.PrivacyPageBrowserProxy} */ browserProxy_: null, + /** @private {?settings.MetricsBrowserProxy} */ + metricsBrowserProxy_: null, + /** @override */ ready() { this.ContentSettingsTypes = settings.ContentSettingsTypes;
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html index 2048777..f6170fb 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.html +++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -176,7 +176,7 @@ </cr-radio-group> </div> <div class="settings-box first line-only"> - <h2>$i18n{securityPageAdvancedSectionLabel}</h2> + <h2>$i18n{advancedPageTitle}</h2> </div> <template is="dom-if" if="[[showSecureDnsSetting_]]"> <settings-secure-dns prefs="{{prefs}}"></settings-secure-dns>
diff --git a/chrome/browser/soda/OWNERS b/chrome/browser/soda/OWNERS deleted file mode 100644 index d21dfa0..0000000 --- a/chrome/browser/soda/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -# COMPONENT: Internals>Media - -evliu@google.com -beccahughes@chromium.org
diff --git a/chrome/browser/soda/soda_service.cc b/chrome/browser/soda/soda_service.cc deleted file mode 100644 index 7a10931..0000000 --- a/chrome/browser/soda/soda_service.cc +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/soda/soda_service.h" - -#include "chrome/grit/generated_resources.h" -#include "content/public/browser/service_process_host.h" - -namespace soda { - -constexpr base::TimeDelta kIdleProcessTimeout = base::TimeDelta::FromSeconds(5); - -SodaService::SodaService() = default; -SodaService::~SodaService() = default; - -void SodaService::Create( - mojo::PendingReceiver<media::mojom::SodaContext> receiver) { - LaunchIfNotRunning(); - soda_service_->BindContext(std::move(receiver)); -} - -void SodaService::LaunchIfNotRunning() { - if (soda_service_.is_bound()) - return; - - content::ServiceProcessHost::Launch( - soda_service_.BindNewPipeAndPassReceiver(), - content::ServiceProcessHost::Options() - .WithDisplayName(IDS_UTILITY_PROCESS_SODA_SERVICE_NAME) - .WithSandboxType(service_manager::SandboxType::kSoda) - .Pass()); - - // Ensure that if the interface is ever disconnected (e.g. the service - // process crashes) or goes idle for a short period of time -- meaning there - // are no in-flight messages and no other interfaces bound through this - // one -- then we will reset |remote|, causing the service process to be - // terminated if it isn't already. - soda_service_.reset_on_disconnect(); - soda_service_.reset_on_idle_timeout(kIdleProcessTimeout); -} - -} // namespace soda
diff --git a/chrome/browser/soda/soda_service.h b/chrome/browser/soda/soda_service.h deleted file mode 100644 index 86f79d6..0000000 --- a/chrome/browser/soda/soda_service.h +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SODA_SODA_SERVICE_H_ -#define CHROME_BROWSER_SODA_SODA_SERVICE_H_ - -#include "components/keyed_service/core/keyed_service.h" -#include "media/mojo/mojom/soda_service.mojom.h" -#include "mojo/public/cpp/bindings/remote.h" - -class Profile; - -namespace soda { - -// Provides a mojo endpoint in the browser that allows the renderer process to -// launch and initialize the sandboxed Speech On-Device API (SODA) service -// process. -class SodaService : public KeyedService { - public: - explicit SodaService(); - SodaService(const SodaService&) = delete; - SodaService& operator=(const SodaService&) = delete; - ~SodaService() override; - - void Create(mojo::PendingReceiver<media::mojom::SodaContext> receiver); - - private: - // Launches the SODA service in a sandboxed utility process. - void LaunchIfNotRunning(); - - // The remote to the SODA service. The browser will not launch a new SODA - // service process if this remote is already bound. - mojo::Remote<media::mojom::SodaService> soda_service_; -}; - -} // namespace soda - -#endif // CHROME_BROWSER_SODA_SODA_SERVICE_H_
diff --git a/chrome/browser/soda/soda_service_factory.cc b/chrome/browser/soda/soda_service_factory.cc deleted file mode 100644 index 91adc78..0000000 --- a/chrome/browser/soda/soda_service_factory.cc +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/soda/soda_service_factory.h" - -#include "base/no_destructor.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/soda/soda_service.h" -#include "components/keyed_service/content/browser_context_dependency_manager.h" - -// static -soda::SodaService* SodaServiceFactory::GetForProfile(Profile* profile) { - return static_cast<soda::SodaService*>( - GetInstance()->GetServiceForBrowserContext(profile, true)); -} - -// static -SodaServiceFactory* SodaServiceFactory::GetInstance() { - static base::NoDestructor<SodaServiceFactory> instance; - return instance.get(); -} - -SodaServiceFactory::SodaServiceFactory() - : BrowserContextKeyedServiceFactory( - "SodaService", - BrowserContextDependencyManager::GetInstance()) {} - -SodaServiceFactory::~SodaServiceFactory() = default; - -KeyedService* SodaServiceFactory::BuildServiceInstanceFor( - content::BrowserContext* profile) const { - return new soda::SodaService(); -}
diff --git a/chrome/browser/soda/soda_service_factory.h b/chrome/browser/soda/soda_service_factory.h deleted file mode 100644 index bfe8a5b..0000000 --- a/chrome/browser/soda/soda_service_factory.h +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SODA_SODA_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_SODA_SODA_SERVICE_FACTORY_H_ - -#include "components/keyed_service/content/browser_context_keyed_service_factory.h" - -class Profile; - -namespace base { -template <class T> -class NoDestructor; -} // namespace base - -namespace soda { -class SodaService; -} // namespace soda - -// Factory to get or create an instance of SodaServiceFactory from -// a Profile. -class SodaServiceFactory : public BrowserContextKeyedServiceFactory { - public: - static soda::SodaService* GetForProfile(Profile* profile); - - private: - friend class base::NoDestructor<SodaServiceFactory>; - static SodaServiceFactory* GetInstance(); - - SodaServiceFactory(); - ~SodaServiceFactory() override; - - // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( - content::BrowserContext* profile) const override; -}; - -#endif // CHROME_BROWSER_SODA_SODA_SERVICE_FACTORY_H_
diff --git a/chrome/browser/speech/speech_recognition_service.cc b/chrome/browser/speech/speech_recognition_service.cc new file mode 100644 index 0000000..b2f1d9b --- /dev/null +++ b/chrome/browser/speech/speech_recognition_service.cc
@@ -0,0 +1,43 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/speech/speech_recognition_service.h" + +#include "chrome/grit/generated_resources.h" +#include "content/public/browser/service_process_host.h" + +namespace speech { + +constexpr base::TimeDelta kIdleProcessTimeout = base::TimeDelta::FromSeconds(5); + +SpeechRecognitionService::SpeechRecognitionService() = default; +SpeechRecognitionService::~SpeechRecognitionService() = default; + +void SpeechRecognitionService::Create( + mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> receiver) { + LaunchIfNotRunning(); + speech_recognition_service_->BindContext(std::move(receiver)); +} + +void SpeechRecognitionService::LaunchIfNotRunning() { + if (speech_recognition_service_.is_bound()) + return; + + content::ServiceProcessHost::Launch( + speech_recognition_service_.BindNewPipeAndPassReceiver(), + content::ServiceProcessHost::Options() + .WithDisplayName(IDS_UTILITY_PROCESS_SPEECH_RECOGNITION_SERVICE_NAME) + .WithSandboxType(service_manager::SandboxType::kSpeechRecognition) + .Pass()); + + // Ensure that if the interface is ever disconnected (e.g. the service + // process crashes) or goes idle for a short period of time -- meaning there + // are no in-flight messages and no other interfaces bound through this + // one -- then we will reset |remote|, causing the service process to be + // terminated if it isn't already. + speech_recognition_service_.reset_on_disconnect(); + speech_recognition_service_.reset_on_idle_timeout(kIdleProcessTimeout); +} + +} // namespace speech
diff --git a/chrome/browser/speech/speech_recognition_service.h b/chrome/browser/speech/speech_recognition_service.h new file mode 100644 index 0000000..25f308e --- /dev/null +++ b/chrome/browser/speech/speech_recognition_service.h
@@ -0,0 +1,39 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_SERVICE_H_ +#define CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_SERVICE_H_ + +#include "components/keyed_service/core/keyed_service.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace speech { + +// Provides a mojo endpoint in the browser that allows the renderer process to +// launch and initialize the sandboxed speech recognition service +// process. +class SpeechRecognitionService : public KeyedService { + public: + SpeechRecognitionService(); + SpeechRecognitionService(const SpeechRecognitionService&) = delete; + SpeechRecognitionService& operator=(const SpeechRecognitionService&) = delete; + ~SpeechRecognitionService() override; + + void Create( + mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> receiver); + + private: + // Launches the speech recognition service in a sandboxed utility process. + void LaunchIfNotRunning(); + + // The remote to the speech recognition service. The browser will not launch a + // new speech recognition service process if this remote is already bound. + mojo::Remote<media::mojom::SpeechRecognitionService> + speech_recognition_service_; +}; + +} // namespace speech + +#endif // CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_SERVICE_H_
diff --git a/chrome/browser/speech/speech_recognition_service_factory.cc b/chrome/browser/speech/speech_recognition_service_factory.cc new file mode 100644 index 0000000..0e40e1f --- /dev/null +++ b/chrome/browser/speech/speech_recognition_service_factory.cc
@@ -0,0 +1,36 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/speech/speech_recognition_service_factory.h" + +#include "base/no_destructor.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/speech/speech_recognition_service.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" + +// static +speech::SpeechRecognitionService* +SpeechRecognitionServiceFactory::GetForProfile(Profile* profile) { + return static_cast<speech::SpeechRecognitionService*>( + GetInstance()->GetServiceForBrowserContext(profile, true)); +} + +// static +SpeechRecognitionServiceFactory* +SpeechRecognitionServiceFactory::GetInstance() { + static base::NoDestructor<SpeechRecognitionServiceFactory> instance; + return instance.get(); +} + +SpeechRecognitionServiceFactory::SpeechRecognitionServiceFactory() + : BrowserContextKeyedServiceFactory( + "SpeechRecognitionService", + BrowserContextDependencyManager::GetInstance()) {} + +SpeechRecognitionServiceFactory::~SpeechRecognitionServiceFactory() = default; + +KeyedService* SpeechRecognitionServiceFactory::BuildServiceInstanceFor( + content::BrowserContext* profile) const { + return new speech::SpeechRecognitionService(); +}
diff --git a/chrome/browser/speech/speech_recognition_service_factory.h b/chrome/browser/speech/speech_recognition_service_factory.h new file mode 100644 index 0000000..6ef9f781 --- /dev/null +++ b/chrome/browser/speech/speech_recognition_service_factory.h
@@ -0,0 +1,40 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_SERVICE_FACTORY_H_ + +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +class Profile; + +namespace base { +template <class T> +class NoDestructor; +} // namespace base + +namespace speech { +class SpeechRecognitionService; +} // namespace speech + +// Factory to get or create an instance of SpeechRecognitionServiceFactory from +// a Profile. +class SpeechRecognitionServiceFactory + : public BrowserContextKeyedServiceFactory { + public: + static speech::SpeechRecognitionService* GetForProfile(Profile* profile); + + private: + friend class base::NoDestructor<SpeechRecognitionServiceFactory>; + static SpeechRecognitionServiceFactory* GetInstance(); + + SpeechRecognitionServiceFactory(); + ~SpeechRecognitionServiceFactory() override; + + // BrowserContextKeyedServiceFactory: + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* profile) const override; +}; + +#endif // CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_SERVICE_FACTORY_H_
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index bb81d58..dac79f8 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -4180,6 +4180,8 @@ } if (enable_print_preview) { sources += [ + "webui/print_preview/cloud_print_signin.cc", + "webui/print_preview/cloud_print_signin.h", "webui/print_preview/cloud_printer_handler.cc", "webui/print_preview/cloud_printer_handler.h", "webui/print_preview/extension_printer_handler.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 38ad0e8..cc89b4f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Geblokkeer op sommige werwe</translation> <translation id="3123734510202723619">Aankondigings</translation> <translation id="3137521801621304719">Verlaat incognitomodus</translation> -<translation id="3140134512074889489">Aktiveer asseblief jou kamera om 'n QR-kode te skandeer</translation> <translation id="3143515551205905069">Kanselleer sinkronisering</translation> <translation id="314939179385989105">Chrome se tuisblad</translation> <translation id="3157842584138209013">Sien deur die Meer Opsies-knoppie hoeveel data jy bespaar het</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index d7dd20c..a731e9e9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">በአንዳንድ ጣቢያዎች ላይ ታግዷል</translation> <translation id="3123734510202723619">ማስታወቂያዎች</translation> <translation id="3137521801621304719">ከማንነት የማያሳውቅ ሁነታ ይውጡ</translation> -<translation id="3140134512074889489">እባክዎ ካሜራዎን የQR ኮድን እንዲቃኝ ያንቁት</translation> <translation id="3143515551205905069">ስምረትን ሰርዝ</translation> <translation id="314939179385989105">የChrome መነሻ ገጽ</translation> <translation id="3157842584138209013">ከተጨማሪ አማራጮች አዝራር ላይ ምን ያህል ውሂብ እንዳስቀመጡ ይመልከቱ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index f1a4711..7320ac6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">حظر الإعلانات في بعض المواقع</translation> <translation id="3123734510202723619">الإعلامات</translation> <translation id="3137521801621304719">مغادرة وضع التصفح المتخفي</translation> -<translation id="3140134512074889489">يُرجى تفعيل الكاميرا لمسح رمز الاستجابة السريعة (QR) ضوئيًا.</translation> <translation id="3143515551205905069">إلغاء المزامنة</translation> <translation id="314939179385989105">الصفحة الرئيسية لمتصفّح Chrome</translation> <translation id="3157842584138209013">الاطّلاع على مقدار البيانات التي وفّرتها بالنقر على "مزيد من الخيارات"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 6107407..ebd8d3c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">কিছুমান ছাইটত অৱৰোধ কৰা আছে</translation> <translation id="3123734510202723619">ঘোষণাসমূহ</translation> <translation id="3137521801621304719">ইনক’গনিট’ ম’ডৰ পৰা বাহিৰ হওক</translation> -<translation id="3140134512074889489">অনুগ্ৰহ কৰি আপোনাৰ কেমেৰাটো এটা কিউআৰ ক’ড স্কেন কৰিবলৈ সক্ষম কৰক</translation> <translation id="3143515551205905069">ছিংক বাতিল কৰক</translation> <translation id="314939179385989105">Chromeৰ গৃহপৃষ্ঠা</translation> <translation id="3157842584138209013">অধিক বিকল্প বুটামটোলৈ গৈ আপুনি কিমান ডেটা ৰাহি কৰিলে সেয়া চাওক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index d0b4c89a..0fa20bfa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bəzi saytlarda bloklandı</translation> <translation id="3123734510202723619">Elanlar</translation> <translation id="3137521801621304719">Gizli rejimdən çıxın</translation> -<translation id="3140134512074889489">QR kodu skanlamaq üçün kameranızı aktivləşdirin</translation> <translation id="3143515551205905069">Sinxronizasiyanı ləğv edin</translation> <translation id="314939179385989105">Chrome’un əsas səhifəsi</translation> <translation id="3157842584138209013">Digər Seçimlər düyməsindən yadda saxladığınız data miqdarına baxın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 0baa91f..ec8a98b97 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Заблакіравана на некаторых сайтах</translation> <translation id="3123734510202723619">Апавяшчэнні</translation> <translation id="3137521801621304719">Выйсці з рэжыму інкогніта</translation> -<translation id="3140134512074889489">Каб адсканіраваць QR-код, уключыце камеру</translation> <translation id="3143515551205905069">Скасаваць сінхранізацыю</translation> <translation id="314939179385989105">Галоўная старонка Chrome</translation> <translation id="3157842584138209013">Глядзіце, колькі трафіка вы сэканомілі, з дапамогай кнопкі "Дадатковыя параметры"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 398ca3a..e5c0035 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Блокиране на някои сайтове</translation> <translation id="3123734510202723619">Съобщения</translation> <translation id="3137521801621304719">Напускане на режима „инкогнито“</translation> -<translation id="3140134512074889489">Моля, активирайте камерата, за да сканирате QR код</translation> <translation id="3143515551205905069">Анулиране на синхронизирането</translation> <translation id="314939179385989105">Началната страница на Chrome</translation> <translation id="3157842584138209013">Използвайте бутона „Още опции“, за да видите колко данни сте спестили</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 5d60519..ab5bb63 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">কিছু সাইটে ব্লক করা হয়েছে</translation> <translation id="3123734510202723619">ঘোষণা</translation> <translation id="3137521801621304719">ছদ্মবেশী মোড ছেড়ে যান</translation> -<translation id="3140134512074889489">একটি QR কোড স্ক্যান করতে, আপনার ক্যামেরা চালু করুন</translation> <translation id="3143515551205905069">সিঙ্ক বাতিল করুন</translation> <translation id="314939179385989105">Chrome-এর হোমপেজ</translation> <translation id="3157842584138209013">আরও বিকল্প বোতাম দিয়ে দেখুন আপনি কত ডেটা সাশ্রয় করেছেন</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index aa1799c..fca2359a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokirano na nekim web lokacijama</translation> <translation id="3123734510202723619">Najave</translation> <translation id="3137521801621304719">Napusti anonimni načina rada</translation> -<translation id="3140134512074889489">Omogućite kameri da skenira QR kôd</translation> <translation id="3143515551205905069">Otkaži sinhronizaciju</translation> <translation id="314939179385989105">Početna stranica Chromea</translation> <translation id="3157842584138209013">Pogledajte količinu podataka koju ste uštedjeli koristeći dugme Više opcija</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 72556098..d0c8276 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloquejat en alguns llocs web</translation> <translation id="3123734510202723619">Anuncis</translation> <translation id="3137521801621304719">Surt del mode d'incògnit</translation> -<translation id="3140134512074889489">Activa la càmera per escanejar un codi QR</translation> <translation id="3143515551205905069">Cancel·la la sincronització</translation> <translation id="314939179385989105">Pàgina d'inici de Chrome</translation> <translation id="3157842584138209013">Consulta la quantitat de dades que has estalviat des del botó Més opcions</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 6f247fe..04bc7086 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Na některých webech blokováno</translation> <translation id="3123734510202723619">Oznámení</translation> <translation id="3137521801621304719">Ukončit anonymní režim</translation> -<translation id="3140134512074889489">Chcete-li naskenovat QR kód, udělte přístup k fotoaparátu</translation> <translation id="3143515551205905069">Zrušit synchronizaci</translation> <translation id="314939179385989105">Domovská stránka Chromu</translation> <translation id="3157842584138209013">Informace o množství uspořených dat zobrazíte pomocí tlačítka Další možnosti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index b4cfddf..887139d4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokeret på visse websites</translation> <translation id="3123734510202723619">Meddelelser</translation> <translation id="3137521801621304719">Slå inkognitotilstand fra</translation> -<translation id="3140134512074889489">Aktivér scanning af QR-koder på dit kamera</translation> <translation id="3143515551205905069">Annuller synkronisering</translation> <translation id="314939179385989105">Chromes startside</translation> <translation id="3157842584138209013">Se, hvor meget data du har sparet via knappen Flere valgmuligheder</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index ef0a16a..ca5e443 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Auf einigen Websites blockiert</translation> <translation id="3123734510202723619">Ankündigungen</translation> <translation id="3137521801621304719">Inkognitomodus deaktivieren</translation> -<translation id="3140134512074889489">Bitte aktivieren Sie Ihre Kamera, um einen QR-Code zu scannen</translation> <translation id="3143515551205905069">Synchronisierung abbrechen</translation> <translation id="314939179385989105">Chrome-Startseite</translation> <translation id="3157842584138209013">Über die Schaltfläche "Weitere Optionen" können Sie sich ansehen, wie viel Datenvolumen Sie einsparen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 6f709050a..73fd468c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Αποκλεισμός σε ορισμένους ιστοτόπους</translation> <translation id="3123734510202723619">Ανακοινώσεις</translation> <translation id="3137521801621304719">Έξοδος από την κατάσταση ανώνυμης περιήγησης</translation> -<translation id="3140134512074889489">Ενεργοποιήστε την κάμερα για σάρωση ενός κωδικού QR</translation> <translation id="3143515551205905069">Ακύρωση συγχρονισμού</translation> <translation id="314939179385989105">Αρχική σελίδα του Chrome</translation> <translation id="3157842584138209013">Δείτε πόσα δεδομένα έχετε αποθηκεύσει από το κουμπί "Περισσότερες επιλογές"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 23a4c6d6..302da91 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blocked on some sites</translation> <translation id="3123734510202723619">Announcements</translation> <translation id="3137521801621304719">Leave incognito mode</translation> -<translation id="3140134512074889489">Please enable your camera to scan a QR code</translation> <translation id="3143515551205905069">Cancel sync</translation> <translation id="314939179385989105">Chrome’s homepage</translation> <translation id="3157842584138209013">See how much data you've saved from the More Options button</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 803757b..d3ef2d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloqueados en algunos sitios</translation> <translation id="3123734510202723619">Anuncios</translation> <translation id="3137521801621304719">Salir del modo de navegación de incógnito</translation> -<translation id="3140134512074889489">Habilita la cámara para escanear un código QR</translation> <translation id="3143515551205905069">Cancelar sincronización</translation> <translation id="314939179385989105">Página principal de Chrome</translation> <translation id="3157842584138209013">Para ver cuántos datos redujiste, selecciona el botón Más opciones</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index dcdab47..a9d7ade 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloqueados en algunos sitios web</translation> <translation id="3123734510202723619">Anuncios</translation> <translation id="3137521801621304719">Salir del modo de incógnito</translation> -<translation id="3140134512074889489">Habilita la cámara para escanear un código QR</translation> <translation id="3143515551205905069">Cancelar sincronización</translation> <translation id="314939179385989105">Página principal de Chrome</translation> <translation id="3157842584138209013">Consulta la cantidad de datos que has ahorrado con el botón Más opciones</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 85e19ac..7887891be 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokeeritud teatud saitidel</translation> <translation id="3123734510202723619">Teadaanded</translation> <translation id="3137521801621304719">Inkognito režiimist väljumine</translation> -<translation id="3140134512074889489">QR-koodi skannimiseks lubage oma kaamera</translation> <translation id="3143515551205905069">Tühista sünkroonimine</translation> <translation id="314939179385989105">Chrome'i avaleht</translation> <translation id="3157842584138209013">Nupu Rohkem valikuid abil saate vaadata, kui palju andmemahtu olete säästnud</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 72737b8..a4294d81 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Webgune batzuetan blokeatu dira iragarkiak</translation> <translation id="3123734510202723619">Iragarpenak</translation> <translation id="3137521801621304719">Irten ezkutuko modutik</translation> -<translation id="3140134512074889489">Gaitu kamera QR kode bat eskaneatzeko</translation> <translation id="3143515551205905069">Utzi sinkronizazioa bertan behera</translation> <translation id="314939179385989105">Chrome-ren hasierako pantaila</translation> <translation id="3157842584138209013">Sakatu "Aukera gehiago" botoia zenbat datu aurreztu dituzun ikusteko</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index b6be40b3..3b715095 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">در برخی سایتها مسدود میشود</translation> <translation id="3123734510202723619">اطلاعیهها</translation> <translation id="3137521801621304719">خروج از حالت ناشناس</translation> -<translation id="3140134512074889489">برای اسکن کردن کد QR، لطفاً دوربین را فعال کنید</translation> <translation id="3143515551205905069">لغو همگامسازی</translation> <translation id="314939179385989105">صفحه اصلی Chrome</translation> <translation id="3157842584138209013">با استفاده از دکمه «گزینههای بیشتر»، ببینید چه مقدار داده صرفهجویی کردهاید</translation> @@ -454,7 +453,7 @@ <translation id="4404568932422911380">هیچ نشانکی موجود نیست</translation> <translation id="4405224443901389797">انتقال به…</translation> <translation id="4411535500181276704">حالت ساده</translation> -<translation id="4415276339145661267">مدیریت حساب Google</translation> +<translation id="4415276339145661267">مدیریت «حساب Google»</translation> <translation id="4432792777822557199">از این به بعد، صفحههای <ph name="SOURCE_LANGUAGE" />، به <ph name="TARGET_LANGUAGE" /> ترجمه خواهند شد</translation> <translation id="4433925000917964731">صفحه سادهشده را Google ارائه کرده است</translation> <translation id="4434045419905280838">پنجرههای بازشو و هدایتها</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 50f634b..78dc126b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Estetty tietyillä sivustoilla</translation> <translation id="3123734510202723619">Ilmoitukset</translation> <translation id="3137521801621304719">Poistu incognito-tilasta</translation> -<translation id="3140134512074889489">Ota kamera käyttöön lukeaksesi QR-koodin</translation> <translation id="3143515551205905069">Peruuta synkronointi</translation> <translation id="314939179385989105">Chromen etusivu</translation> <translation id="3157842584138209013">Lisäasetukset-painiketta klikkaamalla voit katsoa, kuinka paljon dataa olet säästänyt.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index d245c0a..977f2f41 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Naka-block sa ilang site</translation> <translation id="3123734510202723619">Mga Anunsyo</translation> <translation id="3137521801621304719">Umalis sa mode na incognito</translation> -<translation id="3140134512074889489">Paki-enable ang iyong camera para mag-scan ng QR code</translation> <translation id="3143515551205905069">Kanselahin ang pag-sync</translation> <translation id="314939179385989105">Homepage ng Chrome</translation> <translation id="3157842584138209013">Tingnan kung gaano karaming data ang iyong natipid sa button ng Higit Pang Opsyon</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 7480bfa0..cecd224 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Annonces bloquées sur certains sites</translation> <translation id="3123734510202723619">Annonces</translation> <translation id="3137521801621304719">Désactiver le mode de navigation privée</translation> -<translation id="3140134512074889489">Veuillez activer votre appareil photo pour numériser un code QR</translation> <translation id="3143515551205905069">Annuler la synchronisation</translation> <translation id="314939179385989105">Page d'accueil de Chrome</translation> <translation id="3157842584138209013">Affichez la quantité de données enregistrées à partir du bouton Plus d'options</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 1a4f533..f4a05136 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloqué sur certains sites</translation> <translation id="3123734510202723619">Annonces</translation> <translation id="3137521801621304719">Désactiver le mode navigation privée</translation> -<translation id="3140134512074889489">Veuillez activer votre appareil photo pour scanner un code QR</translation> <translation id="3143515551205905069">Annuler la synchronisation</translation> <translation id="314939179385989105">Page d'accueil de Chrome</translation> <translation id="3157842584138209013">Découvrez la quantité de données économisées en cliquant sur le bouton "Plus d'options"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 4fff92e..7f635ee 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Anuncios bloqueados nalgúns sitios</translation> <translation id="3123734510202723619">Avisos</translation> <translation id="3137521801621304719">Sae do modo de incógnito</translation> -<translation id="3140134512074889489">Activa a cámara para escanear un código QR</translation> <translation id="3143515551205905069">Cancelar sincronización</translation> <translation id="314939179385989105">Páxina de inicio de Chrome</translation> <translation id="3157842584138209013">Comproba a cantidade de datos que aforraches a través do botón Máis opcións</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 0cddb24..15c9267 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">કેટલીક સાઇટ પર બ્લૉક કરેલ</translation> <translation id="3123734510202723619">ઘોષણાઓ</translation> <translation id="3137521801621304719">છુપા મોડને છોડો</translation> -<translation id="3140134512074889489">કોઈ QR કોડ સ્કૅન કરવા માટે, કૃપા કરીને તમારો કૅમેરા ચાલુ કરો</translation> <translation id="3143515551205905069">સિંક કરવાનું રદ કરો</translation> <translation id="314939179385989105">Chromeનું હોમપેજ</translation> <translation id="3157842584138209013">વધુ વિકલ્પો બટનની મદદથી તમે કેટલો ડેટા સાચવ્યો તે જુઓ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index b26a285f..0db4c162 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">कुछ साइटों पर ब्लॉक किए गए हैं</translation> <translation id="3123734510202723619">एलान</translation> <translation id="3137521801621304719">गुप्त मोड छोड़ें</translation> -<translation id="3140134512074889489">क्यूआर कोड स्कैन करने के लिए, कृपया कैमरा चालू करें</translation> <translation id="3143515551205905069">लिंक करना रोक दें</translation> <translation id="314939179385989105">Chrome का होम पेज</translation> <translation id="3157842584138209013">ज़्यादा विकल्प बटन से देखें कि आपने कितना डेटा बचाया है</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 7eb5101..7d84440 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokirano na nekim web-lokacijama</translation> <translation id="3123734510202723619">Najave</translation> <translation id="3137521801621304719">Izlaz iz anonimnog načina</translation> -<translation id="3140134512074889489">Dopustite kameri da skenira QR kôd</translation> <translation id="3143515551205905069">Otkaži sinkronizaciju</translation> <translation id="314939179385989105">Početna stranica Chromea</translation> <translation id="3157842584138209013">Pogledajte količinu ušteđenih podataka pomoću gumba Više opcija</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index c7f990e..41634ea 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Letiltva egyes webhelyeken</translation> <translation id="3123734510202723619">Hirdetmények</translation> <translation id="3137521801621304719">Kilépés inkognitómódból</translation> -<translation id="3140134512074889489">A QR-kód beolvasásához adjon engedélyt a kamera használatára</translation> <translation id="3143515551205905069">Szinkronizálás megszakítása</translation> <translation id="314939179385989105">A Chrome kezdőlapja</translation> <translation id="3157842584138209013">A További lehetőségek gombra kattintva tekintheti meg, hogy mekkora a megtakarított adatmennyiség</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index 548e7fd..dbf2f940 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Արգելափակված է որոշ կայքերում</translation> <translation id="3123734510202723619">Հայտարարություններ</translation> <translation id="3137521801621304719">Դուրս գալ ինկոգնիտո ռեժիմից</translation> -<translation id="3140134512074889489">Միացրեք տեսախցիկը՝ QR կոդը սկանավորելու համար</translation> <translation id="3143515551205905069">Չեղարկել համաժամացումը</translation> <translation id="314939179385989105">Chrome-ի գլխավոր էջ</translation> <translation id="3157842584138209013">«Այլ ընտրանքներ» կոճակի միջոցով դիտեք պահված տվյալների ծավալը</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index bfc22ea..aadeab34 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Diblokir di beberapa situs</translation> <translation id="3123734510202723619">Pengumuman</translation> <translation id="3137521801621304719">Tutup mode samaran</translation> -<translation id="3140134512074889489">Aktifkan kamera Anda untuk memindai kode QR</translation> <translation id="3143515551205905069">Batalkan sinkronisasi</translation> <translation id="314939179385989105">Halaman beranda Chrome</translation> <translation id="3157842584138209013">Lihat banyaknya kuota yang Anda hemat dari tombol Opsi Lainnya</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 2b7e00f0..8af817b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Útilokaðar á sumum vefsvæðum</translation> <translation id="3123734510202723619">Tilkynningar</translation> <translation id="3137521801621304719">Slökkva á huliðsstillingu</translation> -<translation id="3140134512074889489">Kveiktu á myndavélinni þinni til að skanna QR-kóða</translation> <translation id="3143515551205905069">Hætta við samstillingu</translation> <translation id="314939179385989105">Heimasíða Chrome</translation> <translation id="3157842584138209013">Skoða hversu mikið af gagnamagni þú hefur sparað undir hnappinum „Fleiri valkostir“</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index 3a51b99..1fa778f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloccati su alcuni siti</translation> <translation id="3123734510202723619">Annunci</translation> <translation id="3137521801621304719">Esci dalla modalità di navigazione in incognito</translation> -<translation id="3140134512074889489">Consenti l'uso della fotocamera per scansionare un codice QR</translation> <translation id="3143515551205905069">Annulla sincronizzazione</translation> <translation id="314939179385989105">Pagina iniziale di Chrome</translation> <translation id="3157842584138209013">Scopri la quantità di dati risparmiata usando il pulsante Altre opzioni</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 92acf3b..7e77fa9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">חסומות בחלק מהאתרים</translation> <translation id="3123734510202723619">הודעות</translation> <translation id="3137521801621304719">צא ממצב גלישה בסתר</translation> -<translation id="3140134512074889489">יש להפעיל את המצלמה כדי לסרוק קוד QR</translation> <translation id="3143515551205905069">ביטול סנכרון</translation> <translation id="314939179385989105">דף הבית של Chrome</translation> <translation id="3157842584138209013">בעזרת הלחצן 'אפשרויות נוספות' אפשר לבדוק את החיסכון בצריכת נתונים</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 7df46833..1b168333 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">一部のサイトでブロックされています</translation> <translation id="3123734510202723619">お知らせ</translation> <translation id="3137521801621304719">シークレット モードを終了</translation> -<translation id="3140134512074889489">QR コードをスキャンするにはカメラを有効にしてください</translation> <translation id="3143515551205905069">同期をキャンセル</translation> <translation id="314939179385989105">Chrome のホームページ</translation> <translation id="3157842584138209013">[その他のオプション] からデータ削減量を確認できます</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index f6cd0aa..5bc51bfc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">დაბლოკილია ზოგიერთ საიტზე</translation> <translation id="3123734510202723619">განცხადებები</translation> <translation id="3137521801621304719">ინკოგნიტო რეჟიმის დატოვება</translation> -<translation id="3140134512074889489">QR კოდის სკანირებისთვის ჩართეთ კამერა</translation> <translation id="3143515551205905069">სინქრონიზაციის გაუქმება</translation> <translation id="314939179385989105">Chrome-ის მთავარი გვერდი</translation> <translation id="3157842584138209013">იხილეთ თქვენ მიერ დაზოგილი მონაცემების მოცულობა „დამატებითი ვარიანტების“ ღილაკის მეშვეობით</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 9aa8972..79873dd1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Кейбір сайттарда тыйым салынған</translation> <translation id="3123734510202723619">Хабарландырулар</translation> <translation id="3137521801621304719">Жасырын режимнен шығу</translation> -<translation id="3140134512074889489">QR кодын сканерлеу үшін камераңызды қосыңыз.</translation> <translation id="3143515551205905069">Синхрондаудан бас тарту</translation> <translation id="314939179385989105">Chrome браузерінің негізгі беті</translation> <translation id="3157842584138209013">"Басқа да опциялар" түймесі арқылы қанша деректер сақталғанын көріңіз</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 7b56b2f..daf9a1c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">បានទប់ស្កាត់នៅលើគេហទំព័រមួយចំនួន</translation> <translation id="3123734510202723619">សេចក្តីប្រកាស</translation> <translation id="3137521801621304719">ចាកចេញពីរបៀបអនាមិក</translation> -<translation id="3140134512074889489">សូមបើកកាមេរ៉ារបស់អ្នក ដើម្បីស្កេនកូដ QR</translation> <translation id="3143515551205905069">បោះបង់ការធ្វើសមកាលកម្ម</translation> <translation id="314939179385989105">ទំព័រដើមរបស់ Chrome</translation> <translation id="3157842584138209013">មើលចំនួនទិន្នន័យដែលអ្នកបានរក្សាទុកពីប៊ូតុងជម្រើសច្រើនទៀត</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index 890eeb0..57438c4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -291,7 +291,6 @@ <translation id="3123473560110926937">ಕೆಲವು ಸೈಟ್ಗಳಲ್ಲಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="3123734510202723619">ಪ್ರಕಟಣೆಗಳು</translation> <translation id="3137521801621304719">ಅದೃಶ್ಯ ಮೋಡ್ನಿಂದ ಹೊರಬನ್ನಿ</translation> -<translation id="3140134512074889489">QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="3143515551205905069">ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ರದ್ದುಪಡಿಸಿ</translation> <translation id="314939179385989105">Chrome ನ ಮುಖಪುಟ</translation> <translation id="3157842584138209013">ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳ ಬಟನ್ ಮೂಲಕ ನೀವು ಎಷ್ಟು ಡೇಟಾ ಉಳಿಸಿದ್ದಿರಾ ಎಂದು ನೋಡಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index fc6106ba..507520d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">일부 사이트에서 차단됨</translation> <translation id="3123734510202723619">공지사항</translation> <translation id="3137521801621304719">시크릿 모드 나가기</translation> -<translation id="3140134512074889489">카메라에서 QR 코드를 스캔하도록 허용하세요.</translation> <translation id="3143515551205905069">동기화 취소</translation> <translation id="314939179385989105">Chrome 홈페이지</translation> <translation id="3157842584138209013">추가 옵션 버튼에서 저장한 데이터의 양을 확인해보세요.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index caecce2..c9f3e4f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Айрым сайттарда бөгөттөлдү</translation> <translation id="3123734510202723619">Жарыялар</translation> <translation id="3137521801621304719">Жашыруун режимден чыгуу</translation> -<translation id="3140134512074889489">QR кодун скандоо үчүн камераны иштетиңиз</translation> <translation id="3143515551205905069">Шайкештештирүүнү жокко чыгаруу</translation> <translation id="314939179385989105">Chrome’дун башкы бети</translation> <translation id="3157842584138209013">"Дагы параметрлер" баскычын басып, канча трафикти үнөмдөп калганыңызды көрүңүз</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 018d7635..d2adb02 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">ບລັອກໃນບາງເວັບໄຊ</translation> <translation id="3123734510202723619">ການປະກາດ</translation> <translation id="3137521801621304719">ອອກຈາກໂໝດທີ່ບໍ່ເຜີຍຕົວຕົນ</translation> -<translation id="3140134512074889489">ກະລຸນາເປີດການນຳໃຊ້ກ້ອງຂອງທ່ານເພື່ອສະແກນລະຫັດ QR</translation> <translation id="3143515551205905069">ຍົກເລີກການຊິ້ງຂໍ້ມູນ</translation> <translation id="314939179385989105">ໜ້າຫຼັກຂອງ Chrome</translation> <translation id="3157842584138209013">ເບິ່ງວ່າທ່ານປະຢັດຂໍ້ມູນໄດ້ຫຼາຍປານໃດຈາກປຸ່ມຕົວເລືອກເພີ່ມເຕີມ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 572ca0b..c045a71 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Užblokuota kai kuriose svetainėse</translation> <translation id="3123734510202723619">Pranešimai</translation> <translation id="3137521801621304719">Išjungti inkognito režimą</translation> -<translation id="3140134512074889489">Įjunkite fotoaparatą, kad galėtumėte nuskaityti QR kodą</translation> <translation id="3143515551205905069">Atšaukti sinchronizavimą</translation> <translation id="314939179385989105">Pagrindinis „Chrome“ puslapis</translation> <translation id="3157842584138209013">Žr., kiek duomenų sutaupėte, spustelėję mygtuką „Daugiau parinkčių“</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index eea9da9..5a10a77 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloķētas dažās vietnēs</translation> <translation id="3123734510202723619">Paziņojumi</translation> <translation id="3137521801621304719">Iziet no inkognito režīma</translation> -<translation id="3140134512074889489">Iespējojiet piekļuvi kamerai, lai skenētu QR kodu.</translation> <translation id="3143515551205905069">Atcelt sinhronizāciju</translation> <translation id="314939179385989105">Chrome sākumlapa</translation> <translation id="3157842584138209013">Izmantojiet pogu Vairāk opciju, lai uzzinātu ietaupīto datu apjomu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index b21004f..b8e5f129 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Блокирано на некои сајтови</translation> <translation id="3123734510202723619">Соопштенија</translation> <translation id="3137521801621304719">Напушти го инкогнито-режимот</translation> -<translation id="3140134512074889489">Овозможете ја камерата за да го скенирате QR-кодот</translation> <translation id="3143515551205905069">Откажи ја синхронизацијата</translation> <translation id="314939179385989105">Почетна страница на Chrome</translation> <translation id="3157842584138209013">Видете колку мобилен интернет сте заштедиле преку копчето „Повеќе опции“</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index d758cac..42109195 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">ചില സൈറ്റുകളിൽ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു</translation> <translation id="3123734510202723619">അറിയിപ്പുകൾ</translation> <translation id="3137521801621304719">അദൃശ്യ മോഡ് വിടുക</translation> -<translation id="3140134512074889489">QR കോഡ് സ്കാൻ ചെയ്യാൻ നിങ്ങളുടെ ക്യാമറ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3143515551205905069">സമന്വയം റദ്ദാക്കുക</translation> <translation id="314939179385989105">Chrome-ന്റെ ഹോംപേജ്</translation> <translation id="3157842584138209013">'കൂടുതൽ ഓപ്ഷനുകൾ' ബട്ടണിൽ നിങ്ങൾ എത്ര ഡാറ്റ ലാഭിച്ചെന്ന് കാണുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index b1f7d7f..1fd2b867 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Зарим сайт дээр блоклосон</translation> <translation id="3123734510202723619">Зарлал</translation> <translation id="3137521801621304719">Нууцлалын горимыг орхих</translation> -<translation id="3140134512074889489">Хурдан хариу үйлдлийн кодыг скан хийхийн тулд камераа идэвхжүүлнэ үү</translation> <translation id="3143515551205905069">Синкийг цуцлах</translation> <translation id="314939179385989105">Chrome-н нүүр хуудас</translation> <translation id="3157842584138209013">Бусад сонголт товчлуураас ямар хэмжээний дата хэмнэснээ харах</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 21f3bff..7459efb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">काही साइटवर ब्लॉक केले आहे</translation> <translation id="3123734510202723619">घोषणा</translation> <translation id="3137521801621304719">गुप्त मोड सोडा</translation> -<translation id="3140134512074889489">कृपया QR कोड स्कॅन करण्यासाठी तुमचा कॅमेरा सुरू करा</translation> <translation id="3143515551205905069">सिंक रद्द करा</translation> <translation id="314939179385989105">Chrome चे होम पेज</translation> <translation id="3157842584138209013">आणिखी पर्याय बटणावरून तुम्ही किती डेटा सेव्ह केला आहे ते पहा</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index a1dd49c61..a6e9ec8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Disekat di sesetengah tapak</translation> <translation id="3123734510202723619">Pengumuman</translation> <translation id="3137521801621304719">Tinggalkan mod inkognito</translation> -<translation id="3140134512074889489">Sila dayakan kamera anda untuk mengimbas kod QR</translation> <translation id="3143515551205905069">Batalkan penyegerakan</translation> <translation id="314939179385989105">Halaman utama Chrome</translation> <translation id="3157842584138209013">Lihat jumlah data yang dapat dijimatkan daripada butang Lagi Pilihan</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 1077b05e..b903381 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">အချို့ဝဘ်ဆိုက်များတွင် ပိတ်ထားသည်</translation> <translation id="3123734510202723619">ကြေညာချက်များ</translation> <translation id="3137521801621304719">ရုပ်ဖျက် မုဒ်ကို စွန့်ခွာရန်</translation> -<translation id="3140134512074889489">QR ကုဒ် စကင်ဖတ်ရန် သင့်ကင်မရာကို ဖွင့်ပါ</translation> <translation id="3143515551205905069">စင့်ခ်လုပ်ခြင်း ပယ်ဖျက်ရန်</translation> <translation id="314939179385989105">Chrome ၏ ပင်မစာမျက်နှာ</translation> <translation id="3157842584138209013">နောက်ထပ်ရွေးချယ်စရာခလုတ် မှတစ်ဆင့် သင်ချွေတာလိုက်သည့် ဒေတာပမာဏကို ကြည့်ပါ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 323e7920..bf80d918 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">केही साइटका हकमा रोक लगाइएको छ</translation> <translation id="3123734510202723619">घोषणाहरू</translation> <translation id="3137521801621304719">इनकगनिटो मोडलाई छोड्नुहोस्</translation> -<translation id="3140134512074889489">QR कोड स्क्यान गर्न कृपया आफ्नो क्यामेरा सक्षम पार्नुहोस्</translation> <translation id="3143515551205905069">सिंक रद्द गर्नुहोस्</translation> <translation id="314939179385989105">Chrome को गृहपृष्ठ</translation> <translation id="3157842584138209013">थप विकल्पहरू नामक बटनमार्फत आफूले सुरक्षित गरेको डेटाको मात्रा हेर्नुहोस्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index a919f4ff..451de8b76 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Geblokkeerd op bepaalde sites</translation> <translation id="3123734510202723619">Aankondigingen</translation> <translation id="3137521801621304719">Incognitomodus verlaten</translation> -<translation id="3140134512074889489">Schakel je camera in om een QR-code te scannen</translation> <translation id="3143515551205905069">Synchronisatie annuleren</translation> <translation id="314939179385989105">Homepage van Chrome</translation> <translation id="3157842584138209013">Via de knop 'Meer opties' kun je zien hoeveel data je hebt bespaard</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index aa77827..2b72fa8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokkert på enkelte nettsteder</translation> <translation id="3123734510202723619">Kunngjøringer</translation> <translation id="3137521801621304719">Avslutt inkognitomodus</translation> -<translation id="3140134512074889489">Slå på kameraet for å skanne QR-koder</translation> <translation id="3143515551205905069">Avbryt synkronisering</translation> <translation id="314939179385989105">Startsiden for Chrome</translation> <translation id="3157842584138209013">Se hvor mye data du har spart, via Flere alternativer-knappen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index c0dbe93..20472e4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">କିଛି ସାଇଟ୍ଗୁଡ଼ିକରେ ଅବରୋଧ କରାଯାଇଛି</translation> <translation id="3123734510202723619">ଘୋଷଣାଗୁଡ଼ିକ</translation> <translation id="3137521801621304719">ଇନ୍କଗ୍ନିଟୋ ମୋଡ୍ ଛାଡ଼ନ୍ତୁ</translation> -<translation id="3140134512074889489">ଦୟାକରି ଏକ QR କୋଡ୍ ସ୍କାନ୍ କରିବା ପାଇଁ ଆପଣଙ୍କର କ୍ୟାମେରାକୁ ସକ୍ଷମ କରନ୍ତୁ</translation> <translation id="3143515551205905069">ସିଙ୍କ୍ ବାତିଲ୍ କରନ୍ତୁ</translation> <translation id="314939179385989105">Chromeର ମୂଳପୃଷ୍ଠା</translation> <translation id="3157842584138209013">ଅଧିକ ବିକଳ୍ପ ବଟନ୍ରୁ ଆପଣ କେତେ ଡାଟା ସେଭ୍ କରିଛନ୍ତି ଦେଖନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index f747f5f6..402f2da 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">ਕੁਝ ਸਾਈਟਾਂ 'ਤੇ ਬਲਾਕ ਕੀਤੇ ਗਏ</translation> <translation id="3123734510202723619">ਘੋਸ਼ਣਾਵਾਂ</translation> <translation id="3137521801621304719">ਗੁਮਨਾਮ ਮੋਡ ਛੱਡੋ</translation> -<translation id="3140134512074889489">ਕਿਰਪਾ ਕਰਕੇ QR ਕੋਡ ਸਕੈਨ ਕਰਨ ਲਈ ਆਪਣਾ ਕੈਮਰਾ ਚਾਲੂ ਕਰੋ</translation> <translation id="3143515551205905069">ਸਮਕਾਲੀਕਰਨ ਰੱਦ ਕਰੋ</translation> <translation id="314939179385989105">Chrome ਦਾ ਹੋਮਪੇਜ</translation> <translation id="3157842584138209013">'ਹੋਰ ਵਿਕਲਪ' ਬਟਨ ਤੋਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਬਚਾਏ ਗਏ ਡੈਟੇ ਦੀ ਮਾਤਰਾ ਦੇਖੋ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 285a5fe..b1778b1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokowane na niektórych stronach</translation> <translation id="3123734510202723619">Komunikaty</translation> <translation id="3137521801621304719">Wyłącz tryb incognito</translation> -<translation id="3140134512074889489">Włącz kamerę, by zeskanować kod QR</translation> <translation id="3143515551205905069">Anuluj synchronizację</translation> <translation id="314939179385989105">Strona główna Chrome</translation> <translation id="3157842584138209013">Sprawdź ilość zaoszczędzonych danych, używając przycisku Więcej opcji</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 7eb6dee..ecd18aa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloqueados em alguns sites</translation> <translation id="3123734510202723619">Anúncios</translation> <translation id="3137521801621304719">Sair do modo de navegação anônima</translation> -<translation id="3140134512074889489">Ative sua câmera para ler um código QR</translation> <translation id="3143515551205905069">Cancelar sincronização</translation> <translation id="314939179385989105">Página inicial do Chrome</translation> <translation id="3157842584138209013">Veja o volume de dados que você economizou no botão Mais opções</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 615fa668..94d45a1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bloqueado em alguns sites.</translation> <translation id="3123734510202723619">Anúncios</translation> <translation id="3137521801621304719">Sair do modo de navegação anónima</translation> -<translation id="3140134512074889489">Ative a câmara para ler um código QR.</translation> <translation id="3143515551205905069">Cancelar sincronização</translation> <translation id="314939179385989105">Página inicial do Chrome</translation> <translation id="3157842584138209013">Veja a quantidade de dados que poupou através do botão Mais opções.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 488e685..15671d9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blocate pe anumite site-uri</translation> <translation id="3123734510202723619">Anunțuri</translation> <translation id="3137521801621304719">Ieși din modul incognito</translation> -<translation id="3140134512074889489">Activează camera pentru a scana un cod QR</translation> <translation id="3143515551205905069">Anulează sincronizarea</translation> <translation id="314939179385989105">Pagina de pornire Chrome</translation> <translation id="3157842584138209013">Vezi ce volum de date ai economisit folosind butonul Mai multe opțiuni</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index c7de56e..2d98180 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Заблокировано на некоторых сайтах</translation> <translation id="3123734510202723619">Оповещения</translation> <translation id="3137521801621304719">Выключить режим инкогнито</translation> -<translation id="3140134512074889489">Разрешите камере сканировать QR-коды.</translation> <translation id="3143515551205905069">Отмена</translation> <translation id="314939179385989105">Главная страница Chrome</translation> <translation id="3157842584138209013">Чтобы узнать, сколько трафика вы сэкономили, нажмите кнопку "Ещё"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 3c189b33..df43456 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">සමහර වෙබ් අඩවිවල අවහිර කෙරේ</translation> <translation id="3123734510202723619">නිවේදන</translation> <translation id="3137521801621304719">අප්රසිද්ධ ප්රකාරයෙන් ඉවත් වන්න</translation> -<translation id="3140134512074889489">QR කේතයක් ස්කෑන් කිරීමට ඔබේ කැමරාව සබල කරන්න</translation> <translation id="3143515551205905069">සමමුහුර්තය අවලංගු කරන්න</translation> <translation id="314939179385989105">Chrome හි මුල් පිටුව</translation> <translation id="3157842584138209013">තවත් විකල්ප බොත්තමෙන් ඔබ කොපමණ දත්ත සුරැක ඇතිදැයි බලන්න</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 425c099d..e69505d7d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokované na niektorých weboch</translation> <translation id="3123734510202723619">Oznámenia</translation> <translation id="3137521801621304719">Ukončiť režim inkognito</translation> -<translation id="3140134512074889489">Ak chcete skenovať QR kód, povoľte svoj fotoaparát</translation> <translation id="3143515551205905069">Zrušiť synchronizáciu</translation> <translation id="314939179385989105">Domovská stránky Chromu</translation> <translation id="3157842584138209013">Ak chcete zistiť, koľko dát ste ušetrili, klepnite na tlačidlo Ďalšie možnosti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index c57c42b..b04900c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokirano na nekaterih spletnih mestih</translation> <translation id="3123734510202723619">Obvestila</translation> <translation id="3137521801621304719">Izklop načina brez beleženja zgodovine</translation> -<translation id="3140134512074889489">Omogočite fotoaparat, če želite optično prebrati kodo QR</translation> <translation id="3143515551205905069">Prekliči sinhronizacijo</translation> <translation id="314939179385989105">Chromova začetna stran</translation> <translation id="3157842584138209013">Če pritisnete gumb za več možnosti, si lahko ogledate, koliko prenosa podatkov ste prihranili</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index b435281e..1dacbcab 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bllokuar në disa sajte</translation> <translation id="3123734510202723619">Njoftime</translation> <translation id="3137521801621304719">Dil nga modaliteti "i fshehtë"</translation> -<translation id="3140134512074889489">Aktivizo kamerën për të skanuar një kod QR</translation> <translation id="3143515551205905069">Anulo sinkronizimin</translation> <translation id="314939179385989105">Faqja kryesore e Chrome</translation> <translation id="3157842584138209013">Shiko se sa të dhëna kurseve nga butoni "Më shumë opsione"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 450146d..139d0e3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blokirano na nekim sajtovima</translation> <translation id="3123734510202723619">Saopštenja</translation> <translation id="3137521801621304719">Izađi iz režima bez arhiviranja</translation> -<translation id="3140134512074889489">Omogućite kameru da biste skenirali QR kôd</translation> <translation id="3143515551205905069">Otkaži sinhronizaciju</translation> <translation id="314939179385989105">Chrome početna stranica</translation> <translation id="3157842584138209013">Pogledajte koliko ste podataka uštedeli pomoću dugmeta Još opcija</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index d478f61..836b7c8f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Блокирано на неким сајтовима</translation> <translation id="3123734510202723619">Саопштења</translation> <translation id="3137521801621304719">Изађи из режима без архивирања</translation> -<translation id="3140134512074889489">Омогућите камеру да бисте скенирали QR кôд</translation> <translation id="3143515551205905069">Откажи синхронизацију</translation> <translation id="314939179385989105">Chrome почетна страница</translation> <translation id="3157842584138209013">Погледајте колико сте података уштедели помоћу дугмета Још опција</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index a1312a6a..3cb9590f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Blockeras på vissa webbplatser</translation> <translation id="3123734510202723619">Meddelanden</translation> <translation id="3137521801621304719">Inaktivera inkognitoläge</translation> -<translation id="3140134512074889489">Aktivera kameran så att den kan läsa av en QR-kod</translation> <translation id="3143515551205905069">Avbryt synkronisering</translation> <translation id="314939179385989105">Chromes startsida</translation> <translation id="3157842584138209013">Under Fler alternativ kan du se hur mycket data du har sparat</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index ac92578..33482716 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Yamezuiwa kwenye baadhi ya tovuti</translation> <translation id="3123734510202723619">Matangazo</translation> <translation id="3137521801621304719">Ondoka kwenye hali fiche</translation> -<translation id="3140134512074889489">Tafadhali washa kamera yako ili uchanganue msimbo wa QR</translation> <translation id="3143515551205905069">Ghairi usawazishaji</translation> <translation id="314939179385989105">Ukurasa wa kwanza wa Chrome</translation> <translation id="3157842584138209013">Ona kiasi cha data ulichookoa kwa kubofya kitufe cha Chaguo Zaidi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index b88c66c..c02863d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -288,7 +288,6 @@ <translation id="3123473560110926937">சில தளங்களில் தடுக்கப்பட்டுள்ளன</translation> <translation id="3123734510202723619">அறிவிப்புகள்</translation> <translation id="3137521801621304719">மறைநிலையிலிருந்து வெளியேறு</translation> -<translation id="3140134512074889489">QR குறியீட்டை ஸ்கேன் செய்ய உங்கள் கேமராவை இயக்கவும்</translation> <translation id="3143515551205905069">ஒத்திசைவை ரத்துசெய்</translation> <translation id="314939179385989105">Chromeமின் முகப்புப்பக்கம்</translation> <translation id="3157842584138209013">மேலும் விருப்பங்கள் பொத்தானைப் பயன்படுத்தி, எவ்வளவு தரவைச் சேமித்துள்ளீர்கள் என்பதைப் பார்க்கலாம்</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 81e096b..ac62e99 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">కొన్ని సైట్లలో బ్లాక్ చేయబడింది</translation> <translation id="3123734510202723619">ప్రకటనలు</translation> <translation id="3137521801621304719">అజ్ఞాత మోడ్ నుండి నిష్క్రమించండి</translation> -<translation id="3140134512074889489">QR కోడ్ను స్కాన్ చేయడానికి దయచేసి మీ కెమెరాను ఎనేబుల్ చేయండి</translation> <translation id="3143515551205905069">సింక్ను రద్దు చేయి</translation> <translation id="314939179385989105">Chrome హోమ్ పేజీ</translation> <translation id="3157842584138209013">'మరిన్ని ఎంపికలు' బటన్ నుండి మీరు ఎంత డేటాను సేవ్ చేసారో చూడండి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 77a2559..91c7037 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">บล็อกในบางเว็บไซต์</translation> <translation id="3123734510202723619">ประกาศ</translation> <translation id="3137521801621304719">ออกจากโหมดไม่ระบุตัวตน</translation> -<translation id="3140134512074889489">โปรดเปิดใช้กล้องเพื่อสแกนคิวอาร์โค้ด</translation> <translation id="3143515551205905069">ยกเลิกการซิงค์</translation> <translation id="314939179385989105">หน้าแรกของ Chrome</translation> <translation id="3157842584138209013">ดูปริมาณอินเทอร์เน็ตที่คุณประหยัดไปได้จากปุ่มตัวเลือกเพิ่มเติม</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 0adab258..efdc179 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Bazı sitelerde engellendi</translation> <translation id="3123734510202723619">Duyurular</translation> <translation id="3137521801621304719">Gizli moddan çık</translation> -<translation id="3140134512074889489">QR kodunu taramak için lütfen kameranızı etkinleştirin</translation> <translation id="3143515551205905069">Senkronizasyonu iptal et</translation> <translation id="314939179385989105">Chrome’un ana sayfası</translation> <translation id="3157842584138209013">Diğer Seçenekler düğmesini kullanarak ne kadar veri tasarrufu sağladığınıza bakın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index ff387ecf7..74b4caf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Заблоковано на деяких сайтах</translation> <translation id="3123734510202723619">Оголошення</translation> <translation id="3137521801621304719">Вийти з режиму анонімного перегляду</translation> -<translation id="3140134512074889489">Щоб зісканувати QR-код, відкрийте камеру</translation> <translation id="3143515551205905069">Скасувати синхронізацію</translation> <translation id="314939179385989105">Головна сторінка Chrome</translation> <translation id="3157842584138209013">Перевірте обсяг збережених даних за допомогою кнопки "Більше опцій"</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 3b2232a..3e805f7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">بعض سائٹس پر مسدود ہے</translation> <translation id="3123734510202723619">اعلانات</translation> <translation id="3137521801621304719">پوشیدگی وضع ترک کریں</translation> -<translation id="3140134512074889489">QR کوڈ کو اسکین کرنے کے لیے براہ کرم اپنے کیمرے کو فعال کریں</translation> <translation id="3143515551205905069">مطابقت پذیری منسوخ کریں</translation> <translation id="314939179385989105">Chrome کا ہوم پیج</translation> <translation id="3157842584138209013">مزید اختیارات بٹن سے اپنا محفوظ کردہ ڈیٹا دیکھیں</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 0a05f0c..9c4cf2d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Ayrim saytlarda bloklangan</translation> <translation id="3123734510202723619">Xabarnomalar</translation> <translation id="3137521801621304719">Inkognito rejimidan chiqish</translation> -<translation id="3140134512074889489">QR kodni skanerlash uchun kamerani yoqing</translation> <translation id="3143515551205905069">Sinxronizatsiyani bekor qilish</translation> <translation id="314939179385989105">Chrome bosh sahifasi</translation> <translation id="3157842584138209013">Tejalgan trafik miqdorini bilish uchun “Boshqa parametrlar” tugmasini bosing</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 9e2b263f..e61f8e8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Đã chặn trên một số trang web</translation> <translation id="3123734510202723619">Thông báo</translation> <translation id="3137521801621304719">Thoát chế độ ẩn danh</translation> -<translation id="3140134512074889489">Vui lòng bật máy ảnh để quét mã QR</translation> <translation id="3143515551205905069">Hủy đồng bộ hóa</translation> <translation id="314939179385989105">Trang chủ của Chrome</translation> <translation id="3157842584138209013">Xem lượng dữ liệu bạn đã tiết kiệm được từ nút Tùy chọn khác</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 49849df..736ad59 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">已禁止部分网站显示广告</translation> <translation id="3123734510202723619">通告</translation> <translation id="3137521801621304719">退出隐身模式</translation> -<translation id="3140134512074889489">请启用您的摄像头以扫描二维码</translation> <translation id="3143515551205905069">取消同步</translation> <translation id="314939179385989105">Chrome 主页</translation> <translation id="3157842584138209013">通过“更多选项”按钮查看您已节省多少数据流量</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 2b76a01..c707ba0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">在部分網站上設定封鎖</translation> <translation id="3123734510202723619">公告</translation> <translation id="3137521801621304719">離開無痕模式</translation> -<translation id="3140134512074889489">請啟用相機以掃瞄二維條碼</translation> <translation id="3143515551205905069">取消同步處理</translation> <translation id="314939179385989105">Chrome 首頁</translation> <translation id="3157842584138209013">只要㩒一下 [更多選項] 按鈕,就可以翻查慳咗嘅數據用量</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 1d54dbb..256a938 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">在某些網站上設定封鎖</translation> <translation id="3123734510202723619">公告事項</translation> <translation id="3137521801621304719">離開無痕模式</translation> -<translation id="3140134512074889489">請啟用相機以掃描 QR 圖碼</translation> <translation id="3143515551205905069">取消同步處理</translation> <translation id="314939179385989105">Chrome 首頁</translation> <translation id="3157842584138209013">如要查看節省的數據用量,請點選 [更多選項] 按鈕</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index c0a6f647..d9ff4564 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -290,7 +290,6 @@ <translation id="3123473560110926937">Kuvinjelwe kwamanye amasayithi</translation> <translation id="3123734510202723619">Izimemezelo</translation> <translation id="3137521801621304719">Shiya imodi ye-incognito</translation> -<translation id="3140134512074889489">Sicela unike amandla ikhamera yakho ukuze iphequlule ikhodi ye-QR</translation> <translation id="3143515551205905069">Khansela ukuvumelanisa</translation> <translation id="314939179385989105">Ikhasi eliyisiqalo le-Chrome</translation> <translation id="3157842584138209013">Bona ukuthi wonge idatha engakanani kusuka kwinkinobho yezinketho eziningi</translation>
diff --git a/chrome/browser/ui/serial/OWNERS b/chrome/browser/ui/serial/OWNERS new file mode 100644 index 0000000..4ae83ca --- /dev/null +++ b/chrome/browser/ui/serial/OWNERS
@@ -0,0 +1,3 @@ +file://content/browser/serial/OWNERS + +# COMPONENT: Blink>Serial
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index 5e2f711..ed9376c9 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -96,11 +96,10 @@ #include "chrome/browser/notifications/win/notification_launch_id.h" #include "chrome/browser/ui/webui/settings/reset_settings_handler.h" #include "chrome/credential_provider/common/gcp_strings.h" -#endif - #if BUILDFLAG(ENABLE_PRINT_PREVIEW) -#include "chrome/browser/printing/print_dialog_cloud.h" -#endif +#include "chrome/browser/printing/print_dialog_cloud_win.h" +#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) +#endif // defined(OS_WIN) using content::BrowserThread; using content::ChildProcessSecurityPolicy; @@ -609,7 +608,7 @@ !IncognitoModePrefs::ShouldLaunchIncognito( command_line, last_used_profile->GetPrefs())); -#if BUILDFLAG(ENABLE_PRINT_PREVIEW) +#if defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) // If we are just displaying a print dialog we shouldn't open browser // windows. if (command_line.HasSwitch(switches::kCloudPrintFile) && @@ -618,7 +617,7 @@ command_line)) { silent_launch = true; } -#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) +#endif // defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) if (command_line.HasSwitch(switches::kValidateCrx)) { if (!process_startup) { @@ -964,17 +963,8 @@ return; } StartupBrowserCreator startup_browser_creator; - Profiles last_opened_profiles; -#if !defined(OS_CHROMEOS) - // On ChromeOS multiple profiles doesn't apply. - // If no browser windows are open, i.e. the browser is being kept alive in - // background mode or for other processing, restore |last_opened_profiles|. - if (chrome::GetTotalBrowserCount() == 0) - last_opened_profiles = profile_manager->GetLastOpenedProfiles(); -#endif // defined(OS_CHROMEOS) - startup_browser_creator.ProcessCmdLineImpl(command_line, cur_dir, - /*process_startup=*/false, profile, - last_opened_profiles); + startup_browser_creator.ProcessCmdLineImpl( + command_line, cur_dir, /*process_startup=*/false, profile, Profiles()); } // static
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index 991e6a03..95514bbc 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -19,7 +19,6 @@ #include "base/threading/thread_restrictions.h" #include "build/branding_buildflags.h" #include "build/build_config.h" -#include "chrome/app/chrome_command_ids.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_browsertest.h" @@ -126,6 +125,7 @@ #endif } + void DisableWelcomePages(const std::vector<Profile*>& profiles) { for (Profile* profile : profiles) profile->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, true); @@ -149,73 +149,6 @@ typedef base::Optional<policy::PolicyLevel> PolicyVariant; -// This class waits until all browser windows are closed, and then runs -// a quit closure. -class AllBrowsersClosedWaiter : public BrowserListObserver { - public: - explicit AllBrowsersClosedWaiter(base::OnceClosure quit_closure); - AllBrowsersClosedWaiter(const AllBrowsersClosedWaiter&) = delete; - AllBrowsersClosedWaiter& operator=(const AllBrowsersClosedWaiter&) = delete; - ~AllBrowsersClosedWaiter() override; - - // BrowserListObserver: - void OnBrowserRemoved(Browser* browser) override; - - private: - base::OnceClosure quit_closure_; -}; - -AllBrowsersClosedWaiter::AllBrowsersClosedWaiter(base::OnceClosure quit_closure) - : quit_closure_(std::move(quit_closure)) { - BrowserList::AddObserver(this); -} - -AllBrowsersClosedWaiter::~AllBrowsersClosedWaiter() { - BrowserList::RemoveObserver(this); -} - -void AllBrowsersClosedWaiter::OnBrowserRemoved(Browser* browser) { - if (chrome::GetTotalBrowserCount() == 0) - std::move(quit_closure_).Run(); -} - -// This class waits for a specified number of sessions to be restored. -class SessionsRestoredWaiter { - public: - explicit SessionsRestoredWaiter(base::OnceClosure quit_closure, - int num_session_restores_expected); - SessionsRestoredWaiter(const SessionsRestoredWaiter&) = delete; - SessionsRestoredWaiter& operator=(const SessionsRestoredWaiter&) = delete; - ~SessionsRestoredWaiter(); - - private: - // Callback for session restore notifications. - void OnSessionRestoreDone(int num_tabs_restored); - - // For automatically unsubscribing from callback-based notifications. - SessionRestore::CallbackSubscription callback_subscription_; - base::OnceClosure quit_closure_; - int num_session_restores_expected_; - int num_sessions_restored_ = 0; -}; - -SessionsRestoredWaiter::SessionsRestoredWaiter( - base::OnceClosure quit_closure, - int num_session_restores_expected) - : quit_closure_(std::move(quit_closure)), - num_session_restores_expected_(num_session_restores_expected) { - callback_subscription_ = SessionRestore::RegisterOnSessionRestoredCallback( - base::BindRepeating(&SessionsRestoredWaiter::OnSessionRestoreDone, - base::Unretained(this))); -} - -SessionsRestoredWaiter::~SessionsRestoredWaiter() = default; - -void SessionsRestoredWaiter::OnSessionRestoreDone(int num_tabs_restored) { - if (++num_sessions_restored_ == num_session_restores_expected_) - std::move(quit_closure_).Run(); -} - } // namespace class StartupBrowserCreatorTest : public extensions::ExtensionBrowserTest { @@ -926,85 +859,6 @@ ASSERT_EQ(0u, chrome::GetBrowserCount(profile_home2)); } -// This tests that opening multiple profiles with session restore enabled, -// shutting down, and then launching with kNoStartupWindow doesn't restore -// the previously opened profiles. -IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, RestoreWithNoStartupWindow) { - ASSERT_TRUE(embedded_test_server()->Start()); - - ProfileManager* profile_manager = g_browser_process->profile_manager(); - - // Create 2 more profiles. - base::FilePath dest_path1 = profile_manager->user_data_dir().Append( - FILE_PATH_LITERAL("New Profile 1")); - base::FilePath dest_path2 = profile_manager->user_data_dir().Append( - FILE_PATH_LITERAL("New Profile 2")); - - base::ScopedAllowBlockingForTesting allow_blocking; - Profile* profile1 = profile_manager->GetProfile(dest_path1); - ASSERT_TRUE(profile1); - Profile* profile2 = profile_manager->GetProfile(dest_path2); - ASSERT_TRUE(profile2); - - DisableWelcomePages({profile1, profile2}); - - // Set the profiles to open last visited pages. - SessionStartupPref pref_last(SessionStartupPref::LAST); - SessionStartupPref::SetStartupPref(profile1, pref_last); - SessionStartupPref::SetStartupPref(profile2, pref_last); - - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::SESSION_RESTORE, KeepAliveRestartOption::DISABLED); - - Profile* default_profile = browser()->profile(); - - // Open a page with profile1 and profile2. - Browser* browser1 = Browser::Create({Browser::TYPE_NORMAL, profile1, true}); - chrome::NewTab(browser1); - ui_test_utils::NavigateToURL(browser1, - embedded_test_server()->GetURL("/empty.html")); - - Browser* browser2 = Browser::Create({Browser::TYPE_NORMAL, profile2, true}); - chrome::NewTab(browser2); - ui_test_utils::NavigateToURL(browser2, - embedded_test_server()->GetURL("/empty.html")); - // Close the browsers. - chrome::ExecuteCommand(browser(), IDC_EXIT); - { - base::RunLoop run_loop; - AllBrowsersClosedWaiter waiter(run_loop.QuitClosure()); - run_loop.Run(); - } - base::CommandLine dummy(base::CommandLine::NO_PROGRAM); - dummy.AppendSwitch(switches::kNoStartupWindow); - - StartupBrowserCreator browser_creator; - std::vector<Profile*> last_opened_profiles = {profile1, profile2}; - browser_creator.Start(dummy, profile_manager->user_data_dir(), - default_profile, last_opened_profiles); - - // TODO(davidbienvenu): Waiting for some sort of browser is started - // notification would be better. But, we're not opening any browser - // windows, so we'd need to invent a new notification. - content::RunAllTasksUntilIdle(); - - // No browser windows should be opened. - EXPECT_EQ(chrome::GetBrowserCount(profile1), 0u); - EXPECT_EQ(chrome::GetBrowserCount(profile2), 0u); - - base::CommandLine empty(base::CommandLine::NO_PROGRAM); - base::RunLoop run_loop; - SessionsRestoredWaiter restore_waiter(run_loop.QuitClosure(), 2); - - StartupBrowserCreator::ProcessCommandLineAlreadyRunning(empty, {}, - dest_path1); - run_loop.Run(); - - // profile1 and profile2 browser windows should be opened. - EXPECT_EQ(chrome::GetBrowserCount(profile1), 1u); - EXPECT_EQ(chrome::GetBrowserCount(profile2), 1u); -} - // Flaky. See https://crbug.com/819976. IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, DISABLED_ProfilesLaunchedAfterCrash) {
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index e59b1f6..03d2b4e 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -619,7 +619,7 @@ bool process_startup, const std::vector<GURL>& cmd_line_urls) { // Don't open any browser windows if starting up in "background mode". - if (command_line_.HasSwitch(switches::kNoStartupWindow)) + if (process_startup && command_line_.HasSwitch(switches::kNoStartupWindow)) return; StartupTabs cmd_line_tabs;
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc b/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc index e8bf3b7..9b7144d 100644 --- a/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/session_crashed_bubble_view_browsertest.cc
@@ -66,8 +66,9 @@ #if !defined(OS_WIN) // Regression test for https://crbug.com/1042010, it should be possible to focus // the bubble with the "focus dialog" hotkey combination (Alt+Shift+A). +// Disabled due to flake: https://crbug.com/1068579 IN_PROC_BROWSER_TEST_F(SessionCrashedBubbleViewTest, - CanFocusBubbleWithFocusDialogHotkey) { + DISABLED_CanFocusBubbleWithFocusDialogHotkey) { ShowUi("SessionCrashedBubble"); views::FocusManager* focus_manager = crash_bubble_->GetFocusManager(); @@ -83,8 +84,9 @@ // Regression test for https://crbug.com/1042010, it should be possible to focus // the bubble with the "rotate pane focus" (F6) hotkey. +// Disabled due to flake: https://crbug.com/1068579 IN_PROC_BROWSER_TEST_F(SessionCrashedBubbleViewTest, - CanFocusBubbleWithRotatePaneFocusHotkey) { + DISABLED_CanFocusBubbleWithRotatePaneFocusHotkey) { ShowUi("SessionCrashedBubble"); views::FocusManager* focus_manager = crash_bubble_->GetFocusManager(); views::View* bubble_focused_view = crash_bubble_->GetInitiallyFocusedView();
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom index e885ce3..d665c9a 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -132,8 +132,6 @@ url.mojom.Url? animation_url; // Specification of the share button. DoodleShareButton share_button; - // URL displayed to users, which they can use to share the doodle. - url.mojom.Url share_url; }; // The contents of a doodle. @@ -148,8 +146,6 @@ struct Doodle { // The doodle content. DoodleContent content; - // Localized description of the doodle. - string description; }; // Used by the WebUI page to bootstrap bidirectional communication.
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc index 6f29605..3cdf9627 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -449,7 +449,6 @@ "data:image/png;base64,%s", logo->metadata.share_button_icon.c_str())); image_doodle_content->share_button->background_color = SkColorSetA(doodle_share_button_background_color, 255); - image_doodle_content->share_url = logo->metadata.short_link; doodle->content = new_tab_page::mojom::DoodleContent::NewImageDoodle( std::move(image_doodle_content)); } else if (logo->metadata.type == @@ -460,6 +459,5 @@ std::move(callback).Run(nullptr); return; } - doodle->description = logo->metadata.alt_text; std::move(callback).Run(std::move(doodle)); }
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc index 0204852e..775ab1e 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -52,7 +52,6 @@ .spec()); static constexpr webui::LocalizedString kStrings[] = { - {"doneButton", IDS_DONE}, {"title", IDS_NEW_TAB_TITLE}, {"undo", IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE}, @@ -81,6 +80,7 @@ {"customizeButton", IDS_NTP_CUSTOMIZE_BUTTON_LABEL}, {"customizeThisPage", IDS_NTP_CUSTOM_BG_CUSTOMIZE_NTP_LABEL}, {"defaultThemeLabel", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL}, + {"doneButton", IDS_DONE}, {"hideShortcuts", IDS_NTP_CUSTOMIZE_HIDE_SHORTCUTS_LABEL}, {"hideShortcutsDesc", IDS_NTP_CUSTOMIZE_HIDE_SHORTCUTS_DESC}, {"mostVisited", IDS_NTP_CUSTOMIZE_MOST_VISITED_LABEL}, @@ -115,12 +115,7 @@ {"searchBoxHint", IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD}, // Logo/doodle. - {"copyLink", IDS_NTP_DOODLE_SHARE_DIALOG_COPY_LABEL}, - {"doodleLink", IDS_NTP_DOODLE_SHARE_DIALOG_LINK_LABEL}, - {"email", IDS_NTP_DOODLE_SHARE_DIALOG_MAIL_LABEL}, - {"facebook", IDS_NTP_DOODLE_SHARE_DIALOG_FACEBOOK_LABEL}, {"shareDoodle", IDS_NTP_DOODLE_SHARE_LABEL}, - {"twitter", IDS_NTP_DOODLE_SHARE_DIALOG_TWITTER_LABEL}, }; AddLocalizedStringsBulk(source, kStrings);
diff --git a/chrome/browser/ui/webui/print_preview/cloud_print_signin.cc b/chrome/browser/ui/webui/print_preview/cloud_print_signin.cc new file mode 100644 index 0000000..d1fdcaf7 --- /dev/null +++ b/chrome/browser/ui/webui/print_preview/cloud_print_signin.cc
@@ -0,0 +1,76 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/print_preview/cloud_print_signin.h" + +#include "base/bind.h" +#include "base/macros.h" +#include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "components/cloud_devices/common/cloud_devices_urls.h" +#include "components/google/core/common/google_util.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_observer.h" + +namespace printing { + +namespace { + +class SignInObserver : public content::WebContentsObserver { + public: + SignInObserver(content::WebContents* web_contents, base::OnceClosure callback) + : WebContentsObserver(web_contents), callback_(std::move(callback)) {} + + private: + // Overridden from content::WebContentsObserver: + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override { + if (!navigation_handle->IsInMainFrame() || + !navigation_handle->HasCommitted()) { + return; + } + + if (cloud_devices::IsCloudPrintURL(navigation_handle->GetURL())) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&SignInObserver::OnSignIn, + weak_ptr_factory_.GetWeakPtr())); + } + } + + void WebContentsDestroyed() override { delete this; } + + void OnSignIn() { + std::move(callback_).Run(); + if (web_contents()) + web_contents()->Close(); + } + + base::OnceClosure callback_; + base::WeakPtrFactory<SignInObserver> weak_ptr_factory_{this}; + + DISALLOW_COPY_AND_ASSIGN(SignInObserver); +}; + +} // namespace + +void CreateCloudPrintSigninTab(Browser* browser, + bool add_account, + base::OnceClosure callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + GURL url = add_account ? cloud_devices::GetCloudPrintAddAccountURL() + : cloud_devices::GetCloudPrintSigninURL(); + content::WebContents* web_contents = browser->OpenURL(content::OpenURLParams( + google_util::AppendGoogleLocaleParam( + url, g_browser_process->GetApplicationLocale()), + content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, + ui::PAGE_TRANSITION_AUTO_BOOKMARK, false)); + // This observer will delete itself after destroying the WebContents. + new SignInObserver(web_contents, std::move(callback)); +} + +} // namespace printing
diff --git a/chrome/browser/ui/webui/print_preview/cloud_print_signin.h b/chrome/browser/ui/webui/print_preview/cloud_print_signin.h new file mode 100644 index 0000000..70aaeeaa --- /dev/null +++ b/chrome/browser/ui/webui/print_preview/cloud_print_signin.h
@@ -0,0 +1,22 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINT_SIGNIN_H_ +#define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINT_SIGNIN_H_ + +#include "base/callback_forward.h" + +class Browser; + +namespace printing { + +// Creates a tab with Google 'sign in' or 'add account' page, based on +// passed |add_account| value. +void CreateCloudPrintSigninTab(Browser* browser, + bool add_account, + base::OnceClosure callback); + +} // namespace printing + +#endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINT_SIGNIN_H_
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 1e5ace5d..c29a529 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -31,7 +31,6 @@ #include "chrome/browser/bad_message.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/printing/background_printing_manager.h" -#include "chrome/browser/printing/print_dialog_cloud.h" #include "chrome/browser/printing/print_error_dialog.h" #include "chrome/browser/printing/print_job_manager.h" #include "chrome/browser/printing/print_preview_dialog_controller.h" @@ -45,6 +44,7 @@ #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" +#include "chrome/browser/ui/webui/print_preview/cloud_print_signin.h" #include "chrome/browser/ui/webui/print_preview/pdf_printer_handler.h" #include "chrome/browser/ui/webui/print_preview/policy_settings.h" #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" @@ -965,7 +965,7 @@ #endif chrome::ScopedTabbedBrowserDisplayer displayer(profile); - print_dialog_cloud::CreateCloudPrintSigninTab( + CreateCloudPrintSigninTab( displayer.browser(), add_account, base::BindOnce(&PrintPreviewHandler::OnSignInTabClosed, weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc index 1e11b2d..038fb7b 100644 --- a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc +++ b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
@@ -54,8 +54,8 @@ return "Print Compositor"; case content::SandboxType::kAudio: return "Audio"; - case content::SandboxType::kSoda: - return "SODA"; + case content::SandboxType::kSpeechRecognition: + return "Speech Recognition"; case content::SandboxType::kProxyResolver: return "Proxy Resolver"; case content::SandboxType::kPdfConversion:
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 ab89d3c..731b35b 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1110,8 +1110,6 @@ {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION}, {"securityPageTitle", IDS_SETTINGS_SECURITY}, {"securityPageDescription", IDS_SETTINGS_SECURITY_DESCRIPTION}, - {"securityPageAdvancedSectionLabel", - IDS_SETTINGS_SECURITY_ADVANCED_SECTION_LABEL}, {"advancedProtectionProgramTitle", IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM}, {"advancedProtectionProgramDesc",
diff --git a/chrome/browser/usb/usb_browsertest.cc b/chrome/browser/usb/usb_browsertest.cc index 117454ad..18146e9ba 100644 --- a/chrome/browser/usb/usb_browsertest.cc +++ b/chrome/browser/usb/usb_browsertest.cc
@@ -296,7 +296,8 @@ EXPECT_EQ("", content::EvalJs(web_contents, "removedPromise")); } -IN_PROC_BROWSER_TEST_F(WebUsbTest, NavigateWithChooserCrossOrigin) { +// TODO(https://crbug.com/1069695): This is flaky on Linux, Mac, and Win. +IN_PROC_BROWSER_TEST_F(WebUsbTest, DISABLED_NavigateWithChooserCrossOrigin) { UseRealChooser(); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn index f237d92..e3ef3aa 100644 --- a/chrome/browser/vr/BUILD.gn +++ b/chrome/browser/vr/BUILD.gn
@@ -247,11 +247,14 @@ "platform_controller.h", "scheduler_browser_renderer_interface.h", "scheduler_delegate.h", + "service/xr_device_service.cc", + "service/xr_device_service.h", "sounds_manager_audio_delegate.cc", "sounds_manager_audio_delegate.h", "vr_export.h", "vr_web_contents_observer.cc", "vr_web_contents_observer.h", + "xr_test_utils.h", ] sources += [ @@ -343,6 +346,13 @@ "metrics/consent_flow_metrics_helper.h", "metrics/metrics_helper.cc", "metrics/metrics_helper.h", + "metrics/session_metrics_helper.cc", + "metrics/session_metrics_helper.h", + "metrics/session_timer.cc", + "metrics/session_timer.h", + "metrics/session_tracker.h", + "metrics/webxr_session_tracker.cc", + "metrics/webxr_session_tracker.h", "mode.h", "model/assets.cc", "model/assets.h", @@ -467,6 +477,7 @@ "gesture_detector_unittest.cc", "model/text_input_info_unittest.cc", "platform_ui_input_delegate_unittest.cc", + "service/xr_runtime_manager_unittest.cc", "speech_recognizer_unittest.cc", "test/paths.cc", "test/paths.h",
diff --git a/chrome/browser/vr/DEPS b/chrome/browser/vr/DEPS index a03351b..c3fea28 100644 --- a/chrome/browser/vr/DEPS +++ b/chrome/browser/vr/DEPS
@@ -5,6 +5,16 @@ "+cc/trees", "+chrome/android/features/vr/jni_headers", "+device/vr/util", + + # VRService is currently being moved to content/ so no new dependencies should + # be added. (Note that this rule is both here and chrome/browser/DEPS because + # we get access to it again since it's our own subdirectory).) + "-chrome/browser/vr/service", + + # Most metrics files will also be moving. + "-chrome/browser/vr/metrics", + "+chrome/browser/vr/metrics/consent_flow_metrics_helper.h", + "+chrome/browser/vr/metrics/metrics_helper.h", ] # Test files may access VRService as they will either move with it, or we can @@ -13,5 +23,8 @@ ".*test.*\.cc": [ "+device/vr/test/test_hook.h", "+third_party/openvr/src/headers/openvr.h", + ], + ".*mock.*" : [ + "+chrome/browser/vr/service", ] }
diff --git a/chrome/browser/vr/chrome_xr_integration_client.cc b/chrome/browser/vr/chrome_xr_integration_client.cc index c7651b0..cdbf224 100644 --- a/chrome/browser/vr/chrome_xr_integration_client.cc +++ b/chrome/browser/vr/chrome_xr_integration_client.cc
@@ -27,6 +27,8 @@ #endif // OS_WIN/OS_ANDROID namespace { +vr::ChromeXrIntegrationClient* g_instance = nullptr; + bool IsXrDeviceConsentPromptDisabledForTesting() { static bool is_xr_device_consent_prompt_disabled_for_testing = base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -52,6 +54,13 @@ } }; +ChromeXrIntegrationClient* ChromeXrIntegrationClient::GetInstance() { + if (!g_instance) + g_instance = new ChromeXrIntegrationClient(); + + return g_instance; +} + std::unique_ptr<content::XrInstallHelper> ChromeXrIntegrationClient::GetInstallHelper( device::mojom::XRDeviceId device_id) {
diff --git a/chrome/browser/vr/chrome_xr_integration_client.h b/chrome/browser/vr/chrome_xr_integration_client.h index df4abbb..2f576518 100644 --- a/chrome/browser/vr/chrome_xr_integration_client.h +++ b/chrome/browser/vr/chrome_xr_integration_client.h
@@ -37,6 +37,14 @@ mojo::PendingRemote<device::mojom::XRCompositorHost> compositor) override; #endif + // TODO(1031622): Once all consumers have been moved to content/, this should + // be removed, and those consumers should be updated to get this instance from + // the ContentBrowserClient. + // Nothing in this class should rely on this singleton behavior. + // This is simply created as a "Singleton" here to ensure that callers don't + // just create an instance of this and cache the value. + static ChromeXrIntegrationClient* GetInstance(); + private: ChromeXrIntegrationClient() = default; };
diff --git a/content/browser/xr/metrics/session_metrics_helper.cc b/chrome/browser/vr/metrics/session_metrics_helper.cc similarity index 93% rename from content/browser/xr/metrics/session_metrics_helper.cc rename to chrome/browser/vr/metrics/session_metrics_helper.cc index 9e04179..096564c 100644 --- a/content/browser/xr/metrics/session_metrics_helper.cc +++ b/chrome/browser/vr/metrics/session_metrics_helper.cc
@@ -2,18 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/metrics/session_metrics_helper.h" +#include "chrome/browser/vr/metrics/session_metrics_helper.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" -#include "content/browser/xr/metrics/session_timer.h" -#include "content/browser/xr/metrics/webxr_session_tracker.h" +#include "chrome/browser/vr/metrics/session_timer.h" +#include "chrome/browser/vr/metrics/webxr_session_tracker.h" +#include "components/ukm/content/source_url_recorder.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" #include "device/vr/public/cpp/session_mode.h" -namespace content { +namespace vr { namespace { @@ -70,10 +71,10 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!web_contents) - return nullptr; + return NULL; SessionMetricsHelperData* data = static_cast<SessionMetricsHelperData*>( web_contents->GetUserData(kSessionMetricsHelperDataKey)); - return data ? data->get() : nullptr; + return data ? data->get() : NULL; } // static @@ -113,9 +114,10 @@ webxr_inline_session_trackers_.end()); auto result = webxr_inline_session_trackers_.emplace( - session_id, std::make_unique<WebXRSessionTracker>( - std::make_unique<ukm::builders::XR_WebXR_Session>( - web_contents()->GetLastCommittedSourceId()))); + session_id, + std::make_unique<WebXRSessionTracker>( + std::make_unique<ukm::builders::XR_WebXR_Session>( + ukm::GetSourceIdForWebContentsDocument(web_contents())))); auto* tracker = result.first->second.get(); ReportInitialSessionData(tracker, session_options, enabled_features); @@ -150,7 +152,7 @@ webxr_immersive_session_tracker_ = std::make_unique<WebXRSessionTracker>( std::make_unique<ukm::builders::XR_WebXR_Session>( - web_contents()->GetLastCommittedSourceId())); + ukm::GetSourceIdForWebContentsDocument(web_contents()))); // TODO(https://crbug.com/1056930): Consider renaming the timers to something // that indicates both that these also record AR, and that these are no longer @@ -264,4 +266,4 @@ } } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/metrics/session_metrics_helper.h b/chrome/browser/vr/metrics/session_metrics_helper.h similarity index 90% rename from content/browser/xr/metrics/session_metrics_helper.h rename to chrome/browser/vr/metrics/session_metrics_helper.h index d88dcaf..c98a24b 100644 --- a/content/browser/xr/metrics/session_metrics_helper.h +++ b/chrome/browser/vr/metrics/session_metrics_helper.h
@@ -2,20 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_METRICS_SESSION_METRICS_HELPER_H_ -#define CONTENT_BROWSER_XR_METRICS_SESSION_METRICS_HELPER_H_ +#ifndef CHROME_BROWSER_VR_METRICS_SESSION_METRICS_HELPER_H_ +#define CHROME_BROWSER_VR_METRICS_SESSION_METRICS_HELPER_H_ #include <memory> #include <set> #include <unordered_map> #include "base/time/time.h" +#include "chrome/browser/vr/vr_base_export.h" #include "content/public/browser/web_contents_observer.h" #include "device/vr/public/mojom/vr_service.mojom-forward.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_source_id.h" -namespace content { +namespace vr { class SessionTimer; class WebXRSessionTracker; @@ -25,7 +26,8 @@ // metrics that require state monitoring, such as durations, but also tracks // data we want attached to that, such as number of videos watched and how the // session was started. -class SessionMetricsHelper : public content::WebContentsObserver { +class VR_BASE_EXPORT SessionMetricsHelper + : public content::WebContentsObserver { public: // Returns the SessionMetricsHelper singleton if it has been created for the // WebContents. @@ -84,6 +86,6 @@ int num_session_video_playback_ = 0; }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_METRICS_SESSION_METRICS_HELPER_H_ +#endif // CHROME_BROWSER_VR_METRICS_SESSION_METRICS_HELPER_H_
diff --git a/content/browser/xr/metrics/session_timer.cc b/chrome/browser/vr/metrics/session_timer.cc similarity index 95% rename from content/browser/xr/metrics/session_timer.cc rename to chrome/browser/vr/metrics/session_timer.cc index 1ab2475..6d8f2a60 100644 --- a/content/browser/xr/metrics/session_timer.cc +++ b/chrome/browser/vr/metrics/session_timer.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/metrics/session_timer.h" +#include "chrome/browser/vr/metrics/session_timer.h" #include "base/metrics/histogram_functions.h" -namespace content { +namespace vr { SessionTimer::SessionTimer(char const* histogram_name, base::TimeDelta gap_time, @@ -66,4 +66,4 @@ } } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/metrics/session_timer.h b/chrome/browser/vr/metrics/session_timer.h similarity index 88% rename from content/browser/xr/metrics/session_timer.h rename to chrome/browser/vr/metrics/session_timer.h index 6c1eee1..a8dddd7 100644 --- a/content/browser/xr/metrics/session_timer.h +++ b/chrome/browser/vr/metrics/session_timer.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_METRICS_SESSION_TIMER_H_ -#define CONTENT_BROWSER_XR_METRICS_SESSION_TIMER_H_ +#ifndef CHROME_BROWSER_VR_METRICS_SESSION_TIMER_H_ +#define CHROME_BROWSER_VR_METRICS_SESSION_TIMER_H_ #include "base/time/time.h" -namespace content { +namespace vr { // SessionTimer will monitor the time between calls to StartSession and // StopSession. It will combine multiple segments into a single session if they @@ -49,6 +49,6 @@ base::TimeDelta minimum_duration_; }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_METRICS_SESSION_TIMER_H_ +#endif // CHROME_BROWSER_VR_METRICS_SESSION_TIMER_H_
diff --git a/content/browser/xr/metrics/session_tracker.h b/chrome/browser/vr/metrics/session_tracker.h similarity index 89% rename from content/browser/xr/metrics/session_tracker.h rename to chrome/browser/vr/metrics/session_tracker.h index 38ee234..6f6d19e 100644 --- a/content/browser/xr/metrics/session_tracker.h +++ b/chrome/browser/vr/metrics/session_tracker.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_METRICS_SESSION_TRACKER_H_ -#define CONTENT_BROWSER_XR_METRICS_SESSION_TRACKER_H_ +#ifndef CHROME_BROWSER_VR_METRICS_SESSION_TRACKER_H_ +#define CHROME_BROWSER_VR_METRICS_SESSION_TRACKER_H_ #include <memory> #include <utility> @@ -12,7 +12,7 @@ #include "base/time/time.h" #include "services/metrics/public/cpp/ukm_builders.h" -namespace content { +namespace vr { // SessionTracker tracks UKM data for sessions and sends the data upon request. template <class T> @@ -64,6 +64,6 @@ base::Time stop_time_; }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_METRICS_SESSION_TRACKER_H_ +#endif // CHROME_BROWSER_VR_METRICS_SESSION_TRACKER_H_
diff --git a/content/browser/xr/metrics/session_tracker_unittest.cc b/chrome/browser/vr/metrics/session_tracker_unittest.cc similarity index 89% rename from content/browser/xr/metrics/session_tracker_unittest.cc rename to chrome/browser/vr/metrics/session_tracker_unittest.cc index 8c9088d..8e15199 100644 --- a/content/browser/xr/metrics/session_tracker_unittest.cc +++ b/chrome/browser/vr/metrics/session_tracker_unittest.cc
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/metrics/session_tracker.h" +#include "chrome/browser/vr/metrics/session_tracker.h" +#include "components/ukm/content/source_url_recorder.h" #include "testing/gtest/include/gtest/gtest.h" -namespace content { +namespace vr { class FakeUkmEvent { void Record(ukm::UkmRecorder* recorder) {} @@ -37,4 +38,4 @@ EXPECT_EQ(tracker.GetRoundedDurationInSeconds(), 7200); } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/metrics/webxr_session_tracker.cc b/chrome/browser/vr/metrics/webxr_session_tracker.cc similarity index 97% rename from content/browser/xr/metrics/webxr_session_tracker.cc rename to chrome/browser/vr/metrics/webxr_session_tracker.cc index 484b5d3..4b12b68 100644 --- a/content/browser/xr/metrics/webxr_session_tracker.cc +++ b/chrome/browser/vr/metrics/webxr_session_tracker.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/metrics/webxr_session_tracker.h" +#include "chrome/browser/vr/metrics/webxr_session_tracker.h" #include <utility> -namespace content { +namespace vr { WebXRSessionTracker::WebXRSessionTracker( std::unique_ptr<ukm::builders::XR_WebXR_Session> entry) @@ -112,4 +112,4 @@ break; } } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/metrics/webxr_session_tracker.h b/chrome/browser/vr/metrics/webxr_session_tracker.h similarity index 81% rename from content/browser/xr/metrics/webxr_session_tracker.h rename to chrome/browser/vr/metrics/webxr_session_tracker.h index 148762b..73a77bf 100644 --- a/content/browser/xr/metrics/webxr_session_tracker.h +++ b/chrome/browser/vr/metrics/webxr_session_tracker.h
@@ -2,21 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_METRICS_WEBXR_SESSION_TRACKER_H_ -#define CONTENT_BROWSER_XR_METRICS_WEBXR_SESSION_TRACKER_H_ +#ifndef CHROME_BROWSER_VR_METRICS_WEBXR_SESSION_TRACKER_H_ +#define CHROME_BROWSER_VR_METRICS_WEBXR_SESSION_TRACKER_H_ #include <memory> #include <set> -#include "content/browser/xr/metrics/session_tracker.h" +#include "chrome/browser/vr/metrics/session_tracker.h" +#include "chrome/browser/vr/vr_base_export.h" #include "device/vr/public/mojom/isolated_xr_service.mojom.h" #include "device/vr/public/mojom/vr_service.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" #include "services/metrics/public/cpp/ukm_builders.h" -namespace content { +namespace vr { -class WebXRSessionTracker +class VR_BASE_EXPORT WebXRSessionTracker : public SessionTracker<ukm::builders::XR_WebXR_Session>, device::mojom::XRSessionMetricsRecorder { public: @@ -46,6 +47,6 @@ mojo::Receiver<device::mojom::XRSessionMetricsRecorder> receiver_; }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_METRICS_WEBXR_SESSION_TRACKER_H_ +#endif // CHROME_BROWSER_VR_METRICS_WEBXR_SESSION_TRACKER_H_
diff --git a/chrome/browser/vr/service/DEPS b/chrome/browser/vr/service/DEPS new file mode 100644 index 0000000..5a0de0f --- /dev/null +++ b/chrome/browser/vr/service/DEPS
@@ -0,0 +1,24 @@ +include_rules = [ + "+device/vr", + + # Enumerate dependencies on chrome code for VRService, since these all either + # will need to be replaced or broken before the code can move. + "-chrome", + + # The below directories/files will either be moving or have a direct (known) + # replacement in content/ + "+chrome/browser/vr/service", + "+chrome/browser/vr/chrome_xr_integration_client.h", + "+chrome/browser/vr/metrics/session_metrics_helper.h", + "+chrome/browser/vr/vr_export.h", + "+chrome/browser/vr/xr_runtime_manager_statics.h", + "+chrome/browser/vr/xr_test_utils.h", +] + +specific_include_rules = { + "vr_service_impl\.*": [ + # Permissions Infra will be replaced with content corresponding values. + "+chrome/browser/profiles/profile.h", + "+chrome/browser/permissions/permission_manager_factory.h", + ] +}
diff --git a/chrome/browser/vr/service/OWNERS b/chrome/browser/vr/service/OWNERS new file mode 100644 index 0000000..e3fdeaa --- /dev/null +++ b/chrome/browser/vr/service/OWNERS
@@ -0,0 +1,5 @@ +alcooper@chromium.org +klausw@chromium.org + +# TEAM: xr-dev@chromium.org +# COMPONENT: Blink>WebXR
diff --git a/content/browser/xr/service/browser_xr_runtime_impl.cc b/chrome/browser/vr/service/browser_xr_runtime_impl.cc similarity index 98% rename from content/browser/xr/service/browser_xr_runtime_impl.cc rename to chrome/browser/vr/service/browser_xr_runtime_impl.cc index 81479637..3783f84 100644 --- a/content/browser/xr/service/browser_xr_runtime_impl.cc +++ b/chrome/browser/vr/service/browser_xr_runtime_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/service/browser_xr_runtime_impl.h" +#include "chrome/browser/vr/service/browser_xr_runtime_impl.h" #include <algorithm> #include <memory> @@ -11,8 +11,8 @@ #include "base/bind_helpers.h" #include "base/numerics/ranges.h" #include "build/build_config.h" -#include "content/browser/xr/service/vr_service_impl.h" -#include "content/browser/xr/xr_utils.h" +#include "chrome/browser/vr/chrome_xr_integration_client.h" +#include "chrome/browser/vr/service/vr_service_impl.h" #include "content/public/browser/xr_install_helper.h" #include "content/public/browser/xr_integration_client.h" #include "content/public/common/content_features.h" @@ -22,7 +22,8 @@ #include "ui/gfx/transform.h" #include "ui/gfx/transform_util.h" -namespace content { +namespace vr { + namespace { bool IsValidTransform(const gfx::Transform& transform, float max_translate_meters) { @@ -226,7 +227,7 @@ // TODO(crbug.com/1031622): Convert this to a query for the client off of // ContentBrowserClient once BrowserXRRuntimeImpl moves to content. - auto* integration_client = GetXrIntegrationClient(); + auto* integration_client = ChromeXrIntegrationClient::GetInstance(); if (integration_client) { install_helper_ = integration_client->GetInstallHelper(id_); @@ -573,4 +574,4 @@ StopImmersiveSession(base::DoNothing()); } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/service/browser_xr_runtime_impl.h b/chrome/browser/vr/service/browser_xr_runtime_impl.h similarity index 94% rename from content/browser/xr/service/browser_xr_runtime_impl.h rename to chrome/browser/vr/service/browser_xr_runtime_impl.h index 8766cd6..8522b26c 100644 --- a/content/browser/xr/service/browser_xr_runtime_impl.h +++ b/chrome/browser/vr/service/browser_xr_runtime_impl.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_SERVICE_BROWSER_XR_RUNTIME_IMPL_H_ -#define CONTENT_BROWSER_XR_SERVICE_BROWSER_XR_RUNTIME_IMPL_H_ +#ifndef CHROME_BROWSER_VR_SERVICE_BROWSER_XR_RUNTIME_IMPL_H_ +#define CHROME_BROWSER_VR_SERVICE_BROWSER_XR_RUNTIME_IMPL_H_ #include <set> #include <vector> #include "base/observer_list.h" #include "base/observer_list_types.h" -#include "content/browser/xr/service/vr_service_impl.h" +#include "chrome/browser/vr/service/vr_service_impl.h" #include "content/public/browser/browser_xr_runtime.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/xr_consent_helper.h" @@ -25,7 +25,7 @@ class XrInstallHelper; } // namespace content -namespace content { +namespace vr { // This class wraps a physical device's interfaces, and registers for events. // There is one BrowserXRRuntimeImpl per physical device runtime. It manages // browser-side handling of state, like which VRServiceImpl is listening for @@ -126,6 +126,6 @@ base::WeakPtrFactory<BrowserXRRuntimeImpl> weak_ptr_factory_{this}; }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_SERVICE_BROWSER_XR_RUNTIME_IMPL_H_ +#endif // CHROME_BROWSER_VR_SERVICE_BROWSER_XR_RUNTIME_IMPL_H_
diff --git a/content/browser/xr/service/isolated_device_provider.cc b/chrome/browser/vr/service/isolated_device_provider.cc similarity index 91% rename from content/browser/xr/service/isolated_device_provider.cc rename to chrome/browser/vr/service/isolated_device_provider.cc index aae1ae6c6..e69b6af 100644 --- a/content/browser/xr/service/isolated_device_provider.cc +++ b/chrome/browser/vr/service/isolated_device_provider.cc
@@ -2,18 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/service/isolated_device_provider.h" +#include "chrome/browser/vr/service/isolated_device_provider.h" #include "base/bind.h" -#include "content/browser/xr/service/xr_device_service.h" -#include "content/browser/xr/xr_utils.h" -#include "content/public/browser/xr_integration_client.h" +#include "chrome/browser/vr/chrome_xr_integration_client.h" +#include "chrome/browser/vr/service/xr_device_service.h" namespace { constexpr int kMaxRetries = 3; } -namespace content { +namespace vr { void IsolatedVRDeviceProvider::Initialize( base::RepeatingCallback<void(device::mojom::XRDeviceId, @@ -40,7 +39,7 @@ device::mojom::XRDeviceId device_id) { add_device_callback_.Run(device_id, nullptr, std::move(device)); - auto* integration_client = GetXrIntegrationClient(); + auto* integration_client = ChromeXrIntegrationClient::GetInstance(); if (!integration_client) return; @@ -108,4 +107,4 @@ // Default destructor handles renderer_host_map_ cleanup. IsolatedVRDeviceProvider::~IsolatedVRDeviceProvider() = default; -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/service/isolated_device_provider.h b/chrome/browser/vr/service/isolated_device_provider.h similarity index 90% rename from content/browser/xr/service/isolated_device_provider.h rename to chrome/browser/vr/service/isolated_device_provider.h index 9de9de03..145b3ba 100644 --- a/content/browser/xr/service/isolated_device_provider.h +++ b/chrome/browser/vr/service/isolated_device_provider.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_SERVICE_ISOLATED_DEVICE_PROVIDER_H_ -#define CONTENT_BROWSER_XR_SERVICE_ISOLATED_DEVICE_PROVIDER_H_ +#ifndef CHROME_BROWSER_VR_SERVICE_ISOLATED_DEVICE_PROVIDER_H_ +#define CHROME_BROWSER_VR_SERVICE_ISOLATED_DEVICE_PROVIDER_H_ #include "base/containers/flat_map.h" #include "device/vr/public/mojom/isolated_xr_service.mojom-forward.h" @@ -17,7 +17,7 @@ class VrUiHost; } -namespace content { +namespace vr { class IsolatedVRDeviceProvider : public device::VRDeviceProvider, @@ -69,6 +69,6 @@ UiHostMap ui_host_map_; }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_SERVICE_ISOLATED_DEVICE_PROVIDER_H_ +#endif // CHROME_BROWSER_VR_SERVICE_ISOLATED_DEVICE_PROVIDER_H_
diff --git a/content/browser/xr/service/vr_service_impl.cc b/chrome/browser/vr/service/vr_service_impl.cc similarity index 94% rename from content/browser/xr/service/vr_service_impl.cc rename to chrome/browser/vr/service/vr_service_impl.cc index 45a9353..ee5dfa8 100644 --- a/content/browser/xr/service/vr_service_impl.cc +++ b/chrome/browser/vr/service/vr_service_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/service/vr_service_impl.h" +#include "chrome/browser/vr/service/vr_service_impl.h" #include <utility> @@ -11,12 +11,14 @@ #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" #include "base/trace_event/common/trace_event_common.h" -#include "content/browser/permissions/permission_controller_impl.h" -#include "content/browser/xr/metrics/session_metrics_helper.h" -#include "content/browser/xr/service/browser_xr_runtime_impl.h" -#include "content/browser/xr/service/xr_runtime_manager_impl.h" +#include "chrome/browser/permissions/permission_manager_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/vr/metrics/session_metrics_helper.h" +#include "chrome/browser/vr/service/browser_xr_runtime_impl.h" +#include "chrome/browser/vr/service/xr_runtime_manager_impl.h" +#include "components/permissions/permission_manager.h" +#include "components/ukm/content/source_url_recorder.h" #include "content/public/browser/browser_context.h" -#include "content/public/browser/permission_type.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_widget_host.h" @@ -41,7 +43,7 @@ content::XrConsentPromptLevel GetRequiredConsentLevel( device::mojom::XRSessionMode mode, - const content::BrowserXRRuntimeImpl* runtime, + const vr::BrowserXRRuntimeImpl* runtime, const std::set<device::mojom::XRSessionFeature>& requested_features) { if (base::Contains( requested_features, @@ -80,21 +82,20 @@ return content::XrConsentPromptLevel::kDefault; } -content::PermissionType GetRequiredPermission( - device::mojom::XRSessionMode mode) { +ContentSettingsType GetRequiredPermission(device::mojom::XRSessionMode mode) { switch (mode) { case device::mojom::XRSessionMode::kInline: - return content::PermissionType::SENSORS; + return ContentSettingsType::SENSORS; case device::mojom::XRSessionMode::kImmersiveVr: - return content::PermissionType::VR; + return ContentSettingsType::VR; case device::mojom::XRSessionMode::kImmersiveAr: - return content::PermissionType::AR; + return ContentSettingsType::AR; } } } // namespace -namespace content { +namespace vr { VRServiceImpl::SessionRequestData::SessionRequestData( device::mojom::XRSessionOptionsPtr options, @@ -436,15 +437,16 @@ } if (base::FeatureList::IsEnabled(features::kWebXrPermissionsApi)) { - PermissionControllerImpl* permission_controller = - PermissionControllerImpl::FromBrowserContext( - GetWebContents()->GetBrowserContext()); - DCHECK(permission_controller); + permissions::PermissionManager* permission_manager = + PermissionManagerFactory::GetForProfile( + Profile::FromBrowserContext(GetWebContents()->GetBrowserContext())); + DCHECK(permission_manager); // Need to calculate the permission before the call below, as otherwise // std::move nulls options out before GetRequiredPermission runs. - PermissionType permission = GetRequiredPermission(request.options->mode); - permission_controller->RequestPermission( + ContentSettingsType permission = + GetRequiredPermission(request.options->mode); + permission_manager->RequestPermission( permission, render_frame_host_, render_frame_host_->GetLastCommittedURL(), true, base::BindOnce(&VRServiceImpl::OnPermissionResult, @@ -465,9 +467,9 @@ void VRServiceImpl::OnPermissionResult( SessionRequestData request, content::XrConsentPromptLevel consent_level, - blink::mojom::PermissionStatus permission_status) { + ContentSetting setting_value) { OnConsentResult(std::move(request), consent_level, - permission_status == blink::mojom::PermissionStatus::GRANTED); + setting_value == ContentSetting::CONTENT_SETTING_ALLOW); } void VRServiceImpl::OnConsentResult(SessionRequestData request, @@ -650,4 +652,4 @@ } } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/service/vr_service_impl.h b/chrome/browser/vr/service/vr_service_impl.h similarity index 91% rename from content/browser/xr/service/vr_service_impl.h rename to chrome/browser/vr/service/vr_service_impl.h index 062c9b8..8f707ad5 100644 --- a/content/browser/xr/service/vr_service_impl.h +++ b/chrome/browser/vr/service/vr_service_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_SERVICE_VR_SERVICE_IMPL_H_ -#define CONTENT_BROWSER_XR_SERVICE_VR_SERVICE_IMPL_H_ +#ifndef CHROME_BROWSER_VR_SERVICE_VR_SERVICE_IMPL_H_ +#define CHROME_BROWSER_VR_SERVICE_VR_SERVICE_IMPL_H_ #include <map> #include <memory> @@ -13,8 +13,8 @@ #include "base/macros.h" #include "base/util/type_safety/pass_key.h" #include "build/build_config.h" -#include "content/browser/xr/metrics/session_metrics_helper.h" -#include "content/common/content_export.h" +#include "chrome/browser/vr/metrics/session_metrics_helper.h" +#include "components/content_settings/core/common/content_settings.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/xr_consent_helper.h" #include "content/public/browser/xr_consent_prompt_level.h" @@ -25,13 +25,13 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote_set.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" -#include "third_party/blink/public/mojom/permissions/permission_status.mojom-forward.h" + namespace content { class RenderFrameHost; class WebContents; } // namespace content -namespace content { +namespace vr { class XRRuntimeManagerImpl; class XRRuntimeManagerTest; @@ -39,8 +39,8 @@ // Browser process implementation of the VRService mojo interface. Instantiated // through Mojo once the user loads a page containing WebXR. -class CONTENT_EXPORT VRServiceImpl : public device::mojom::VRService, - content::WebContentsObserver { +class VRServiceImpl : public device::mojom::VRService, + content::WebContentsObserver { public: explicit VRServiceImpl(content::RenderFrameHost* render_frame_host); @@ -140,7 +140,7 @@ bool is_consent_granted); void OnPermissionResult(SessionRequestData request, content::XrConsentPromptLevel consent_level, - blink::mojom::PermissionStatus permission_status); + ContentSetting setting_value); void EnsureRuntimeInstalled(SessionRequestData request, BrowserXRRuntimeImpl* runtime); @@ -184,6 +184,6 @@ DISALLOW_COPY_AND_ASSIGN(VRServiceImpl); }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_SERVICE_VR_SERVICE_IMPL_H_ +#endif // CHROME_BROWSER_VR_SERVICE_VR_SERVICE_IMPL_H_
diff --git a/content/browser/xr/service/xr_device_service.cc b/chrome/browser/vr/service/xr_device_service.cc similarity index 89% rename from content/browser/xr/service/xr_device_service.cc rename to chrome/browser/vr/service/xr_device_service.cc index 2947351..bcdda1c 100644 --- a/content/browser/xr/service/xr_device_service.cc +++ b/chrome/browser/vr/service/xr_device_service.cc
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/service/xr_device_service.h" +#include "chrome/browser/vr/service/xr_device_service.h" #include "base/no_destructor.h" #include "build/build_config.h" +#include "chrome/browser/vr/xr_test_utils.h" #include "content/public/browser/service_process_host.h" -namespace content { +namespace vr { namespace { @@ -50,9 +51,9 @@ return *remote; } -void SetXRDeviceServiceStartupCallbackForTestingInternal( +void SetXRDeviceServiceStartupCallbackForTesting( base::RepeatingClosure callback) { GetStartupCallback() = std::move(callback); } -} // namespace content +} // namespace vr
diff --git a/chrome/browser/vr/service/xr_device_service.h b/chrome/browser/vr/service/xr_device_service.h new file mode 100644 index 0000000..f69ce67c --- /dev/null +++ b/chrome/browser/vr/service/xr_device_service.h
@@ -0,0 +1,22 @@ +// 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_VR_SERVICE_XR_DEVICE_SERVICE_H_ +#define CHROME_BROWSER_VR_SERVICE_XR_DEVICE_SERVICE_H_ + +#include "base/callback.h" +#include "chrome/browser/vr/vr_export.h" +#include "device/vr/public/mojom/isolated_xr_service.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace vr { + +// Acquires a remote handle to the sandboxed isolated XR Device Service +// instance, launching a process to host the service if necessary. +VR_EXPORT const mojo::Remote<device::mojom::XRDeviceService>& +GetXRDeviceService(); + +} // namespace vr + +#endif // CHROME_BROWSER_VR_SERVICE_XR_DEVICE_SERVICE_H_
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/chrome/browser/vr/service/xr_runtime_manager_impl.cc similarity index 95% rename from content/browser/xr/service/xr_runtime_manager_impl.cc rename to chrome/browser/vr/service/xr_runtime_manager_impl.cc index c890176..9834e03 100644 --- a/content/browser/xr/service/xr_runtime_manager_impl.cc +++ b/chrome/browser/vr/service/xr_runtime_manager_impl.cc
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/xr/service/xr_runtime_manager_impl.h" -#include "content/public/browser/xr_runtime_manager.h" +#include "chrome/browser/vr/service/xr_runtime_manager_impl.h" +#include "chrome/browser/vr/xr_runtime_manager_statics.h" #include <string> #include <utility> @@ -16,7 +16,7 @@ #include "base/metrics/user_metrics_action.h" #include "base/trace_event/common/trace_event_common.h" #include "build/build_config.h" -#include "content/browser/xr/service/browser_xr_runtime_impl.h" +#include "chrome/browser/vr/service/browser_xr_runtime_impl.h" #include "content/public/browser/device_service.h" #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" @@ -35,10 +35,10 @@ #endif // BUILDFLAG(ENABLE_ARCORE) #else // !defined(OS_ANDROID) -#include "content/browser/xr/service/isolated_device_provider.h" +#include "chrome/browser/vr/service/isolated_device_provider.h" #endif // defined(OS_ANDROID) -namespace content { +namespace vr { namespace { XRRuntimeManagerImpl* g_xr_runtime_manager = nullptr; @@ -62,21 +62,21 @@ } // namespace // XRRuntimeManager statics -content::XRRuntimeManager* XRRuntimeManager::GetInstanceIfCreated() { +content::XRRuntimeManager* XRRuntimeManagerStatics::GetInstanceIfCreated() { return g_xr_runtime_manager; } -void XRRuntimeManager::AddObserver( +void XRRuntimeManagerStatics::AddObserver( content::XRRuntimeManager::Observer* observer) { g_xr_runtime_manager_observers.Get().AddObserver(observer); } -void XRRuntimeManager::RemoveObserver( +void XRRuntimeManagerStatics::RemoveObserver( content::XRRuntimeManager::Observer* observer) { g_xr_runtime_manager_observers.Get().RemoveObserver(observer); } -void XRRuntimeManager::ExitImmersivePresentation() { +void XRRuntimeManagerStatics::ExitImmersivePresentation() { if (!g_xr_runtime_manager) { return; } @@ -122,7 +122,7 @@ #if defined(OS_ANDROID) providers.emplace_back(std::make_unique<device::GvrDeviceProvider>()); #else // !defined(OS_ANDROID) - providers.emplace_back(std::make_unique<IsolatedVRDeviceProvider>()); + providers.emplace_back(std::make_unique<vr::IsolatedVRDeviceProvider>()); #endif // defined(OS_ANDROID) bool orientation_provider_enabled = true; @@ -454,4 +454,4 @@ } } -} // namespace content +} // namespace vr
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.h b/chrome/browser/vr/service/xr_runtime_manager_impl.h similarity index 88% rename from content/browser/xr/service/xr_runtime_manager_impl.h rename to chrome/browser/vr/service/xr_runtime_manager_impl.h index 8f39178..62353e3e 100644 --- a/content/browser/xr/service/xr_runtime_manager_impl.h +++ b/chrome/browser/vr/service/xr_runtime_manager_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_XR_SERVICE_XR_RUNTIME_MANAGER_IMPL_H_ -#define CONTENT_BROWSER_XR_SERVICE_XR_RUNTIME_MANAGER_IMPL_H_ +#ifndef CHROME_BROWSER_VR_SERVICE_XR_RUNTIME_MANAGER_IMPL_H_ +#define CHROME_BROWSER_VR_SERVICE_XR_RUNTIME_MANAGER_IMPL_H_ #include <stdint.h> @@ -18,9 +18,8 @@ #include "base/optional.h" #include "base/threading/thread_checker.h" #include "base/timer/timer.h" -#include "content/browser/xr/service/browser_xr_runtime_impl.h" -#include "content/browser/xr/service/vr_service_impl.h" -#include "content/common/content_export.h" +#include "chrome/browser/vr/service/browser_xr_runtime_impl.h" +#include "chrome/browser/vr/service/vr_service_impl.h" #include "content/public/browser/xr_runtime_manager.h" #include "device/vr/public/mojom/vr_service.mojom-forward.h" #include "device/vr/vr_device.h" @@ -30,14 +29,13 @@ class VRDeviceProvider; } -namespace content { +namespace vr { class XRRuntimeManagerTest; // Singleton used to provide the platform's XR Runtimes to VRServiceImpl // instances. -class CONTENT_EXPORT XRRuntimeManagerImpl - : public content::XRRuntimeManager, - public base::RefCounted<XRRuntimeManagerImpl> { +class XRRuntimeManagerImpl : public content::XRRuntimeManager, + public base::RefCounted<XRRuntimeManagerImpl> { public: friend base::RefCounted<XRRuntimeManagerImpl>; static constexpr auto kRefCountPreference = @@ -131,6 +129,6 @@ THREAD_CHECKER(thread_checker_); }; -} // namespace content +} // namespace vr -#endif // CONTENT_BROWSER_XR_SERVICE_XR_RUNTIME_MANAGER_IMPL_H_ +#endif // CHROME_BROWSER_VR_SERVICE_XR_RUNTIME_MANAGER_IMPL_H_
diff --git a/content/browser/xr/service/xr_runtime_manager_unittest.cc b/chrome/browser/vr/service/xr_runtime_manager_unittest.cc similarity index 82% rename from content/browser/xr/service/xr_runtime_manager_unittest.cc rename to chrome/browser/vr/service/xr_runtime_manager_unittest.cc index 3502252..288370b 100644 --- a/content/browser/xr/service/xr_runtime_manager_unittest.cc +++ b/chrome/browser/vr/service/xr_runtime_manager_unittest.cc
@@ -10,10 +10,9 @@ #include "base/callback.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/test/task_environment.h" -#include "content/browser/xr/service/vr_service_impl.h" -#include "content/browser/xr/service/xr_runtime_manager_impl.h" -#include "content/public/browser/xr_runtime_manager.h" +#include "chrome/browser/vr/service/vr_service_impl.h" +#include "chrome/browser/vr/service/xr_runtime_manager_impl.h" +#include "chrome/browser/vr/xr_runtime_manager_statics.h" #include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/test/fake_vr_device.h" #include "device/vr/test/fake_vr_device_provider.h" @@ -22,7 +21,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "testing/gtest/include/gtest/gtest.h" -namespace content { +namespace vr { class XRRuntimeManagerTest : public testing::Test { protected: @@ -39,25 +38,20 @@ void TearDown() override { DropRuntimeManagerRef(); - EXPECT_EQ(XRRuntimeManager::GetInstanceIfCreated(), nullptr); + EXPECT_EQ(XRRuntimeManagerStatics::GetInstanceIfCreated(), nullptr); } std::unique_ptr<VRServiceImpl> BindService() { - // The mojom bindings that get run as part of adding a device need to run on - // a single thread. - base::test::SingleThreadTaskEnvironment task_environment; mojo::PendingRemote<device::mojom::VRServiceClient> proxy; device::FakeVRServiceClient client(proxy.InitWithNewPipeAndPassReceiver()); auto service = std::make_unique<VRServiceImpl>(util::PassKey<XRRuntimeManagerTest>()); service->SetClient(std::move(proxy)); - base::RunLoop run_loop; - run_loop.RunUntilIdle(); return service; } scoped_refptr<XRRuntimeManagerImpl> GetRuntimeManager() { - EXPECT_NE(XRRuntimeManager::GetInstanceIfCreated(), nullptr); + EXPECT_NE(XRRuntimeManagerStatics::GetInstanceIfCreated(), nullptr); return XRRuntimeManagerImpl::GetOrCreateInstance(); } @@ -71,7 +65,7 @@ } device::FakeVRDeviceProvider* Provider() { - EXPECT_NE(XRRuntimeManager::GetInstanceIfCreated(), nullptr); + EXPECT_NE(XRRuntimeManagerStatics::GetInstanceIfCreated(), nullptr); return provider_; } @@ -122,7 +116,7 @@ service_2.reset(); DropRuntimeManagerRef(); - EXPECT_EQ(XRRuntimeManager::GetInstanceIfCreated(), nullptr); + EXPECT_EQ(XRRuntimeManagerStatics::GetInstanceIfCreated(), nullptr); } // Ensure that devices added and removed are reflected in calls to request @@ -131,15 +125,9 @@ auto service = BindService(); EXPECT_EQ(1u, ServiceCount()); EXPECT_TRUE(Provider()->Initialized()); - - // The mojom bindings that get run as part of adding a device need to run on - // a single thread. - base::test::SingleThreadTaskEnvironment task_environment; - base::RunLoop run_loop; device::FakeVRDevice* device = new device::FakeVRDevice( device::mojom::XRDeviceId::ORIENTATION_DEVICE_ID); Provider()->AddDevice(base::WrapUnique(device)); - run_loop.RunUntilIdle(); device::mojom::XRSessionOptions options = {}; options.mode = device::mojom::XRSessionMode::kInline; @@ -148,4 +136,4 @@ EXPECT_TRUE(!GetRuntimeManager()->GetRuntimeForOptions(&options)); } -} // namespace content +} // namespace vr
diff --git a/chrome/browser/vr/test/mock_xr_device_hook_base.cc b/chrome/browser/vr/test/mock_xr_device_hook_base.cc index 823cd199..94e97bf5 100644 --- a/chrome/browser/vr/test/mock_xr_device_hook_base.cc +++ b/chrome/browser/vr/test/mock_xr_device_hook_base.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/vr/test/mock_xr_device_hook_base.h" -#include "content/public/test/xr_test_utils.h" +#include "chrome/browser/vr/service/xr_device_service.h" #include "device/vr/public/mojom/isolated_xr_service.mojom.h" // TODO(https://crbug.com/891832): Remove these conversion functions as part of @@ -52,7 +52,7 @@ MockXRDeviceHookBase::MockXRDeviceHookBase() : tracked_classes_{ device_test::mojom::TrackedDeviceClass::kTrackedDeviceInvalid} { - content::GetXRDeviceServiceForTesting()->BindTestHook( + vr::GetXRDeviceService()->BindTestHook( service_test_hook_.BindNewPipeAndPassReceiver()); mojo::ScopedAllowSyncCallForTesting scoped_allow_sync;
diff --git a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc index a848c44..963e138 100644 --- a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc +++ b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
@@ -17,11 +17,11 @@ #include "chrome/browser/usb/usb_tab_helper.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "chrome/browser/vr/win/vr_browser_renderer_thread_win.h" +#include "chrome/browser/vr/xr_runtime_manager_statics.h" #include "components/permissions/permission_manager.h" #include "components/permissions/permission_result.h" #include "content/public/browser/device_service.h" #include "content/public/browser/navigation_entry.h" -#include "content/public/browser/xr_runtime_manager.h" #include "device/base/features.h" #include "device/vr/buildflags/buildflags.h" #include "ui/base/l10n/l10n_util.h" @@ -128,7 +128,7 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DVLOG(1) << __func__; - auto* runtime_manager = content::XRRuntimeManager::GetInstanceIfCreated(); + auto* runtime_manager = XRRuntimeManagerStatics::GetInstanceIfCreated(); DCHECK(runtime_manager != nullptr); content::BrowserXRRuntime* runtime = runtime_manager->GetRuntime(device_id); if (runtime) { @@ -165,7 +165,7 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (!IsValidInfo(info_)) { - content::XRRuntimeManager::ExitImmersivePresentation(); + XRRuntimeManagerStatics::ExitImmersivePresentation(); return; } @@ -248,7 +248,7 @@ DVLOG(3) << __func__; if (!IsValidInfo(display_info)) { - content::XRRuntimeManager::ExitImmersivePresentation(); + XRRuntimeManagerStatics::ExitImmersivePresentation(); return; }
diff --git a/chrome/browser/vr/vr_tab_helper.cc b/chrome/browser/vr/vr_tab_helper.cc index 715a1a1..93afb90e 100644 --- a/chrome/browser/vr/vr_tab_helper.cc +++ b/chrome/browser/vr/vr_tab_helper.cc
@@ -6,8 +6,8 @@ #include "base/metrics/histogram_macros.h" #include "build/build_config.h" +#include "chrome/browser/vr/xr_runtime_manager_statics.h" #include "content/public/browser/render_view_host.h" -#include "content/public/browser/xr_runtime_manager.h" #include "content/public/common/web_preferences.h" #include "device/vr/buildflags/buildflags.h" @@ -98,7 +98,7 @@ /* static */ void VrTabHelper::ExitVrPresentation() { #if defined(OS_WIN) && BUILDFLAG(ENABLE_VR) - content::XRRuntimeManager::ExitImmersivePresentation(); + XRRuntimeManagerStatics::ExitImmersivePresentation(); #endif }
diff --git a/chrome/browser/vr/webxr_vr_isolated_device_service_test.cc b/chrome/browser/vr/webxr_vr_isolated_device_service_test.cc index d5aa9c6..aeb2401a 100644 --- a/chrome/browser/vr/webxr_vr_isolated_device_service_test.cc +++ b/chrome/browser/vr/webxr_vr_isolated_device_service_test.cc
@@ -9,8 +9,8 @@ #include "chrome/browser/vr/test/mock_xr_device_hook_base.h" #include "chrome/browser/vr/test/multi_class_browser_test.h" #include "chrome/browser/vr/test/webxr_vr_browser_test.h" +#include "chrome/browser/vr/xr_test_utils.h" #include "content/public/test/browser_test_utils.h" -#include "content/public/test/xr_test_utils.h" namespace vr { @@ -20,7 +20,7 @@ // a new local hook before the IsolatedDeviceProvider has a chance to issue // any enumeration requests. base::Optional<MockXRDeviceHookBase> device_hook(base::in_place); - content::SetXRDeviceServiceStartupCallbackForTesting( + vr::SetXRDeviceServiceStartupCallbackForTesting( base::BindLambdaForTesting([&] { device_hook.emplace(); })); t->LoadFileAndAwaitInitialization("test_isolated_device_service_disconnect"); @@ -48,6 +48,6 @@ // still enter an immersive session. t->EnterSessionWithUserGestureOrFail(); - content::SetXRDeviceServiceStartupCallbackForTesting(base::NullCallback()); + vr::SetXRDeviceServiceStartupCallbackForTesting(base::NullCallback()); } } // namespace vr
diff --git a/chrome/browser/vr/xr_runtime_manager_statics.h b/chrome/browser/vr/xr_runtime_manager_statics.h new file mode 100644 index 0000000..7a2b3e36 --- /dev/null +++ b/chrome/browser/vr/xr_runtime_manager_statics.h
@@ -0,0 +1,35 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_VR_XR_RUNTIME_MANAGER_STATICS_H_ +#define CHROME_BROWSER_VR_XR_RUNTIME_MANAGER_STATICS_H_ + +#include "content/public/browser/xr_runtime_manager.h" + +namespace vr { +// TODO(crbug.com/1031622): Move these methods onto content::XRRuntimeManager. +// Until the whole XRRuntimeManagerImpl is moved, these methods (which modify +// global variables in the file), can't be moved onto XRRuntimeManager as they +// would result in linker errors. They've been moved out here to indicate which +// methods need to move. +class XRRuntimeManagerStatics { + public: + // Provides access to the XRRuntimeManager singleton, if it exists. + // This method does not extend the lifetime of the singleton, so you should be + // careful with the lifetime of this reference. + static content::XRRuntimeManager* GetInstanceIfCreated(); + + // Exits any currently presenting immersive session. + static void ExitImmersivePresentation(); + + // Observer registration methods are static so that observers may subscribe + // and unsubscribe independent of the lifecycle of the XRRuntimeManager + // Singleton. + static void AddObserver(content::XRRuntimeManager::Observer* observer); + static void RemoveObserver(content::XRRuntimeManager::Observer* observer); +}; + +} // namespace vr + +#endif // CHROME_BROWSER_VR_XR_RUNTIME_MANAGER_STATICS_H_
diff --git a/chrome/browser/vr/xr_test_utils.h b/chrome/browser/vr/xr_test_utils.h new file mode 100644 index 0000000..eeb56a02 --- /dev/null +++ b/chrome/browser/vr/xr_test_utils.h
@@ -0,0 +1,22 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_VR_XR_TEST_UTILS_H_ +#define CHROME_BROWSER_VR_XR_TEST_UTILS_H_ + +#include "base/callback_forward.h" +#include "chrome/browser/vr/vr_export.h" + +namespace vr { + +// Allows tests to perform extra initialization steps on any new XR Device +// Service instance before other client code can use it. Any time a new instance +// of the service is started by |GetXRDeviceService()|, this callback (if +// non-null) is invoked. +VR_EXPORT void SetXRDeviceServiceStartupCallbackForTesting( + base::RepeatingClosure callback); + +} // namespace vr + +#endif // CHROME_BROWSER_VR_XR_TEST_UTILS_H_
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb index 99cb788..5e847e2 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Jou werkrekening kon nie met jou Windows-profiel gesinkroniseer word nie omdat wagwoordopdaterings op jou toestel deur jou organisasie beperk word. Kontak jou administrateur vir hulp.</translation> <translation id="5186761973554910131">Ongeldige rekenaarnaam is verskaf gedurende poging om die wagwoord te verander. Kontak jou administrateur.</translation> <translation id="5265714013989877288">Kan nie voortgaan nie want jou Windows-wagwoord kon nie verander word nie. Kontak jou administrateur.</translation> +<translation id="5581861273642234526">'n Ander werkrekening word reeds met hierdie toestel geassosieer. Sluit met jou Windows-rekening aan.</translation> <translation id="6033715878377252112">Google Eiebewysverskaffer vir Windows-helper</translation> <translation id="6149399665202317746">Google Eiebewysverskaffer vir Windows</translation> <translation id="6243062314475217481">Jou werkrekening se wagwoord voldoen nie aan die kompleksiteitvereistes vir Windows nie. Kontak jou administrateur vir hulp.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb index 35a36c8..7467d2c7 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">በመሣሪያዎ ላይ የይለፍ ቃል ዝማኔዎች በድርጅትዎ የተገደበ ስለሆነ የስራ መለያዎን ከWindows መገለጫዎ ጋር ማስመር አልተቻለም። እገዛ ለማግኘት የእርስዎን አስተዳዳሪ ያነጋግሩ።</translation> <translation id="5186761973554910131">በይለፍ ቃል መቀየር ሙከራ ጊዜ ልክ ያልሆነ የኮምፒውተር ስም ቀርቧል እባክዎ አስተዳዳሪዎን ያነጋግሩ።</translation> <translation id="5265714013989877288">የእርስዎን የWindows የይለፍ ቃል በመለወጥ ላይ ሳለ አንድ ስህተት ስለነበር መቀጠል አልተቻለም። እባክዎ አስተዳዳሪዎን ያነጋግሩ።</translation> +<translation id="5581861273642234526">ሌላ የሥራ መለያ ከዚህ መሣሪያ ጋር አስቀድሞ ተጎዳኝቷል። በእርስዎ የWindows መለያ ይግቡ።</translation> <translation id="6033715878377252112">Google ምስክርነት አቅራቢ ለ Windows አጋዥ</translation> <translation id="6149399665202317746">Google ምስክርነት አቅራቢ ለ Windows</translation> <translation id="6243062314475217481">የእርስዎ የሥራ መለያ የይለፍ ቃል ለWindows ከሚያስፈልገው የውስብስብነት መስፈርቶች ጋር አይዛመድም። እገዛ ለማግኘት የእርስዎን አስተዳዳሪ ያነጋግሩ።</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_bs.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_bs.xtb index 3177658b..13e50793 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_bs.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_bs.xtb
@@ -18,7 +18,7 @@ <translation id="4744575902940448763">Sinhroniziranje lozinke vašeg poslovnog računa s Windows profilom nije uspjelo jer je vaša organizacija ograničila ažuriranja lozinki na uređaju. Kontaktirajte administratora za pomoć.</translation> <translation id="5186761973554910131">Nevažeći naziv računara je pružen tokom pokušaja promjene lozinke. Kontaktirajte svog administratora.</translation> <translation id="5265714013989877288">Nije moguće nastaviti jer je došlo do greške prilikom promjene vaše Windows lozinke. Kontaktirajte administratora.</translation> -<translation id="5581861273642234526">S ovim uređajem već je povezan drugi poslovni račun. Prijavite se sa svojim Windows računom.</translation> +<translation id="5581861273642234526">Drugi poslovni račun je već povezan s ovim uređajem. Prijavite se s Windows računom.</translation> <translation id="6033715878377252112">Pomoćnik za Googleovog pružaoca akreditiva za Windows</translation> <translation id="6149399665202317746">Googleov pružalac akreditiva za Windows</translation> <translation id="6243062314475217481">Lozinka vašeg poslovnog računa se ne podudara s uslovima kompleksnosti za Windows. Kontaktirajte administratora za pomoć.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb index 46d27ca..4ec78f5 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">La contrasenya del compte de la feina no s'ha pogut sincronitzar amb el teu perfil de Windows perquè la teva organització ha restringit les actualitzacions de contrasenyes al dispositiu. Contacta amb l'administrador per obtenir ajuda.</translation> <translation id="5186761973554910131">S'ha proporcionat un nom de l'ordinador que no és vàlid en provar de canviar la contrasenya. Contacta amb l'administrador.</translation> <translation id="5265714013989877288">No es pot continuar perquè s'ha produït un error en canviar la contrasenya de Windows. Contacta amb l'administrador.</translation> +<translation id="5581861273642234526">Ja hi ha un altre compte de la feina associat a aquest dispositiu. Inicia la sessió amb el teu compte de Windows.</translation> <translation id="6033715878377252112">Aplicació d'ajuda del proveïdor de credencials de Google per a Windows</translation> <translation id="6149399665202317746">Proveïdor de credencials de Google per a Windows</translation> <translation id="6243062314475217481">La contrasenya del compte de la feina no compleix els requisits de complexitat de Windows. Contacta amb l'administrador per obtenir ajuda.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb index 90a5a90..fa28473 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Adgangskoden til din arbejdskonto kunne ikke synkroniseres med din Windows-profil, da din organisation har angivet begrænsninger for opdatering af adgangskoder på din enhed. Kontakt din administrator for at få hjælp.</translation> <translation id="5186761973554910131">Der blev angivet et ugyldigt computernavn under forsøget på at ændre adgangskode. Kontakt din administrator.</translation> <translation id="5265714013989877288">Der kan ikke fortsættes, da der opstod en fejl under forsøget på at ændre din Windows-adgangskode. Kontakt din administrator.</translation> +<translation id="5581861273642234526">En anden arbejdskonto er allerede knyttet til denne enhed. Log ind med din Windows-konto.</translation> <translation id="6033715878377252112">Hjælper til Google Loginhåndtering til Windows</translation> <translation id="6149399665202317746">Google Loginhåndtering til Windows</translation> <translation id="6243062314475217481">Adgangskoden til din arbejdskonto opfylder ikke kompleksitetskravene for Windows. Kontakt din administrator for at få hjælp.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb index b2b6bf5..bb8e067 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">همگامسازی گذرواژه حساب کاری با نمایه Windows شما ممکن نیست زیرا سازمانتان بهروزرسانیهای گذرواژه را در دستگاهتان محدود کرده است. برای دریافت راهنمایی، با سرپرست تماس بگیرید.</translation> <translation id="5186761973554910131">هنگام تلاش برای تغییر گذرواژه، نام رایانه ارائهشده معتبر نبود. لطفاً با سرپرست خود تماس بگیرید.</translation> <translation id="5265714013989877288">نمیتوان ادامه داد زیرا هنگام تغییر گذرواژه Windows خطایی روی داد. لطفاً با سرپرست تماس بگیرید.</translation> +<translation id="5581861273642234526">حساب کاری دیگری از قبل با این دستگاه مرتبط شده است. با حساب Windows به سیستم وارد شوید.</translation> <translation id="6033715878377252112">راهنمای «ارائهدهنده اطلاعات کاربری Google» ویژه Windows</translation> <translation id="6149399665202317746">«ارائهدهنده اطلاعات کاربری Google» ویژه Windows</translation> <translation id="6243062314475217481">گذرواژه حساب کاری شما با شرایط لازم پیچیدگی برای Windows مطابقت ندارد. برای دریافت راهنمایی، با سرپرست تماس بگیرید.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_hy.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_hy.xtb index 5eb4ea5a..e93788e 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_hy.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_hy.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Ձեր աշխատանքային հաշվի գաղտնաբառը չհաջողվեց համաժամացնել Windows պրոֆիլի հետ, քանի որ ձեր կազմակերպությունն արգելել է գաղտնաբառերի փոփոխումը ձեր սարքում։ Օգնության համար դիմեք ձեր ադմինիստրատորին։</translation> <translation id="5186761973554910131">Գաղտնաբառը փոխելու փորձի ժամանակ համակարգի անվավեր անվանում է նշվել։ Կապվեք ձեր ադմինիստրատորի հետ։</translation> <translation id="5265714013989877288">Հնարավոր չէ շարունակել, քանի որ չի հաջողվել փոխել Windows-ի ձեր գաղտնաբառը։ Դիմեք ձեր ադմինիստրատորին։</translation> +<translation id="5581861273642234526">Մեկ այլ աշխատանքային հաշիվ արդեն կապված է այս սարքի հետ։ Մտեք ձեր Windows հաշիվ։</translation> <translation id="6033715878377252112">Windows-ի համար նախատեսված Google-ի մուտքի տվյալների մատակարարի մասնագետ</translation> <translation id="6149399665202317746">Google-ի մուտքի տվյալների մատակարար Windows-ի համար</translation> <translation id="6243062314475217481">Ձեր աշխատանքային հաշվի գաղտնաբառը չի համապատասխանում Windows-ի համար գործող բարդության պահանջներին։ Օգնության համար դիմեք ձեր ադմինիստրատորին։</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb index c062c65..985ca55 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Heslo pracovného účtu sa nepodarilo synchronizovať s profilom systému Windows, pretože vaša organizácia obmedzila v zariadení aktualizácie hesiel. Obráťte sa na správcu a požiadajte ho o pomoc.</translation> <translation id="5186761973554910131">Pri pokuse o zmenu hesla bol zadaný nesprávny názov počítača. Kontaktujte správcu.</translation> <translation id="5265714013989877288">Pri zmene hesla systému Windows sa vyskytla chyba, a preto nie je možné pokračovať. Kontaktujte správcu.</translation> +<translation id="5581861273642234526">S týmto zariadením je už spojený iný pracovný účet. Prihláste sa pomocou svojho účtu Windows.</translation> <translation id="6033715878377252112">Pomocník poskytovateľa poverení Google pre Windows</translation> <translation id="6149399665202317746">Poskytovateľ poverení Google pre Windows</translation> <translation id="6243062314475217481">Heslo pracovného účtu nespĺňa požiadavky zložitosti systému Windows. Obráťte sa na správcu a požiadajte ho o pomoc.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb index ee36ab9..cfc7261 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Cihazınızdaki şifre güncellemeleri kuruluşunuz tarafından kısıtlandığından, iş hesabı şifreniz Windows profilinizle senkronize edilemedi. Yardım için yöneticinizle iletişime geçin.</translation> <translation id="5186761973554910131">Parola değiştirme girişimi sırasında geçersiz bilgisayar adı belirtildi. Lütfen yöneticinizle görüşün.</translation> <translation id="5265714013989877288">Windows şifreniz değiştirilirken bir hata oluştuğundan devam edilemiyor. Lütfen yöneticinizle iletişime geçin.</translation> +<translation id="5581861273642234526">Başka bir iş hesabı bu cihazla zaten ilişkilendirilmiş. Windows hesabınızla oturum açın.</translation> <translation id="6033715878377252112">Windows için Google Kimlik Bilgisi Sağlayıcı yardımcısı</translation> <translation id="6149399665202317746">Windows için Google Kimlik Bilgisi Sağlayıcı</translation> <translation id="6243062314475217481">İş hesabınızın şifresi, Windows için şifrenin kolay tahmin edilemeyecek zorlukta olma gereksinimlerini karşılamıyor. Yardım için yöneticinizle iletişime geçin.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_uz.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_uz.xtb index f0d4035..afedd21 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_uz.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_uz.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Bu qurilmada parolni yangilash tashkilotingiz tomonidan taqiqlangani sababli ishchi hisobingiz paroli Windows profilingizga sinxronlanmadi. Administratorga murojaat qiling.</translation> <translation id="5186761973554910131">Parol almashtirishda kompyuter nomi xato kiritildi. Administratorga murojaat qiling.</translation> <translation id="5265714013989877288">Windows parolini yangilashdagi xatolik tufayli davom etish imkonsiz. Administratorga murojaat qiling.</translation> +<translation id="5581861273642234526">Bu qurilma bilan allaqachon boshqa ishchi hisob ulangan. Windows hisobingiz bilan kiring.</translation> <translation id="6033715878377252112">Windows uchun Google Credential Provider yordamchisi</translation> <translation id="6149399665202317746">Windows uchun Google Credential Provider</translation> <translation id="6243062314475217481">Ishchi hisobingiz paroli Windows murakkablik talablariga mos emas. Administratorga murojaat qiling.</translation>
diff --git a/chrome/renderer/media/chrome_speech_recognition_client.cc b/chrome/renderer/media/chrome_speech_recognition_client.cc index bb5726ab..b53e9d2 100644 --- a/chrome/renderer/media/chrome_speech_recognition_client.cc +++ b/chrome/renderer/media/chrome_speech_recognition_client.cc
@@ -10,13 +10,14 @@ ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient( content::RenderFrame* render_frame) { - mojo::PendingReceiver<media::mojom::SodaContext> soda_context_receiver = - soda_context_.BindNewPipeAndPassReceiver(); - soda_context_->BindRecognizer( - soda_recognizer_.BindNewPipeAndPassReceiver(), - soda_recognition_client_receiver_.BindNewPipeAndPassRemote()); + mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> + speech_recognition_context_receiver = + speech_recognition_context_.BindNewPipeAndPassReceiver(); + speech_recognition_context_->BindRecognizer( + speech_recognition_recognizer_.BindNewPipeAndPassReceiver(), + speech_recognition_client_receiver_.BindNewPipeAndPassRemote()); render_frame->GetBrowserInterfaceBroker()->GetInterface( - std::move(soda_context_receiver)); + std::move(speech_recognition_context_receiver)); } ChromeSpeechRecognitionClient::~ChromeSpeechRecognitionClient() = default; @@ -25,15 +26,17 @@ scoped_refptr<media::AudioBuffer> buffer) { DCHECK(buffer); if (IsSpeechRecognitionAvailable()) { - soda_recognizer_->SendAudioToSoda(ConvertToAudioDataS16(std::move(buffer))); + speech_recognition_recognizer_->SendAudioToSpeechRecognitionService( + ConvertToAudioDataS16(std::move(buffer))); } } bool ChromeSpeechRecognitionClient::IsSpeechRecognitionAvailable() { - return soda_recognizer_.is_bound() && soda_recognizer_.is_connected(); + return speech_recognition_recognizer_.is_bound() && + speech_recognition_recognizer_.is_connected(); } -void ChromeSpeechRecognitionClient::OnSodaRecognitionEvent( +void ChromeSpeechRecognitionClient::OnSpeechRecognitionRecognitionEvent( const std::string& transcription) { // TODO(evliu): Pass the captions to the caption controller. NOTIMPLEMENTED();
diff --git a/chrome/renderer/media/chrome_speech_recognition_client.h b/chrome/renderer/media/chrome_speech_recognition_client.h index 08e5914..7db252a 100644 --- a/chrome/renderer/media/chrome_speech_recognition_client.h +++ b/chrome/renderer/media/chrome_speech_recognition_client.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_RENDERER_CHROME_SPEECH_RECOGNITION_CLIENT_H_ -#define CHROME_RENDERER_CHROME_SPEECH_RECOGNITION_CLIENT_H_ +#ifndef CHROME_RENDERER_MEDIA_CHROME_SPEECH_RECOGNITION_CLIENT_H_ +#define CHROME_RENDERER_MEDIA_CHROME_SPEECH_RECOGNITION_CLIENT_H_ #include <memory> #include "media/base/audio_buffer.h" #include "media/base/speech_recognition_client.h" -#include "media/mojo/mojom/soda_service.mojom.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -19,7 +19,7 @@ class ChromeSpeechRecognitionClient : public media::SpeechRecognitionClient, - public media::mojom::SodaRecognizerClient { + public media::mojom::SpeechRecognitionRecognizerClient { public: explicit ChromeSpeechRecognitionClient(content::RenderFrame* render_frame); ChromeSpeechRecognitionClient(const ChromeSpeechRecognitionClient&) = delete; @@ -31,21 +31,24 @@ void AddAudio(scoped_refptr<media::AudioBuffer> buffer) override; bool IsSpeechRecognitionAvailable() override; - // media::mojom::SodaRecognizerClient - void OnSodaRecognitionEvent(const std::string& transcription) override; + // media::mojom::SpeechRecognitionRecognizerClient + void OnSpeechRecognitionRecognitionEvent( + const std::string& transcription) override; private: media::mojom::AudioDataS16Ptr ConvertToAudioDataS16( scoped_refptr<media::AudioBuffer> buffer); - mojo::Remote<media::mojom::SodaContext> soda_context_; - mojo::Remote<media::mojom::SodaRecognizer> soda_recognizer_; - mojo::Receiver<media::mojom::SodaRecognizerClient> - soda_recognition_client_receiver_{this}; + mojo::Remote<media::mojom::SpeechRecognitionContext> + speech_recognition_context_; + mojo::Remote<media::mojom::SpeechRecognitionRecognizer> + speech_recognition_recognizer_; + mojo::Receiver<media::mojom::SpeechRecognitionRecognizerClient> + speech_recognition_client_receiver_{this}; // The temporary audio bus used to convert the raw audio to the appropriate // format. std::unique_ptr<media::AudioBus> temp_audio_bus_; }; -#endif // CHROME_RENDERER_CHROME_SPEECH_RECOGNITION_CLIENT_H_ +#endif // CHROME_RENDERER_MEDIA_CHROME_SPEECH_RECOGNITION_CLIENT_H_
diff --git a/chrome/services/soda/soda_recognizer_impl.cc b/chrome/services/soda/soda_recognizer_impl.cc deleted file mode 100644 index aa9360a..0000000 --- a/chrome/services/soda/soda_recognizer_impl.cc +++ /dev/null
@@ -1,99 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/services/soda/soda_recognizer_impl.h" - -#include "base/bind.h" -#include "components/soda/constants.h" -#include "media/base/audio_buffer.h" -#include "media/base/audio_sample_types.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/limits.h" -#include "media/mojo/common/media_type_converters.h" -#include "mojo/public/cpp/bindings/self_owned_receiver.h" - -#if BUILDFLAG(ENABLE_SODA) -#include "chrome/services/soda/internal/soda_client.h" -#endif // BUILDFLAG(ENABLE_SODA) - -namespace soda { - -namespace { - -#if BUILDFLAG(ENABLE_SODA) -// Callback executed by the SODA library on a speech recognition event. The -// callback handle is a void pointer to the SodaRecognizerImpl that owns the -// SODA instance. SodaRecognizerImpl owns the SodaClient which owns the instance -// of SODA and their sequential destruction order ensures that this callback -// will never be called with an invalid callback handle to the -// SodaRecognizerImpl. -void RecognitionCallback(const char* result, void* callback_handle) { - DCHECK(callback_handle); - static_cast<SodaRecognizerImpl*>(callback_handle) - ->recognition_event_callback() - .Run(std::string(result)); -} -#endif // BUILDFLAG(ENABLE_SODA) - -} // namespace - -SodaRecognizerImpl::~SodaRecognizerImpl() = default; - -void SodaRecognizerImpl::Create( - mojo::PendingReceiver<media::mojom::SodaRecognizer> receiver, - mojo::PendingRemote<media::mojom::SodaRecognizerClient> remote) { - mojo::MakeSelfOwnedReceiver( - base::WrapUnique(new SodaRecognizerImpl(std::move(remote))), - std::move(receiver)); -} - -void SodaRecognizerImpl::OnRecognitionEvent(const std::string& result) { - client_remote_->OnSodaRecognitionEvent(result); -} - -SodaRecognizerImpl::SodaRecognizerImpl( - mojo::PendingRemote<media::mojom::SodaRecognizerClient> remote) - : client_remote_(std::move(remote)) { - recognition_event_callback_ = media::BindToCurrentLoop(base::Bind( - &SodaRecognizerImpl::OnRecognitionEvent, weak_factory_.GetWeakPtr())); -#if BUILDFLAG(ENABLE_SODA) - soda_client_ = std::make_unique<SodaClient>(GetSodaBinaryPath()); -#endif // BUILDFLAG(ENABLE_SODA) -} - -void SodaRecognizerImpl::SendAudioToSoda(media::mojom::AudioDataS16Ptr buffer) { - int channel_count = buffer->channel_count; - int frame_count = buffer->frame_count; - int sample_rate = buffer->sample_rate; - int num_samples; - int data_size; - if (channel_count <= 0 || channel_count > media::limits::kMaxChannels || - sample_rate <= 0 || frame_count <= 0 || - !base::CheckMul(frame_count, channel_count).AssignIfValid(&num_samples) || - !base::CheckMul(num_samples, sizeof(int16_t)).AssignIfValid(&data_size)) { - mojo::ReportBadMessage("Invalid audio data received."); - return; - } - -#if BUILDFLAG(ENABLE_SODA) - DCHECK(soda_client_); - if (!soda_client_->IsInitialized() || - soda_client_->DidAudioPropertyChange(sample_rate, channel_count)) { - // Initialize the SODA instance. - auto config_file_path = GetSodaConfigPath().value(); - SodaConfig config; - config.channel_count = channel_count; - config.sample_rate = sample_rate; - config.config_file = config_file_path.c_str(); - config.callback = RecognitionCallback; - config.callback_handle = this; - soda_client_->Reset(config); - } - - soda_client_->AddAudio(reinterpret_cast<char*>(buffer->data.data()), - data_size); -#endif // BUILDFLAG(ENABLE_SODA) -} - -} // namespace soda
diff --git a/chrome/services/soda/soda_recognizer_impl.h b/chrome/services/soda/soda_recognizer_impl.h deleted file mode 100644 index b78ef1ad..0000000 --- a/chrome/services/soda/soda_recognizer_impl.h +++ /dev/null
@@ -1,66 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_SERVICES_SODA_SODA_RECOGNIZER_IMPL_H_ -#define CHROME_SERVICES_SODA_SODA_RECOGNIZER_IMPL_H_ - -#include "base/memory/weak_ptr.h" -#include "build/branding_buildflags.h" -#include "chrome/services/soda/buildflags.h" -#include "media/mojo/mojom/soda_service.mojom.h" -#include "mojo/public/cpp/bindings/receiver.h" -#include "mojo/public/cpp/bindings/remote.h" - -namespace soda { - -class SodaClient; - -class SodaRecognizerImpl : public media::mojom::SodaRecognizer { - public: - using OnRecognitionEventCallback = - base::RepeatingCallback<void(const std::string& result)>; - - ~SodaRecognizerImpl() override; - - static void Create( - mojo::PendingReceiver<media::mojom::SodaRecognizer> receiver, - mojo::PendingRemote<media::mojom::SodaRecognizerClient> remote); - - OnRecognitionEventCallback recognition_event_callback() const { - return recognition_event_callback_; - } - - private: - explicit SodaRecognizerImpl( - mojo::PendingRemote<media::mojom::SodaRecognizerClient> remote); - - // Convert the audio buffer into the appropriate format and feed the raw audio - // into the SODA instance. - void SendAudioToSoda(media::mojom::AudioDataS16Ptr buffer) final; - - // Return the transcribed audio from the recognition event back to the caller - // via the recognition event client. - void OnRecognitionEvent(const std::string& result); - - // The remote endpoint for the mojo pipe used to return transcribed audio from - // the SODA service back to the renderer. - mojo::Remote<media::mojom::SodaRecognizerClient> client_remote_; - -#if BUILDFLAG(ENABLE_SODA) - std::unique_ptr<SodaClient> soda_client_; -#endif // BUILDFLAG(ENABLE_SODA) - - // The callback that is eventually executed on a speech recognition event - // which passes the transcribed audio back to the caller via the SODA - // recognition event client remote. - OnRecognitionEventCallback recognition_event_callback_; - - base::WeakPtrFactory<SodaRecognizerImpl> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(SodaRecognizerImpl); -}; - -} // namespace soda - -#endif // CHROME_SERVICES_SODA_SODA_RECOGNIZER_IMPL_H_
diff --git a/chrome/services/soda/soda_service_impl.cc b/chrome/services/soda/soda_service_impl.cc deleted file mode 100644 index 6c3ce9d..0000000 --- a/chrome/services/soda/soda_service_impl.cc +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/services/soda/soda_service_impl.h" - -#include "chrome/services/soda/soda_recognizer_impl.h" - -namespace soda { - -SodaServiceImpl::SodaServiceImpl( - mojo::PendingReceiver<media::mojom::SodaService> receiver) - : receiver_(this, std::move(receiver)) {} - -SodaServiceImpl::~SodaServiceImpl() = default; - -void SodaServiceImpl::BindContext( - mojo::PendingReceiver<media::mojom::SodaContext> context) { - soda_contexts_.Add(this, std::move(context)); -} - -void SodaServiceImpl::BindRecognizer( - mojo::PendingReceiver<media::mojom::SodaRecognizer> receiver, - mojo::PendingRemote<media::mojom::SodaRecognizerClient> client) { - SodaRecognizerImpl::Create(std::move(receiver), std::move(client)); -} - -} // namespace soda
diff --git a/chrome/services/soda/soda_service_impl.h b/chrome/services/soda/soda_service_impl.h deleted file mode 100644 index 663d9f3..0000000 --- a/chrome/services/soda/soda_service_impl.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_SERVICES_SODA_SODA_SERVICE_IMPL_H_ -#define CHROME_SERVICES_SODA_SODA_SERVICE_IMPL_H_ - -#include "media/mojo/mojom/soda_service.mojom.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver.h" -#include "mojo/public/cpp/bindings/receiver_set.h" - -namespace soda { - -class SodaServiceImpl : public media::mojom::SodaService, - public media::mojom::SodaContext { - public: - explicit SodaServiceImpl( - mojo::PendingReceiver<media::mojom::SodaService> receiver); - ~SodaServiceImpl() override; - - // media::mojom::SodaService - void BindContext( - mojo::PendingReceiver<media::mojom::SodaContext> context) override; - - // media::mojom::SodaContext - void BindRecognizer( - mojo::PendingReceiver<media::mojom::SodaRecognizer> receiver, - mojo::PendingRemote<media::mojom::SodaRecognizerClient> client) override; - - private: - mojo::Receiver<media::mojom::SodaService> receiver_; - - // The set of receivers used to receive messages from the renderer clients. - mojo::ReceiverSet<media::mojom::SodaContext> soda_contexts_; - - DISALLOW_COPY_AND_ASSIGN(SodaServiceImpl); -}; - -} // namespace soda - -#endif // CHROME_SERVICES_SODA_SODA_SERVICE_IMPL_H_
diff --git a/chrome/services/soda/BUILD.gn b/chrome/services/speech/BUILD.gn similarity index 73% rename from chrome/services/soda/BUILD.gn rename to chrome/services/speech/BUILD.gn index 419a29e..ebfdec78 100644 --- a/chrome/services/soda/BUILD.gn +++ b/chrome/services/speech/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") -import("//chrome/services/soda/buildflags.gni") +import("//chrome/services/speech/buildflags.gni") buildflag_header("buildflags") { header = "buildflags.h" @@ -12,10 +12,10 @@ source_set("lib") { sources = [ - "soda_recognizer_impl.cc", - "soda_recognizer_impl.h", - "soda_service_impl.cc", - "soda_service_impl.h", + "speech_recognition_recognizer_impl.cc", + "speech_recognition_recognizer_impl.h", + "speech_recognition_service_impl.cc", + "speech_recognition_service_impl.h", ] public_deps = [
diff --git a/chrome/services/soda/DEPS b/chrome/services/speech/DEPS similarity index 64% rename from chrome/services/soda/DEPS rename to chrome/services/speech/DEPS index e85f9b03..6d6606d 100644 --- a/chrome/services/soda/DEPS +++ b/chrome/services/speech/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+chrome/services/soda/internal", "+components/soda/constants.h", "+media", ]
diff --git a/chrome/services/soda/OWNERS b/chrome/services/speech/OWNERS similarity index 100% rename from chrome/services/soda/OWNERS rename to chrome/services/speech/OWNERS
diff --git a/chrome/services/soda/buildflags.gni b/chrome/services/speech/buildflags.gni similarity index 100% rename from chrome/services/soda/buildflags.gni rename to chrome/services/speech/buildflags.gni
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.cc b/chrome/services/speech/speech_recognition_recognizer_impl.cc new file mode 100644 index 0000000..ce995c4 --- /dev/null +++ b/chrome/services/speech/speech_recognition_recognizer_impl.cc
@@ -0,0 +1,103 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/services/speech/speech_recognition_recognizer_impl.h" + +#include "base/bind.h" +#include "components/soda/constants.h" +#include "media/base/audio_buffer.h" +#include "media/base/audio_sample_types.h" +#include "media/base/bind_to_current_loop.h" +#include "media/base/limits.h" +#include "media/mojo/common/media_type_converters.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" + +#if BUILDFLAG(ENABLE_SODA) +#include "chrome/services/soda/internal/soda_client.h" +#endif // BUILDFLAG(ENABLE_SODA) + +namespace speech { + +namespace { + +#if BUILDFLAG(ENABLE_SODA) +// Callback executed by the SODA library on a speech recognition event. The +// callback handle is a void pointer to the SpeechRecognitionRecognizerImpl that +// owns the SODA instance. SpeechRecognitionRecognizerImpl owns the SodaClient +// which owns the instance of SODA and their sequential destruction order +// ensures that this callback will never be called with an invalid callback +// handle to the SpeechRecognitionRecognizerImpl. +void RecognitionCallback(const char* result, void* callback_handle) { + DCHECK(callback_handle); + static_cast<SpeechRecognitionRecognizerImpl*>(callback_handle) + ->recognition_event_callback() + .Run(std::string(result)); +} +#endif // BUILDFLAG(ENABLE_SODA) + +} // namespace + +SpeechRecognitionRecognizerImpl::~SpeechRecognitionRecognizerImpl() = default; + +void SpeechRecognitionRecognizerImpl::Create( + mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver, + mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> + remote) { + mojo::MakeSelfOwnedReceiver( + base::WrapUnique(new SpeechRecognitionRecognizerImpl(std::move(remote))), + std::move(receiver)); +} + +void SpeechRecognitionRecognizerImpl::OnRecognitionEvent( + const std::string& result) { + client_remote_->OnSpeechRecognitionRecognitionEvent(result); +} + +SpeechRecognitionRecognizerImpl::SpeechRecognitionRecognizerImpl( + mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> remote) + : client_remote_(std::move(remote)) { + recognition_event_callback_ = media::BindToCurrentLoop( + base::Bind(&SpeechRecognitionRecognizerImpl::OnRecognitionEvent, + weak_factory_.GetWeakPtr())); +#if BUILDFLAG(ENABLE_SODA) + soda_client_ = std::make_unique<soda::SodaClient>(GetSodaBinaryPath()); +#endif // BUILDFLAG(ENABLE_SODA) +} + +void SpeechRecognitionRecognizerImpl::SendAudioToSpeechRecognitionService( + media::mojom::AudioDataS16Ptr buffer) { + int channel_count = buffer->channel_count; + int frame_count = buffer->frame_count; + int sample_rate = buffer->sample_rate; + int num_samples; + int data_size; + if (channel_count <= 0 || channel_count > media::limits::kMaxChannels || + sample_rate <= 0 || frame_count <= 0 || + !base::CheckMul(frame_count, channel_count).AssignIfValid(&num_samples) || + !base::CheckMul(num_samples, sizeof(int16_t)).AssignIfValid(&data_size)) { + mojo::ReportBadMessage("Invalid audio data received."); + return; + } + +#if BUILDFLAG(ENABLE_SODA) + DCHECK(soda_client_); + if (!soda_client_->IsInitialized() || + soda_client_->DidAudioPropertyChange(sample_rate, channel_count)) { + // Initialize the SODA instance. + auto config_file_path = GetSodaConfigPath().value(); + SodaConfig config; + config.channel_count = channel_count; + config.sample_rate = sample_rate; + config.config_file = config_file_path.c_str(); + config.callback = RecognitionCallback; + config.callback_handle = this; + soda_client_->Reset(config); + } + + soda_client_->AddAudio(reinterpret_cast<char*>(buffer->data.data()), + data_size); +#endif // BUILDFLAG(ENABLE_SODA) +} + +} // namespace speech
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.h b/chrome/services/speech/speech_recognition_recognizer_impl.h new file mode 100644 index 0000000..ff68e60a --- /dev/null +++ b/chrome/services/speech/speech_recognition_recognizer_impl.h
@@ -0,0 +1,72 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_SERVICES_SPEECH_SPEECH_RECOGNITION_RECOGNIZER_IMPL_H_ +#define CHROME_SERVICES_SPEECH_SPEECH_RECOGNITION_RECOGNIZER_IMPL_H_ + +#include "base/memory/weak_ptr.h" +#include "build/branding_buildflags.h" +#include "chrome/services/speech/buildflags.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace soda { +class SodaClient; +} // namespace soda + +namespace speech { + +class SpeechRecognitionRecognizerImpl + : public media::mojom::SpeechRecognitionRecognizer { + public: + using OnRecognitionEventCallback = + base::RepeatingCallback<void(const std::string& result)>; + + ~SpeechRecognitionRecognizerImpl() override; + + static void Create( + mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver, + mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> + remote); + + OnRecognitionEventCallback recognition_event_callback() const { + return recognition_event_callback_; + } + + private: + explicit SpeechRecognitionRecognizerImpl( + mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> + remote); + + // Convert the audio buffer into the appropriate format and feed the raw audio + // into the speech recognition instance. + void SendAudioToSpeechRecognitionService( + media::mojom::AudioDataS16Ptr buffer) final; + + // Return the transcribed audio from the recognition event back to the caller + // via the recognition event client. + void OnRecognitionEvent(const std::string& result); + + // The remote endpoint for the mojo pipe used to return transcribed audio from + // the speech recognition service back to the renderer. + mojo::Remote<media::mojom::SpeechRecognitionRecognizerClient> client_remote_; + +#if BUILDFLAG(ENABLE_SODA) + std::unique_ptr<soda::SodaClient> soda_client_; +#endif // BUILDFLAG(ENABLE_SODA) + + // The callback that is eventually executed on a speech recognition event + // which passes the transcribed audio back to the caller via the speech + // recognition event client remote. + OnRecognitionEventCallback recognition_event_callback_; + + base::WeakPtrFactory<SpeechRecognitionRecognizerImpl> weak_factory_{this}; + + DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionRecognizerImpl); +}; + +} // namespace speech + +#endif // CHROME_SERVICES_SPEECH_SPEECH_RECOGNITION_RECOGNIZER_IMPL_H_
diff --git a/chrome/services/speech/speech_recognition_service_impl.cc b/chrome/services/speech/speech_recognition_service_impl.cc new file mode 100644 index 0000000..7fc6f723 --- /dev/null +++ b/chrome/services/speech/speech_recognition_service_impl.cc
@@ -0,0 +1,30 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/services/speech/speech_recognition_service_impl.h" + +#include "chrome/services/speech/speech_recognition_recognizer_impl.h" + +namespace speech { + +SpeechRecognitionServiceImpl::SpeechRecognitionServiceImpl( + mojo::PendingReceiver<media::mojom::SpeechRecognitionService> receiver) + : receiver_(this, std::move(receiver)) {} + +SpeechRecognitionServiceImpl::~SpeechRecognitionServiceImpl() = default; + +void SpeechRecognitionServiceImpl::BindContext( + mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> context) { + speech_recognition_contexts_.Add(this, std::move(context)); +} + +void SpeechRecognitionServiceImpl::BindRecognizer( + mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver, + mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> + client) { + SpeechRecognitionRecognizerImpl::Create(std::move(receiver), + std::move(client)); +} + +} // namespace speech
diff --git a/chrome/services/speech/speech_recognition_service_impl.h b/chrome/services/speech/speech_recognition_service_impl.h new file mode 100644 index 0000000..4677116 --- /dev/null +++ b/chrome/services/speech/speech_recognition_service_impl.h
@@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_SERVICES_SPEECH_SPEECH_RECOGNITION_SERVICE_IMPL_H_ +#define CHROME_SERVICES_SPEECH_SPEECH_RECOGNITION_SERVICE_IMPL_H_ + +#include "media/mojo/mojom/speech_recognition_service.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace speech { + +class SpeechRecognitionServiceImpl + : public media::mojom::SpeechRecognitionService, + public media::mojom::SpeechRecognitionContext { + public: + explicit SpeechRecognitionServiceImpl( + mojo::PendingReceiver<media::mojom::SpeechRecognitionService> receiver); + ~SpeechRecognitionServiceImpl() override; + + // media::mojom::SpeechRecognitionService + void BindContext(mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> + context) override; + + // media::mojom::SpeechRecognitionContext + void BindRecognizer( + mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver, + mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> + client) override; + + private: + mojo::Receiver<media::mojom::SpeechRecognitionService> receiver_; + + // The set of receivers used to receive messages from the renderer clients. + mojo::ReceiverSet<media::mojom::SpeechRecognitionContext> + speech_recognition_contexts_; + + DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionServiceImpl); +}; + +} // namespace speech + +#endif // CHROME_SERVICES_SPEECH_SPEECH_RECOGNITION_SERVICE_IMPL_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index aece2fa1..a6a51473 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3466,6 +3466,7 @@ "../browser/ui/webui/local_state/local_state_ui_unittest.cc", "../browser/ui/webui/log_web_ui_url_unittest.cc", "../browser/update_client/chrome_update_query_params_delegate_unittest.cc", + "../browser/vr/metrics/session_tracker_unittest.cc", "../browser/vr/vr_tab_helper_unittest.cc", "../browser/wake_lock/wake_lock_permission_context_unittest.cc", "../browser/win/chrome_elf_init_unittest.cc",
diff --git a/chrome/test/chromedriver/log_replay/client_replay_unittest.py b/chrome/test/chromedriver/log_replay/client_replay_unittest.py index d5324f2b..206c55f 100755 --- a/chrome/test/chromedriver/log_replay/client_replay_unittest.py +++ b/chrome/test/chromedriver/log_replay/client_replay_unittest.py
@@ -403,11 +403,12 @@ all_tests_suite = unittest.defaultTestLoader.loadTestsFromModule( sys.modules[__name__]) - tests = unittest_util.FilterTestSuite(all_tests_suite, options.filter) - result = unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run(tests) + test_suite = unittest_util.FilterTestSuite(all_tests_suite, options.filter) + result = unittest.TextTestRunner(stream=sys.stdout, verbosity=2)\ + .run(test_suite) if options.isolated_script_test_output: - util.WriteResultToJSONFile(tests, result, + util.WriteResultToJSONFile([test_suite], [result], options.isolated_script_test_output) sys.exit(len(result.failures) + len(result.errors))
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 06eef9e..1acaae1 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -4400,15 +4400,34 @@ all_tests_suite = unittest.defaultTestLoader.loadTestsFromModule( sys.modules[__name__]) - tests = unittest_util.FilterTestSuite(all_tests_suite, options.filter) + test_suite = unittest_util.FilterTestSuite(all_tests_suite, options.filter) + test_suites = [test_suite] + ChromeDriverBaseTestWithWebServer.GlobalSetUp() + runner = unittest.TextTestRunner( stream=sys.stdout, descriptions=False, verbosity=2) - result = runner.run(tests) + result = runner.run(test_suite) + results = [result] + + num_failed = len(result.failures) + len(result.errors) + # Limit fail tests to 10 to avoid real bug causing many tests to fail + # Only enable retry for automated bot test + if (num_failed > 0 and num_failed <= 10 + and options.test_type == 'integration'): + retry_test_suite = unittest.TestSuite() + for f in result.failures: + retry_test_suite.addTest(f[0]) + for e in result.errors: + retry_test_suite.addTest(e[0]) + test_suites.append(retry_test_suite) + print '\nRetrying failed tests\n' + retry_result = runner.run(retry_test_suite) + results.append(retry_result) + ChromeDriverBaseTestWithWebServer.GlobalTearDown() if options.isolated_script_test_output: - util.WriteResultToJSONFile(tests, result, + util.WriteResultToJSONFile(test_suites, results, options.isolated_script_test_output) - - sys.exit(len(result.failures) + len(result.errors)) + sys.exit(len(results[-1].failures) + len(results[-1].errors))
diff --git a/chrome/test/chromedriver/util.py b/chrome/test/chromedriver/util.py index 15516ec..32f3c578 100644 --- a/chrome/test/chromedriver/util.py +++ b/chrome/test/chromedriver/util.py
@@ -265,17 +265,20 @@ raise RuntimeError('Cannot find open port') -def WriteResultToJSONFile(tests, result, json_path): - """Write a unittest result object to a file as a JSON. +def WriteResultToJSONFile(test_suites, results, json_path): + """Aggregate a list of unittest result object and write to a file as a JSON. - This takes a result object from a run of Python unittest tests and writes - it to a file in the correct format for the --isolated-script-test-output - argument passed to test isolates. + This takes a list of result object from one or more runs (for retry purpose) + of Python unittest tests; aggregates the list by appending each test result + from each run and writes to a file in the correct format + for the --isolated-script-test-output argument passed to test isolates. Args: - tests: unittest.TestSuite that was run to get the result object; iterated - to get all test cases that were run. - result: unittest.TextTestResult object returned from running unittest tests. + test_suites: a list of unittest.TestSuite that were run to get + the list of result object; each test_suite contains + the tests run and is iterated to get all test cases ran. + results: a list of unittest.TextTestResult object returned + from running unittest tests. json_path: desired path to JSON file of result. """ output = { @@ -287,17 +290,44 @@ 'version': 3, } - for test in tests: - output['tests'][test.id()] = { - 'expected': 'PASS', - 'actual': 'PASS' + def initialize(test_suite): + for test in test_suite: + if test.id() not in output['tests']: + output['tests'][test.id()] = { + 'expected': 'PASS', + 'actual': [] + } + + for test_suite in test_suites: + initialize(test_suite) + + def get_pass_fail(test_suite, result): + success = [] + fail = [] + for failure in result.failures + result.errors: + fail.append(failure[0].id()) + for test in test_suite: + if test.id() not in fail: + success.append(test.id()) + return { + 'success': success, + 'fail': fail, } - for failure in result.failures + result.errors: - output['tests'][failure[0].id()]['actual'] = 'FAIL' - output['tests'][failure[0].id()]['is_unexpected'] = True + for test_suite, result in zip(test_suites, results): + pass_fail = get_pass_fail(test_suite, result) + for s in pass_fail['success']: + output['tests'][s]['actual'].append('PASS') + for f in pass_fail['fail']: + output['tests'][f]['actual'].append('FAIL') - num_fails = len(result.failures) + len(result.errors) + num_fails = 0 + for test_result in output['tests'].itervalues(): + if test_result['actual'][-1] == 'FAIL': + num_fails += 1 + test_result['is_unexpected'] = True + test_result['actual'] = ' '.join(test_result['actual']) + output['num_failures_by_type']['FAIL'] = num_fails output['num_failures_by_type']['PASS'] = len(output['tests']) - num_fails
diff --git a/chrome/test/data/autofill/captured_sites/testcases.json b/chrome/test/data/autofill/captured_sites/testcases.json index 53d295ce..72f3014 100644 --- a/chrome/test/data/autofill/captured_sites/testcases.json +++ b/chrome/test/data/autofill/captured_sites/testcases.json
@@ -117,7 +117,7 @@ { "site_name": "mango" }, { "site_name": "mapsofindia" }, { "site_name": "mercurypay" }, - { "site_name": "mlbshop" }, + { "site_name": "mlbshop", "disabled":true, "bug_number":1069615 }, { "site_name": "modcloth" }, { "site_name": "moma" }, { "site_name": "monoprice" },
diff --git a/chrome/test/data/extensions/options.crx b/chrome/test/data/extensions/options.crx deleted file mode 100644 index f286e19d..0000000 --- a/chrome/test/data/extensions/options.crx +++ /dev/null Binary files differ
diff --git a/chrome/test/data/webui/chromeos/print_management/print_management_test.js b/chrome/test/data/webui/chromeos/print_management/print_management_test.js index 1d1b6b0b..fea31d7 100644 --- a/chrome/test/data/webui/chromeos/print_management/print_management_test.js +++ b/chrome/test/data/webui/chromeos/print_management/print_management_test.js
@@ -84,7 +84,6 @@ * @return {!Array<!HTMLElement>} */ function getPrintJobEntries(page) { - flush(); const entryList = page.$$('#entryList'); return Array.from( entryList.querySelectorAll('print-job-entry:not([hidden])')); @@ -186,6 +185,7 @@ }); teardown(function() { + mojoApi_ = null; page.remove(); page = null; }); @@ -198,6 +198,7 @@ mojoApi_.setPrintJobs(printJobs); page = document.createElement('print-management'); document.body.appendChild(page); + assert(!!page); flush(); } @@ -218,8 +219,8 @@ // app to sort the list when it first loads. Since reverse() mutates the // original array, use a copy array to prevent mutating |expectedArr|. initializePrintManagementApp(expectedArr.slice().reverse()); - - mojoApi_.whenCalled('getPrintJobs').then(() => { + return mojoApi_.whenCalled('getPrintJobs').then(() => { + flush(); verifyPrintJobs(expectedArr, getPrintJobEntries(page)); }); });
diff --git a/chrome/test/data/webui/new_tab_page/customize_backgrounds_test.js b/chrome/test/data/webui/new_tab_page/customize_backgrounds_test.js index cef418a9..997ba0f 100644 --- a/chrome/test/data/webui/new_tab_page/customize_backgrounds_test.js +++ b/chrome/test/data/webui/new_tab_page/customize_backgrounds_test.js
@@ -5,6 +5,7 @@ import 'chrome://new-tab-page/customize_backgrounds.js'; import {BrowserProxy} from 'chrome://new-tab-page/browser_proxy.js'; +import {BackgroundSelectionType} from 'chrome://new-tab-page/customize_dialog.js'; import {assertNotStyle, assertStyle, createTestProxy} from 'chrome://test/new_tab_page/test_support.js'; import {flushTasks, isVisible} from 'chrome://test/test_util.m.js'; @@ -19,6 +20,7 @@ async function createCustomizeBackgrounds() { const customizeBackgrounds = document.createElement('ntp-customize-backgrounds'); + customizeBackgrounds.theme = {}; document.body.appendChild(customizeBackgrounds); await handler.whenCalled('getBackgroundCollections'); await flushTasks(); @@ -54,11 +56,11 @@ assertStyle(customizeBackgrounds.$.images, 'display', 'none'); const tiles = customizeBackgrounds.shadowRoot.querySelectorAll('#collections .tile'); - assertEquals(tiles.length, 1); - assertEquals(tiles[0].getAttribute('title'), 'col_0'); + assertEquals(2, tiles.length); + assertEquals('col_0', tiles[1].getAttribute('title')); assertEquals( - tiles[0].querySelector('.image').path, - 'background_image?https://col_0.jpg'); + 'background_image?https://col_0.jpg', + tiles[1].querySelector('.image').path); }); test('clicking collection selects collection', async function() { @@ -70,10 +72,12 @@ const customizeBackgrounds = await createCustomizeBackgrounds(); // Act. - customizeBackgrounds.shadowRoot.querySelector('#collections .tile').click(); + customizeBackgrounds.shadowRoot + .querySelector('#collections .tile:nth-child(2)') + .click(); // Assert. - assertDeepEquals(customizeBackgrounds.selectedCollection, collection); + assertDeepEquals(collection, customizeBackgrounds.selectedCollection); }); test('setting collection requests images', async function() { @@ -91,7 +95,8 @@ test('Loading images shows image tiles', async function() { // Arrange. const image = { - label: 'image_0', + attribution1: 'image_0', + imageUrl: {url: 'https://example.com/image.png'}, previewImageUrl: {url: 'https://example.com/image.png'}, }; handler.setResultFor('getBackgroundImages', Promise.resolve({ @@ -119,7 +124,8 @@ test('Going back shows collections', async function() { // Arrange. const image = { - label: 'image_0', + attribution1: 'image_0', + imageUrl: {url: 'https://example.com/image.png'}, previewImageUrl: {url: 'https://example.com/image.png'}, }; const customizeBackgrounds = await createCustomizeBackgrounds(); @@ -137,4 +143,139 @@ assertNotStyle(customizeBackgrounds.$.collections, 'display', 'none'); assertStyle(customizeBackgrounds.$.images, 'display', 'none'); }); + + test('select image', async () => { + const image = { + attribution1: 'image_0', + imageUrl: {url: 'https://example.com/image.png'}, + previewImageUrl: {url: 'https://example.com/image.png'}, + }; + const customizeBackgrounds = await createCustomizeBackgrounds(); + handler.setResultFor('getBackgroundImages', Promise.resolve({ + images: [image], + })); + customizeBackgrounds.selectedCollection = createCollection(0); + await flushTasks(); + const element = + customizeBackgrounds.shadowRoot.querySelector('#images .tile'); + const item = customizeBackgrounds.$.imagesRepeat.itemForElement(element); + assertEquals(image.attribution1, item.attribution1); + assertEquals( + BackgroundSelectionType.NO_SELECTION, + customizeBackgrounds.backgroundSelection.type); + assertFalse(element.classList.contains('selected')); + element.click(); + assertEquals( + BackgroundSelectionType.IMAGE, + customizeBackgrounds.backgroundSelection.type); + assertDeepEquals(image, customizeBackgrounds.backgroundSelection.image); + assertTrue(element.classList.contains('selected')); + }); + + test('image selected by current theme', async () => { + const image = { + attribution1: 'image_0', + imageUrl: {url: 'https://example.com/image.png'}, + previewImageUrl: {url: 'https://example.com/image.png'}, + }; + const customizeBackgrounds = await createCustomizeBackgrounds(); + customizeBackgrounds.theme.backgroundImageUrl = { + url: 'https://example.com/image.png' + }; + handler.setResultFor('getBackgroundImages', Promise.resolve({ + images: [image], + })); + customizeBackgrounds.selectedCollection = createCollection(0); + await flushTasks(); + const element = + customizeBackgrounds.shadowRoot.querySelector('#images .tile'); + assertTrue(element.classList.contains('selected')); + }); + + test('deselected when background selection is not an image', async () => { + const image = { + attribution1: 'image_0', + imageUrl: {url: 'https://example.com/image.png'}, + previewImageUrl: {url: 'https://example.com/image.png'}, + }; + const customizeBackgrounds = await createCustomizeBackgrounds(); + handler.setResultFor('getBackgroundImages', Promise.resolve({ + images: [image], + })); + customizeBackgrounds.selectedCollection = createCollection(0); + await flushTasks(); + const element = + customizeBackgrounds.shadowRoot.querySelector('#images .tile'); + element.click(); + assertTrue(element.classList.contains('selected')); + customizeBackgrounds.backgroundSelection = { + type: BackgroundSelectionType.NO_BACKGROUND + }; + assertFalse(element.classList.contains('selected')); + }); + + suite('no background', () => { + let customizeBackgrounds; + + setup(async () => { + customizeBackgrounds = await createCustomizeBackgrounds(); + }); + + function assertNotSelected() { + assertFalse( + !!customizeBackgrounds.$.noBackground.querySelector('.selected')); + } + + function assertSelected() { + assertTrue( + !!customizeBackgrounds.$.noBackground.querySelector('.selected')); + } + + test('no background selected by default', () => { + assertSelected(); + }); + + test('no background selected when clicked', () => { + customizeBackgrounds.theme = {backgroundImageUrl: {url: 'http://a'}}; + customizeBackgrounds.backgroundSelection = { + type: BackgroundSelectionType.NO_SELECTION + }; + assertNotSelected(); + customizeBackgrounds.$.noBackground.click(); + assertSelected(); + }); + + test('not selected when refresh collection set', () => { + customizeBackgrounds.backgroundSelection = { + type: BackgroundSelectionType.NO_SELECTION + }; + customizeBackgrounds.theme = {}; + assertSelected(); + customizeBackgrounds.theme = {dailyRefreshCollectionId: 'landscape'}; + assertNotSelected(); + }); + + test('not selected when refresh collection set', () => { + customizeBackgrounds.backgroundSelection = { + type: BackgroundSelectionType.NO_SELECTION + }; + customizeBackgrounds.theme = {}; + assertSelected(); + customizeBackgrounds.theme = {backgroundImageUrl: {url: 'http://a'}}; + assertNotSelected(); + }); + + test('not selected when refresh toggle changed', () => { + customizeBackgrounds.backgroundSelection = { + type: BackgroundSelectionType.NO_SELECTION + }; + customizeBackgrounds.theme = {}; + assertSelected(); + customizeBackgrounds.backgroundSelection = { + type: BackgroundSelectionType.DAILY_REFRESH, + dailyRefreshCollectionId: 'landscape', + }; + assertNotSelected(); + }); + }); });
diff --git a/chrome/test/data/webui/new_tab_page/doodle_share_dialog_test.js b/chrome/test/data/webui/new_tab_page/doodle_share_dialog_test.js deleted file mode 100644 index 93e96c3..0000000 --- a/chrome/test/data/webui/new_tab_page/doodle_share_dialog_test.js +++ /dev/null
@@ -1,111 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'chrome://new-tab-page/doodle_share_dialog.js'; - -import {BrowserProxy} from 'chrome://new-tab-page/browser_proxy.js'; -import {createTestProxy} from 'chrome://test/new_tab_page/test_support.js'; - -suite('NewTabPageDoodleShareDialogTest', () => { - /** @type {!DoodleShareDialogElement} */ - let doodleShareDialog; - - /** - * @implements {BrowserProxy} - * @extends {TestBrowserProxy} - */ - let testProxy; - - setup(() => { - PolymerTest.clearBody(); - - testProxy = createTestProxy(); - BrowserProxy.instance_ = testProxy; - - doodleShareDialog = document.createElement('ntp-doodle-share-dialog'); - document.body.appendChild(doodleShareDialog); - }); - - test('creating doodle share dialog opens cr dialog', () => { - // Assert. - assertTrue(doodleShareDialog.$.dialog.open); - }); - - test('setting title, url shows title, url', () => { - // Act. - doodleShareDialog.title = 'foo'; - doodleShareDialog.url = {url: 'https://bar.com'}; - - // Assert. - assertEquals(doodleShareDialog.$.title.innerText, 'foo'); - assertEquals(doodleShareDialog.$.url.value, 'https://bar.com'); - }); - - const testParams = [ - { - label: 'Facebook', - buttonId: 'facebookButton', - url: 'https://www.facebook.com/dialog/share' + - '?app_id=738026486351791' + - `&href=${encodeURIComponent('https://bar.com')}` + - `&hashtag=${encodeURIComponent('#GoogleDoodle')}`, - }, - { - label: 'Twitter', - buttonId: 'twitterButton', - url: 'https://twitter.com/intent/tweet' + - `?text=${encodeURIComponent('foo\nhttps://bar.com')}`, - }, - ]; - - testParams.forEach(({label, buttonId, url}) => { - test(`clicking ${label} opens ${label}`, async () => { - // Arrange. - doodleShareDialog.title = 'foo'; - doodleShareDialog.url = {url: 'https://bar.com'}; - - // Act. - doodleShareDialog.$[buttonId].click(); - - // Assert. - const openedUrl = await testProxy.whenCalled('open'); - assertEquals(openedUrl, url); - }); - }); - - test(`clicking email navigates to email`, async () => { - // Arrange. - doodleShareDialog.title = 'foo'; - doodleShareDialog.url = {url: 'https://bar.com'}; - - // Act. - doodleShareDialog.$.emailButton.click(); - - // Assert. - const navigateUrl = await testProxy.whenCalled('navigate'); - assertEquals( - navigateUrl, - `mailto:?subject=foo&body=${encodeURIComponent('https://bar.com')}`); - }); - - test('clicking copy copies URL', async () => { - // Arrange. - doodleShareDialog.url = {url: 'https://bar.com'}; - - // Act. - doodleShareDialog.$.copyButton.click(); - - // Assert. - const text = await navigator.clipboard.readText(); - assertEquals(text, 'https://bar.com'); - }); - - test('clicking done closes dialog', async () => { - // Act. - doodleShareDialog.$.doneButton.click(); - - // Assert. - assertFalse(doodleShareDialog.$.dialog.open); - }); -});
diff --git a/chrome/test/data/webui/new_tab_page/logo_test.js b/chrome/test/data/webui/new_tab_page/logo_test.js index 0121edc..1be5b4f8 100644 --- a/chrome/test/data/webui/new_tab_page/logo_test.js +++ b/chrome/test/data/webui/new_tab_page/logo_test.js
@@ -8,27 +8,6 @@ import {assertNotStyle, assertStyle, createTestProxy, keydown} from 'chrome://test/new_tab_page/test_support.js'; import {eventToPromise, flushTasks} from 'chrome://test/test_util.m.js'; -function createImageDoodle(config = {}) { - const doodle = { - content: { - imageDoodle: { - imageUrl: {url: config.imageUrl || 'data:foo'}, - onClickUrl: {url: config.onClickUrl || 'https://foo.com'}, - shareButton: { - backgroundColor: {value: config.backgroundColor || 0xFFFF0000}, - x: config.x || 0, - y: config.y || 0, - iconUrl: {url: config.iconUrl || 'data:bar'}, - }, - } - } - }; - if (config.animationUrl) { - doodle.content.imageDoodle.animationUrl = {url: config.animationUrl}; - } - return doodle; -} - suite('NewTabPageLogoTest', () => { /** * @implements {BrowserProxy} @@ -55,13 +34,19 @@ test('setting simple doodle shows image', async () => { // Act. - const logo = await createLogo(createImageDoodle({ - imageUrl: 'data:foo', - backgroundColor: 0xFFFF0000, - x: 11, - y: 12, - iconUrl: 'data:bar', - })); + const logo = await createLogo({ + content: { + imageDoodle: { + imageUrl: {url: 'data:foo'}, + shareButton: { + backgroundColor: {value: 0xFFFF0000}, + x: 11, + y: 12, + iconUrl: {url: 'data:bar'}, + }, + } + } + }); // Assert. assertNotStyle(logo.$.doodle, 'display', 'none'); @@ -79,10 +64,14 @@ test('setting animated doodle shows image', async () => { // Act. - const logo = await createLogo(createImageDoodle({ - imageUrl: 'data:foo', - animationUrl: 'https://foo.com', - })); + const logo = await createLogo({ + content: { + imageDoodle: { + imageUrl: {url: 'data:foo'}, + animationUrl: {url: 'https://foo.com'}, + } + } + }); // Assert. assertNotStyle(logo.$.doodle, 'display', 'none'); @@ -107,7 +96,7 @@ test('disallowing doodle shows logo', async () => { // Act. - const logo = await createLogo(createImageDoodle()); + const logo = await await createLogo({content: {image: 'data:foo'}}); logo.doodleAllowed = false; // Assert. @@ -212,10 +201,14 @@ test('clicking simple doodle opens link', async () => { // Arrange. - const logo = await createLogo(createImageDoodle({ - imageUrl: 'data:foo', - onClickUrl: 'https://foo.com', - })); + const logo = await createLogo({ + content: { + imageDoodle: { + imageUrl: {url: 'data:foo'}, + onClickUrl: {url: 'https://foo.com'}, + } + } + }); // Act. logo.$.image.click(); @@ -248,10 +241,14 @@ test('clicking image of animated doodle starts animation', async () => { // Arrange. - const logo = await createLogo(createImageDoodle({ - imageUrl: 'data:foo', - animationUrl: 'https://foo.com', - })); + const logo = await createLogo({ + content: { + imageDoodle: { + imageUrl: {url: 'data:foo'}, + animationUrl: {url: 'https://foo.com'}, + } + } + }); // Act. logo.$.image.click(); @@ -265,11 +262,15 @@ test('clicking animation of animated doodle opens link', async () => { // Arrange. - const logo = await createLogo(createImageDoodle({ - imageUrl: 'data:foo', - animationUrl: 'https://foo.com', - onClickUrl: 'https://bar.com', - })); + const logo = await createLogo({ + content: { + imageDoodle: { + imageUrl: {url: 'data:foo'}, + animationUrl: {url: 'https://foo.com'}, + onClickUrl: {url: 'https://bar.com'}, + } + } + }); logo.$.image.click(); // Act. @@ -279,39 +280,4 @@ // Assert. assertEquals(url, 'https://bar.com'); }); - - test('share dialog removed on start', async () => { - // Arrange. - const logo = await createLogo(createImageDoodle()); - - // Assert. - assertFalse(!!logo.shadowRoot.querySelector('ntp-doodle-share-dialog')); - }); - - test('clicking share button adds share dialog', async () => { - // Arrange. - const logo = await createLogo(createImageDoodle()); - - // Act. - logo.$.shareButton.click(); - await flushTasks(); - - // Assert. - assertTrue(!!logo.shadowRoot.querySelector('ntp-doodle-share-dialog')); - }); - - test('closing share dialog removes share dialog', async () => { - // Arrange. - const logo = await createLogo(createImageDoodle()); - logo.$.shareButton.click(); - await flushTasks(); - - // Act. - logo.shadowRoot.querySelector('ntp-doodle-share-dialog') - .dispatchEvent(new Event('close')); - await flushTasks(); - - // Assert. - assertFalse(!!logo.shadowRoot.querySelector('ntp-doodle-share-dialog')); - }); });
diff --git a/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js b/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js index 88ec9c4..84a2abc 100644 --- a/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js +++ b/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js
@@ -158,15 +158,3 @@ TEST_F('NewTabPageLogoTest', 'All', function() { mocha.run(); }); - -// eslint-disable-next-line no-var -var NewTabPageDoodleShareDialogTest = class extends NewTabPageBrowserTest { - /** @override */ - get browsePreload() { - return 'chrome://new-tab-page/test_loader.html?module=new_tab_page/doodle_share_dialog_test.js'; - } -}; - -TEST_F('NewTabPageDoodleShareDialogTest', 'All', function() { - mocha.run(); -});
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn index 9292f050..1ccbd3a 100644 --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn
@@ -105,7 +105,7 @@ "//chrome/common/importer:interfaces", "//chrome/services/sharing", "//chrome/services/sharing/public/mojom", - "//chrome/services/soda:lib", + "//chrome/services/speech:lib", "//components/autofill/core/common", "//services/proxy_resolver:lib", ]
diff --git a/chrome/utility/DEPS b/chrome/utility/DEPS index 0a0bcbb0..f54f1e1 100644 --- a/chrome/utility/DEPS +++ b/chrome/utility/DEPS
@@ -14,7 +14,7 @@ "+chrome/services/qrcode_generator", "+chrome/services/removable_storage_writer", "+chrome/services/sharing", - "+chrome/services/soda/soda_service_impl.h", + "+chrome/services/speech/speech_recognition_service_impl.h", "+chrome/services/util_win/util_win_impl.h", "+chrome/services/util_win/public/mojom", "+chromeos/assistant/buildflags.h",
diff --git a/chrome/utility/services.cc b/chrome/utility/services.cc index b8355d7..f057013 100644 --- a/chrome/utility/services.cc +++ b/chrome/utility/services.cc
@@ -36,10 +36,10 @@ #include "chrome/services/qrcode_generator/qrcode_generator_service_impl.h" // nogncheck #include "chrome/services/sharing/public/mojom/sharing.mojom.h" #include "chrome/services/sharing/sharing_impl.h" -#include "chrome/services/soda/soda_service_impl.h" +#include "chrome/services/speech/speech_recognition_service_impl.h" #include "chrome/utility/importer/profile_import_impl.h" #include "components/mirroring/service/mirroring_service.h" -#include "media/mojo/mojom/soda_service.mojom.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" #include "services/proxy_resolver/proxy_resolver_factory_impl.h" // nogncheck #include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h" #endif // !defined(OS_ANDROID) @@ -139,8 +139,10 @@ return std::make_unique<sharing::SharingImpl>(std::move(receiver)); } -auto RunSodaService(mojo::PendingReceiver<media::mojom::SodaService> receiver) { - return std::make_unique<soda::SodaServiceImpl>(std::move(receiver)); +auto RunSpeechRecognitionService( + mojo::PendingReceiver<media::mojom::SpeechRecognitionService> receiver) { + return std::make_unique<speech::SpeechRecognitionServiceImpl>( + std::move(receiver)); } #endif // !defined(OS_ANDROID) @@ -242,7 +244,7 @@ RunQRCodeGeneratorService, RunMirroringService, RunSharing, - RunSodaService, + RunSpeechRecognitionService, #endif #if defined(OS_WIN)
diff --git a/chromeos/printing/uri.cc b/chromeos/printing/uri.cc new file mode 100644 index 0000000..90bb29c --- /dev/null +++ b/chromeos/printing/uri.cc
@@ -0,0 +1,416 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/printing/uri.h" + +#include <algorithm> + +#include "base/logging.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" + +#include "chromeos/printing/uri_impl.h" + +namespace chromeos { + +namespace { + +constexpr unsigned char kFirstPrintableChar = 32; +constexpr unsigned char kLastPrintableChar = 126; + +// Convert an input value 0-15 to a hex digit (0-9,A-H). +char ToHexDigit(uint8_t val) { + DCHECK_LT(val, 16); + if (val < 10) + return ('0' + val); + return ('A' + val - 10); +} + +// Helper class used to encode an input strings by %-escaping disallowed bytes. +class Encoder { + public: + // Constructor. The set of allowed characters = STD_CHARS + |additional|. + explicit Encoder(const std::string& additional) { Allow(additional); } + // Extends the set of allowed characters by |chars|. + // All characters in |chars| must be printable ASCII characters. + void Allow(const std::string& chars) { + for (char c : chars) { + const unsigned char uc = static_cast<unsigned char>(c); + DCHECK_GE(uc, kFirstPrintableChar); + DCHECK_LE(uc, kLastPrintableChar); + allowed_[uc - kFirstPrintableChar] = true; + } + } + // Removes |chars| from the set of allowed characters. + // All characters in |chars| must be printable ASCII characters. + void Disallow(const std::string& chars) { + for (char c : chars) { + const unsigned char uc = static_cast<unsigned char>(c); + DCHECK_GE(uc, kFirstPrintableChar); + DCHECK_LE(uc, kLastPrintableChar); + allowed_[uc - kFirstPrintableChar] = false; + } + } + // Encodes the input string |str| and appends the output string to |out|. + // |out| cannot be nullptr. |str| may contain UTF-8 characters, but cannot + // include ASCII characters from range [0,kFirstPrintablechar). + void EncodeAndAppend(const std::string& str, std::string* out) const { + for (auto it = str.begin(); it < str.end(); ++it) { + const unsigned char uc = static_cast<unsigned char>(*it); + DCHECK_GE(uc, kFirstPrintableChar); + if (uc <= kLastPrintableChar && allowed_[uc - kFirstPrintableChar]) { + out->push_back(*it); + } else { + out->push_back('%'); + out->push_back(ToHexDigit(uc >> 4)); + out->push_back(ToHexDigit(uc & 0x0f)); + } + } + } + // Encodes the input string |str| and returns it. |str| may contain UTF-8 + // characters, but cannot include ASCII characters from range + // [0,kFirstPrintablechar). + std::string Encode(const std::string& str) const { + std::string out; + out.reserve(str.size() * 5 / 4); + EncodeAndAppend(str, &out); + return out; + } + + private: + // The array of allowed characters. The first element corresponds to ASCII + // value 0x20 (space), the last one to 0x7E (~). Default value contains + // STD_CHARS. + // Clang formatting is deactivated for this piece of code. + // clang-format off + std::array<bool,95> allowed_ = + // ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + { 0,1,0,0,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0, + //@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, + //` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1 + }; + // clang-format on +}; + +// Returns true if given string has characters outside ASCII (outside 0x00-07F). +bool HasNonASCII(const std::string& str) { + return std::any_of(str.begin(), str.end(), [](char c) { + return static_cast<unsigned char>(c) > 0x7f; + }); +} + +} // namespace + +Uri::Uri() : pim_(std::make_unique<Pim>()) {} + +Uri::Uri(const std::string& uri) : pim_(std::make_unique<Pim>()) { + // Omits leading and trailing whitespaces ( \r\n\t\f\v). + const size_t prefix_size = + uri.size() - + base::TrimWhitespaceASCII(uri, base::TrimPositions::TRIM_LEADING).size(); + if (prefix_size == uri.size()) + return; + const size_t suffix_size = + uri.size() - + base::TrimWhitespaceASCII(uri, base::TrimPositions::TRIM_TRAILING).size(); + // Runs the parser. + pim_->ParseUri(uri.begin() + prefix_size, uri.end() - suffix_size); + pim_->parser_error().parsed_chars += prefix_size; +} + +int Uri::GetDefaultPort(const std::string& scheme) { + auto it = Pim::kDefaultPorts.find(scheme); + if (it == Pim::kDefaultPorts.end()) + return -1; + return it->second; +} + +Uri::Uri(const Uri& uri) : pim_(std::make_unique<Pim>(*uri.pim_)) {} + +Uri::Uri(Uri&& uri) : pim_(std::make_unique<Pim>()) { + pim_.swap(uri.pim_); +} + +Uri::~Uri() = default; + +Uri& Uri::operator=(const Uri& uri) { + *pim_ = *uri.pim_; + return *this; +} + +Uri& Uri::operator=(Uri&& uri) { + pim_.swap(uri.pim_); + return *this; +} + +const Uri::ParserError& Uri::GetLastParsingError() const { + return pim_->parser_error(); +} + +// If the Port is unspecified (==-1) it is not included in the output URI. +// If the Port is specified, it is included in the output URI <=> at least one +// of the following conditions is true: +// - |always_print_port| == true +// - Scheme has no default port number +// - Port is different than Scheme's default port number. +std::string Uri::GetNormalized(bool always_print_port) const { + // Calculates a string representation of the Port number. + std::string port; + if (pim_->port() >= 0 && + (always_print_port || Pim::kDefaultPorts.count(pim_->scheme()) == 0 || + Pim::kDefaultPorts.at(pim_->scheme()) != pim_->port())) + port = base::NumberToString(pim_->port()); + + // Output string. Adds Scheme. + std::string out = pim_->scheme(); + out.push_back(':'); + + // Adds authority (Userinfo + Host + Port) if non-empty. + Encoder enc("+&=:"); + if (!(pim_->userinfo().empty() && pim_->host().empty() && port.empty())) { + out.append("//"); + // Userinfo. + if (!pim_->userinfo().empty()) { + enc.EncodeAndAppend(pim_->userinfo(), &out); + out.push_back('@'); + } + // Host. + enc.EncodeAndAppend(pim_->host(), &out); + // Port. + if (!port.empty()) { + out.push_back(':'); + out.append(port); + } + } + + // Adds Path. + enc.Allow("@"); + for (auto& segment : pim_->path()) { + out.push_back('/'); + enc.EncodeAndAppend(segment, &out); + } + + // Adds Query. + enc.Disallow("+&="); + enc.Allow("/?"); + for (auto it = pim_->query().begin(); it != pim_->query().end(); ++it) { + if (it == pim_->query().begin()) { + out.push_back('?'); + } else { + out.push_back('&'); + } + enc.EncodeAndAppend(it->first, &out); + if (!it->second.empty()) { + out.push_back('='); + enc.EncodeAndAppend(it->second, &out); + } + } + + // Adds Fragment. + enc.Allow("+&="); + if (!pim_->fragment().empty()) { + out.push_back('#'); + enc.EncodeAndAppend(pim_->fragment(), &out); + } + + return out; +} + +bool Uri::IsASCII() const { + if (HasNonASCII(pim_->userinfo()) || HasNonASCII(pim_->host()) || + HasNonASCII(pim_->fragment())) { + return false; + } + for (auto& s : pim_->path()) { + if (HasNonASCII(s)) + return false; + } + for (auto& p : pim_->query()) { + if (HasNonASCII(p.first) || HasNonASCII(p.second)) + return false; + } + return true; +} + +std::string Uri::GetScheme() const { + return pim_->scheme(); +} + +bool Uri::SetScheme(const std::string& val) { + pim_->ResetParserError(); + return pim_->ParseScheme(val.begin(), val.end()); +} + +int Uri::GetPort() const { + return pim_->port(); +} + +bool Uri::SetPort(int val) { + pim_->ResetParserError(); + return pim_->SavePort(val); +} + +std::string Uri::GetUserinfo() const { + return pim_->userinfo(); +} +std::string Uri::GetHost() const { + return pim_->host(); +} +std::vector<std::string> Uri::GetPath() const { + return pim_->path(); +} +std::vector<std::pair<std::string, std::string>> Uri::GetQuery() const { + return pim_->query(); +} +std::string Uri::GetFragment() const { + return pim_->fragment(); +} + +std::string Uri::GetUserinfoEncoded() const { + Encoder enc("+&=:"); + return enc.Encode(pim_->userinfo()); +} +std::string Uri::GetHostEncoded() const { + Encoder enc("+&="); + return enc.Encode(pim_->host()); +} +std::vector<std::string> Uri::GetPathEncoded() const { + Encoder enc("+&=:@"); + std::vector<std::string> out(pim_->path().size()); + for (size_t i = 0; i < out.size(); ++i) + out[i] = enc.Encode(pim_->path()[i]); + return out; +} +std::string Uri::GetPathEncodedAsString() const { + Encoder enc("+&=:@"); + std::string out; + for (auto& segment : pim_->path()) + out += "/" + enc.Encode(segment); + return out; +} +std::vector<std::pair<std::string, std::string>> Uri::GetQueryEncoded() const { + Encoder enc(":@/?"); + std::vector<std::pair<std::string, std::string>> out(pim_->query().size()); + for (size_t i = 0; i < out.size(); ++i) { + out[i].first = enc.Encode(pim_->query()[i].first); + out[i].second = enc.Encode(pim_->query()[i].second); + } + return out; +} +std::string Uri::GetQueryEncodedAsString() const { + Encoder enc(":@/?"); + std::string out; + for (auto& param_value : pim_->query()) { + if (!out.empty()) + out.push_back('&'); + out += enc.Encode(param_value.first); + if (!param_value.second.empty()) + out += "=" + enc.Encode(param_value.second); + } + return out; +} +std::string Uri::GetFragmentEncoded() const { + Encoder enc("+&=:@/?"); + return enc.Encode(pim_->fragment()); +} + +bool Uri::SetUserinfo(const std::string& val) { + pim_->ResetParserError(); + return pim_->SaveUserinfo<false>(val); +} +bool Uri::SetHost(const std::string& val) { + pim_->ResetParserError(); + return pim_->SaveHost<false>(val); +} +bool Uri::SetPath(const std::vector<std::string>& val) { + pim_->ResetParserError(); + return pim_->SavePath<false>(val); +} +bool Uri::SetQuery( + const std::vector<std::pair<std::string, std::string>>& val) { + pim_->ResetParserError(); + return pim_->SaveQuery<false>(val); +} +bool Uri::SetFragment(const std::string& val) { + pim_->ResetParserError(); + return pim_->SaveFragment<false>(val); +} + +bool Uri::SetUserinfoEncoded(const std::string& val) { + pim_->ResetParserError(); + return pim_->SaveUserinfo<true>(val); +} +bool Uri::SetHostEncoded(const std::string& val) { + pim_->ResetParserError(); + return pim_->SaveHost<true>(val); +} +bool Uri::SetPathEncoded(const std::vector<std::string>& val) { + pim_->ResetParserError(); + return pim_->SavePath<true>(val); +} +bool Uri::SetPathEncoded(const std::string& val) { + pim_->ResetParserError(); + return pim_->ParsePath(val.begin(), val.end()); +} +bool Uri::SetQueryEncoded( + const std::vector<std::pair<std::string, std::string>>& val) { + pim_->ResetParserError(); + return pim_->SaveQuery<true>(val); +} +bool Uri::SetQueryEncoded(const std::string& val) { + pim_->ResetParserError(); + return pim_->ParseQuery(val.begin(), val.end()); +} +bool Uri::SetFragmentEncoded(const std::string& val) { + pim_->ResetParserError(); + return pim_->SaveFragment<true>(val); +} + +bool Uri::operator<(const Uri& uri) const { + if (pim_->scheme() < uri.pim_->scheme()) + return true; + if (pim_->scheme() > uri.pim_->scheme()) + return false; + if (pim_->userinfo() < uri.pim_->userinfo()) + return true; + if (pim_->userinfo() > uri.pim_->userinfo()) + return false; + if (pim_->host() < uri.pim_->host()) + return true; + if (pim_->host() > uri.pim_->host()) + return false; + if (pim_->port() < uri.pim_->port()) + return true; + if (pim_->port() > uri.pim_->port()) + return false; + if (pim_->path() < uri.pim_->path()) + return true; + if (pim_->path() > uri.pim_->path()) + return false; + if (pim_->query() < uri.pim_->query()) + return true; + if (pim_->query() > uri.pim_->query()) + return false; + return (pim_->fragment() < uri.pim_->fragment()); +} + +bool Uri::operator==(const Uri& uri) const { + if (pim_->scheme() != uri.pim_->scheme()) + return false; + if (pim_->userinfo() != uri.pim_->userinfo()) + return false; + if (pim_->host() != uri.pim_->host()) + return false; + if (pim_->port() != uri.pim_->port()) + return false; + if (pim_->path() != uri.pim_->path()) + return false; + if (pim_->query() != uri.pim_->query()) + return false; + return (pim_->fragment() == uri.pim_->fragment()); +} + +} // namespace chromeos
diff --git a/chromeos/printing/uri.h b/chromeos/printing/uri.h index fd4aa66..b2af5bc 100644 --- a/chromeos/printing/uri.h +++ b/chromeos/printing/uri.h
@@ -257,7 +257,7 @@ Uri(); // Constructor, it tries to parse |uri|. - // Leading and trailing white spaces (space, \t, \n, \r, \f) are ignored. + // Leading and trailing whitespaces (space, \t, \n, \r, \f, \v) are ignored. explicit Uri(const std::string& uri); Uri(const Uri&); @@ -367,4 +367,4 @@ } // namespace chromeos -#endif /* CHROMEOS_PRINTING_URI_H_ */ +#endif // CHROMEOS_PRINTING_URI_H_
diff --git a/chromeos/printing/uri_impl.h b/chromeos/printing/uri_impl.h new file mode 100644 index 0000000..ff7c82d0 --- /dev/null +++ b/chromeos/printing/uri_impl.h
@@ -0,0 +1,133 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_PRINTING_URI_IMPL_H_ +#define CHROMEOS_PRINTING_URI_IMPL_H_ + +#include <map> +#include <string> +#include <utility> +#include <vector> + +#include "chromeos/printing/uri.h" + +// This file contains a declaration of struct used in the implementation of +// class Uri declared in uri.h. This file is not supposed to be included +// anywhere outside of the class Uri. + +namespace chromeos { + +using Iter = std::string::const_iterator; + +class Uri::Pim { + public: + // The map with pairs scheme -> default_port. + static const std::map<std::string, int> kDefaultPorts; + + // Resets the internal field |parser_error|. + void ResetParserError() { + parser_error_.parsed_chars = 0; + parser_error_.parsed_strings = 0; + parser_error_.status = ParserStatus::kNoErrors; + } + + // These methods parse and normalize the corresponding component(s) from the + // input string |begin|-|end|. Each component is saved only if successfully + // parsed and verified. In case of an error, the field |parser_error| is set + // and false is returned. All methods assume that |begin| <= |end|. + // Additional notes for particular components: + // * Scheme: if the current Port is unspecified and the new Scheme has + // default port number, the Port is set to this default value + // * Authority: this is Userinfo + Host + Port, see description in uri.h for + // the grammar + // * Path: the input string must be empty or starts from '/' + bool ParseScheme(const Iter& begin, const Iter& end); + bool ParseAuthority(const Iter& begin, const Iter& end); + bool ParsePath(const Iter& begin, const Iter& end); + bool ParseQuery(const Iter& begin, const Iter& end); + bool ParseFragment(const Iter& begin, const Iter& end); + + // This method parse the whole URI. It calls internally the methods + // Parse*(...) declared above. In case of an error, the method set the field + // |parser_error| and returns false. Parsing stops on the first error, + // components that have been successfully parsed are saved. + bool ParseUri(const Iter& begin, const Iter end); + + // This method fails (and return false) <=> |port| is smaller than -1 or + // larger than 65535. If |port| == -1 and the current Scheme has a default + // port, the default port is set as a new Port number. + bool SavePort(int port); + + // These methods save values of corresponding components. The template + // parameter |encoded| trigger resolution of %-escaped characters. If set to + // true, every % sign in the input value is treated as the beginning of + // %-escaped character; if set to false, % signs are treated as regular ASCII + // characters. All input values are validated and normalized, but without + // %-escaping fragile characters (components are stored in "native" form). In + // case of a failure, false is returned, the value of target component is not + // modified, and the field |parser_error| is set accordingly. + template <bool encoded> + bool SaveUserinfo(const std::string& val); + template <bool encoded> + bool SaveHost(const std::string& val); + template <bool encoded> + bool SavePath(const std::vector<std::string>& val); + template <bool encoded> + bool SaveQuery(const std::vector<std::pair<std::string, std::string>>& val); + template <bool encoded> + bool SaveFragment(const std::string& val); + + // Getters for all fields. + const std::string& scheme() const { return scheme_; } + const std::string& userinfo() const { return userinfo_; } + const std::string& host() const { return host_; } + int port() const { return port_; } + const std::vector<std::string>& path() const { return path_; } + const std::vector<std::pair<std::string, std::string>>& query() const { + return query_; + } + const std::string& fragment() const { return fragment_; } + + // Access to the |parser_error_| + ParserError& parser_error() { return parser_error_; } + + private: + // Reads the string |begin|-|end| and perform the following operations: + // 1. if |plus_to_space| is true, all '+' signs are converted to ' ' (space) + // 2. if |encoded| is true, all % signs are treated as initiators of + // %-escaped characters and decoded to corresponding ASCII + // 3. if |case_insensitive| is true, all capital ASCII letters are converted + // to lowercase + // 4. all UTF-8 characters are validated + // 5. all ASCII characters are validated (see the section Encoding in uri.h) + // The output is saved to |out|. In case of an error, the method set the field + // |parser_error| and returns false. + // The following initial requirements must be met: + // * |begin| <= |end| + // * |out| must point to an empty string + // When the method returns false, |out| may contain invalid value. + template <bool encoded, bool case_insensitive = false> + bool ParseString(const Iter& begin, + const Iter& end, + std::string* out, + bool plus_to_space = false); + + // Components values. They are valid and normalized, but before %-escaping. + std::string scheme_; + std::string userinfo_; + std::string host_; + int port_ = -1; // -1 means "unspecified" + // A list of path's segments, without separators ('/'). + std::vector<std::string> path_; + // A list of parameters name=value; value may be empty. + std::vector<std::pair<std::string, std::string>> query_; + std::string fragment_; + + // The last parser status. + ParserError parser_error_; +}; + +} // namespace chromeos + +#endif // CHROMEOS_PRINTING_URI_IMPL_H_
diff --git a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc index b1a62fa8..4e1fbb4 100644 --- a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc +++ b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
@@ -104,7 +104,7 @@ return mojom::CachedVpdInfo::New("fake_sku_number" /* sku_number */); } -base::Optional<std::vector<mojom::CpuInfoPtr>> MakeCpuInfo() { +mojom::CpuResultPtr MakeCpuResult() { std::vector<mojom::CpuInfoPtr> cpu_info; cpu_info.push_back(mojom::CpuInfo::New( "Dank CPU 1" /* model_name */, @@ -114,7 +114,7 @@ "Dank CPU 2" /* model_name */, mojom::CpuArchitectureEnum::kX86_64 /* architecture */, 2600000 /* max_clock_speed_khz */)); - return cpu_info; + return mojom::CpuResult::NewCpuInfo(std::move(cpu_info)); } mojom::TimezoneInfoPtr MakeTimezoneInfo() { @@ -149,7 +149,7 @@ return mojom::TelemetryInfo::New( MakeBatteryInfo() /* battery_info */, MakeNonRemovableBlockDeviceInfo() /* block_device_info */, - MakeCachedVpdInfo() /* vpd_info */, MakeCpuInfo() /* cpu_info */, + MakeCachedVpdInfo() /* vpd_info */, MakeCpuResult() /* cpu_result */, MakeTimezoneInfo() /* timezone_info */, MakeMemoryInfo() /* memory_info */, MakeBacklightInfo() /* backlight_info */, MakeFanInfo() /* fan_info */
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom index cd8aa88d..d22fb65 100644 --- a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom +++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
@@ -30,6 +30,25 @@ kFan, }; +// An enumeration of the different categories of errors that can occur when +// probing telemetry information. +[Extensible] +enum ErrorType { + // An error reading a system file. + kFileReadError, + // An error parsing data into a consumable form. + kParseError, +}; + +// Structure that contains error information for a telemetry probe. +struct ProbeError { + // The type of error that occurred. + ErrorType type; + // A debug message with more information about the error. This string is not + // intended to be shown to the user. + string msg; +}; + // Information related to a Smart Battery, as defined in // http://sbs-forum.org/specs/sbdat110.pdf. struct SmartBatteryInfo { @@ -93,6 +112,15 @@ string? sku_number; }; +// CPU probe result. Can either be populated with the CpuInfo or an error +// retrieving the information. +union CpuResult { + // Valid CpuInfo. + array<CpuInfo> cpu_info; + // The error that occurred attempting to retrieve the CpuInfo. + ProbeError error; +}; + // Information related to a device's CPU. struct CpuInfo { // The CPU model name. @@ -160,7 +188,7 @@ CachedVpdInfo? vpd_info; // Information about each of the device's CPUs. Only present when kCpu was // included in the categories input to ProbeTelemetryInfo. - array<CpuInfo>? cpu_info; + CpuResult? cpu_result; // Information about the device's timezone. Only present when kTimezone was // included in the categories input to ProbeTelemetryInfo. TimezoneInfo? timezone_info;
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 3b258d6..ad440c37 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -2335,7 +2335,7 @@ <translation id="4389091865841123886">Permite configurar la atestación remota con el mecanismo de TPM.</translation> <translation id="4401496838830169080">Te permite controlar si se habilita o no la función de Navegación segura de <ph name="PRODUCT_NAME" /> y el modo en el que opera. - Si se establece esta política como "NoProtection" (value 0), no se activará nunca la Navegación segura. + Si se establece esta política como "NoProtection" (valor 0), no se activará nunca la Navegación segura. Si se establece como "StandardProtection" (valor 1, el cual es el predeterminado), la Navegación segura estará siempre activa en el modo estándar. @@ -4444,7 +4444,7 @@ Si la habilitas o inhabilitas, los usuarios no podrán cambiar ni anular la configuración para habilitar la protección contra software malicioso y suplantación de identidad (phishing) en <ph name="PRODUCT_NAME" />. - Si no se establece esta política, la configuración estará habilitada, pero el usuario podrá cambiarla. + Si no se establece esta política, la protección estará habilitada, pero el usuario podrá cambiarla. Para obtener más información sobre la Navegación segura, consulta https://developers.google.com/safe-browsing.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index a0fe1cfb..9f49051 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -4515,7 +4515,7 @@ Als je deze instelling in- of uitschakelt, kunnen gebruikers de instelling 'Bescherming tegen phishing en malware inschakelen' in <ph name="PRODUCT_NAME" /> niet wijzigen of overschrijven. - Als dit beleid niet is ingesteld, is het beleid ingeschakeld, maar kan de gebruiker dit wijzigen. + Als dit beleid niet is ingesteld, is Safe Browsing ingeschakeld, maar kan de gebruiker dit wijzigen. Zie https://developers.google.com/safe-browsing voor meer informatie over Safe Browsing.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index d740251..2714a97e 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -4419,7 +4419,7 @@ <translation id="7687943045976362719">Se esta política for definida, os tipos de conteúdo especificados serão processados pelo <ph name="PRODUCT_FRAME_NAME" />. Se esta política não for definida, o renderizador padrão será usado para todos os sites. A política <ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" /> pode ser usada para configurar o renderizador padrão.</translation> -<translation id="7691028179743802462">Essa política está obsoleta na versão M83, use a SafeBrowsingProtectionLevel. +<translation id="7691028179743802462">Essa política está obsoleta na versão M83. Use a SafeBrowsingProtectionLevel. Ativa o recurso "Navegação segura" do <ph name="PRODUCT_NAME" /> e impede que os usuários mudem essa configuração. @@ -4429,7 +4429,7 @@ Se você ativar ou desativar essa configuração, os usuários não poderão mudar ou substituir a configuração "Ativar proteção contra phishing e malware" no <ph name="PRODUCT_NAME" />. - Se esta política não for definida, a configuração será ativada, mas os usuários não poderão mudá-la. + Se esta política não for definida, a configuração será ativada, mas os usuários poderão mudá-la. Consulte https://developers.google.com/safe-browsing (em inglês) para ver mais informações sobre o "Navegação segura".
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index ff5b550..7574f12 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -384,6 +384,7 @@ <translation id="1561424797596341174">Politika, uzaktan erişim ana makinesinin Hata Ayıklama yapılarını geçersiz kılar</translation> <translation id="1561967320164410511">Bağımsız doğrulama için U2F plus uzantıları</translation> <translation id="1583248206450240930">Varsayılan olarak <ph name="PRODUCT_FRAME_NAME" /> ürününü kullan</translation> +<translation id="1588240398285670601">Tarayıcı Ayarları</translation> <translation id="1599424828227887013">Android cihazlarda Site İzolasyonu'nu belirtilen kaynaklar için etkinleştirme</translation> <translation id="1608755754295374538">Soru sorulmadan ses yakalama cihazlarına erişim verilecek URL'ler</translation> <translation id="1615221548356595305">İstemci sertifikaları kullanıldığında bile bu ana makineler için HTTP/2 bağlantılarının birleşmesine izin ver</translation> @@ -1369,6 +1370,7 @@ <translation id="2872961005593481000">Kapat</translation> <translation id="2873651257716068683">Varsayılan yazdırma sayfası boyutunu geçersiz kılar. Sayfa boyutu mevcut değilse bu politika yoksayılır.</translation> <translation id="2874209944580848064">Android uygulamalarını destekleyen <ph name="PRODUCT_OS_NAME" /> cihazlarına ilişkin not:</translation> +<translation id="2874901846804525128">Kullanıcının güvenilmeyen kaynaklardan Android uygulamaları kullanmasını engelle.</translation> <translation id="2875192972412983412">Sunucu yazıcıları için sorgulanacak yazdırma sunucuları alt grubunu belirtir. Bu politika kullanılırsa kullanıcı yalnızca kimlikleri bu politikadaki değerlerle eşleşen sunucu yazıcıları kullanabilir. @@ -2999,6 +3001,7 @@ True (doğru) olarak ayarlanırsa veya yapılandırılmazsa, bu kullanıcı denetlenen kullanıcılar oluşturabilir ve denetlenen kullanıcıları yönetebilir.</translation> <translation id="5369937289900051171">Yalnızca renkli yazdır</translation> <translation id="5370279767682621504">Varsayılan olmayan bağlantı noktalarında HTTP/0.9 desteğini etkinleştir</translation> +<translation id="5377606826822211923">Kullanıcı için güvenilmeyen kaynaklardan Android uygulaması kullanımının kontrolü</translation> <translation id="5378985487213287085">Web sitelerinin masaüstü bildirimleri görüntülemesine izin verilip verilmeyeceğini ayarlamanıza olanak tanır. Varsayılan olarak masaüstü bildirimlerinin görüntülenmesine izin verilebilir, varsayılan olarak bu reddedilebilir veya bir web sitesi her masaüstü bildirimi gösterme isteğinde bulunduğunda kullanıcıya sorulabilir. Bu politika ayarlanmadan bırakılırsa, 'AskNotifications' kullanılır ve kullanıcı ayarı değiştirebilir.</translation> @@ -3803,6 +3806,7 @@ Bu politikanın, EnabledPlugins ve DisabledPluginsExceptions politikaları tarafından geçersiz kılınabileceğini unutmayın. Bu politika ayarlanmadan bırakılırsa kullanıcı, sabit kodlu, uyumsuz, eski veya tehlikeli eklentiler hariç sistemde yüklü herhangi bir eklentiyi kullanabilir.</translation> +<translation id="6571871508154591774">Devre dışı bırakılacak kamera, tarayıcı ayarları ve OS ayarları özellikleri</translation> <translation id="6573305661369899995">URL kısıtlamaları için harici kaynak ayarla</translation> <translation id="6583851521569686409">Yazıcılar listesini yapılandırır. @@ -3879,6 +3883,7 @@ <translation id="6731757988219967594">Üst düzey siteleri (ancak yerleştirilmiş iframe'leri değil) yetişkinlere yönelik içerik için filtrele</translation> <translation id="6734521799274931721">ChromeOS için Ağ Üzerinde Dosya Paylaşımı'nın kullanılabilirliğini kontrol eder</translation> <translation id="6735701345096330595">Yazım denetimi dillerini etkinleştirmeye zorla</translation> +<translation id="6737677282967014160">Kullanıcının güvenilmeyen kaynaklardan Android uygulamaları kullanmasına izin ver.</translation> <translation id="6757613329154374267">Yedekleme ve geri yükleme özelliği etkinleştirildi</translation> <translation id="6758659208493449452">Bu politika, Gelişmiş Koruma programına kayıtlı kullanıcılara ekstra özellikler sunulup sunulmayacağını kontrol eder. Bu özelliklerin bazıları kapsamında Google ile veri paylaşılabilir (örneğin, Gelişmiş Koruma kullanıcıları indirdikleri dosyaları Google'a göndererek kötü amaçlı yazılıma karşı taranmasını sağlayabilir). Bu politika True (Doğru) değerine ayarlanır veya ayarlanmadan bırakılırsa kayıtlı kullanıcılara ekstra özellikler sunulur. Bu politika False (Yanlış) değerine ayarlanırsa Gelişmiş Koruma kullanıcılarına yalnızca standart tüketici özellikleri sunulur.</translation> <translation id="6762235610019366960"><ph name="PRODUCT_NAME" /> içindeki tam sekme tanıtım ve/veya eğitim amaçlı içeriğin sunumunu kontrol etmeye izin verir. @@ -4420,6 +4425,13 @@ URL kalıpları, https://www.chromium.org/administrators/url-blacklist-filter-format adresinde belirtilen "URLBlacklist" politikasıyla aynı biçime sahiptir. </translation> <translation id="7566878661979235378">SAML oturum açma kimlik doğrulama türü</translation> +<translation id="7567373982693549834">Bu politika, güvenilmeyen kaynaklardan (Google Play Store dışında) Android uygulamalarının kullanımını kullanıcı bazında kontrol eder. + + Bu politikanın değeri ayarlanmazsa işleve izin verilmiyor olarak değerlendirilir. + + Kullanıcının cihazı yönetiliyorsa bu işlevin kullanılabilirliği, ek olarak ilgili cihaz politikasına da bağlıdır. + + Kullanıcının cihazı yönetilmiyorsa bu işlevin kullanılabilirliği, ek olarak kullanıcının cihazın sahibi olup olmamasına da bağlıdır.</translation> <translation id="757395965347379751">Bu ayar etkinleştirildiğinde <ph name="PRODUCT_NAME" />, başarılı bir şekilde doğrulanan ve yerel olarak yüklenmiş CA sertifikalarıyla zincirleme bağlantı kuran SHA-1 imzalı sertifikalara izin verir. Bu politikanın, SHA-1 imzalarına izin veren işletim sistemi sertifika doğrulama yığınına bağlı olduğu unutulmamalıdır. Bir işletim sistemi güncellemesi, işletim sisteminin SHA-1 sertifikalarını işleme şeklini değiştirirse bu politikanın etkisi ortadan kalkabilir. Bunun yanı sıra, bu politika kurumlara SHA-1'i kullanımdan kaldırmaları için zaman kazandıran geçici bir çözüm sağlamak amacıyla hazırlanmıştır. Bu politika, 1 Ocak 2019'da veya buna yakın bir tarihte kaldırılacaktır. @@ -4613,6 +4625,7 @@ Not: <ph name="DEVICE_LOGIN_SCREEN_HIGH_CONTRAST_ENABLED_POLICY_NAME" /> belirtilmişse bu politikayı geçersiz kılar.</translation> <translation id="7846952520291088817">WebRTC ICE adaylarında sunulan yerel IP'ler için URL'ler</translation> +<translation id="7848641140449742406">OS Ayarları</translation> <translation id="7858404742201086014">Bu ayarı etkinleştirirseniz eski eklentiler normal eklentiler gibi kullanılır. Bu ayarı devre dışı bırakırsanız eski eklentiler kullanılmaz ve kullanıcılardan bu eklentilerin çalıştırılması için izin istenmez.
diff --git a/components/schema_org/BUILD.gn b/components/schema_org/BUILD.gn index 90ce2a0..d581bc8f 100644 --- a/components/schema_org/BUILD.gn +++ b/components/schema_org/BUILD.gn
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/compiled_action.gni") + source_set("unit_tests") { testonly = true sources = [ @@ -22,6 +24,26 @@ ] } +executable("schema_org_name_generator") { + sources = [ "schema_org_name_generator.cc" ] + deps = [ + "//base", + "//url", + ] +} + +compiled_action("schema_org_name_data") { + tool = ":schema_org_name_generator" + + args = [ + rebase_path("//third_party/schema_org/schema.jsonld", root_build_dir), + rebase_path("//third_party/schema_org/overrides.jsonld", root_build_dir), + rebase_path("$target_gen_dir/schema_org_name_data.json", root_build_dir), + ] + + outputs = [ "$target_gen_dir/schema_org_name_data.json" ] +} + action("generate_schema_org_code") { script = "//components/schema_org/generate_schema_org_code.py" sources = [ @@ -41,6 +63,9 @@ "--overrides-file", rebase_path("//third_party/schema_org/overrides.jsonld", root_build_dir), + "--name-file", + rebase_path("$target_gen_dir/schema_org_name_data.json", + root_build_dir), "--output-dir", rebase_path("$target_gen_dir", root_build_dir), "--templates", @@ -55,6 +80,7 @@ "$target_gen_dir/schema_org_enums.h", "$target_gen_dir/schema_org_enums.cc", ] + deps = [ ":schema_org_name_data" ] } static_library("schema_org_properties") {
diff --git a/components/schema_org/generate_schema_org_code.py b/components/schema_org/generate_schema_org_code.py index 20d8ab4c..b53e6abe 100644 --- a/components/schema_org/generate_schema_org_code.py +++ b/components/schema_org/generate_schema_org_code.py
@@ -50,9 +50,20 @@ return parent_class['@id'] == schema_org_id('Enumeration') -def find_enum_options(obj_id, schema): +def make_entity(thing, names): + return { + "name": object_name_from_id(thing['@id']), + "name_hash": names[object_name_from_id(thing['@id'])] + } + + +def make_entity_from_name(name, names): + return {"name": name, "name_hash": names[name]} + + +def find_enum_options(obj_id, schema, names): return [ - object_name_from_id(obj['@id']) for obj in schema['@graph'] + make_entity(obj, names) for obj in schema['@graph'] if obj['@type'] == obj_id ] @@ -85,10 +96,11 @@ return class_obj -def parse_property(prop, schema): +def parse_property(prop, schema, names): """Parse out details about the property, including what type it can be.""" parsed_prop = { 'name': object_name_from_id(prop['@id']), + 'name_hash': names[object_name_from_id(prop['@id'])], 'thing_types': [], 'enum_types': [] } @@ -142,7 +154,7 @@ obj_name = object_name_from_id(thing['@id']) if obj_name in lookup_table: return lookup_table[obj_name] - lookup_table[obj_name] = [] + lookup_table[obj_name] = set() if 'rdfs:subClassOf' in thing: parent_classes = thing['rdfs:subClassOf'] @@ -160,48 +172,70 @@ ] # flatten the list found_parents = [item for sublist in found_parents for item in sublist] - lookup_table[obj_name].extend(found_parents) + lookup_table[obj_name].update(found_parents) - lookup_table[obj_name].append(obj_name) + lookup_table[obj_name].add(obj_name) return lookup_table[obj_name] -def get_template_vars(schema_file_path, overrides_file_path): - """Read the needed template variables from the schema file.""" - template_vars = { - 'entities': [], - 'properties': [], - 'enums': [], - 'entity_parent_lookup': {} - } - +def get_template_vars_from_file(schema_file_path, overrides_file_path, + name_file_path): with open(schema_file_path) as schema_file: schema = json.loads(schema_file.read()) + with open(name_file_path) as names_file: + names = json.loads(names_file.read()) + if overrides_file_path: with open(overrides_file_path) as overrides_file: overrides = json.loads(overrides_file.read()) for thing in overrides['@graph']: merge_with_schema(schema, overrides, thing) + return get_template_vars(schema, names) + + +def get_template_vars(schema, names): + """Read the needed template variables from the schema file.""" + template_vars = { + 'entities': [], + 'properties': [], + 'enums': [], + 'entity_parent_lookup': [] + } + + entity_parent_lookup = {} + for thing in schema['@graph']: if thing['@type'] == 'rdfs:Class': - template_vars['entities'].append(object_name_from_id(thing['@id'])) - lookup_parents(thing, schema, - template_vars['entity_parent_lookup']) + template_vars['entities'].append(make_entity(thing, names)) + lookup_parents(thing, schema, entity_parent_lookup) if is_enum_type(thing): template_vars['enums'].append({ 'name': object_name_from_id(thing['@id']), 'id': thing['@id'], + 'id_hash': + names[thing['@id']], 'options': - find_enum_options(thing['@id'], schema) + find_enum_options(thing['@id'], schema, names) }) elif thing['@type'] == 'rdf:Property': - template_vars['properties'].append(parse_property(thing, schema)) + template_vars['properties'].append( + parse_property(thing, schema, names)) - template_vars['entities'].sort() + for entity, parents in entity_parent_lookup.iteritems(): + template_vars['entity_parent_lookup'].append({ + 'name': + entity, + 'name_hash': + names[entity], + 'parents': + [make_entity_from_name(parent, names) for parent in parents] + }) + + template_vars['entities'].sort(key=lambda p: p['name_hash']) template_vars['properties'].sort(key=lambda p: p['name']) return template_vars @@ -226,12 +260,16 @@ help='JSON-LD schema file with overrides to support changes not in the ' 'latest schema.org version. Optional.') parser.add_argument( + '--name-file', + help='JSON file of hashed schema.org names to speed up lookups.') + parser.add_argument( '--output-dir', help='Output directory in which to place generated code files.') parser.add_argument('--templates', nargs='+') args = parser.parse_args() - template_vars = get_template_vars(args.schema_file, args.overrides_file) + template_vars = get_template_vars_from_file( + args.schema_file, args.overrides_file, args.name_file) for template_file in args.templates: generate_file( os.path.join(args.output_dir,
diff --git a/components/schema_org/generate_schema_org_code_unittest.py b/components/schema_org/generate_schema_org_code_unittest.py index 4cdf698..efe4f2b9 100644 --- a/components/schema_org/generate_schema_org_code_unittest.py +++ b/components/schema_org/generate_schema_org_code_unittest.py
@@ -23,35 +23,47 @@ class GenerateSchemaOrgCodeTest(unittest.TestCase): def test_get_template_vars(self): - file_content = """ - { - "@graph": [ - { - "@id": "http://schema.org/MediaObject", - "@type": "rdfs:Class" - }, - { - "@id": "http://schema.org/propertyName", - "@type": "rdf:Property" + schema = { + "@graph": [{ + "@id": "http://schema.org/MediaObject", + "@type": "rdfs:Class" + }, + { + "@id": "http://schema.org/propertyName", + "@type": "rdf:Property" + }] } - ] - } - """ - with mock.patch('__builtin__.open', - mock.mock_open(read_data=file_content)) as m_open: - self.assertEqual( - generate_schema_org_code.get_template_vars(m_open, m_open), { - 'entities': ['MediaObject'], - 'properties': [{ - 'name': 'propertyName', - 'thing_types': [], - 'enum_types': [] - }], - 'enums': [], - 'entity_parent_lookup': { - 'MediaObject': ['MediaObject'] - } - }) + + names = { + "http://schema.org/MediaObject": 1234, + "MediaObject": 1235, + "http://schema.org/propertyName": 2345, + "propertyName": 2346 + } + + self.assertEqual( + generate_schema_org_code.get_template_vars(schema, names), { + 'entities': [{ + 'name': 'MediaObject', + 'name_hash': 1235 + }], + 'properties': [{ + 'name': 'propertyName', + 'name_hash': 2346, + 'thing_types': [], + 'enum_types': [] + }], + 'enums': [], + 'entity_parent_lookup': + [{ + 'name': 'MediaObject', + 'name_hash': 1235, + 'parents': [{ + 'name': 'MediaObject', + 'name_hash': 1235 + }] + }] + }) def test_lookup_parents(self): thing = {'@id': schema_org_id('Thing')} @@ -65,9 +77,9 @@ } brand = {'@id': schema_org_id('Brand'), 'rdfs:subClassOf': intangible} schema = {'@graph': [thing, intangible, structured_value, brand]} - self.assertListEqual( + self.assertSetEqual( generate_schema_org_code.lookup_parents(brand, schema, {}), - ['Thing', 'Intangible', 'Brand']) + set(['Thing', 'Intangible', 'Brand'])) def test_get_root_type_thing(self): thing = {'@id': schema_org_id('Thing')} @@ -146,9 +158,13 @@ ] } + names = {"http://schema.org/Identifier": 1234, "Identifier": 1235} + self.assertEqual( - generate_schema_org_code.parse_property(identifier, schema), { + generate_schema_org_code.parse_property(identifier, schema, names), + { 'name': 'Identifier', + 'name_hash': 1235, 'has_number': True, 'thing_types': [property_value['@id']], 'enum_types': []
diff --git a/components/schema_org/schema_org_name_generator.cc b/components/schema_org/schema_org_name_generator.cc new file mode 100644 index 0000000..02304ecf --- /dev/null +++ b/components/schema_org/schema_org_name_generator.cc
@@ -0,0 +1,150 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <map> +#include <set> +#include <string> +#include <vector> + +#include "base/command_line.h" +#include "base/files/file_util.h" +#include "base/hash/hash.h" +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" +#include "url/gurl.h" + +namespace { + +// Print the command line help. +void PrintHelp() { + LOG(ERROR) << "schema_org_name_generator <schema-file> ... <schema-file>" + << " <output-file>"; +} + +} // namespace + +int main(int argc, char* argv[]) { + base::CommandLine::Init(argc, argv); + const base::CommandLine& command_line = + *base::CommandLine::ForCurrentProcess(); + + logging::LoggingSettings settings; + settings.logging_dest = + logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR; + logging::InitLogging(settings); + +#if defined(OS_WIN) + std::vector<std::string> args; + base::CommandLine::StringVector wide_args = command_line.GetArgs(); + for (const auto& arg : wide_args) { + args.push_back(base::UTF16ToUTF8(arg)); + } +#else + base::CommandLine::StringVector args = command_line.GetArgs(); +#endif + if (args.size() < 2U) { + PrintHelp(); + return 1; + } + + // Read all the args and convert to file paths. + std::vector<base::FilePath> paths; + for (auto& arg : args) { + paths.push_back(base::FilePath::FromUTF8Unsafe(arg)); + } + + // Check we have at least two paths. + if (paths.size() < 2U) { + PrintHelp(); + return 1; + } + + // Get the last path which is the output file. + base::FilePath output_path = paths.back(); + paths.pop_back(); + + base::DictionaryValue output_map; + std::set<std::string> names_to_generate; + + for (auto& path : paths) { + path = base::MakeAbsoluteFilePath(path); + if (!base::PathExists(path)) { + LOG(ERROR) << "Input JSON file doesn't exist."; + return 1; + } + + std::string json_input; + if (!base::ReadFileToString(path, &json_input)) { + LOG(ERROR) << "Could not read input JSON file."; + return 1; + } + + auto value = base::JSONReader::Read(json_input); + base::DictionaryValue* dict_value = nullptr; + if (!value.has_value() || !value->GetAsDictionary(&dict_value)) { + LOG(ERROR) << "Could not parse the input JSON file"; + return 1; + } + + const base::ListValue* graph = nullptr; + if (!dict_value->GetList("@graph", &graph)) { + LOG(ERROR) << "Could not parse the @graph in the input JSON"; + return 1; + } + + for (size_t i = 0; i < graph->GetSize(); ++i) { + const base::DictionaryValue* parsed = nullptr; + if (!graph->GetDictionary(i, &parsed)) { + LOG(ERROR) << "Could not parse entry " << i << " in the input JSON"; + return 1; + } + + std::string id; + if (!parsed->GetString("@id", &id)) { + LOG(ERROR) << "Could not extract the id from the entry"; + return 1; + } + + if (id.empty()) { + LOG(ERROR) << "ID was empty"; + return 1; + } + + names_to_generate.insert(id); + names_to_generate.insert(GURL(id).path().substr(1)); + } + } + + std::set<unsigned> generated_hashes; + for (auto& name : names_to_generate) { + auto hash = base::PersistentHash(name); + + if (base::Contains(generated_hashes, hash)) { + LOG(ERROR) << "Hash collision: " << name; + return 1; + } + + output_map.SetStringKey(name, base::StringPrintf("0x%x", hash)); + generated_hashes.insert(hash); + } + + std::string output; + if (!base::JSONWriter::Write(output_map, &output)) { + LOG(ERROR) << "Failed to convert output to JSON."; + return 1; + } + + if (base::WriteFile(output_path, output.c_str(), + static_cast<uint32_t>(output.size())) <= 0) { + LOG(ERROR) << "Failed to write output."; + return 1; + } + + return 0; +}
diff --git a/components/schema_org/templates/schema_org_entity_names.cc.tmpl b/components/schema_org/templates/schema_org_entity_names.cc.tmpl index 95b5f14..47f7c49 100644 --- a/components/schema_org/templates/schema_org_entity_names.cc.tmpl +++ b/components/schema_org/templates/schema_org_entity_names.cc.tmpl
@@ -6,7 +6,7 @@ // Do not edit. #include "components/schema_org/{{ header_file }}.h" -#include "base/containers/flat_set.h" +#include "base/hash/hash.h" #include "base/no_destructor.h" #include "base/strings/string_piece.h" @@ -14,37 +14,41 @@ namespace entity { {% for entity in entities %} -const char k{{entity[0]|upper}}{{entity[1:]}}[] = "{{entity}}"; +const char k{{entity.name[0]|upper}}{{entity.name[1:]}}[] = "{{entity.name}}"; {% endfor %} bool IsValidEntityName(const std::string& entity_name) { - static const base::NoDestructor<base::flat_set<base::StringPiece>> - kValidEntityNames(base::flat_set<base::StringPiece>({ - {%for entity in entities %} - k{{entity[0]|upper}}{{entity[1:]}}, - {% endfor %} - })); - return kValidEntityNames->find(entity_name) != kValidEntityNames->end(); + switch (base::PersistentHash(entity_name)) { + {%for entity in entities %} + case {{entity.name_hash}}: + // {{ entity.name }} + return true; + {% endfor %} + }; + + return false; } bool IsDescendedFrom(const std::string& possible_parent, const std::string& possible_child) { - static const base::NoDestructor<std::map<std::string, std::vector<std::string>>> - kParentEntities(std::map<std::string, std::vector<std::string>>({ - {%for key in entity_parent_lookup %} - { "{{key}}", { - {% for parent in entity_parent_lookup[key] %} - "{{parent}}", - {% endfor %} + const auto possible_parent_hash = base::PersistentHash(possible_parent); + + switch (base::PersistentHash(possible_child)) { + {%for entity in entity_parent_lookup %} + case {{entity.name_hash}}: + // {{ entity.name }} + switch (possible_parent_hash) { + {%for parent in entity.parents %} + case {{parent.name_hash}}: + // {{ parent.name }} + return true; + {% endfor %} } - }, - {% endfor %} - })); - auto parents = kParentEntities->find(possible_child); - if (parents == kParentEntities->end()) - return false; - auto it = std::find_if(parents->second.begin(), parents->second.end(), [&possible_parent](const std::string& parent) { return parent == possible_parent; }); - return it != parents->second.end(); + break; + {% endfor %} + }; + + return false; }
diff --git a/components/schema_org/templates/schema_org_entity_names.h.tmpl b/components/schema_org/templates/schema_org_entity_names.h.tmpl index afdd033..cc220d8 100644 --- a/components/schema_org/templates/schema_org_entity_names.h.tmpl +++ b/components/schema_org/templates/schema_org_entity_names.h.tmpl
@@ -14,7 +14,7 @@ namespace entity { {% for entity in entities %} -extern const char k{{entity[0]|upper}}{{entity[1:]}}[]; +extern const char k{{entity.name[0]|upper}}{{entity.name[1:]}}[]; {% endfor %} bool IsValidEntityName(const std::string& entity_name);
diff --git a/components/schema_org/templates/schema_org_enums.cc.tmpl b/components/schema_org/templates/schema_org_enums.cc.tmpl index b9c1934..5ed77937 100644 --- a/components/schema_org/templates/schema_org_enums.cc.tmpl +++ b/components/schema_org/templates/schema_org_enums.cc.tmpl
@@ -5,6 +5,7 @@ // Generated by running //components/schema_org/generate_schema_org_code.py. // Do not edit. +#include "base/hash/hash.h" #include "components/schema_org/{{ header_file }}.h" namespace schema_org { @@ -19,15 +20,24 @@ } auto path = value.path().substr(1); - {% for enum in enums %} - if (name == "{{enum.id}}") { - {% for option in enum.options %} - if (path == "{{option}}") { - return {{ loop.index }}; + const auto path_hash = base::PersistentHash(path); + + switch (base::PersistentHash(name)) { + {% for enum in enums %} + case {{enum.id_hash}}: + // {{enum.id}} + switch (path_hash) { + {% for option in enum.options %} + // {{option.name}} + case {{option.name_hash}}: + return {{ loop.index }}; + {% endfor %} } - {% endfor %} - } - {% endfor %} + + break; + {% endfor %} + } + return base::nullopt; }
diff --git a/components/schema_org/templates/schema_org_enums.h.tmpl b/components/schema_org/templates/schema_org_enums.h.tmpl index 1be9f397..700a2c4 100644 --- a/components/schema_org/templates/schema_org_enums.h.tmpl +++ b/components/schema_org/templates/schema_org_enums.h.tmpl
@@ -19,7 +19,7 @@ {% for enum in enums %} enum class {{enum.name}} { {% for option in enum.options %} - k{{option}} = {{ loop.index }}, + k{{option.name}} = {{ loop.index }}, {% endfor %} }; {% endfor %}
diff --git a/components/schema_org/templates/schema_org_property_configurations.cc.tmpl b/components/schema_org/templates/schema_org_property_configurations.cc.tmpl index c961457..bdd65ff 100644 --- a/components/schema_org/templates/schema_org_property_configurations.cc.tmpl +++ b/components/schema_org/templates/schema_org_property_configurations.cc.tmpl
@@ -5,6 +5,7 @@ // Generated by running //components/schema_org/generate_schema_org_code.py. // Do not edit. +#include "base/hash/hash.h" #include "components/schema_org/{{ header_file }}.h" namespace schema_org { @@ -12,26 +13,28 @@ PropertyConfiguration GetPropertyConfiguration(const std::string& name) { {% for property in properties %} - if (name == "{{property.name}}") { - return { - /* .text = */ {{'true' if property.has_text else 'false'}}, - /* .date = */ {{'true' if property.has_date else 'false'}}, - /* .time = */ {{'true' if property.has_time else 'false'}}, - /* .date_time = */ {{'true' if property.has_date_time else 'false'}}, - /* .number = */ {{'true' if property.has_number else 'false'}}, - /* .url = */ {{'true' if property.has_url else 'false'}}, - /* .boolean = */ {{'true' if property.has_boolean else 'false'}}, - /* .thing_types = */ { - {% for thing_type in property.thing_types %} - "{{thing_type}}", - {% endfor %} - }, - /* .enum_types = */ { - {% for enum_type in property.enum_types %} - "{{enum_type}}", - {% endfor %} - } - }; + switch (base::PersistentHash(name)) { + case {{property.name_hash}}: + // {{property.name}} + return { + /* .text = */ {{'true' if property.has_text else 'false'}}, + /* .date = */ {{'true' if property.has_date else 'false'}}, + /* .time = */ {{'true' if property.has_time else 'false'}}, + /* .date_time = */ {{'true' if property.has_date_time else 'false'}}, + /* .number = */ {{'true' if property.has_number else 'false'}}, + /* .url = */ {{'true' if property.has_url else 'false'}}, + /* .boolean = */ {{'true' if property.has_boolean else 'false'}}, + /* .thing_types = */ { + {% for thing_type in property.thing_types %} + "{{thing_type}}", + {% endfor %} + }, + /* .enum_types = */ { + {% for enum_type in property.enum_types %} + "{{enum_type}}", + {% endfor %} + } + }; } {% endfor %} return { };
diff --git a/components/soda/constants.cc b/components/soda/constants.cc index e29887d..607cc587 100644 --- a/components/soda/constants.cc +++ b/components/soda/constants.cc
@@ -9,7 +9,7 @@ #include "base/path_service.h" #include "components/component_updater/component_updater_paths.h" -namespace soda { +namespace speech { constexpr base::FilePath::CharType kSodaInstallationRelativePath[] = FILE_PATH_LITERAL("SODA"); @@ -55,4 +55,4 @@ : soda_dir.Append(kSodaConfigFileRelativePath); } -} // namespace soda +} // namespace speech
diff --git a/components/soda/constants.h b/components/soda/constants.h index 7a5d0f8..9ad2d885 100644 --- a/components/soda/constants.h +++ b/components/soda/constants.h
@@ -7,7 +7,7 @@ #include "base/files/file_path.h" -namespace soda { +namespace speech { // Location of the SODA component relative to components directory. extern const base::FilePath::CharType kSodaInstallationRelativePath[]; @@ -37,6 +37,6 @@ // an empty path if SODA is not installed. const base::FilePath GetSodaConfigPath(); -} // namespace soda +} // namespace speech #endif // COMPONENTS_SODA_CONSTANTS_H_
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index f9b7e86..08bd5d4 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Oranje</translation> <translation id="1201402288615127009">Volgende</translation> <translation id="1201895884277373915">Nog van hierdie werf af</translation> +<translation id="1205963431094182634">Meld aan om wagwoorde te gebruik wat in jou Google-rekening geberg is</translation> <translation id="1206967143813997005">Swak oorspronklike handtekening</translation> <translation id="1209206284964581585">Versteek vir eers</translation> <translation id="121201262018556460">Jy het probeer om <ph name="DOMAIN" /> te bereik, maar die bediener het 'n sertifikaat wat 'n swak sleutel bevat, voorgehou. 'n Aanvaller kon die private sleutel gebreek het en die bediener is dalk nie die bediener wat jy verwag het nie (jy kommunikeer dalk met 'n aanvaller).</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 721beec..5482da5 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">ብርቱካናማ</translation> <translation id="1201402288615127009">ቀጣይ</translation> <translation id="1201895884277373915">ተጨማሪ ከዚህ ጣቢያ</translation> +<translation id="1205963431094182634">በእርስዎ Google መለያ ውስጥ የተከማቹ የይለፍ ቃላትን ለመጠቀም በመለያ ይግቡ</translation> <translation id="1206967143813997005">መጥፎ የመጀመሪያ ፊርማ</translation> <translation id="1209206284964581585">ለአሁን ደብቅ</translation> <translation id="121201262018556460"><ph name="DOMAIN" />ን ለመድረስ ሞክረዋል፣ ግን አገልጋዩ ደካማ ቁልፍ የያዘ የእውቅና ማረጋገጫ ነው ያቀረበው። አንድ አጥቂ የግል ቁልፉን ሰብሮ ሊሆን ይችላል፣ እና አገልጋዩ የጠበቁት ላይሆን ይችላል (ከአጥቂ ጋር እየተገናኙ ሊሆኑ ይችላሉ)።</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 464544f..688c065f 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -52,7 +52,7 @@ <translation id="1197088940767939838">Narandžasta</translation> <translation id="1201402288615127009">Naprijed</translation> <translation id="1201895884277373915">Više s ove web lokacije</translation> -<translation id="1205963431094182634">Prijavite se kako biste upotrebljavali zaporke pohranjene na vašem Google računu</translation> +<translation id="1205963431094182634">Prijavite se da koristite lozinke pohranjene na Google računu</translation> <translation id="1206967143813997005">Neispravan potpis inicijalima</translation> <translation id="1209206284964581585">Sakrij za sada</translation> <translation id="121201262018556460">Pokušali ste otvoriti domenu <ph name="DOMAIN" />, ali je server prikazao potvrdu koja sadrži slab ključ. Možda je napadač otkrio privatni ključ, a server nije onaj kojeg očekujete (možda komunicirate s napadačem).</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 76df463..6e01b4c 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Taronja</translation> <translation id="1201402288615127009">Següent</translation> <translation id="1201895884277373915">Més entrades d'aquest lloc</translation> +<translation id="1205963431094182634">Inicia la sessió per utilitzar les contrasenyes emmagatzemades al teu Compte de Google</translation> <translation id="1206967143813997005">Signatura inicial incorrecta</translation> <translation id="1209206284964581585">Amaga per ara</translation> <translation id="121201262018556460">Heu provat d'accedir a <ph name="DOMAIN" />, però el servidor ha presentat un certificat que conté una clau dèbil. És possible que un atacant hagi accedit a la clau privada i que aquest servidor no sigui el que espereu (pot ser que us estigueu comunicant amb un atacant).</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index e36a09cd..14e60d2 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Næste</translation> <translation id="1201895884277373915">Mere fra dette website</translation> +<translation id="1205963431094182634">Log ind for at bruge de adgangskoder, du har gemt på din Google-konto</translation> <translation id="1206967143813997005">Ugyldig første signatur</translation> <translation id="1209206284964581585">Skjul indtil videre</translation> <translation id="121201262018556460">Du har forsøgt at få fat i <ph name="DOMAIN" />, men serveren har præsenteret et certifikat med en svag nøgle. En hacker kan have knækket den private nøgle, og serveren er muligvis ikke den forventede server (du kommunikerer muligvis med en hacker).</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 8e76757..7674042 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">نارنجی</translation> <translation id="1201402288615127009">بعدی</translation> <translation id="1201895884277373915">موارد بیشتر از این سایت</translation> +<translation id="1205963431094182634">برای استفاده از گذرواژههای ذخیرهشده در حساب Google، به سیستم وارد شوید</translation> <translation id="1206967143813997005">امضای اولیه نادرست</translation> <translation id="1209206284964581585">فعلاً پنهان شود</translation> <translation id="121201262018556460">شما میخواستید به <ph name="DOMAIN" /> دسترسی یابید، اما سرور یک گواهی دارای کلید ضعیف ارائه داد. یک مهاجم ممکن است کلید خصوصی را تخریب کرده باشد و سرور، همان سروری نباشد که شما انتظار داشتید (ممکن است در حال ارتباط با یک مهاجم باشید).</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index e72af47..1dbba96 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Նարնջագույն</translation> <translation id="1201402288615127009">Հաջորդը</translation> <translation id="1201895884277373915">Ավելին այս կայքից</translation> +<translation id="1205963431094182634">Մուտք գործեք՝ Google հաշվում պահված գաղտնաբառերն օգտագործելու համար</translation> <translation id="1206967143813997005">Սկզբնական ստորագրությունը սխալ է</translation> <translation id="1209206284964581585">Առայժմ թաքցնել</translation> <translation id="121201262018556460">Դուք փորձում էիք մտնել <ph name="DOMAIN" />, սակայն սերվերի կողմից ներկայացված վկայագրի բանալին թույլ էր: Հնարավոր է, ինչ-որ հարձակվող կոտրել է մասնավոր բանալին, և սերվերը ձեր ուզած սերվերը չէ (հնարավոր է, դուք կապ եք հաստատել հարձակվողի հետ):</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 5e564389..4ac36b73 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Oranžová</translation> <translation id="1201402288615127009">Ďalej</translation> <translation id="1201895884277373915">Viac z týchto stránok</translation> +<translation id="1205963431094182634">Prihlásiť sa a používať heslá uložené vo vašom účte Google</translation> <translation id="1206967143813997005">Chybný úvodný podpis</translation> <translation id="1209206284964581585">Skryť</translation> <translation id="121201262018556460">Pokúsili ste sa o prístup na stránky <ph name="DOMAIN" />, server však predložil certifikát obsahujúci slabý kľúč. Útočník mohol tento súkromný kľúč prelomiť a môže ísť o iný server, než ste očakávali (môžete komunikovať s útočníkom).</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 2b83450..930ec77b0 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Turuncu</translation> <translation id="1201402288615127009">İleri</translation> <translation id="1201895884277373915">Bu siteden daha çok</translation> +<translation id="1205963431094182634">Google hesabınızda kayıtlı şifreleri kullanmak için oturum açın</translation> <translation id="1206967143813997005">Başlangıç anahtarlı imza hatalı</translation> <translation id="1209206284964581585">Şimdilik gizle</translation> <translation id="121201262018556460"><ph name="DOMAIN" /> alanına ulaşmayı denediniz, ancak sunucu zayıf anahtar içeren bir sertifika sundu. Bir saldırgan özel anahtarı ele geçirmiş olabilir ve sunucu beklediğiniz sunucu olmayabilir (bir saldırganla irtibat kuruyor olabilirsiniz).</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 3aaad0a..69c9f73 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">To‘q sariq</translation> <translation id="1201402288615127009">Keyingisi</translation> <translation id="1201895884277373915">Bu sayt bo‘yicha boshqa yozuvlar</translation> +<translation id="1205963431094182634">Google hisobingizda saqlangan parollardan foydalanish uchun hisobingizga kiring</translation> <translation id="1206967143813997005">Boshlang‘ich imzo tasdiqlanmadi</translation> <translation id="1209206284964581585">Berkitish</translation> <translation id="121201262018556460">Siz <ph name="DOMAIN" /> saytiga o‘tmoqchi bo‘ldingiz, lekin server taqdim qilgan sertifikat zaif kalitga ega. Bu server bergan havfsizlik hisob ma’lumotlari ishonchsiz va server o‘zini boshqa server deb ko‘rsatayotgan bo‘lishi mumkin (bu firibgarlar sayti bo‘lishi mumkin).</translation>
diff --git a/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc b/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc index e7a53be6..d335094d 100644 --- a/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/activation_state_computing_navigation_throttle_unittest.cc
@@ -275,8 +275,9 @@ EXPECT_FALSE(state.filtering_disabled_for_document); } +// TODO(crbug.com/1069398): Fix this test failure. TEST_P(ActivationStateComputingThrottleMainFrameTest, - NoPageActivationNotification_NoActivation) { + DISABLED_NoPageActivationNotification_NoActivation) { CreateTestNavigationForMainFrame(GURL("http://example.test/")); SimulateStartAndExpectToProceed(); SimulateRedirectAndExpectToProceed(GURL("http://example.test/?v=1")); @@ -604,7 +605,7 @@ } INSTANTIATE_TEST_SUITE_P(All, - ActivationStateComputingNavigationThrottleTest, + ActivationStateComputingThrottleMainFrameTest, ::testing::Values(true, false)); INSTANTIATE_TEST_SUITE_P(All, ActivationStateComputingThrottleSubFrameTest,
diff --git a/components/viz/service/display/frame_rate_decider.cc b/components/viz/service/display/frame_rate_decider.cc index d76ce1d8..83710c07 100644 --- a/components/viz/service/display/frame_rate_decider.cc +++ b/components/viz/service/display/frame_rate_decider.cc
@@ -116,6 +116,11 @@ } if (num_of_frame_sinks_with_fixed_interval < 2) { + TRACE_EVENT_INSTANT0( + "viz", + "FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded - not enough " + "frame sinks to toggle", + TRACE_EVENT_SCOPE_THREAD); SetPreferredInterval(UnspecifiedFrameInterval()); return; } @@ -136,25 +141,20 @@ min_frame_sink_interval, client_->GetPreferredFrameIntervalForFrameSinkId(frame_sink_id)); } + TRACE_EVENT_INSTANT1("viz", + "FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded", + TRACE_EVENT_SCOPE_THREAD, "min_frame_sink_interval", + min_frame_sink_interval.InMillisecondsF()); // If we don't have an explicit preference from the active frame sinks, then // we use a 0 value for preferred frame interval to let the framework pick the // ideal refresh rate. base::TimeDelta new_preferred_interval = UnspecifiedFrameInterval(); if (min_frame_sink_interval != BeginFrameArgs::MinInterval()) { - constexpr float kMaxIntervalDelta = 0.05; for (auto supported_interval : supported_intervals_) { - // We only use a supported interval if it is in perfect cadence with the - // desired interval. - float delta_int = 0; - float delta = std::modf(min_frame_sink_interval.InMicrosecondsF() / - supported_interval.InMicrosecondsF(), - &delta_int); - bool in_perfect_cadence = - delta < kMaxIntervalDelta || delta > (1 - kMaxIntervalDelta); - if (in_perfect_cadence && supported_interval > new_preferred_interval) { - // Make sure that we select the largest one in the - // |supported_intervals_| that meets the requirements + // Pick the display interval which is closest to the preferred interval. + if ((min_frame_sink_interval - supported_interval).magnitude() < + (min_frame_sink_interval - new_preferred_interval).magnitude()) { new_preferred_interval = supported_interval; } } @@ -165,6 +165,10 @@ void FrameRateDecider::SetPreferredInterval( base::TimeDelta new_preferred_interval) { + TRACE_EVENT_INSTANT1("viz", "FrameRateDecider::SetPreferredInterval", + TRACE_EVENT_SCOPE_THREAD, "new_preferred_interval", + new_preferred_interval.InMillisecondsF()); + if (new_preferred_interval == last_computed_preferred_frame_interval_) { num_of_frames_since_preferred_interval_changed_++; } else {
diff --git a/components/viz/service/display/frame_rate_decider_unittest.cc b/components/viz/service/display/frame_rate_decider_unittest.cc index 64dca04..215e11a3 100644 --- a/components/viz/service/display/frame_rate_decider_unittest.cc +++ b/components/viz/service/display/frame_rate_decider_unittest.cc
@@ -222,7 +222,7 @@ FrameRateDecider::ScopedAggregate scope(frame_rate_decider_.get()); frame_rate_decider_->OnSurfaceWillBeDrawn(surface1); } - EXPECT_EQ(display_interval_, FrameRateDecider::UnspecifiedFrameInterval()); + EXPECT_EQ(display_interval_, min_supported_interval * 2); UpdateFrame(surface2); {
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 6707ea5..5d753d25 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -10,7 +10,6 @@ import("//chromeos/assistant/assistant.gni") import("//components/ui_devtools/devtools.gni") import("//content/common/features.gni") -import("//device/vr/buildflags/buildflags.gni") import("//gpu/vulkan/features.gni") import("//media/media_options.gni") import("//net/features.gni") @@ -2670,41 +2669,6 @@ "gpu/viz_devtools_connector.h", ] } - - if (enable_vr) { - if (!is_android) { - sources += [ - "xr/service/isolated_device_provider.cc", - "xr/service/isolated_device_provider.h", - ] - } - - sources += [ - "xr/metrics/session_metrics_helper.cc", - "xr/metrics/session_metrics_helper.h", - "xr/metrics/session_timer.cc", - "xr/metrics/session_timer.h", - "xr/metrics/session_tracker.h", - "xr/metrics/webxr_session_tracker.cc", - "xr/metrics/webxr_session_tracker.h", - "xr/service/browser_xr_runtime_impl.cc", - "xr/service/browser_xr_runtime_impl.h", - "xr/service/vr_service_impl.cc", - "xr/service/vr_service_impl.h", - "xr/service/xr_device_service.cc", - "xr/service/xr_device_service.h", - "xr/service/xr_runtime_manager_impl.cc", - "xr/service/xr_runtime_manager_impl.h", - "xr/xr_utils.cc", - "xr/xr_utils.h", - ] - - deps += [ - "//device/vr", - "//device/vr/buildflags", - "//services/metrics/public/cpp:ukm_builders", - ] - } } buildflag_header("accessibility_buildflags") {
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 113086e..4e1fc47 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -37,7 +37,6 @@ #include "content/browser/worker_host/dedicated_worker_host.h" #include "content/browser/worker_host/shared_worker_connector_impl.h" #include "content/browser/worker_host/shared_worker_host.h" -#include "content/browser/xr/service/vr_service_impl.h" #include "content/common/input/input_injector.mojom.h" #include "content/common/media/renderer_audio_input_stream_factory.mojom.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h" @@ -46,12 +45,12 @@ #include "content/public/browser/device_service.h" #include "content/public/browser/service_worker_context.h" #include "content/public/browser/shared_worker_instance.h" +#include "content/public/browser/webvr_service_provider.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" #include "content/public/common/url_constants.h" #include "device/gamepad/gamepad_monitor.h" #include "device/gamepad/public/mojom/gamepad.mojom.h" -#include "device/vr/buildflags/buildflags.h" #include "device/vr/public/mojom/vr_service.mojom.h" #include "media/capture/mojom/image_capture.mojom.h" #include "media/mojo/mojom/interface_factory.mojom-forward.h" @@ -117,7 +116,7 @@ #if !defined(OS_ANDROID) #include "content/browser/installedapp/installed_app_provider_impl.h" #include "content/public/common/content_switches.h" -#include "media/mojo/mojom/soda_service.mojom.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" #include "third_party/blink/public/mojom/hid/hid.mojom.h" #include "third_party/blink/public/mojom/serial/serial.mojom.h" #endif @@ -669,8 +668,8 @@ map->Add<blink::mojom::AnchorElementMetricsHost>(base::BindRepeating( &EmptyBinderForFrame<blink::mojom::AnchorElementMetricsHost>)); #if !defined(OS_ANDROID) - map->Add<media::mojom::SodaContext>( - base::BindRepeating(&EmptyBinderForFrame<media::mojom::SodaContext>)); + map->Add<media::mojom::SpeechRecognitionContext>(base::BindRepeating( + &EmptyBinderForFrame<media::mojom::SpeechRecognitionContext>)); #endif #if BUILDFLAG(ENABLE_UNHANDLED_TAP) map->Add<blink::mojom::UnhandledTapNotifier>(base::BindRepeating( @@ -695,13 +694,8 @@ base::BindRepeating(&PictureInPictureServiceImpl::Create)); map->Add<blink::mojom::WakeLockService>( base::BindRepeating(&WakeLockServiceImpl::Create)); -#if BUILDFLAG(ENABLE_VR) map->Add<device::mojom::VRService>( - base::BindRepeating(&VRServiceImpl::Create)); -#else - map->Add<device::mojom::VRService>( - base::BindRepeating(&EmptyBinderForFrame<device::mojom::VRService>)); -#endif + base::BindRepeating(&WebvrServiceProvider::BindWebvrService)); map->Add<::mojom::ProcessInternalsHandler>( base::BindRepeating(&BindProcessInternalsHandler)); #if defined(OS_ANDROID)
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 3e00cb2..7654ea72 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1142,6 +1142,8 @@ kRejectedDueToPredecessorNavigation: case blink::mojom::PortalActivateResult:: kRejectedDueToPortalNotReady: + case blink::mojom::PortalActivateResult:: + kRejectedDueToErrorInPortal: case blink::mojom::PortalActivateResult::kDisconnected: case blink::mojom::PortalActivateResult::kAbortedDueToBug: // The renderer is misbehaving.
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 2be5d44..23e7478 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -855,11 +855,18 @@ // network::mojom::URLLoaderClient implementation: void OnReceiveResponse(network::mojom::URLResponseHeadPtr head) override { head_ = std::move(head); + on_receive_response_time_ = base::TimeTicks::Now(); } // network::mojom::URLLoaderClient implementation: void OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle response_body) override { + if (!on_receive_response_time_.is_null()) { + UMA_HISTOGRAM_TIMES( + "Navigation.OnReceiveResponseToOnStartLoadingResponseBody", + base::TimeTicks::Now() - on_receive_response_time_); + } + response_body_ = std::move(response_body); received_response_ = true; @@ -1190,9 +1197,12 @@ mojo::PendingRemote<network::mojom::URLLoader> response_url_loader_; // Set to true if we receive a valid response from a URLLoader, i.e. - // URLLoaderClient::OnReceivedResponse() is called. + // URLLoaderClient::OnStartLoadingResponseBody() is called. bool received_response_ = false; + // When URLLoaderClient::OnReceiveResponse() is called. For UMA. + base::TimeTicks on_receive_response_time_; + bool started_ = false; // Lazily initialized and used in the case of non-network resource
diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc index 1dcc0b7..ce090db23 100644 --- a/content/browser/portal/portal.cc +++ b/content/browser/portal/portal.cc
@@ -21,6 +21,7 @@ #include "content/public/browser/render_widget_host_iterator.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/common/content_switches.h" +#include "content/public/common/page_type.h" #include "content/public/common/referrer_type_converters.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/service_manager/public/mojom/interface_provider.mojom.h" @@ -272,16 +273,9 @@ NavigationControllerImpl& predecessor_controller = predecessor_contents->GetController(); - DCHECK(predecessor_controller.GetLastCommittedEntry()); // Activation would have discarded any pending entry in the host contents. DCHECK(!predecessor_controller.GetPendingEntry()); - // TODO(mcnee): Determine how to deal with a transient entry. - if (predecessor_controller.GetTransientEntry() || - activated_controller.GetTransientEntry()) { - return; - } - // TODO(mcnee): Once we enforce that a portal contents does not build up its // own history, make this DCHECK that we only have a single committed entry, // possibly with a new pending entry. @@ -318,14 +312,35 @@ << "The binding should have been closed when the portal's outer " "FrameTreeNode was deleted due to swap out."; + DCHECK(portal_contents_); + NavigationControllerImpl& portal_controller = + portal_contents_->GetController(); + NavigationControllerImpl& predecessor_controller = + outer_contents->GetController(); + // If no navigation has yet committed in the portal, it cannot be activated as // this would lead to an empty tab contents (without even an about:blank). - DCHECK(portal_contents_); - if (portal_contents_->GetController().GetLastCommittedEntryIndex() < 0) { + if (portal_controller.GetLastCommittedEntryIndex() < 0) { std::move(callback).Run( blink::mojom::PortalActivateResult::kRejectedDueToPortalNotReady); return; } + DCHECK(predecessor_controller.GetLastCommittedEntry()); + + // Error pages and interstitials may not host portals due to the HTTP(S) + // restriction. + DCHECK_EQ(PAGE_TYPE_NORMAL, + predecessor_controller.GetLastCommittedEntry()->GetPageType()); + DCHECK(!predecessor_controller.GetTransientEntry()); + + // If the portal is showing an error page, reject activation. + if (portal_controller.GetLastCommittedEntry()->GetPageType() != + PAGE_TYPE_NORMAL) { + std::move(callback).Run( + blink::mojom::PortalActivateResult::kRejectedDueToErrorInPortal); + return; + } + DCHECK(!portal_controller.GetTransientEntry()); // If a navigation in the main frame is occurring, stop it if possible and // reject the activation if it's too late or if an ongoing navigation takes
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc index 4e3f0615..d18f661f 100644 --- a/content/browser/portal/portal_browsertest.cc +++ b/content/browser/portal/portal_browsertest.cc
@@ -27,6 +27,7 @@ #include "content/public/browser/site_isolation_policy.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/common/content_switches.h" +#include "content/public/common/page_type.h" #include "content/public/test/accessibility_notification_waiter.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" @@ -40,6 +41,7 @@ #include "content/test/portal/portal_created_observer.h" #include "content/test/portal/portal_interceptor_for_testing.h" #include "content/test/test_render_frame_host_factory.h" +#include "net/base/net_errors.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" @@ -77,7 +79,8 @@ Portal* CreatePortalToUrl(WebContentsImpl* host_contents, GURL portal_url, - int number_of_navigations = 1) { + int number_of_navigations = 1, + bool expected_to_succeed = true) { EXPECT_GE(number_of_navigations, 1); RenderFrameHostImpl* main_frame = host_contents->GetMainFrame(); @@ -103,7 +106,7 @@ EXPECT_TRUE(portal_contents); navigation_observer.WaitForNavigationFinished(); - EXPECT_TRUE(WaitForLoadStop(portal_contents)); + EXPECT_EQ(expected_to_succeed, WaitForLoadStop(portal_contents)); return portal; } @@ -1751,6 +1754,60 @@ EXPECT_TRUE(pending_back_navigation.was_successful()); } +IN_PROC_BROWSER_TEST_F(PortalBrowserTest, RejectActivationOfErrorPages) { + net::EmbeddedTestServer bad_https_server(net::EmbeddedTestServer::TYPE_HTTPS); + bad_https_server.AddDefaultHandlers(GetTestDataFilePath()); + bad_https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED); + ASSERT_TRUE(bad_https_server.Start()); + + GURL main_url(embedded_test_server()->GetURL("portal.test", "/title1.html")); + ASSERT_TRUE(NavigateToURL(shell(), main_url)); + WebContentsImpl* web_contents_impl = + static_cast<WebContentsImpl*>(shell()->web_contents()); + RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame(); + + GURL bad_portal_url(bad_https_server.GetURL("a.com", "/title1.html")); + Portal* portal = CreatePortalToUrl(web_contents_impl, bad_portal_url, + /* number_of_navigations */ 1, + /* expected_to_succeed */ false); + + PortalActivatedObserver activated_observer(portal); + EXPECT_EQ("reject", EvalJs(main_frame, + "document.querySelector('portal').activate().then(" + " () => 'resolve', () => 'reject');")); + EXPECT_EQ(blink::mojom::PortalActivateResult::kRejectedDueToErrorInPortal, + activated_observer.result()); +} + +IN_PROC_BROWSER_TEST_F(PortalBrowserTest, + RejectActivationOfPostCommitErrorPages) { + GURL main_url(embedded_test_server()->GetURL("portal.test", "/title1.html")); + ASSERT_TRUE(NavigateToURL(shell(), main_url)); + WebContentsImpl* web_contents_impl = + static_cast<WebContentsImpl*>(shell()->web_contents()); + RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame(); + + GURL portal_url(embedded_test_server()->GetURL("a.com", "/title1.html")); + Portal* portal = CreatePortalToUrl(web_contents_impl, portal_url); + WebContentsImpl* portal_contents = portal->GetPortalContents(); + + std::string error_html = "Error page"; + TestNavigationObserver error_observer(portal_contents); + portal_contents->GetController().LoadPostCommitErrorPage( + portal_contents->GetMainFrame(), portal_url, error_html, + net::ERR_BLOCKED_BY_CLIENT); + error_observer.Wait(); + EXPECT_FALSE(error_observer.last_navigation_succeeded()); + EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, error_observer.last_net_error_code()); + + PortalActivatedObserver activated_observer(portal); + EXPECT_EQ("reject", EvalJs(main_frame, + "document.querySelector('portal').activate().then(" + " () => 'resolve', () => 'reject');")); + EXPECT_EQ(blink::mojom::PortalActivateResult::kRejectedDueToErrorInPortal, + activated_observer.result()); +} + IN_PROC_BROWSER_TEST_F(PortalBrowserTest, CallCreateProxyAndAttachPortalTwice) { EXPECT_TRUE(NavigateToURL( shell(), embedded_test_server()->GetURL("portal.test", "/title1.html")));
diff --git a/content/browser/renderer_host/input/gesture_event_queue_unittest.cc b/content/browser/renderer_host/input/gesture_event_queue_unittest.cc index 65c6dd27..34d695e6 100644 --- a/content/browser/renderer_host/input/gesture_event_queue_unittest.cc +++ b/content/browser/renderer_host/input/gesture_event_queue_unittest.cc
@@ -242,11 +242,6 @@ #endif }; -// This is for tests that are to be run for all source devices. -class GestureEventQueueWithSourceTest - : public GestureEventQueueTest, - public testing::WithParamInterface<WebGestureDevice> {}; - class GestureEventQueueWithCompositorEventQueueTest : public GestureEventQueueTest {}; @@ -280,11 +275,6 @@ EXPECT_EQ(1U, GetAndResetAckedGestureEventCount()); } -INSTANTIATE_TEST_SUITE_P(AllSources, - GestureEventQueueWithSourceTest, - testing::Values(blink::WebGestureDevice::kTouchscreen, - blink::WebGestureDevice::kTouchpad)); - // Test that a GestureScrollEnd is deferred during the debounce interval, // that Scrolls are not and that the deferred events are sent after that // timer fires.
diff --git a/content/browser/sandbox_parameters_mac.mm b/content/browser/sandbox_parameters_mac.mm index 2982552..e547245 100644 --- a/content/browser/sandbox_parameters_mac.mm +++ b/content/browser/sandbox_parameters_mac.mm
@@ -219,7 +219,7 @@ sandbox::SeatbeltExecClient* client) { switch (sandbox_type) { case service_manager::SandboxType::kAudio: - case service_manager::SandboxType::kSoda: + case service_manager::SandboxType::kSpeechRecognition: case service_manager::SandboxType::kNaClLoader: case service_manager::SandboxType::kPrintCompositor: case service_manager::SandboxType::kRenderer:
diff --git a/content/browser/sms/sms_fetcher_impl.cc b/content/browser/sms/sms_fetcher_impl.cc index 0f4ef7ae..37b3fb8c 100644 --- a/content/browser/sms/sms_fetcher_impl.cc +++ b/content/browser/sms/sms_fetcher_impl.cc
@@ -54,9 +54,8 @@ void SmsFetcherImpl::Subscribe(const url::Origin& origin, SmsQueue::Subscriber* subscriber) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (subscribers_.HasSubscriber(origin, subscriber)) - return; + // Should not be called multiple times for the same subscriber and origin. + DCHECK(!subscribers_.HasSubscriber(origin, subscriber)); subscribers_.Push(origin, subscriber); @@ -73,6 +72,8 @@ void SmsFetcherImpl::Unsubscribe(const url::Origin& origin, SmsQueue::Subscriber* subscriber) { + // Unsubscribe does not make a call to the provider because currently there + // is no mechanism to cancel a subscription. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); subscribers_.Remove(origin, subscriber); } @@ -80,13 +81,13 @@ bool SmsFetcherImpl::Notify(const url::Origin& origin, const std::string& one_time_code) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // The received OTP is returned to the first subscriber for the origin. auto* subscriber = subscribers_.Pop(origin); if (!subscriber) return false; subscriber->OnReceive(one_time_code); - return true; }
diff --git a/content/browser/sms/sms_fetcher_impl_unittest.cc b/content/browser/sms/sms_fetcher_impl_unittest.cc index 83fde15..8728ae4 100644 --- a/content/browser/sms/sms_fetcher_impl_unittest.cc +++ b/content/browser/sms/sms_fetcher_impl_unittest.cc
@@ -200,20 +200,4 @@ provider()->NotifyReceive(kOrigin1, "123"); } -TEST_F(SmsFetcherImplTest, SubscribeIsIdempotent) { - const url::Origin kOrigin = url::Origin::Create(GURL("https://a.com")); - - StrictMock<MockSubscriber> subscriber; - - SmsFetcherImpl fetcher(nullptr, base::WrapUnique(provider())); - fetcher.Subscribe(kOrigin, &subscriber); - fetcher.Subscribe(kOrigin, &subscriber); - - EXPECT_TRUE(fetcher.HasSubscribers()); - - fetcher.Unsubscribe(kOrigin, &subscriber); - - EXPECT_FALSE(fetcher.HasSubscribers()); -} - } // namespace content
diff --git a/content/browser/sms/sms_service.cc b/content/browser/sms/sms_service.cc index ad2961d0..a8da9c2c 100644 --- a/content/browser/sms/sms_service.cc +++ b/content/browser/sms/sms_service.cc
@@ -35,7 +35,9 @@ mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver) : FrameServiceBase(host, std::move(receiver)), fetcher_(fetcher), - origin_(origin) {} + origin_(origin) { + DCHECK(fetcher_); +} SmsService::SmsService( SmsFetcher* fetcher, @@ -49,6 +51,7 @@ SmsService::~SmsService() { if (callback_) Process(SmsStatus::kTimeout, base::nullopt); + DCHECK(!callback_); } // static
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc index e2d1281..b64cf7a7 100644 --- a/content/browser/utility_process_host.cc +++ b/content/browser/utility_process_host.cc
@@ -95,7 +95,7 @@ #if !defined(OS_MACOSX) sandbox_type_ == service_manager::SandboxType::kSharingService || #endif - sandbox_type_ == service_manager::SandboxType::kSoda; + sandbox_type_ == service_manager::SandboxType::kSpeechRecognition; DCHECK(supported_sandbox_type); #endif // DCHECK_IS_ON() } @@ -210,7 +210,7 @@ sandbox_type_ == service_manager::SandboxType::kIme || #endif // OS_CHROMEOS sandbox_type_ == service_manager::SandboxType::kAudio || - sandbox_type_ == service_manager::SandboxType::kSoda) { + sandbox_type_ == service_manager::SandboxType::kSpeechRecognition) { return service_manager::GetUnsandboxedZygote(); }
diff --git a/content/browser/utility_process_sandbox_browsertest.cc b/content/browser/utility_process_sandbox_browsertest.cc index 1f025e6..6cfcbc85 100644 --- a/content/browser/utility_process_sandbox_browsertest.cc +++ b/content/browser/utility_process_sandbox_browsertest.cc
@@ -116,7 +116,7 @@ case SandboxType::kIme: #endif case SandboxType::kNetwork: - case SandboxType::kSoda: { + case SandboxType::kSpeechRecognition: { constexpr int kExpectedPartialSandboxFlags = SandboxLinux::kSeccompBPF | SandboxLinux::kYama | SandboxLinux::kSeccompTSYNC;
diff --git a/content/browser/xr/DEPS b/content/browser/xr/DEPS deleted file mode 100644 index 1d7233d..0000000 --- a/content/browser/xr/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+device/vr", -]
diff --git a/content/browser/xr/OWNERS b/content/browser/xr/OWNERS deleted file mode 100644 index 7a5f229..0000000 --- a/content/browser/xr/OWNERS +++ /dev/null
@@ -1,8 +0,0 @@ -alcooper@chromium.org -klausw@chromium.org - -# Browser Test-related. -bsheedy@chromium.org - -# TEAM: xr-dev@chromium.org -# COMPONENT: Internals>XR
diff --git a/content/browser/xr/service/DEPS b/content/browser/xr/service/DEPS deleted file mode 100644 index 974b375c..0000000 --- a/content/browser/xr/service/DEPS +++ /dev/null
@@ -1,4 +0,0 @@ -include_rules = [ - "+device/base", - "+device/vr", -]
diff --git a/content/browser/xr/service/xr_device_service.h b/content/browser/xr/service/xr_device_service.h deleted file mode 100644 index 405503ebf..0000000 --- a/content/browser/xr/service/xr_device_service.h +++ /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. - -#ifndef CONTENT_BROWSER_XR_SERVICE_XR_DEVICE_SERVICE_H_ -#define CONTENT_BROWSER_XR_SERVICE_XR_DEVICE_SERVICE_H_ - -#include "base/callback.h" -#include "content/common/content_export.h" -#include "device/vr/public/mojom/isolated_xr_service.mojom.h" -#include "mojo/public/cpp/bindings/remote.h" - -namespace content { - -// Acquires a remote handle to the sandboxed isolated XR Device Service -// instance, launching a process to host the service if necessary. -const CONTENT_EXPORT mojo::Remote<device::mojom::XRDeviceService>& -GetXRDeviceService(); - -void CONTENT_EXPORT SetXRDeviceServiceStartupCallbackForTestingInternal( - base::RepeatingClosure callback); -} // namespace content - -#endif // CONTENT_BROWSER_XR_SERVICE_XR_DEVICE_SERVICE_H_
diff --git a/content/browser/xr/xr_utils.cc b/content/browser/xr/xr_utils.cc deleted file mode 100644 index 72d1534..0000000 --- a/content/browser/xr/xr_utils.cc +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/xr/xr_utils.h" - -#include "content/public/browser/content_browser_client.h" -#include "content/public/common/content_client.h" - -namespace content { -XrIntegrationClient* GetXrIntegrationClient() { - auto* client = GetContentClient(); - if (!client) - return nullptr; - - auto* browser = client->browser(); - if (!browser) - return nullptr; - - return browser->GetXrIntegrationClient(); -} -} // namespace content
diff --git a/content/browser/xr/xr_utils.h b/content/browser/xr/xr_utils.h deleted file mode 100644 index ecc5f72..0000000 --- a/content/browser/xr/xr_utils.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_XR_XR_UTILS_H_ -#define CONTENT_BROWSER_XR_XR_UTILS_H_ - -namespace content { -class XrIntegrationClient; - -// Simplifies the querying of ContentClient->ContentBrowserClient-> -// XrIntegrationClient. May return nullptr. -XrIntegrationClient* GetXrIntegrationClient(); -} // namespace content - -#endif // CONTENT_BROWSER_XR_XR_UTILS_H_
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ClipboardTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ClipboardTest.java index 98c2220..8ff8371 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ClipboardTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ClipboardTest.java
@@ -17,7 +17,6 @@ import org.junit.runner.RunWith; import org.chromium.base.test.BaseJUnit4ClassRunner; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.UrlUtils; import org.chromium.content.browser.webcontents.WebContentsImpl; @@ -61,7 +60,6 @@ @LargeTest @Feature({"Clipboard", "TextInput"}) @RerunWithUpdatedContainerView - @DisabledTest(message = "https://crbug.com/791021") public void testCopyDocumentFragment() { ClipboardManager clipboardManager = TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<ClipboardManager>() { @@ -88,7 +86,7 @@ public boolean isSatisfied() { return hasPrimaryClip(clipboardManager); } - }); + }, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL * 5, CriteriaHelper.DEFAULT_POLLING_INTERVAL); // Verify that the data on the clipboard is what we expect it to be. For Android JB MR2 // and higher we expect HTML content, for other versions the plain-text representation.
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index be033ca7..97db0f71 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -394,6 +394,8 @@ "webrtc_log.cc", "webrtc_log.h", "websocket_handshake_request_info.h", + "webvr_service_provider.cc", + "webvr_service_provider.h", ] configs += [ "//build/config:precompiled_headers",
diff --git a/content/public/browser/sms_fetcher.h b/content/public/browser/sms_fetcher.h index 47b1da5..ea7e873 100644 --- a/content/public/browser/sms_fetcher.h +++ b/content/public/browser/sms_fetcher.h
@@ -25,6 +25,9 @@ // There is one SmsFetcher per profile. class SmsFetcher { public: + SmsFetcher() = default; + virtual ~SmsFetcher() = default; + // Retrieval for devices that exclusively listen for SMSes coming from other // telephony devices. (eg. desktop) CONTENT_EXPORT static SmsFetcher* Get(BrowserContext* context);
diff --git a/content/public/browser/webvr_service_provider.cc b/content/public/browser/webvr_service_provider.cc new file mode 100644 index 0000000..e10aa12 --- /dev/null +++ b/content/public/browser/webvr_service_provider.cc
@@ -0,0 +1,28 @@ +// 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 "content/public/browser/webvr_service_provider.h" + +#include "base/lazy_instance.h" + +namespace content { + +base::LazyInstance<WebvrServiceProvider::BindWebvrServiceCallback>::Leaky + g_callback = LAZY_INSTANCE_INITIALIZER; + +void WebvrServiceProvider::BindWebvrService( + RenderFrameHost* render_frame_host, + mojo::PendingReceiver<device::mojom::VRService> receiver) { + // Ignore the pending receiver if the callback is unset. + if (g_callback.Get().is_null()) + return; + g_callback.Get().Run(render_frame_host, std::move(receiver)); +} + +void WebvrServiceProvider::SetWebvrServiceCallback( + BindWebvrServiceCallback callback) { + g_callback.Get() = std::move(callback); +} + +} // namespace content
diff --git a/content/public/browser/webvr_service_provider.h b/content/public/browser/webvr_service_provider.h new file mode 100644 index 0000000..7235a8f --- /dev/null +++ b/content/public/browser/webvr_service_provider.h
@@ -0,0 +1,43 @@ +// 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 CONTENT_PUBLIC_BROWSER_WEBVR_SERVICE_PROVIDER_H +#define CONTENT_PUBLIC_BROWSER_WEBVR_SERVICE_PROVIDER_H + +#include "base/callback.h" +#include "content/common/content_export.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + +namespace device { +namespace mojom { +class VRService; +} +} // namespace device + +namespace content { + +class RenderFrameHost; + +// Provides access to the browser process representation of a WebVR site +// session. See VrServiceImpl. +class WebvrServiceProvider { + public: + static void BindWebvrService( + RenderFrameHost* render_frame_host, + mojo::PendingReceiver<device::mojom::VRService> receiver); + + using BindWebvrServiceCallback = base::RepeatingCallback< + void(RenderFrameHost*, mojo::PendingReceiver<device::mojom::VRService>)>; + + CONTENT_EXPORT static void SetWebvrServiceCallback( + BindWebvrServiceCallback callback); + + private: + WebvrServiceProvider() = default; + ~WebvrServiceProvider() = default; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_WEBVR_SERVICE_PROVIDER_H
diff --git a/content/public/browser/xr_runtime_manager.h b/content/public/browser/xr_runtime_manager.h index cb66d58..735f3ba 100644 --- a/content/public/browser/xr_runtime_manager.h +++ b/content/public/browser/xr_runtime_manager.h
@@ -17,27 +17,13 @@ // active BrowserXRRuntime instances. An Observer interface is provided in case // runtimes need to interact with runtimes when they are added (e.g. to notify // them of any current state that they may need to know about). -class CONTENT_EXPORT XRRuntimeManager { +class XRRuntimeManager { public: class Observer : public base::CheckedObserver { public: virtual void OnRuntimeAdded(content::BrowserXRRuntime* runtime) {} }; - // Provides access to the XRRuntimeManager singleton, if it exists. - // This method does not extend the lifetime of the singleton, so you should be - // careful with the lifetime of this reference. - static content::XRRuntimeManager* GetInstanceIfCreated(); - - // Exits any currently presenting immersive session. - static void ExitImmersivePresentation(); - - // Observer registration methods are static so that observers may subscribe - // and unsubscribe independent of the lifecycle of the XRRuntimeManager - // Singleton. - static void AddObserver(content::XRRuntimeManager::Observer* observer); - static void RemoveObserver(content::XRRuntimeManager::Observer* observer); - XRRuntimeManager() = default; virtual ~XRRuntimeManager() = default;
diff --git a/content/public/test/DEPS b/content/public/test/DEPS index 352f8c6..548ed1a3d 100644 --- a/content/public/test/DEPS +++ b/content/public/test/DEPS
@@ -9,7 +9,6 @@ "+components/viz/common", "+components/viz/host", "+components/viz/test", - "+device/vr/public/mojom", "+services/audio", "+services/network", "+services/service_manager",
diff --git a/content/public/test/xr_test_utils.cc b/content/public/test/xr_test_utils.cc deleted file mode 100644 index f43f452..0000000 --- a/content/public/test/xr_test_utils.cc +++ /dev/null
@@ -1,21 +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 "content/public/test/xr_test_utils.h" - -#include "content/browser/xr/service/xr_device_service.h" - -namespace content { - -const mojo::Remote<device::mojom::XRDeviceService>& -GetXRDeviceServiceForTesting() { - return GetXRDeviceService(); -} - -void SetXRDeviceServiceStartupCallbackForTesting( - base::RepeatingClosure callback) { - SetXRDeviceServiceStartupCallbackForTestingInternal(std::move(callback)); -} - -} // namespace content
diff --git a/content/public/test/xr_test_utils.h b/content/public/test/xr_test_utils.h deleted file mode 100644 index 529a758..0000000 --- a/content/public/test/xr_test_utils.h +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_PUBLIC_TEST_XR_TEST_UTILS_H_ -#define CONTENT_PUBLIC_TEST_XR_TEST_UTILS_H_ - -#include "base/callback_forward.h" -#include "device/vr/public/mojom/isolated_xr_service.mojom-forward.h" -#include "mojo/public/cpp/bindings/remote.h" - -namespace content { - -// Allows tests to perform extra initialization steps on any new XR Device -// Service instance before other client code can use it. Any time a new instance -// of the service is started by |GetXRDeviceService()|, this callback (if -// non-null) is invoked. -void SetXRDeviceServiceStartupCallbackForTesting( - base::RepeatingClosure callback); - -// Acquires a remote handle to the sandboxed isolated XR Device Service -// instance, launching a process to host the service if necessary. -// This is really just a wrapper for |GetXRDeviceService| which is only exposed -// internally to content/browser. -const mojo::Remote<device::mojom::XRDeviceService>& -GetXRDeviceServiceForTesting(); - -} // namespace content - -#endif // CONTENT_PUBLIC_TEST_XR_TEST_UTILS_H_
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index fa325550..4f0c341 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -11,7 +11,6 @@ import("//build/config/ui.gni") import("//build/nocompile.gni") import("//content/common/features.gni") -import("//device/vr/buildflags/buildflags.gni") import("//media/media_options.gni") import("//mojo/public/tools/bindings/mojom.gni") import("//net/features.gni") @@ -590,13 +589,6 @@ if (is_linux) { deps += [ "//ui/platform_window/common" ] } - - if (enable_vr) { - sources += [ - "../public/test/xr_test_utils.cc", - "../public/test/xr_test_utils.h", - ] - } } # Fuchsia gpu integration tests use web_engine and a browser like shell @@ -1919,7 +1911,6 @@ "../browser/worker_host/shared_worker_service_impl_unittest.cc", "../browser/worker_host/worker_script_fetch_initiator_unittest.cc", "../browser/worker_host/worker_script_loader_factory_unittest.cc", - "../browser/xr/metrics/session_tracker_unittest.cc", "../child/blink_platform_impl_unittest.cc", "../child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc", "../child/dwrite_font_proxy/font_fallback_win_unittest.cc", @@ -2358,11 +2349,6 @@ sources += [ "../../services/service_manager/embedder/set_process_title_linux_unittest.cc" ] deps += [ "//services/service_manager/embedder:set_process_title_linux" ] } - - if (enable_vr) { - sources += [ "../browser/xr/service/xr_runtime_manager_unittest.cc" ] - deps += [ "//device/vr:vr_fakes" ] - } } if (enable_nocompile_tests) {
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn index 493cd7493..5f891b01 100644 --- a/content/utility/BUILD.gn +++ b/content/utility/BUILD.gn
@@ -83,7 +83,7 @@ } if (is_linux) { - deps += [ "//content/utility/soda:soda_sandbox_hook" ] + deps += [ "//content/utility/speech:speech_recognition_sandbox_hook" ] } if (enable_vr && !is_android) {
diff --git a/content/utility/soda/OWNERS b/content/utility/soda/OWNERS deleted file mode 100644 index 97961fa..0000000 --- a/content/utility/soda/OWNERS +++ /dev/null
@@ -1,3 +0,0 @@ -per-file soda_sandbox_hook_linux.*=file://sandbox/linux/OWNERS - -# COMPONENT: Internals>Sandbox
diff --git a/content/utility/soda/soda_sandbox_hook_linux.h b/content/utility/soda/soda_sandbox_hook_linux.h deleted file mode 100644 index 65efc1f..0000000 --- a/content/utility/soda/soda_sandbox_hook_linux.h +++ /dev/null
@@ -1,18 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_UTILITY_SODA_SODA_SANDBOX_HOOK_LINUX_H_ -#define CONTENT_UTILITY_SODA_SODA_SANDBOX_HOOK_LINUX_H_ - -#include "services/service_manager/sandbox/linux/sandbox_linux.h" - -namespace soda { - -// Opens the libsoda.so binary and grants broker file permissions to the -// necessary files required by the binary. -bool SodaPreSandboxHook(service_manager::SandboxLinux::Options options); - -} // namespace soda - -#endif // CONTENT_UTILITY_SODA_SODA_SANDBOX_HOOK_LINUX_H_
diff --git a/content/utility/soda/BUILD.gn b/content/utility/speech/BUILD.gn similarity index 73% rename from content/utility/soda/BUILD.gn rename to content/utility/speech/BUILD.gn index fd62e92..7a8ad15 100644 --- a/content/utility/soda/BUILD.gn +++ b/content/utility/speech/BUILD.gn
@@ -2,10 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("soda_sandbox_hook") { +source_set("speech_recognition_sandbox_hook") { sources = [ - "soda_sandbox_hook_linux.cc", - "soda_sandbox_hook_linux.h", + "speech_recognition_sandbox_hook_linux.cc", + "speech_recognition_sandbox_hook_linux.h", ] deps = [
diff --git a/content/utility/soda/DEPS b/content/utility/speech/DEPS similarity index 100% rename from content/utility/soda/DEPS rename to content/utility/speech/DEPS
diff --git a/content/utility/speech/OWNERS b/content/utility/speech/OWNERS new file mode 100644 index 0000000..0aa0cfc --- /dev/null +++ b/content/utility/speech/OWNERS
@@ -0,0 +1,3 @@ +per-file speech_recognition_sandbox_hook_linux.*=file://sandbox/linux/OWNERS + +# COMPONENT: Internals>Sandbox
diff --git a/content/utility/soda/soda_sandbox_hook_linux.cc b/content/utility/speech/speech_recognition_sandbox_hook_linux.cc similarity index 86% rename from content/utility/soda/soda_sandbox_hook_linux.cc rename to content/utility/speech/speech_recognition_sandbox_hook_linux.cc index b94592d..6d8e9ed2 100644 --- a/content/utility/soda/soda_sandbox_hook_linux.cc +++ b/content/utility/speech/speech_recognition_sandbox_hook_linux.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/utility/soda/soda_sandbox_hook_linux.h" +#include "content/utility/speech/speech_recognition_sandbox_hook_linux.h" #include <dlfcn.h> @@ -13,10 +13,11 @@ using sandbox::syscall_broker::BrokerFilePermission; using sandbox::syscall_broker::MakeBrokerCommandSet; -namespace soda { +namespace speech { namespace { +// Gets the file permissions required by the Speech On-Device API (SODA). std::vector<BrokerFilePermission> GetSodaFilePermissions( base::FilePath latest_version_dir) { std::vector<BrokerFilePermission> permissions{ @@ -35,7 +36,8 @@ } // namespace -bool SodaPreSandboxHook(service_manager::SandboxLinux::Options options) { +bool SpeechRecognitionPreSandboxHook( + service_manager::SandboxLinux::Options options) { void* soda_library = dlopen(GetSodaBinaryPath().value().c_str(), RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); DCHECK(soda_library); @@ -55,4 +57,4 @@ return true; } -} // namespace soda +} // namespace speech
diff --git a/content/utility/speech/speech_recognition_sandbox_hook_linux.h b/content/utility/speech/speech_recognition_sandbox_hook_linux.h new file mode 100644 index 0000000..7fdfd3b --- /dev/null +++ b/content/utility/speech/speech_recognition_sandbox_hook_linux.h
@@ -0,0 +1,19 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_UTILITY_SPEECH_SPEECH_RECOGNITION_SANDBOX_HOOK_LINUX_H_ +#define CONTENT_UTILITY_SPEECH_SPEECH_RECOGNITION_SANDBOX_HOOK_LINUX_H_ + +#include "services/service_manager/sandbox/linux/sandbox_linux.h" + +namespace speech { + +// Opens the libsoda.so binary and grants broker file permissions to the +// necessary files required by the binary. +bool SpeechRecognitionPreSandboxHook( + service_manager::SandboxLinux::Options options); + +} // namespace speech + +#endif // CONTENT_UTILITY_SPEECH_SPEECH_RECOGNITION_SANDBOX_HOOK_LINUX_H_
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index bfd4417..dbb6a5b 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -23,7 +23,7 @@ #include "services/tracing/public/cpp/trace_startup.h" #if defined(OS_LINUX) -#include "content/utility/soda/soda_sandbox_hook_linux.h" +#include "content/utility/speech/speech_recognition_sandbox_hook_linux.h" #include "services/audio/audio_sandbox_hook_linux.h" #include "services/network/network_sandbox_hook_linux.h" #include "services/service_manager/sandbox/linux/sandbox_linux.h" @@ -85,14 +85,15 @@ sandbox_type == service_manager::SandboxType::kIme || #endif // OS_CHROMEOS sandbox_type == service_manager::SandboxType::kAudio || - sandbox_type == service_manager::SandboxType::kSoda) { + sandbox_type == service_manager::SandboxType::kSpeechRecognition) { service_manager::SandboxLinux::PreSandboxHook pre_sandbox_hook; if (sandbox_type == service_manager::SandboxType::kNetwork) pre_sandbox_hook = base::BindOnce(&network::NetworkPreSandboxHook); else if (sandbox_type == service_manager::SandboxType::kAudio) pre_sandbox_hook = base::BindOnce(&audio::AudioPreSandboxHook); - else if (sandbox_type == service_manager::SandboxType::kSoda) - pre_sandbox_hook = base::BindOnce(&soda::SodaPreSandboxHook); + else if (sandbox_type == service_manager::SandboxType::kSpeechRecognition) + pre_sandbox_hook = + base::BindOnce(&speech::SpeechRecognitionPreSandboxHook); #if defined(OS_CHROMEOS) else if (sandbox_type == service_manager::SandboxType::kIme) pre_sandbox_hook = base::BindOnce(&chromeos::ime::ImePreSandboxHook);
diff --git a/fuchsia/base/context_provider_test_connector.cc b/fuchsia/base/context_provider_test_connector.cc index a438b1de..28d6d2ee 100644 --- a/fuchsia/base/context_provider_test_connector.cc +++ b/fuchsia/base/context_provider_test_connector.cc
@@ -20,7 +20,7 @@ namespace cr_fuchsia { -fuchsia::web::ContextProviderPtr ConnectContextProvider( +fidl::InterfaceHandle<fuchsia::io::Directory> StartWebEngineForTests( fidl::InterfaceRequest<fuchsia::sys::ComponentController> component_controller_request, const base::CommandLine& command_line) { @@ -49,12 +49,16 @@ launcher->CreateComponent(std::move(launch_info), std::move(component_controller_request)); - sys::ServiceDirectory web_engine_service_dir( - std::move(web_engine_services_dir)); + return web_engine_services_dir; +} - fuchsia::web::ContextProviderPtr context_provider; - web_engine_service_dir.Connect(context_provider.NewRequest()); - return context_provider; +fuchsia::web::ContextProviderPtr ConnectContextProvider( + fidl::InterfaceRequest<fuchsia::sys::ComponentController> + component_controller_request, + const base::CommandLine& command_line) { + sys::ServiceDirectory web_engine_service_dir(StartWebEngineForTests( + std::move(component_controller_request), command_line)); + return web_engine_service_dir.Connect<fuchsia::web::ContextProvider>(); } } // namespace cr_fuchsia
diff --git a/fuchsia/base/context_provider_test_connector.h b/fuchsia/base/context_provider_test_connector.h index 632c6f9..0d5ca1fd 100644 --- a/fuchsia/base/context_provider_test_connector.h +++ b/fuchsia/base/context_provider_test_connector.h
@@ -8,11 +8,18 @@ #include <fuchsia/sys/cpp/fidl.h> #include <fuchsia/web/cpp/fidl.h> #include <lib/fidl/cpp/interface_request.h> +#include <lib/sys/cpp/service_directory.h> #include "base/command_line.h" namespace cr_fuchsia { +fidl::InterfaceHandle<fuchsia::io::Directory> StartWebEngineForTests( + fidl::InterfaceRequest<fuchsia::sys::ComponentController> + component_controller_request, + const base::CommandLine& command_line = + base::CommandLine(base::CommandLine::NO_PROGRAM)); + // TODO(crbug.com/1046615): Use test manifests for package specification. fuchsia::web::ContextProviderPtr ConnectContextProvider( fidl::InterfaceRequest<fuchsia::sys::ComponentController>
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn index ede8ad4..7e320b2 100644 --- a/fuchsia/engine/BUILD.gn +++ b/fuchsia/engine/BUILD.gn
@@ -82,6 +82,7 @@ "//content/public/common", "//content/public/renderer", "//fuchsia/base", + "//fuchsia/base:legacymetrics", "//fuchsia/base:message_port", "//fuchsia/base:modular", "//gpu/command_buffer/service",
diff --git a/fuchsia/engine/browser/web_engine_browser_main_parts.cc b/fuchsia/engine/browser/web_engine_browser_main_parts.cc index 15be55a9..a9a588a7 100644 --- a/fuchsia/engine/browser/web_engine_browser_main_parts.cc +++ b/fuchsia/engine/browser/web_engine_browser_main_parts.cc
@@ -13,6 +13,7 @@ #include "content/public/browser/gpu_data_manager.h" #include "content/public/browser/render_frame_host.h" #include "content/public/common/main_function_params.h" +#include "fuchsia/base/legacymetrics_client.h" #include "fuchsia/engine/browser/context_impl.h" #include "fuchsia/engine/browser/web_engine_browser_context.h" #include "fuchsia/engine/browser/web_engine_devtools_controller.h" @@ -23,6 +24,13 @@ #include "ui/ozone/public/ozone_platform.h" #include "ui/ozone/public/ozone_switches.h" +namespace { + +constexpr base::TimeDelta kMetricsReportingInterval = + base::TimeDelta::FromMinutes(1); + +} // namespace + WebEngineBrowserMainParts::WebEngineBrowserMainParts( const content::MainFunctionParams& parameters, fidl::InterfaceRequest<fuchsia::web::Context> request) @@ -62,6 +70,13 @@ context_binding_ = std::make_unique<fidl::Binding<fuchsia::web::Context>>( context_service_.get(), std::move(request_)); + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kUseLegacyMetricsService)) { + legacy_metrics_client_ = + std::make_unique<cr_fuchsia::LegacyMetricsClient>(); + legacy_metrics_client_->Start(kMetricsReportingInterval); + } + // Quit the browser main loop when the Context connection is dropped. context_binding_->set_error_handler([this](zx_status_t status) { ZX_LOG_IF(ERROR, status != ZX_ERR_PEER_CLOSED, status) @@ -104,6 +119,7 @@ // These resources must be freed while a MessageLoop is still available, so // that they may post cleanup tasks during teardown. // NOTE: Please destroy objects in the reverse order of their creation. + legacy_metrics_client_.reset(); context_binding_.reset(); browser_context_.reset(); screen_.reset();
diff --git a/fuchsia/engine/browser/web_engine_browser_main_parts.h b/fuchsia/engine/browser/web_engine_browser_main_parts.h index c690dc3..e1d9b8f 100644 --- a/fuchsia/engine/browser/web_engine_browser_main_parts.h +++ b/fuchsia/engine/browser/web_engine_browser_main_parts.h
@@ -23,6 +23,10 @@ struct MainFunctionParams; } +namespace cr_fuchsia { +class LegacyMetricsClient; +} + class WebEngineBrowserMainParts : public content::BrowserMainParts { public: explicit WebEngineBrowserMainParts( @@ -55,6 +59,7 @@ std::unique_ptr<ContextImpl> context_service_; std::unique_ptr<fidl::Binding<fuchsia::web::Context>> context_binding_; std::unique_ptr<WebEngineDevToolsController> devtools_controller_; + std::unique_ptr<cr_fuchsia::LegacyMetricsClient> legacy_metrics_client_; bool run_message_loop_ = true; base::OnceClosure quit_closure_;
diff --git a/fuchsia/engine/context_provider_impl.cc b/fuchsia/engine/context_provider_impl.cc index 514c4ae..22c8544 100644 --- a/fuchsia/engine/context_provider_impl.cc +++ b/fuchsia/engine/context_provider_impl.cc
@@ -397,6 +397,11 @@ launch_command.AppendSwitch(switches::kHeadless); } + if ((features & fuchsia::web::ContextFeatureFlags::LEGACYMETRICS) == + fuchsia::web::ContextFeatureFlags::LEGACYMETRICS) { + launch_command.AppendSwitch(switches::kUseLegacyMetricsService); + } + bool enable_vulkan = (features & fuchsia::web::ContextFeatureFlags::VULKAN) == fuchsia::web::ContextFeatureFlags::VULKAN; bool enable_widevine =
diff --git a/fuchsia/engine/switches.cc b/fuchsia/engine/switches.cc index 8d44d40..ad79e8a 100644 --- a/fuchsia/engine/switches.cc +++ b/fuchsia/engine/switches.cc
@@ -14,5 +14,6 @@ const char kRemoteDebuggerHandles[] = "remote-debugger-handles"; const char kUserAgentProductAndVersion[] = "user-agent-product"; const char kAllowRunningInsecureContent[] = "allow-running-insecure-content"; +const char kUseLegacyMetricsService[] = "use-legacy-metrics-service"; } // namespace switches
diff --git a/fuchsia/engine/switches.h b/fuchsia/engine/switches.h index 0436b022..01855df 100644 --- a/fuchsia/engine/switches.h +++ b/fuchsia/engine/switches.h
@@ -38,6 +38,10 @@ // necessary. extern const char kAllowRunningInsecureContent[]; +// Enables use of the fuchsia.legacymetrics.MetricsRecorder service for +// telemetry. +extern const char kUseLegacyMetricsService[]; + } // namespace switches #endif // FUCHSIA_ENGINE_SWITCHES_H_
diff --git a/fuchsia/runners/BUILD.gn b/fuchsia/runners/BUILD.gn index d6673c8..a10ea0c 100644 --- a/fuchsia/runners/BUILD.gn +++ b/fuchsia/runners/BUILD.gn
@@ -76,6 +76,7 @@ public_deps = [ ":common", "//fuchsia:cast_fidl", + "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.legacymetrics", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.web", ] visibility = [ ":*" ]
diff --git a/fuchsia/runners/cast/cast_component.cc b/fuchsia/runners/cast/cast_component.cc index 95fa1a2..69b5c49 100644 --- a/fuchsia/runners/cast/cast_component.cc +++ b/fuchsia/runners/cast/cast_component.cc
@@ -156,7 +156,4 @@ DCHECK(runner()->is_headless()); frame()->DisableHeadlessRendering(); - - if (on_headless_disconnect_cb_) - std::move(on_headless_disconnect_cb_).Run(); }
diff --git a/fuchsia/runners/cast/cast_component.h b/fuchsia/runners/cast/cast_component.h index 071970b..d6494b6 100644 --- a/fuchsia/runners/cast/cast_component.h +++ b/fuchsia/runners/cast/cast_component.h
@@ -11,7 +11,6 @@ #include <vector> #include "base/fuchsia/startup_context.h" -#include "base/gtest_prod_util.h" #include "base/message_loop/message_pump_for_io.h" #include "base/message_loop/message_pump_fuchsia.h" #include "base/optional.h" @@ -58,13 +57,6 @@ // WebComponent overrides. void StartComponent() final; - // Sets a callback that will be invoked when the handle controlling the - // lifetime of a headless "view" is dropped. - void set_on_headless_disconnect_for_test( - base::OnceClosure on_headless_disconnect_cb) { - on_headless_disconnect_cb_ = std::move(on_headless_disconnect_cb); - } - const chromium::cast::ApplicationConfig& application_config() { return application_config_; } @@ -74,8 +66,6 @@ CastRunner* runner() const; private: - FRIEND_TEST_ALL_PREFIXES(HeadlessCastRunnerIntegrationTest, Headless); - void OnRewriteRulesReceived( std::vector<fuchsia::web::UrlRequestRewriteRule> rewrite_rules); @@ -113,8 +103,6 @@ zx::eventpair headless_view_token_; base::MessagePumpForIO::ZxHandleWatchController headless_disconnect_watch_; - base::OnceClosure on_headless_disconnect_cb_; - fidl::Binding<fuchsia::web::NavigationEventListener> navigation_listener_binding_;
diff --git a/fuchsia/runners/cast/cast_runner.cc b/fuchsia/runners/cast/cast_runner.cc index baa6cd1b..127f171 100644 --- a/fuchsia/runners/cast/cast_runner.cc +++ b/fuchsia/runners/cast/cast_runner.cc
@@ -43,8 +43,9 @@ "fuchsia.ui.scenic.Scenic", "fuchsia.vulkan.loader.Loader", - // Redirected to the agent. - // fuchsia.media.Audio + // These services are redirected to the Agent: + // * fuchsia.media.Audio + // * fuchsia.legacymetrics.MetricsRecorder }; bool AreCastComponentParamsValid( @@ -68,7 +69,8 @@ // Isolated contexts receive only a limited set of features. fuchsia::web::ContextFeatureFlags features = - fuchsia::web::ContextFeatureFlags::AUDIO; + fuchsia::web::ContextFeatureFlags::AUDIO | + fuchsia::web::ContextFeatureFlags::LEGACYMETRICS; if ((create_context_params.features() & fuchsia::web::ContextFeatureFlags::HEADLESS) == @@ -117,24 +119,13 @@ CastRunner::CastRunner( WebContentRunner::GetContextParamsCallback get_context_params_callback, - bool is_headless, - sys::OutgoingDirectory* outgoing_directory) + bool is_headless) : WebContentRunner(base::BindRepeating(&CastRunner::GetMainContextParams, - base::Unretained(this)), - outgoing_directory), + base::Unretained(this))), get_context_params_callback_(std::move(get_context_params_callback)), is_headless_(is_headless), - common_create_context_params_(BuildCreateContextParamsForIsolatedRunners( - get_context_params_callback_.Run())), service_directory_(CreateServiceDirectory()) {} -CastRunner::CastRunner(OnDestructionCallback on_destruction_callback, - fuchsia::web::ContextPtr context, - bool is_headless) - : WebContentRunner(std::move(context)), - is_headless_(is_headless), - on_destruction_callback_(std::move(on_destruction_callback)) {} - CastRunner::~CastRunner() = default; void CastRunner::StartComponent( @@ -212,10 +203,6 @@ pending_components_.emplace(std::move(pending_component_params)); } -size_t CastRunner::GetChildCastRunnerCountForTest() { - return isolated_runners_.size(); -} - void CastRunner::DestroyComponent(WebComponent* component) { WebContentRunner::DestroyComponent(component); @@ -318,6 +305,17 @@ }), fuchsia::media::Audio::Name_); + // Proxy fuchsia.legacymetrics.MetricsRecorder connection requests to the + // Agent. + service_directory->outgoing_directory()->AddPublicService( + std::make_unique<vfs::Service>( + [this](zx::channel channel, async_dispatcher_t*) { + this->ConnectMetricsRecorderProtocol( + fidl::InterfaceRequest<fuchsia::legacymetrics::MetricsRecorder>( + std::move(channel))); + }), + fuchsia::legacymetrics::MetricsRecorder::Name_); + return service_directory; } @@ -330,7 +328,7 @@ CastRunner* component_owner = this; if (pending_component_params->app_config .has_content_directories_for_isolated_application()) { - // Create a isolated, isolated CastRunner instance which will own the + // Create an isolated CastRunner instance which will own the // CastComponent. component_owner = CreateChildRunnerForIsolatedComponent(pending_component_params); @@ -370,38 +368,27 @@ CastRunner* CastRunner::CreateChildRunnerForIsolatedComponent( CastComponent::CastComponentParams* component_params) { - // Construct the CreateContextParams in order to create a new Context. - // Some common parameters must be inherited from - // |common_create_context_params_|. - fuchsia::web::CreateContextParams isolated_context_params; - zx_status_t status = - common_create_context_params_.Clone(&isolated_context_params); - if (status != ZX_OK) { - ZX_LOG(ERROR, status) << "clone"; - return nullptr; - } - - // Service redirection is not necessary for isolated context. Pass default - // /svc as is, without overriding any services. - isolated_context_params.set_service_directory(base::fuchsia::OpenDirectory( - base::FilePath(base::fuchsia::kServiceDirectoryPath))); - DCHECK(isolated_context_params.service_directory()); + // Construct the CreateContextParams in order to create a new Context. Some + // common parameters must be inherited from default params returned from + // |get_context_params_callback_|. + fuchsia::web::CreateContextParams isolated_context_params = + BuildCreateContextParamsForIsolatedRunners( + get_context_params_callback_.Run()); isolated_context_params.set_content_directories( std::move(*component_params->app_config .mutable_content_directories_for_isolated_application())); - std::unique_ptr<CastRunner> cast_runner(new CastRunner( - base::BindOnce(&CastRunner::OnChildRunnerDestroyed, - base::Unretained(this)), - CreateWebContext(std::move(isolated_context_params)), is_headless())); + auto create_context_params_callback = base::BindRepeating( + [](fuchsia::web::CreateContextParams isolated_context_params) { + return isolated_context_params; + }, + base::Passed(std::move(isolated_context_params))); - // If test code is listening for Component creation events, then wire up the - // isolated CastRunner to signal component creation events. - if (web_component_created_callback_for_test()) { - cast_runner->SetWebComponentCreatedCallbackForTest( - web_component_created_callback_for_test()); - } + auto cast_runner = std::make_unique<CastRunner>( + std::move(create_context_params_callback), is_headless()); + cast_runner->on_destruction_callback_ = base::BindOnce( + &CastRunner::OnChildRunnerDestroyed, base::Unretained(this)); CastRunner* cast_runner_ptr = cast_runner.get(); isolated_runners_.insert(std::move(cast_runner)); @@ -431,6 +418,16 @@ std::move(request)); } +void CastRunner::ConnectMetricsRecorderProtocol( + fidl::InterfaceRequest<fuchsia::legacymetrics::MetricsRecorder> request) { + CastComponent* component = + reinterpret_cast<CastComponent*>(GetAnyComponent()); + DCHECK(component); + + component->agent_manager()->ConnectToAgentService( + component->application_config().agent_url(), std::move(request)); +} + fuchsia::web::CreateContextParams CastRunner::GetMainContextParams() { fuchsia::web::CreateContextParams create_context_params = get_context_params_callback_.Run();
diff --git a/fuchsia/runners/cast/cast_runner.h b/fuchsia/runners/cast/cast_runner.h index 34e244c9..e5366b0 100644 --- a/fuchsia/runners/cast/cast_runner.h +++ b/fuchsia/runners/cast/cast_runner.h
@@ -5,6 +5,7 @@ #ifndef FUCHSIA_RUNNERS_CAST_CAST_RUNNER_H_ #define FUCHSIA_RUNNERS_CAST_CAST_RUNNER_H_ +#include <fuchsia/legacymetrics/cpp/fidl.h> #include <fuchsia/sys/cpp/fidl.h> #include <fuchsia/web/cpp/fidl.h> #include <memory> @@ -29,16 +30,17 @@ // sys::Runner which instantiates Cast activities specified via cast/casts URIs. class CastRunner : public WebContentRunner { public: + using OnDestructionCallback = base::OnceCallback<void(CastRunner*)>; + + static constexpr uint16_t kRemoteDebuggingPort = 9222; + // Creates a Runner for Cast components and publishes it into the specified // OutgoingDirectory. // |get_context_params_callback|: Returns the context parameters to use. // |is_headless|: True if |get_context_params_callback| sets the HEADLESS // feature flag. - // |outgoing_directory|: The directory that this CastRunner will publish - // itself to. CastRunner(GetContextParamsCallback get_context_params_callback, - bool is_headless, - sys::OutgoingDirectory* outgoing_directory); + bool is_headless); ~CastRunner() override; CastRunner(const CastRunner&) = delete; @@ -59,20 +61,7 @@ // Returns true if this Runner is configured not to use Scenic. bool is_headless() const { return is_headless_; } - // Returns the number of active CastRunner instances. - size_t GetChildCastRunnerCountForTest(); - private: - using OnDestructionCallback = base::OnceCallback<void(CastRunner*)>; - - // Constructor used for creating CastRunners that run apps in dedicated - // Contexts. Child CastRunners may only spawn one Component and will be - // destroyed by their parents when their singleton Components are destroyed. - // |on_destruction_callback| is invoked when the child component is destroyed. - CastRunner(OnDestructionCallback on_destruction_callback, - fuchsia::web::ContextPtr context, - bool is_headless); - // Creates and returns the service directory that is passed to the main web // context. std::unique_ptr<base::fuchsia::FilteredServiceDirectory> @@ -102,6 +91,11 @@ void ConnectAudioProtocol( fidl::InterfaceRequest<fuchsia::media::Audio> request); + // Handler for fuchsia.legacymetrics.MetricsRecorder requests in + // |service_directory_|. + void ConnectMetricsRecorderProtocol( + fidl::InterfaceRequest<fuchsia::legacymetrics::MetricsRecorder> request); + // Returns the parameters with which the main context should be created. fuchsia::web::CreateContextParams GetMainContextParams(); @@ -116,9 +110,6 @@ base::UniquePtrComparator> pending_components_; - // Used as a template for creating the ContextPtrs of isolated Runners. - fuchsia::web::CreateContextParams common_create_context_params_; - // Invoked upon destruction of "isolated" runners, used to signal termination // to parents. OnDestructionCallback on_destruction_callback_;
diff --git a/fuchsia/runners/cast/cast_runner_integration_test.cc b/fuchsia/runners/cast/cast_runner_integration_test.cc index 69b1dda..9d25f4c 100644 --- a/fuchsia/runners/cast/cast_runner_integration_test.cc +++ b/fuchsia/runners/cast/cast_runner_integration_test.cc
@@ -2,19 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <fuchsia/legacymetrics/cpp/fidl.h> +#include <fuchsia/legacymetrics/cpp/fidl_test_base.h> #include <fuchsia/modular/cpp/fidl.h> #include <lib/fdio/directory.h> #include <lib/fidl/cpp/binding.h> #include <lib/sys/cpp/component_context.h> #include <lib/ui/scenic/cpp/view_token_pair.h> #include <lib/zx/channel.h> +#include <zircon/processargs.h> #include "base/base_paths_fuchsia.h" #include "base/callback_helpers.h" #include "base/fuchsia/file_utils.h" +#include "base/fuchsia/filtered_service_directory.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/fuchsia/scoped_service_binding.h" +#include "base/fuchsia/test_component_context_for_process.h" #include "base/path_service.h" +#include "base/strings/strcat.h" #include "base/strings/stringprintf.h" #include "base/test/bind_test_util.h" #include "base/test/task_environment.h" @@ -26,6 +32,7 @@ #include "fuchsia/base/frame_test_util.h" #include "fuchsia/base/fuchsia_dir_scheme.h" #include "fuchsia/base/mem_buffer_util.h" +#include "fuchsia/base/release_channel.h" #include "fuchsia/base/result_receiver.h" #include "fuchsia/base/string_util.h" #include "fuchsia/base/test_devtools_list_fetcher.h" @@ -34,11 +41,8 @@ #include "fuchsia/runners/cast/cast_runner.h" #include "fuchsia/runners/cast/fake_application_config_manager.h" #include "fuchsia/runners/cast/test_api_bindings.h" -#include "fuchsia/runners/common/web_component.h" -#include "fuchsia/runners/common/web_content_runner.h" #include "net/test/embedded_test_server/default_handlers.h" #include "net/test/embedded_test_server/http_request.h" -#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -47,7 +51,6 @@ constexpr char kBlankAppUrl[] = "/defaultresponse"; constexpr char kEchoHeaderPath[] = "/echoheader?Test"; -constexpr char kEchoAppPath[] = "/echo.html"; constexpr char kTestServerRoot[] = FILE_PATH_LITERAL("fuchsia/runners/cast/testdata"); @@ -55,10 +58,6 @@ constexpr char kDummyAgentUrl[] = "fuchsia-pkg://fuchsia.com/dummy_agent#meta/dummy_agent.cmx"; -void ComponentErrorHandler(zx_status_t status) { - ZX_LOG(ERROR, status) << "Component launch failed"; - ADD_FAILURE(); -} // Helper used to ensure that cr_fuchsia::RegisterFuchsiaDirScheme() is called // once per process to register fuchsia-dir scheme. In cast_runner this function @@ -94,7 +93,8 @@ rules_sent_ = true; std::vector<fuchsia::web::UrlRequestRewrite> rewrites; - rewrites.push_back(cr_fuchsia::CreateRewriteAddHeaders("Test", "Value")); + rewrites.push_back( + cr_fuchsia::CreateRewriteAddHeaders("Test", "TestHeaderValue")); fuchsia::web::UrlRequestRewriteRule rule; rule.set_rewrites(std::move(rewrites)); std::vector<fuchsia::web::UrlRequestRewriteRule> rules; @@ -197,31 +197,39 @@ context_binding_; base::OnceClosure on_delete_; }; - } // namespace class CastRunnerIntegrationTest : public testing::Test { public: - CastRunnerIntegrationTest() - : CastRunnerIntegrationTest(fuchsia::web::ContextFeatureFlags::NETWORK) {} + CastRunnerIntegrationTest() : CastRunnerIntegrationTest(/*headless=*/false) {} CastRunnerIntegrationTest(const CastRunnerIntegrationTest&) = delete; CastRunnerIntegrationTest& operator=(const CastRunnerIntegrationTest&) = delete; void TearDown() override { + if (component_controller_) + ShutdownComponent(); + // Disconnect the CastRunner & let things tear-down. cast_runner_ptr_.Unbind(); base::RunLoop().RunUntilIdle(); } protected: - explicit CastRunnerIntegrationTest( - fuchsia::web::ContextFeatureFlags feature_flags) + explicit CastRunnerIntegrationTest(bool headless) : app_config_manager_binding_(&component_services_, &app_config_manager_) { EnsureFuchsiaDirSchemeInitialized(); // Create the CastRunner, published into |outgoing_directory_|. + fuchsia::web::ContextFeatureFlags feature_flags = + fuchsia::web::ContextFeatureFlags::NETWORK | + fuchsia::web::ContextFeatureFlags::LEGACYMETRICS; + if (headless) { + feature_flags = + feature_flags | fuchsia::web::ContextFeatureFlags::HEADLESS; + } + WebContentRunner::GetContextParamsCallback get_context_params = base::BindLambdaForTesting([feature_flags]() { fuchsia::web::CreateContextParams create_context_params; @@ -231,19 +239,15 @@ base::FilePath(base::fuchsia::kServiceDirectoryPath))); CHECK(create_context_params.service_directory()); - const uint16_t kRemoteDebuggingAnyPort = 0; create_context_params.set_remote_debugging_port( - kRemoteDebuggingAnyPort); + CastRunner::kRemoteDebuggingPort); return create_context_params; }); - cast_runner_ = std::make_unique<CastRunner>( - std::move(get_context_params), - (feature_flags & fuchsia::web::ContextFeatureFlags::HEADLESS) == - fuchsia::web::ContextFeatureFlags::HEADLESS, - &outgoing_directory_); + cast_runner_ = + std::make_unique<CastRunner>(std::move(get_context_params), headless); + cast_runner_->PublishRunnerService(&outgoing_directory_); - cast_runner_->SetContextProviderForTest(cr_fuchsia::ConnectContextProvider( - context_provider_controller_.NewRequest())); + StartAndPublishWebEngine(); // Connect to the CastRunner's fuchsia.sys.Runner interface. fidl::InterfaceHandle<fuchsia::io::Directory> directory; @@ -260,6 +264,24 @@ test_server_.ServeFilesFromSourceDirectory(kTestServerRoot); net::test_server::RegisterDefaultHandlers(&test_server_); EXPECT_TRUE(test_server_.Start()); + + // Inject ApiBinding that used by ExecuteJavaScript(). + std::vector<chromium::cast::ApiBinding> binding_list; + chromium::cast::ApiBinding eval_js_binding; + eval_js_binding.set_before_load_script(cr_fuchsia::MemBufferFromString( + "window.addEventListener('DOMContentLoaded', (event) => {" + " var port = cast.__platform__.PortConnector.bind('testport');" + " port.onmessage = (e) => {" + " var result = eval(e.data);" + " if (typeof(result) == \"undefined\") {" + " result = \"undefined\";" + " }" + " port.postMessage(result);" + " };" + "});", + "test")); + binding_list.emplace_back(std::move(eval_js_binding)); + api_bindings_.set_bindings(std::move(binding_list)); } std::unique_ptr<cr_fuchsia::AgentImpl::ComponentStateBase> OnComponentConnect( @@ -269,12 +291,31 @@ url_request_rewrite_rules_provider_.get()); component_state_ = component_state.get(); - if (init_component_state_callback_) - std::move(init_component_state_callback_).Run(component_state_); + if (component_state_created_callback_) + std::move(component_state_created_callback_).Run(); return component_state; } + void StartAndPublishWebEngine() { + fidl::InterfaceHandle<fuchsia::io::Directory> web_engine_outgoing_dir = + cr_fuchsia::StartWebEngineForTests(web_engine_controller_.NewRequest()); + sys::ServiceDirectory web_engine_outgoing_services( + std::move(web_engine_outgoing_dir)); + + test_component_context_.additional_services() + ->RemovePublicService<fuchsia::web::ContextProvider>(); + test_component_context_.additional_services()->AddPublicService( + std::make_unique<vfs::Service>( + [web_engine_outgoing_services = + std::move(web_engine_outgoing_services)]( + zx::channel channel, async_dispatcher_t* dispatcher) { + web_engine_outgoing_services.Connect( + fuchsia::web::ContextProvider::Name_, std::move(channel)); + }), + fuchsia::web::ContextProvider::Name_); + } + void RegisterAppWithTestData(GURL url) { fuchsia::web::ContentDirectoryProvider provider; provider.set_name("testdata"); @@ -296,7 +337,8 @@ auto component_url = base::StringPrintf("cast:%s", kTestAppId); CreateComponentContext(component_url); StartCastComponent(component_url); - WaitComponentCreated(); + WaitComponentState(); + WaitTestPort(); } void CreateComponentContext(const base::StringPiece& component_url) { @@ -322,7 +364,7 @@ startup_info.launch_info.directory_request = outgoing_directory.NewRequest().TakeChannel(); - fidl::InterfaceHandle<::fuchsia::io::Directory> svc_directory; + fidl::InterfaceHandle<fuchsia::io::Directory> svc_directory; CHECK_EQ(fdio_service_connect_at( outgoing_directory.channel().get(), "svc", svc_directory.NewRequest().TakeChannel().release()), @@ -340,50 +382,82 @@ fuchsia::sys::Package package; package.resolved_url = component_url.as_string(); - cast_runner_ptr_->StartComponent(std::move(package), - std::move(startup_info), - component_controller_.NewRequest()); - component_controller_.set_error_handler(&ComponentErrorHandler); + cast_runner_->StartComponent(std::move(package), std::move(startup_info), + component_controller_.NewRequest()); + component_controller_.set_error_handler([](zx_status_t status) { + ZX_LOG(ERROR, status) << "Component launch failed"; + ADD_FAILURE(); + }); } - void WaitComponentCreated() { - ASSERT_FALSE(cast_component_); + // Executes |code| in the context of the test application and the returns + // serialized as string. + std::string ExecuteJavaScript(const std::string& code) { + fuchsia::web::WebMessage message; + message.set_data(cr_fuchsia::MemBufferFromString(code, "test-msg")); + test_port_->PostMessage( + std::move(message), + [](fuchsia::web::MessagePort_PostMessage_Result result) { + EXPECT_TRUE(result.is_response()); + }); + base::RunLoop response_loop; + cr_fuchsia::ResultReceiver<fuchsia::web::WebMessage> response( + response_loop.QuitClosure()); + test_port_->ReceiveMessage( + cr_fuchsia::CallbackToFitFunction(response.GetReceiveCallback())); + response_loop.Run(); + + std::string response_string; + EXPECT_TRUE( + cr_fuchsia::StringFromMemBuffer(response->data(), &response_string)); + + return response_string; + } + + void WaitComponentState() { base::RunLoop run_loop; - cr_fuchsia::ResultReceiver<WebComponent*> component_receiver( - run_loop.QuitClosure()); - cast_runner_->SetWebComponentCreatedCallbackForTest( - base::AdaptCallbackForRepeating( - component_receiver.GetReceiveCallback())); + component_state_created_callback_ = run_loop.QuitClosure(); run_loop.Run(); - ASSERT_NE(*component_receiver, nullptr); - cast_component_ = reinterpret_cast<CastComponent*>(*component_receiver); } - void WaitUrlAndTitle(const GURL& url, const std::string& title) { + void WaitTestPort() { + CHECK(!test_port_); + test_port_ = api_bindings_.RunUntilMessagePortReceived("testport").Bind(); + } + + void CheckAppUrl(const GURL& app_url) { + EXPECT_EQ(ExecuteJavaScript("window.location.href"), app_url.spec()); + } + + void ShutdownComponent() { + DCHECK(component_controller_); + base::RunLoop run_loop; - cr_fuchsia::TestNavigationListener listener; - fidl::Binding<fuchsia::web::NavigationEventListener> listener_binding( - &listener); - cast_component_->frame()->SetNavigationEventListener( - listener_binding.NewBinding()); - listener.RunUntilUrlAndTitleEquals(url, title); + component_state_->set_on_delete(run_loop.QuitClosure()); + component_controller_.Unbind(); + run_loop.Run(); + + component_controller_ = nullptr; } void WaitForComponentDestroyed() { - ASSERT_TRUE(cast_component_); ASSERT_TRUE(component_state_); - base::RunLoop state_loop; component_state_->set_on_delete(state_loop.QuitClosure()); + base::RunLoop controller_loop; if (component_controller_) { - base::RunLoop controller_loop; component_controller_.set_error_handler( [&controller_loop](zx_status_t status) { EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); controller_loop.Quit(); }); + } + + web_engine_controller_->Kill(); + + if (component_controller_) { controller_loop.Run(); } @@ -392,13 +466,14 @@ component_context_ = nullptr; component_services_client_ = nullptr; component_state_ = nullptr; - cast_component_ = nullptr; } base::test::SingleThreadTaskEnvironment task_environment_{ base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; net::EmbeddedTestServer test_server_; + fuchsia::sys::ComponentControllerPtr web_engine_controller_; + FakeApplicationConfigManager app_config_manager_; TestApiBindings api_bindings_; std::unique_ptr<FakeUrlRequestRewriteRulesProvider> @@ -412,16 +487,17 @@ fuchsia::sys::ComponentControllerPtr component_controller_; std::unique_ptr<sys::ServiceDirectory> component_services_client_; FakeComponentState* component_state_ = nullptr; - CastComponent* cast_component_ = nullptr; + fuchsia::web::MessagePortPtr test_port_; - base::OnceCallback<void(FakeComponentState*)> init_component_state_callback_; + base::OnceClosure component_state_created_callback_; // ServiceDirectory into which the CastRunner will publish itself. sys::OutgoingDirectory outgoing_directory_; std::unique_ptr<CastRunner> cast_runner_; fuchsia::sys::RunnerPtr cast_runner_ptr_; - fuchsia::sys::ComponentControllerPtr context_provider_controller_; + base::TestComponentContextForProcess test_component_context_{ + base::TestComponentContextForProcess::InitialState::kCloneAll}; }; // A basic integration test ensuring a basic cast request launches the right @@ -431,28 +507,8 @@ app_config_manager_.AddApp(kTestAppId, app_url); CreateComponentContextAndStartComponent(); - fuchsia::web::NavigationControllerPtr nav_controller; - cast_component_->frame()->GetNavigationController( - nav_controller.NewRequest()); - // Ensure the NavigationState has the expected URL. - { - base::RunLoop run_loop; - cr_fuchsia::ResultReceiver<fuchsia::web::NavigationState> nav_entry( - run_loop.QuitClosure()); - nav_controller->GetVisibleEntry( - cr_fuchsia::CallbackToFitFunction(nav_entry.GetReceiveCallback())); - run_loop.Run(); - ASSERT_TRUE(nav_entry->has_url()); - EXPECT_EQ(nav_entry->url(), app_url.spec()); - } - - EXPECT_FALSE(cast_runner_->is_headless()); - - // Verify that the component is torn down when |component_controller| is - // unbound. - component_controller_.Unbind(); - WaitForComponentDestroyed(); + CheckAppUrl(app_url); } // Verify that the Runner can continue to be used even after its Context has @@ -462,67 +518,40 @@ // Execute two iterations of launching the component and verifying that it // reaches the expected URL. for (int i = 0; i < 2; ++i) { + SCOPED_TRACE(testing::Message() << "Test iteration " << i); + const GURL app_url = test_server_.GetURL(kBlankAppUrl); app_config_manager_.AddApp(kTestAppId, app_url); CreateComponentContextAndStartComponent(); - fuchsia::web::NavigationControllerPtr nav_controller; - cast_component_->frame()->GetNavigationController( - nav_controller.NewRequest()); + CheckAppUrl(app_url); - base::RunLoop run_loop; - cr_fuchsia::ResultReceiver<fuchsia::web::NavigationState> nav_entry( - run_loop.QuitClosure()); - nav_controller->GetVisibleEntry( - cr_fuchsia::CallbackToFitFunction(nav_entry.GetReceiveCallback())); - run_loop.Run(); + // Setup a loop to wait for Context destruction after WebEngine is killed + // below. + base::RunLoop context_lost_loop; + cast_runner_->SetOnContextLostCallback(context_lost_loop.QuitClosure()); - ASSERT_TRUE(nav_entry->has_url()); - EXPECT_EQ(nav_entry->url(), app_url.spec()); + web_engine_controller_->Kill(); - // Fake teardown of the Context, forcing the next StartComponent to create - // a new one. - cast_runner_->DisconnectContextForTest(); + // Wait for the component and the Context to be torn down. WaitForComponentDestroyed(); + context_lost_loop.Run(); + + // Start a new WebEngine instance for the next iteration. + if (i < 1) + StartAndPublishWebEngine(); } } TEST_F(CastRunnerIntegrationTest, ApiBindings) { - app_config_manager_.AddApp(kTestAppId, test_server_.GetURL(kEchoAppPath)); - - std::vector<chromium::cast::ApiBinding> binding_list; - chromium::cast::ApiBinding echo_binding; - echo_binding.set_before_load_script(cr_fuchsia::MemBufferFromString( - "window.echo = cast.__platform__.PortConnector.bind('echoService');", - "test")); - binding_list.emplace_back(std::move(echo_binding)); - api_bindings_.set_bindings(std::move(binding_list)); + app_config_manager_.AddApp(kTestAppId, test_server_.GetURL(kBlankAppUrl)); CreateComponentContextAndStartComponent(); - fuchsia::web::MessagePortPtr port = - api_bindings_.RunUntilMessagePortReceived("echoService").Bind(); - - fuchsia::web::WebMessage message; - message.set_data(cr_fuchsia::MemBufferFromString("ping", "ping-msg")); - port->PostMessage(std::move(message), - [](fuchsia::web::MessagePort_PostMessage_Result result) { - EXPECT_TRUE(result.is_response()); - }); - - base::RunLoop response_loop; - cr_fuchsia::ResultReceiver<fuchsia::web::WebMessage> response( - response_loop.QuitClosure()); - port->ReceiveMessage( - cr_fuchsia::CallbackToFitFunction(response.GetReceiveCallback())); - response_loop.Run(); - - std::string response_string; - EXPECT_TRUE( - cr_fuchsia::StringFromMemBuffer(response->data(), &response_string)); - EXPECT_EQ("ack ping", response_string); - EXPECT_TRUE(component_state_->api_bindings_has_clients()); + // Verify that we can communicate with the binding added in + // CastRunnerIntegrationTest(). + EXPECT_EQ(ExecuteJavaScript("1+2+\"\""), "3"); } TEST_F(CastRunnerIntegrationTest, IncorrectCastAppId) { @@ -538,12 +567,9 @@ EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); run_loop.Quit(); }); - cr_fuchsia::ResultReceiver<WebComponent*> web_component( - run_loop.QuitClosure()); - cast_runner_->SetWebComponentCreatedCallbackForTest( - AdaptCallbackForRepeating(web_component.GetReceiveCallback())); run_loop.Run(); - EXPECT_FALSE(web_component.has_value()); + + EXPECT_FALSE(component_state_->api_bindings_has_clients()); } TEST_F(CastRunnerIntegrationTest, UrlRequestRewriteRulesProvider) { @@ -552,20 +578,9 @@ CreateComponentContextAndStartComponent(); - // Bind a TestNavigationListener to the Frame. - cr_fuchsia::TestNavigationListener navigation_listener; - fidl::Binding<fuchsia::web::NavigationEventListener> - navigation_listener_binding(&navigation_listener); - cast_component_->frame()->SetNavigationEventListener( - navigation_listener_binding.NewBinding()); - navigation_listener.RunUntilUrlEquals(echo_app_url); + CheckAppUrl(echo_app_url); - // Check the header was properly set. - base::Optional<base::Value> result = cr_fuchsia::ExecuteJavaScript( - cast_component_->frame(), "document.body.innerText"); - ASSERT_TRUE(result); - ASSERT_TRUE(result->is_string()); - EXPECT_EQ(result->GetString(), "Value"); + EXPECT_EQ(ExecuteJavaScript("document.body.innerText"), "TestHeaderValue"); } TEST_F(CastRunnerIntegrationTest, ApplicationControllerBound) { @@ -589,25 +604,9 @@ CreateComponentContextAndStartComponent(); - // Get the remote debugging port from the Context. - uint16_t remote_debugging_port = 0; - { - base::RunLoop run_loop; - cr_fuchsia::ResultReceiver< - fuchsia::web::Context_GetRemoteDebuggingPort_Result> - port_receiver(run_loop.QuitClosure()); - cast_runner_->GetContext()->GetRemoteDebuggingPort( - cr_fuchsia::CallbackToFitFunction(port_receiver.GetReceiveCallback())); - run_loop.Run(); - - ASSERT_TRUE(port_receiver->is_response()); - remote_debugging_port = port_receiver->response().port; - ASSERT_TRUE(remote_debugging_port != 0); - } - // Connect to the debug service and ensure we get the proper response. base::Value devtools_list = - cr_fuchsia::GetDevToolsListFromPort(remote_debugging_port); + cr_fuchsia::GetDevToolsListFromPort(CastRunner::kRemoteDebuggingPort); ASSERT_TRUE(devtools_list.is_list()); EXPECT_EQ(devtools_list.GetList().size(), 1u); @@ -617,23 +616,11 @@ } TEST_F(CastRunnerIntegrationTest, IsolatedContext) { - const GURL kContentDirectoryUrl("fuchsia-dir://testdata/echo.html"); - - EXPECT_EQ(cast_runner_->GetChildCastRunnerCountForTest(), 0u); + const GURL kContentDirectoryUrl("fuchsia-dir://testdata/empty.html"); RegisterAppWithTestData(kContentDirectoryUrl); - CreateComponentContextAndStartComponent(); - EXPECT_EQ(cast_runner_->GetChildCastRunnerCountForTest(), 1u); - - WaitUrlAndTitle(kContentDirectoryUrl, "echo"); - - // Verify that the component is torn down when |component_controller| is - // unbound. - component_controller_.Unbind(); - WaitForComponentDestroyed(); - - EXPECT_EQ(cast_runner_->GetChildCastRunnerCountForTest(), 0u); + CheckAppUrl(kContentDirectoryUrl); } // Test the lack of CastAgent service does not cause a CastRunner crash. @@ -655,9 +642,6 @@ app_config_manager_.AddApp(kTestAppId, test_server_.GetURL(kEchoHeaderPath)); CreateComponentContextAndStartComponent(); - fuchsia::web::NavigationControllerPtr nav_controller; - cast_component_->frame()->GetNavigationController( - nav_controller.NewRequest()); base::RunLoop run_loop; component_controller_.set_error_handler([&run_loop](zx_status_t error) { @@ -684,7 +668,7 @@ // Indicate that this app is to get bindings from a secondary agent. auto app_config = FakeApplicationConfigManager::CreateConfig( - kTestAppId, test_server_.GetURL(kEchoAppPath)); + kTestAppId, test_server_.GetURL(kBlankAppUrl)); app_config.set_agent_url(kDummyAgentUrl); app_config_manager_.AddAppConfig(std::move(app_config)); @@ -713,6 +697,7 @@ })); StartCastComponent(component_url); + WaitComponentState(); base::RunLoop().RunUntilIdle(); @@ -720,6 +705,9 @@ EXPECT_FALSE(component_state_->api_bindings_has_clients()); // Validate that the correct rewrite rules were requested. EXPECT_FALSE(component_state_->url_request_rules_provider_has_clients()); + + // Shutdown component before destroying dummy_agent_api_bindings. + ShutdownComponent(); } // Test that when RewriteRules are not provided, a WebComponent is still @@ -727,10 +715,9 @@ // or RewriteRules. TEST_F(CastRunnerIntegrationTest, ApplicationConfigAgentUrlRewriteOptional) { TestApiBindings dummy_agent_api_bindings; - // Indicate that this app is to get bindings from a secondary agent. auto app_config = FakeApplicationConfigManager::CreateConfig( - kTestAppId, test_server_.GetURL(kEchoAppPath)); + kTestAppId, test_server_.GetURL(kBlankAppUrl)); app_config.set_agent_url(kDummyAgentUrl); app_config_manager_.AddAppConfig(std::move(app_config)); @@ -759,7 +746,7 @@ })); StartCastComponent(component_url); - WaitComponentCreated(); + WaitComponentState(); base::RunLoop().RunUntilIdle(); @@ -767,10 +754,13 @@ EXPECT_FALSE(component_state_->api_bindings_has_clients()); // Validate that the primary agent didn't provide its RewriteRules. EXPECT_FALSE(component_state_->url_request_rules_provider_has_clients()); + + // Shutdown component before destroying dummy_agent_api_bindings. + ShutdownComponent(); } -TEST_F(CastRunnerIntegrationTest, MicRedirect) { - GURL app_url = test_server_.GetURL("/mic.html"); +TEST_F(CastRunnerIntegrationTest, MicrophoneRedirect) { + GURL app_url = test_server_.GetURL("/microphone.html"); auto app_config = FakeApplicationConfigManager::CreateConfig(kTestAppId, app_url); @@ -779,82 +769,87 @@ app_config.mutable_permissions()->push_back(std::move(mic_permission)); app_config_manager_.AddAppConfig(std::move(app_config)); - base::RunLoop run_loop; - - init_component_state_callback_ = base::BindOnce( - [](base::OnceClosure quit_closure, FakeComponentState* component_state) { - component_state->outgoing_directory()->AddPublicService( - std::make_unique<vfs::Service>( - [quit_closure = std::move(quit_closure)]( - zx::channel channel, - async_dispatcher_t* dispatcher) mutable { - std::move(quit_closure).Run(); - }), - fuchsia::media::Audio::Name_); - }, - base::Passed(run_loop.QuitClosure())); - CreateComponentContextAndStartComponent(); + // Expect fuchsia.media.Audio connection to be redirected to the agent. + base::RunLoop run_loop; + component_state_->outgoing_directory()->AddPublicService( + std::make_unique<vfs::Service>( + [quit_closure = run_loop.QuitClosure()]( + zx::channel channel, async_dispatcher_t* dispatcher) mutable { + std::move(quit_closure).Run(); + }), + fuchsia::media::Audio::Name_); + + ExecuteJavaScript("connectMicrophone();"); + + // Will quit once AudioCapturer is connected. run_loop.Run(); } class HeadlessCastRunnerIntegrationTest : public CastRunnerIntegrationTest { public: HeadlessCastRunnerIntegrationTest() - : CastRunnerIntegrationTest(fuchsia::web::ContextFeatureFlags::HEADLESS | - fuchsia::web::ContextFeatureFlags::NETWORK) {} + : CastRunnerIntegrationTest(/*headless=*/true) {} }; // A basic integration test ensuring a basic cast request launches the right // URL in the Chromium service. TEST_F(HeadlessCastRunnerIntegrationTest, Headless) { - ASSERT_TRUE(cast_runner_->is_headless()); - const char kAnimationPath[] = "/css_animation.html"; const GURL animation_url = test_server_.GetURL(kAnimationPath); app_config_manager_.AddApp(kTestAppId, animation_url); CreateComponentContextAndStartComponent(); auto tokens = scenic::ViewTokenPair::New(); - cast_component_->CreateView(std::move(tokens.view_holder_token.value), {}, - {}); - WaitUrlAndTitle(animation_url, "animation finished"); + // Create a view. + auto view_provider = + component_services_client_->Connect<fuchsia::ui::app::ViewProvider>(); + view_provider->CreateView(std::move(tokens.view_holder_token.value), {}, {}); - // Verify that dropping the "view" EventPair is handled by the CastComponent. - { - base::RunLoop run_loop; - cast_component_->set_on_headless_disconnect_for_test( - run_loop.QuitClosure()); - tokens.view_token.value.reset(); - run_loop.Run(); - } + api_bindings_.RunUntilMessagePortReceived("animation_finished"); - component_controller_.Unbind(); - base::RunLoop().RunUntilIdle(); + // Verify that dropped "view" EventPair is handled properly. + tokens.view_token.value.reset(); + api_bindings_.RunUntilMessagePortReceived("view_hidden"); } // Isolated *and* headless? Doesn't sound like much fun! TEST_F(HeadlessCastRunnerIntegrationTest, IsolatedAndHeadless) { - ASSERT_TRUE(cast_runner_->is_headless()); - - const GURL kContentDirectoryUrl("fuchsia-dir://testdata/echo.html"); - - EXPECT_EQ(cast_runner_->GetChildCastRunnerCountForTest(), 0u); + const GURL kContentDirectoryUrl("fuchsia-dir://testdata/empty.html"); RegisterAppWithTestData(kContentDirectoryUrl); - CreateComponentContextAndStartComponent(); - EXPECT_TRUE(cast_component_->runner()->is_headless()); - EXPECT_EQ(cast_runner_->GetChildCastRunnerCountForTest(), 1u); + CheckAppUrl(kContentDirectoryUrl); +} - WaitUrlAndTitle(kContentDirectoryUrl, "echo"); +// Verifies that the Context can establish a connection to the Agent's +// MetricsRecorder service. +TEST_F(CastRunnerIntegrationTest, LegacyMetricsRedirect) { + GURL app_url = test_server_.GetURL(kBlankAppUrl); + app_config_manager_.AddApp(kTestAppId, app_url); - // Verify that the component is torn down when |component_controller| is - // unbound. - component_controller_.Unbind(); - WaitForComponentDestroyed(); + auto component_url = base::StringPrintf("cast:%s", kTestAppId); + CreateComponentContext(component_url); + EXPECT_NE(component_context_, nullptr); - EXPECT_EQ(cast_runner_->GetChildCastRunnerCountForTest(), 0u); + StartCastComponent(component_url); + + // Wait until we see the CastRunner connect to the LegacyMetrics service. + base::RunLoop run_loop; + component_state_created_callback_ = base::BindOnce( + [](FakeComponentState** component_state, + base::RepeatingClosure quit_closure) { + (*component_state) + ->outgoing_directory() + ->AddPublicService( + std::make_unique<vfs::Service>( + [quit_closure](zx::channel, async_dispatcher_t*) { + quit_closure.Run(); + }), + fuchsia::legacymetrics::MetricsRecorder::Name_); + }, + base::Unretained(&component_state_), run_loop.QuitClosure()); + run_loop.Run(); }
diff --git a/fuchsia/runners/cast/main.cc b/fuchsia/runners/cast/main.cc index a60f453..a0d6b32f 100644 --- a/fuchsia/runners/cast/main.cc +++ b/fuchsia/runners/cast/main.cc
@@ -38,7 +38,8 @@ fuchsia::web::ContextFeatureFlags features = fuchsia::web::ContextFeatureFlags::NETWORK | fuchsia::web::ContextFeatureFlags::AUDIO | - fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM; + fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM | + fuchsia::web::ContextFeatureFlags::LEGACYMETRICS; if (IsHeadless()) { LOG(WARNING) << "Running in headless mode."; @@ -52,10 +53,6 @@ fuchsia::web::CreateContextParams create_context_params; create_context_params.set_features(features); - create_context_params.set_service_directory(base::fuchsia::OpenDirectory( - base::FilePath(base::fuchsia::kServiceDirectoryPath))); - CHECK(create_context_params.service_directory()); - const char kCastPlayreadyKeySystem[] = "com.chromecast.playready"; create_context_params.set_playready_key_system(kCastPlayreadyKeySystem); @@ -63,8 +60,8 @@ create_context_params.set_user_agent_product("CrKey"); create_context_params.set_user_agent_version("1.43"); - const uint16_t kRemoteDebuggingPort = 9222; - create_context_params.set_remote_debugging_port(kRemoteDebuggingPort); + create_context_params.set_remote_debugging_port( + CastRunner::kRemoteDebuggingPort); // TODO(crbug.com/1023514): Remove this switch when it is no longer // necessary. @@ -90,8 +87,8 @@ WebContentRunner::GetContextParamsCallback get_context_params_callback = base::BindRepeating(&CreateMainContextParams); - CastRunner runner( - std::move(get_context_params_callback), IsHeadless(), + CastRunner runner(std::move(get_context_params_callback), IsHeadless()); + runner.PublishRunnerService( base::fuchsia::ComponentContextForCurrentProcess()->outgoing().get()); base::fuchsia::ComponentContextForCurrentProcess()
diff --git a/fuchsia/runners/cast/test_api_bindings.cc b/fuchsia/runners/cast/test_api_bindings.cc index ef99298..9a67165 100644 --- a/fuchsia/runners/cast/test_api_bindings.cc +++ b/fuchsia/runners/cast/test_api_bindings.cc
@@ -4,6 +4,7 @@ #include "fuchsia/runners/cast/test_api_bindings.h" +#include "base/fuchsia/fuchsia_logging.h" #include "base/run_loop.h" TestApiBindings::TestApiBindings() = default; @@ -25,7 +26,14 @@ } void TestApiBindings::GetAll(GetAllCallback callback) { - callback(std::move(bindings_)); + std::vector<chromium::cast::ApiBinding> bindings_clone; + for (auto& binding : bindings_) { + chromium::cast::ApiBinding binding_clone; + zx_status_t status = binding.Clone(&binding_clone); + ZX_CHECK(status == ZX_OK, status); + bindings_clone.push_back(std::move(binding_clone)); + } + callback(std::move(bindings_clone)); } void TestApiBindings::Connect(
diff --git a/fuchsia/runners/cast/testdata/css_animation.html b/fuchsia/runners/cast/testdata/css_animation.html index a24e50df..53358fd 100644 --- a/fuchsia/runners/cast/testdata/css_animation.html +++ b/fuchsia/runners/cast/testdata/css_animation.html
@@ -31,14 +31,14 @@ isStarted = true; }); animated.addEventListener('animationend', function() { - document.title = 'animation finished'; - }); + cast.__platform__.PortConnector.bind('animation_finished'); - // Indicates that no animation has run within a second of document load. - setTimeout(function() { - if (!isStarted) - document.title = 'animation never started'; - }, 1000); + document.addEventListener("visibilitychange", ()=>{ + if (document.hidden) { + cast.__platform__.PortConnector.bind('view_hidden'); + } + }, false); + }); </script> </body> </html>
diff --git a/fuchsia/runners/cast/testdata/empty.html b/fuchsia/runners/cast/testdata/empty.html new file mode 100644 index 0000000..18ecdcb --- /dev/null +++ b/fuchsia/runners/cast/testdata/empty.html
@@ -0,0 +1 @@ +<html></html>
diff --git a/fuchsia/runners/cast/testdata/mic.html b/fuchsia/runners/cast/testdata/microphone.html similarity index 81% rename from fuchsia/runners/cast/testdata/mic.html rename to fuchsia/runners/cast/testdata/microphone.html index 742b31b..0e142dc7 100644 --- a/fuchsia/runners/cast/testdata/mic.html +++ b/fuchsia/runners/cast/testdata/microphone.html
@@ -1,4 +1,6 @@ <script> +function connectMicrophone() { navigator.mediaDevices.getUserMedia({ audio: true, video: false }) .then((stream) => { document.title = 'done'; }); +} </script> \ No newline at end of file
diff --git a/fuchsia/runners/common/web_content_runner.cc b/fuchsia/runners/common/web_content_runner.cc index 357ddc7..359e127 100644 --- a/fuchsia/runners/common/web_content_runner.cc +++ b/fuchsia/runners/common/web_content_runner.cc
@@ -22,35 +22,44 @@ #include "fuchsia/runners/common/web_component.h" #include "url/gurl.h" -WebContentRunner::WebContentRunner( - GetContextParamsCallback get_context_params_callback, - sys::OutgoingDirectory* outgoing_directory) - : get_context_params_callback_(std::move(get_context_params_callback)) { - service_binding_.emplace(outgoing_directory, this); -} +namespace { -WebContentRunner::WebContentRunner(fuchsia::web::ContextPtr context) - : context_(std::move(context)) {} - -WebContentRunner::~WebContentRunner() = default; - -fuchsia::web::ContextPtr WebContentRunner::CreateWebContext( +fuchsia::web::ContextPtr CreateWebContext( fuchsia::web::CreateContextParams context_params) { + auto context_provider = base::fuchsia::ComponentContextForCurrentProcess() + ->svc() + ->Connect<fuchsia::web::ContextProvider>(); fuchsia::web::ContextPtr web_context; - GetContextProvider()->Create(std::move(context_params), - web_context.NewRequest()); - web_context.set_error_handler([](zx_status_t status) { - // If the browser instance died, then exit everything and do not attempt to - // recover. appmgr will relaunch the runner when it is needed again. - ZX_LOG(ERROR, status) << "Connection to Context lost."; - }); + context_provider->Create(std::move(context_params), web_context.NewRequest()); return web_context; } +} // namespace + +WebContentRunner::WebContentRunner( + GetContextParamsCallback get_context_params_callback) + : get_context_params_callback_(std::move(get_context_params_callback)) {} + +WebContentRunner::~WebContentRunner() = default; + +void WebContentRunner::PublishRunnerService( + sys::OutgoingDirectory* outgoing_directory) { + service_binding_.emplace(outgoing_directory, this); +} + fuchsia::web::Context* WebContentRunner::GetContext() { - if (!context_) + if (!context_) { context_ = CreateWebContext(get_context_params_callback_.Run()); + context_.set_error_handler([this](zx_status_t status) { + // If the browser instance died, then exit everything and do not attempt + // to recover. appmgr will relaunch the runner when it is needed again. + ZX_LOG(ERROR, status) << "Connection to Context lost."; + if (on_context_lost_callback_) { + std::move(on_context_lost_callback_).Run(); + } + }); + } return context_.get(); } @@ -77,10 +86,11 @@ RegisterComponent(std::move(component)); } -void WebContentRunner::SetWebComponentCreatedCallbackForTest( - base::RepeatingCallback<void(WebComponent*)> callback) { - DCHECK(components_.empty()); - web_component_created_callback_for_test_ = std::move(callback); +WebComponent* WebContentRunner::GetAnyComponent() { + if (components_.empty()) + return nullptr; + + return components_.begin()->get(); } void WebContentRunner::DestroyComponent(WebComponent* component) { @@ -89,27 +99,9 @@ void WebContentRunner::RegisterComponent( std::unique_ptr<WebComponent> component) { - if (web_component_created_callback_for_test_) - web_component_created_callback_for_test_.Run(component.get()); - components_.insert(std::move(component)); } -void WebContentRunner::SetContextProviderForTest( - fuchsia::web::ContextProviderPtr context_provider) { - DCHECK(context_provider); - context_provider_ = std::move(context_provider); -} - -void WebContentRunner::DisconnectContextForTest() { - context_.Unbind(); -} - -fuchsia::web::ContextProvider* WebContentRunner::GetContextProvider() { - if (!context_provider_) { - context_provider_ = base::fuchsia::ComponentContextForCurrentProcess() - ->svc() - ->Connect<fuchsia::web::ContextProvider>(); - } - return context_provider_.get(); +void WebContentRunner::SetOnContextLostCallback(base::OnceClosure callback) { + on_context_lost_callback_ = std::move(callback); }
diff --git a/fuchsia/runners/common/web_content_runner.h b/fuchsia/runners/common/web_content_runner.h index 1d1d604..df432151 100644 --- a/fuchsia/runners/common/web_content_runner.h +++ b/fuchsia/runners/common/web_content_runner.h
@@ -29,22 +29,13 @@ // specified OutgoingDirectory. // |get_context_params_callback|: Returns parameters for the Runner's // web.Context. - // |outgoing_directory|: The directory that the Runner's services will be - // published to. - WebContentRunner(GetContextParamsCallback get_context_params_callback, - sys::OutgoingDirectory* outgoing_directory); - - // Creates a Runner which launches components using the specified |context|. - // The caller may publish the Runner, or call StartComponent() manually to - // create new components with it. - explicit WebContentRunner(fuchsia::web::ContextPtr context); + explicit WebContentRunner( + GetContextParamsCallback get_context_params_callback); ~WebContentRunner() override; - // TODO(crbug.com/1046615): Make this static when the injected ContextProvider - // goes away. - fuchsia::web::ContextPtr CreateWebContext( - fuchsia::web::CreateContextParams context_params); + // Publishes the fuchsia.sys.Runner service to |outgoing_directory|. + void PublishRunnerService(sys::OutgoingDirectory* outgoing_directory); // Gets a pointer to this runner's Context, creating one if needed. fuchsia::web::Context* GetContext(); @@ -59,37 +50,24 @@ fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller_request) override; - // Used by tests to asynchronously access the first WebComponent. - void SetWebComponentCreatedCallbackForTest( - base::RepeatingCallback<void(WebComponent*)> callback); - // Registers a WebComponent, or specialization, with this Runner. void RegisterComponent(std::unique_ptr<WebComponent> component); - // Overrides the environment's the ContextProvider to use. - // TODO(crbug.com/1046615): Use test manifests for package specification. - void SetContextProviderForTest( - fuchsia::web::ContextProviderPtr context_provider); - - // Disconnects the Context used by this Runner. - void DisconnectContextForTest(); + // Sets a callback that's called when the context is lost. + void SetOnContextLostCallback(base::OnceClosure callback); protected: - base::RepeatingCallback<void(WebComponent*)> - web_component_created_callback_for_test() const { - return web_component_created_callback_for_test_; - } + // Returns a pointer to any currently running component, or nullptr if no + // components are currently running. + WebComponent* GetAnyComponent(); private: - fuchsia::web::ContextProvider* GetContextProvider(); - const GetContextParamsCallback get_context_params_callback_; // If set, invoked whenever a WebComponent is created. base::RepeatingCallback<void(WebComponent*)> web_component_created_callback_for_test_; - fuchsia::web::ContextProviderPtr context_provider_; fuchsia::web::ContextPtr context_; std::set<std::unique_ptr<WebComponent>, base::UniquePtrComparator> components_; @@ -99,6 +77,8 @@ base::Optional<base::fuchsia::ScopedServiceBinding<fuchsia::sys::Runner>> service_binding_; + base::OnceClosure on_context_lost_callback_; + DISALLOW_COPY_AND_ASSIGN(WebContentRunner); };
diff --git a/fuchsia/runners/web/main.cc b/fuchsia/runners/web/main.cc index 9ae6248..3eaa55d 100644 --- a/fuchsia/runners/web/main.cc +++ b/fuchsia/runners/web/main.cc
@@ -57,8 +57,8 @@ WebContentRunner::GetContextParamsCallback get_context_params_callback = base::BindRepeating(&GetContextParams); - WebContentRunner runner( - std::move(get_context_params_callback), + WebContentRunner runner(std::move(get_context_params_callback)); + runner.PublishRunnerService( base::fuchsia::ComponentContextForCurrentProcess()->outgoing().get()); base::fuchsia::ComponentContextForCurrentProcess()
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.cc b/gpu/ipc/service/gpu_watchdog_thread_v2.cc index 6dcf2ded..0cb1b4b 100644 --- a/gpu/ipc/service/gpu_watchdog_thread_v2.cc +++ b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
@@ -405,11 +405,11 @@ bool GpuWatchdogThreadImplV2::IsArmed() { // It's an odd number. - return base::subtle::Release_Load(&arm_disarm_counter_) & 1; + return base::subtle::NoBarrier_Load(&arm_disarm_counter_) & 1; } base::subtle::Atomic32 GpuWatchdogThreadImplV2::ReadArmDisarmCounter() { - return base::subtle::Release_Load(&arm_disarm_counter_); + return base::subtle::NoBarrier_Load(&arm_disarm_counter_); } // Running on the watchdog thread.
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star index 9b059a9..050cfd6 100644 --- a/infra/config/buckets/ci.star +++ b/infra/config/buckets/ci.star
@@ -174,6 +174,38 @@ ) ci.console_view( + name ='chromium.fuzz', + ordering = { + None: [ + 'afl', + 'win asan', + 'mac asan', + 'cros asan', + 'linux asan', + 'libfuzz', + 'linux msan', + 'linux tsan', + ], + '*config*': ci.ordering(short_names=['dbg', 'rel']), + 'win asan': '*config*', + 'mac asan': '*config*', + 'linux asan': '*config*', + 'linux asan|x64 v8-ARM': '*config*', + 'libfuzz': ci.ordering(short_names=[ + 'chromeos-asan', + 'linux32', + 'linux32-dbg', + 'linux', + 'linux-dbg', + 'linux-msan', + 'linux-ubsan', + 'mac-asan', + 'win-asan', + ]), + }, +) + +ci.console_view( name = 'chromium.gpu', ordering = { None: ['Windows', 'Mac', 'Linux'], @@ -181,6 +213,37 @@ ) ci.console_view( + name = 'chromium.gpu.fyi', + ordering = { + None: ['Windows', 'Mac', 'Linux'], + '*builder*': ['Builder'], + '*type*': ci.ordering(short_names=['rel', 'dbg', 'exp']), + '*cpu*': ci.ordering(short_names=['x86']), + 'Windows': '*builder*', + 'Windows|Builder': ['Release', 'dEQP', 'dx12vk', 'Debug'], + 'Windows|Builder|Release': '*cpu*', + 'Windows|Builder|dEQP': '*cpu*', + 'Windows|Builder|dx12vk': '*type*', + 'Windows|Builder|Debug': '*cpu*', + 'Windows|10|x64|Intel': '*type*', + 'Windows|10|x64|Nvidia': '*type*', + 'Windows|10|x86|Nvidia': '*type*', + 'Windows|7|x64|Nvidia': '*type*', + 'Mac': '*builder*', + 'Mac|Builder': '*type*', + 'Mac|AMD|Retina': '*type*', + 'Mac|Intel': '*type*', + 'Mac|Nvidia': '*type*', + 'Linux': '*builder*', + 'Linux|Builder': '*type*', + 'Linux|Intel': '*type*', + 'Linux|Nvidia': '*type*', + 'Android': ['L32', 'M64', 'N64', 'P32', 'vk', 'dqp', 'skgl', 'skv'], + 'Android|M64': ['QCOM'], + }, +) + +ci.console_view( name = 'chromium.linux', ordering = { None: ['release', 'debug'], @@ -211,6 +274,25 @@ ) ci.console_view( + name = 'chromium.swangle', + ordering = { + None: ['DEPS', 'ToT ANGLE', 'ToT SwiftShader'], + '*os*': ['Windows', 'Mac'], + '*cpu*': ci.ordering(short_names=['x86', 'x64']), + 'DEPS': '*os*', + 'DEPS|Windows': '*cpu*', + 'DEPS|Linux': '*cpu*', + 'ToT ANGLE': '*os*', + 'ToT ANGLE|Windows': '*cpu*', + 'ToT ANGLE|Linux': '*cpu*', + 'ToT SwiftShader': '*os*', + 'ToT SwiftShader|Windows': '*cpu*', + 'ToT SwiftShader|Linux': '*cpu*', + 'Chromium': '*os*', + }, +) + +ci.console_view( name = 'chromium.win', ordering = { None: ['release', 'debug'], @@ -219,6 +301,19 @@ }, ) +# The main console includes some entries for builders from the chrome project +[luci.console_view_entry( + builder = 'chrome:ci/{}'.format(name), + console_view = 'main', + category = 'chrome', + short_name = short_name, +) for name, short_name in ( + ('linux-chromeos-chrome', 'cro'), + ('linux-chrome', 'lnx'), + ('mac-chrome', 'mac'), + ('win-chrome', 'win'), +)] + ci.defaults.add_to_console_view.set(True) ci.defaults.bucket.set('ci') @@ -341,6 +436,7 @@ category = 'tester|webview', short_name = 'L', ), + main_console_view = 'main', triggered_by = ['ci/Android arm Builder (dbg)'], ) @@ -370,6 +466,7 @@ category = 'tester|phone', short_name = 'K', ), + main_console_view = 'main', triggered_by = ['ci/Android arm Builder (dbg)'], ) @@ -382,6 +479,7 @@ # We have limited tablet capacity and thus limited ability to run # tests in parallel, hence the high timeout. execution_timeout = 20 * time.hour, + main_console_view = 'main', triggered_by = ['ci/Android arm Builder (dbg)'], ) @@ -394,6 +492,7 @@ # We have limited phone capacity and thus limited ability to run # tests in parallel, hence the high timeout. execution_timeout = 6 * time.hour, + main_console_view = 'main', triggered_by = ['ci/Android arm Builder (dbg)'], ) @@ -406,6 +505,7 @@ # We have limited tablet capacity and thus limited ability to run # tests in parallel, hence the high timeout. execution_timeout = 20 * time.hour, + main_console_view = 'main', triggered_by = ['ci/Android arm Builder (dbg)'], ) @@ -418,6 +518,7 @@ # We have limited tablet capacity and thus limited ability to run # tests in parallel, hence the high timeout. execution_timeout = 12 * time.hour, + main_console_view = 'main', triggered_by = ['ci/Android arm Builder (dbg)'], ) @@ -593,6 +694,7 @@ short_name = 'dbg', ), cores = 8, + main_console_view = 'main', ) ci.chromium_builder( @@ -602,6 +704,7 @@ short_name = 'rel', ), cores = 32, + main_console_view = 'main', ) ci.chromium_builder( @@ -612,6 +715,7 @@ ), # Bump to 32 if needed. cores = 8, + main_console_view = 'main', ) ci.chromium_builder( @@ -621,6 +725,7 @@ short_name = 'rel', ), cores = 32, + main_console_view = 'main', ) ci.chromium_builder( @@ -631,6 +736,7 @@ ), # Bump to 8 cores if needed. cores = 4, + main_console_view = 'main', os = os.MAC_DEFAULT, ) @@ -640,6 +746,7 @@ category = 'mac', short_name = 'rel', ), + main_console_view = 'main', os = os.MAC_DEFAULT, ) @@ -650,6 +757,7 @@ short_name = '64', ), cores = 32, + main_console_view = 'main', os = os.WINDOWS_DEFAULT, ) @@ -660,6 +768,7 @@ short_name = '64', ), cores = 32, + main_console_view = 'main', os = os.WINDOWS_DEFAULT, ) @@ -670,6 +779,7 @@ short_name = '32', ), cores = 32, + main_console_view = 'main', os = os.WINDOWS_DEFAULT, ) @@ -680,6 +790,7 @@ short_name = '32', ), cores = 32, + main_console_view = 'main', os = os.WINDOWS_DEFAULT, ) @@ -1155,6 +1266,10 @@ ci.fuzz_builder( name = 'ASAN Debug', + console_view_entry = ci.console_view_entry( + category = 'linux asan', + short_name = 'dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1162,6 +1277,10 @@ ci.fuzz_builder( name = 'ASan Debug (32-bit x86 with V8-ARM)', + console_view_entry = ci.console_view_entry( + category = 'linux asan|x64 v8-ARM', + short_name = 'dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1169,6 +1288,10 @@ ci.fuzz_builder( name = 'ASAN Release', + console_view_entry = ci.console_view_entry( + category = 'linux asan', + short_name = 'rel', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), @@ -1176,6 +1299,10 @@ ci.fuzz_builder( name = 'ASan Release (32-bit x86 with V8-ARM)', + console_view_entry = ci.console_view_entry( + category = 'linux asan|x64 v8-ARM', + short_name = 'rel', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1183,6 +1310,10 @@ ci.fuzz_builder( name = 'ASAN Release Media', + console_view_entry = ci.console_view_entry( + category = 'linux asan', + short_name = 'med', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1190,6 +1321,10 @@ ci.fuzz_builder( name = 'Afl Upload Linux ASan', + console_view_entry = ci.console_view_entry( + category = 'afl', + short_name = 'afl', + ), executable = 'recipe:chromium_afl', triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, @@ -1198,6 +1333,10 @@ ci.fuzz_builder( name = 'ASan Release Media (32-bit x86 with V8-ARM)', + console_view_entry = ci.console_view_entry( + category = 'linux asan|x64 v8-ARM', + short_name = 'med', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1205,6 +1344,9 @@ ci.fuzz_builder( name = 'ChromiumOS ASAN Release', + console_view_entry = ci.console_view_entry( + category = 'cros asan', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 6, ), @@ -1212,6 +1354,10 @@ ci.fuzz_builder( name = 'MSAN Release (chained origins)', + console_view_entry = ci.console_view_entry( + category = 'linux msan', + short_name = 'org', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1219,6 +1365,10 @@ ci.fuzz_builder( name = 'MSAN Release (no origins)', + console_view_entry = ci.console_view_entry( + category = 'linux msan', + short_name = 'rel', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1227,6 +1377,10 @@ ci.fuzz_builder( name = 'Mac ASAN Release', builderless = False, + console_view_entry = ci.console_view_entry( + category = 'mac asan', + short_name = 'rel', + ), cores = 4, os = os.MAC_DEFAULT, triggering_policy = scheduler.greedy_batching( @@ -1237,6 +1391,10 @@ ci.fuzz_builder( name = 'Mac ASAN Release Media', builderless = False, + console_view_entry = ci.console_view_entry( + category = 'mac asan', + short_name = 'med', + ), cores = 4, os = os.MAC_DEFAULT, triggering_policy = scheduler.greedy_batching( @@ -1246,6 +1404,10 @@ ci.fuzz_builder( name = 'TSAN Debug', + console_view_entry = ci.console_view_entry( + category = 'linux tsan', + short_name = 'dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1253,6 +1415,10 @@ ci.fuzz_builder( name = 'TSAN Release', + console_view_entry = ci.console_view_entry( + category = 'linux tsan', + short_name = 'rel', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), @@ -1260,6 +1426,10 @@ ci.fuzz_builder( name = 'UBSan Release', + console_view_entry = ci.console_view_entry( + category = 'linux UBSan', + short_name = 'rel', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1267,6 +1437,10 @@ ci.fuzz_builder( name = 'UBSan vptr Release', + console_view_entry = ci.console_view_entry( + category = 'linux UBSan', + short_name = 'vpt', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -1275,6 +1449,10 @@ ci.fuzz_builder( name = 'Win ASan Release', builderless = False, + console_view_entry = ci.console_view_entry( + category = 'win asan', + short_name = 'rel', + ), os = os.WINDOWS_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 7, @@ -1284,6 +1462,10 @@ ci.fuzz_builder( name = 'Win ASan Release Media', builderless = False, + console_view_entry = ci.console_view_entry( + category = 'win asan', + short_name = 'med', + ), os = os.WINDOWS_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 6, @@ -1293,6 +1475,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Chrome OS ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'chromeos-asan', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), @@ -1300,6 +1486,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'linux', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), @@ -1307,6 +1497,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux ASan Debug', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'linux-dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), @@ -1314,6 +1508,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux MSan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'linux-msan', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), @@ -1323,6 +1521,10 @@ name = 'Libfuzzer Upload Linux UBSan', # Do not use builderless for this (crbug.com/980080). builderless = False, + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'linux-ubsan', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), @@ -1330,6 +1532,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux V8-ARM64 ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'arm64', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -1337,6 +1543,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux V8-ARM64 ASan Debug', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'arm64-dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -1344,6 +1554,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux32 ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'linux32', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), @@ -1351,6 +1565,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux32 ASan Debug', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'linux32-dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), @@ -1358,6 +1576,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux32 V8-ARM ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'arm', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -1365,6 +1587,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Linux32 V8-ARM ASan Debug', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'arm-dbg', + ), triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -1372,6 +1598,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Mac ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'mac-asan', + ), cores = 24, execution_timeout = 4 * time.hour, os = os.MAC_DEFAULT, @@ -1379,6 +1609,10 @@ ci.fuzz_libfuzzer_builder( name = 'Libfuzzer Upload Windows ASan', + console_view_entry = ci.console_view_entry( + category = 'libfuzz', + short_name = 'win-asan', + ), os = os.WINDOWS_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, @@ -1937,150 +2171,286 @@ ci.gpu_fyi_linux_builder( name = 'Android FYI 32 Vk Release (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|vk|Q32', + short_name = 'P2', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI 32 dEQP Vk Release (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|dqp|vk|Q32', + short_name = 'P2', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI 64 Perf (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|Perf|Q64', + short_name = 'P2', + ), cores = 2, triggered_by = ['GPU FYI Perf Android 64 Builder'], ) ci.gpu_fyi_linux_builder( name = 'Android FYI 64 Vk Release (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|vk|Q64', + short_name = 'P2', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI 64 dEQP Vk Release (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|dqp|vk|Q64', + short_name = 'P2', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (NVIDIA Shield TV)', + console_view_entry = ci.console_view_entry( + category = 'Android|N64|NVDA', + short_name = 'STV', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (Nexus 5)', + console_view_entry = ci.console_view_entry( + category = 'Android|L32', + short_name = 'N5', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (Nexus 5X)', + console_view_entry = ci.console_view_entry( + category = 'Android|M64|QCOM', + short_name = 'N5X', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (Nexus 6)', + console_view_entry = ci.console_view_entry( + category = 'Android|L32', + short_name = 'N6', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (Nexus 6P)', + console_view_entry = ci.console_view_entry( + category = 'Android|M64|QCOM', + short_name = 'N6P', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (Nexus 9)', + console_view_entry = ci.console_view_entry( + category = 'Android|M64|NVDA', + short_name = 'N9', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI Release (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|P32|QCOM', + short_name = 'P2', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI SkiaRenderer GL (Nexus 5X)', + console_view_entry = ci.console_view_entry( + category = 'Android|skgl|M64', + short_name = 'N5X', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI SkiaRenderer Vulkan (Pixel 2)', + console_view_entry = ci.console_view_entry( + category = 'Android|skv|P32', + short_name = 'P2', + ), ) ci.gpu_fyi_linux_builder( name = 'Android FYI dEQP Release (Nexus 5X)', + console_view_entry = ci.console_view_entry( + category = 'Android|dqp|M64', + short_name = 'N5X', + ), ) ci.gpu_fyi_linux_builder( name = 'GPU FYI Linux Builder', + console_view_entry = ci.console_view_entry( + category = 'Linux|Builder', + short_name = 'rel', + ), ) ci.gpu_fyi_linux_builder( name = 'GPU FYI Linux Builder (dbg)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Builder', + short_name = 'dbg', + ), ) ci.gpu_fyi_linux_builder( name = 'GPU FYI Linux Ozone Builder', + console_view_entry = ci.console_view_entry( + category = 'Linux|Builder', + short_name = 'ozn', + ), ) ci.gpu_fyi_linux_builder( name = 'GPU FYI Linux dEQP Builder', + console_view_entry = ci.console_view_entry( + category = 'Linux|Builder', + short_name = 'dqp', + ), ) ci.gpu_fyi_linux_builder( name = 'GPU FYI Perf Android 64 Builder', + console_view_entry = ci.console_view_entry( + category = 'Android|Perf|Builder', + short_name = '64', + ), ) ci.gpu_fyi_linux_builder( name = 'Linux FYI GPU TSAN Release', + console_view_entry = ci.console_view_entry( + category = 'Linux', + short_name = 'tsn', + ), ) # Builder + tester. ci.gpu_fyi_linux_builder( name = 'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'skd', + ), ) ci.gpu_fyi_mac_builder( name = 'Mac FYI GPU ASAN Release', + console_view_entry = ci.console_view_entry( + category = 'Mac', + short_name = 'asn', + ), ) ci.gpu_fyi_mac_builder( name = 'GPU FYI Mac Builder', + console_view_entry = ci.console_view_entry( + category = 'Mac|Builder', + short_name = 'rel', + ), ) ci.gpu_fyi_mac_builder( name = 'GPU FYI Mac Builder (dbg)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Builder', + short_name = 'dbg', + ), ) ci.gpu_fyi_mac_builder( name = 'GPU FYI Mac dEQP Builder', + console_view_entry = ci.console_view_entry( + category = 'Mac|Builder', + short_name = 'dqp', + ), ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Debug (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Nvidia', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Linux Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Experimental Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'exp', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Experimental Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Nvidia', + short_name = 'exp', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Ozone (Intel)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'ozn', + ), triggered_by = ['GPU FYI Linux Ozone Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Nvidia', + short_name = 'rel', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Release (AMD R7 240)', + console_view_entry = ci.console_view_entry( + category = 'Linux|AMD', + short_name = 'rel', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'rel', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI Release (Intel UHD 630)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'uhd', + ), # TODO(https://crbug.com/986939): Remove this increased timeout once more # devices are added. execution_timeout = 18 * time.hour, @@ -2089,41 +2459,73 @@ ci.gpu_fyi_thin_tester( name = 'Linux FYI SkiaRenderer Vulkan (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'skv', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI SkiaRenderer Vulkan (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Nvidia', + short_name = 'skv', + ), triggered_by = ['GPU FYI Linux Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI dEQP Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Intel', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Linux dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Linux FYI dEQP Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Linux|Nvidia', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Linux dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Debug (Intel)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Intel', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Mac Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Experimental Release (Intel)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Intel', + short_name = 'exp', + ), triggered_by = ['GPU FYI Mac Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Experimental Retina Release (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Mac|AMD|Retina', + short_name = 'exp', + ), triggered_by = ['GPU FYI Mac Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Experimental Retina Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Nvidia', + short_name = 'exp', + ), # This bot has one machine backing its tests at the moment. # If it gets more, this can be removed. # See crbug.com/853307 for more context. @@ -2133,81 +2535,145 @@ ci.gpu_fyi_thin_tester( name = 'Mac FYI Release (Intel)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Intel', + short_name = 'rel', + ), triggered_by = ['GPU FYI Mac Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Retina Debug (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Mac|AMD|Retina', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Mac Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Retina Debug (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Nvidia', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Mac Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Retina Release (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Mac|AMD|Retina', + short_name = 'rel', + ), triggered_by = ['GPU FYI Mac Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI Retina Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Mac|Nvidia', + short_name = 'rel', + ), triggered_by = ['GPU FYI Mac Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI dEQP Release AMD', + console_view_entry = ci.console_view_entry( + category = 'Mac|AMD', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Mac dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac FYI dEQP Release Intel', + console_view_entry = ci.console_view_entry( + category = 'Mac|Intel', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Mac dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Mac Pro FYI Release (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Mac|AMD|Pro', + short_name = 'rel', + ), triggered_by = ['GPU FYI Mac Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Debug (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Win x64 Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia|dx12vk', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Win x64 DX12 Vulkan Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 DX12 Vulkan Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia|dx12vk', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win x64 DX12 Vulkan Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Exp Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Intel', + short_name = 'exp', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Exp Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'exp', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Release (AMD RX 550)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|AMD', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Intel', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Release (Intel UHD 630)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Intel', + short_name = 'uhd', + ), # TODO(https://crbug.com/986939): Remove this increased timeout once # more devices are added. execution_timeout = 18 * time.hour, @@ -2216,110 +2682,202 @@ ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'gtx', + ), execution_timeout = 18 * time.hour, triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 Release XR Perf (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'xr', + ), triggered_by = ['GPU FYI XR Win x64 Builder'], ) # Builder + tester. ci.gpu_fyi_windows_builder( name = 'Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'skd', + ), ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 SkiaRenderer GL (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'skgl', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 dEQP Release (Intel HD 630)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Intel', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Win x64 dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x64 dEQP Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x64|Nvidia', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Win x64 dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win10 FYI x86 Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|10|x86|Nvidia', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win7 FYI Debug (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Windows|7|x86|AMD', + short_name = 'dbg', + ), triggered_by = ['GPU FYI Win Builder (dbg)'], ) ci.gpu_fyi_thin_tester( name = 'Win7 FYI Release (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Windows|7|x86|AMD', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win7 FYI Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|7|x86|Nvidia', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win7 FYI dEQP Release (AMD)', + console_view_entry = ci.console_view_entry( + category = 'Windows|7|x86|AMD', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Win dEQP Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win7 FYI x64 Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|7|x64|Nvidia', + short_name = 'rel', + ), triggered_by = ['GPU FYI Win x64 Builder'], ) ci.gpu_fyi_thin_tester( name = 'Win7 FYI x64 dEQP Release (NVIDIA)', + console_view_entry = ci.console_view_entry( + category = 'Windows|7|x64|Nvidia', + short_name = 'dqp', + ), triggered_by = ['GPU FYI Win x64 dEQP Builder'], ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win Builder', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|Release', + short_name = 'x86', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win Builder (dbg)', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|Debug', + short_name = 'x86', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win dEQP Builder', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|dEQP', + short_name = 'x86', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win x64 Builder', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|Release', + short_name = 'x64', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win x64 Builder (dbg)', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|Debug', + short_name = 'x64', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win x64 dEQP Builder', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|dEQP', + short_name = 'x64', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win x64 DX12 Vulkan Builder', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|dx12vk', + short_name = 'rel', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI Win x64 DX12 Vulkan Builder (dbg)', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|dx12vk', + short_name = 'dbg', + ), ) ci.gpu_fyi_windows_builder( name = 'GPU FYI XR Win x64 Builder', + console_view_entry = ci.console_view_entry( + category = 'Windows|Builder|XR', + short_name = 'x64', + ), ) @@ -2598,64 +3156,124 @@ ci.swangle_linux_builder( name = 'linux-swangle-chromium-x64', + console_view_entry = ci.console_view_entry( + category = 'Chromium|Linux', + short_name = 'x64', + ), ) ci.swangle_linux_builder( name = 'linux-swangle-tot-angle-x64', + console_view_entry = ci.console_view_entry( + category = 'ToT ANGLE|Linux', + short_name = 'x64', + ), ) ci.swangle_linux_builder( name = 'linux-swangle-tot-angle-x86', + console_view_entry = ci.console_view_entry( + category = 'ToT ANGLE|Linux', + short_name = 'x86', + ), ) ci.swangle_linux_builder( name = 'linux-swangle-tot-swiftshader-x64', + console_view_entry = ci.console_view_entry( + category = 'ToT SwiftShader|Linux', + short_name = 'x64', + ), ) ci.swangle_linux_builder( name = 'linux-swangle-tot-swiftshader-x86', + console_view_entry = ci.console_view_entry( + category = 'ToT SwiftShader|Linux', + short_name = 'x86', + ), ) ci.swangle_linux_builder( name = 'linux-swangle-x64', + console_view_entry = ci.console_view_entry( + category = 'DEPS|Linux', + short_name = 'x64', + ), ) ci.swangle_linux_builder( name = 'linux-swangle-x86', + console_view_entry = ci.console_view_entry( + category = 'DEPS|Linux', + short_name = 'x86', + ), ) ci.swangle_mac_builder( name = 'mac-swangle-chromium-x64', + console_view_entry = ci.console_view_entry( + category = 'Chromium|Mac', + short_name = 'x64', + ), ) ci.swangle_windows_builder( name = 'win-swangle-chromium-x86', + console_view_entry = ci.console_view_entry( + category = 'Chromium|Windows', + short_name = 'x86', + ), ) ci.swangle_windows_builder( name = 'win-swangle-tot-angle-x64', + console_view_entry = ci.console_view_entry( + category = 'ToT ANGLE|Windows', + short_name = 'x64', + ), ) ci.swangle_windows_builder( name = 'win-swangle-tot-angle-x86', + console_view_entry = ci.console_view_entry( + category = 'ToT ANGLE|Windows', + short_name = 'x86', + ), ) ci.swangle_windows_builder( name = 'win-swangle-tot-swiftshader-x64', + console_view_entry = ci.console_view_entry( + category = 'ToT SwiftShader|Windows', + short_name = 'x64', + ), ) ci.swangle_windows_builder( name = 'win-swangle-tot-swiftshader-x86', + console_view_entry = ci.console_view_entry( + category = 'ToT SwiftShader|Windows', + short_name = 'x86', + ), ) ci.swangle_windows_builder( name = 'win-swangle-x64', + console_view_entry = ci.console_view_entry( + category = 'DEPS|Windows', + short_name = 'x64', + ), ) ci.swangle_windows_builder( name = 'win-swangle-x86', + console_view_entry = ci.console_view_entry( + category = 'DEPS|Windows', + short_name = 'x86', + ), )
diff --git a/infra/config/consoles/chromium.fuzz.star b/infra/config/consoles/chromium.fuzz.star deleted file mode 100644 index 6b06d8f..0000000 --- a/infra/config/consoles/chromium.fuzz.star +++ /dev/null
@@ -1,161 +0,0 @@ -luci.console_view( - name = 'chromium.fuzz', - header = '//consoles/chromium-header.textpb', - repo = 'https://chromium.googlesource.com/chromium/src', - entries = [ - luci.console_view_entry( - builder = 'ci/Afl Upload Linux ASan', - category = 'afl', - short_name = 'afl', - ), - luci.console_view_entry( - builder = 'ci/Win ASan Release', - category = 'win asan', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win ASan Release Media', - category = 'win asan', - short_name = 'med', - ), - luci.console_view_entry( - builder = 'ci/Mac ASAN Release', - category = 'mac asan', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Mac ASAN Release Media', - category = 'mac asan', - short_name = 'med', - ), - luci.console_view_entry( - builder = 'ci/ChromiumOS ASAN Release', - short_name = 'cro', - ), - luci.console_view_entry( - builder = 'ci/ASAN Debug', - category = 'linux asan', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/ASAN Release', - category = 'linux asan', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/ASAN Release Media', - category = 'linux asan', - short_name = 'med', - ), - luci.console_view_entry( - builder = 'ci/ASan Debug (32-bit x86 with V8-ARM)', - category = 'linux asan|x64 v8-ARM', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/ASan Release (32-bit x86 with V8-ARM)', - category = 'linux asan|x64 v8-ARM', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/ASan Release Media (32-bit x86 with V8-ARM)', - category = 'linux asan|x64 v8-ARM', - short_name = 'med', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Chrome OS ASan', - category = 'libfuzz', - short_name = 'chromeos-asan', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux32 ASan', - category = 'libfuzz', - short_name = 'linux32', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux32 ASan Debug', - category = 'libfuzz', - short_name = 'linux32-dbg', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux ASan', - category = 'libfuzz', - short_name = 'linux', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux ASan Debug', - category = 'libfuzz', - short_name = 'linux-dbg', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux MSan', - category = 'libfuzz', - short_name = 'linux-msan', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux UBSan', - category = 'libfuzz', - short_name = 'linux-ubsan', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Mac ASan', - category = 'libfuzz', - short_name = 'mac-asan', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Windows ASan', - category = 'libfuzz', - short_name = 'win-asan', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux32 V8-ARM ASan', - category = 'libfuzz', - short_name = 'arm', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug', - category = 'libfuzz', - short_name = 'arm-dbg', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux V8-ARM64 ASan', - category = 'libfuzz', - short_name = 'arm64', - ), - luci.console_view_entry( - builder = 'ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug', - category = 'libfuzz', - short_name = 'arm64-dbg', - ), - luci.console_view_entry( - builder = 'ci/MSAN Release (chained origins)', - category = 'linux msan', - short_name = 'org', - ), - luci.console_view_entry( - builder = 'ci/MSAN Release (no origins)', - category = 'linux msan', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/TSAN Debug', - category = 'linux tsan', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/TSAN Release', - category = 'linux tsan', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/UBSan Release', - category = 'linux UBSan', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/UBSan vptr Release', - category = 'linux UBSan', - short_name = 'vpt', - ), - ], -)
diff --git a/infra/config/consoles/chromium.gpu.fyi.star b/infra/config/consoles/chromium.gpu.fyi.star deleted file mode 100644 index 738b019..0000000 --- a/infra/config/consoles/chromium.gpu.fyi.star +++ /dev/null
@@ -1,412 +0,0 @@ -luci.console_view( - name = 'chromium.gpu.fyi', - header = '//consoles/chromium-header.textpb', - repo = 'https://chromium.googlesource.com/chromium/src', - entries = [ - luci.console_view_entry( - builder = 'ci/GPU FYI Win Builder', - category = 'Windows|Builder|Release', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win x64 Builder', - category = 'Windows|Builder|Release', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win dEQP Builder', - category = 'Windows|Builder|dEQP', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win x64 dEQP Builder', - category = 'Windows|Builder|dEQP', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win x64 DX12 Vulkan Builder', - category = 'Windows|Builder|dx12vk', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win x64 DX12 Vulkan Builder (dbg)', - category = 'Windows|Builder|dx12vk', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win Builder (dbg)', - category = 'Windows|Builder|Debug', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Win x64 Builder (dbg)', - category = 'Windows|Builder|Debug', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI XR Win x64 Builder', - category = 'Windows|Builder|XR', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Debug (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)', - category = 'Windows|10|x64|Nvidia|dx12vk', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)', - category = 'Windows|10|x64|Nvidia|dx12vk', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Release (Intel HD 630)', - category = 'Windows|10|x64|Intel', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Release (Intel UHD 630)', - category = 'Windows|10|x64|Intel', - short_name = 'uhd', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Release (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Release XR Perf (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'xr', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'skd', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 dEQP Release (Intel HD 630)', - category = 'Windows|10|x64|Intel', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 dEQP Release (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Exp Release (Intel HD 630)', - category = 'Windows|10|x64|Intel', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Exp Release (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Release (AMD RX 550)', - category = 'Windows|10|x64|AMD', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)', - category = 'Windows|10|x64|Nvidia', - short_name = 'gtx', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x64 SkiaRenderer GL (NVIDIA)', - category = 'Windows|10|x64|Nvidia', - short_name = 'skgl', - ), - luci.console_view_entry( - builder = 'ci/Win10 FYI x86 Release (NVIDIA)', - category = 'Windows|10|x86|Nvidia', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win7 FYI Debug (AMD)', - category = 'Windows|7|x86|AMD', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Win7 FYI dEQP Release (AMD)', - category = 'Windows|7|x86|AMD', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Win7 FYI Release (AMD)', - category = 'Windows|7|x86|AMD', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win7 FYI Release (NVIDIA)', - category = 'Windows|7|x86|Nvidia', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win7 FYI x64 Release (NVIDIA)', - category = 'Windows|7|x64|Nvidia', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Win7 FYI x64 dEQP Release (NVIDIA)', - category = 'Windows|7|x64|Nvidia', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Mac Builder', - category = 'Mac|Builder', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Mac Builder (dbg)', - category = 'Mac|Builder', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Mac dEQP Builder', - category = 'Mac|Builder', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Debug (Intel)', - category = 'Mac|Intel', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Experimental Release (Intel)', - category = 'Mac|Intel', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI dEQP Release Intel', - category = 'Mac|Intel', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Release (Intel)', - category = 'Mac|Intel', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Mac Pro FYI Release (AMD)', - category = 'Mac|AMD|Pro', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI dEQP Release AMD', - category = 'Mac|AMD', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Retina Debug (AMD)', - category = 'Mac|AMD|Retina', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Retina Release (AMD)', - category = 'Mac|AMD|Retina', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Experimental Retina Release (AMD)', - category = 'Mac|AMD|Retina', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Retina Debug (NVIDIA)', - category = 'Mac|Nvidia', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Retina Release (NVIDIA)', - category = 'Mac|Nvidia', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI Experimental Retina Release (NVIDIA)', - category = 'Mac|Nvidia', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Mac FYI GPU ASAN Release', - category = 'Mac', - short_name = 'asn', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Linux Builder', - category = 'Linux|Builder', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Linux Builder (dbg)', - category = 'Linux|Builder', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Linux Ozone Builder', - category = 'Linux|Builder', - short_name = 'ozn', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Linux dEQP Builder', - category = 'Linux|Builder', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Experimental Release (Intel HD 630)', - category = 'Linux|Intel', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Release (Intel HD 630)', - category = 'Linux|Intel', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Release (Intel UHD 630)', - category = 'Linux|Intel', - short_name = 'uhd', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI dEQP Release (Intel HD 630)', - category = 'Linux|Intel', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Ozone (Intel)', - category = 'Linux|Intel', - short_name = 'ozn', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Release (AMD R7 240)', - category = 'Linux', - short_name = 'amd', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Release (NVIDIA)', - category = 'Linux|Nvidia', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Experimental Release (NVIDIA)', - category = 'Linux|Nvidia', - short_name = 'exp', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI Debug (NVIDIA)', - category = 'Linux|Nvidia', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI dEQP Release (NVIDIA)', - category = 'Linux|Nvidia', - short_name = 'dqp', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI SkiaRenderer Dawn Release (Intel HD 630)', - category = 'Linux|Intel', - short_name = 'skd', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI SkiaRenderer Vulkan (Intel HD 630)', - category = 'Linux|Intel', - short_name = 'skv', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI SkiaRenderer Vulkan (NVIDIA)', - category = 'Linux|Nvidia', - short_name = 'skv', - ), - luci.console_view_entry( - builder = 'ci/Linux FYI GPU TSAN Release', - category = 'Linux', - short_name = 'tsn', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (Nexus 5)', - category = 'Android|L32', - short_name = 'N5', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (Nexus 6)', - category = 'Android|L32', - short_name = 'N6', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (Nexus 5X)', - category = 'Android|M64|QCOM', - short_name = 'N5X', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (Nexus 6P)', - category = 'Android|M64|QCOM', - short_name = 'N6P', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (Nexus 9)', - category = 'Android|M64|NVDA', - short_name = 'N9', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (NVIDIA Shield TV)', - category = 'Android|N64|NVDA', - short_name = 'STV', - ), - luci.console_view_entry( - builder = 'ci/Android FYI Release (Pixel 2)', - category = 'Android|P32|QCOM', - short_name = 'P2', - ), - luci.console_view_entry( - builder = 'ci/Android FYI 32 Vk Release (Pixel 2)', - category = 'Android|vk|Q32', - short_name = 'P2', - ), - luci.console_view_entry( - builder = 'ci/Android FYI 64 Vk Release (Pixel 2)', - category = 'Android|vk|Q64', - short_name = 'P2', - ), - luci.console_view_entry( - builder = 'ci/Android FYI dEQP Release (Nexus 5X)', - category = 'Android|dqp|M64', - short_name = 'N5X', - ), - luci.console_view_entry( - builder = 'ci/Android FYI 32 dEQP Vk Release (Pixel 2)', - category = 'Android|dqp|vk|Q32', - short_name = 'P2', - ), - luci.console_view_entry( - builder = 'ci/Android FYI 64 dEQP Vk Release (Pixel 2)', - category = 'Android|dqp|vk|Q64', - short_name = 'P2', - ), - luci.console_view_entry( - builder = 'ci/Android FYI SkiaRenderer GL (Nexus 5X)', - category = 'Android|skgl|M64', - short_name = 'N5X', - ), - luci.console_view_entry( - builder = 'ci/Android FYI SkiaRenderer Vulkan (Pixel 2)', - category = 'Android|skv|P32', - short_name = 'P2', - ), - luci.console_view_entry( - builder = 'ci/GPU FYI Perf Android 64 Builder', - category = 'Android|Perf|Builder', - short_name = '64', - ), - luci.console_view_entry( - builder = 'ci/Android FYI 64 Perf (Pixel 2)', - category = 'Android|Perf|Q64', - short_name = 'P2', - ), - ], -)
diff --git a/infra/config/consoles/chromium.swangle.star b/infra/config/consoles/chromium.swangle.star deleted file mode 100644 index 7ef069b..0000000 --- a/infra/config/consoles/chromium.swangle.star +++ /dev/null
@@ -1,82 +0,0 @@ -luci.console_view( - name = 'chromium.swangle', - header = '//consoles/chromium-header.textpb', - repo = 'https://chromium.googlesource.com/chromium/src', - entries = [ - luci.console_view_entry( - builder = 'ci/win-swangle-x86', - category = 'DEPS|Windows', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/win-swangle-x64', - category = 'DEPS|Windows', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-x86', - category = 'DEPS|Linux', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-x64', - category = 'DEPS|Linux', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/win-swangle-tot-angle-x86', - category = 'ToT ANGLE|Windows', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/win-swangle-tot-angle-x64', - category = 'ToT ANGLE|Windows', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-tot-angle-x86', - category = 'ToT ANGLE|Linux', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-tot-angle-x64', - category = 'ToT ANGLE|Linux', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/win-swangle-tot-swiftshader-x86', - category = 'ToT SwiftShader|Windows', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/win-swangle-tot-swiftshader-x64', - category = 'ToT SwiftShader|Windows', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-tot-swiftshader-x86', - category = 'ToT SwiftShader|Linux', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-tot-swiftshader-x64', - category = 'ToT SwiftShader|Linux', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/win-swangle-chromium-x86', - category = 'Chromium|Windows', - short_name = 'x86', - ), - luci.console_view_entry( - builder = 'ci/mac-swangle-chromium-x64', - category = 'Chromium|Mac', - short_name = 'x64', - ), - luci.console_view_entry( - builder = 'ci/linux-swangle-chromium-x64', - category = 'Chromium|Linux', - short_name = 'x64', - ), - ], -)
diff --git a/infra/config/consoles/main.star b/infra/config/consoles/main.star index 01612b1..5f6500e 100644 --- a/infra/config/consoles/main.star +++ b/infra/config/consoles/main.star
@@ -1,4 +1,3 @@ -exec('//versioned/trunk/consoles/main.star') exec('//versioned/milestones/m80/consoles/main.star') exec('//versioned/milestones/m81/consoles/main.star') exec('//versioned/milestones/m83/consoles/main.star')
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index ee85ecc7..2126f897 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -2666,7 +2666,7 @@ > builders: < name: "buildbucket/luci.chromium.ci/ChromiumOS ASAN Release" - short_name: "cro" + category: "cros asan" > builders: < name: "buildbucket/luci.chromium.ci/ASAN Debug" @@ -6221,18 +6221,8 @@ short_name: "x64" > builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Debug (NVIDIA)" - category: "Windows|10|x64|Nvidia" - short_name: "dbg" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)" - category: "Windows|10|x64|Nvidia|dx12vk" - short_name: "dbg" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)" - category: "Windows|10|x64|Nvidia|dx12vk" + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (AMD RX 550)" + category: "Windows|10|x64|AMD" short_name: "rel" > builders: < @@ -6241,6 +6231,16 @@ short_name: "rel" > builders: < + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (Intel HD 630)" + category: "Windows|10|x64|Intel" + short_name: "exp" + > + builders: < + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 dEQP Release (Intel HD 630)" + category: "Windows|10|x64|Intel" + short_name: "dqp" + > + builders: < name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (Intel UHD 630)" category: "Windows|10|x64|Intel" short_name: "uhd" @@ -6251,29 +6251,9 @@ short_name: "rel" > builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release XR Perf (NVIDIA)" + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Debug (NVIDIA)" category: "Windows|10|x64|Nvidia" - short_name: "xr" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)" - category: "Windows|10|x64|Nvidia" - short_name: "skd" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 dEQP Release (Intel HD 630)" - category: "Windows|10|x64|Intel" - short_name: "dqp" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 dEQP Release (NVIDIA)" - category: "Windows|10|x64|Nvidia" - short_name: "dqp" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (Intel HD 630)" - category: "Windows|10|x64|Intel" - short_name: "exp" + short_name: "dbg" > builders: < name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Exp Release (NVIDIA)" @@ -6281,9 +6261,9 @@ short_name: "exp" > builders: < - name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (AMD RX 550)" - category: "Windows|10|x64|AMD" - short_name: "rel" + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 dEQP Release (NVIDIA)" + category: "Windows|10|x64|Nvidia" + short_name: "dqp" > builders: < name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)" @@ -6291,16 +6271,46 @@ short_name: "gtx" > builders: < + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)" + category: "Windows|10|x64|Nvidia" + short_name: "skd" + > + builders: < name: "buildbucket/luci.chromium.ci/Win10 FYI x64 SkiaRenderer GL (NVIDIA)" category: "Windows|10|x64|Nvidia" short_name: "skgl" > builders: < + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release XR Perf (NVIDIA)" + category: "Windows|10|x64|Nvidia" + short_name: "xr" + > + builders: < + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)" + category: "Windows|10|x64|Nvidia|dx12vk" + short_name: "dbg" + > + builders: < + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)" + category: "Windows|10|x64|Nvidia|dx12vk" + short_name: "rel" + > + builders: < name: "buildbucket/luci.chromium.ci/Win10 FYI x86 Release (NVIDIA)" category: "Windows|10|x86|Nvidia" short_name: "rel" > builders: < + name: "buildbucket/luci.chromium.ci/Win7 FYI x64 Release (NVIDIA)" + category: "Windows|7|x64|Nvidia" + short_name: "rel" + > + builders: < + name: "buildbucket/luci.chromium.ci/Win7 FYI x64 dEQP Release (NVIDIA)" + category: "Windows|7|x64|Nvidia" + short_name: "dqp" + > + builders: < name: "buildbucket/luci.chromium.ci/Win7 FYI Debug (AMD)" category: "Windows|7|x86|AMD" short_name: "dbg" @@ -6321,14 +6331,9 @@ short_name: "rel" > builders: < - name: "buildbucket/luci.chromium.ci/Win7 FYI x64 Release (NVIDIA)" - category: "Windows|7|x64|Nvidia" - short_name: "rel" - > - builders: < - name: "buildbucket/luci.chromium.ci/Win7 FYI x64 dEQP Release (NVIDIA)" - category: "Windows|7|x64|Nvidia" - short_name: "dqp" + name: "buildbucket/luci.chromium.ci/Mac FYI GPU ASAN Release" + category: "Mac" + short_name: "asn" > builders: < name: "buildbucket/luci.chromium.ci/GPU FYI Mac Builder" @@ -6346,6 +6351,36 @@ short_name: "dqp" > builders: < + name: "buildbucket/luci.chromium.ci/Mac FYI dEQP Release AMD" + category: "Mac|AMD" + short_name: "dqp" + > + builders: < + name: "buildbucket/luci.chromium.ci/Mac Pro FYI Release (AMD)" + category: "Mac|AMD|Pro" + short_name: "rel" + > + builders: < + name: "buildbucket/luci.chromium.ci/Mac FYI Retina Release (AMD)" + category: "Mac|AMD|Retina" + short_name: "rel" + > + builders: < + name: "buildbucket/luci.chromium.ci/Mac FYI Retina Debug (AMD)" + category: "Mac|AMD|Retina" + short_name: "dbg" + > + builders: < + name: "buildbucket/luci.chromium.ci/Mac FYI Experimental Retina Release (AMD)" + category: "Mac|AMD|Retina" + short_name: "exp" + > + builders: < + name: "buildbucket/luci.chromium.ci/Mac FYI Release (Intel)" + category: "Mac|Intel" + short_name: "rel" + > + builders: < name: "buildbucket/luci.chromium.ci/Mac FYI Debug (Intel)" category: "Mac|Intel" short_name: "dbg" @@ -6361,54 +6396,24 @@ short_name: "dqp" > builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI Release (Intel)" - category: "Mac|Intel" + name: "buildbucket/luci.chromium.ci/Mac FYI Retina Release (NVIDIA)" + category: "Mac|Nvidia" short_name: "rel" > builders: < - name: "buildbucket/luci.chromium.ci/Mac Pro FYI Release (AMD)" - category: "Mac|AMD|Pro" - short_name: "rel" - > - builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI dEQP Release AMD" - category: "Mac|AMD" - short_name: "dqp" - > - builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI Retina Debug (AMD)" - category: "Mac|AMD|Retina" - short_name: "dbg" - > - builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI Retina Release (AMD)" - category: "Mac|AMD|Retina" - short_name: "rel" - > - builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI Experimental Retina Release (AMD)" - category: "Mac|AMD|Retina" - short_name: "exp" - > - builders: < name: "buildbucket/luci.chromium.ci/Mac FYI Retina Debug (NVIDIA)" category: "Mac|Nvidia" short_name: "dbg" > builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI Retina Release (NVIDIA)" - category: "Mac|Nvidia" - short_name: "rel" - > - builders: < name: "buildbucket/luci.chromium.ci/Mac FYI Experimental Retina Release (NVIDIA)" category: "Mac|Nvidia" short_name: "exp" > builders: < - name: "buildbucket/luci.chromium.ci/Mac FYI GPU ASAN Release" - category: "Mac" - short_name: "asn" + name: "buildbucket/luci.chromium.ci/Linux FYI GPU TSAN Release" + category: "Linux" + short_name: "tsn" > builders: < name: "buildbucket/luci.chromium.ci/GPU FYI Linux Builder" @@ -6421,19 +6426,19 @@ short_name: "dbg" > builders: < - name: "buildbucket/luci.chromium.ci/GPU FYI Linux Ozone Builder" - category: "Linux|Builder" - short_name: "ozn" - > - builders: < name: "buildbucket/luci.chromium.ci/GPU FYI Linux dEQP Builder" category: "Linux|Builder" short_name: "dqp" > builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI Experimental Release (Intel HD 630)" - category: "Linux|Intel" - short_name: "exp" + name: "buildbucket/luci.chromium.ci/GPU FYI Linux Ozone Builder" + category: "Linux|Builder" + short_name: "ozn" + > + builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI Release (AMD R7 240)" + category: "Linux|AMD" + short_name: "rel" > builders: < name: "buildbucket/luci.chromium.ci/Linux FYI Release (Intel HD 630)" @@ -6441,9 +6446,9 @@ short_name: "rel" > builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI Release (Intel UHD 630)" + name: "buildbucket/luci.chromium.ci/Linux FYI Experimental Release (Intel HD 630)" category: "Linux|Intel" - short_name: "uhd" + short_name: "exp" > builders: < name: "buildbucket/luci.chromium.ci/Linux FYI dEQP Release (Intel HD 630)" @@ -6456,31 +6461,6 @@ short_name: "ozn" > builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI Release (AMD R7 240)" - category: "Linux" - short_name: "amd" - > - builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI Release (NVIDIA)" - category: "Linux|Nvidia" - short_name: "rel" - > - builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI Experimental Release (NVIDIA)" - category: "Linux|Nvidia" - short_name: "exp" - > - builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI Debug (NVIDIA)" - category: "Linux|Nvidia" - short_name: "dbg" - > - builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI dEQP Release (NVIDIA)" - category: "Linux|Nvidia" - short_name: "dqp" - > - builders: < name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" category: "Linux|Intel" short_name: "skd" @@ -6491,16 +6471,36 @@ short_name: "skv" > builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI Release (Intel UHD 630)" + category: "Linux|Intel" + short_name: "uhd" + > + builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI Release (NVIDIA)" + category: "Linux|Nvidia" + short_name: "rel" + > + builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI Debug (NVIDIA)" + category: "Linux|Nvidia" + short_name: "dbg" + > + builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI Experimental Release (NVIDIA)" + category: "Linux|Nvidia" + short_name: "exp" + > + builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI dEQP Release (NVIDIA)" + category: "Linux|Nvidia" + short_name: "dqp" + > + builders: < name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Vulkan (NVIDIA)" category: "Linux|Nvidia" short_name: "skv" > builders: < - name: "buildbucket/luci.chromium.ci/Linux FYI GPU TSAN Release" - category: "Linux" - short_name: "tsn" - > - builders: < name: "buildbucket/luci.chromium.ci/Android FYI Release (Nexus 5)" category: "Android|L32" short_name: "N5"
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index 2d2a317e..550ff31 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -20,6 +20,7 @@ add_to_console_view = False, console_view = args.COMPUTE, header = None, + main_console_view = None, repo = None, ) @@ -28,6 +29,10 @@ return graph.key('@chromium', '', 'console_view_ordering', console_name) +def _main_console_view_ordering_graph_key(console_name): + return graph.key('@chromium', '', 'main_console_view_ordering', console_name) + + def _console_view_ordering_impl(ctx, *, console_name, ordering): key = _console_view_ordering_graph_key(console_name) graph.add_node(key, props = { @@ -39,6 +44,16 @@ _console_view_ordering = lucicfg.rule(impl=_console_view_ordering_impl) +def _main_console_view_ordering_impl(ctx, *, console_name, top_level_ordering): + key = _main_console_view_ordering_graph_key(console_name) + graph.add_node(key, props = { + 'top_level_ordering': top_level_ordering, + }) + graph.add_edge(keys.project(), key) + return graph.keyset(key) + +_main_console_view_ordering = lucicfg.rule(impl=_main_console_view_ordering_impl) + def _category_join(parent, category): return '|'.join([c for c in (parent, category) if c]) @@ -63,7 +78,7 @@ return (len(ordering), category) -def _builder_sort_key(console_name, console_ordering, builder): +def _builder_sort_key(console_ordering, category, short_name, names): """Compute the key for a builder. Builders are sorted lexicographically by the sequence of category @@ -77,43 +92,111 @@ Returns: A key that can be used to sort builder entries within the same console. """ - category = None + current_category = None # Build the category key as a sequence of the keys for each level category_key = [] - if builder.category: - for c in builder.category.split('|'): - ordering = console_ordering.get(category, []) + if category: + for c in category.split('|'): + ordering = console_ordering.get(current_category, []) if type(ordering) == type(''): ordering = console_ordering[ordering] if type(ordering) == type(struct()): ordering = ordering.categories category_key.append(_level_sort_key(c, ordering)) - category = _category_join(category, c) + current_category = _category_join(current_category, c) short_name_key = () - if builder.short_name: + if short_name: ordering = console_ordering.get(category, []) if type(ordering) == type(''): ordering = console_ordering[ordering] short_name_ordering = getattr(ordering, 'short_names', []) - short_name_key = _level_sort_key(builder.short_name, short_name_ordering) + short_name_key = _level_sort_key(short_name, short_name_ordering) return ( category_key, short_name_key, - list(builder.name), + list(names), ) +def _get_console_ordering(console_name): + """Get the ordering dict used for sorting entries of a console_view. + + Returns: + The ordering dict used to sort entries of the console_view with the + given name or None if the name does not refer to a console_view with + an ordering. + """ + graph_key = _console_view_ordering_graph_key(console_name) + node = graph.node(graph_key) + return node.props.ordering if node != None else None + + +def _get_console_view_key_fn(console_name): + """Get the key function for sorting entries of a console_view. + + Returns: + The key function used to sort entries of the console_view with the + given name or None if the name does not refer to a console_view with + an ordering. + """ + ordering = _get_console_ordering(console_name) + if ordering == None: + return None + + def key_fn(b): + return _builder_sort_key(ordering, b.category, b.short_name, b.name) + return key_fn + + +def _get_main_console_view_key_fn(console_name): + """Get the key function for sorting entries of a main_console_view. + + Returns: + The key function used to sort entries of the main_console_view with + the given name or None if the name does not refer to a + main_console_view. + """ + main_console_ordering = graph.node( + _main_console_view_ordering_graph_key(console_name)) + if main_console_ordering == None: + return None + + top_level_ordering = main_console_ordering.props.top_level_ordering + + def key_fn(b): + if not b.category: + fail('Builder {} must have a category'.format(b)) + category_components = b.category.split('|', 1) + + subconsole = category_components[0] + subconsole_sort_key = _level_sort_key(subconsole, top_level_ordering) + + builder_sort_key = () + subconsole_ordering = _get_console_ordering(subconsole) + if subconsole_ordering != None: + category = '' + if len(category_components) > 1: + category = category_components[1] + builder_sort_key = _builder_sort_key( + subconsole_ordering, category, b.short_name, b.name) + + return ( + subconsole_sort_key, + builder_sort_key, + ) + + return key_fn + + def _sort_consoles(ctx): milo = ctx.output['luci-milo.cfg'] for console in milo.consoles: - graph_key = graph.key('@chromium', '', 'console_view_ordering', console.id) - node = graph.node(graph_key) - if node != None: - def key_fn(b): - return _builder_sort_key(console.id, node.props.ordering, b) + key_fn = (_get_console_view_key_fn(console.id) + or _get_main_console_view_key_fn(console.id)) + if key_fn: console.builders = sorted(console.builders, key_fn) milo.consoles = sorted(milo.consoles, lambda c: c.id) @@ -188,6 +271,42 @@ ) +def main_console_view(*, name, top_level_ordering, **kwargs): + """Create a main console view. + + A main console view is a console view that contains a subset of + entries from other consoles. The entries from each console will have + that console's name prepended to the entries' categories and will + appear in the same order as they do in that console. The ordering of + entries from different consoles is controlled by the + `top_level_ordering` parameter. + + Args: + name - The name of the console view. + top_level_ordering - A list of strings defining the order that + entries from different consoles will appear. Entries will be + sorted by the name of the console they come from, appearing in the + same order as in top_level_ordering. Entries from consoles whose + name does not appear in the list will be sorted lexicographically + by the console name and appear after entries whose console does + appear in the list. + kwargs - Additional keyword arguments to forward on to + `luci.console_view`. The header and repo arguments support + module-level defaults. + """ + kwargs['header'] = defaults.get_value_from_kwargs('header', kwargs) + kwargs['repo'] = defaults.get_value_from_kwargs('repo', kwargs) + luci.console_view( + name = name, + **kwargs + ) + + _main_console_view_ordering( + console_name = name, + top_level_ordering = top_level_ordering, + ) + + def console_view_entry(*, category=None, short_name=None): """Specifies the details of a console view entry. @@ -210,6 +329,7 @@ name, add_to_console_view=args.DEFAULT, console_view=args.DEFAULT, + main_console_view=args.DEFAULT, console_view_entry=None, **kwargs): """Define a CI builder. @@ -225,7 +345,12 @@ the mastername of the builder, if provided. An entry will be added only if `add_to_console_view` is True and `console_view_entry` is provided. - console_view_entry - A structure providing the details of the entry + main_console_view - A string identifying the ID of the main console + view to add an entry to. Supports a module-level default that + defaults to None. An entry will be added only if + `console_view_entry` is provided. Note that `add_to_console_view` + has no effect on creating an entry to the main console view. + console_view_entry - A structure providing the details of the entry to add to the console view. See `ci.console_view_entry` for details. """ # Define the builder first so that any validation of luci.builder arguments @@ -255,6 +380,15 @@ short_name = console_view_entry.short_name, ) + main_console_view = defaults.get_value('main_console_view', main_console_view) + if main_console_view: + luci.console_view_entry( + builder = builder, + console_view = main_console_view, + category = '|'.join([console_view, console_view_entry.category]), + short_name = console_view_entry.short_name, + ) + return ret @@ -675,6 +809,7 @@ console_view = console_view, console_view_entry = console_view_entry, defaults = defaults, + main_console_view = main_console_view, ordering = ordering, android_builder = android_builder,
diff --git a/infra/config/main.star b/infra/config/main.star index dd56951..52229fc3 100755 --- a/infra/config/main.star +++ b/infra/config/main.star
@@ -104,12 +104,9 @@ exec('//consoles/android.packager.star') exec('//consoles/angle.try.star') -exec('//consoles/chromium.fuzz.star') exec('//consoles/chromium.goma.star') exec('//consoles/chromium.goma.fyi.star') exec('//consoles/chromium.goma.migration.star') -exec('//consoles/chromium.gpu.fyi.star') -exec('//consoles/chromium.swangle.star') exec('//consoles/chromium.webrtc.star') exec('//consoles/chromium.webrtc.fyi.star') exec('//consoles/findit.star')
diff --git a/infra/config/versioned/trunk/buckets/ci.star b/infra/config/versioned/trunk/buckets/ci.star index f92e3a2..59f597d 100644 --- a/infra/config/versioned/trunk/buckets/ci.star +++ b/infra/config/versioned/trunk/buckets/ci.star
@@ -29,10 +29,37 @@ refs = [vars.ref], ) +ci.main_console_view( + name = vars.main_console_name, + header = '//consoles/chromium-header.textpb', + repo = 'https://chromium.googlesource.com/chromium/src', + refs = [vars.ref], + title = vars.main_console_title, + top_level_ordering = [ + 'chromium', + 'chromium.win', + 'chromium.mac', + 'chromium.linux', + 'chromium.chromiumos', + 'chromium.android', + 'chrome', + 'chromium.memory', + 'chromium.dawn', + 'chromium.gpu', + 'chromium.fyi', + 'chromium.android.fyi', + 'chromium.clang', + 'chromium.fuzz', + 'chromium.gpu.fyi', + 'chromium.swangle', + ], +) + ci.defaults.add_to_console_view.set(vars.is_master) ci.defaults.bucket.set(vars.ci_bucket) ci.defaults.bucketed_triggers.set(True) +ci.defaults.main_console_view.set(vars.main_console_name) ci.defaults.triggered_by.set([vars.ci_poller])
diff --git a/infra/config/versioned/trunk/consoles/main.star b/infra/config/versioned/trunk/consoles/main.star deleted file mode 100644 index 58be852..0000000 --- a/infra/config/versioned/trunk/consoles/main.star +++ /dev/null
@@ -1,528 +0,0 @@ -load('//lib/builders.star', 'builder_name', 'defaults') -load('../vars.star', 'vars') - -defaults.bucket.set(vars.ci_bucket) - -luci.console_view( - name = vars.main_console_name, - header = '//consoles/chromium-header.textpb', - repo = 'https://chromium.googlesource.com/chromium/src', - refs = [vars.ref], - title = vars.main_console_title, - entries = [ - luci.console_view_entry( - builder = builder_name('android-archive-dbg'), - category = 'chromium|android', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = builder_name('android-archive-rel'), - category = 'chromium|android', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('linux-archive-dbg'), - category = 'chromium|linux', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = builder_name('linux-archive-rel'), - category = 'chromium|linux', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('mac-archive-dbg'), - category = 'chromium|mac', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = builder_name('mac-archive-rel'), - category = 'chromium|mac', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('win32-archive-dbg'), - category = 'chromium|win|dbg', - short_name = '32', - ), - luci.console_view_entry( - builder = builder_name('win-archive-dbg'), - category = 'chromium|win|dbg', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('win32-archive-rel'), - category = 'chromium|win|rel', - short_name = '32', - ), - luci.console_view_entry( - builder = builder_name('win-archive-rel'), - category = 'chromium|win|rel', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('Win x64 Builder'), - category = 'chromium.win|release|builder', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('Win 7 Tests x64 (1)'), - category = 'chromium.win|release|tester', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('Win10 Tests x64'), - category = 'chromium.win|release|tester', - short_name = 'w10', - ), - luci.console_view_entry( - builder = builder_name('Win Builder (dbg)'), - category = 'chromium.win|debug|builder', - short_name = '32', - ), - luci.console_view_entry( - builder = builder_name('Win7 Tests (dbg)(1)'), - category = 'chromium.win|debug|tester', - short_name = '7', - ), - luci.console_view_entry( - builder = builder_name('Mac Builder'), - category = 'chromium.mac|release', - short_name = 'bld', - ), - luci.console_view_entry( - builder = builder_name('Mac10.10 Tests'), - category = 'chromium.mac|release', - short_name = '10', - ), - luci.console_view_entry( - builder = builder_name('Mac10.11 Tests'), - category = 'chromium.mac|release', - short_name = '11', - ), - luci.console_view_entry( - builder = builder_name('Mac10.12 Tests'), - category = 'chromium.mac|release', - short_name = '12', - ), - luci.console_view_entry( - builder = builder_name('Mac10.13 Tests'), - category = 'chromium.mac|release', - short_name = '13', - ), - luci.console_view_entry( - builder = builder_name('Mac10.14 Tests'), - category = 'chromium.mac|release', - short_name = '14', - ), - luci.console_view_entry( - builder = builder_name('WebKit Mac10.13 (retina)'), - category = 'chromium.mac|release', - short_name = 'ret', - ), - luci.console_view_entry( - builder = builder_name('Mac Builder (dbg)'), - category = 'chromium.mac|debug', - short_name = 'bld', - ), - luci.console_view_entry( - builder = builder_name('Mac10.13 Tests (dbg)'), - category = 'chromium.mac|debug', - short_name = '13', - ), - luci.console_view_entry( - builder = builder_name('ios-simulator'), - category = 'chromium.mac|ios|default', - short_name = 'sim', - ), - luci.console_view_entry( - builder = builder_name('ios-simulator-full-configs'), - category = 'chromium.mac|ios|default', - short_name = 'ful', - ), - luci.console_view_entry( - builder = builder_name('Linux Builder'), - category = 'chromium.linux|release', - short_name = 'bld', - ), - luci.console_view_entry( - builder = builder_name('Linux Tests'), - category = 'chromium.linux|release', - short_name = 'tst', - ), - luci.console_view_entry( - builder = builder_name('linux-ozone-rel'), - category = 'chromium.linux|release', - short_name = 'ozo', - ), - luci.console_view_entry( - builder = builder_name('Linux Builder (dbg)'), - category = 'chromium.linux|debug|builder', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('Linux Tests (dbg)(1)'), - category = 'chromium.linux|debug|tester', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('Cast Linux'), - category = 'chromium.linux|cast', - short_name = 'vid', - ), - luci.console_view_entry( - builder = builder_name('Fuchsia ARM64'), - category = 'chromium.linux|fuchsia|a64', - ), - luci.console_view_entry( - builder = builder_name('fuchsia-arm64-cast'), - category = 'chromium.linux|fuchsia|cast', - short_name = 'a64', - ), - luci.console_view_entry( - builder = builder_name('fuchsia-x64-cast'), - category = 'chromium.linux|fuchsia|cast', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Fuchsia x64'), - category = 'chromium.linux|fuchsia|x64', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('linux-chromeos-rel'), - category = 'chromium.chromiumos|default', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('linux-chromeos-dbg'), - category = 'chromium.chromiumos|default', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = builder_name('chromeos-arm-generic-rel'), - category = 'chromium.chromiumos|simple|release', - short_name = 'arm', - ), - luci.console_view_entry( - builder = builder_name('chromeos-kevin-rel'), - category = 'chromium.chromiumos|simple|release', - short_name = 'kvn', - ), - luci.console_view_entry( - builder = builder_name('chromeos-amd64-generic-rel'), - category = 'chromium.chromiumos|simple|release|x64', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('chromeos-amd64-generic-dbg'), - category = 'chromium.chromiumos|simple|debug|x64', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = builder_name('android-cronet-arm-dbg'), - category = 'chromium.android|cronet|arm', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = builder_name('android-cronet-arm-rel'), - category = 'chromium.android|cronet|arm', - short_name = 'rel', - ), - luci.console_view_entry( - builder = builder_name('android-cronet-kitkat-arm-rel'), - category = 'chromium.android|cronet|test', - short_name = 'k', - ), - luci.console_view_entry( - builder = builder_name('android-cronet-lollipop-arm-rel'), - category = 'chromium.android|cronet|test', - short_name = 'l', - ), - luci.console_view_entry( - builder = builder_name('Android arm Builder (dbg)'), - category = 'chromium.android|builder|arm', - short_name = '32', - ), - luci.console_view_entry( - builder = builder_name('Android arm64 Builder (dbg)'), - category = 'chromium.android|builder|arm', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('Android x86 Builder (dbg)'), - category = 'chromium.android|builder|x86', - short_name = '32', - ), - luci.console_view_entry( - builder = builder_name('Android x64 Builder (dbg)'), - category = 'chromium.android|builder|x86', - short_name = '64', - ), - luci.console_view_entry( - builder = builder_name('KitKat Phone Tester (dbg)'), - category = 'chromium.android|tester|phone', - short_name = 'K', - ), - luci.console_view_entry( - builder = builder_name('Lollipop Phone Tester'), - category = 'chromium.android|tester|phone', - short_name = 'L', - ), - luci.console_view_entry( - builder = builder_name('Marshmallow 64 bit Tester'), - category = 'chromium.android|tester|phone', - short_name = 'M', - ), - luci.console_view_entry( - builder = builder_name('Nougat Phone Tester'), - category = 'chromium.android|tester|phone', - short_name = 'N', - ), - luci.console_view_entry( - builder = builder_name('Oreo Phone Tester'), - category = 'chromium.android|tester|phone', - short_name = 'O', - ), - luci.console_view_entry( - builder = builder_name('android-pie-arm64-dbg'), - category = 'chromium.android|tester|phone', - short_name = 'P', - ), - luci.console_view_entry( - builder = builder_name('KitKat Tablet Tester'), - category = 'chromium.android|tester|tablet', - short_name = 'K', - ), - luci.console_view_entry( - builder = builder_name('Lollipop Tablet Tester'), - category = 'chromium.android|tester|tablet', - short_name = 'L', - ), - luci.console_view_entry( - builder = builder_name('Marshmallow Tablet Tester'), - category = 'chromium.android|tester|tablet', - short_name = 'M', - ), - luci.console_view_entry( - builder = builder_name('Android WebView L (dbg)'), - category = 'chromium.android|tester|webview', - short_name = 'L', - ), - luci.console_view_entry( - builder = builder_name('Android WebView M (dbg)'), - category = 'chromium.android|tester|webview', - short_name = 'M', - ), - luci.console_view_entry( - builder = builder_name('Android WebView N (dbg)'), - category = 'chromium.android|tester|webview', - short_name = 'N', - ), - luci.console_view_entry( - builder = builder_name('Android WebView O (dbg)'), - category = 'chromium.android|tester|webview', - short_name = 'O', - ), - luci.console_view_entry( - builder = builder_name('Android WebView P (dbg)'), - category = 'chromium.android|tester|webview', - short_name = 'P', - ), - luci.console_view_entry( - builder = builder_name('android-kitkat-arm-rel'), - category = 'chromium.android|on_cq', - short_name = 'K', - ), - luci.console_view_entry( - builder = builder_name('android-marshmallow-arm64-rel'), - category = 'chromium.android|on_cq', - short_name = 'M', - ), - luci.console_view_entry( - builder = builder_name('android-pie-arm64-rel'), - category = 'chromium.android|on_cq', - short_name = 'P', - ), - luci.console_view_entry( - builder = builder_name('Cast Android (dbg)'), - category = 'chromium.android|on_cq', - short_name = 'cst', - ), - luci.console_view_entry( - builder = 'chrome:ci/linux-chromeos-chrome', - category = 'chrome', - short_name = 'cro', - ), - luci.console_view_entry( - builder = 'chrome:ci/linux-chrome', - category = 'chrome', - short_name = 'lnx', - ), - luci.console_view_entry( - builder = 'chrome:ci/mac-chrome', - category = 'chrome', - short_name = 'mac', - ), - luci.console_view_entry( - builder = 'chrome:ci/win-chrome', - category = 'chrome', - short_name = 'win', - ), - luci.console_view_entry( - builder = builder_name('Linux TSan Builder'), - category = 'chromium.memory|linux|TSan v2', - short_name = 'bld', - ), - luci.console_view_entry( - builder = builder_name('Linux TSan Tests'), - category = 'chromium.memory|linux|TSan v2', - short_name = 'tst', - ), - luci.console_view_entry( - builder = builder_name('Linux ASan LSan Builder'), - category = 'chromium.memory|linux|asan lsan', - short_name = 'bld', - ), - luci.console_view_entry( - builder = builder_name('Linux ASan LSan Tests (1)'), - category = 'chromium.memory|linux|asan lsan', - short_name = 'tst', - ), - luci.console_view_entry( - builder = builder_name('Linux ASan Tests (sandboxed)'), - category = 'chromium.memory|linux|asan lsan', - short_name = 'sbx', - ), - luci.console_view_entry( - builder = builder_name('Dawn Linux x64 DEPS Builder'), - category = 'chromium.dawn|DEPS|Linux|Builder', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Linux x64 DEPS Release (Intel HD 630)'), - category = 'chromium.dawn|DEPS|Linux|Intel', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Linux x64 DEPS Release (NVIDIA)'), - category = 'chromium.dawn|DEPS|Linux|Nvidia', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Mac x64 DEPS Builder'), - category = 'chromium.dawn|DEPS|Mac|Builder', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Mac x64 DEPS Release (AMD)'), - category = 'chromium.dawn|DEPS|Mac|AMD', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Mac x64 DEPS Release (Intel)'), - category = 'chromium.dawn|DEPS|Mac|Intel', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Win10 x86 DEPS Builder'), - category = 'chromium.dawn|DEPS|Windows|Builder', - short_name = 'x86', - ), - luci.console_view_entry( - builder = builder_name('Dawn Win10 x64 DEPS Builder'), - category = 'chromium.dawn|DEPS|Windows|Builder', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Win10 x86 DEPS Release (Intel HD 630)'), - category = 'chromium.dawn|DEPS|Windows|Intel', - short_name = 'x86', - ), - luci.console_view_entry( - builder = builder_name('Dawn Win10 x64 DEPS Release (Intel HD 630)'), - category = 'chromium.dawn|DEPS|Windows|Intel', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('Dawn Win10 x86 DEPS Release (NVIDIA)'), - category = 'chromium.dawn|DEPS|Windows|Nvidia', - short_name = 'x86', - ), - luci.console_view_entry( - builder = builder_name('Dawn Win10 x64 DEPS Release (NVIDIA)'), - category = 'chromium.dawn|DEPS|Windows|Nvidia', - short_name = 'x64', - ), - luci.console_view_entry( - builder = builder_name('GPU Win x64 Builder'), - category = 'chromium.gpu|Windows', - ), - luci.console_view_entry( - builder = builder_name('Win10 x64 Release (NVIDIA)'), - category = 'chromium.gpu|Windows', - ), - luci.console_view_entry( - builder = builder_name('GPU Mac Builder'), - category = 'chromium.gpu|Mac', - ), - luci.console_view_entry( - builder = builder_name('Mac Release (Intel)'), - category = 'chromium.gpu|Mac', - ), - luci.console_view_entry( - builder = builder_name('Mac Retina Release (AMD)'), - category = 'chromium.gpu|Mac', - ), - luci.console_view_entry( - builder = builder_name('GPU Linux Builder'), - category = 'chromium.gpu|Linux', - ), - luci.console_view_entry( - builder = builder_name('Linux Release (NVIDIA)'), - category = 'chromium.gpu|Linux', - ), - luci.console_view_entry( - builder = builder_name('Android Release (Nexus 5X)'), - category = 'chromium.gpu|Android', - ), - # TODO(gbeaty): FYI builders should not be mirrors for try builders on - # the CQ, but things are what they are - luci.console_view_entry( - builder = builder_name('ios-simulator-cronet'), - category = 'chromium.fyi|cronet', - ), - luci.console_view_entry( - builder = builder_name('mac-osxbeta-rel'), - category = 'chromium.fyi|mac', - short_name = 'beta', - ), - luci.console_view_entry( - builder = builder_name('chromeos-kevin-rel-hw-tests'), - category = 'chromium.fyi|chromeos', - ), - luci.console_view_entry( - builder = builder_name('VR Linux'), - category = 'chromium.fyi|linux', - ), - luci.console_view_entry( - builder = builder_name('Linux Ozone Tester (Headless)'), - category = 'chromium.fyi|linux', - short_name = 'loh', - ), - luci.console_view_entry( - builder = builder_name('Linux Ozone Tester (Wayland)'), - category = 'chromium.fyi|linux', - short_name = 'low', - ), - luci.console_view_entry( - builder = builder_name('Linux Ozone Tester (X11)'), - category = 'chromium.fyi|linux', - short_name = 'lox', - ), - luci.console_view_entry( - builder = builder_name('Win10 Tests x64 1803'), - category = 'chromium.fyi|win10|1803', - ), - ], -)
diff --git a/infra/config/versioned/trunk/vars.star b/infra/config/versioned/trunk/vars.star index 20cc4da..35190e95 100644 --- a/infra/config/versioned/trunk/vars.star +++ b/infra/config/versioned/trunk/vars.star
@@ -4,11 +4,11 @@ ref = 'refs/heads/master', ci_bucket = 'ci', ci_poller = 'master-gitiles-trigger', + main_console_name = 'main', + main_console_title = 'Chromium Main Console', try_bucket = 'try', cq_group = 'cq', cq_ref_regexp = 'refs/heads/.+', - main_console_name = 'main', - main_console_title = 'Chromium Main Console', # Delete this line for branches tree_status_host = 'chromium-status.appspot.com/', )
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index c37d05f..6940028 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 gekies</translation> <translation id="2421044535038393232">Hou wysiging</translation> <translation id="2435457462613246316">Wys wagwoord</translation> -<translation id="2481538920734869610">VOEG REKENING BY</translation> <translation id="2497852260688568942">Jou administrateur het sinkronisering gedeaktiveer</translation> <translation id="2500374554657206846">Opsies om wagwoord te stoor</translation> <translation id="2523363575747517183">Hierdie webwerf probeer herhaaldelik 'n ander program oopmaak.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Praat antwoorde terug</translation> <translation id="7265758999917665941">Nooit vir hierdie werf nie</translation> <translation id="7272437679830969316">Kan nie jou identiteit verifieer nie. Wagwoord is nie gekopieer nie.</translation> -<translation id="7285236536143823449">JA, EK'S IN</translation> <translation id="7291368939935408496">Maak tans wagwoorde gereed …</translation> <translation id="7293171162284876153">Skakel "Sinkroniseer jou Chrome-data" aan om met sinkronisering te begin.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> persent afgelaai</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Gebruik Kamera</translation> <translation id="7464701184726199289">Dit vee gesinkroniseerde data op alle toestelle uit. Gestoorde werfinstellings sal nie uitgevee word nie en sal dalk jou blaaigewoontes weerspieël. <ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Maatskappynaam</translation> +<translation id="7473891865547856676">Nee, dankie</translation> <translation id="7481312909269577407">Vorentoe</translation> <translation id="750493650310597496">0 gekies</translation> <translation id="7514365320538308">Laai af</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Gister</translation> <translation id="778855399387580014">Begin 'n soektog in 'n nuwe Chrome-oortjie.</translation> <translation id="7791543448312431591">Voeg by</translation> -<translation id="780301667611848630">Nee, dankie</translation> <translation id="7840771868269352570">Die items wat jy gekies het, sal verwyder word.</translation> <translation id="7856733331829174190">Kon nie aflaai nie</translation> <translation id="7859704718976024901">Blaaigeskiedenis</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Onlangs toegemaak</translation> <translation id="8881801611828450202">Deursoek <ph name="SEARCH_ENGINE" /> vir hierdie prent</translation> <translation id="8909135823018751308">Deel …</translation> +<translation id="8917490105272468696">Ja, ek is in</translation> <translation id="895541991026785598">Gee 'n kwessie aan</translation> <translation id="8976382372951310360">Hulp</translation> <translation id="8981454092730389528">Google-aktiwiteitkontroles</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 73fcd142..f4be231 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ተመርጧል</translation> <translation id="2421044535038393232">አርትዖቱን ቀጥል</translation> <translation id="2435457462613246316">የይለፍ ቃል አሳይ</translation> -<translation id="2481538920734869610">መለያ አክል</translation> <translation id="2497852260688568942">ስምረት በእርስዎ አስተዳዳሪ ተሰናክሏል</translation> <translation id="2500374554657206846">የይለፍ ቃል የሚቀመጡባቸው አማራጮች</translation> <translation id="2523363575747517183">ይህ ድር ጣቢያ በተደጋጋሚነት ሌላ መተግበሪያ ለመክፈት እየሞከረ ነው።</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">መልሶችን ተመልሰህ ተናገር</translation> <translation id="7265758999917665941">ለዚህ ጣቢያ በጭራሽ</translation> <translation id="7272437679830969316">የእርስዎን ማንነት ማረጋገጥ አልተቻለም። የይለፍ ቃል አልተቀዳም።</translation> -<translation id="7285236536143823449">አዎ፣ ፈቃደኛ ነኝ</translation> <translation id="7291368939935408496">የይለፍ ቃላትን በማዘጋጀት ላይ...</translation> <translation id="7293171162284876153">ስምረትን ለመጀመር «የChrome ውሂብዎን ያስምሩ»ን ያብሩት።</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> በመቶ ወርዷል</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ካሜራ ተጠቀም</translation> <translation id="7464701184726199289">ይሄ የሠመረ ከሁሉም መሣሪያዎች ያጸዳል። የተቀመጡ የጣቢያ ቅንብሮች አይሰረዙም፣ እና የእርስዎን የአሰሳ ልማዶች ሊያንጸባርቁ ይችላሉ። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="7472734401283673885">የኩባንያ ስም</translation> +<translation id="7473891865547856676">አይ፣ አመሰግናለሁ</translation> <translation id="7481312909269577407">ወደ ፊት</translation> <translation id="750493650310597496">0 ተመርጧል</translation> <translation id="7514365320538308">አውርድ</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ትናንት</translation> <translation id="778855399387580014">በአዲስ የChrome ትር ውስጥ ፍለጋ ጀምር።</translation> <translation id="7791543448312431591">አክል</translation> -<translation id="780301667611848630">አይ፣ አመሰግናለሁ</translation> <translation id="7840771868269352570">የመረጧቸው ንጥሎች ይወገዳሉ።</translation> <translation id="7856733331829174190">ማውረድ አልተቻለም</translation> <translation id="7859704718976024901">የአሰሳ ታሪክ</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">በቅርብ ጊዜ የተዘጉ</translation> <translation id="8881801611828450202">ይህን ምስል በ<ph name="SEARCH_ENGINE" /> ውስጥ ፈልግ</translation> <translation id="8909135823018751308">አጋራ…</translation> +<translation id="8917490105272468696">አዎ፣ ገብቼያለሁ</translation> <translation id="895541991026785598">ችግር ሪፖርት ያድርጉ</translation> <translation id="8976382372951310360">እገዛ</translation> <translation id="8981454092730389528">የGoogle እንቅስቃሴ መቆጣጠሪያዎች</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index f8fbb1a..2552fd8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">تم تحديد عنصر واحد</translation> <translation id="2421044535038393232">متابعة التعديل</translation> <translation id="2435457462613246316">عرض كلمة المرور</translation> -<translation id="2481538920734869610">إضافة حساب</translation> <translation id="2497852260688568942">تم إيقاف المزامنة من قِبل المشرف</translation> <translation id="2500374554657206846">خيارات حفظ كلمة المرور</translation> <translation id="2523363575747517183">يحاول موقع الويب هذا فتح تطبيق آخر بشكلٍ متكرر.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">النطق بالإجابات</translation> <translation id="7265758999917665941">عدم حفظ كلمة المرور لهذا الموقع الإلكتروني</translation> <translation id="7272437679830969316">تعذَّر التحقق من هويتك. لم يتم نسخ كلمة المرور.</translation> -<translation id="7285236536143823449">نعم، موافق</translation> <translation id="7291368939935408496">جارٍ تحضير كلمات المرور…</translation> <translation id="7293171162284876153">لبدء المزامنة، يُرجى تفعيل "مزامنة بيانات Chrome".</translation> <translation id="7336264872878993241">تم تنزيل <ph name="PERCENT" /> بالمائة</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">استخدام الكاميرا</translation> <translation id="7464701184726199289">يمحو هذا الخيار البيانات المتزامنة من كافة الأجهزة. لن يتم حذف إعدادات موقع الويب المحفوظة وقد تعكس عادات التصفح. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> <translation id="7472734401283673885">اسم الشركة</translation> +<translation id="7473891865547856676">لا، شكرًا</translation> <translation id="7481312909269577407">إلى الأمام</translation> <translation id="750493650310597496">لم يتم اختيار أي إشارات</translation> <translation id="7514365320538308">تنزيل</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">أمس</translation> <translation id="778855399387580014">يمكنك بدء البحث في علامة تبويب Chrome جديدة.</translation> <translation id="7791543448312431591">إضافة</translation> -<translation id="780301667611848630">لا، شكرًا</translation> <translation id="7840771868269352570">ستتم إزالة العناصر التي اخترتها.</translation> <translation id="7856733331829174190">تعذّر التنزيل.</translation> <translation id="7859704718976024901">سجلّ التصفّح</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">العناصر المغلقة مؤخرًا</translation> <translation id="8881801611828450202">البحث في <ph name="SEARCH_ENGINE" /> عن هذه الصورة</translation> <translation id="8909135823018751308">مشاركة…</translation> +<translation id="8917490105272468696">نعم، أنا موافق</translation> <translation id="895541991026785598">الإبلاغ عن مشكلة</translation> <translation id="8976382372951310360">مساعدة</translation> <translation id="8981454092730389528">عناصر التحكم في النشاط على Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index 3b8657f..62cbc4b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">১টা বাছনি কৰা হৈছে</translation> <translation id="2421044535038393232">সম্পাদনা কৰি থাকক</translation> <translation id="2435457462613246316">পাছৱৰ্ড দেখুৱাওক</translation> -<translation id="2481538920734869610">একাউণ্ট যোগ কৰক</translation> <translation id="2497852260688568942">আপোনাৰ প্ৰশাসকে ছিংক অক্ষম কৰিছে</translation> <translation id="2500374554657206846">পাছৱৰ্ড ছেভ কৰাৰ বিকল্পসমূহ</translation> <translation id="2523363575747517183">এই ৱেবছাইটটোৱে বাৰে বাৰে অন্য এটা এপ্লিকেশ্বন খুলিবলৈ চেষ্টা কৰি আছে।</translation> @@ -479,7 +478,6 @@ <translation id="7203585745079012652">সঁহাৰিটো কৈ দিয়ক</translation> <translation id="7265758999917665941">এই ছাইটটোৰ বাবে কেতিয়াও নহয়</translation> <translation id="7272437679830969316">আপোনাৰ পৰিচয় সত্যাপন কৰিব পৰা নগ’ল। পাছৱৰ্ড প্ৰতিলিপি কৰা নহ’ল।</translation> -<translation id="7285236536143823449">হয়, মই সন্মত</translation> <translation id="7291368939935408496">পাছৱর্ড সাজু কৰি থকা হৈছে...</translation> <translation id="7293171162284876153">ছিংক কৰা আৰম্ভ কৰিবলৈ "আপোনাৰ Chrome ডেটা ছিংক কৰক" অন কৰক।</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> শতাংশ ডাউনল’ড কৰা হ’ল</translation> @@ -495,6 +493,7 @@ <translation id="7460314822154045102">কেমেৰা ব্যৱহাৰ কৰক</translation> <translation id="7464701184726199289">এইটোৱে সকলো ডিভাইচৰ পৰা ছিংক কৰি থোৱা ডেটা মচে। ছেভ কৰি থোৱা ছাইটৰ ছেটিংসমূহ মচা নাযায় আৰু আপোনাৰ ব্ৰাউজিঙৰ ধৰণ প্ৰতিফলিত কৰিব পাৰে। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="7472734401283673885">কোম্পানীৰ নাম</translation> +<translation id="7473891865547856676">নালাগে, ধন্যবাদ</translation> <translation id="7481312909269577407">ফৰৱাৰ্ড কৰক</translation> <translation id="750493650310597496">এটাও বাছনি কৰা হোৱা নাই</translation> <translation id="7514365320538308">ডাউনল'ড কৰক</translation> @@ -514,7 +513,6 @@ <translation id="7781829728241885113">কালি</translation> <translation id="778855399387580014">Chromeৰ নতুন টেবত সন্ধান আৰম্ভ কৰক।</translation> <translation id="7791543448312431591">যোগ কৰক</translation> -<translation id="780301667611848630">নালাগে, ধন্যবাদ</translation> <translation id="7840771868269352570">আপুনি বাছনি কৰা বস্তুটো আঁতৰোৱা হ’ব।</translation> <translation id="7856733331829174190">ডাউনল'ড কৰিব পৰা নগ'ল</translation> <translation id="7859704718976024901">ব্ৰাউজিঙৰ ইতিহাস</translation> @@ -584,6 +582,7 @@ <translation id="8870413625673593573">শেহতীয়াকৈ বন্ধ কৰা</translation> <translation id="8881801611828450202">এই প্ৰতিচ্ছবিটোৰ কাৰণে <ph name="SEARCH_ENGINE" />ত সন্ধান কৰক</translation> <translation id="8909135823018751308">শ্বেয়াৰ কৰক…</translation> +<translation id="8917490105272468696">হয়, মই সন্মত</translation> <translation id="895541991026785598">কোনো সমস্যাৰ অভিযোগ দিয়ক</translation> <translation id="8976382372951310360">সহায়</translation> <translation id="8981454092730389528">Googleৰ কাৰ্যকলাপৰ নিয়ন্ত্ৰণ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index a6e8e18e..21f189a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ədəd seçildi</translation> <translation id="2421044535038393232">Redaktəyə Davam Edin</translation> <translation id="2435457462613246316">Parolu göstərin</translation> -<translation id="2481538920734869610">HESAB ƏLAVƏ EDİN</translation> <translation id="2497852260688568942">Sinxronizasiya administratorunuz tərəfindən deaktiv edilib</translation> <translation id="2500374554657206846">Parolu Yadda Saxlamaq üçün Seçimlər</translation> <translation id="2523363575747517183">Bu veb sayt davamlı olaraq digər tətbiqi açmağa çalışır.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Geri Cavab</translation> <translation id="7265758999917665941">Bu sayt üçün heç vaxt yadda saxlamayın</translation> <translation id="7272437679830969316">Kimliyinizi doğrulamaq mümkün deyil. Parol kopyalanmayıb.</translation> -<translation id="7285236536143823449">BƏLİ, RAZIYAM</translation> <translation id="7291368939935408496">Parollar Hazırlanır...</translation> <translation id="7293171162284876153">Sinxronizasiyanı başlatmaq üçün "Chrome datasını sinxronizasiya edin" seçimini aktiv edin.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> faiz endirilib</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Kameradan istifadə edin</translation> <translation id="7464701184726199289">Bu, bütün cihazlardan sinxronizasiya olunmuş datanı silir. Yadda saxlanmış sayt ayarları silinməyəcək və axtarış təcrübənizə təsir edə bilər. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Şirkətin Adı</translation> +<translation id="7473891865547856676">Yox</translation> <translation id="7481312909269577407">İrəli</translation> <translation id="750493650310597496">1 ədəd seçilib</translation> <translation id="7514365320538308">Endirmə</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Dünən</translation> <translation id="778855399387580014">Yeni Chrome tabında axtarışa başlayın.</translation> <translation id="7791543448312431591">Əlavə etmək</translation> -<translation id="780301667611848630">Yox, çox sağ olun</translation> <translation id="7840771868269352570">Seçdiyiniz elementlər silinəcək.</translation> <translation id="7856733331829174190">Yüklənmədi</translation> <translation id="7859704718976024901">Brauzer Tarixçəsi</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Son Qapadılan</translation> <translation id="8881801611828450202">Bu Şəkil üçün <ph name="SEARCH_ENGINE" /> Axtarışı Edin</translation> <translation id="8909135823018751308">Paylaşın...</translation> +<translation id="8917490105272468696">Bəli, razıyam</translation> <translation id="895541991026785598">Problemi Xəbər verin</translation> <translation id="8976382372951310360">Yardım</translation> <translation id="8981454092730389528">Google Fəaliyyət Nəzarəti</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 61f5266c..080979e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 выбрана</translation> <translation id="2421044535038393232">Працягнуць рэдагаванне</translation> <translation id="2435457462613246316">Паказаць пароль</translation> -<translation id="2481538920734869610">ДАДАЦЬ УЛІКОВЫ ЗАПІС</translation> <translation id="2497852260688568942">Сінхранізацыя выключана вашым адміністратарам</translation> <translation id="2500374554657206846">Варыянты захавання пароля</translation> <translation id="2523363575747517183">Гэты сайт сістэматычна спрабуе адкрыць іншую праграму.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Агучваць атрыманыя адказы</translation> <translation id="7265758999917665941">Ніколі для гэтага сайта</translation> <translation id="7272437679830969316">Не ўдалося спраўдзіць вашу асобу. Пароль не скапіраваны.</translation> -<translation id="7285236536143823449">ТАК, Я ЗГАДЖАЮСЯ</translation> <translation id="7291368939935408496">Ідзе падрыхтоўка пароляў...</translation> <translation id="7293171162284876153">Каб пачаць сінхранізацыю, уключыце "Сінхранізацыю даных Chrome".</translation> <translation id="7336264872878993241">Спампавана: <ph name="PERCENT" /> %</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Выкарыстаць камеру</translation> <translation id="7464701184726199289">Выдаляе сінхранізаваныя даныя з усіх прылад. Захаваныя налады сайтаў не будуць выдалены і могуць змяшчаць вашу гісторыю праглядаў. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Назва кампаніі</translation> +<translation id="7473891865547856676">Не, дзякуй</translation> <translation id="7481312909269577407">Далей</translation> <translation id="750493650310597496">Выбрана: 0</translation> <translation id="7514365320538308">Спампаваць</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Учора</translation> <translation id="778855399387580014">Пачаць пошук у новай укладцы Chrome.</translation> <translation id="7791543448312431591">Дадаць</translation> -<translation id="780301667611848630">Не, дзякуй</translation> <translation id="7840771868269352570">Выбраныя элементы будуць выдалены.</translation> <translation id="7856733331829174190">Не ўдалося спампаваць</translation> <translation id="7859704718976024901">Гісторыя прагляду сайтаў</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Нядаўна закрытыя</translation> <translation id="8881801611828450202">Шукаць гэты відарыс праз <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Абагуліць…</translation> +<translation id="8917490105272468696">Так, я згаджаюся</translation> <translation id="895541991026785598">Паведаміць аб праблеме</translation> <translation id="8976382372951310360">Даведка</translation> <translation id="8981454092730389528">Параметры дзейнасці для Уліковых запісаў Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index f3e3d035..b4df45e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 избрана</translation> <translation id="2421044535038393232">Продължаване на редактирането</translation> <translation id="2435457462613246316">Показване на паролата</translation> -<translation id="2481538920734869610">НОВ ПРОФИЛ</translation> <translation id="2497852260688568942">Синхронизирането е деактивирано от администратора ви</translation> <translation id="2500374554657206846">Опции за запазване на паролата</translation> <translation id="2523363575747517183">Този уебсайт многократно се опитва да отвори друго приложение.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Изговаряне на отговорите</translation> <translation id="7265758999917665941">Никога за този сайт</translation> <translation id="7272437679830969316">Паролата не бе копирана поради неуспешно удостоверяване.</translation> -<translation id="7285236536143823449">ДА, ПРИЕМАМ</translation> <translation id="7291368939935408496">Паролите се подготвят...</translation> <translation id="7293171162284876153">За да стартирате синхронизирането, включете „Синхронизиране на данните ви в Chrome“.</translation> <translation id="7336264872878993241">Изтеглено: <ph name="PERCENT" />%</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Използване на камерата</translation> <translation id="7464701184726199289">Синхронизираните данни ще се изчистят от всички устройства. Запазените настройки за сайтове няма да бъдат изтрити и може да отразяват навиците ви при сърфиране. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Име на фирмата</translation> +<translation id="7473891865547856676">Не, благодаря</translation> <translation id="7481312909269577407">Напред</translation> <translation id="750493650310597496">Избрахте 0</translation> <translation id="7514365320538308">Изтегляне</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Вчера</translation> <translation id="778855399387580014">Започнете търсене в нов раздел в Chrome.</translation> <translation id="7791543448312431591">Добавяне</translation> -<translation id="780301667611848630">Не, благодаря</translation> <translation id="7840771868269352570">Избраните елементи ще бъдат премахнати.</translation> <translation id="7856733331829174190">Неуспешно изтегляне</translation> <translation id="7859704718976024901">История на сърфирането</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Наскоро затворени</translation> <translation id="8881801611828450202">Търсене на изобр. със: <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Споделяне…</translation> +<translation id="8917490105272468696">Да, ще участвам</translation> <translation id="895541991026785598">Подаване на сигнал за проблем</translation> <translation id="8976382372951310360">Помощ</translation> <translation id="8981454092730389528">Контроли за активността в Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index bb34fe4..43f0b91c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">১টি নির্বাচিত</translation> <translation id="2421044535038393232">এডিট করতে থাকুন</translation> <translation id="2435457462613246316">পাসওয়ার্ড দেখান</translation> -<translation id="2481538920734869610">অ্যাকাউন্ট যোগ করুন</translation> <translation id="2497852260688568942">আপনার প্রশাসকের দ্বারা সিঙ্ক অক্ষম করা হয়েছে</translation> <translation id="2500374554657206846">পাসওয়ার্ড সেভ করার বিকল্প</translation> <translation id="2523363575747517183">এই ওয়েবসাইটটি ক্রমাগত অন্য অ্যাপ্লিকেশন খোলার চেষ্টা করছে।</translation> @@ -481,7 +480,6 @@ <translation id="7203585745079012652">আবার উত্তরগুলি বলে</translation> <translation id="7265758999917665941">এই সাইটের জন্য কখনই নয়</translation> <translation id="7272437679830969316">আপনার পরিচয় যাচাই করা যাবে না। পাসওয়ার্ড কপি করা হয়নি।</translation> -<translation id="7285236536143823449">হ্যাঁ, আমি রাজি</translation> <translation id="7291368939935408496">পাসওয়ার্ড তৈরি করা হচ্ছে...</translation> <translation id="7293171162284876153">সিঙ্ক চালু করতে "আপনার Chrome ডেটা সিঙ্ক করুন" বিকল্পটি চালু করুন।</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> শতাংশ ডাউনলোড হয়েছে</translation> @@ -497,6 +495,7 @@ <translation id="7460314822154045102">ক্যামেরা ব্যবহার করুন</translation> <translation id="7464701184726199289">এটি সব ডিভাইস থেকে সিঙ্ক হওয়া ডেটা সাফ করবে। সংরক্ষিত সাইটের সেটিংস মোছা হবে না এবং আপনার ব্রাউজিং অভ্যাস প্রতিফলিত হতে পারে। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> <translation id="7472734401283673885">কোম্পানির নাম:</translation> +<translation id="7473891865547856676">না থাক</translation> <translation id="7481312909269577407">ফরওয়ার্ড</translation> <translation id="750493650310597496">০টি নির্বাচিত</translation> <translation id="7514365320538308">ডাউনলোড করুন</translation> @@ -518,7 +517,6 @@ <translation id="7781829728241885113">গতকাল</translation> <translation id="778855399387580014">নতুন Chrome ট্যাবে সার্চ করা শুরু করুন।</translation> <translation id="7791543448312431591">জুড়ুন</translation> -<translation id="780301667611848630">না থাক</translation> <translation id="7840771868269352570">আপনার বেছে নেওয়া আইটেমগুলি সরানো হবে।</translation> <translation id="7856733331829174190">ডাউনলোড করা যায়নি</translation> <translation id="7859704718976024901">ব্রাউজিং ইতিহাস</translation> @@ -588,6 +586,7 @@ <translation id="8870413625673593573">সম্প্রতি বন্ধ হয়েছে</translation> <translation id="8881801611828450202">এই ইমেজটির জন্য <ph name="SEARCH_ENGINE" />-এ খুঁজুন</translation> <translation id="8909135823018751308">শেয়ার করুন...</translation> +<translation id="8917490105272468696">হ্যাঁ, আমি রাজি</translation> <translation id="895541991026785598">কোনও সমস্যা অভিযোগ করুন</translation> <translation id="8976382372951310360">সহায়তা</translation> <translation id="8981454092730389528">Google অ্যাক্টিভিটির নিয়ন্ত্রণগুলি</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 4a15831..809f3eac 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 odabrana</translation> <translation id="2421044535038393232">Nastavi uređivanje</translation> <translation id="2435457462613246316">Prikaži lozinku</translation> -<translation id="2481538920734869610">DODAJ RAČUN</translation> <translation id="2497852260688568942">Sinhronizaciju je onemogućio vaš administrator</translation> <translation id="2500374554657206846">Opcije čuvanja lozinki</translation> <translation id="2523363575747517183">Ova web lokacija neprestano pokušava otvoriti drugu aplikaciju.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Izgovori odgovore</translation> <translation id="7265758999917665941">Nikada za ovu web lokaciju</translation> <translation id="7272437679830969316">Nije moguće potvrditi vaš identitet. Lozinka nije kopirana.</translation> -<translation id="7285236536143823449">PRISTAJEM</translation> <translation id="7291368939935408496">Pripremanje lozinki...</translation> <translation id="7293171162284876153">Da pokrenete sinhroniziranje, uključite "Sinhroniziranje Chrome podataka"</translation> <translation id="7336264872878993241">Preuzeto je <ph name="PERCENT" /> posto</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Koristi kameru</translation> <translation id="7464701184726199289">Ovim se brišu sinhronizirani podaci sa svih uređaja. Sačuvane postavke web lokacije se neće izbrisati i one mogu odražavati vaše navike prilikom pregledanja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Naziv kompanije</translation> +<translation id="7473891865547856676">Ne, hvala</translation> <translation id="7481312909269577407">Proslijedi</translation> <translation id="750493650310597496">Odabrano je 0 oznaka</translation> <translation id="7514365320538308">Preuzmi</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Jučer</translation> <translation id="778855399387580014">Započni pretraživanje na novoj Chrome kartici.</translation> <translation id="7791543448312431591">Dodaj</translation> -<translation id="780301667611848630">Ne, hvala</translation> <translation id="7840771868269352570">Stavke koje ste odabrali će biti uklonjene.</translation> <translation id="7856733331829174190">Preuzimanje nije uspjelo</translation> <translation id="7859704718976024901">Historija pregledanja</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nedavno zatvoreno</translation> <translation id="8881801611828450202">Pretraži <ph name="SEARCH_ENGINE" /> za ovu sliku</translation> <translation id="8909135823018751308">Dijeljenje…</translation> +<translation id="8917490105272468696">Pristajem</translation> <translation id="895541991026785598">Prijavite problem</translation> <translation id="8976382372951310360">Pomoć</translation> <translation id="8981454092730389528">Kontrole aktivnosti na Googleu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 93d98c3..003d2fa5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 seleccionada</translation> <translation id="2421044535038393232">Continua editant</translation> <translation id="2435457462613246316">Mostra la contrasenya</translation> -<translation id="2481538920734869610">AFEGEIX UN COMPTE</translation> <translation id="2497852260688568942">L'administrador ha desactivat la sincronització</translation> <translation id="2500374554657206846">Opcions per desar la contrasenya</translation> <translation id="2523363575747517183">Aquest lloc web està provant d'obrir una altra aplicació repetidament.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Pronuncia les respostes</translation> <translation id="7265758999917665941">Mai per a aquest lloc web</translation> <translation id="7272437679830969316">No es pot verificar la teva identitat. La contrasenya no s'ha copiat.</translation> -<translation id="7285236536143823449">SÍ, HO ACCEPTO</translation> <translation id="7291368939935408496">S'estan preparant les contrasenyes...</translation> <translation id="7293171162284876153">Per iniciar la sincronització, activa l'opció Sincronitza les dades de Chrome.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> per cent baixat</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Utilitza la càmera</translation> <translation id="7464701184726199289">S'esborraran les dades sincronitzades de tots els dispositius. La configuració desada del lloc no se suprimirà i és possible que reflecteixi els vostres hàbits de navegació. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nom de l'empresa</translation> +<translation id="7473891865547856676">No, gràcies</translation> <translation id="7481312909269577407">Endavant</translation> <translation id="750493650310597496">No se n'ha seleccionat cap</translation> <translation id="7514365320538308">Baixa</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ahir</translation> <translation id="778855399387580014">Inicia una cerca en una pestanya nova de Chrome.</translation> <translation id="7791543448312431591">Afegeix</translation> -<translation id="780301667611848630">No, gràcies</translation> <translation id="7840771868269352570">Els elements seleccionats se suprimiran.</translation> <translation id="7856733331829174190">No s'ha pogut baixar</translation> <translation id="7859704718976024901">Historial de navegació</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Tancades recentment</translation> <translation id="8881801611828450202">Cerca aquesta imatge a <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Comparteix...</translation> +<translation id="8917490105272468696">Sí, ho accepto</translation> <translation id="895541991026785598">Informa d'un problema</translation> <translation id="8976382372951310360">Ajuda</translation> <translation id="8981454092730389528">Controls d'activitat de Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index c481f01..1a55cfb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Vybrána 1 fotka</translation> <translation id="2421044535038393232">Pokračovat v úpravách</translation> <translation id="2435457462613246316">Zobrazit heslo</translation> -<translation id="2481538920734869610">PŘIDAT ÚČET</translation> <translation id="2497852260688568942">Synchronizace je administrátorem zakázána.</translation> <translation id="2500374554657206846">Možnosti uložení hesla</translation> <translation id="2523363575747517183">Tento web se opakovaně pokouší otevřít jinou aplikaci.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Vyslovovat odpovědi</translation> <translation id="7265758999917665941">Pro tento web nikdy</translation> <translation id="7272437679830969316">Vaši totožnost nelze ověřit. Heslo nebylo zkopírováno.</translation> -<translation id="7285236536143823449">ANO, ZAPNOUT</translation> <translation id="7291368939935408496">Příprava hesel…</translation> <translation id="7293171162284876153">Chcete-li synchronizaci spustit, zapněte přepínač Synchronizovat data prohlížeče Chrome.</translation> <translation id="7336264872878993241">Staženo <ph name="PERCENT" /> %</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Použít aplikaci Fotoaparát</translation> <translation id="7464701184726199289">Tímto vymažete synchronizovaná data ze všech zařízení. Uložená nastavení webů nebudou smazána a mohou vypovídat o vašich zvycích při prohlížení. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Název společnosti</translation> +<translation id="7473891865547856676">Ne, děkuji</translation> <translation id="7481312909269577407">Vpřed</translation> <translation id="750493650310597496">Vybráno 0</translation> <translation id="7514365320538308">Stáhnout</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Včera</translation> <translation id="778855399387580014">Spustit vyhledávání na nové kartě Chromu.</translation> <translation id="7791543448312431591">Přidat</translation> -<translation id="780301667611848630">Ne, děkuji</translation> <translation id="7840771868269352570">Vybrané položky budou odstraněny.</translation> <translation id="7856733331829174190">Stažení se nezdařilo</translation> <translation id="7859704718976024901">Historie procházení</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nedávno zavřené</translation> <translation id="8881801611828450202">Vyhledat tento obrázek ve službě <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Sdílet…</translation> +<translation id="8917490105272468696">Souhlasím</translation> <translation id="895541991026785598">Nahlásit problém</translation> <translation id="8976382372951310360">Nápověda</translation> <translation id="8981454092730389528">Ovládací prvky aktivity Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index f308ef58..e496e5a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 valgt</translation> <translation id="2421044535038393232">Rediger videre</translation> <translation id="2435457462613246316">Vis adgangskode</translation> -<translation id="2481538920734869610">TILFØJ KONTO</translation> <translation id="2497852260688568942">Synkronisering er deaktiveret af din administrator.</translation> <translation id="2500374554657206846">Valgmuligheder for at gemme adgangskode</translation> <translation id="2523363575747517183">Dette website forsøger hele tiden at åbne en anden app.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Giv talte svar</translation> <translation id="7265758999917665941">Aldrig for dette website</translation> <translation id="7272437679830969316">Din identitet kunne ikke bekræftes. Adgangskoden blev ikke kopieret.</translation> -<translation id="7285236536143823449">JA TAK</translation> <translation id="7291368939935408496">Forbereder adgangskoder...</translation> <translation id="7293171162284876153">Aktivér "Synkroniser dine Chrome-data" for starte synkroniseringen.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> procent er downloadet</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Brug Kamera</translation> <translation id="7464701184726199289">Dette rydder synkroniserede data fra alle enheder. Gemte websiteindstillinger slettes ikke og kan afspejle dine søgevaner. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Virksomhedsnavn</translation> +<translation id="7473891865547856676">Nej tak</translation> <translation id="7481312909269577407">Frem</translation> <translation id="750493650310597496">0 valgt</translation> <translation id="7514365320538308">Download</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">I går</translation> <translation id="778855399387580014">Start en søgning i en ny Chrome-fane.</translation> <translation id="7791543448312431591">Tilføj</translation> -<translation id="780301667611848630">Nej tak</translation> <translation id="7840771868269352570">De valgte elementer fjernes.</translation> <translation id="7856733331829174190">Downloaden mislykkedes</translation> <translation id="7859704718976024901">Browserhistorik</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Senest lukkede</translation> <translation id="8881801611828450202">Søg på <ph name="SEARCH_ENGINE" /> efter dette billede</translation> <translation id="8909135823018751308">Del…</translation> +<translation id="8917490105272468696">Ja tak</translation> <translation id="895541991026785598">Rapportér et problem</translation> <translation id="8976382372951310360">Hjælp</translation> <translation id="8981454092730389528">Aktivitetsadministration på Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 74b1db0..e0fff52 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ausgewählt</translation> <translation id="2421044535038393232">Weiter bearbeiten</translation> <translation id="2435457462613246316">Passwort anzeigen</translation> -<translation id="2481538920734869610">KONTO HINZU</translation> <translation id="2497852260688568942">Die Synchronisierung wurde von Ihrem Administrator deaktiviert</translation> <translation id="2500374554657206846">Optionen zum Speichern von Passwörtern</translation> <translation id="2523363575747517183">Diese Website versucht wiederholt, eine andere App zu öffnen.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Gesprochene Antworten</translation> <translation id="7265758999917665941">Für diese Website niemals</translation> <translation id="7272437679830969316">Ihre Identität konnte nicht bestätigt werden. Das Passwort wurde nicht kopiert.</translation> -<translation id="7285236536143823449">JA, ICH BIN DABEI</translation> <translation id="7291368939935408496">Passwörter werden zum Exportieren vorbereitet…</translation> <translation id="7293171162284876153">Aktivieren Sie "Chrome-Daten synchronisieren", um die Synchronisierung zu starten.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> % heruntergeladen</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Kamera verwenden</translation> <translation id="7464701184726199289">Dadurch werden synchronisierte Daten von allen Geräten gelöscht. Gespeicherte Website-Einstellungen werden nicht gelöscht und können möglicherweise Ihre Surfgewohnheiten wiedergeben. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Unternehmensname</translation> +<translation id="7473891865547856676">Nein danke</translation> <translation id="7481312909269577407">Vorwärts</translation> <translation id="750493650310597496">0 ausgewählt</translation> <translation id="7514365320538308">Herunterladen</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Gestern</translation> <translation id="778855399387580014">Eine Suche in einem neuen Chrome-Tab starten.</translation> <translation id="7791543448312431591">Hinzufügen</translation> -<translation id="780301667611848630">Kein Interesse</translation> <translation id="7840771868269352570">Die ausgewählten Elemente werden entfernt.</translation> <translation id="7856733331829174190">Fehler beim Download</translation> <translation id="7859704718976024901">Browserverlauf</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Kürzlich geschlossen</translation> <translation id="8881801611828450202">In <ph name="SEARCH_ENGINE" /> nach dem Bild suchen</translation> <translation id="8909135823018751308">Teilen...</translation> +<translation id="8917490105272468696">Ja, bitte</translation> <translation id="895541991026785598">Problem melden</translation> <translation id="8976382372951310360">Hilfe</translation> <translation id="8981454092730389528">Google-Aktivitätseinstellungen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index f81d35d..5a57ac5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Έχει επιλεγεί 1 φωτογραφία</translation> <translation id="2421044535038393232">Συνέχιση επεξεργασίας</translation> <translation id="2435457462613246316">Εμφάνιση κωδικού πρόσβασης</translation> -<translation id="2481538920734869610">ΠΡΟΣΘΗΚΗ ΛΟΓΑΡΙΑΣΜΟΥ</translation> <translation id="2497852260688568942">Ο συγχρονισμός έχει απενεργοποιηθεί από τον διαχειριστή σας</translation> <translation id="2500374554657206846">Επιλογές για την αποθήκευση κωδικού πρόσβασης</translation> <translation id="2523363575747517183">Αυτός ο ιστότοπος προσπαθεί επανειλημμένως να ανοίξει κάποια άλλη εφαρμογή.</translation> @@ -481,7 +480,6 @@ <translation id="7203585745079012652">Εκφώνηση απαντήσεων</translation> <translation id="7265758999917665941">Ποτέ για αυτόν τον ιστότοπο</translation> <translation id="7272437679830969316">Δεν είναι δυνατή η επαλήθευση της ταυτότητας σας. Ο κωδικός πρόσβασης δεν αντιγράφηκε.</translation> -<translation id="7285236536143823449">ΝΑΙ, ΣΥΜΦΩΝΩ</translation> <translation id="7291368939935408496">Προετοιμασία κωδικών πρόσβασης…</translation> <translation id="7293171162284876153">Για να ξεκινήσετε τον συγχρονισμό, ενεργοποιήστε την επιλογή "Συγχρονισμός των δεδομένων του Chrome".</translation> <translation id="7336264872878993241">Έγινε λήψη του <ph name="PERCENT" /> τοις εκατό</translation> @@ -497,6 +495,7 @@ <translation id="7460314822154045102">Χρήση κάμερας</translation> <translation id="7464701184726199289">Διαγράφει τα συγχρονισμένα δεδομένα από όλες τις συσκευές. Οι αποθηκευμένες ρυθμίσεις ιστότοπου δεν θα διαγραφούν και ενδέχεται να υποδεικνύουν τις συνήθειες περιήγησής σας. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Επων. εταιρείας</translation> +<translation id="7473891865547856676">Όχι, ευχαριστώ</translation> <translation id="7481312909269577407">Προώθηση</translation> <translation id="750493650310597496">0 στοιχεία επιλεγμένα</translation> <translation id="7514365320538308">Λήψη</translation> @@ -518,7 +517,6 @@ <translation id="7781829728241885113">Χθες</translation> <translation id="778855399387580014">Ξεκινήστε μια αναζήτηση σε μια νέα καρτέλα Chrome.</translation> <translation id="7791543448312431591">Προσθήκη</translation> -<translation id="780301667611848630">Όχι, ευχαριστώ</translation> <translation id="7840771868269352570">Τα στοιχεία που επιλέξατε θα καταργηθούν.</translation> <translation id="7856733331829174190">Δεν ήταν δυνατή η λήψη</translation> <translation id="7859704718976024901">Ιστορικό περιήγησης</translation> @@ -588,6 +586,7 @@ <translation id="8870413625673593573">Έκλεισαν πρόσφατα</translation> <translation id="8881801611828450202">Αναζήτηση εικόνας σε <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Κοινοποίηση…</translation> +<translation id="8917490105272468696">Ναι, συμφωνώ</translation> <translation id="895541991026785598">Αναφορά προβλήματος</translation> <translation id="8976382372951310360">Βοήθεια</translation> <translation id="8981454092730389528">Στοιχεία ελέγχου δραστηριότητας Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 4d9c4463..f9b9faf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 selected</translation> <translation id="2421044535038393232">Keep editing</translation> <translation id="2435457462613246316">Show password</translation> -<translation id="2481538920734869610">ADD ACCOUNT</translation> <translation id="2497852260688568942">Sync is disabled by your administrator</translation> <translation id="2500374554657206846">Options to save password</translation> <translation id="2523363575747517183">This website is repeatedly trying to open another application.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Speak Answers Back</translation> <translation id="7265758999917665941">Never for this site</translation> <translation id="7272437679830969316">Can't verify your identity. Password not copied.</translation> -<translation id="7285236536143823449">YES, I'M IN</translation> <translation id="7291368939935408496">Preparing Passwords…</translation> <translation id="7293171162284876153">To start sync, turn on 'Sync your Chrome data'.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> percent downloaded</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Use camera</translation> <translation id="7464701184726199289">This clears synced data from all devices. Saved site settings will not be deleted and may reflect your browsing habits. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Company Name</translation> +<translation id="7473891865547856676">No, thanks</translation> <translation id="7481312909269577407">Forward</translation> <translation id="750493650310597496">0 selected</translation> <translation id="7514365320538308">Download</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Yesterday</translation> <translation id="778855399387580014">Start a search in a new Chrome tab.</translation> <translation id="7791543448312431591">Add</translation> -<translation id="780301667611848630">No, thanks</translation> <translation id="7840771868269352570">The items that you selected will be removed.</translation> <translation id="7856733331829174190">Couldn't download</translation> <translation id="7859704718976024901">Browsing history</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Recently Closed</translation> <translation id="8881801611828450202">Search <ph name="SEARCH_ENGINE" /> for This Image</translation> <translation id="8909135823018751308">Share…</translation> +<translation id="8917490105272468696">Yes, I'm In</translation> <translation id="895541991026785598">Report an Issue</translation> <translation id="8976382372951310360">Help</translation> <translation id="8981454092730389528">Google Activity Controls</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index e9ed7ed8..319d99d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 foto seleccionada</translation> <translation id="2421044535038393232">Seguir editando</translation> <translation id="2435457462613246316">Mostrar contraseña</translation> -<translation id="2481538920734869610">AGREGAR CUENTA</translation> <translation id="2497852260688568942">Tu administrador inhabilitó la sincronización</translation> <translation id="2500374554657206846">Opciones para guardar contraseñas</translation> <translation id="2523363575747517183">Este sitio web está intentando abrir otra app de forma reiterada.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Decir las respuestas</translation> <translation id="7265758999917665941">Nunca para este sitio</translation> <translation id="7272437679830969316">No se puede verificar tu identidad. La contraseña no se copió.</translation> -<translation id="7285236536143823449">SÍ, ACEPTO</translation> <translation id="7291368939935408496">Preparando las contraseñas…</translation> <translation id="7293171162284876153">Para comenzar la sincronización, activa "Sincroniza tus datos de Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> % descargado</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Usar la cámara</translation> <translation id="7464701184726199289">Esta opción borra los datos sincronizados en todos los dispositivos. Las opciones de configuración de sitios guardadas no se borrarán y es posible que reflejen tus hábitos de navegación. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nombre de empresa</translation> +<translation id="7473891865547856676">No, gracias</translation> <translation id="7481312909269577407">Reenviar</translation> <translation id="750493650310597496">0 seleccionados</translation> <translation id="7514365320538308">Descargar</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ayer</translation> <translation id="778855399387580014">Realiza una búsqueda en una nueva pestaña de Chrome.</translation> <translation id="7791543448312431591">Agregar</translation> -<translation id="780301667611848630">No, gracias</translation> <translation id="7840771868269352570">Se quitarán los elementos seleccionados.</translation> <translation id="7856733331829174190">No se pudo descargar</translation> <translation id="7859704718976024901">Historial de navegación</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Cerrado recientemente</translation> <translation id="8881801611828450202">Buscar esta imagen en <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Compartir…</translation> +<translation id="8917490105272468696">Acepto</translation> <translation id="895541991026785598">Informar de un problema</translation> <translation id="8976382372951310360">Ayuda</translation> <translation id="8981454092730389528">Controles de actividad de Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index ece4fff..b1be089 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 foto seleccionada</translation> <translation id="2421044535038393232">Seguir editando</translation> <translation id="2435457462613246316">Mostrar contraseña</translation> -<translation id="2481538920734869610">AÑADIR CUENTA</translation> <translation id="2497852260688568942">El administrador ha inhabilitado la sincronización</translation> <translation id="2500374554657206846">Opciones para guardar las contraseñas</translation> <translation id="2523363575747517183">Este sitio web está intentando abrir otra aplicación reiteradamente.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Decir las respuestas</translation> <translation id="7265758999917665941">Jamás para este sitio web</translation> <translation id="7272437679830969316">No se puede verificar tu identidad. No se ha copiado la contraseña.</translation> -<translation id="7285236536143823449">SÍ, ACEPTO</translation> <translation id="7291368939935408496">Preparando contraseñas...</translation> <translation id="7293171162284876153">Para iniciar la sincronización, activa "Sincronizar tus datos de Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" />% descargado</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Utilizar la cámara</translation> <translation id="7464701184726199289">Se borrarán los datos sincronizados de todos los dispositivos. No se eliminará la configuración guardada de los sitios web, lo cual puede reflejar tus hábitos de navegación. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nombre de empresa</translation> +<translation id="7473891865547856676">No, gracias</translation> <translation id="7481312909269577407">Adelante</translation> <translation id="750493650310597496">0 seleccionados</translation> <translation id="7514365320538308">Descargar</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ayer</translation> <translation id="778855399387580014">Inicia una búsqueda en una nueva pestaña de Chrome.</translation> <translation id="7791543448312431591">Añadir</translation> -<translation id="780301667611848630">No, gracias</translation> <translation id="7840771868269352570">Se eliminarán los elementos que hayas seleccionado.</translation> <translation id="7856733331829174190">No se ha podido descargar</translation> <translation id="7859704718976024901">Historial de navegación</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Cerrado recientemente</translation> <translation id="8881801611828450202">Buscar esta imagen en <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Compartir…</translation> +<translation id="8917490105272468696">Sí, acepto</translation> <translation id="895541991026785598">Notificar un problema</translation> <translation id="8976382372951310360">Ayuda</translation> <translation id="8981454092730389528">Gestión de tu actividad en Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 37e544c..3eb6560 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 on valitud</translation> <translation id="2421044535038393232">Jätka töötlemist</translation> <translation id="2435457462613246316">Kuva parool</translation> -<translation id="2481538920734869610">LISA KONTO</translation> <translation id="2497852260688568942">Administraator on sünkroonimise keelanud</translation> <translation id="2500374554657206846">Valikud parooli salvestamiseks</translation> <translation id="2523363575747517183">See veebisait üritab korduvalt avada teist rakendust.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Vastuste esitamine</translation> <translation id="7265758999917665941">Selle saidi puhul mitte kunagi</translation> <translation id="7272437679830969316">Teie isikut ei õnnestu tuvastada. Parooli ei kopeeritud.</translation> -<translation id="7285236536143823449">JAH, SOBIB</translation> <translation id="7291368939935408496">Paroolide ettevalmistamine …</translation> <translation id="7293171162284876153">Sünkroonimise alustamiseks lülitage sisse valik „Chrome'i andmete sünkroonimine”.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> protsenti on alla laaditud</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Kasuta kaamerat</translation> <translation id="7464701184726199289">See kustutab sünkroonitud andmed kõikidest seadmetest. Saitide salvestatud seadeid ei kustutata ja need võivad kajastada teie sirvimisharjumusi. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Ettevõtte nimi</translation> +<translation id="7473891865547856676">Tänan, ei</translation> <translation id="7481312909269577407">Edasta</translation> <translation id="750493650310597496">0 valitud</translation> <translation id="7514365320538308">Laadi alla</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Eile</translation> <translation id="778855399387580014">Alustage otsingut uuel Chrome'i vahelehel.</translation> <translation id="7791543448312431591">Lisa</translation> -<translation id="780301667611848630">Ei, aitäh</translation> <translation id="7840771868269352570">Teie valitud üksused eemaldatakse.</translation> <translation id="7856733331829174190">Ei saanud alla laadida</translation> <translation id="7859704718976024901">Sirvimisajalugu</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Viimati suletud</translation> <translation id="8881801611828450202">Otsi pilti teenusest <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Jaga ...</translation> +<translation id="8917490105272468696">Jah, olen nõus</translation> <translation id="895541991026785598">Teavitage probleemist</translation> <translation id="8976382372951310360">Abi</translation> <translation id="8981454092730389528">Google'i kontotegevuste haldus</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 20a7189..9ad8d7e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Bat hautatu da</translation> <translation id="2421044535038393232">Jarraitu editatzen</translation> <translation id="2435457462613246316">Erakutsi pasahitza</translation> -<translation id="2481538920734869610">GEHITU KONTU BAT</translation> <translation id="2497852260688568942">Administratzaileak sinkronizazioa desgaitu du</translation> <translation id="2500374554657206846">Pasahitza gordetzeko aukerak</translation> <translation id="2523363575747517183">Webgunea behin eta berriz saiatzen ari da beste aplikazio bat irekitzen.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Erantzun ahots bidez</translation> <translation id="7265758999917665941">Inoiz ez webgune honetan</translation> <translation id="7272437679830969316">Ezin da egiaztatu identitatea. Ez da kopiatu pasahitza.</translation> -<translation id="7285236536143823449">BAI, ADOS</translation> <translation id="7291368939935408496">Pasahitzak prestatzen…</translation> <translation id="7293171162284876153">Sinkronizatzen hasteko, aktibatu "Sinkronizatu Chrome-ko datuak".</translation> <translation id="7336264872878993241">% <ph name="PERCENT" /> deskargatu da</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Erabili kamera</translation> <translation id="7464701184726199289">Gailu guztien datu sinkronizatuak garbituko dira. Ez dira ezabatuko webgunearen gordetako ezarpenak, eta baliteke arakatze-ohiturak islatzea. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Enpresaren izena</translation> +<translation id="7473891865547856676">Ez, eskerrik asko</translation> <translation id="7481312909269577407">Aurrera</translation> <translation id="750493650310597496">Ez da bat ere hautatu</translation> <translation id="7514365320538308">Deskargatu</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Atzo</translation> <translation id="778855399387580014">Hasi bilaketa Chrome-ren fitxa berri batean.</translation> <translation id="7791543448312431591">Gehitu</translation> -<translation id="780301667611848630">Ez, eskerrik asko</translation> <translation id="7840771868269352570">Kendu egingo dira hautatutako elementuak.</translation> <translation id="7856733331829174190">Ezin izan da deskargatu</translation> <translation id="7859704718976024901">Arakatze-historia</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Itxitako azkenak</translation> <translation id="8881801611828450202">Bilatu irudia <ph name="SEARCH_ENGINE" /> bilatzailean</translation> <translation id="8909135823018751308">Partekatu…</translation> +<translation id="8917490105272468696">Bai, ados</translation> <translation id="895541991026785598">Jakinarazi arazo bat</translation> <translation id="8976382372951310360">Laguntza</translation> <translation id="8981454092730389528">Google-ko jarduerak kontrolatzeko aukerak</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index efb88658..ad13796 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">۱ مورد انتخاب شد</translation> <translation id="2421044535038393232">ادامه ویرایش</translation> <translation id="2435457462613246316">نمایش گذرواژه</translation> -<translation id="2481538920734869610">افزودن حساب</translation> <translation id="2497852260688568942">سرپرستتان همگامسازی را غیرفعال کرده است</translation> <translation id="2500374554657206846">گزینههایی برای ذخیره گذرواژه</translation> <translation id="2523363575747517183">این وبسایت بهطور مکرر تلاش میکند برنامه دیگری را باز کند.</translation> @@ -460,7 +459,7 @@ <translation id="6945221475159498467">انتخاب</translation> <translation id="6973630695168034713">پوشهها</translation> <translation id="6979158407327259162">Google Drive</translation> -<translation id="6988572888918530647">مدیریت حساب Google</translation> +<translation id="6988572888918530647">مدیریت «حساب Google»</translation> <translation id="6995899638241819463">اگر گذرواژهها به دلیل نقض داده لو رفته باشد، هشدار میدهد</translation> <translation id="6998989275928107238">به</translation> <translation id="7004499039102548441">برگههای جدید</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">پاسخ گفتاری</translation> <translation id="7265758999917665941">هرگز برای این سایت</translation> <translation id="7272437679830969316">نمیتوانیم هویتتان را به تأیید برسانیم. گذرواژه کپی نشد.</translation> -<translation id="7285236536143823449">بله، موافقم</translation> <translation id="7291368939935408496">درحال آمادهسازی گذرواژهها…</translation> <translation id="7293171162284876153">برای شروع همگامسازی، «همگامسازی دادههای Chrome» را روشن کنید.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> درصد بارگیری شد</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">استفاده از دوربین</translation> <translation id="7464701184726199289">با این کار دادههای همگامسازیشده در همه دستگاهها پاک میشوند. تنظیمات ذخیرهشده سایت حذف نمیشوند و احتمالاً عادات مرور شما را نشان میدهند. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="7472734401283673885">نام شرکت</translation> +<translation id="7473891865547856676">نه متشکرم</translation> <translation id="7481312909269577407">ارسال کردن</translation> <translation id="750493650310597496">۰ نشانک انتخاب شده است</translation> <translation id="7514365320538308">بارگیری</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">دیروز</translation> <translation id="778855399387580014">جستجویی در برگه Chrome جدیدی شروع کنید.</translation> <translation id="7791543448312431591">افزودن</translation> -<translation id="780301667611848630">نه متشکرم</translation> <translation id="7840771868269352570">موارد انتخابشده برداشته خواهد شد.</translation> <translation id="7856733331829174190">بارگیری نشد</translation> <translation id="7859704718976024901">سابقه مرور</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">اخیراً بستهشده</translation> <translation id="8881801611828450202">جستجوی <ph name="SEARCH_ENGINE" /> برای این تصویر</translation> <translation id="8909135823018751308">اشتراکگذاری...</translation> +<translation id="8917490105272468696">بله، موافقم</translation> <translation id="895541991026785598">گزارش یک مسئله</translation> <translation id="8976382372951310360">راهنما</translation> <translation id="8981454092730389528">کنترلهای فعالیت Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 232afe2..fdba7410 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 valittu</translation> <translation id="2421044535038393232">Jatka muokkausta</translation> <translation id="2435457462613246316">Näytä salasana</translation> -<translation id="2481538920734869610">LISÄÄ TILI</translation> <translation id="2497852260688568942">Järjestelmänvalvoja on poistanut synkronoinnin käytöstä.</translation> <translation id="2500374554657206846">Salasanan tallentamisen vaihtoehdot</translation> <translation id="2523363575747517183">Tämä sivusto yrittää toistuvasti avata toisen sovelluksen.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Puhu vastaukset</translation> <translation id="7265758999917665941">Ei koskaan tälle sivustolle</translation> <translation id="7272437679830969316">Henkilöllisyytesi vahvistaminen ei onnistunut. Salasanaa ei kopioitu.</translation> -<translation id="7285236536143823449">KYLLÄ</translation> <translation id="7291368939935408496">Valmistellaan salasanoja…</translation> <translation id="7293171162284876153">Aloita synkronointi ottamalla Chrome-datan synkronointi käyttöön.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> prosenttia ladattu</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Käytä kameraa</translation> <translation id="7464701184726199289">Synkronoidut tiedot poistetaan kaikilta laitteilta. Tallennettuja sivustoasetuksia ei poisteta, ja ne saattavat sisältää tietoa selaustavoistasi. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Yrityksen nimi</translation> +<translation id="7473891865547856676">Ei kiitos</translation> <translation id="7481312909269577407">Seuraava</translation> <translation id="750493650310597496">0 valittu</translation> <translation id="7514365320538308">Lataa</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Eilen</translation> <translation id="778855399387580014">Aloita haku Chrome-välilehdellä.</translation> <translation id="7791543448312431591">Lisää</translation> -<translation id="780301667611848630">Ei kiitos</translation> <translation id="7840771868269352570">Valitut kohteet poistetaan</translation> <translation id="7856733331829174190">Lataus epäonnistui</translation> <translation id="7859704718976024901">Selaushistoria</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Hiljattain suljetut</translation> <translation id="8881801611828450202">Hae kuvaa seuraavasta palvelusta: <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Jaa…</translation> +<translation id="8917490105272468696">Kyllä</translation> <translation id="895541991026785598">Ilmoita ongelmasta</translation> <translation id="8976382372951310360">Ohje</translation> <translation id="8981454092730389528">Googlen toimintojen hallinta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 105f8d0..2e0d0342 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ang napili</translation> <translation id="2421044535038393232">Magpatuloy sa Pag-edit</translation> <translation id="2435457462613246316">Ipakita ang password</translation> -<translation id="2481538920734869610">MAGDAGDAG NG ACCOUNT</translation> <translation id="2497852260688568942">Na-disable ng iyong administrator ang pag-sync</translation> <translation id="2500374554657206846">Mga Opsyon para Mag-save ng Password</translation> <translation id="2523363575747517183">Paulit-ulit na sinusubukang buksan ng website na ito ang isa pang application.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Bigkasin ang Mga Sagot</translation> <translation id="7265758999917665941">Hindi Kailanman Para sa Site na Ito</translation> <translation id="7272437679830969316">Hindi ma-verify ang iyong pagkakakilanlan. Hindi nakopya ang password.</translation> -<translation id="7285236536143823449">OO, SASALI AKO</translation> <translation id="7291368939935408496">Inihahanda ang Mga Password...</translation> <translation id="7293171162284876153">Para simulan ang pag-sync, i-on ang "I-sync ang iyong data sa Chrome."</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> (na) porsyento ang na-download na</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Gamitin ang Camera</translation> <translation id="7464701184726199289">Maki-clear nito ang mga naka-sync na data mula sa lahat ng device. Hindi made-delete ang mga naka-save na setting ng site at maaari nitong ipakita ang iyong mga gawi sa pagba-browse. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Pangalan ng Kumpanya</translation> +<translation id="7473891865547856676">Hindi, Salamat</translation> <translation id="7481312909269577407">Sumulong</translation> <translation id="750493650310597496">0 ang napili</translation> <translation id="7514365320538308">I-download</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Kahapon</translation> <translation id="778855399387580014">Start a search in a new Chrome tab.</translation> <translation id="7791543448312431591">Idagdag</translation> -<translation id="780301667611848630">Hindi salamat</translation> <translation id="7840771868269352570">Maaalis ang mga pinili mong item.</translation> <translation id="7856733331829174190">Hindi Ma-download</translation> <translation id="7859704718976024901">History ng Pag-browse</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Recently Closed</translation> <translation id="8881801611828450202">Hanapin sa <ph name="SEARCH_ENGINE" /> ang Larawang Ito</translation> <translation id="8909135823018751308">Ibahagi…</translation> +<translation id="8917490105272468696">Oo, Tinatanggap Ko</translation> <translation id="895541991026785598">Mag-ulat ng Isyu</translation> <translation id="8976382372951310360">Tulong</translation> <translation id="8981454092730389528">Mga Kontrol ng Aktibidad ng Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 4612b98b..987fa15 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 sélectionné</translation> <translation id="2421044535038393232">Continuer à modifier</translation> <translation id="2435457462613246316">Affich. mot de passe</translation> -<translation id="2481538920734869610">AJOUTER UN COMPTE</translation> <translation id="2497852260688568942">La synchronisation est désactivée par votre administrateur</translation> <translation id="2500374554657206846">Options d'enregistrement des mots de passe</translation> <translation id="2523363575747517183">Ce site Web a tenté plusieurs fois d'ouvrir une autre application.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Réponses vocales</translation> <translation id="7265758999917665941">Jamais pour ce site</translation> <translation id="7272437679830969316">Impossible de vérifier votre identité. Le mot de passe n'a pas été copié.</translation> -<translation id="7285236536143823449">OUI, J'ACCEPTE</translation> <translation id="7291368939935408496">Préparation des mots de passe en cours…</translation> <translation id="7293171162284876153">Pour démarrer la synchronisation, activez l'option « Synchroniser vos données Chrome ».</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> pour cent téléchargé(s)</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Utiliser l'appareil photo</translation> <translation id="7464701184726199289">Les données synchronisées seront supprimées de tous les appareils. Les paramètres de site sauvegardés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nom d'entreprise</translation> +<translation id="7473891865547856676">Non merci</translation> <translation id="7481312909269577407">Suivant</translation> <translation id="750493650310597496">0 sélectionné</translation> <translation id="7514365320538308">Télécharger</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Hier</translation> <translation id="778855399387580014">Lancez une recherche dans un nouvel onglet Chrome.</translation> <translation id="7791543448312431591">Ajouter</translation> -<translation id="780301667611848630">Non merci</translation> <translation id="7840771868269352570">Les éléments sélectionnés seront supprimés.</translation> <translation id="7856733331829174190">Échec du téléchargement</translation> <translation id="7859704718976024901">Historique de navigation</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Éléments récemment fermés</translation> <translation id="8881801611828450202">Rechercher cette image avec <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Partager...</translation> +<translation id="8917490105272468696">Oui, j'accepte</translation> <translation id="895541991026785598">Signaler un problème</translation> <translation id="8976382372951310360">Aide</translation> <translation id="8981454092730389528">Commandes d'activité Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index e073328..da593ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 photo sélectionnée</translation> <translation id="2421044535038393232">Poursuivre les modifications</translation> <translation id="2435457462613246316">Afficher le mot de passe</translation> -<translation id="2481538920734869610">AJOUTER UN COMPTE</translation> <translation id="2497852260688568942">Votre administrateur a désactivé la synchronisation</translation> <translation id="2500374554657206846">Options d'enregistrement des mots de passe</translation> <translation id="2523363575747517183">Ce site Web a tenté à plusieurs reprises d'ouvrir une autre application.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Énoncer les réponses</translation> <translation id="7265758999917665941">Jamais pour ce site</translation> <translation id="7272437679830969316">Impossible de confirmer votre identité. Mot de passe non copié.</translation> -<translation id="7285236536143823449">OUI, J'ACCEPTE</translation> <translation id="7291368939935408496">Préparation des mots de passe…</translation> <translation id="7293171162284876153">Pour lancer la synchronisation, activez l'option "Synchroniser vos données Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> % téléchargés</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Utiliser la caméra</translation> <translation id="7464701184726199289">Les données synchronisées seront effacées de tous les appareils. Les paramètres de site enregistrés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nom de la société</translation> +<translation id="7473891865547856676">Non, merci</translation> <translation id="7481312909269577407">Avancer</translation> <translation id="750493650310597496">Aucun favori sélectionné.</translation> <translation id="7514365320538308">Télécharger</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Hier</translation> <translation id="778855399387580014">Lancer une recherche dans un nouvel onglet Chrome.</translation> <translation id="7791543448312431591">Ajouter</translation> -<translation id="780301667611848630">Non merci</translation> <translation id="7840771868269352570">Les éléments sélectionnés seront supprimés.</translation> <translation id="7856733331829174190">Téléchargement impossible</translation> <translation id="7859704718976024901">Historique de navigation</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Récemment fermés</translation> <translation id="8881801611828450202">Chercher cette image sur <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Partager…</translation> +<translation id="8917490105272468696">J'accepte</translation> <translation id="895541991026785598">Signaler un problème</translation> <translation id="8976382372951310360">Aide</translation> <translation id="8981454092730389528">Commandes Google relatives à l'activité</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index b65a3706..7f7d2ff 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Seleccionouse un</translation> <translation id="2421044535038393232">Seguir editando</translation> <translation id="2435457462613246316">Mostrar contrasinal</translation> -<translation id="2481538920734869610">ENGADIR CONTA</translation> <translation id="2497852260688568942">O administrador desactivou a sincronización</translation> <translation id="2500374554657206846">Opcións para gardar contrasinais</translation> <translation id="2523363575747517183">Este sitio web está tentando abrir outra aplicación.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Dicir as respostas</translation> <translation id="7265758999917665941">Nunca neste sitio</translation> <translation id="7272437679830969316">Non se pode verificar a túa identidade, polo que non se copiou o contrasinal.</translation> -<translation id="7285236536143823449">SI, ACEPTO</translation> <translation id="7291368939935408496">Preparando contrasinais…</translation> <translation id="7293171162284876153">Para iniciar a sincronización, activa a opción Sincronizar os teus datos de Chrome.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> por cento descargado</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Usar cámara</translation> <translation id="7464701184726199289">Esta acción borra os datos sincronizados de todos os dispositivos. As opcións de configuración dos sitios gardados non se eliminarán e quizais se reflictan os teus hábitos de navegación. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nome da empresa</translation> +<translation id="7473891865547856676">Non, grazas</translation> <translation id="7481312909269577407">Adiante</translation> <translation id="750493650310597496">0 seleccionados</translation> <translation id="7514365320538308">Descargar</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Onte</translation> <translation id="778855399387580014">Inicia unha busca nunha nova pestana de Chrome.</translation> <translation id="7791543448312431591">Engadir</translation> -<translation id="780301667611848630">Non, grazas</translation> <translation id="7840771868269352570">Quitaranse os elementos seleccionados.</translation> <translation id="7856733331829174190">Non se puido descargar o ficheiro</translation> <translation id="7859704718976024901">Historial de navegación</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Pechados recentemente</translation> <translation id="8881801611828450202">Buscar esta imaxe en <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Compartir...</translation> +<translation id="8917490105272468696">Si, acepto</translation> <translation id="895541991026785598">Informar dun problema</translation> <translation id="8976382372951310360">Axuda</translation> <translation id="8981454092730389528">Controis de actividade de Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index da15a6ad..77a86aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 પસંદ કર્યું છે</translation> <translation id="2421044535038393232">ફેરફાર કરતા રહો</translation> <translation id="2435457462613246316">પાસવર્ડ બતાવો</translation> -<translation id="2481538920734869610">એકાઉન્ટ ઉમેરો</translation> <translation id="2497852260688568942">સમન્વયન, તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરવામાં આવ્યું છે</translation> <translation id="2500374554657206846">પાસવર્ડ સાચવવાના વિકલ્પો</translation> <translation id="2523363575747517183">આ વેબસાઇટ વારંવાર અન્ય ઍપ્લિકેશન ખોલવાનો પ્રયાસ કરી રહી છે.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">જવાબો પાછા બોલો</translation> <translation id="7265758999917665941">આ સાઇટ માટે ક્યારેય નહીં</translation> <translation id="7272437679830969316">તમારી ઓળખની ચકાસણી કરી શકાતી નથી. પાસવર્ડ કૉપિ કરેલો નથી.</translation> -<translation id="7285236536143823449">હા, હું સંમત છું</translation> <translation id="7291368939935408496">પાસવર્ડ તૈયાર કરી રહ્યાં છીએ…</translation> <translation id="7293171162284876153">સિંક શરુ કરવા માટે, "તમારો Chromeનો ડેટા સિંક કરો" ચાલુ કરો.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ટકા ડાઉનલોડ થઈ</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">કૅમેરાનો ઉપયોગ કરો</translation> <translation id="7464701184726199289">આનાથી તમામ ઉપકરણોમાંથી સમન્વયિત ડેટા સાફ થાય છે. સાચવેલ સાઇટ સેટિંગ્સ કાઢી નાખવામાં આવશે નહીં અને તે તમારી બ્રાઉઝિંગ ટેવોને પ્રતિબિંબિત કરી શકે છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="7472734401283673885">કંપનીનું નામ</translation> +<translation id="7473891865547856676">નહીં આભાર</translation> <translation id="7481312909269577407">ફોર્વર્ડ કરો</translation> <translation id="750493650310597496">0 પસંદ કર્યાં</translation> <translation id="7514365320538308">ડાઉનલોડ કરો</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ગઈ કાલે</translation> <translation id="778855399387580014">નવા Chrome ટૅબમાં શોધ શરૂ કરો.</translation> <translation id="7791543448312431591">ઉમેરો</translation> -<translation id="780301667611848630">નહીં, આભાર</translation> <translation id="7840771868269352570">તમે પસંદ કરેલી આઇટમ કાઢી નાખવામાં આવશે.</translation> <translation id="7856733331829174190">ડાઉનલોડ ન કરી શક્યાં</translation> <translation id="7859704718976024901">બ્રાઉઝિંગ ઇતિહાસ</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">તાજેતરમાં બંધ કરેલા</translation> <translation id="8881801611828450202"><ph name="SEARCH_ENGINE" /> પર આ છબી શોધો</translation> <translation id="8909135823018751308">શેર કરો…</translation> +<translation id="8917490105272468696">હા, હું સંમત છું</translation> <translation id="895541991026785598">સમસ્યાની જાણ કરો</translation> <translation id="8976382372951310360">સહાય</translation> <translation id="8981454092730389528">Google પ્રવૃત્તિ નિયંત્રણો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index ea475a1..ecda55e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 चयनित</translation> <translation id="2421044535038393232">बदलाव करते रहें</translation> <translation id="2435457462613246316">पासवर्ड दिखाएं</translation> -<translation id="2481538920734869610">खाता जोड़ें</translation> <translation id="2497852260688568942">सिंक को आपके व्यवस्थापक ने अक्षम कर दिया है</translation> <translation id="2500374554657206846">पासवर्ड सेव करने के विकल्प</translation> <translation id="2523363575747517183">यह वेबसाइट बार-बार किसी दूसरे ऐप्लिकेशन को खोलने की कोशिश कर रही है.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">उत्तर फिर से बोलें</translation> <translation id="7265758999917665941">इस साइट के लिए कभी नहीं</translation> <translation id="7272437679830969316">आपकी पहचान की पुष्टि नहीं हो पा रही है. पासवर्ड कॉपी नहीं हुआ.</translation> -<translation id="7285236536143823449">हां, मैं तैयार हूं</translation> <translation id="7291368939935408496">पासवर्ड तैयार हो रहे हैं...</translation> <translation id="7293171162284876153">सिंक शुरू करने के लिए, "अपना Chrome डेटा सिंक करें" को चालू करें.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> प्रतिशत डाउनलोड हो गई</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">कैमरा इस्तेमाल करें</translation> <translation id="7464701184726199289">इससे सभी डिवाइस में समन्वयित डेटा साफ़ हो जाता है. सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="7472734401283673885">कंपनी का नाम</translation> +<translation id="7473891865547856676">नहीं, रहने दें</translation> <translation id="7481312909269577407">आगे जाएं</translation> <translation id="750493650310597496">0 चयनित</translation> <translation id="7514365320538308">डाउनलोड करें</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">बीता कल</translation> <translation id="778855399387580014">नए Chrome टैब में खोज शुरू करें.</translation> <translation id="7791543448312431591">जोड़ें</translation> -<translation id="780301667611848630">नहीं, रहने दें</translation> <translation id="7840771868269352570">आपके चुने हुए आइटम हटा दिए जाएंगे.</translation> <translation id="7856733331829174190">डाउनलोड नहीं की जा सकी</translation> <translation id="7859704718976024901">ब्राउज़िंग इतिहास</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">हाल ही में बंद किए गए</translation> <translation id="8881801611828450202">इस इमेज को <ph name="SEARCH_ENGINE" /> पर खोजें</translation> <translation id="8909135823018751308">शेयर करें…</translation> +<translation id="8917490105272468696">हां, मैं सहमत हूं</translation> <translation id="895541991026785598">किसी समस्या की रिपोर्ट करें</translation> <translation id="8976382372951310360">सहायता</translation> <translation id="8981454092730389528">Google गतिविधि नियंत्रण</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 5be436da..e5d7110 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 odabrana</translation> <translation id="2421044535038393232">Nastavi uređivati</translation> <translation id="2435457462613246316">Pokaži zaporku</translation> -<translation id="2481538920734869610">DODAJ RAČUN</translation> <translation id="2497852260688568942">Administrator je onemogućio sinkronizaciju</translation> <translation id="2500374554657206846">Opcije za spremanje zaporki</translation> <translation id="2523363575747517183">Ova web-lokacija opetovano pokušava otvoriti neku drugu aplikaciju.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Izgovaranje odgovora</translation> <translation id="7265758999917665941">Nikad za ovu web lokaciju</translation> <translation id="7272437679830969316">Potvrda identiteta nije moguća. Zaporka nije kopirana.</translation> -<translation id="7285236536143823449">DA, U REDU</translation> <translation id="7291368939935408496">Priprema zaporki...</translation> <translation id="7293171162284876153">Da biste pokrenuli sinkronizaciju, uključite postavku "Sinkroniziraj podatke s Chromea".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> posto preuzeto</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Koristi Kameru</translation> <translation id="7464701184726199289">Sinkronizirani podaci izbrisat će se sa svih uređaja. Spremljene postavke web-lokacije neće se izbrisati i mogu odražavati vaše navike prilikom pregledavanja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Naziv tvrtke</translation> +<translation id="7473891865547856676">Ne, hvala</translation> <translation id="7481312909269577407">Naprijed</translation> <translation id="750493650310597496">Nije odabrana nijedna oznaka</translation> <translation id="7514365320538308">Preuzmi</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Danas</translation> <translation id="778855399387580014">Pokrenite pretraživanje u novoj kartici Chromea.</translation> <translation id="7791543448312431591">Dodaj</translation> -<translation id="780301667611848630">Ne, hvala</translation> <translation id="7840771868269352570">Odabrane će se stavke ukloniti.</translation> <translation id="7856733331829174190">Preuzimanje nije moguće</translation> <translation id="7859704718976024901">Povijest pregledavanja</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nedavno zatvoreno</translation> <translation id="8881801611828450202">Potraži sliku na usluzi <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Dijeljenje…</translation> +<translation id="8917490105272468696">Da, pristajem</translation> <translation id="895541991026785598">Prijavljivanje problema</translation> <translation id="8976382372951310360">Pomoć</translation> <translation id="8981454092730389528">Google kontrole aktivnosti</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 1cb9a639..be69c80 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 kijelölve</translation> <translation id="2421044535038393232">Szerkesztés folytatása</translation> <translation id="2435457462613246316">Jelszó megjelenítése</translation> -<translation id="2481538920734869610">FIÓK HOZZÁADÁSA</translation> <translation id="2497852260688568942">A szinkronizálást letiltotta a rendszergazda</translation> <translation id="2500374554657206846">A jelszó mentésére szolgáló lehetőségek</translation> <translation id="2523363575747517183">Ez a webhely folyamatosan próbál megnyitni egy másik alkalmazást.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Mondja ki a válaszokat</translation> <translation id="7265758999917665941">Ezen a webhelyen soha</translation> <translation id="7272437679830969316">Nem sikerült ellenőrizni a személyazonosságát. A jelszó nem lett másolva.</translation> -<translation id="7285236536143823449">BELEEGYEZEM</translation> <translation id="7291368939935408496">Jelszavak előkészítése…</translation> <translation id="7293171162284876153">A szinkronizálás megkezdéséhez kapcsolja be a „Chrome-adatok szinkronizálása” beállítást.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> százalék letöltve</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">A Kamera használata</translation> <translation id="7464701184726199289">Az összes eszközről törli a szinkronizált adatokat. A mentett webhelybeállítások nem törlődnek, és tájékozódási alapul szolgálhatnak böngészési szokásait illetően. <ph name="BEGIN_LINK" />További információ.<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Vállalat neve</translation> +<translation id="7473891865547856676">Nem, köszönöm</translation> <translation id="7481312909269577407">Előre</translation> <translation id="750493650310597496">0 kiválasztva</translation> <translation id="7514365320538308">Letöltés</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Tegnap</translation> <translation id="778855399387580014">Keresés indítása új Chrome-lapon.</translation> <translation id="7791543448312431591">Hozzáadás</translation> -<translation id="780301667611848630">Köszönöm, nem</translation> <translation id="7840771868269352570">A kiválasztott elemek törlődnek.</translation> <translation id="7856733331829174190">Nem sikerült letölteni</translation> <translation id="7859704718976024901">Böngészési előzmények</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Mostanában bezárt</translation> <translation id="8881801611828450202">Kép keresése a(z) <ph name="SEARCH_ENGINE" /> segítségével</translation> <translation id="8909135823018751308">Megosztás...</translation> +<translation id="8917490105272468696">Igen, elfogadom</translation> <translation id="895541991026785598">Hibabejelentés</translation> <translation id="8976382372951310360">Súgó</translation> <translation id="8981454092730389528">Google Tevékenységvezérlők</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 9abedc9..2f5e5627 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Ընտրվել է 1 էջանիշ</translation> <translation id="2421044535038393232">Շարունակել խմբագրումը</translation> <translation id="2435457462613246316">Ցույց տալ գաղտնաբառը</translation> -<translation id="2481538920734869610">ԱՎԵԼԱՑՆԵԼ ՀԱՇԻՎ</translation> <translation id="2497852260688568942">Ձեր ադմինիստրատորն անջատել է համաժամացումը</translation> <translation id="2500374554657206846">Գաղտնաբառը պահելու տարբերակներ</translation> <translation id="2523363575747517183">Այս կայքը բազմիցս փորձում է բացել մեկ այլ հավելված։</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Կարդալ պատասխանները</translation> <translation id="7265758999917665941">Երբեք չպահել այս կայքի համար</translation> <translation id="7272437679830969316">Չհաջողվեց հաստատել ձեր ինքնությունը: Գաղտնաբառը չի պատճենվել:</translation> -<translation id="7285236536143823449">ԱՅՈ, ԸՆԴՈՒՆՈՒՄ ԵՄ</translation> <translation id="7291368939935408496">Արտահանման նախապատրաստում…</translation> <translation id="7293171162284876153">Սկսելու համար միացրեք «Համաժամացնել Chrome-ի տվյալները» կարգավորումը:</translation> <translation id="7336264872878993241">Ներբեռնվել է <ph name="PERCENT" /> տոկոսը</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Օգտագործել տեսախցիկը</translation> <translation id="7464701184726199289">Համաժամացված տվյալները կհեռացվեն բոլոր սարքերից: Պահված կայքերի կարգավորումները չեն ջնջվի և կարող են արտացոլել համացանցում դիտարկման ձեր սովորությունները: <ph name="BEGIN_LINK" />Մանրամասն<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Ընկերության անունը</translation> +<translation id="7473891865547856676">Ոչ</translation> <translation id="7481312909269577407">Forward</translation> <translation id="750493650310597496">Ընտրվել է 0 էջանիշ</translation> <translation id="7514365320538308">Ներբեռնել</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Երեկ</translation> <translation id="778855399387580014">Սկսեք որոնել Chrome-ի նոր ներդիրում:</translation> <translation id="7791543448312431591">Ավելացնել</translation> -<translation id="780301667611848630">Ոչ</translation> <translation id="7840771868269352570">Ընտրված տարրերը կջնջվեն:</translation> <translation id="7856733331829174190">Չհաջողվեց ներբեռնել</translation> <translation id="7859704718976024901">Այցելությունների պատմություն</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Վերջին փակվածները</translation> <translation id="8881801611828450202">Որոնել այս պատկերը <ph name="SEARCH_ENGINE" />-ում</translation> <translation id="8909135823018751308">Կիսվել…</translation> +<translation id="8917490105272468696">Եղավ</translation> <translation id="895541991026785598">Հաղորդել խնդրի մասին</translation> <translation id="8976382372951310360">Օգնություն</translation> <translation id="8981454092730389528">Google-ի գործունեության կառավարներ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index b5109bf..5301ba6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 dipilih</translation> <translation id="2421044535038393232">Terus Edit</translation> <translation id="2435457462613246316">Tampilkan sandi</translation> -<translation id="2481538920734869610">TAMBAHKAN AKUN</translation> <translation id="2497852260688568942">Sinkronisasi dinonaktifkan oleh administrator</translation> <translation id="2500374554657206846">Opsi untuk Menyimpan Sandi</translation> <translation id="2523363575747517183">Situs ini berulang kali mencoba membuka aplikasi lain.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Ucapkan Jawabannya</translation> <translation id="7265758999917665941">Jangan Pernah Untuk Situs Ini</translation> <translation id="7272437679830969316">Tidak dapat memverifikasi identitas. Sandi tidak disalin.</translation> -<translation id="7285236536143823449">YA, SAYA SETUJU</translation> <translation id="7291368939935408496">Mempersiapkan Sandi…</translation> <translation id="7293171162284876153">Untuk memulai sinkronisasi, aktifkan "Sinkronkan data Chrome Anda".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> persen berhasil didownload</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Gunakan Kamera</translation> <translation id="7464701184726199289">Tindakan ini akan menghapus data yang disinkronkan dari semua perangkat. Setelan situs yang disimpan tidak akan dihapus dan dapat mencerminkan kebiasaan penjelajahan Anda. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nama Perusahaan</translation> +<translation id="7473891865547856676">Lain Kali</translation> <translation id="7481312909269577407">Maju</translation> <translation id="750493650310597496">Tak ada yang dipilih</translation> <translation id="7514365320538308">Download</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Kemarin</translation> <translation id="778855399387580014">Mulai penelusuran di tab Chrome baru.</translation> <translation id="7791543448312431591">Tambahkan</translation> -<translation id="780301667611848630">Lain kali</translation> <translation id="7840771868269352570">Item yang Anda pilih akan dihapus.</translation> <translation id="7856733331829174190">Tidak Dapat Mendownload</translation> <translation id="7859704718976024901">Histori Browsing</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Baru Saja Ditutup</translation> <translation id="8881801611828450202">Telusuri Gambar Ini di <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Bagikan...</translation> +<translation id="8917490105272468696">Ya, Saya Setuju</translation> <translation id="895541991026785598">Laporkan Masalah</translation> <translation id="8976382372951310360">Bantuan</translation> <translation id="8981454092730389528">Kontrol Aktivitas Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index 24f8207..4548ea0f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Eitt valið</translation> <translation id="2421044535038393232">Halda áfram að breyta</translation> <translation id="2435457462613246316">Sýna aðgangsorð</translation> -<translation id="2481538920734869610">NÝR REIKNINGUR</translation> <translation id="2497852260688568942">Kerfisstjóri hefur gert samstillingu óvirka</translation> <translation id="2500374554657206846">Val um vistun aðgangsorðs</translation> <translation id="2523363575747517183">Þetta vefsvæði reynir ítrekað að opna annað forrit.</translation> @@ -335,7 +334,7 @@ <translation id="54401264925851789">Öryggisupplýsingar síðu</translation> <translation id="5443952882982198570">Kreditkort</translation> <translation id="5457907402803865181">Villa við að samstilla aðgangsorð.</translation> -<translation id="5508435575041083207">Skrá þig út og hreinsa gögn úr þessu tæki</translation> +<translation id="5508435575041083207">Skrá út og hreinsa gögn úr þessu tæki</translation> <translation id="5525269841082836315">Búa til aðgangsorð</translation> <translation id="5548760955356983418">Handoff gerir þér kleift að byrja að skoða vefsvæði í þessu tæki og halda því síðan áfram á einfaldan hátt í Mac-tölvunni. Vefsvæðið sem er opið birtist í kvínni í Mac-tölvunni. @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Lesa upp svör</translation> <translation id="7265758999917665941">Aldrei fyrir þetta vefsvæði</translation> <translation id="7272437679830969316">Ekki tókst að staðfesta hver þú ert. Aðgangsorð var ekki afritað.</translation> -<translation id="7285236536143823449">JÁ, ÉG ER MEÐ</translation> <translation id="7291368939935408496">Undirbýr aðgangsorð...</translation> <translation id="7293171162284876153">Til að hefja samstillingu skaltu kveikja á „Samstilla gögnin þín í Chrome“.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> prósent sótt</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Nota myndavél</translation> <translation id="7464701184726199289">Þetta hreinsar samstillt gögn út af öllum tækjum. Vistuðum stillingum vefsvæða verður ekki eytt og þær kunna að endurspegla vefnotkun þína. <ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Heiti fyrirtækis</translation> +<translation id="7473891865547856676">Nei, takk</translation> <translation id="7481312909269577407">Áfram</translation> <translation id="750493650310597496">Ekkert valið</translation> <translation id="7514365320538308">Sækja</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Í gær</translation> <translation id="778855399387580014">Hefja leit í nýjum flipa í Chrome.</translation> <translation id="7791543448312431591">Bæta við</translation> -<translation id="780301667611848630">Nei, takk</translation> <translation id="7840771868269352570">Atriðin sem þú valdir verða fjarlægð.</translation> <translation id="7856733331829174190">Tókst ekki að sækja</translation> <translation id="7859704718976024901">Vafraferill</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nýlega lokað</translation> <translation id="8881801611828450202">Leita að þessari mynd á <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Deila…</translation> +<translation id="8917490105272468696">Já, ég er til</translation> <translation id="895541991026785598">Tilkynna um vandamál</translation> <translation id="8976382372951310360">Hjálp</translation> <translation id="8981454092730389528">Virknistýringar Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index b08d4e6..10d475e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Una selezionata</translation> <translation id="2421044535038393232">Continua a modificare</translation> <translation id="2435457462613246316">Mostra password</translation> -<translation id="2481538920734869610">AGGIUNGI ACCOUNT</translation> <translation id="2497852260688568942">La sincronizzazione è stata disattivata dall'amministratore</translation> <translation id="2500374554657206846">Opzioni per salvare la password</translation> <translation id="2523363575747517183">Questo sito web sta cercando ripetutamente di aprire un'altra applicazione.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Pronuncia le risposte</translation> <translation id="7265758999917665941">Mai per questo sito</translation> <translation id="7272437679830969316">Impossibile verificare la tua identità. Password non copiata.</translation> -<translation id="7285236536143823449">ACCETTO</translation> <translation id="7291368939935408496">Preparazione delle password...</translation> <translation id="7293171162284876153">Per iniziare la sincronizzazione, attiva "Sincronizza i tuoi dati di Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" />% scaricato</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Usa Fotocamera</translation> <translation id="7464701184726199289">Questa operazione comporta la cancellazione dei dati sincronizzati da tutti i dispositivi. Le impostazioni del sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nome dell'azienda</translation> +<translation id="7473891865547856676">No grazie</translation> <translation id="7481312909269577407">Avanti</translation> <translation id="750493650310597496">0 selezionati</translation> <translation id="7514365320538308">Scarica</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ieri</translation> <translation id="778855399387580014">Avvia una ricerca in una nuova scheda di Chrome.</translation> <translation id="7791543448312431591">Aggiungi</translation> -<translation id="780301667611848630">No grazie</translation> <translation id="7840771868269352570">Gli elementi selezionati verranno rimossi.</translation> <translation id="7856733331829174190">Download non riuscito</translation> <translation id="7859704718976024901">Cronologia di navigazione</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Chiusi di recente</translation> <translation id="8881801611828450202">Cerca questa immagine su <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Condividi…</translation> +<translation id="8917490105272468696">Sì, accetto</translation> <translation id="895541991026785598">Segnala un problema</translation> <translation id="8976382372951310360">Guida</translation> <translation id="8981454092730389528">Gestione attività di Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index b5a7e7c9..b3a11a70 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">נבחרה תמונה אחת</translation> <translation id="2421044535038393232">המשך העריכה</translation> <translation id="2435457462613246316">הצג סיסמה</translation> -<translation id="2481538920734869610">הוספת חשבון</translation> <translation id="2497852260688568942">מנהל המערכת שלך השבית את הסנכרון</translation> <translation id="2500374554657206846">אפשרויות לשמירת סיסמה</translation> <translation id="2523363575747517183">האתר הזה מנסה שוב ושוב לפתוח אפליקציה אחרת.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">משוב לתשובות על-ידי דיבור</translation> <translation id="7265758999917665941">אף פעם עבור אתר זה</translation> <translation id="7272437679830969316">לא ניתן לאמת את הזהות שלך. הסיסמה לא הועתקה.</translation> -<translation id="7285236536143823449">כן, אני רוצה</translation> <translation id="7291368939935408496">מכין סיסמאות...</translation> <translation id="7293171162284876153">כדי להתחיל לסנכרן צריך להפעיל את האפשרות "סנכרון הנתונים מ-Chrome".</translation> <translation id="7336264872878993241">הושלמה הורדה של <ph name="PERCENT" /> אחוז</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">שימוש במצלמה</translation> <translation id="7464701184726199289">פעולה זו מוחקת נתונים מסונכרנים מכל המכשירים. הגדרות אתרים שנשמרו לא יימחקו ועשויות לשקף את הרגלי הגלישה שלך. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation> <translation id="7472734401283673885">שם החברה</translation> +<translation id="7473891865547856676">לא, תודה</translation> <translation id="7481312909269577407">קדימה</translation> <translation id="750493650310597496">0 נבחרו</translation> <translation id="7514365320538308">הורדה</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">אתמול</translation> <translation id="778855399387580014">חיפוש בכרטיסיית Chrome חדשה.</translation> <translation id="7791543448312431591">הוספה</translation> -<translation id="780301667611848630">לא תודה</translation> <translation id="7840771868269352570">הפריטים שבחרת יוסרו.</translation> <translation id="7856733331829174190">ההורדה נכשלה</translation> <translation id="7859704718976024901">היסטוריית הגלישה</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">נסגרו לאחרונה</translation> <translation id="8881801611828450202">חפש את התמונה הזו ב-<ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">שיתוף…</translation> +<translation id="8917490105272468696">כן, מקובל עלי.</translation> <translation id="895541991026785598">דיווח על בעיה</translation> <translation id="8976382372951310360">עזרה</translation> <translation id="8981454092730389528">בחירת הפעילויות ב-Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 9706456..6327c4f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 枚選択されています</translation> <translation id="2421044535038393232">編集を続ける</translation> <translation id="2435457462613246316">パスワードを表示</translation> -<translation id="2481538920734869610">アカウントを追加</translation> <translation id="2497852260688568942">同期は管理者により無効にされています</translation> <translation id="2500374554657206846">パスワードの保存オプション</translation> <translation id="2523363575747517183">このウェブサイトは別のアプリケーションを繰り返し開こうとしています。</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">回答を音声で聞く</translation> <translation id="7265758999917665941">このサイトでは保存しない</translation> <translation id="7272437679830969316">ユーザー認証に失敗しました。パスワードはコピーされませんでした。</translation> -<translation id="7285236536143823449">利用する</translation> <translation id="7291368939935408496">パスワードの準備中...</translation> <translation id="7293171162284876153">同期を開始するには、[Chrome データを同期] をオンにしてください。</translation> <translation id="7336264872878993241"><ph name="PERCENT" />%ダウンロード</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">カメラを使う</translation> <translation id="7464701184726199289">すべてのデバイスから同期データを削除します。保存済みのサイト設定は削除されず、普段の閲覧行動を反映した設定などが残る場合があります。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation> <translation id="7472734401283673885">会社名</translation> +<translation id="7473891865547856676">スキップ</translation> <translation id="7481312909269577407">進む</translation> <translation id="750493650310597496">選択されていません</translation> <translation id="7514365320538308">ダウンロード</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">昨日</translation> <translation id="778855399387580014">新しい Chrome タブで検索を開始します。</translation> <translation id="7791543448312431591">追加</translation> -<translation id="780301667611848630">いいえ</translation> <translation id="7840771868269352570">選択したアイテムが削除されます。</translation> <translation id="7856733331829174190">ダウンロードできませんでした</translation> <translation id="7859704718976024901">閲覧履歴</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">最近閉じたタブ</translation> <translation id="8881801611828450202">この画像を <ph name="SEARCH_ENGINE" /> で検索</translation> <translation id="8909135823018751308">共有...</translation> +<translation id="8917490105272468696">有効にする</translation> <translation id="895541991026785598">問題の報告</translation> <translation id="8976382372951310360">ヘルプ</translation> <translation id="8981454092730389528">Google アクティビティ管理</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index b540fcb..c4085b8a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 არჩეულია</translation> <translation id="2421044535038393232">რედაქტირების გაგრძელება</translation> <translation id="2435457462613246316">პაროლის ჩვენება</translation> -<translation id="2481538920734869610">ანგარიშის დამატება</translation> <translation id="2497852260688568942">სინქრონიზაცია გათიშულია თქვენი ადმინისტრატორის მიერ</translation> <translation id="2500374554657206846">პაროლის შენახვის ვარიანტები</translation> <translation id="2523363575747517183">ეს ვებსაიტი განუწყვეტლივ ცდილობს სხვა აპლიკაციის გახსნას.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">აბრუნებს ხმოვან პასუხებს</translation> <translation id="7265758999917665941">არასდროს ამ საიტისთვის</translation> <translation id="7272437679830969316">თქვენი ვინაობა ვერ დადასტურდა. პაროლი არ დაკოპირდა.</translation> -<translation id="7285236536143823449">დიახ, თანახმა ვარ</translation> <translation id="7291368939935408496">მიმდინარეობს პაროლების მომზადება...</translation> <translation id="7293171162284876153">სიქრონიზაციის დასაწყებად ჩართეთ „თქვენი Chrome მონაცემების სინქრონიზაციის“ პარამეტრი.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> პროცენტი ჩამოიტვირთა</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">კამერის გამოყენება</translation> <translation id="7464701184726199289">ეს მოქმედება გაასუფთავებს სინქრონიზებულ მონაცემებს ყველა მოწყობილობიდან. საიტის შენახული პარამეტრები არ წაიშლება და შეიძლება თქვენ მიერ ვების დათვალიერებაზე აისახოს. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> <translation id="7472734401283673885">კომპანიის სახელი</translation> +<translation id="7473891865547856676">არა, გმადლობთ</translation> <translation id="7481312909269577407">გადამისამართება</translation> <translation id="750493650310597496">0 არჩეულია</translation> <translation id="7514365320538308">ჩამოტვირთვა</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">გუშინ</translation> <translation id="778855399387580014">ძიების დაწყება Chrome-ის ახალ ჩანართში.</translation> <translation id="7791543448312431591">დამატება</translation> -<translation id="780301667611848630">არა, მადლობთ</translation> <translation id="7840771868269352570">თქვენ მიერ არჩეული ერთეულები ამოიშლება.</translation> <translation id="7856733331829174190">ჩამოტვირთვა ვერ მოხერხდა</translation> <translation id="7859704718976024901">დათვალიერების ისტორია</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">ბოლოს დახურული</translation> <translation id="8881801611828450202">ამ სურათის ძიება <ph name="SEARCH_ENGINE" />-ში</translation> <translation id="8909135823018751308">გაზიარება…</translation> +<translation id="8917490105272468696">დიახ, თანახმა ვარ</translation> <translation id="895541991026785598">მოხსენება პრობლემის შესახებ</translation> <translation id="8976382372951310360">დახმარება</translation> <translation id="8981454092730389528">Google აქტივობის მართვის საშუალებები</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index d24fe21..cb37f32e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 таңдалды</translation> <translation id="2421044535038393232">Өзгерте беру</translation> <translation id="2435457462613246316">Құпия сөзді көрсету</translation> -<translation id="2481538920734869610">ЕСЕПТІК ЖАЗБА ЕНГІЗУ</translation> <translation id="2497852260688568942">Синхрондау мүмкіндігін әкімші өшіріп қойған</translation> <translation id="2500374554657206846">Құпия сөзді сақтау опциялары</translation> <translation id="2523363575747517183">Бұл сайт қайта-қайта басқа қолданбаны ашуға тырысуда.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Жауаптарды дыбыстау</translation> <translation id="7265758999917665941">Бұл сайт үшін ешқашан</translation> <translation id="7272437679830969316">Жеке басыңыз расталмады. Құпия сөз көшірілмеді.</translation> -<translation id="7285236536143823449">ЖАРАЙДЫ</translation> <translation id="7291368939935408496">Құпия сөздер дайындалуда...</translation> <translation id="7293171162284876153">Синхрондауды бастау үшін "Chrome деректерін синхрондау" параметрін қосыңыз.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> пайыз жүктелді</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Камераны пайдалану</translation> <translation id="7464701184726199289">Барлық құрылғылардан синхрондалған деректер өшеді. Сақталған сайт параметрлері жойылмайды және интернетті шарлау әдеттеріңізді көрсетуі мүмкін. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Компания аты</translation> +<translation id="7473891865547856676">Жоқ, рақмет</translation> <translation id="7481312909269577407">Басқаға жіберу</translation> <translation id="750493650310597496">0 таңдалды</translation> <translation id="7514365320538308">Жүктеу</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Кеше</translation> <translation id="778855399387580014">Жаңа Chrome қойындысында іздеуді бастаңыз.</translation> <translation id="7791543448312431591">Қосу</translation> -<translation id="780301667611848630">Жоқ, рақмет</translation> <translation id="7840771868269352570">Таңдалған элементтер өшіріледі.</translation> <translation id="7856733331829174190">Жүктеп алынбады</translation> <translation id="7859704718976024901">Шолу журналы</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Жақында жабылған</translation> <translation id="8881801611828450202">Осы кескінді <ph name="SEARCH_ENGINE" /> ішінен іздеу</translation> <translation id="8909135823018751308">Бөлісу…</translation> +<translation id="8917490105272468696">Жарайды</translation> <translation id="895541991026785598">Ақау туралы хабарлау</translation> <translation id="8976382372951310360">Анықтама</translation> <translation id="8981454092730389528">Google әрекеттерді басқару элементтері</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 8ea4be5..106f71a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">បានជ្រើសរើស 1</translation> <translation id="2421044535038393232">បន្តកែ</translation> <translation id="2435457462613246316">បង្ហាញពាក្យសម្ងាត់</translation> -<translation id="2481538920734869610">បញ្ចូលគណនី</translation> <translation id="2497852260688568942">សមកាលកម្មបានបិទដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="2500374554657206846">ជម្រើសសម្រាប់រក្សាទុកពាក្យសម្ងាត់</translation> <translation id="2523363575747517183">គេហទំព័រនេះកំពុងព្យាយាមបើកកម្មវិធីផ្សេងទៀតម្តងហើយម្តងទៀត។</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">ឆ្លើយតបទៅវិញ</translation> <translation id="7265758999917665941">មិនចងចាំសម្រាប់គេហទំព័រនេះទេ</translation> <translation id="7272437679830969316">មិនអាចផ្ទៀងផ្ទាត់អត្តសញ្ញាណរបស់អ្នកបានទេ។ ពាក្យសម្ងាត់មិនបានចម្លង។</translation> -<translation id="7285236536143823449">បាទ/ចាស ខ្ញុំចូលរួម</translation> <translation id="7291368939935408496">កំពុងរៀបចំពាក្យសម្ងាត់...</translation> <translation id="7293171162284876153">ដើម្បីចាប់ផ្ដើមសមកាលកម្ម សូមបើក "ធ្វើសមកាលកម្មទិន្នន័យ Chrome របស់អ្នក"។</translation> <translation id="7336264872878993241">ទាញយកបាន <ph name="PERCENT" /></translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ប្រើកាមេរ៉ា</translation> <translation id="7464701184726199289">វាជម្រះទិន្នន័យដែលបានធ្វើសមកាលកម្មចេញពីឧបករណ៍ទាំងអស់។ ការកំណត់គេហទំព័រដែលបានរក្សាទុកនឹងមិនត្រូវបានលុបនោះទេ ហើយវាអាចនឹងឆ្លុះបញ្ចាំងពីទម្លាប់រុករករបស់អ្នក។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែំម<ph name="END_LINK" /></translation> <translation id="7472734401283673885">ឈ្មោះក្រុមហ៊ុន</translation> +<translation id="7473891865547856676">ទេ អរគុណ</translation> <translation id="7481312909269577407">ទៅមុខ</translation> <translation id="750493650310597496">បានជ្រើសរើស ០</translation> <translation id="7514365320538308">ទាញយក</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ម្សិលមិញ</translation> <translation id="778855399387580014">ចាប់ផ្ដើមការស្វែងរកនៅក្នុងផ្ទាំង Chrome ថ្មី។</translation> <translation id="7791543448312431591">បន្ថែម</translation> -<translation id="780301667611848630">ទេ អរគុណ</translation> <translation id="7840771868269352570">ធាតុដែលអ្នកបានជ្រើសរើសនឹងត្រូវបានលុបចេញ។</translation> <translation id="7856733331829174190">មិនអាចទាញយកបានទេ</translation> <translation id="7859704718976024901">ប្រវត្តិរុករក</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">បានបិទកន្លងទៅថ្មីៗ</translation> <translation id="8881801611828450202">ស្វែងរករួបភាពនេះនៅលើ <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">ចែករំលែក…</translation> +<translation id="8917490105272468696">បាទ/ចាស ខ្ញុំយល់ព្រម។</translation> <translation id="895541991026785598">រាយការណ៍ពីបញ្ហា</translation> <translation id="8976382372951310360">ជំនួយ</translation> <translation id="8981454092730389528">ការគ្រប់គ្រងសកម្មភាព Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 12527f3de..d679a06 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ಆಯ್ಕೆಮಾಡಿದೆ</translation> <translation id="2421044535038393232">ಎಡಿಟ್ ಮಾಡುತ್ತಿರಿ</translation> <translation id="2435457462613246316">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ತೋರಿಸಿ</translation> -<translation id="2481538920734869610">ಖಾತೆ ಸೇರಿಸಿ</translation> <translation id="2497852260688568942">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸಿಂಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation> <translation id="2500374554657206846">ಪಾಸ್ವರ್ಡ್ ಉಳಿಸಲು ಆಯ್ಕೆಗಳು</translation> <translation id="2523363575747517183">ಈ ವೆಬ್ಸೈಟ್ ಪದೇ ಪದೇ ಇನ್ನೊಂದು ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">ಉತ್ತರಗಳನ್ನು ಮತ್ತೆ ಮಾತನಾಡಿ</translation> <translation id="7265758999917665941">ಈ ಸೈಟ್ಗೆ ಎಂದಿಗೂ ಬೇಡ</translation> <translation id="7272437679830969316">ನಿಮ್ಮ ಗುರುತನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಕಲಿಸಲಾಗಿಲ್ಲ.</translation> -<translation id="7285236536143823449">ಹೌದು, ನಾನು ಸಮ್ಮತಿಸುತ್ತೇನೆ</translation> <translation id="7291368939935408496">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="7293171162284876153">ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು, "ನಿಮ್ಮ Chrome ಡೇಟಾ ಸಿಂಕ್ ಮಾಡಿ" ಆಯ್ಕೆಯನ್ನು ಆನ್ ಮಾಡಿ.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ಪ್ರತಿಶತ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ಕ್ಯಾಮರಾ ಬಳಸಿ</translation> <translation id="7464701184726199289">ಇದು ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿನ ಸಿಂಕ್ ಮಾಡಲಾದ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ. ಉಳಿಸಲಾದ ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಹವ್ಯಾಸಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="7472734401283673885">ಕಂಪನಿ ಹೆಸರು</translation> +<translation id="7473891865547856676">ಇಲ್ಲ, ಧನ್ಯವಾದಗಳು</translation> <translation id="7481312909269577407">ಫಾರ್ವರ್ಡ್</translation> <translation id="750493650310597496">0 ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ</translation> <translation id="7514365320538308">ಡೌನ್ಲೋಡ್</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ನಿನ್ನೆ</translation> <translation id="778855399387580014">ಹೊಸ Chrome ಟ್ಯಾಬ್ನಲ್ಲಿ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="7791543448312431591">ಸೇರಿಸು</translation> -<translation id="780301667611848630">ಬೇಡ, ಧನ್ಯವಾದಗಳು</translation> <translation id="7840771868269352570">ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಐಟಂಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ</translation> <translation id="7856733331829174190">ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> <translation id="7859704718976024901">ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">ಇತ್ತೀಚೆಗೆ ಮುಚ್ಚಿರುವುದು</translation> <translation id="8881801611828450202">ಈ ಚಿತ್ರಕ್ಕಾಗಿ <ph name="SEARCH_ENGINE" /> ನಲ್ಲಿ ಹುಡುಕಿ</translation> <translation id="8909135823018751308">ಹಂಚಿಕೊಳ್ಳು...</translation> +<translation id="8917490105272468696">ಹೌದು, ನಾನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೇನೆ</translation> <translation id="895541991026785598">ಸಮಸ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ</translation> <translation id="8976382372951310360">ಸಹಾಯ</translation> <translation id="8981454092730389528">Google ಚಟುವಟಿಕೆ ನಿಯಂತ್ರಣಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index e40b6be..b75230f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1장 선택됨</translation> <translation id="2421044535038393232">수정 계속</translation> <translation id="2435457462613246316">비밀번호 표시</translation> -<translation id="2481538920734869610">계정 추가</translation> <translation id="2497852260688568942">관리자가 동기화를 사용 중지했습니다.</translation> <translation id="2500374554657206846">비밀번호 저장 옵션</translation> <translation id="2523363575747517183">다른 애플리케이션을 열려는 반복적인 시도가 실행되는 웹사이트입니다.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">음성 응답</translation> <translation id="7265758999917665941">이 사이트 제외</translation> <translation id="7272437679830969316">신원을 인증할 수 없습니다. 비밀번호가 복사되지 않았습니다.</translation> -<translation id="7285236536143823449">예</translation> <translation id="7291368939935408496">비밀번호 준비 중...</translation> <translation id="7293171162284876153">동기화를 시작하려면 'Chrome 데이터 동기화'를 사용 설정하세요.</translation> <translation id="7336264872878993241"><ph name="PERCENT" />% 다운로드됨</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">카메라 사용</translation> <translation id="7464701184726199289">모든 기기에서 동기화된 데이터가 삭제됩니다. 저장된 사이트 설정은 삭제되지 않으며 인터넷 사용 습관이 반영될 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="7472734401283673885">회사명</translation> +<translation id="7473891865547856676">건너뛰기</translation> <translation id="7481312909269577407">앞으로</translation> <translation id="750493650310597496">선택된 항목 없음</translation> <translation id="7514365320538308">다운로드</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">어제</translation> <translation id="778855399387580014">새 Chrome 탭에서 검색을 시작합니다.</translation> <translation id="7791543448312431591">추가</translation> -<translation id="780301667611848630">아니요, 괜찮습니다.</translation> <translation id="7840771868269352570">선택한 항목 삭제</translation> <translation id="7856733331829174190">다운로드할 수 없음</translation> <translation id="7859704718976024901">인터넷 사용 기록</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">최근에 닫은 탭</translation> <translation id="8881801611828450202"><ph name="SEARCH_ENGINE" />에서 이 이미지 검색</translation> <translation id="8909135823018751308">공유…</translation> +<translation id="8917490105272468696">사용</translation> <translation id="895541991026785598">문제 신고</translation> <translation id="8976382372951310360">도움말</translation> <translation id="8981454092730389528">Google 활동 제어</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index b26982d8..f0a1343b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 тандалды</translation> <translation id="2421044535038393232">Түзөтө берүү</translation> <translation id="2435457462613246316">Сырсөздү көрсөтүү</translation> -<translation id="2481538920734869610">АККАУНТ КОШУУ</translation> <translation id="2497852260688568942">Шайкештирүү функциясын администраторуңуз өчүрүп койгон</translation> <translation id="2500374554657206846">Сырсөздү сактоо параметрлери</translation> <translation id="2523363575747517183">Бул вебсайт башка колдонмону ачууга бир нече жолу аракет кылууда.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Жоопторду айтуу</translation> <translation id="7265758999917665941">Бул сайт үчүн эч качан</translation> <translation id="7272437679830969316">Аныктыгыңыз тастыкталган жок. Сырсөз көчүрүлгөн жок.</translation> -<translation id="7285236536143823449">ООБА, МАКУЛМУН</translation> <translation id="7291368939935408496">Сырсөздөр даярдалууда…</translation> <translation id="7293171162284876153">Шайкештирүүнү баштоо үчүн, "Chrome дайындарын шайкештирүүнү" күйгүзүңүз.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> пайыз жүктөлүп алынды</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Камераны колдонуу</translation> <translation id="7464701184726199289">Бул учурда шайкештештирилген дайындар бардык түзмөктөрдөн тазаланат. Сакталган сайт жөндөөлөрү өзгөрүлбөйт, андыктан, сайттарды адаттагыдай карай бересиз. <ph name="BEGIN_LINK" />Көбүрөөк маалымат алуу<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Компаниянын аты</translation> +<translation id="7473891865547856676">Жок, рахмат</translation> <translation id="7481312909269577407">Багыттоо</translation> <translation id="750493650310597496">0 тандалды</translation> <translation id="7514365320538308">Жүктөп алуу</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Кечээ</translation> <translation id="778855399387580014">Chrome'дун жаңы өтмөгүндө издеңиз.</translation> <translation id="7791543448312431591">Кошуу</translation> -<translation id="780301667611848630">Жок, рахмат</translation> <translation id="7840771868269352570">Тандалган элементтер өчүрүлөт.</translation> <translation id="7856733331829174190">Жүктөлүп алынган жок</translation> <translation id="7859704718976024901">Серептөө таржымалы</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Жакында жабылган</translation> <translation id="8881801611828450202">Бул сүрөттү <ph name="SEARCH_ENGINE" /> издөө каражатынан издөө</translation> <translation id="8909135823018751308">Бөлүшүү…</translation> +<translation id="8917490105272468696">Ооба, мен макулмун</translation> <translation id="895541991026785598">Маселе жөнндө кабрл</translation> <translation id="8976382372951310360">Жардам</translation> <translation id="8981454092730389528">Google'дагы аракеттерди көзөмөлдөө каражаттары</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 3d39a71..d94e371 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ຖືກເລືອກແລ້ວ</translation> <translation id="2421044535038393232">ສືບຕໍ່ແກ້ໄຂ</translation> <translation id="2435457462613246316">ສະແດງລະຫັດຜ່ານ</translation> -<translation id="2481538920734869610">ເພີ່ມບັນຊີ</translation> <translation id="2497852260688568942">ການຊິ້ງຂໍ້ມູນຖືກປິດນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="2500374554657206846">ຕົວເລືອກເພື່ອບັນທຶກລະຫັດຜ່ານ</translation> <translation id="2523363575747517183">ເວັບໄຊກຳລັງພະຍາຍາມເປີດແອັບພລິເຄຊັນອື່ນຊໍ້າໄປມາຫຼາຍເທື່ອ.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">ເວົ້າຄຳຕອບກັບຄືນ</translation> <translation id="7265758999917665941">ບໍ່ເລີຍສໍາລັບເວັບໄຊນີ້</translation> <translation id="7272437679830969316">ບໍ່ສາມາດພິສູດຢືນຢັນຕົວຕົນຂອງທ່ານໄດ້. ບໍ່ໄດ້ສຳເນົາລະຫັດຜ່ານ.</translation> -<translation id="7285236536143823449">ແມ່ນ, ຂ້ອຍເຂົ້າຮ່ວມ</translation> <translation id="7291368939935408496">ກຳລັງກະກຽມລະຫັດຜ່ານ...</translation> <translation id="7293171162284876153">ເພື່ອເລີ່ມການຊິ້ງຂໍ້ມູນ, ກະລຸນາເປີດ "ຊິ້ງຂໍ້ມູນ Chrome ຂອງທ່ານ".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ເປີເຊັນຖືກດາວໂຫຼດແລ້ວ</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ໃຊ້ກ້ອງຖ່າຍຮູບ</translation> <translation id="7464701184726199289">ນີ້ລຶບລ້າງຂໍ້ມູນທີ່ຊິ້ງຈາກທຸກອຸປະກອນ. ການຕັ້ງຄ່າເວັບໄຊທີ່ບັນທຶກໄວ້ຈະບໍ່ຖືກລຶບ ແລະ ອາດຈະສະທ້ອນເຖິງນິໄສການທ່ອງເວັບຂອງທ່ານ. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="7472734401283673885">ຊື່ບໍລິສັດ</translation> +<translation id="7473891865547856676">ບໍ່, ຂອບໃຈ</translation> <translation id="7481312909269577407">ສົ່ງຕໍ່</translation> <translation id="750493650310597496">0 ເລືອກແລ້ວ</translation> <translation id="7514365320538308">ດາວໂຫລດ</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ມື້ວານນີ້</translation> <translation id="778855399387580014">ເລີ່ມການຊອກຫາໃນແຖບ Chrome ໃໝ່.</translation> <translation id="7791543448312431591">ເພີ່ມ</translation> -<translation id="780301667611848630">ບໍ່, ຂອບໃຈ</translation> <translation id="7840771868269352570">ລາຍການທີ່ທ່ານເລືອກຈະຖືກລຶບອອກ.</translation> <translation id="7856733331829174190">ບໍ່ສາມາດດາວໂຫລດໄດ້</translation> <translation id="7859704718976024901">ປະຫວັດການທ່ອງເວັບ</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">ປິດບໍ່ດົນມານີ້</translation> <translation id="8881801611828450202">ຊອກຫາຮູບນີ້ໃນ <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">ແຊຣ໌...</translation> +<translation id="8917490105272468696">ແມ່ນ, ຂ້ອຍເຂົ້າຮ່ວມ</translation> <translation id="895541991026785598">ລາຍງານບັນຫາ</translation> <translation id="8976382372951310360">ຊ່ວຍເຫຼືອ</translation> <translation id="8981454092730389528">ການຄວບຄຸມກິດຈະກຳ Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index b045a042..5a8ce8d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Pasirinkta: 1</translation> <translation id="2421044535038393232">Toliau redaguoti</translation> <translation id="2435457462613246316">Rodyti slaptažodį</translation> -<translation id="2481538920734869610">PRIDĖTI PASKYRĄ</translation> <translation id="2497852260688568942">Sinchronizavimą išjungė jūsų administratorius</translation> <translation id="2500374554657206846">Slaptažodžio išsaugojimo parinktys</translation> <translation id="2523363575747517183">Ši svetainė pakartotinai bando atidaryti kitą programą.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Sakyti atsakymus</translation> <translation id="7265758999917665941">Niekada šioje svetainėje</translation> <translation id="7272437679830969316">Nepavyko patvirtinti tapatybės. Slaptažodis nenukopijuotas.</translation> -<translation id="7285236536143823449">TAIP, NAUDOTI</translation> <translation id="7291368939935408496">Ruošiami slaptažodžiai…</translation> <translation id="7293171162284876153">Norėdami pradėti sinchronizuoti, įjunkite parinktį „Chrome“ duomenų sinchronizavimas“.</translation> <translation id="7336264872878993241">Atsisiųsta <ph name="PERCENT" /> proc.</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Naudoti fotoaparatą</translation> <translation id="7464701184726199289">Taip sinchronizuoti duomenys bus išvalyti iš visų įrenginių. Išsaugoti svetainių nustatymai nebus ištrinti ir gali nurodyti naršymo įpročius. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Įmonės pavad.</translation> +<translation id="7473891865547856676">Ne, ačiū</translation> <translation id="7481312909269577407">Persiųsti</translation> <translation id="750493650310597496">Pasirinkta: 0</translation> <translation id="7514365320538308">Atsisiųsti</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Vakar</translation> <translation id="778855399387580014">Pradėti paiešką naujame „Chrome“ skirtuke.</translation> <translation id="7791543448312431591">Pridėti</translation> -<translation id="780301667611848630">Ačiū, ne</translation> <translation id="7840771868269352570">Pasirinkti elementai bus pašalinti.</translation> <translation id="7856733331829174190">Nepavyko atsisiųsti</translation> <translation id="7859704718976024901">Naršymo istorija</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Neseniai uždaryta</translation> <translation id="8881801611828450202">Ieškoti „<ph name="SEARCH_ENGINE" />“ šio vaizdo</translation> <translation id="8909135823018751308">Bendrinti…</translation> +<translation id="8917490105272468696">Taip, sutinku</translation> <translation id="895541991026785598">Pranešti apie problemą</translation> <translation id="8976382372951310360">Pagalba</translation> <translation id="8981454092730389528">„Google“ veiklos valdikliai</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 97f3f5c..3078305 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Atlasīts 1 fotoattēls</translation> <translation id="2421044535038393232">Turpināt rediģēt</translation> <translation id="2435457462613246316">Rādīt paroli</translation> -<translation id="2481538920734869610">PIEVIENOT KONTU</translation> <translation id="2497852260688568942">Administrators ir atspējojis sinhronizēšanu.</translation> <translation id="2500374554657206846">Paroles saglabāšanas iespējas</translation> <translation id="2523363575747517183">Šī vietne atkārtoti mēģina atvērt citu lietojumprogrammu.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Izrunāt atbildes skaļi</translation> <translation id="7265758999917665941">Nekad šai vietnei</translation> <translation id="7272437679830969316">Nevar apstiprināt jūsu identitāti. Parole nav nokopēta.</translation> -<translation id="7285236536143823449">JĀ</translation> <translation id="7291368939935408496">Notiek paroļu sagatavošana...</translation> <translation id="7293171162284876153">Lai sāktu sinhronizāciju, ieslēdziet iestatījumu “Jūsu Chrome datu sinhronizācija”.</translation> <translation id="7336264872878993241">Lejupielādēti <ph name="PERCENT" /> %</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Kameras lietošana</translation> <translation id="7464701184726199289">Tādējādi visās ierīcēs tiek notīrīti sinhronizētie dati. Saglabātie vietņu iestatījumi netiks dzēsti, un tie var atspoguļot jūsu pārlūkošanas ieradumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation> <translation id="7472734401283673885">Uzņ. nosaukums</translation> +<translation id="7473891865547856676">Nē, paldies!</translation> <translation id="7481312909269577407">Pārsūtīt</translation> <translation id="750493650310597496">Atlasītas: 0</translation> <translation id="7514365320538308">Lejupielādēt</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Vakar</translation> <translation id="778855399387580014">Meklējiet jaunā Chrome cilnē.</translation> <translation id="7791543448312431591">Pievienot</translation> -<translation id="780301667611848630">Nē, paldies</translation> <translation id="7840771868269352570">Jūsu atlasītie vienumi tiks noņemti.</translation> <translation id="7856733331829174190">Lejupielāde neizdevās</translation> <translation id="7859704718976024901">Pārlūkošanas vēsture</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nesen aizvērtas</translation> <translation id="8881801611828450202">Meklēt šo attēlu ar <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Kopīgot...</translation> +<translation id="8917490105272468696">Jā, piekrītu</translation> <translation id="895541991026785598">Ziņot par problēmu</translation> <translation id="8976382372951310360">Palīdzība</translation> <translation id="8981454092730389528">Google aktivitātes vadīklas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 4abcfc5..dc69a50 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 избрано</translation> <translation id="2421044535038393232">Продолжи со изменување</translation> <translation id="2435457462613246316">Прикажи ја лозинката</translation> -<translation id="2481538920734869610">ДОДАЈ СМЕТКА</translation> <translation id="2497852260688568942">Администраторот ја оневозможил синхронизацијата</translation> <translation id="2500374554657206846">Опции за зачувување лозинка</translation> <translation id="2523363575747517183">Веб-сајтов постојано се обидува да отвори друга апликација.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Изговарај ги одговорите</translation> <translation id="7265758999917665941">Никогаш за овој сајт</translation> <translation id="7272437679830969316">Не може да се потврди вашиот идентитет. Лозинката не е копирана.</translation> -<translation id="7285236536143823449">ДА, МОЖЕ</translation> <translation id="7291368939935408496">Се подготвуваат лозинките…</translation> <translation id="7293171162284876153">За да започне синхронизацијата, вклучете „Синхронизирајте ги податоците од Chrome“.</translation> <translation id="7336264872878993241">Преземено <ph name="PERCENT" /> проценти</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Користи ја камерата</translation> <translation id="7464701184726199289">Ова ги чисти синхронизираните податоци од сите уреди. Поставките на зачуваните сајтови нема да се избришат и може да ги отсликуваат вашите навики за прелистување. <ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Име на компанија</translation> +<translation id="7473891865547856676">Не, фала</translation> <translation id="7481312909269577407">Напред</translation> <translation id="750493650310597496">0 избрани</translation> <translation id="7514365320538308">Преземи</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Вчера</translation> <translation id="778855399387580014">Започнете пребарување во нова картичка на Chrome.</translation> <translation id="7791543448312431591">Додај</translation> -<translation id="780301667611848630">Не, фала</translation> <translation id="7840771868269352570">Ставките ќе се отстранат.</translation> <translation id="7856733331829174190">Не можеше да се преземе</translation> <translation id="7859704718976024901">Историја на прелистувањето</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Неодамна затворено</translation> <translation id="8881801611828450202">Пребарај <ph name="SEARCH_ENGINE" /> за сликава</translation> <translation id="8909135823018751308">Сподели…</translation> +<translation id="8917490105272468696">Да, прифаќам</translation> <translation id="895541991026785598">Пријави проблем</translation> <translation id="8976382372951310360">Помош</translation> <translation id="8981454092730389528">Контроли на активност на Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 1876e68..16ee8b7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 തിരഞ്ഞെടുത്തു</translation> <translation id="2421044535038393232">എഡിറ്റ് ചെയ്യുന്നത് തുടരുക</translation> <translation id="2435457462613246316">പാസ്വേഡ് കാണിക്കുക</translation> -<translation id="2481538920734869610">അക്കൗണ്ട് ചേർക്കുക</translation> <translation id="2497852260688568942">നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ സമന്വയിപ്പിക്കൽ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="2500374554657206846">പാസ്വേഡ് സംരക്ഷിക്കാനുള്ള ഓപ്ഷനുകൾ</translation> <translation id="2523363575747517183">മറ്റൊരു ആപ്പ് തുറക്കാൻ ഈ വെബ്സൈറ്റ് ആവർത്തിച്ച് ശ്രമിക്കുന്നു.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">മറുപടിയായി ഉത്തരങ്ങൾ പറയുക</translation> <translation id="7265758999917665941">ഈ സൈറ്റിൻ്റെ പാസ്വേഡ് ഓർക്കേണ്ടതില്ല</translation> <translation id="7272437679830969316">നിങ്ങളുടെ ഐഡന്റിറ്റി പരിശോധിച്ചുറപ്പിക്കാനാകില്ല. പാസ്വേഡ് പകർത്തിയില്ല.</translation> -<translation id="7285236536143823449">അതെ, ഞാൻ തയ്യാറാണ്</translation> <translation id="7291368939935408496">പാസ്വേഡുകൾ തയ്യാറാക്കുന്നു...</translation> <translation id="7293171162284876153">സമന്വയം ആരംഭിക്കാൻ, "നിങ്ങളുടെ Chrome ഡാറ്റാ സമന്വയിപ്പിക്കൽ" ഓണാക്കുക.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ശതമാനം ഡൗൺലോഡുചെയ്തു</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ക്യാമറ ഉപയോഗിക്കുക</translation> <translation id="7464701184726199289">ഇത് എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും സമന്വയിപ്പിച്ച ഡാറ്റയെ മായ്ക്കും. സംരക്ഷിച്ച സൈറ്റ് ക്രമീകരണം ഇല്ലാതാക്കപ്പെടില്ല, ഇത് നിങ്ങളുടെ ബ്രൗസിംഗ് രീതികളെ പ്രതിഫലിപ്പിക്കാനുമിടയുണ്ട്. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="7472734401283673885">കമ്പനിയുടെ പേര്</translation> +<translation id="7473891865547856676">വേണ്ട, നന്ദി</translation> <translation id="7481312909269577407">മുന്നോട്ട്</translation> <translation id="750493650310597496">0 തിരഞ്ഞെടുത്തു</translation> <translation id="7514365320538308">ഡൗൺലോഡ് ചെയ്യുക</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ഇന്നലെ</translation> <translation id="778855399387580014">പുതിയ Chrome ടാബിൽ തിരയൽ ആരംഭിക്കുക.</translation> <translation id="7791543448312431591">ചേര്ക്കൂ</translation> -<translation id="780301667611848630">വേണ്ട നന്ദി</translation> <translation id="7840771868269352570">നിങ്ങൾ തിരഞ്ഞെടുത്ത ഇനങ്ങൾ നീക്കം ചെയ്യപ്പെടും.</translation> <translation id="7856733331829174190">ഡൗൺലോഡ് ചെയ്യാനായില്ല</translation> <translation id="7859704718976024901">ബ്രൗസിംഗ് ചരിത്രം</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">സമീപകാലത്ത് അടച്ചവ</translation> <translation id="8881801611828450202">ഈ ചിത്രത്തിനായി <ph name="SEARCH_ENGINE" />-ൽ തിരയുക</translation> <translation id="8909135823018751308">പങ്കിടുക...</translation> +<translation id="8917490105272468696">അതെ, ഞാൻ തയ്യാറാണ്</translation> <translation id="895541991026785598">ഒരു പ്രശ്നം റിപ്പോര്ട്ട് ചെയ്യുക</translation> <translation id="8976382372951310360">സഹായം</translation> <translation id="8981454092730389528">Google പ്രവർത്തന നിയന്ത്രണങ്ങൾ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 835fc1e..72f0357 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 сонгогдсон</translation> <translation id="2421044535038393232">Үргэлжлүүлэн засах</translation> <translation id="2435457462613246316">Нууц үг харуулах</translation> -<translation id="2481538920734869610">БҮРТГЭЛ НЭМЭХ</translation> <translation id="2497852260688568942">Таны админ синкийг идэвхгүй болгосон байна.</translation> <translation id="2500374554657206846">Нууц үг хадгалах сонголтууд</translation> <translation id="2523363575747517183">Энэ вебсайт өөр апп нээхээр удаа дараа оролдож байна.</translation> @@ -479,7 +478,6 @@ <translation id="7203585745079012652">Хариултыг буцааж хэлэх</translation> <translation id="7265758999917665941">Энэ сайтад хэзээ ч хадгалахгүй</translation> <translation id="7272437679830969316">Таныг баталгаажуулж чадсангүй. Нууц үгийг хуулаагүй байна.</translation> -<translation id="7285236536143823449">ТИЙМ, БИ АШИГЛАНА</translation> <translation id="7291368939935408496">Нууц үгийг бэлтгэж байна...</translation> <translation id="7293171162284876153">Синк хийж эхлэхийн тулд "Chrome-н өгөгдлөө синк хийх" гэснийг асаана уу.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> хувь татагдсан байна</translation> @@ -495,6 +493,7 @@ <translation id="7460314822154045102">Камер ашиглах</translation> <translation id="7464701184726199289">Энэ нь синк хийсэн өгөгдлийг бүх төхөөрөмжөөс устгах болно. Сайтын хадгалсан тохиргоо устахгүй бөгөөд таны хайлтын тохиргоонд нөлөөлж болзошгүй. <ph name="BEGIN_LINK" />Дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Компанийн нэр</translation> +<translation id="7473891865547856676">Үгүй, баярлалаа</translation> <translation id="7481312909269577407">Forward</translation> <translation id="750493650310597496">0 сонгогдсон</translation> <translation id="7514365320538308">Татаж авах</translation> @@ -516,7 +515,6 @@ <translation id="7781829728241885113">Өчигдөр</translation> <translation id="778855399387580014">Хайлтыг Chrome-н шинэ табад эхлүүлнэ үү.</translation> <translation id="7791543448312431591">Нэмэх</translation> -<translation id="780301667611848630">Үгүй, баярлалаа</translation> <translation id="7840771868269352570">Таны сонгосон зүйлсийг устгах болно.</translation> <translation id="7856733331829174190">Татаж чадсангүй</translation> <translation id="7859704718976024901">Хайлтын түүх</translation> @@ -586,6 +584,7 @@ <translation id="8870413625673593573">Саяхан хаагдсан</translation> <translation id="8881801611828450202">Энэ зургийг <ph name="SEARCH_ENGINE" />-с хайх</translation> <translation id="8909135823018751308">Мэдээллийг хуваалцах ...</translation> +<translation id="8917490105272468696">Тийм, би зөвшөөрч байна</translation> <translation id="895541991026785598">Асуудлыг мэдэгдэх…</translation> <translation id="8976382372951310360">Тусламж</translation> <translation id="8981454092730389528">Google-н Ашиглалтын удирдлага</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 779b655..4379fe6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 निवडले</translation> <translation id="2421044535038393232">संपादन करणे सुरू ठेवा</translation> <translation id="2435457462613246316">पासवर्ड दर्शवा</translation> -<translation id="2481538920734869610">खाते जोडा</translation> <translation id="2497852260688568942">तुमच्या ॲडमिनिस्ट्रेटरने सिंक अक्षम केले आहे</translation> <translation id="2500374554657206846">पासवर्ड सेव्ह करण्यासाठी पर्याय</translation> <translation id="2523363575747517183">ही वेबसाइट वारंवार दुसरे अॅप्लिकेशन उघडण्याचा प्रयत्न करत आहे.</translation> @@ -481,7 +480,6 @@ <translation id="7203585745079012652">उत्तरे वाचून सांगा</translation> <translation id="7265758999917665941">या साइटसाठी कधीही नाही</translation> <translation id="7272437679830969316">तुमच्या ओळखीची पडताळणी करता आली नाही. पासवर्ड कॉपी केला नाही.</translation> -<translation id="7285236536143823449">होय, मी तयार आहे</translation> <translation id="7291368939935408496">पासवर्ड तयार करत आहे…</translation> <translation id="7293171162284876153">सिंक सुरू करण्यासाठी, "तुमचा Chrome डेटा सिंक करा" सुरू करा.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> टक्के डाउनलोड केले</translation> @@ -497,6 +495,7 @@ <translation id="7460314822154045102">कॅमेरा वापरा</translation> <translation id="7464701184726199289">हे सर्व डिव्हाइसेसवरून संकालित केलेला डेटा साफ करेल. सेव्ह केलेल्या साइट सेटिंग्ज हटविल्या जाणार नाहीत आणि कदाचित आपल्या ब्राउझिंग सवयी दर्शवेल. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="7472734401283673885">कंपनीचे नाव</translation> +<translation id="7473891865547856676">नाही, नको</translation> <translation id="7481312909269577407">पुढील</translation> <translation id="750493650310597496">0 निवडले</translation> <translation id="7514365320538308">डाउनलोड करा</translation> @@ -518,7 +517,6 @@ <translation id="7781829728241885113">काल</translation> <translation id="778855399387580014">एका नवीन Chrome टॅबमध्ये शोध सुरू करा.</translation> <translation id="7791543448312431591">जोडा</translation> -<translation id="780301667611848630">नाही, नको</translation> <translation id="7840771868269352570">तुम्ही निवडलेले आयटम काढून टाकले जातील.</translation> <translation id="7856733331829174190">डाउनलोड करता आले नाही</translation> <translation id="7859704718976024901">ब्राउझिंग इतिहास</translation> @@ -588,6 +586,7 @@ <translation id="8870413625673593573">अलीकडे बंद</translation> <translation id="8881801611828450202">या इमेजसाठी <ph name="SEARCH_ENGINE" /> शोधा</translation> <translation id="8909135823018751308">शेअर करा...</translation> +<translation id="8917490105272468696">होय, मला मान्य आहे</translation> <translation id="895541991026785598">समस्या नोंदवणे</translation> <translation id="8976382372951310360">मदत</translation> <translation id="8981454092730389528">Google ॲक्टिव्हिटी नियंत्रणे</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 1d558a8..d6c4fd9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 dipilih</translation> <translation id="2421044535038393232">Teruskan Mengedit</translation> <translation id="2435457462613246316">Paparkan kata laluan</translation> -<translation id="2481538920734869610">TAMBAH AKAUN</translation> <translation id="2497852260688568942">Penyegerakan dilumpuhkan oleh pentadbir anda</translation> <translation id="2500374554657206846">Pilihan untuk Menyimpan Kata Laluan</translation> <translation id="2523363575747517183">Tapak web ini berulang kali cuba membuka aplikasi lain.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Sebut Kembali Jawapan</translation> <translation id="7265758999917665941">Jangan Sekali-kali untuk Tapak Ini</translation> <translation id="7272437679830969316">Tidak dapat mengesahkan identiti anda. Kata laluan tidak disalin.</translation> -<translation id="7285236536143823449">YA, SAYA SETUJU</translation> <translation id="7291368939935408496">Menyediakan Kata Laluan…</translation> <translation id="7293171162284876153">Untuk memulakan penyegerakan, hidupkan "Segerakkan data Chrome anda".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> peratus dimuat turun</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Gunakan Kamera</translation> <translation id="7464701184726199289">Tetapan ini akan menghapuskan data yang disegerakkan daripada semua peranti. Tetapan tapak yang disimpan tidak akan dipadamkan dan mungkin mencerminkan tabiat semak imbas anda. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nama Syarikat</translation> +<translation id="7473891865547856676">Tidak, Terima Kasih</translation> <translation id="7481312909269577407">Majukan</translation> <translation id="750493650310597496">0 dipilih</translation> <translation id="7514365320538308">Muat Turun</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Semalam</translation> <translation id="778855399387580014">Mulakan carian dalam tab Chrome baharu.</translation> <translation id="7791543448312431591">Tambah</translation> -<translation id="780301667611848630">Tidak, terima kasih</translation> <translation id="7840771868269352570">Item yang anda pilih akan dialih keluar.</translation> <translation id="7856733331829174190">Tidak Dapat Memuat Turun</translation> <translation id="7859704718976024901">Sejarah Penyemakan Imbas</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Ditutup Baru-baru Ini</translation> <translation id="8881801611828450202">Cari Imej Ini di <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Kongsi…</translation> +<translation id="8917490105272468696">Ya, Saya Ikut Serta</translation> <translation id="895541991026785598">Laporkan Isu</translation> <translation id="8976382372951310360">Bantuan</translation> <translation id="8981454092730389528">Kawalan Aktiviti Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 43f5329b..e998906 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ရွေးချယ်ထားသည်</translation> <translation id="2421044535038393232">ဆက်လက်တည်းဖြတ်ရန်</translation> <translation id="2435457462613246316">စကားဝှက်ကို ပြပါ</translation> -<translation id="2481538920734869610">အကောင့် ထည့်ရန်</translation> <translation id="2497852260688568942">စင့်ခ်ပြုလုပ်ခြင်းကို သင့်စီမံခန့်ခွဲသူက ပိတ်ဆို့ထားပါသည်</translation> <translation id="2500374554657206846">'စကားဝှက် သိမ်းရန်' ရွေးစရာများ</translation> <translation id="2523363575747517183">ဤဝဘ်ဆိုက်က နောက်ထပ် အပလီကေးရှင်းတစ်ခုကို ထပ်တလဲလဲ ဖွင့်နေပါသည်။</translation> @@ -479,7 +478,6 @@ <translation id="7203585745079012652">အဖြေများကို ပြန်လည်ပြောကြားမည်</translation> <translation id="7265758999917665941">ဤဝဘ်ဆိုက်အတွက် လုံးဝမလုပ်ရန်</translation> <translation id="7272437679830969316">သင်မည်သူမည်ဝါဖြစ်ကြောင်း အတည်ပြု၍ မရနိုင်ပါ။ စကားဝှက်ကို မိတ္ထူကူးမထားပါ။</translation> -<translation id="7285236536143823449">သဘောတူပါသည်</translation> <translation id="7291368939935408496">စကားဝှက်များကို အသင့်ပြင်နေသည်...</translation> <translation id="7293171162284876153">စင့်ခ် စတင်ရန်အတွက် "သင်၏ Chrome ဒေတာ စင့်ခ်လုပ်ပါ" ကို ဖွင့်ပါ။</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ရာခိုင်နှုန်းဒေါင်းလုဒ်လုပ်ပြီးပါပြီ</translation> @@ -495,6 +493,7 @@ <translation id="7460314822154045102">'ကင်မရာ' အသုံးပြုရန်</translation> <translation id="7464701184726199289">၎င်းသည် စက်ပစ္စည်းများအားလုံးမှ စင့်ခ်လုပ်ထားသည့် ဒေတာများကို ရှင်းလင်းသွားပါမည်။ သိမ်းဆည်းထားသည့် ဆိုက်ဆက်တင်များကိုတော့ ဖျက်လိုက်မည် မဟုတ်ဘဲ သင်အင်တာနက် အသုံးပြုမှု အမူအကျင့်များကို ဖော်ပြပါလိမ့်မည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="7472734401283673885">ကုမ္ပဏီ အမည်</translation> +<translation id="7473891865547856676">မလို ကျေးဇူးပဲ</translation> <translation id="7481312909269577407">ရှေ့သို့</translation> <translation id="750493650310597496">0 ရွေးချယ်ထားပါသည်</translation> <translation id="7514365320538308">ဒေါင်းလုဒ်</translation> @@ -516,7 +515,6 @@ <translation id="7781829728241885113">မနေ့က</translation> <translation id="778855399387580014">Chrome တဘ်အသစ်တွင် ရှာဖွေမှု စတင်ပါ။</translation> <translation id="7791543448312431591">ထည့်ရန်</translation> -<translation id="780301667611848630">မလို ကျေးဇူးပဲ</translation> <translation id="7840771868269352570">သင်ရွေးထားသည့် အရာများကို ဖယ်ရှားလိုက်ပါမည်။</translation> <translation id="7856733331829174190">ဒေါင်းလုဒ် လုပ်၍မရပါ</translation> <translation id="7859704718976024901">ရှာဖွေမှု မှတ်တမ်း</translation> @@ -586,6 +584,7 @@ <translation id="8870413625673593573">မကြာမီက ပိတ်ခဲ့</translation> <translation id="8881801611828450202">ဤရုပ်ပုံကို <ph name="SEARCH_ENGINE" /> တွင်ရှာရန်</translation> <translation id="8909135823018751308">ၐေမျှရန်...</translation> +<translation id="8917490105272468696">သဘောတူပါသည်</translation> <translation id="895541991026785598">ပြဿနာတစ်ခု အစီရင်ခံမည်</translation> <translation id="8976382372951310360">အကူအညီ</translation> <translation id="8981454092730389528">Google လုပ်ဆောင်ချက်များ ထိန်းချုပ်ရန်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 91bc6b9..ffc4cec 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 चयन गरियो</translation> <translation id="2421044535038393232">सम्पादन गरिरहनुहोस्</translation> <translation id="2435457462613246316">पासवर्ड देखाउनुहोस्</translation> -<translation id="2481538920734869610">खाता थप्नुहोस्</translation> <translation id="2497852260688568942">तपाईंको प्रशासकले सिंंक असक्षम पार्नुभएको छ।</translation> <translation id="2500374554657206846">पासवर्ड सुरक्षित गर्ने विकल्पहरू</translation> <translation id="2523363575747517183">यो वेबसाइटले बारम्बार अर्को अनुप्रयोग खोल्ने प्रयास गर्दैछ।</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">जवाफहरू पुन: भन्नुहोस्</translation> <translation id="7265758999917665941">यो साइटका हकमा कहिल्यै पनि नसम्झनुहोस्</translation> <translation id="7272437679830969316">तपाईंको पहिचान पुष्टि गर्न सकिएन। पासवर्डको प्रतिलिपि गरिएको छैन।</translation> -<translation id="7285236536143823449">हुन्छ, म सहमत छु</translation> <translation id="7291368939935408496">पासवर्डहरू निर्यात गर्ने तयारी गरिँदै…</translation> <translation id="7293171162284876153">सिंक गर्ने कार्य सुरु गर्न "Chrome को आफ्नो डेटा सिंक गर्नुहोस्"।</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> प्रतिशत डाउनलोड भयो</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">क्यामेरा प्रयोग गर्नुहोस्</translation> <translation id="7464701184726199289">यसले सबै यन्त्रहरूबाट सिंक गरिएको डेटालाई खाली गर्छ। सुरक्षित गरिएका साइटका सेटिङहरूलाई मेटाइने छैन र त्यसले तपाईँको ब्राउज गर्ने बानीलाई झल्काउन सक्छ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="7472734401283673885">कम्पनीको नाम</translation> +<translation id="7473891865547856676">पर्दैन, धन्यवाद</translation> <translation id="7481312909269577407">अगाडि</translation> <translation id="750493650310597496">0 चयन गरियो</translation> <translation id="7514365320538308">डाउनलोड गर्नुहोस्</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">हिजो</translation> <translation id="778855399387580014">Chrome को नयाँ ट्याबमा खोज सुरु गर्नुहोस्।</translation> <translation id="7791543448312431591">थप्नुहोस्</translation> -<translation id="780301667611848630">भयो, धन्यवाद</translation> <translation id="7840771868269352570">तपाईंले चयन गर्नुभएका वस्तुहरू हटाइने छन्।</translation> <translation id="7856733331829174190">डाउनलोड गर्न सकिएन</translation> <translation id="7859704718976024901">ब्राउजिङ इतिहास</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">हालै बन्द गरिएको</translation> <translation id="8881801611828450202"><ph name="SEARCH_ENGINE" /> मा यो छवि खोज्नुहोस्</translation> <translation id="8909135823018751308">साझा गर्नुहोस्...</translation> +<translation id="8917490105272468696">हो, म सहमत छु</translation> <translation id="895541991026785598">समस्या रिपोर्ट गर्नुहोस्</translation> <translation id="8976382372951310360">मद्दत</translation> <translation id="8981454092730389528">Google गतिविधि नियन्त्रणहरू</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index d0031d71..ddc1554 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 geselecteerd</translation> <translation id="2421044535038393232">Doorgaan met bewerken</translation> <translation id="2435457462613246316">Wachtwoord weergeven</translation> -<translation id="2481538920734869610">ACCOUNT TOEV.</translation> <translation id="2497852260688568942">Synchronisatie is uitgeschakeld door je beheerder</translation> <translation id="2500374554657206846">Opties voor 'Wachtwoord opslaan'</translation> <translation id="2523363575747517183">Deze website probeert herhaaldelijk een andere app te openen.</translation> @@ -168,7 +167,7 @@ <translation id="3112556859945124369">Markeren…</translation> <translation id="3153862085237805241">Pas opslaan</translation> <translation id="3157684681743766797">Alles markeren…</translation> -<translation id="3161291298470460782">Je wordt hiermee uitgelogd. Ook wordt de synchronisatie stopgezet en worden alle Chrome-gegevens van dit apparaat gewist. Je gesynchroniseerde gegevens blijven in je Google-account staan.</translation> +<translation id="3161291298470460782">Hiermee word je uitgelogd en wordt de synchronisatie stopgezet. Ook worden alle Chrome-gegevens van dit apparaat gewist. Je gesynchroniseerde gegevens blijven in je Google-account staan.</translation> <translation id="3175081911749765310">Webservices</translation> <translation id="3178650076442119961">Vandaag actief</translation> <translation id="3207960819495026254">Toegevoegd aan 'Bladwijzers'</translation> @@ -201,7 +200,7 @@ <translation id="3494788280727468875">Wissen van browsegegevens bevestigen</translation> <translation id="35083190962747987">${url} openen</translation> <translation id="3519193562722059437">Open een tabblad om op internet te surfen.</translation> -<translation id="3523473570015918798">Als je uitlogt, worden je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens niet meer gesynchroniseerd met je Google-account</translation> +<translation id="3523473570015918798">Als je uitlogt, worden je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens niet meer gesynchroniseerd met je Google-account.</translation> <translation id="3527085408025491307">Map</translation> <translation id="3529024052484145543">Niet beveiligd</translation> <translation id="3533202363250687977">Alle incognitotabbladen sluiten</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Antwoorden uitspreken</translation> <translation id="7265758999917665941">Nooit voor deze site</translation> <translation id="7272437679830969316">Kan je identiteit niet verifiëren. Wachtwoord niet gekopieerd.</translation> -<translation id="7285236536143823449">JA, INSCHAKELEN</translation> <translation id="7291368939935408496">Wachtwoorden voorbereiden...</translation> <translation id="7293171162284876153">Schakel 'Je Chrome-gegevens synchroniseren' in om de synchronisatie te starten.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> procent gedownload</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Camera gebruiken</translation> <translation id="7464701184726199289">Hiermee worden gesynchroniseerde gegevens van alle apparaten gewist. Opgeslagen site-instellingen worden niet verwijderd en kunnen je browsegedrag weerspiegelen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Bedrijfsnaam</translation> +<translation id="7473891865547856676">Nee, bedankt</translation> <translation id="7481312909269577407">Vooruit</translation> <translation id="750493650310597496">0 geselecteerd</translation> <translation id="7514365320538308">Downloaden</translation> @@ -509,7 +508,7 @@ <translation id="766891008101699113">Voeg een nieuw tabblad toe als je privé wilt browsen.</translation> <translation id="7671141431838911305">INSTALLEER</translation> <translation id="7765158879357617694">Verplaatsen</translation> -<translation id="7771470029643830783">Als je uitlogt, worden je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens niet meer gesynchroniseerd met je Google-account +<translation id="7771470029643830783">Als je uitlogt, worden je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens niet meer gesynchroniseerd met je Google-account. Aangezien je account wordt beheerd door <ph name="HOSTED_DOMAIN" />, worden je Chrome-gegevens verwijderd van dit apparaat als je uitlogt. Je gesynchroniseerde gegevens blijven in je Google-account staan.</translation> <translation id="7772032839648071052">Bevestig de wachtwoordzin</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Gisteren</translation> <translation id="778855399387580014">Start een zoekopdracht op een nieuw Chrome-tabblad.</translation> <translation id="7791543448312431591">Toevoegen</translation> -<translation id="780301667611848630">Nee, bedankt</translation> <translation id="7840771868269352570">De geselecteerde items worden verwijderd.</translation> <translation id="7856733331829174190">Kan niet downloaden</translation> <translation id="7859704718976024901">Browsegeschiedenis</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Recent gesloten</translation> <translation id="8881801611828450202">Zoeken op <ph name="SEARCH_ENGINE" /> naar deze afbeelding</translation> <translation id="8909135823018751308">Delen</translation> +<translation id="8917490105272468696">Ja, inschakelen</translation> <translation id="895541991026785598">Een probleem melden</translation> <translation id="8976382372951310360">Hulp</translation> <translation id="8981454092730389528">Google-activiteitsopties</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index d99b4f5..077f70c1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 er valgt</translation> <translation id="2421044535038393232">Fortsett redigeringen</translation> <translation id="2435457462613246316">Vis passord</translation> -<translation id="2481538920734869610">LEGG TIL KONTO</translation> <translation id="2497852260688568942">Administratoren din har slått av synkronisering</translation> <translation id="2500374554657206846">Alternativer for passordlagring</translation> <translation id="2523363575747517183">Dette nettstedet prøver gjentatte ganger å åpne en annen app.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Svar med tale</translation> <translation id="7265758999917665941">Aldri for dette nettstedet</translation> <translation id="7272437679830969316">Kan ikke bekrefte identiteten din. Passordet er ikke kopiert.</translation> -<translation id="7285236536143823449">JA, JEG BLIR MED</translation> <translation id="7291368939935408496">Klargjør passordene …</translation> <translation id="7293171162284876153">For å starte synkronisering, slå på «Synkroniser Chrome-dataene dine».</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> prosent fullført</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Bruk kameraet</translation> <translation id="7464701184726199289">Dette sletter synkroniserte data fra alle enheter. Lagrede nettstedsinnstillinger slettes ikke og kan gjenspeile nettleserbruken din. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Bedriftsnavn</translation> +<translation id="7473891865547856676">Nei takk</translation> <translation id="7481312909269577407">Frem</translation> <translation id="750493650310597496">0 er valgt</translation> <translation id="7514365320538308">Last ned</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">I går</translation> <translation id="778855399387580014">Start et søk i en ny Chrome-fane.</translation> <translation id="7791543448312431591">Legg til</translation> -<translation id="780301667611848630">Nei takk</translation> <translation id="7840771868269352570">De valgte elementene blir fjernet.</translation> <translation id="7856733331829174190">Kunne ikke laste ned</translation> <translation id="7859704718976024901">Nettleserlogg</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nylig lukket</translation> <translation id="8881801611828450202">Søk etter dette bildet i <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Del</translation> +<translation id="8917490105272468696">Ja, den er grei</translation> <translation id="895541991026785598">Rapporter et problem</translation> <translation id="8976382372951310360">Hjelp</translation> <translation id="8981454092730389528">Google Aktivitetslagring</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 316c2fd..2240a972 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1ଟି ଚୟନ କରାଯାଇଛି</translation> <translation id="2421044535038393232">ସମ୍ପାଦନା ଜାରି ରଖନ୍ତୁ</translation> <translation id="2435457462613246316">ପାସୱାର୍ଡ ଦେଖାନ୍ତୁ</translation> -<translation id="2481538920734869610">ଆକାଉଣ୍ଟ ଯୋଗ କରନ୍ତୁ</translation> <translation id="2497852260688568942">ଆପଣଙ୍କର ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ୱାରା ସିଙ୍କ ଅକ୍ଷମ କରାଯାଇଛି</translation> <translation id="2500374554657206846">ପାସ୍ୱାର୍ଡ ସେଭ୍ କରିବା ପାଇଁ ବିକଳ୍ପ</translation> <translation id="2523363575747517183">ଏହି ୱେବ୍ସାଇଟ୍ ବାରମ୍ୱାର ଅନ୍ୟଏକ ଆପ୍ଲିକେସନ୍ ଖୋଲିବାକୁ ଚେଷ୍ଟା କରୁଛି।</translation> @@ -478,7 +477,6 @@ <translation id="7203585745079012652">ପୁଣିଥରେ ଉତ୍ତର କୁହନ୍ତୁ</translation> <translation id="7265758999917665941">ଏହି ସାଇଟ୍ ପାଇଁ ଆଦୌ ନୁହେଁ</translation> <translation id="7272437679830969316">ଆପଣଙ୍କର ପରିଚୟ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ। ପାସ୍ୱର୍ଡ କପି ହୋଇନାହିଁ।</translation> -<translation id="7285236536143823449">ହଁ, ମୁଁ ରାଜି ଅଛି</translation> <translation id="7291368939935408496">ପାସ୍ୱର୍ଡ ପ୍ରସ୍ତୁତ ହେଉଛି...</translation> <translation id="7293171162284876153">ସିଙ୍କ ଆରମ୍ଭ କରିବାକୁ, "ଆପଣଙ୍କ Chrome ଡାଟା ସିଙ୍କ କରନ୍ତୁ"କୁ ଚାଲୁ କରନ୍ତୁ।</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ପ୍ରତିଶତ ଡାଉନ୍ଲୋଡ୍ ହୋଇଛି</translation> @@ -494,6 +492,7 @@ <translation id="7460314822154045102">କ୍ୟାମେରା ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="7464701184726199289">ସମସ୍ତ ଡିଭାଇସ୍ରୁ ସିଙ୍କ୍ ହୋଇଥିବା ଡାଟାକୁ ଖାଲି କରେ। ସେଭ୍ ଥିବା ସାଇଟ୍ ସେଟିଂସ୍ ଡିଲିଟ୍ ହେବ ନାହିଁ ଏବଂ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଅଭ୍ୟାସ ପ୍ରତିଫଳିତ ହୋଇପାରେ। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="7472734401283673885">କମ୍ପାନୀ ନାମ</translation> +<translation id="7473891865547856676">ନାହିଁ, ଧନ୍ୟବାଦ</translation> <translation id="7481312909269577407">ଅଗ୍ରଗତି</translation> <translation id="750493650310597496">0 ଚୟନ କରାଯାଇଛି</translation> <translation id="7514365320538308">ଡାଉନ୍ଲୋଡ୍ କରନ୍ତୁ</translation> @@ -515,7 +514,6 @@ <translation id="7781829728241885113">ଗତକଲି</translation> <translation id="778855399387580014">ଗୋଟିଏ ନୂଆ Chrome ଟାବ୍ରେ ଏକ ସର୍ଚ୍ଚ କରନ୍ତୁ।</translation> <translation id="7791543448312431591">ଯୋଡନ୍ତୁ</translation> -<translation id="780301667611848630">ନାଁ, ଥାଉ</translation> <translation id="7840771868269352570">ଆପଣ ଚୟନ କରିଥିବା ଆଇଟମ୍ଗୁଡ଼ିକ କାଢ଼ି ଦିଆଯିବ।</translation> <translation id="7856733331829174190">ଡାଉନ୍ଲୋଡ୍ କରିହେଲା ନାହିଁ</translation> <translation id="7859704718976024901">ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି</translation> @@ -585,6 +583,7 @@ <translation id="8870413625673593573">ନିକଟରେ ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="8881801611828450202">ଏହି ଛବି ପାଇଁ <ph name="SEARCH_ENGINE" /> ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="8909135823018751308">ସେୟାର୍ କରନ୍ତୁ…</translation> +<translation id="8917490105272468696">ହଁ, ମୁଁ ରାଜି ଅଛି</translation> <translation id="895541991026785598">କୌଣସି ଏକ ତ୍ରୁଟିର ରିପୋର୍ଟ କରନ୍ତୁ</translation> <translation id="8976382372951310360">ସହାୟତା</translation> <translation id="8981454092730389528">Google ଗତିବିଧି ନିୟନ୍ତ୍ରଣ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index e314bcd..65c81fb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ਚੁਣਿਆ ਗਿਆ</translation> <translation id="2421044535038393232">ਸੰਪਾਦਨ ਕਰਦੇ ਰਹੋ</translation> <translation id="2435457462613246316">ਪਾਸਵਰਡ ਵੇਖੋ</translation> -<translation id="2481538920734869610">ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="2497852260688568942">ਸਮਕਾਲੀਕਰਨ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।</translation> <translation id="2500374554657206846">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ ਦੇ ਵਿਕਲਪ</translation> <translation id="2523363575747517183">ਇਹ ਵੈੱਬਸਾਈਟ ਵਾਰ-ਵਾਰ ਕੋਈ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੀ ਹੈ।</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">ਜਵਾਬ ਦੁਬਾਰਾ ਬੋਲੋ</translation> <translation id="7265758999917665941">ਇਸ ਸਾਈਟ ਲਈ ਕਦੇ ਵੀ ਨਹੀਂ</translation> <translation id="7272437679830969316">ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਪਾਸਵਰਡ ਕਾਪੀ ਨਹੀਂ ਕੀਤਾ ਗਿਆ।</translation> -<translation id="7285236536143823449">ਮੈਂ ਸਹਿਮਤ ਹਾਂ</translation> <translation id="7291368939935408496">ਪਾਸਵਰਡ ਤਿਆਰ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ…</translation> <translation id="7293171162284876153">ਸਮਕਾਲੀਕਰਨ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, "ਆਪਣੇ Chrome ਡਾਟੇ ਦਾ ਸਮਕਾਲੀਕਰਨ ਕਰੋ" ਨੂੰ ਚਾਲੂ ਕਰੋ।</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ਪ੍ਰਤਿਸ਼ਤ ਡਾਊਨਲੋਡ ਹੋਇਆ</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ਕੈਮਰਾ ਵਰਤੋ</translation> <translation id="7464701184726199289">ਇਹ ਸਾਰੀਆਂ ਡੀਵਾਈਸਾਂ ਤੋਂ ਸਮਕਾਲੀਕਰਨ ਕੀਤੇ ਡਾਟੇ ਨੂੰ ਸਾਫ਼ ਕਰ ਦੇਵੇਗਾ। ਰੱਖਿਅਤ ਕੀਤੀਆਂ ਸਾਈਟ ਸੈਟਿੰਗਾਂ ਮਿਟਾਈਆਂ ਨਹੀਂ ਜਾਣਗੀਆਂ ਅਤੇ ਇਹ ਤੁਹਾਡੀਆਂ ਬ੍ਰਾਊਜ਼ਿੰਗ ਆਦਤਾਂ ਨੂੰ ਵੀ ਸਮਰਣ ਕਰ ਸਕਦੀਆਂ ਹਨ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="7472734401283673885">ਕੰਪਨੀ ਦਾ ਨਾਮ</translation> +<translation id="7473891865547856676">ਨਹੀਂ ਧੰਨਵਾਦ</translation> <translation id="7481312909269577407">ਅੱਗੇ ਭੇਜੋ</translation> <translation id="750493650310597496">0 ਚੁਣਿਆ ਗਿਆ</translation> <translation id="7514365320538308">ਡਾਊਨਲੋਡ ਕਰੋ</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ਕੱਲ੍ਹ</translation> <translation id="778855399387580014">ਇੱਕ ਨਵੀਂ Chrome ਟੈਬ ਵਿੱਚ ਕੋਈ ਖੋਜ ਸ਼ੁਰੂ ਕਰੋ।</translation> <translation id="7791543448312431591">ਜੋੜੋ</translation> -<translation id="780301667611848630">ਨਹੀਂ ਧੰਨਵਾਦ</translation> <translation id="7840771868269352570">ਤੁਹਾਡੇ ਵੱਲੋਂ ਚੁਣੀਆਂ ਗਈਆਂ ਆਈਟਮਾਂ ਹਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ।</translation> <translation id="7856733331829174190">ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> <translation id="7859704718976024901">ਬ੍ਰਾਉਜ਼ਿੰਗ ਇਤਿਹਾਸ</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">ਹੁਣੇ ਜਿਹੇ ਬੰਦ ਕੀਤੀਆਂ</translation> <translation id="8881801611828450202">ਇਸ ਚਿੱਤਰ ਲਈ <ph name="SEARCH_ENGINE" /> ਖੋਜੋ</translation> <translation id="8909135823018751308">ਸ਼ੇਅਰ ਕਰੋ…</translation> +<translation id="8917490105272468696">ਹਾਂ, ਮੈਂ ਸਹਿਮਤ ਹਾਂ</translation> <translation id="895541991026785598">ਇੱਕ ਸਮੱਸਿਆ ਦੀ ਰਿਪੋਰਟ ਕਰੋ</translation> <translation id="8976382372951310360">ਮਦਦ</translation> <translation id="8981454092730389528">Google ਸਰਗਰਮੀ ਕੰਟਰੋਲ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 1d3b81f..522db7ab44 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Wybrano: 1</translation> <translation id="2421044535038393232">Edytuj dalej</translation> <translation id="2435457462613246316">Pokaż hasło</translation> -<translation id="2481538920734869610">DODAJ KONTO</translation> <translation id="2497852260688568942">Synchronizację wyłączył administrator</translation> <translation id="2500374554657206846">Opcje zapisania hasła</translation> <translation id="2523363575747517183">Ta strona internetowa wielokrotnie próbuje otworzyć inną aplikację.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Odczytuj odpowiedzi</translation> <translation id="7265758999917665941">Nigdy dla tej witryny</translation> <translation id="7272437679830969316">Nie można zweryfikować Twojej tożsamości. Hasło nie zostało skopiowane.</translation> -<translation id="7285236536143823449">ZGADZAM SIĘ</translation> <translation id="7291368939935408496">Przygotowuję hasła…</translation> <translation id="7293171162284876153">Aby rozpocząć synchronizację, włącz „Synchronizuj dane Chrome”.</translation> <translation id="7336264872878993241">Pobrano <ph name="PERCENT" /> procent</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Użyj aparatu</translation> <translation id="7464701184726199289">Spowoduje to usunięcie zsynchronizowanych danych ze wszystkich urządzeń. Zapisane ustawienia witryn nie zostaną usunięte i mogą zawierać informacje o Twoim korzystaniu z przeglądarki. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nazwa firmy</translation> +<translation id="7473891865547856676">Nie, dziękuję</translation> <translation id="7481312909269577407">Dalej</translation> <translation id="750493650310597496">Nic nie wybrałeś</translation> <translation id="7514365320538308">Pobierz</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Wczoraj</translation> <translation id="778855399387580014">Rozpocznij wyszukiwanie na nowej karcie Chrome.</translation> <translation id="7791543448312431591">Dodaj</translation> -<translation id="780301667611848630">Nie, dziękuję</translation> <translation id="7840771868269352570">Wybrane elementy zostaną usunięte.</translation> <translation id="7856733331829174190">Nie udało się pobrać pliku</translation> <translation id="7859704718976024901">Historia przeglądania</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Ostatnio zamknięte</translation> <translation id="8881801611828450202">Szukaj tego obrazu w: <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Udostępnij…</translation> +<translation id="8917490105272468696">Tak, zgadzam się</translation> <translation id="895541991026785598">Zgłaszanie problemu</translation> <translation id="8976382372951310360">Pomoc</translation> <translation id="8981454092730389528">Zarządzanie aktywnością w Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index b1e484c3..77c45a6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Uma selecionada</translation> <translation id="2421044535038393232">Continuar editando</translation> <translation id="2435457462613246316">Mostrar senha</translation> -<translation id="2481538920734869610">ADICIONAR CONTA</translation> <translation id="2497852260688568942">A sincronização foi desativada pelo administrador</translation> <translation id="2500374554657206846">Opções para salvar senha</translation> <translation id="2523363575747517183">Este site está tentando repetidamente abrir outro aplicativo.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Falar as respostas</translation> <translation id="7265758999917665941">Nunca para este site</translation> <translation id="7272437679830969316">Não é possível verificar sua identidade. Senha não copiada.</translation> -<translation id="7285236536143823449">SIM, VAMOS LÁ</translation> <translation id="7291368939935408496">Preparando senhas…</translation> <translation id="7293171162284876153">Para iniciar a sincronização, ative a opção "Sincronizar seus dados do Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> por cento baixados</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Usar a câmera</translation> <translation id="7464701184726199289">Isso limpa os dados sincronizados de todos os dispositivos. As configurações salvas em sites não são excluídas e podem refletir seus hábitos de navegação. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nome da empresa</translation> +<translation id="7473891865547856676">Não, obrigado</translation> <translation id="7481312909269577407">Avançar</translation> <translation id="750493650310597496">0 selecionados</translation> <translation id="7514365320538308">Fazer o download</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ontem</translation> <translation id="778855399387580014">Inicie uma pesquisa em uma nova guia do Chrome.</translation> <translation id="7791543448312431591">Adicionar</translation> -<translation id="780301667611848630">Não</translation> <translation id="7840771868269352570">Os itens selec. serão removidos.</translation> <translation id="7856733331829174190">Falha no download</translation> <translation id="7859704718976024901">Histórico de navegação</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Recentemente fechadas</translation> <translation id="8881801611828450202">Pesquisar esta imagem no <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Compartilhar...</translation> +<translation id="8917490105272468696">Sim</translation> <translation id="895541991026785598">Informar um problema</translation> <translation id="8976382372951310360">Ajuda</translation> <translation id="8981454092730389528">Controles de atividades do Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index 3eae218..46666d12 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 selecionada</translation> <translation id="2421044535038393232">Continuar a editar</translation> <translation id="2435457462613246316">Mostrar palavra-passe</translation> -<translation id="2481538920734869610">ADICIONAR CONTA</translation> <translation id="2497852260688568942">A sincronização foi desativada pelo gestor</translation> <translation id="2500374554657206846">Opções para Guardar palavra-passe</translation> <translation id="2523363575747517183">Este Website está a tentar repetidamente abrir outra aplicação.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Ouvir Respostas</translation> <translation id="7265758999917665941">Nunca para este site</translation> <translation id="7272437679830969316">Não é possível validar a sua identidade. Palavra-passe não copiada.</translation> -<translation id="7285236536143823449">SIM, ACEITO</translation> <translation id="7291368939935408496">A preparar palavras-passe…</translation> <translation id="7293171162284876153">Para iniciar a sincronização, ative a opção "Sincronizar dados do Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> por cento transferido</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Utilizar a Câmara</translation> <translation id="7464701184726199289">Esta ação limpa os dados sincronizados de todos os dispositivos. As definições de sites guardadas não são eliminadas e podem refletir os seus hábitos de navegação. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Nome da empresa</translation> +<translation id="7473891865547856676">Não, obrigado</translation> <translation id="7481312909269577407">Avançar</translation> <translation id="750493650310597496">0 selecionados</translation> <translation id="7514365320538308">Transferir</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ontem</translation> <translation id="778855399387580014">Inicie uma pesquisa no novo separador do Chrome.</translation> <translation id="7791543448312431591">Adicionar</translation> -<translation id="780301667611848630">Não, obrigado</translation> <translation id="7840771868269352570">Os itens selecionados serão removidos.</translation> <translation id="7856733331829174190">Impossível transferir</translation> <translation id="7859704718976024901">Histórico de navegação</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Fechadas recentemente</translation> <translation id="8881801611828450202">Pesquisar esta imagem no <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Partilhar…</translation> +<translation id="8917490105272468696">Sim, aceito</translation> <translation id="895541991026785598">Comunicar um problema</translation> <translation id="8976382372951310360">Ajuda</translation> <translation id="8981454092730389528">Controlos da atividade Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 4c646aef..69b146d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 selectată</translation> <translation id="2421044535038393232">Continuă editarea</translation> <translation id="2435457462613246316">Afișați parola</translation> -<translation id="2481538920734869610">ADAUGĂ UN CONT</translation> <translation id="2497852260688568942">Sincronizarea este dezactivată de administrator</translation> <translation id="2500374554657206846">Opțiuni pentru Salvarea parolei</translation> <translation id="2523363575747517183">Acest site încearcă în mod repetat să deschidă altă aplicație.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Primești răspunsuri vocale</translation> <translation id="7265758999917665941">Niciodată pentru acest site</translation> <translation id="7272437679830969316">Nu ți se poate confirma identitatea. Parola nu a fost copiată.</translation> -<translation id="7285236536143823449">DA, ACCEPT</translation> <translation id="7291368939935408496">Se pregătesc parolele...</translation> <translation id="7293171162284876153">Pentru a porni sincronizarea, activează „Sincronizează datele din Chrome”.</translation> <translation id="7336264872878993241"><ph name="PERCENT" />% descărcat</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Folosește camera foto</translation> <translation id="7464701184726199289">Astfel, datele sincronizate vor fi șterse de pe toate dispozitivele. Setările salvate pentru site-uri nu vor fi șterse și pot reflecta obiceiurile de navigare. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Numele companiei</translation> +<translation id="7473891865547856676">Nu, mulțumesc</translation> <translation id="7481312909269577407">Înainte</translation> <translation id="750493650310597496">Niciunul selectat</translation> <translation id="7514365320538308">Descarcă</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Ieri</translation> <translation id="778855399387580014">Începe o căutare într-o filă Chrome nouă.</translation> <translation id="7791543448312431591">Adaugă</translation> -<translation id="780301667611848630">Nu, mulțumesc</translation> <translation id="7840771868269352570">Elementele selectate vor fi eliminate.</translation> <translation id="7856733331829174190">Nu s-a putut descărca</translation> <translation id="7859704718976024901">Istoricul de navigare</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Închise recent</translation> <translation id="8881801611828450202">Caută această imagine cu <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Trimite…</translation> +<translation id="8917490105272468696">Da, accept</translation> <translation id="895541991026785598">Raportați o problemă</translation> <translation id="8976382372951310360">Ajutor</translation> <translation id="8981454092730389528">Opțiuni privind activitatea Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 429d764..e8af1988 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Выбрана 1 фотография</translation> <translation id="2421044535038393232">Продолжить редактирование</translation> <translation id="2435457462613246316">Показать пароль</translation> -<translation id="2481538920734869610">ДОБАВИТЬ АККАУНТ</translation> <translation id="2497852260688568942">Ваш администратор отключил синхронизацию</translation> <translation id="2500374554657206846">Параметры сохранения пароля</translation> <translation id="2523363575747517183">Этот сайт часто пытается открыть другое приложение.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Озвучивать результаты поиска</translation> <translation id="7265758999917665941">Никогда для этого сайта</translation> <translation id="7272437679830969316">Не удалось пройти проверку. Пароль не скопирован.</translation> -<translation id="7285236536143823449">ОК</translation> <translation id="7291368939935408496">Подготовка паролей…</translation> <translation id="7293171162284876153">Чтобы начать ее, нажмите "Синхронизировать данные Chrome".</translation> <translation id="7336264872878993241">Скачивается: <ph name="PERCENT" />%</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Использовать камеру</translation> <translation id="7464701184726199289">Синхронизированные данные будут удалены со всех устройств. Настройки сайтов не изменятся, поэтому данные о вашей работе в Интернете сохранятся. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Название компании</translation> +<translation id="7473891865547856676">Пропустить</translation> <translation id="7481312909269577407">Вперед</translation> <translation id="750493650310597496">Закладки не выбраны</translation> <translation id="7514365320538308">Скачать</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Вчера</translation> <translation id="778855399387580014">Запускайте поиск в новой вкладке Chrome.</translation> <translation id="7791543448312431591">Добавить</translation> -<translation id="780301667611848630">Спасибо, не надо</translation> <translation id="7840771868269352570">Выбранные элементы будут удалены</translation> <translation id="7856733331829174190">Не удалось скачать файл</translation> <translation id="7859704718976024901">История просмотра веб-страниц</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Недавно закрытые</translation> <translation id="8881801611828450202">Найти это изображение в <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Поделиться...</translation> +<translation id="8917490105272468696">Включить функцию</translation> <translation id="895541991026785598">Сообщить о проблеме</translation> <translation id="8976382372951310360">Справка</translation> <translation id="8981454092730389528">Отслеживание действий в Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 5a504c89..34cae04 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">0 ක් තෝරා ගන්නා ලදි</translation> <translation id="2421044535038393232">සංස්කරණ කර ගෙන යන්න</translation> <translation id="2435457462613246316">මුරපදය පෙන්වන්න</translation> -<translation id="2481538920734869610">ගිණුම එක් කරන්න</translation> <translation id="2497852260688568942">සමමුහුර්ත කිරීම ඔබේ පරිපාලක විසින් අබල කර ඇත</translation> <translation id="2500374554657206846">මුරපදය සුරැකීමට විකල්ප</translation> <translation id="2523363575747517183">මෙම වෙබ් අඩවිය තවත් යෙදුමක් විවෘත කිරීමට නැවත නැවතත් උත්සාහ කරයි.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">පිළිතුරු ආපසු දෙන්න</translation> <translation id="7265758999917665941">කිසි විටෙක මෙම වෙබ් අඩවිය සඳහා නැත</translation> <translation id="7272437679830969316">ඔබගේ අනන්යතාව තහවුරු කළ නොහැකිය. මුරපදය පිටපත් නොකරන ලදී.</translation> -<translation id="7285236536143823449">ඔව්, මම එනවා</translation> <translation id="7291368939935408496">මුරපද සූදානම් කරමින්...</translation> <translation id="7293171162284876153">සමමුහුර්තය ඇරඹීමට, "ඔබේ Chrome දත්ත සමමුහුර්තය" ක්රියාත්මක කරන්න.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> ක් බාගන්නා ලදි</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">කැමරාව භාවිත කරන්න</translation> <translation id="7464701184726199289">සියලු උපාංග වලින් සමමුහුර්ත කළ දත්ත මෙයින් හිස් කරයි. සුරැකි අඩවි සැකසීම් නොමැකෙනු ඇති අතර එයින් ඔබගේ බ්රවුස් කිරීමේ පුරුදු පිළිබිඹු විය හැක. <ph name="BEGIN_LINK" />තවත් දැන ගන්න<ph name="END_LINK" /></translation> <translation id="7472734401283673885">සමාගමේ නම</translation> +<translation id="7473891865547856676">එපා ස්තූතියි</translation> <translation id="7481312909269577407">ඉදිරියට යන්න</translation> <translation id="750493650310597496">0 තේරා ගන්නා ලදි</translation> <translation id="7514365320538308">බාගන්න</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">ඊයේ</translation> <translation id="778855399387580014">නව Chrome පටිත්තක් තුළ සෙවීම ආරම්භ කරන්න.</translation> <translation id="7791543448312431591">එක් කරන්න</translation> -<translation id="780301667611848630">එපා, ස්තූතියි</translation> <translation id="7840771868269352570">ඔබ තෝරාගත් අයිතම ඉවත් කෙරෙනු ඇත.</translation> <translation id="7856733331829174190">බාගැනීමට නොහැකි විය</translation> <translation id="7859704718976024901">බ්රවුස් කිරීමේ ඉතිහාසය</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">මෑතකදී වසන ලද</translation> <translation id="8881801611828450202">මෙම රූපය සඳහා <ph name="SEARCH_ENGINE" /> සොයන්න</translation> <translation id="8909135823018751308">බෙදාගන්න…</translation> +<translation id="8917490105272468696">ඔව්, මම කැමතියි</translation> <translation id="895541991026785598">ගැටලුවක් වාර්තා කරන්න</translation> <translation id="8976382372951310360">උදවු</translation> <translation id="8981454092730389528">Google ක්රියාකාරකම් පාලනය</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index effa3f0..d6fdb156 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Počet vybratých fotografií: 1</translation> <translation id="2421044535038393232">Ďalej upravovať</translation> <translation id="2435457462613246316">Zobraziť heslo</translation> -<translation id="2481538920734869610">PRIDAŤ ÚČET</translation> <translation id="2497852260688568942">Synchronizácia je zakázaná správcom</translation> <translation id="2500374554657206846">Možnosti uloženia hesla</translation> <translation id="2523363575747517183">Tento web sa opakovane pokúša otvoriť ďalšiu aplikáciu.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Vysloviť odpovede</translation> <translation id="7265758999917665941">Nikdy pre tento web</translation> <translation id="7272437679830969316">Vašu totožnosť nie je možné overiť. Heslo sa neskopírovalo.</translation> -<translation id="7285236536143823449">ÁNO, SÚHLASÍM</translation> <translation id="7291368939935408496">Pripravujú sa heslá...</translation> <translation id="7293171162284876153">Ak chcete spustiť synchronizáciu, zapnite možnosť „Synchronizovať údaje Chromu“.</translation> <translation id="7336264872878993241">Stiahnuté: <ph name="PERCENT" /> percent</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Použiť fotoaparát</translation> <translation id="7464701184726199289">Táto akcia vymaže synchronizované údaje zo všetkých zariadení. Uložené nastavenia webov sa neodstránia a môžu odrážať vaše návyky prehliadania. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Názov spoločnosti</translation> +<translation id="7473891865547856676">Nie, ďakujem</translation> <translation id="7481312909269577407">Dopredu</translation> <translation id="750493650310597496">Počet vybraných záložiek: 0</translation> <translation id="7514365320538308">Stiahnuť</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Včera</translation> <translation id="778855399387580014">Začnite vyhľadávanie na novej karte Chrome.</translation> <translation id="7791543448312431591">Pridať</translation> -<translation id="780301667611848630">Nie, ďakujem</translation> <translation id="7840771868269352570">Vybrané položky budú odstránené.</translation> <translation id="7856733331829174190">Sťahovanie zlyhalo</translation> <translation id="7859704718976024901">História prehliadania</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nedávno zatvorené</translation> <translation id="8881801611828450202">Hľadať tento obrázok v službe <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Zdieľať…</translation> +<translation id="8917490105272468696">Áno, súhlasím</translation> <translation id="895541991026785598">Nahlásiť problém</translation> <translation id="8976382372951310360">Pomocník</translation> <translation id="8981454092730389528">Riadenie aktivity Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index eb77a44..c1aed19 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 izbrana</translation> <translation id="2421044535038393232">Nadaljuj urejanje</translation> <translation id="2435457462613246316">Pokaži geslo</translation> -<translation id="2481538920734869610">DODAJ RAČUN</translation> <translation id="2497852260688568942">Sinhronizacijo je onemogočil skrbnik</translation> <translation id="2500374554657206846">Možnosti shranjevanja gesel</translation> <translation id="2523363575747517183">To spletno mesto nenehno poskuša odpreti drugo aplikacijo.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Izgovorjava odgovorov</translation> <translation id="7265758999917665941">Nikoli za to spletno mesto</translation> <translation id="7272437679830969316">Identitete ni mogoče preveriti. Geslo ni kopirano.</translation> -<translation id="7285236536143823449">DA, SEM ZA</translation> <translation id="7291368939935408496">Pripravljanje gesel ...</translation> <translation id="7293171162284876153">Če želite začeti sinhronizacijo, vklopite »Sinhronizacija podatkov v Chromu«.</translation> <translation id="7336264872878993241">Preneseno: <ph name="PERCENT" /> %</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Uporabi fotoaparat</translation> <translation id="7464701184726199289">S tem bodo sinhronizirani podatki izbrisani iz vseh naprav. Shranjene nastavitve spletnih mest ne bodo izbrisane in morda odražajo vaše brskalne navade. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Ime podjetja</translation> +<translation id="7473891865547856676">Ne, hvala</translation> <translation id="7481312909269577407">Naprej</translation> <translation id="750493650310597496">0 izbranih</translation> <translation id="7514365320538308">Prenos</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Včeraj</translation> <translation id="778855399387580014">Začnite iskanje na novem Chromovem zavihku.</translation> <translation id="7791543448312431591">Dodaj</translation> -<translation id="780301667611848630">Ne, hvala</translation> <translation id="7840771868269352570">Izbrani elementi bodo odstranjeni.</translation> <translation id="7856733331829174190">Prenos ni uspel</translation> <translation id="7859704718976024901">Zgodovina brskanja</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nedavno zaprto</translation> <translation id="8881801611828450202">Uporabi <ph name="SEARCH_ENGINE" /> za iskanje te slike</translation> <translation id="8909135823018751308">Skupna raba …</translation> +<translation id="8917490105272468696">Da, sem za</translation> <translation id="895541991026785598">Prijavite težavo</translation> <translation id="8976382372951310360">Pomoč</translation> <translation id="8981454092730389528">Googlovi kontrolniki za dejavnost</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index c977f53c3..f019f1c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 e përzgjedhur</translation> <translation id="2421044535038393232">Vazhdo modifikimin</translation> <translation id="2435457462613246316">Shfaq fjalëkalimin</translation> -<translation id="2481538920734869610">SHTO LLOGARI</translation> <translation id="2497852260688568942">Sinkronizimi është çaktivizuar nga administratori</translation> <translation id="2500374554657206846">Opsionet për të ruajtur fjalëkalimin</translation> <translation id="2523363575747517183">Ky sajt uebi po përpiqet vazhdimisht të hapë një aplikacion tjetër.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Thuaji përgjigjet mbrapsht</translation> <translation id="7265758999917665941">Asnjëherë për këtë faqe</translation> <translation id="7272437679830969316">Nuk mund të verifikohet identiteti yt. Fjalëkalimi nuk u kopjua.</translation> -<translation id="7285236536143823449">PO, JAM DAKORD</translation> <translation id="7291368939935408496">Po përgatit fjalëkalimet...</translation> <translation id="7293171162284876153">Për të nisur sinkronizimin, aktivizo "Sinkronizo të dhënat e tua të Chrome".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> përqind të shkarkuara</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Përdor kamerën</translation> <translation id="7464701184726199289">Kjo pastron të dhënat e sinkronizuara nga të gjitha pajisjet. Cilësimet e ruajtura të sajteve nuk do të fshihen dhe mund të pasqyrojnë zakonet e tua të shfletimit. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Emri i kompanisë</translation> +<translation id="7473891865547856676">Jo, faleminderit</translation> <translation id="7481312909269577407">Përpara</translation> <translation id="750493650310597496">0 të përzgjedhura</translation> <translation id="7514365320538308">Shkarko</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Dje</translation> <translation id="778855399387580014">Nis një kërkim në një skedë të re Chrome.</translation> <translation id="7791543448312431591">Shtoje</translation> -<translation id="780301667611848630">Jo, faleminderit</translation> <translation id="7840771868269352570">Artikujt që zgjodhe do të hiqen.</translation> <translation id="7856733331829174190">Nuk mundi të shkarkohej</translation> <translation id="7859704718976024901">Historiku i shfletimit</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Të mbyllura së fundi</translation> <translation id="8881801611828450202">Kërko në <ph name="SEARCH_ENGINE" /> për këtë imazh</translation> <translation id="8909135823018751308">Ndaj…</translation> +<translation id="8917490105272468696">Po, jam dakord</translation> <translation id="895541991026785598">Raporto një problem</translation> <translation id="8976382372951310360">Ndihma</translation> <translation id="8981454092730389528">Kontrollet e aktivitetit të Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index f002559..9fae7bfa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Izabrana je 1 slika</translation> <translation id="2421044535038393232">Nastavi izmene</translation> <translation id="2435457462613246316">Prikaži lozinku</translation> -<translation id="2481538920734869610">DODAJ NALOG</translation> <translation id="2497852260688568942">Administrator je onemogućio sinhronizaciju</translation> <translation id="2500374554657206846">Opcije za čuvanje lozinke</translation> <translation id="2523363575747517183">Ovaj veb-sajt neprekidno pokušava da otvori drugu aplikaciju.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Izgovaraj odgovore</translation> <translation id="7265758999917665941">Nikada za ovaj sajt</translation> <translation id="7272437679830969316">Verifikacija identiteta nije uspela. Lozinka nije kopirana.</translation> -<translation id="7285236536143823449">DA, SLAŽEM SE</translation> <translation id="7291368939935408496">Pripremaju se lozinke...</translation> <translation id="7293171162284876153">Da biste pokrenuli sinhronizaciju, uključite opciju „Sinhronizujte Chrome podatke“.</translation> <translation id="7336264872878993241">Procenat preuzimanja: <ph name="PERCENT" /></translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Koristi Kameru</translation> <translation id="7464701184726199289">Ovo će obrisati sinhronizovane podatke sa svih uređaja. Nećemo izbrisati sačuvana podešavanja sajtova i ona mogu da odražavaju vaše navike pri pregledanju. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Naziv kompanije</translation> +<translation id="7473891865547856676">Ne, hvala</translation> <translation id="7481312909269577407">Prosledi</translation> <translation id="750493650310597496">Izabrano je 0 stavki</translation> <translation id="7514365320538308">Preuzmi</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Juče</translation> <translation id="778855399387580014">Započnite pretragu na novoj Chrome kartici.</translation> <translation id="7791543448312431591">Dodaj</translation> -<translation id="780301667611848630">Ne, hvala</translation> <translation id="7840771868269352570">Stavke koje ste izabrali će biti uklonjene.</translation> <translation id="7856733331829174190">Preuzimanje nije uspelo</translation> <translation id="7859704718976024901">Istorija pregledanja</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nedavno zatvoreno</translation> <translation id="8881801611828450202">Pretraži ovu sliku u <ph name="SEARCH_ENGINE" />-u</translation> <translation id="8909135823018751308">Deli...</translation> +<translation id="8917490105272468696">Da, omogući</translation> <translation id="895541991026785598">Prijavite problem</translation> <translation id="8976382372951310360">Pomoć</translation> <translation id="8981454092730389528">Google kontrole aktivnosti</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 498ec0f..493b3a50 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Изабрана је 1 слика</translation> <translation id="2421044535038393232">Настави изменe</translation> <translation id="2435457462613246316">Прикажи лозинку</translation> -<translation id="2481538920734869610">ДОДАЈ НАЛОГ</translation> <translation id="2497852260688568942">Администратор је онемогућио синхронизацију</translation> <translation id="2500374554657206846">Опције за чување лозинке</translation> <translation id="2523363575747517183">Овај веб-сајт непрекидно покушава да отвори другу апликацију.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Изговарај одговоре</translation> <translation id="7265758999917665941">Никада за овај сајт</translation> <translation id="7272437679830969316">Верификација идентитета није успела. Лозинка није копирана.</translation> -<translation id="7285236536143823449">ДА, СЛАЖЕМ СЕ</translation> <translation id="7291368939935408496">Припремају се лозинке...</translation> <translation id="7293171162284876153">Да бисте покренули синхронизацију, укључите опцију „Синхронизујте Chrome податке“.</translation> <translation id="7336264872878993241">Проценат преузимања: <ph name="PERCENT" /></translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Користи Камеру</translation> <translation id="7464701184726199289">Ово ће обрисати синхронизоване податке са свих уређаја. Нећемо избрисати сачувана подешавања сајтова и она могу да одражавају ваше навике при прегледању. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Назив компаније</translation> +<translation id="7473891865547856676">Не, хвала</translation> <translation id="7481312909269577407">Проследи</translation> <translation id="750493650310597496">Изабрано је 0 ставки</translation> <translation id="7514365320538308">Преузми</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Јуче</translation> <translation id="778855399387580014">Започните претрагу на новој Chrome картици.</translation> <translation id="7791543448312431591">Додај</translation> -<translation id="780301667611848630">Не, хвала</translation> <translation id="7840771868269352570">Ставке које сте изабрали ће бити уклоњене.</translation> <translation id="7856733331829174190">Преузимање није успело</translation> <translation id="7859704718976024901">Историја прегледања</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Недавно затворено</translation> <translation id="8881801611828450202">Претражи ову слику у <ph name="SEARCH_ENGINE" />-у</translation> <translation id="8909135823018751308">Дели...</translation> +<translation id="8917490105272468696">Да, омогући</translation> <translation id="895541991026785598">Пријавите проблем</translation> <translation id="8976382372951310360">Помоћ</translation> <translation id="8981454092730389528">Google контроле активности</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index b2d9f88..a9b86da 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 markerat foto</translation> <translation id="2421044535038393232">Fortsätt redigera</translation> <translation id="2435457462613246316">Visa lösenord</translation> -<translation id="2481538920734869610">LÄGG TILL KONTO</translation> <translation id="2497852260688568942">Synkronisering har inaktiverats av administratören</translation> <translation id="2500374554657206846">Alternativ för att spara lösenord</translation> <translation id="2523363575747517183">Webbplatsen försöker öppna ett annat program upprepade gånger.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Läs upp svaren</translation> <translation id="7265758999917665941">Aldrig på den här webbplatsen</translation> <translation id="7272437679830969316">Det gick inte att verifiera din identitet. Lösenordet har inte kopierats.</translation> -<translation id="7285236536143823449">JA</translation> <translation id="7291368939935408496">Lösenorden förbereds …</translation> <translation id="7293171162284876153">Starta synkroniseringen genom att aktivera Synkronisera data i Chrome.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> procent har laddats ned</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Använd Kamera</translation> <translation id="7464701184726199289">Inställningarna rensar synkroniserad data från alla enheter. Sparade webbplatsinställningar raderas inte och kan visa dina surfvanor. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Företagets namn</translation> +<translation id="7473891865547856676">Nej tack</translation> <translation id="7481312909269577407">Framåt</translation> <translation id="750493650310597496">0 valda</translation> <translation id="7514365320538308">Ladda ned</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Igår</translation> <translation id="778855399387580014">Börja söka på en ny Chrome-flik.</translation> <translation id="7791543448312431591">Lägg till</translation> -<translation id="780301667611848630">Nej tack</translation> <translation id="7840771868269352570">De markerade objekten tas bort.</translation> <translation id="7856733331829174190">Nedladdning misslyckades</translation> <translation id="7859704718976024901">Webbhistorik</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Nyligen stängda</translation> <translation id="8881801611828450202">Sök på <ph name="SEARCH_ENGINE" /> efter denna bild</translation> <translation id="8909135823018751308">Dela …</translation> +<translation id="8917490105272468696">Ja</translation> <translation id="895541991026785598">Rapportera ett problem</translation> <translation id="8976382372951310360">Hjälp</translation> <translation id="8981454092730389528">Googles aktivitetsinställningar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 81408dd..d46eb87 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 iliyochaguliwa</translation> <translation id="2421044535038393232">Endelea Kubadilisha</translation> <translation id="2435457462613246316">Onyesha nenosiri</translation> -<translation id="2481538920734869610">ONGEZA AKAUNTI</translation> <translation id="2497852260688568942">Usawazishaji umezimwa na msimamizi wako</translation> <translation id="2500374554657206846">Chaguo za Kuhifadhi Nenosiri</translation> <translation id="2523363575747517183">Tovuti hii inajaribu kufungua programu nyingine mara kwa mara.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Tamka Majibu</translation> <translation id="7265758999917665941">Isikumbuke Kamwe Katika Tovuti Hii</translation> <translation id="7272437679830969316">Utambulisho wako haujathibitishwa. Nenosiri halijanakiliwa.</translation> -<translation id="7285236536143823449">NDIYO, NINAKUBALI</translation> <translation id="7291368939935408496">Inatayarisha Manenosiri...</translation> <translation id="7293171162284876153">Ili uanze kusawazisha, washa mipangilio ya "Sawazisha data yako kwenye Chrome".</translation> <translation id="7336264872878993241">Faili imepakuliwa asilimia <ph name="PERCENT" /></translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Tumia Kamera</translation> <translation id="7464701184726199289">Hatua hii itafuta data iliyosawazishwa kwenye vifaa vyote. Mipangilio ya tovuti iliyohifadhiwa haitafutwa na inaweza kuonyesha mtindo wako wa kuvinjari. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Jina la Kampuni</translation> +<translation id="7473891865547856676">La Asante</translation> <translation id="7481312909269577407">Mbele</translation> <translation id="750493650310597496">Hakuna zilizochaguliwa</translation> <translation id="7514365320538308">Pakua</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Jana</translation> <translation id="778855399387580014">Anza kutafuta ukitumia kichupo kipya cha Chrome.</translation> <translation id="7791543448312431591">Ongeza</translation> -<translation id="780301667611848630">Hapana</translation> <translation id="7840771868269352570">Vipengele ambavyo umechagua vitaondolewa.</translation> <translation id="7856733331829174190">Imeshindwa Kupakua</translation> <translation id="7859704718976024901">Historia ya Kuvinjari</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Zilizofungwa Hivi Karibuni</translation> <translation id="8881801611828450202">Tafuta Picha Hii kwenye <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Shiriki...</translation> +<translation id="8917490105272468696">Ndiyo, Ninakubali</translation> <translation id="895541991026785598">Ripoti Tatizo</translation> <translation id="8976382372951310360">Usaidizi</translation> <translation id="8981454092730389528">Vidhibiti vya Shughuli za Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 44d328f..cd409ad 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 தேர்ந்தெடுப்பட்டது</translation> <translation id="2421044535038393232">தொடர்ந்து திருத்து</translation> <translation id="2435457462613246316">கடவுச்சொல்லைக் காண்பி</translation> -<translation id="2481538920734869610">கணக்கைச் சேர்</translation> <translation id="2497852260688568942">உங்கள் நிர்வாகி ஒத்திசைவை முடக்கியுள்ளார்</translation> <translation id="2500374554657206846">கடவுச்சொல்லைச் சேமிப்பதற்கான விருப்பத்தேர்வுகள்</translation> <translation id="2523363575747517183">இந்த இணையதளம், மற்றொரு பயன்பாட்டைத் திறப்பதற்கு மீண்டும் மீண்டும் முயல்கிறது.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">பதில்களை மீண்டும் படி</translation> <translation id="7265758999917665941">இந்தத் தளத்திற்கு எப்போதும் வேண்டாம்</translation> <translation id="7272437679830969316">அடையாளத்தைச் சரிபார்க்க முடியவில்லை. கடவுச்சொல் நகலெடுக்கப்படவில்லை.</translation> -<translation id="7285236536143823449">ஏற்கிறேன்</translation> <translation id="7291368939935408496">கடவுச்சொற்கள் தயாராகின்றன...</translation> <translation id="7293171162284876153">ஒத்திசைவைத் தொடங்க "Chrome தரவை ஒத்திசை" என்பதை இயக்கவும்.</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> சதவீதம் பதிவிறக்கப்பட்டது</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">கேமராவைப் பயன்படுத்து</translation> <translation id="7464701184726199289">இது எல்லா சாதனங்களிலிருந்தும் ஒத்திசைத்த தரவை அழிக்கும். சேமித்த தள அமைப்புகள் நீக்கப்படாது, அவை உங்கள் உலாவல் தகவல்களைப் பிரதிபலிக்கக்கூடும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="7472734401283673885">நிறுவனப் பெயர்</translation> +<translation id="7473891865547856676">வேண்டாம் நன்றி</translation> <translation id="7481312909269577407">அடுத்த பக்கம்</translation> <translation id="750493650310597496">எதுவும் தேர்ந்தெடுக்கப்படவில்லை</translation> <translation id="7514365320538308">பதிவிறக்கு</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">நேற்று</translation> <translation id="778855399387580014">புதிய Chrome தாவலில் தேடலைத் தொடங்கும்.</translation> <translation id="7791543448312431591">சேர்</translation> -<translation id="780301667611848630">தேவையில்லை</translation> <translation id="7840771868269352570">நீங்கள் தேர்ந்தெடுத்தவை அகற்றப்படும்.</translation> <translation id="7856733331829174190">பதிவிறக்க முடியவில்லை</translation> <translation id="7859704718976024901">உலாவல் வரலாறு</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">சமீபத்தில் மூடியவை</translation> <translation id="8881801611828450202">இந்தப் படத்தை <ph name="SEARCH_ENGINE" /> இல் தேடு</translation> <translation id="8909135823018751308">பகிர்...</translation> +<translation id="8917490105272468696">ஏற்கிறேன்</translation> <translation id="895541991026785598">சிக்கலைப் புகார் செய்க</translation> <translation id="8976382372951310360">உதவி</translation> <translation id="8981454092730389528">Google செயல்பாட்டுக் கட்டுப்பாடுகள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 7a9c49a..889cc9a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ఎంచుకోబడింది</translation> <translation id="2421044535038393232">సవరణను కొనసాగించు</translation> <translation id="2435457462613246316">పాస్వర్డ్ను చూపించు</translation> -<translation id="2481538920734869610">ఖాతాను జోడించు</translation> <translation id="2497852260688568942">సింక్ను మీ నిర్వాహకులు నిలిపివేశారు</translation> <translation id="2500374554657206846">పాస్వర్డ్ను సేవ్ చేసే ఎంపికలు</translation> <translation id="2523363575747517183">ఈ వెబ్సైట్ మరో అప్లికేషన్ను తెరవడానికి పలుసార్లు ప్రయత్నిస్తోంది.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">సమాధానాలను చదివి వినిపించు</translation> <translation id="7265758999917665941">ఈ సైట్ కోసం ఎప్పటికీ వద్దు</translation> <translation id="7272437679830969316">మీ గుర్తింపును ధృవీకరించడం సాధ్యపడలేదు. పాస్వర్డ్ కాపీ చేయబడలేదు.</translation> -<translation id="7285236536143823449">సరే, నాకు సమ్మతమే</translation> <translation id="7291368939935408496">పాస్వర్డ్లను సిద్ధం చేస్తోంది...</translation> <translation id="7293171162284876153">సింక్ను మొదలుపెట్టడానికి, "మీ Chrome డేటాను సింక్ చేయడం" ఆన్ చేయండి</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> శాతం డౌన్లోడ్ అయ్యింది</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">కెమెరాను ఉపయోగించు</translation> <translation id="7464701184726199289">ఇది అన్ని పరికరాల నుండి సింక్ చేయబడిన డేటాను తీసివేస్తుంది. సేవ్ చేసిన సైట్ సెట్టింగ్లు తొలగించబడవు, ఇవి మీ బ్రౌజింగ్ అలవాట్లను ప్రదర్శించవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="7472734401283673885">కంపెనీ పేరు</translation> +<translation id="7473891865547856676">వద్దు, ధన్యవాదాలు</translation> <translation id="7481312909269577407">ఫార్వర్డ్</translation> <translation id="750493650310597496">0 ఎంచుకోబడ్డాయి</translation> <translation id="7514365320538308">డౌన్లోడ్ చేయి</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">నిన్న</translation> <translation id="778855399387580014">కొత్త Chrome ట్యాబ్లో శోధనను ప్రారంభించండి.</translation> <translation id="7791543448312431591">జోడించు</translation> -<translation id="780301667611848630">వద్దు , ధన్యవాదాలు</translation> <translation id="7840771868269352570">మీరు ఎంచుకున్న అంశాలు తీసివేయబడతాయి.</translation> <translation id="7856733331829174190">డౌన్లోడ్ సాధ్యపడలేదు</translation> <translation id="7859704718976024901">బ్రౌజింగ్ చరిత్ర</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">ఇటీవల మూసివేసినవి</translation> <translation id="8881801611828450202">ఈ చిత్రం కోసం <ph name="SEARCH_ENGINE" />ని వెతకండి</translation> <translation id="8909135823018751308">భాగస్వామ్యం చేయి…</translation> +<translation id="8917490105272468696">సరే, నాకు సమ్మతమే</translation> <translation id="895541991026785598">ఒక సమస్యను నివేదించండి</translation> <translation id="8976382372951310360">సహాయం</translation> <translation id="8981454092730389528">Google కార్యకలాపాల నియంత్రణలు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 47fb189..b66e093 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">เลือก 1 รูป</translation> <translation id="2421044535038393232">แก้ไขต่อไป</translation> <translation id="2435457462613246316">แสดงรหัสผ่าน</translation> -<translation id="2481538920734869610">เพิ่มบัญชี</translation> <translation id="2497852260688568942">ผู้ดูแลระบบปิดใช้การซิงค์</translation> <translation id="2500374554657206846">ตัวเลือกในการบันทึกรหัสผ่าน</translation> <translation id="2523363575747517183">เว็บไซต์นี้พยายามเปิดแอปพลิเคชันอื่นอยู่เรื่อยๆ</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">พูดคำตอบกลับ</translation> <translation id="7265758999917665941">ไม่จดจำสำหรับเว็บไซต์นี้</translation> <translation id="7272437679830969316">ยืนยันตัวตนของคุณไม่ได้ คัดลอกรหัสผ่านไม่สำเร็จ</translation> -<translation id="7285236536143823449">ได้สิ ตกลง</translation> <translation id="7291368939935408496">กำลังเตรียมรหัสผ่าน...</translation> <translation id="7293171162284876153">หากต้องการเริ่มซิงค์ ให้เปิด "ซิงค์ข้อมูล Chrome"</translation> <translation id="7336264872878993241">ดาวน์โหลดแล้ว <ph name="PERCENT" /> เปอร์เซ็นต์</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">ใช้กล้องถ่ายรูป</translation> <translation id="7464701184726199289">การดำเนินการนี้จะล้างข้อมูลที่ซิงค์จากอุปกรณ์ทั้งหมด การตั้งค่าเว็บไซต์ที่บันทึกไว้จะไม่ถูกลบและอาจส่งผลกับลักษณะการท่องเว็บของคุณ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation> <translation id="7472734401283673885">ชื่อบริษัท</translation> +<translation id="7473891865547856676">ไม่ ขอบคุณ</translation> <translation id="7481312909269577407">ส่งต่อ</translation> <translation id="750493650310597496">เลือก 0 รายการ</translation> <translation id="7514365320538308">ดาวน์โหลด</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">เมื่อวานนี้</translation> <translation id="778855399387580014">เริ่มการค้นหาในแท็บใหม่ของ Chrome</translation> <translation id="7791543448312431591">เพิ่ม</translation> -<translation id="780301667611848630">ไม่ ขอบคุณ</translation> <translation id="7840771868269352570">ระบบจะนำรายการที่คุณเลือกออก</translation> <translation id="7856733331829174190">ดาวน์โหลดไม่ได้</translation> <translation id="7859704718976024901">ประวัติการเข้าชม</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">เพิ่งปิด</translation> <translation id="8881801611828450202">ค้นหาภาพนี้ใน <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">แชร์…</translation> +<translation id="8917490105272468696">ได้สิ ตกลง</translation> <translation id="895541991026785598">รายงานปัญหา</translation> <translation id="8976382372951310360">ความช่วยเหลือ</translation> <translation id="8981454092730389528">ส่วนควบคุมกิจกรรมของ Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 29e740b..15ae313 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 fotoğraf seçildi</translation> <translation id="2421044535038393232">Düzenlemeye Devam Et</translation> <translation id="2435457462613246316">Şifreyi göster</translation> -<translation id="2481538920734869610">HESAP EKLE</translation> <translation id="2497852260688568942">Yöneticiniz senkronizasyonu devre dışı bıraktı</translation> <translation id="2500374554657206846">Şifre Kaydetme Seçenekleri</translation> <translation id="2523363575747517183">Bu web sitesi sürekli başka bir uygulama açmaya çalışıyor.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Yanıtı Sesli Söyle</translation> <translation id="7265758999917665941">Bu Site İçin Hiçbir Zaman</translation> <translation id="7272437679830969316">Kimliğiniz doğrulanamıyor. Şifre kopyalanmadı.</translation> -<translation id="7285236536143823449">EVET, İSTİYORUM</translation> <translation id="7291368939935408496">Şifreler Hazırlanıyor...</translation> <translation id="7293171162284876153">Senkronizasyonu başlatmak için "Chrome verilerimi senkronize et" ayarını etkinleştirin.</translation> <translation id="7336264872878993241">Yüzde <ph name="PERCENT" /> indirildi</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Kamerayı Kullan</translation> <translation id="7464701184726199289">Bu işlem, senkronize edilen verileri tüm cihazlardan siler. Kayıtlı site ayarları silinmez ve web'e göz atma alışkanlıklarınızı yansıtabilir. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Şirket Adı</translation> +<translation id="7473891865547856676">Hayır, Teşekkürler</translation> <translation id="7481312909269577407">İleri</translation> <translation id="750493650310597496">0 yer işareti seçildi</translation> <translation id="7514365320538308">İndir</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Dün</translation> <translation id="778855399387580014">Yeni bir Chrome sekmesinde arama başlatır.</translation> <translation id="7791543448312431591">Ekle</translation> -<translation id="780301667611848630">Hayır, teşekkürler</translation> <translation id="7840771868269352570">Seçtiğiniz öğeler kaldırılacak.</translation> <translation id="7856733331829174190">İndirilemedi</translation> <translation id="7859704718976024901">Tarama Geçmişi</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Son Kapatılan</translation> <translation id="8881801611828450202">Bu Resmi <ph name="SEARCH_ENGINE" /> Üzerinde Ara</translation> <translation id="8909135823018751308">Paylaş…</translation> +<translation id="8917490105272468696">Evet, istiyorum</translation> <translation id="895541991026785598">Sorun Bildirin</translation> <translation id="8976382372951310360">Yardım</translation> <translation id="8981454092730389528">Google Etkinlik Kontrolleri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 6dd65e1..557e7d8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Вибрано 1</translation> <translation id="2421044535038393232">Продовжити редагувати</translation> <translation id="2435457462613246316">Показати пароль</translation> -<translation id="2481538920734869610">ДОД. ОБЛ. ЗАПИС</translation> <translation id="2497852260688568942">Ваш адміністратор вимкнув синхронізацію</translation> <translation id="2500374554657206846">Опції для збереження паролів</translation> <translation id="2523363575747517183">Цей веб-сайт періодично намагається відкрити інший додаток.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Озвучувати відповіді</translation> <translation id="7265758999917665941">Ніколи для цього сайту</translation> <translation id="7272437679830969316">Не вдалося підтвердити особу. Пароль не скопійовано.</translation> -<translation id="7285236536143823449">ТАК, УВІМКНУТИ</translation> <translation id="7291368939935408496">Готуються паролі…</translation> <translation id="7293171162284876153">Щоб почати синхронізацію, увімкніть параметр "Синхронізувати дані Chrome".</translation> <translation id="7336264872878993241">Завантажено <ph name="PERCENT" />%</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Відкрити камеру</translation> <translation id="7464701184726199289">Синхронізовані дані буде видалено з усіх пристроїв. Збережені налаштування, які можуть стосуватися ваших зацікавлень в Інтернеті, не буде видалено. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Назва компанії</translation> +<translation id="7473891865547856676">Ні, дякую</translation> <translation id="7481312909269577407">Переслати</translation> <translation id="750493650310597496">Вибрано 0</translation> <translation id="7514365320538308">Завантажити</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Учора</translation> <translation id="778855399387580014">Пошук у новій вкладці Chrome.</translation> <translation id="7791543448312431591">Додати</translation> -<translation id="780301667611848630">Ні, дякую</translation> <translation id="7840771868269352570">Вибраний елемент буде видалено.</translation> <translation id="7856733331829174190">Не вдалося завантажити</translation> <translation id="7859704718976024901">Історія веб-перегляду</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Нещодавно закриті</translation> <translation id="8881801611828450202">Пошук цього зображення в <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Надіслати…</translation> +<translation id="8917490105272468696">Так</translation> <translation id="895541991026785598">Повідомити про проблему</translation> <translation id="8976382372951310360">Довідка</translation> <translation id="8981454092730389528">Відстеження дій у Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 4dfe677..992836f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 کو منتخب کیا گیا</translation> <translation id="2421044535038393232">ترمیم جاری رکھیں</translation> <translation id="2435457462613246316">پاس ورڈ دکھائیں</translation> -<translation id="2481538920734869610">اکاؤنٹ شامل کریں</translation> <translation id="2497852260688568942">مطابقت پذیری کو آپ کے منتظم نے غیر فعال کر دیا ہے</translation> <translation id="2500374554657206846">پاس ورڈ محفوظ کرنے کے اختیارات</translation> <translation id="2523363575747517183">یہ ویب سائٹ بار بار ایک اور ایپلیکیشن کھولنے کی کوشش کر رہی ہے۔</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">جوابات دوبارہ بولیں</translation> <translation id="7265758999917665941">اس سائٹ کیلئے کبھی نہیں</translation> <translation id="7272437679830969316">آپ کی شناخت کی توثیق نہیں کی جا سکتی۔ پاسورڈ کاپی نہیں ہوا۔</translation> -<translation id="7285236536143823449">ہاں، میں شامل ہوں</translation> <translation id="7291368939935408496">پاسورڈز تیار کیے جا رہے ہيں...</translation> <translation id="7293171162284876153">مطابقت پذیری شروع کرنے کے لیے، "اپنے Chrome ڈیٹا کو مطابقت پذیر بنائیں" کو آن کریں۔</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> فیصد ڈاؤن لوڈ ہوگئی۔</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">کیمرا استعمال کریں</translation> <translation id="7464701184726199289">یہ سبھی آلات سے مطابقت پذیر ڈیٹا کو صاف کرتا ہے۔ محفوظ کردہ سائٹ کی ترتیبات حذف نہیں کی جائیں گی اور یہ آپ کے براؤزنگ کی عادات کی عکاسی کر سکتی ہے۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="7472734401283673885">کمپنی کا نام</translation> +<translation id="7473891865547856676">نہیں شکریہ</translation> <translation id="7481312909269577407">فارورڈ کریں</translation> <translation id="750493650310597496">0 منتخب کیا گیا</translation> <translation id="7514365320538308">ڈاؤن لوڈ کریں</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">گزشتہ کل</translation> <translation id="778855399387580014">نئے Chrome ٹیب میں تلاش شروع کریں۔</translation> <translation id="7791543448312431591">شامل کریں</translation> -<translation id="780301667611848630">نہیں شکریہ</translation> <translation id="7840771868269352570">آپ کے منتخب کردہ آئٹمز کو ہٹا دیا جائے گا۔</translation> <translation id="7856733331829174190">ڈاؤن لوڈ نہیں ہو سکی</translation> <translation id="7859704718976024901">براؤزنگ سرگزشت</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">حال ہی میں بند کردہ</translation> <translation id="8881801611828450202">اس تصویر کیلئے <ph name="SEARCH_ENGINE" /> پر تلاش کریں</translation> <translation id="8909135823018751308">اشتراک کریں…</translation> +<translation id="8917490105272468696">ہاں میں متفق ہوں</translation> <translation id="895541991026785598">ایک مسئلہ کی اطلاع دیں</translation> <translation id="8976382372951310360">مدد</translation> <translation id="8981454092730389528">Google سرگرمی کنٹرولز</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 0f98c20..bb94d89e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ta xatcho‘p tanlandi</translation> <translation id="2421044535038393232">Tahrirlashda davom etish</translation> <translation id="2435457462613246316">Parolni ko‘rsatish</translation> -<translation id="2481538920734869610">YANGI HISOB</translation> <translation id="2497852260688568942">Sinxronizatsiyani administrator o‘chirib qo‘ygan</translation> <translation id="2500374554657206846">Parollarni saqlash taklif qilinishi</translation> <translation id="2523363575747517183">Bu sayt tinimsiz boshqa ilovani ochishga urinmoqda.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Qidiruv natijalari o‘qilsin</translation> <translation id="7265758999917665941">Bu saytda hech qachon</translation> <translation id="7272437679830969316">Shaxsingiz tasdiqlanmadi. Paroldan nusxa olinmadi.</translation> -<translation id="7285236536143823449">ROZIMAN</translation> <translation id="7291368939935408496">Parollar tayyorlanmoqda...</translation> <translation id="7293171162284876153">Sinxronlashni boshlash uchun “Chrome axborotini sinxronlash” tugmasini bosing.</translation> <translation id="7336264872878993241"><ph name="PERCENT" />% yuklab olindi</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Kamera orqali skanerlash</translation> <translation id="7464701184726199289">Barcha qurilmalardagi sinxronlangan ma’lumotlar tozalanadi. Saytlarda saqlangan ma’lumotlar tozalanmaydi va brauzer faoliyatiga ta’sir qilmaydi. <ph name="BEGIN_LINK" />Batafsil<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Kompaniya nomi</translation> +<translation id="7473891865547856676">Yo‘q, rahmat</translation> <translation id="7481312909269577407">Oldinga</translation> <translation id="750493650310597496">Hech qanday xatcho‘p tanlanmadi</translation> <translation id="7514365320538308">Yuklab olish</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Kecha</translation> <translation id="778855399387580014">Yangi Chrome sahifasida qidirish.</translation> <translation id="7791543448312431591">Qo‘shish</translation> -<translation id="780301667611848630">Kerak emas</translation> <translation id="7840771868269352570">Tanlangan elementlar olib tashlanadi.</translation> <translation id="7856733331829174190">Yuklab olinmadi</translation> <translation id="7859704718976024901">Veb-sahifalarni ko‘rish tarixi</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Yaqinda yopilganlar</translation> <translation id="8881801611828450202">Bu rasmni <ph name="SEARCH_ENGINE" /> orqali qidirish</translation> <translation id="8909135823018751308">Ulashish…</translation> +<translation id="8917490105272468696">Ha, roziman</translation> <translation id="895541991026785598">Muammo haqida xabar yuborish</translation> <translation id="8976382372951310360">Yordam</translation> <translation id="8981454092730389528">Google hisobidagi harakatlarni kuzatish</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 8a01b21..ba9a9b47 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">Đã chọn 1</translation> <translation id="2421044535038393232">Tiếp tục chỉnh sửa</translation> <translation id="2435457462613246316">Hiển thị mật khẩu</translation> -<translation id="2481538920734869610">THÊM TÀI KHOẢN</translation> <translation id="2497852260688568942">Đồng bộ hóa bị quản trị viên của bạn tắt</translation> <translation id="2500374554657206846">Các tùy chọn lưu mật khẩu</translation> <translation id="2523363575747517183">Trang web này đang liên tục tìm cách mở một ứng dụng khác.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Trả lời bằng giọng nói</translation> <translation id="7265758999917665941">Không bao giờ đối với trang web này</translation> <translation id="7272437679830969316">Không thể xác minh danh tính của bạn. Chưa sao chép mật khẩu.</translation> -<translation id="7285236536143823449">CÓ, TÔI ĐỒNG Ý</translation> <translation id="7291368939935408496">Đang chuẩn bị mật khẩu...</translation> <translation id="7293171162284876153">Để bắt đầu đồng bộ hóa, hãy bật tùy chọn "Đồng bộ hóa dữ liệu của bạn trên Chrome".</translation> <translation id="7336264872878993241">Đã tải xuống <ph name="PERCENT" /> phần trăm</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Sử dụng máy ảnh</translation> <translation id="7464701184726199289">Thao tác này sẽ xóa dữ liệu được đồng bộ hóa khỏi tất cả thiết bị. Cài đặt trang web đã lưu sẽ không bị xóa và có thể phản ánh thói quen duyệt web của bạn. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Tên công ty</translation> +<translation id="7473891865547856676">Không, cảm ơn</translation> <translation id="7481312909269577407">Chuyển tiếp</translation> <translation id="750493650310597496">Đã chọn 0</translation> <translation id="7514365320538308">Tải xuống</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Hôm qua</translation> <translation id="778855399387580014">Bắt đầu tìm kiếm trong tab Chrome mới.</translation> <translation id="7791543448312431591">Thêm</translation> -<translation id="780301667611848630">Không, cảm ơn</translation> <translation id="7840771868269352570">Mục đã chọn sẽ bị xóa.</translation> <translation id="7856733331829174190">Không thể tải xuống</translation> <translation id="7859704718976024901">Lịch sử duyệt web</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Các tab đã Đóng gần đây</translation> <translation id="8881801611828450202">Tìm hình ảnh này trên <ph name="SEARCH_ENGINE" /></translation> <translation id="8909135823018751308">Chia sẻ...</translation> +<translation id="8917490105272468696">Có, tôi đồng ý</translation> <translation id="895541991026785598">Báo cáo sự cố</translation> <translation id="8976382372951310360">Trợ giúp</translation> <translation id="8981454092730389528">Kiểm soát hoạt động trên Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index 3ad707f5..fb1df0c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">已选择 1 张</translation> <translation id="2421044535038393232">继续修改</translation> <translation id="2435457462613246316">显示密码</translation> -<translation id="2481538920734869610">添加帐号</translation> <translation id="2497852260688568942">您的管理员已停用同步</translation> <translation id="2500374554657206846">保存密码的选项</translation> <translation id="2523363575747517183">该网站屡次尝试打开其他应用。</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">说出答案</translation> <translation id="7265758999917665941">此网站一律不保存密码</translation> <translation id="7272437679830969316">无法验证您的身份。未复制密码。</translation> -<translation id="7285236536143823449">立即启用</translation> <translation id="7291368939935408496">正在准备密码…</translation> <translation id="7293171162284876153">要开始同步,请开启“同步 Chrome 数据”。</translation> <translation id="7336264872878993241">已下载<ph name="PERCENT" />%</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">使用相机</translation> <translation id="7464701184726199289">这将清除所有设备上的已同步数据。已保存的网站设置将不会遭到删除,并且可能会反映您的浏览习惯。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation> <translation id="7472734401283673885">公司名称</translation> +<translation id="7473891865547856676">不,谢谢</translation> <translation id="7481312909269577407">前进</translation> <translation id="750493650310597496">未选中任何项</translation> <translation id="7514365320538308">下载</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">昨天</translation> <translation id="778855399387580014">在新的 Chrome 标签页中发起搜索。</translation> <translation id="7791543448312431591">添加</translation> -<translation id="780301667611848630">不用了,谢谢</translation> <translation id="7840771868269352570">系统将会移除您所选的各项内容。</translation> <translation id="7856733331829174190">无法下载</translation> <translation id="7859704718976024901">浏览记录</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">最近关闭的标签页</translation> <translation id="8881801611828450202">在 <ph name="SEARCH_ENGINE" /> 中搜索此图片</translation> <translation id="8909135823018751308">分享…</translation> +<translation id="8917490105272468696">我同意</translation> <translation id="895541991026785598">报告问题</translation> <translation id="8976382372951310360">帮助</translation> <translation id="8981454092730389528">Google 活动控件</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 410f1c3a..7e69a9a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">已選取 1 張</translation> <translation id="2421044535038393232">繼續編輯</translation> <translation id="2435457462613246316">顯示密碼</translation> -<translation id="2481538920734869610">新增帳戶</translation> <translation id="2497852260688568942">您的管理員已停用同步功能</translation> <translation id="2500374554657206846">儲存密碼選項</translation> <translation id="2523363575747517183">這個網站嘗試重覆開啟另一個應用程式。</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">語音答覆</translation> <translation id="7265758999917665941">一律不儲存此網站的密碼</translation> <translation id="7272437679830969316">無法驗證您的身分。未複製密碼。</translation> -<translation id="7285236536143823449">是,我同意</translation> <translation id="7291368939935408496">正在準備密碼…</translation> <translation id="7293171162284876153">如要開始同步處理,請開啟「同步處理 Chrome 資料」。</translation> <translation id="7336264872878993241">已下載 <ph name="PERCENT" /> %</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">使用相機</translation> <translation id="7464701184726199289">這會清除所有裝置上已同步的資料。系統不會刪除已儲存的網站設定,這可能會反映您的瀏覽習慣。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="7472734401283673885">公司名稱</translation> +<translation id="7473891865547856676">不用了,謝謝</translation> <translation id="7481312909269577407">向前</translation> <translation id="750493650310597496">已選取 0 個項目</translation> <translation id="7514365320538308">下載</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">昨天</translation> <translation id="778855399387580014">在新的 Chrome 分頁上開始搜尋。</translation> <translation id="7791543448312431591">新增</translation> -<translation id="780301667611848630">不用了,謝謝</translation> <translation id="7840771868269352570">您選取的項目將會被移除。</translation> <translation id="7856733331829174190">無法下載</translation> <translation id="7859704718976024901">瀏覽記錄</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">最近關閉的分頁</translation> <translation id="8881801611828450202">在 <ph name="SEARCH_ENGINE" /> 中搜尋此圖片</translation> <translation id="8909135823018751308">共用…</translation> +<translation id="8917490105272468696">係,我同意</translation> <translation id="895541991026785598">回報問題</translation> <translation id="8976382372951310360">說明</translation> <translation id="8981454092730389528">Google 活動控制項</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 5a645fb..c817ac39 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">已選取 1 張</translation> <translation id="2421044535038393232">繼續編輯</translation> <translation id="2435457462613246316">顯示密碼</translation> -<translation id="2481538920734869610">新增帳戶</translation> <translation id="2497852260688568942">你的管理員停用了同步功能</translation> <translation id="2500374554657206846">儲存密碼的選項</translation> <translation id="2523363575747517183">這個網站不斷嘗試開啟其他應用程式。</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">語音答覆</translation> <translation id="7265758999917665941">一律不儲存這個網站的密碼</translation> <translation id="7272437679830969316">無法驗證你的身分,因此未複製密碼。</translation> -<translation id="7285236536143823449">是,我同意</translation> <translation id="7291368939935408496">正在準備匯出密碼...</translation> <translation id="7293171162284876153">如要開始同步處理,請開啟「同步處理你的 Chrome 資料」。</translation> <translation id="7336264872878993241">已下載 <ph name="PERCENT" /> %</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">使用相機</translation> <translation id="7464701184726199289">系統會將保持同步的資料從所有裝置上刪除。已儲存的網站設定不會遭到刪除,而且可能會反映您的瀏覽習慣。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="7472734401283673885">公司名稱</translation> +<translation id="7473891865547856676">不用了,謝謝</translation> <translation id="7481312909269577407">往前</translation> <translation id="750493650310597496">已選取 0 個項目</translation> <translation id="7514365320538308">下載</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">昨天</translation> <translation id="778855399387580014">在 Chrome 新分頁中進行搜尋。</translation> <translation id="7791543448312431591">新增</translation> -<translation id="780301667611848630">不用了,謝謝</translation> <translation id="7840771868269352570">系統將移除所選項目。</translation> <translation id="7856733331829174190">無法下載</translation> <translation id="7859704718976024901">瀏覽記錄</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">最近關閉的分頁</translation> <translation id="8881801611828450202">透過 <ph name="SEARCH_ENGINE" /> 搜尋這張圖片</translation> <translation id="8909135823018751308">分享…</translation> +<translation id="8917490105272468696">是,我同意</translation> <translation id="895541991026785598">回報問題</translation> <translation id="8976382372951310360">說明</translation> <translation id="8981454092730389528">Google 活動控制項</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 1cab724b..1cb4769 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -115,7 +115,6 @@ <translation id="2386793615875593361">1 ikhethiwe</translation> <translation id="2421044535038393232">Qhubeka nokuhlela</translation> <translation id="2435457462613246316">Bonisa iphasiwedi</translation> -<translation id="2481538920734869610">ENGEZA I-AKHAWUNTI</translation> <translation id="2497852260688568942">Ukuvumelanisa kukhutshazwe umlawuli wakho.</translation> <translation id="2500374554657206846">Izinketho zokulondoloza iphasiwedi</translation> <translation id="2523363575747517183">Le webhusayithi izama kaningi ukuvula olunye uhlelo lokusebenza.</translation> @@ -480,7 +479,6 @@ <translation id="7203585745079012652">Khulumela emuva izimpendulo</translation> <translation id="7265758999917665941">Ungalokothi kuleli sayithi</translation> <translation id="7272437679830969316">Ayikwazi ukuqinisekisa ubunikazi bakho. Iphasiwedi ayikopishiwe.</translation> -<translation id="7285236536143823449">YEBO, NGINGENILE</translation> <translation id="7291368939935408496">Ilungiselela amaphasiwedi...</translation> <translation id="7293171162284876153">Ukuze uqale ukuvumelanisa, vula idatha yokuthi "Vumelanisa i-Chrome yakho".</translation> <translation id="7336264872878993241"><ph name="PERCENT" /> iphesenti elilandiwe</translation> @@ -496,6 +494,7 @@ <translation id="7460314822154045102">Sebenzisa ikhamera</translation> <translation id="7464701184726199289">Lokhu kusula idatha evunyelanisiwe kusukela kuwo onke amadivayisi. Izilungiselelo ezilondoloziwe zesayithi ngeke zize zisuswe futhi zingabonisa imikhuba yakho yokuphequlula amehlo. <ph name="BEGIN_LINK" />Funda kabanzi<ph name="END_LINK" /></translation> <translation id="7472734401283673885">Igama lenkampani</translation> +<translation id="7473891865547856676">Cha ngiyabonga</translation> <translation id="7481312909269577407">Dlulisela</translation> <translation id="750493650310597496">0 kukhethiwe</translation> <translation id="7514365320538308">Landa</translation> @@ -517,7 +516,6 @@ <translation id="7781829728241885113">Izolo</translation> <translation id="778855399387580014">Qala usesho kuthebhu elisha le-Chrome.</translation> <translation id="7791543448312431591">Engeza</translation> -<translation id="780301667611848630">Cha ngiyabonga</translation> <translation id="7840771868269352570">Izinto ozikhethile zizosuswa.</translation> <translation id="7856733331829174190">Ayikwazanga ukulanda</translation> <translation id="7859704718976024901">Umlando wokuphequlula</translation> @@ -587,6 +585,7 @@ <translation id="8870413625673593573">Okuvalwe kamuva</translation> <translation id="8881801611828450202">Sesha i-<ph name="SEARCH_ENGINE" /> yalesi sithombe</translation> <translation id="8909135823018751308">Yabelana…</translation> +<translation id="8917490105272468696">Yebo, ngingenile</translation> <translation id="895541991026785598">Bika inkinga</translation> <translation id="8976382372951310360">Usizo</translation> <translation id="8981454092730389528">Izilawuli zomsebenzi we-Google</translation>
diff --git a/ios/chrome/browser/bookmarks/BUILD.gn b/ios/chrome/browser/bookmarks/BUILD.gn index 3f57f61..b420429 100644 --- a/ios/chrome/browser/bookmarks/BUILD.gn +++ b/ios/chrome/browser/bookmarks/BUILD.gn
@@ -10,12 +10,15 @@ "bookmark_model_factory.h", "bookmark_sync_service_factory.cc", "bookmark_sync_service_factory.h", + "managed_bookmark_service_factory.h", + "managed_bookmark_service_factory.mm", "startup_task_runner_service_factory.cc", "startup_task_runner_service_factory.h", ] deps = [ "//base", "//components/bookmarks/browser", + "//components/bookmarks/managed", "//components/favicon/core", "//components/favicon_base", "//components/history/core/browser", @@ -28,7 +31,10 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/favicon", "//ios/chrome/browser/history", + "//ios/chrome/browser/signin", "//ios/chrome/browser/undo", + "//ios/public/provider/chrome/browser", + "//ios/public/provider/chrome/browser/signin", "//ios/web", ] public_deps = [ ":bookmarks_utils" ] @@ -36,6 +42,7 @@ "//ios/chrome/browser/history", ":bookmarks_utils", ] + configs += [ "//build/config/compiler:enable_arc" ] } source_set("bookmarks_utils") {
diff --git a/ios/chrome/browser/bookmarks/bookmark_client_impl.cc b/ios/chrome/browser/bookmarks/bookmark_client_impl.cc index f99bdf0..1f499e2 100644 --- a/ios/chrome/browser/bookmarks/bookmark_client_impl.cc +++ b/ios/chrome/browser/bookmarks/bookmark_client_impl.cc
@@ -9,6 +9,7 @@ #include "base/task/cancelable_task_tracker.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/browser/bookmark_storage.h" +#include "components/bookmarks/managed/managed_bookmark_service.h" #include "components/favicon/core/favicon_util.h" #include "components/favicon_base/favicon_types.h" #include "components/history/core/browser/history_service.h" @@ -20,13 +21,17 @@ BookmarkClientImpl::BookmarkClientImpl( ChromeBrowserState* browser_state, + bookmarks::ManagedBookmarkService* managed_bookmark_service, sync_bookmarks::BookmarkSyncService* bookmark_sync_service) : browser_state_(browser_state), + managed_bookmark_service_(managed_bookmark_service), bookmark_sync_service_(bookmark_sync_service) {} BookmarkClientImpl::~BookmarkClientImpl() {} void BookmarkClientImpl::Init(bookmarks::BookmarkModel* model) { + if (managed_bookmark_service_) + managed_bookmark_service_->BookmarkModelCreated(model); model_ = model; } @@ -82,20 +87,28 @@ bookmarks::LoadManagedNodeCallback BookmarkClientImpl::GetLoadManagedNodeCallback() { + if (managed_bookmark_service_) + return managed_bookmark_service_->GetLoadManagedNodeCallback(); return bookmarks::LoadManagedNodeCallback(); } bool BookmarkClientImpl::CanSetPermanentNodeTitle( const bookmarks::BookmarkNode* permanent_node) { + if (managed_bookmark_service_) + return managed_bookmark_service_->CanSetPermanentNodeTitle(permanent_node); return true; } bool BookmarkClientImpl::CanSyncNode(const bookmarks::BookmarkNode* node) { + if (managed_bookmark_service_) + return managed_bookmark_service_->CanSyncNode(node); return true; } bool BookmarkClientImpl::CanBeEditedByUser( const bookmarks::BookmarkNode* node) { + if (managed_bookmark_service_) + return managed_bookmark_service_->CanBeEditedByUser(node); return true; }
diff --git a/ios/chrome/browser/bookmarks/bookmark_client_impl.h b/ios/chrome/browser/bookmarks/bookmark_client_impl.h index 52c6246f..ce030baf 100644 --- a/ios/chrome/browser/bookmarks/bookmark_client_impl.h +++ b/ios/chrome/browser/bookmarks/bookmark_client_impl.h
@@ -17,6 +17,7 @@ namespace bookmarks { class BookmarkModel; +class ManagedBookmarkService; } namespace sync_bookmarks { @@ -27,6 +28,7 @@ public: BookmarkClientImpl( ChromeBrowserState* browser_state, + bookmarks::ManagedBookmarkService* managed_bookmark_service, sync_bookmarks::BookmarkSyncService* bookmark_sync_service); ~BookmarkClientImpl() override; @@ -56,13 +58,17 @@ private: // Pointer to the associated ChromeBrowserState. Must outlive // BookmarkClientImpl. - ChromeBrowserState* browser_state_; + ChromeBrowserState* browser_state_ = nullptr; - bookmarks::BookmarkModel* model_; + // Pointer to the ManagedBookmarkService responsible for bookmark policy. May + // be null during testing. + bookmarks::ManagedBookmarkService* managed_bookmark_service_ = nullptr; + + bookmarks::BookmarkModel* model_ = nullptr; // Pointer to the BookmarkSyncService responsible for encoding and decoding // sync metadata persisted together with the bookmarks model. - sync_bookmarks::BookmarkSyncService* bookmark_sync_service_; + sync_bookmarks::BookmarkSyncService* bookmark_sync_service_ = nullptr; DISALLOW_COPY_AND_ASSIGN(BookmarkClientImpl); };
diff --git a/ios/chrome/browser/bookmarks/bookmark_model_factory.cc b/ios/chrome/browser/bookmarks/bookmark_model_factory.cc index d23e3f3f..17bc7f7 100644 --- a/ios/chrome/browser/bookmarks/bookmark_model_factory.cc +++ b/ios/chrome/browser/bookmarks/bookmark_model_factory.cc
@@ -15,6 +15,7 @@ #include "components/undo/bookmark_undo_service.h" #include "ios/chrome/browser/bookmarks/bookmark_client_impl.h" #include "ios/chrome/browser/bookmarks/bookmark_sync_service_factory.h" +#import "ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h" #include "ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -50,6 +51,7 @@ "BookmarkModel", BrowserStateDependencyManager::GetInstance()) { DependsOn(ios::BookmarkUndoServiceFactory::GetInstance()); + DependsOn(ManagedBookmarkServiceFactory::GetInstance()); DependsOn(ios::StartupTaskRunnerServiceFactory::GetInstance()); } @@ -67,6 +69,7 @@ std::unique_ptr<bookmarks::BookmarkModel> bookmark_model( new bookmarks::BookmarkModel(std::make_unique<BookmarkClientImpl>( browser_state, + ManagedBookmarkServiceFactory::GetForBrowserState(browser_state), ios::BookmarkSyncServiceFactory::GetForBrowserState(browser_state)))); bookmark_model->Load( browser_state->GetPrefs(), browser_state->GetStatePath(),
diff --git a/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h b/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h new file mode 100644 index 0000000..bbd21d2 --- /dev/null +++ b/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h
@@ -0,0 +1,41 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_BOOKMARKS_MANAGED_BOOKMARK_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_BOOKMARKS_MANAGED_BOOKMARK_SERVICE_FACTORY_H_ + +#include "base/macros.h" +#include "base/no_destructor.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class ChromeBrowserState; + +namespace bookmarks { +class ManagedBookmarkService; +} + +// Singleton that owns all ManagedBookmarkService and associates them with +// ChromeBrowserState. +class ManagedBookmarkServiceFactory : public BrowserStateKeyedServiceFactory { + public: + static bookmarks::ManagedBookmarkService* GetForBrowserState( + ChromeBrowserState* browser_state); + + static ManagedBookmarkServiceFactory* GetInstance(); + + private: + friend class base::NoDestructor<ManagedBookmarkServiceFactory>; + + ManagedBookmarkServiceFactory(); + ~ManagedBookmarkServiceFactory() override; + + // BrowserStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; + bool ServiceIsNULLWhileTesting() const override; + + DISALLOW_COPY_AND_ASSIGN(ManagedBookmarkServiceFactory); +}; + +#endif // IOS_CHROME_BROWSER_BOOKMARKS_MANAGED_BOOKMARK_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm b/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm new file mode 100644 index 0000000..7db037ec --- /dev/null +++ b/ios/chrome/browser/bookmarks/managed_bookmark_service_factory.mm
@@ -0,0 +1,80 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/bookmarks/managed/managed_bookmark_service.h" +#include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/chrome/browser/signin/authentication_service.h" +#include "ios/chrome/browser/signin/authentication_service_factory.h" +#import "ios/public/provider/chrome/browser/chrome_browser_provider.h" +#import "ios/public/provider/chrome/browser/signin/chrome_identity.h" +#include "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +std::string GetManagedBookmarksDomain(ChromeBrowserState* browser_state) { + AuthenticationService* auth_service = + AuthenticationServiceFactory::GetForBrowserState(browser_state); + if (!auth_service) + return std::string(); + + ChromeIdentity* identity = auth_service->GetAuthenticatedIdentity(); + if (!identity) + return std::string(); + + ios::ChromeIdentityService* identity_service = + ios::GetChromeBrowserProvider()->GetChromeIdentityService(); + if (!identity_service) + return std::string(); + + return base::SysNSStringToUTF8( + identity_service->GetCachedHostedDomainForIdentity(identity)); +} + +} // namespace + +// static +bookmarks::ManagedBookmarkService* +ManagedBookmarkServiceFactory::GetForBrowserState( + ChromeBrowserState* browser_state) { + return static_cast<bookmarks::ManagedBookmarkService*>( + GetInstance()->GetServiceForBrowserState(browser_state, true)); +} + +// static +ManagedBookmarkServiceFactory* ManagedBookmarkServiceFactory::GetInstance() { + static base::NoDestructor<ManagedBookmarkServiceFactory> instance; + return instance.get(); +} + +ManagedBookmarkServiceFactory::ManagedBookmarkServiceFactory() + : BrowserStateKeyedServiceFactory( + "ManagedBookmarkService", + BrowserStateDependencyManager::GetInstance()) {} + +ManagedBookmarkServiceFactory::~ManagedBookmarkServiceFactory() {} + +std::unique_ptr<KeyedService> +ManagedBookmarkServiceFactory::BuildServiceInstanceFor( + web::BrowserState* context) const { + ChromeBrowserState* browser_state = + ChromeBrowserState::FromBrowserState(context); + // base::Unretained is safe because ManagedBookmarkService will + // be destroyed before the browser_state it is attached to. + return std::make_unique<bookmarks::ManagedBookmarkService>( + browser_state->GetPrefs(), + base::BindRepeating(&GetManagedBookmarksDomain, + base::Unretained(browser_state))); +} + +bool ManagedBookmarkServiceFactory::ServiceIsNULLWhileTesting() const { + return true; +}
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm index d637525..0555eef 100644 --- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -10,6 +10,7 @@ #include "ios/chrome/browser/autocomplete/shortcuts_backend_factory.h" #include "ios/chrome/browser/autofill/personal_data_manager_factory.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" +#import "ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h" #include "ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h" #include "ios/chrome/browser/browsing_data/browsing_data_remover_factory.h" #include "ios/chrome/browser/content_settings/cookie_settings_factory.h" @@ -116,6 +117,7 @@ IOSProfileSessionDurationsServiceFactory::GetInstance(); IOSUserEventServiceFactory::GetInstance(); LanguageModelManagerFactory::GetInstance(); + ManagedBookmarkServiceFactory::GetInstance(); ModelTypeStoreServiceFactory::GetInstance(); ProfileSyncServiceFactory::GetInstance(); ReadingListModelFactory::GetInstance();
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm index 93d0ff2..e6330d2 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
@@ -71,7 +71,7 @@ ChromeBrowserState::FromBrowserState(context); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model( new bookmarks::BookmarkModel(std::make_unique<BookmarkClientImpl>( - browser_state, + browser_state, nullptr, ios::BookmarkSyncServiceFactory::GetForBrowserState(browser_state)))); bookmark_model->Load( browser_state->GetPrefs(), browser_state->GetStatePath(),
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index f53230cf..e21e05f 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -864,8 +864,10 @@ object:nil]; // TODO(crbug.com/886583): add eg tests + // TODO(crbug.com/1029346): add browser value. self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self.baseViewController + browser:nil title:@"" message:@"" rect:self.baseViewController.view.frame
diff --git a/ios/chrome/browser/test/perf_test_with_bvc_ios.mm b/ios/chrome/browser/test/perf_test_with_bvc_ios.mm index 443c263c..669e41a 100644 --- a/ios/chrome/browser/test/perf_test_with_bvc_ios.mm +++ b/ios/chrome/browser/test/perf_test_with_bvc_ios.mm
@@ -118,8 +118,7 @@ // Create the browser view controller with its testing factory. bvc_factory_ = [[BrowserViewControllerDependencyFactory alloc] - initWithBrowserState:chrome_browser_state_.get() - webStateList:browser_->GetWebStateList()]; + initWithBrowser:browser_.get()]; bvc_ = [[BrowserViewController alloc] initWithBrowser:browser_.get() dependencyFactory:bvc_factory_
diff --git a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h index 2b3ba42..d0e0899 100644 --- a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h +++ b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h
@@ -12,6 +12,7 @@ // Init with the parameters for anchoring the popover to a UIView. - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message rect:(CGRect)rect @@ -20,19 +21,16 @@ // Init with the parameters for anchoring the popover to a UIBarButtonItem. - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message barButtonItem:(UIBarButtonItem*)barButtonItem NS_DESIGNATED_INITIALIZER; - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message NS_UNAVAILABLE; -- (instancetype)initWithBaseViewController:(UIViewController*)viewController - title:(NSString*)title - message:(NSString*)message - browserState:(ChromeBrowserState*)browserState - NS_UNAVAILABLE; // Configures the underlying UIAlertController's popover arrow direction. // Default is UIPopoverArrowDirectionAny.
diff --git a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm index d60d31c3..cbe6bce 100644 --- a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm +++ b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.mm
@@ -38,11 +38,13 @@ @implementation ActionSheetCoordinator - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message rect:(CGRect)rect view:(UIView*)view { self = [super initWithBaseViewController:viewController + browser:browser title:title message:message]; if (self) { @@ -56,10 +58,12 @@ } - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message barButtonItem:(UIBarButtonItem*)barButtonItem { self = [super initWithBaseViewController:viewController + browser:browser title:title message:message]; if (self) {
diff --git a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator_unittest.mm b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator_unittest.mm index a935e35..c9488f8 100644 --- a/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator_unittest.mm
@@ -7,6 +7,8 @@ #import <UIKit/UIKit.h> #import "base/mac/foundation_util.h" +#import "base/test/task_environment.h" +#import "ios/chrome/browser/main/test_browser.h" #import "ios/chrome/test/scoped_key_window.h" #include "testing/platform_test.h" @@ -18,8 +20,11 @@ // Tests that if there is a popover, it uses the CGRect passed in init. TEST_F(ActionSheetCoordinatorTest, CGRectUsage) { + base::test::TaskEnvironment task_environment_; + ScopedKeyWindow scoped_key_window; UIViewController* viewController = [[UIViewController alloc] init]; + std::unique_ptr<Browser> browser_ = std::make_unique<TestBrowser>(); [scoped_key_window.Get() setRootViewController:viewController]; UIView* view = [[UIView alloc] initWithFrame:viewController.view.bounds]; @@ -28,6 +33,7 @@ CGRect rect = CGRectMake(124, 432, 126, 63); AlertCoordinator* alertCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:viewController + browser:browser_.get() title:@"title" message:nil rect:rect
diff --git a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h index 71a6aa3f..82b9431 100644 --- a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h +++ b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h
@@ -33,16 +33,18 @@ // |-executeCancelHandler|) has occurred. @property(nonatomic, copy) ProceduralBlock noInteractionAction; +// TODO(crbug.com/1029346): Remove this init after migrate away from downstream +// AlertCoordinator use. +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + title:(NSString*)title + message:(NSString*)message; + // Init a coordinator for displaying a alert on this view controller. - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithBaseViewController:(UIViewController*)viewController - title:(NSString*)title - message:(NSString*)message - browserState:(ChromeBrowserState*)browserState - NS_DESIGNATED_INITIALIZER; - (instancetype)initWithBaseViewController:(UIViewController*)viewController NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm index 7a06b00a..27958b1 100644 --- a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm +++ b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" #include "base/logging.h" +#import "ios/chrome/browser/main/browser.h" #include "ui/base/l10n/l10n_util.h" #include "ui/strings/grit/ui_strings.h" @@ -42,22 +43,22 @@ @synthesize rawCancelAction = _rawCancelAction; @synthesize message = _message; +// TODO(crbug.com/1029346): Remove this init after migrate away from downstream +// AlertCoordinator use. - (instancetype)initWithBaseViewController:(UIViewController*)viewController title:(NSString*)title message:(NSString*)message { - self = [super initWithBaseViewController:viewController browserState:nullptr]; - if (self) { - [self commonInitWithTitle:title message:message]; - } - return self; + return [self initWithBaseViewController:viewController + browser:nil + title:title + message:message]; } - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title - message:(NSString*)message - browserState:(ChromeBrowserState*)browserState { - self = [super initWithBaseViewController:viewController - browserState:browserState]; + message:(NSString*)message { + self = [super initWithBaseViewController:viewController browser:browser]; if (self) { [self commonInitWithTitle:title message:message]; }
diff --git a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm index c467c62..158c712 100644 --- a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm
@@ -7,6 +7,8 @@ #import <UIKit/UIKit.h> #import "base/mac/foundation_util.h" +#include "base/test/task_environment.h" +#import "ios/chrome/browser/main/test_browser.h" #import "ios/chrome/test/scoped_key_window.h" #include "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" @@ -25,6 +27,7 @@ protected: AlertCoordinatorTest() { view_controller_ = [[UIViewController alloc] init]; + browser_ = std::make_unique<TestBrowser>(); [scoped_key_window_.Get() setRootViewController:view_controller_]; } @@ -41,15 +44,19 @@ NSString* message) { alert_coordinator_ = [[AlertCoordinator alloc] initWithBaseViewController:view_controller + browser:browser_.get() title:title message:message]; return alert_coordinator_; } private: + base::test::TaskEnvironment task_environment_; + AlertCoordinator* alert_coordinator_; ScopedKeyWindow scoped_key_window_; UIViewController* view_controller_; + std::unique_ptr<Browser> browser_; }; #pragma mark - Tests.
diff --git a/ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator_unittest.mm b/ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator_unittest.mm index 2c4bd18..ab91a50 100644 --- a/ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator_unittest.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator.h" +#include "base/test/task_environment.h" +#import "ios/chrome/browser/main/test_browser.h" #include "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" #include "third_party/ocmock/gtest_support.h" @@ -16,9 +18,12 @@ TEST_F(InputAlertCoordinatorTest, AddTextField) { // Setup. + base::test::TaskEnvironment task_environment_; UIViewController* viewController = [[UIViewController alloc] init]; + std::unique_ptr<Browser> browser_ = std::make_unique<TestBrowser>(); InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc] initWithBaseViewController:viewController + browser:browser_.get() title:@"Test" message:nil]; @@ -37,9 +42,12 @@ TEST_F(InputAlertCoordinatorTest, GetTextFields) { // Setup. + base::test::TaskEnvironment task_environment_; UIViewController* viewController = [[UIViewController alloc] init]; + std::unique_ptr<Browser> browser_ = std::make_unique<TestBrowser>(); InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc] initWithBaseViewController:viewController + browser:browser_.get() title:@"Test" message:nil];
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow.mm b/ios/chrome/browser/ui/authentication/authentication_flow.mm index 4f688d88..00e16ed 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow.mm
@@ -280,7 +280,8 @@ case SHOW_MANAGED_CONFIRMATION: [_performer showManagedConfirmationForHostedDomain:_identityToSignInHostedDomain - viewController:_presentingViewController]; + viewController:_presentingViewController + browser:_browser]; return; case SIGN_OUT_IF_NEEDED: @@ -389,7 +390,8 @@ [strongSelf setHandlingError:NO]; [strongSelf continueSignin]; } - viewController:_presentingViewController]; + viewController:_presentingViewController + browser:_browser]; } #pragma mark AuthenticationFlowPerformerDelegate
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.h b/ios/chrome/browser/ui/authentication/authentication_flow_performer.h index 85babb4..28ff360 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.h +++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.h
@@ -71,13 +71,14 @@ // Shows a confirmation dialog for signing in to an account managed by // |hostedDomain|. - (void)showManagedConfirmationForHostedDomain:(NSString*)hostedDomain - viewController: - (UIViewController*)viewController; + viewController:(UIViewController*)viewController + browser:(Browser*)browser; // Shows |error| to the user and calls |callback| on dismiss. - (void)showAuthenticationError:(NSError*)error withCompletion:(ProceduralBlock)callback - viewController:(UIViewController*)viewController; + viewController:(UIViewController*)viewController + browser:(Browser*)browser; @property(nonatomic, weak, readonly) id<AuthenticationFlowPerformerDelegate> delegate;
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm index a1a6968..823b50f 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -196,7 +196,8 @@ - (void)promptSwitchFromManagedEmail:(NSString*)managedEmail withHostedDomain:(NSString*)hostedDomain toEmail:(NSString*)toEmail - viewController:(UIViewController*)viewController { + viewController:(UIViewController*)viewController + browser:(Browser*)browser { DCHECK(!_alertCoordinator); NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_TITLE); NSString* subtitle = l10n_util::GetNSStringF( @@ -209,6 +210,7 @@ _alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:title message:subtitle]; @@ -269,7 +271,8 @@ [self promptSwitchFromManagedEmail:lastSignedInEmail withHostedDomain:hostedDomain toEmail:[identity userEmail] - viewController:viewController]; + viewController:viewController + browser:browser]; return; } _navigationController = [SettingsNavigationController @@ -360,8 +363,8 @@ } - (void)showManagedConfirmationForHostedDomain:(NSString*)hostedDomain - viewController: - (UIViewController*)viewController { + viewController:(UIViewController*)viewController + browser:(Browser*)browser { DCHECK(!_alertCoordinator); NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SIGNIN_TITLE); NSString* subtitle = l10n_util::GetNSStringF( @@ -372,6 +375,7 @@ _alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:title message:subtitle]; @@ -404,10 +408,11 @@ - (void)showAuthenticationError:(NSError*)error withCompletion:(ProceduralBlock)callback - viewController:(UIViewController*)viewController { + viewController:(UIViewController*)viewController + browser:(Browser*)browser { DCHECK(!_alertCoordinator); - _alertCoordinator = ErrorCoordinatorNoItem(error, viewController); + _alertCoordinator = ErrorCoordinatorNoItem(error, viewController, browser); __weak AuthenticationFlowPerformer* weakSelf = self; __weak AlertCoordinator* weakAlert = _alertCoordinator;
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_unittest.mm b/ios/chrome/browser/ui/authentication/authentication_flow_unittest.mm index 8b71d18..629ea5a 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_unittest.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow_unittest.mm
@@ -264,8 +264,9 @@ [invocation getArgument:&completionBlock atIndex:3]; completionBlock(); }] showAuthenticationError:[OCMArg any] - withCompletion:[OCMArg any] - viewController:view_controller_]; + withCompletion:[OCMArg any] + viewController:view_controller_ + browser:browser_.get()]; [authentication_flow_ startSignInWithCompletion:sign_in_completion_]; @@ -290,7 +291,8 @@ [[[performer_ expect] andDo:^(NSInvocation*) { [authentication_flow_ didAcceptManagedConfirmation]; }] showManagedConfirmationForHostedDomain:@"foo.com" - viewController:view_controller_]; + viewController:view_controller_ + browser:browser_.get()]; [[[performer_ expect] andDo:^(NSInvocation*) { [authentication_flow_ didClearData];
diff --git a/ios/chrome/browser/ui/authentication/authentication_ui_util.h b/ios/chrome/browser/ui/authentication/authentication_ui_util.h index fbc08ca..22be8b5a 100644 --- a/ios/chrome/browser/ui/authentication/authentication_ui_util.h +++ b/ios/chrome/browser/ui/authentication/authentication_ui_util.h
@@ -10,13 +10,15 @@ #include "base/ios/block_types.h" @class AlertCoordinator; +class Browser; // Returns the sign in alert coordinator for |error|. |dismissAction| is called // when the dialog is dismissed (the user taps on the Ok button) or cancelled // (the alert coordinator is cancelled programatically). AlertCoordinator* ErrorCoordinator(NSError* error, ProceduralBlock dismissAction, - UIViewController* viewController); + UIViewController* viewController, + Browser* browser); // Returns a message to display, as an error, to the user. This message // contains: @@ -29,6 +31,7 @@ // Returns the sign in alert coordinator for |error|, with no associated // action. An action should be added before starting it. AlertCoordinator* ErrorCoordinatorNoItem(NSError* error, - UIViewController* viewController); + UIViewController* viewController, + Browser* browser); #endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_AUTHENTICATION_UI_UTIL_H_
diff --git a/ios/chrome/browser/ui/authentication/authentication_ui_util.mm b/ios/chrome/browser/ui/authentication/authentication_ui_util.mm index 9cea8c21..be1e987 100644 --- a/ios/chrome/browser/ui/authentication/authentication_ui_util.mm +++ b/ios/chrome/browser/ui/authentication/authentication_ui_util.mm
@@ -17,11 +17,12 @@ AlertCoordinator* ErrorCoordinator(NSError* error, ProceduralBlock dismissAction, - UIViewController* viewController) { + UIViewController* viewController, + Browser* browser) { DCHECK(error); AlertCoordinator* alertCoordinator = - ErrorCoordinatorNoItem(error, viewController); + ErrorCoordinatorNoItem(error, viewController, browser); NSString* okButtonLabel = l10n_util::GetNSString(IDS_OK); [alertCoordinator addItemWithTitle:okButtonLabel @@ -55,7 +56,8 @@ } AlertCoordinator* ErrorCoordinatorNoItem(NSError* error, - UIViewController* viewController) { + UIViewController* viewController, + Browser* browser) { DCHECK(error); NSString* title = l10n_util::GetNSString( @@ -70,6 +72,7 @@ } AlertCoordinator* alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:title message:errorMessage]; return alertCoordinator;
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm index d937b7c..3319ac85 100644 --- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
@@ -540,7 +540,7 @@ if (!ShouldHandleSigninError(error)) { return; } - _alertCoordinator = ErrorCoordinator(error, nil, self); + _alertCoordinator = ErrorCoordinator(error, nil, self, self.browser); [_alertCoordinator start]; }
diff --git a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm index fdfcc93..f5cfbab 100644 --- a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm
@@ -156,8 +156,8 @@ identity:nil]; }; - self.alertCoordinator = - ErrorCoordinator(error, dismissAction, self.baseViewController); + self.alertCoordinator = ErrorCoordinator( + error, dismissAction, self.baseViewController, self.browser); [self.alertCoordinator start]; }
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm index ecfee24..4ebf022 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm
@@ -191,6 +191,7 @@ RecordAction(UserMetricsAction("Signin_Signin_CancelAdvancedSyncSettings")); self.cancelConfirmationAlertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self.advancedSettingsSigninNavigationController + browser:self.browser title: GetNSString( IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE)
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm index 3a261316..331ca8cf1 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
@@ -157,7 +157,8 @@ OCMExpect([performer_mock_ showAuthenticationError:[OCMArg any] withCompletion:[OCMArg any] - viewController:presenting_view_controller_mock_]) + viewController:presenting_view_controller_mock_ + browser:browser_.get()]) .andDo(^(NSInvocation* invocation) { __weak ProceduralBlock completionBlock; [invocation getArgument:&completionBlock atIndex:3];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h index 70e476f..cd99f65 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h
@@ -11,7 +11,7 @@ @class BookmarkEditViewController; @class BookmarkFolderViewController; @protocol BrowserCommands; -class ChromeBrowserState; +class Browser; namespace bookmarks { class BookmarkNode; @@ -52,9 +52,7 @@ // |bookmark|: mustn't be NULL at initialization time. It also mustn't be a // folder. - (instancetype)initWithBookmark:(const bookmarks::BookmarkNode*)bookmark - browserState:(ChromeBrowserState*)browserState - dispatcher:(id<BrowserCommands>)dispatcher - NS_DESIGNATED_INITIALIZER; + browser:(Browser*)browser NS_DESIGNATED_INITIALIZER; - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE; // Closes the edit view as if close button was pressed.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm index de720eef..1521ad4 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm
@@ -18,6 +18,7 @@ #include "components/url_formatter/url_fixer.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/system_flags.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.h" @@ -105,6 +106,8 @@ // Redefined to be readwrite. @property(nonatomic, strong) BookmarkFolderViewController* folderViewController; +@property(nonatomic, assign) Browser* browser; + @property(nonatomic, assign) ChromeBrowserState* browserState; // Dispatcher for sending commands. @@ -169,6 +172,7 @@ @synthesize displayingValidURL = _displayingValidURL; @synthesize folder = _folder; @synthesize folderViewController = _folderViewController; +@synthesize browser = _browser; @synthesize browserState = _browserState; @synthesize cancelItem = _cancelItem; @synthesize doneItem = _doneItem; @@ -179,17 +183,16 @@ #pragma mark - Lifecycle - (instancetype)initWithBookmark:(const BookmarkNode*)bookmark - browserState:(ChromeBrowserState*)browserState - dispatcher:(id<BrowserCommands>)dispatcher { + browser:(Browser*)browser { DCHECK(bookmark); - DCHECK(browserState); + DCHECK(browser); self = [super initWithStyle:UITableViewStylePlain]; if (self) { DCHECK(!bookmark->is_folder()); - DCHECK(!browserState->IsOffTheRecord()); + DCHECK(!browser->GetBrowserState()->IsOffTheRecord()); _bookmark = bookmark; - _bookmarkModel = - ios::BookmarkModelFactory::GetForBrowserState(browserState); + _bookmarkModel = ios::BookmarkModelFactory::GetForBrowserState( + browser->GetBrowserState()); _folder = bookmark->parent(); @@ -197,8 +200,12 @@ _modelBridge.reset( new bookmarks::BookmarkModelBridge(self, _bookmarkModel)); - _browserState = browserState; - _dispatcher = dispatcher; + _browser = browser; + _browserState = browser->GetBrowserState()->GetOriginalChromeBrowserState(); + // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol + // clean up. + _dispatcher = + static_cast<id<BrowserCommands>>(browser->GetCommandDispatcher()); } return self; } @@ -638,6 +645,7 @@ (UIPresentationController*)presentationController { self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self + browser:_browser title:nil message:nil barButtonItem:self.cancelItem];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h index c5b0e9c..ade36301 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h
@@ -10,7 +10,7 @@ @class BookmarkFolderEditorViewController; @protocol BrowserCommands; -class ChromeBrowserState; +class Browser; namespace bookmarks { class BookmarkModel; @@ -56,12 +56,11 @@ // |bookmarkModel| must not be null and must be loaded. // |folder| must not be NULL and be editable. -// |browserState| must not be null. +// |browser| must not be null. + (instancetype) folderEditorWithBookmarkModel:(bookmarks::BookmarkModel*)bookmarkModel folder:(const bookmarks::BookmarkNode*)folder - browserState:(ChromeBrowserState*)browserState - dispatcher:(id<BrowserCommands>)dispatcher; + browser:(Browser*)browser; - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm index 2fcd9dd..7d81e30 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm
@@ -14,6 +14,8 @@ #include "base/strings/sys_string_conversions.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h" @@ -64,6 +66,7 @@ } @property(nonatomic, assign) BOOL editingExistingFolder; @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarkModel; +@property(nonatomic, assign) Browser* browser; @property(nonatomic, assign) ChromeBrowserState* browserState; @property(nonatomic, assign) const BookmarkNode* folder; @property(nonatomic, strong) BookmarkFolderViewController* folderViewController; @@ -101,6 +104,7 @@ @synthesize folder = _folder; @synthesize folderViewController = _folderViewController; @synthesize parentFolder = _parentFolder; +@synthesize browser = _browser; @synthesize browserState = _browserState; @synthesize doneItem = _doneItem; @synthesize titleItem = _titleItem; @@ -125,19 +129,22 @@ + (instancetype)folderEditorWithBookmarkModel: (bookmarks::BookmarkModel*)bookmarkModel folder:(const BookmarkNode*)folder - browserState:(ChromeBrowserState*)browserState - dispatcher:(id<BrowserCommands>)dispatcher { + browser:(Browser*)browser { DCHECK(folder); DCHECK(!bookmarkModel->is_permanent_node(folder)); - DCHECK(browserState); - DCHECK(dispatcher); + DCHECK(browser); BookmarkFolderEditorViewController* folderEditor = [[self alloc] initWithBookmarkModel:bookmarkModel]; folderEditor.parentFolder = folder->parent(); folderEditor.folder = folder; - folderEditor.browserState = browserState; + folderEditor.browser = browser; + folderEditor.browserState = + browser->GetBrowserState()->GetOriginalChromeBrowserState(); folderEditor.editingExistingFolder = YES; - folderEditor.dispatcher = dispatcher; + // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol + // clean up. + folderEditor.dispatcher = + static_cast<id<BrowserCommands>>(browser->GetCommandDispatcher()); return folderEditor; } @@ -419,6 +426,7 @@ (UIPresentationController*)presentationController { self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self + browser:_browser title:nil message:nil barButtonItem:self.navigationItem.leftBarButtonItem];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm index 9389944..527aca5c 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -1413,6 +1413,7 @@ self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self + browser:_browser title:nil message:nil barButtonItem:self.moreButton]; @@ -1737,6 +1738,7 @@ self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self + browser:_browser title:nil message:nil rect:CGRectMake(touchPoint.x, touchPoint.y, 1, 1)
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm index 2b140b1c..5eba43a 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
@@ -264,8 +264,7 @@ self.currentPresentedState = PresentedState::BOOKMARK_EDITOR; BookmarkEditViewController* bookmarkEditor = [[BookmarkEditViewController alloc] initWithBookmark:node - browserState:_browserState - dispatcher:self.handler]; + browser:_browser]; self.bookmarkEditor = bookmarkEditor; self.bookmarkEditor.delegate = self; editorController = bookmarkEditor; @@ -275,8 +274,7 @@ [BookmarkFolderEditorViewController folderEditorWithBookmarkModel:self.bookmarkModel folder:node - browserState:_browserState - dispatcher:self.handler]; + browser:_browser]; folderEditor.delegate = self; self.folderEditor = folderEditor; editorController = folderEditor;
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index 9c7457d..d21b96df 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -295,8 +295,7 @@ DCHECK(self.browserContainerCoordinator.viewController); BrowserViewControllerDependencyFactory* factory = [[BrowserViewControllerDependencyFactory alloc] - initWithBrowserState:self.browserState - webStateList:self.browser->GetWebStateList()]; + initWithBrowser:self.browser]; _viewController = [[BrowserViewController alloc] initWithBrowser:self.browser dependencyFactory:factory @@ -904,8 +903,7 @@ // Installs delegates for each WebState in WebStateList. - (void)installDelegatesForAllWebStates { - self.openInMediator = [[OpenInMediator alloc] - initWithWebStateList:self.browser->GetWebStateList()]; + self.openInMediator = [[OpenInMediator alloc] initWithBrowser:self.browser]; for (int i = 0; i < self.browser->GetWebStateList()->count(); i++) { web::WebState* webState = self.browser->GetWebStateList()->GetWebStateAt(i);
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index 34e3aa29..3584504 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1143,7 +1143,8 @@ [self ensureVoiceSearchControllerCreated]; // Present voice search. - _voiceSearchController->StartRecognition(self, self.currentWebState); + _voiceSearchController->StartRecognition(self, self.currentWebState, + self.browser); [self.omniboxHandler cancelOmniboxEdit]; } @@ -1811,8 +1812,11 @@ for (int index = 0; index < webStateList->count(); ++index) [self installDelegatesForWebState:webStateList->GetWebStateAt(index)]; - self.imageSaver = [[ImageSaver alloc] initWithBaseViewController:self]; - self.imageCopier = [[ImageCopier alloc] initWithBaseViewController:self]; + self.imageSaver = + [[ImageSaver alloc] initWithBaseViewController:self browser:self.browser]; + self.imageCopier = + [[ImageCopier alloc] initWithBaseViewController:self + browser:self.browser]; // Set the TTS playback controller's WebStateList. TextToSpeechPlaybackControllerFactory::GetInstance()
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.h b/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.h index d4af1163..8bec109 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.h +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.h
@@ -9,19 +9,16 @@ @class AlertCoordinator; +class Browser; @class BrowserViewControllerHelper; -class ChromeBrowserState; @class KeyCommandsProvider; -class WebStateList; // Creates helper objects needed by BrowserViewController. @interface BrowserViewControllerDependencyFactory : NSObject -// Creates a new factory backed by |browserState|. This must be the same browser -// state provided to BrowserViewController (and like BVC, this is a weak -// reference). -- (id)initWithBrowserState:(ChromeBrowserState*)browserState - webStateList:(WebStateList*)webStateList; +// Creates a new factory backed by |browser|. This must be the same browser +// provided to BrowserViewController (and like BVC, this is a weak reference). +- (instancetype)initWithBrowser:(Browser*)browser; - (BrowserViewControllerHelper*)newBrowserViewControllerHelper;
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.mm index 4b0630a2..60ec128 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.mm
@@ -6,6 +6,7 @@ #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" #import "ios/chrome/browser/ui/browser_view/browser_view_controller_helper.h" #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h" @@ -17,16 +18,17 @@ #endif @implementation BrowserViewControllerDependencyFactory { + Browser* _browser; ChromeBrowserState* _browserState; WebStateList* _webStateList; } -- (id)initWithBrowserState:(ChromeBrowserState*)browserState - webStateList:(WebStateList*)webStateList { +- (id)initWithBrowser:(Browser*)browser { self = [super init]; if (self) { - _browserState = browserState; - _webStateList = webStateList; + _browser = browser; + _browserState = browser->GetBrowserState(); + _webStateList = browser->GetWebStateList(); } return self; } @@ -45,6 +47,7 @@ (UIViewController*)viewController { AlertCoordinator* alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:viewController + browser:_browser title:title message:message]; [alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_OK)
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.h index 211d890..73f95de 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.h
@@ -8,6 +8,7 @@ #import <UIKit/UIKit.h> @class AlertCoordinator; +class Browser; @class ContentSuggestionsItem; @class ContentSuggestionsMostVisitedItem; @protocol ContentSuggestionsGestureCommands; @@ -21,22 +22,26 @@ // The |commandHandler| will receive callbacks when the user chooses one of the // options displayed by the alert. + (AlertCoordinator*) -alertCoordinatorForSuggestionItem:(ContentSuggestionsItem*)item - onViewController:(UICollectionViewController*)viewController - atPoint:(CGPoint)touchLocation - atIndexPath:(NSIndexPath*)indexPath - readLaterAction:(BOOL)readLaterAction - commandHandler: - (id<ContentSuggestionsGestureCommands>)commandHandler; + alertCoordinatorForSuggestionItem:(ContentSuggestionsItem*)item + onViewController: + (UICollectionViewController*)viewController + atPoint:(CGPoint)touchLocation + atIndexPath:(NSIndexPath*)indexPath + readLaterAction:(BOOL)readLaterAction + commandHandler: + (id<ContentSuggestionsGestureCommands>)commandHandler + browser:(Browser*)browser; // Same as above but for a MostVisited item. + (AlertCoordinator*) -alertCoordinatorForMostVisitedItem:(ContentSuggestionsMostVisitedItem*)item - onViewController:(UICollectionViewController*)viewController - atPoint:(CGPoint)touchLocation - atIndexPath:(NSIndexPath*)indexPath - commandHandler: - (id<ContentSuggestionsGestureCommands>)commandHandler; + alertCoordinatorForMostVisitedItem:(ContentSuggestionsMostVisitedItem*)item + onViewController: + (UICollectionViewController*)viewController + withBrowser:(Browser*)browser + atPoint:(CGPoint)touchLocation + atIndexPath:(NSIndexPath*)indexPath + commandHandler:(id<ContentSuggestionsGestureCommands>) + commandHandler; @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.mm index 2d2fca4..fb2a3fa 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_alert_factory.mm
@@ -19,15 +19,18 @@ @implementation ContentSuggestionsAlertFactory + (AlertCoordinator*) -alertCoordinatorForSuggestionItem:(ContentSuggestionsItem*)item - onViewController:(UICollectionViewController*)viewController - atPoint:(CGPoint)touchLocation - atIndexPath:(NSIndexPath*)indexPath - readLaterAction:(BOOL)readLaterAction - commandHandler: - (id<ContentSuggestionsGestureCommands>)commandHandler { + alertCoordinatorForSuggestionItem:(ContentSuggestionsItem*)item + onViewController: + (UICollectionViewController*)viewController + atPoint:(CGPoint)touchLocation + atIndexPath:(NSIndexPath*)indexPath + readLaterAction:(BOOL)readLaterAction + commandHandler: + (id<ContentSuggestionsGestureCommands>)commandHandler + browser:(Browser*)browser { AlertCoordinator* alertCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:nil message:nil rect:CGRectMake(touchLocation.x, touchLocation.y, 0, @@ -99,14 +102,17 @@ } + (AlertCoordinator*) -alertCoordinatorForMostVisitedItem:(ContentSuggestionsMostVisitedItem*)item - onViewController:(UICollectionViewController*)viewController - atPoint:(CGPoint)touchLocation - atIndexPath:(NSIndexPath*)indexPath - commandHandler: - (id<ContentSuggestionsGestureCommands>)commandHandler { + alertCoordinatorForMostVisitedItem:(ContentSuggestionsMostVisitedItem*)item + onViewController: + (UICollectionViewController*)viewController + withBrowser:(Browser*)browser + atPoint:(CGPoint)touchLocation + atIndexPath:(NSIndexPath*)indexPath + commandHandler:(id<ContentSuggestionsGestureCommands>) + commandHandler { AlertCoordinator* alertCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:nil message:nil rect:CGRectMake(touchLocation.x, touchLocation.y, 0,
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index 8c199a7..8098000 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -127,6 +127,7 @@ logoVendor:ios::GetChromeBrowserProvider()->CreateLogoVendor( self.browser, self.webState) voiceSearchAvailability:&_voiceSearchAvailability]; + self.NTPMediator.browser = self.browser; self.headerController = [[ContentSuggestionsHeaderViewController alloc] init]; // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h index cfe733e..6d6cd3c 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h
@@ -25,6 +25,7 @@ @protocol ApplicationCommands; class AuthenticationService; +class Browser; @protocol BrowserCommands; @class ContentSuggestionsHeaderSynchronizer; @class ContentSuggestionsMediator; @@ -81,6 +82,8 @@ ContentSuggestionsMediator* suggestionsMediator; // Consumer for this mediator. @property(nonatomic, weak, nullable) id<NTPHomeConsumer> consumer; +// The browser. +@property(nonatomic, assign, nullable) Browser* browser; // Inits the mediator. - (void)setUp;
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm index ae25248a..5ec3662 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -292,6 +292,7 @@ atPoint:(CGPoint)touchLocation atIndexPath:(NSIndexPath*)indexPath readLaterAction:(BOOL)readLaterAction { + DCHECK(_browser); // Unfocus the omnibox as the omnibox can disappear when choosing some // options. See crbug.com/928237. [self.dispatcher cancelOmniboxEdit]; @@ -312,7 +313,8 @@ atPoint:touchLocation atIndexPath:indexPath readLaterAction:readLaterAction - commandHandler:self]; + commandHandler:self + browser:self.browser]; [self.alertCoordinator start]; } @@ -320,6 +322,7 @@ - (void)displayContextMenuForMostVisitedItem:(CollectionViewItem*)item atPoint:(CGPoint)touchLocation atIndexPath:(NSIndexPath*)indexPath { + DCHECK(_browser); // No context menu for action buttons. if ([item isKindOfClass:[ContentSuggestionsMostVisitedActionItem class]]) { return; @@ -334,6 +337,7 @@ self.alertCoordinator = [ContentSuggestionsAlertFactory alertCoordinatorForMostVisitedItem:mostVisitedItem onViewController:self.suggestionsViewController + withBrowser:self.browser atPoint:touchLocation atIndexPath:indexPath commandHandler:self];
diff --git a/ios/chrome/browser/ui/context_menu/context_menu_coordinator.mm b/ios/chrome/browser/ui/context_menu/context_menu_coordinator.mm index 4a55d5c2..122bcd4 100644 --- a/ios/chrome/browser/ui/context_menu/context_menu_coordinator.mm +++ b/ios/chrome/browser/ui/context_menu/context_menu_coordinator.mm
@@ -32,6 +32,7 @@ if (self) { _alertCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:title message:nil rect:CGRectMake(location.x, location.y, 1.0, 1.0)
diff --git a/ios/chrome/browser/ui/dialogs/dialog_presenter.h b/ios/chrome/browser/ui/dialogs/dialog_presenter.h new file mode 100644 index 0000000..05f248c --- /dev/null +++ b/ios/chrome/browser/ui/dialogs/dialog_presenter.h
@@ -0,0 +1,104 @@ +// 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 IOS_CHROME_BROWSER_UI_DIALOGS_DIALOG_PRESENTER_H_ +#define IOS_CHROME_BROWSER_UI_DIALOGS_DIALOG_PRESENTER_H_ + +#import <UIKit/UIKit.h> + +#import "base/ios/block_types.h" + +@protocol DialogPresenterDelegate; +class Browser; +class GURL; +@class AlertCoordinator; + +namespace web { +class WebState; +} + +// Handles the queued display of modal dialogs. +@interface DialogPresenter : NSObject + +// Whether the DialogPresenter should attempt to show dialogs. When |active| is +// NO, dialogs will be queued and displayed when the DialogPresenter is +// activated. +@property(nonatomic, assign, getter=isActive) BOOL active; + +@property(nonatomic, assign) Browser* browser; + +// Dialogs will be presented from |viewController|. +- (instancetype)initWithDelegate:(id<DialogPresenterDelegate>)delegate + presentingViewController:(UIViewController*)viewController + NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; + +// Methods to show JavaScriptDialogs of each JavaScriptAlertType. If a dialog +// is already being presented, these functions will enqueue a new dialog to be +// shown when the visible dialog is dismissed. |context| will be retained until +// its associated dialog is dismissed or |-cancelDialogForContext:| is called. +- (void)runJavaScriptAlertPanelWithMessage:(NSString*)message + requestURL:(const GURL&)requestURL + webState:(web::WebState*)webState + completionHandler:(void (^)(void))completionHandler; +- (void)runJavaScriptConfirmPanelWithMessage:(NSString*)message + requestURL:(const GURL&)requestURL + webState:(web::WebState*)webState + completionHandler: + (void (^)(BOOL isConfirmed))completionHandler; +- (void)runJavaScriptTextInputPanelWithPrompt:(NSString*)message + defaultText:(NSString*)defaultText + requestURL:(const GURL&)requestURL + webState:(web::WebState*)webState + completionHandler: + (void (^)(NSString* input))completionHandler; + +// Displays an HTTP authentication dialog, which has 2 text fields +// (username and password), Login and Cancel button. If Login was tapped, +// |completionHandler| is called with valid strings which represent username +// and password inputs. If cancel is tapped then |completionHandler| is +// called with nil |user| and nil |password|. Username will be pre-populated +// from provided |credential|. +- (void)runAuthDialogForProtectionSpace:(NSURLProtectionSpace*)protectionSpace + proposedCredential:(NSURLCredential*)credential + webState:(web::WebState*)webState + completionHandler: + (void (^)(NSString* user, NSString* password))handler; + +// Cancels the display of the dialog associated with |context|. +- (void)cancelDialogForWebState:(web::WebState*)webState; + +// Dismisses the currently presented dialog and cancels all queued dialogs. +- (void)cancelAllDialogs; + +// Tries to present an alert if needed and possible. Called by the view +// controller which will present the alert to notify that it has dismissed a +// view controller. +- (void)tryToPresent; + +@end + +@interface DialogPresenter (ExposedForTesting) +// The dialog currently being shown. +@property(nonatomic, readonly) AlertCoordinator* presentedDialogCoordinator; + +// Called when |coordinator| is stopped. +- (void)dialogCoordinatorWasStopped:(AlertCoordinator*)coordinator; + +@end + +// Delegate protocol for DialogPresenter. +@protocol DialogPresenterDelegate <NSObject> + +// Called by |presenter| before showing the queued modal dialog associated with +// |context|. +- (void)dialogPresenter:(DialogPresenter*)presenter + willShowDialogForWebState:(web::WebState*)webState; + +// Whether |presenter| should present a dialog. +- (BOOL)shouldDialogPresenterPresentDialog:(DialogPresenter*)presenter; + +@end + +#endif // IOS_CHROME_BROWSER_UI_DIALOGS_DIALOG_PRESENTER_H_
diff --git a/ios/chrome/browser/ui/dialogs/dialog_presenter.mm b/ios/chrome/browser/ui/dialogs/dialog_presenter.mm new file mode 100644 index 0000000..b63e9b5 --- /dev/null +++ b/ios/chrome/browser/ui/dialogs/dialog_presenter.mm
@@ -0,0 +1,583 @@ +// 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 "ios/chrome/browser/ui/dialogs/dialog_presenter.h" + +#include <map> + +#include "base/containers/circular_deque.h" +#import "base/ios/block_types.h" +#include "base/logging.h" +#include "components/strings/grit/components_strings.h" +#include "components/url_formatter/elide_url.h" +#import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" +#import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" +#import "ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator.h" +#import "ios/chrome/browser/ui/dialogs/completion_block_util.h" +#import "ios/chrome/browser/ui/dialogs/dialog_constants.h" +#import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h" +#import "ios/chrome/browser/ui/dialogs/nsurl_protection_space_util.h" +#include "ios/chrome/browser/ui/util/ui_util.h" +#include "ios/chrome/grit/ios_strings.h" +#import "ios/web/public/navigation/navigation_context.h" +#import "ios/web/public/web_state.h" +#import "ios/web/public/web_state_observer_bridge.h" +#include "ui/base/l10n/l10n_util.h" +#include "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using completion_block_util::AlertCallback; +using completion_block_util::ConfirmCallback; +using completion_block_util::PromptCallback; +using completion_block_util::HTTPAuthCallack; +using completion_block_util::GetSafeJavaScriptAlertCompletion; +using completion_block_util::GetSafeJavaScriptConfirmationCompletion; +using completion_block_util::GetSafeJavaScriptPromptCompletion; +using completion_block_util::GetSafeHTTPAuthCompletion; + +@interface DialogPresenter () <CRWWebStateObserver> { + // Queue of WebStates which correspond to the keys in + // |_dialogCoordinatorsForWebStates|. + base::circular_deque<web::WebState*> _queuedWebStates; + // A map associating queued webStates with their coordinators. + std::map<web::WebState*, AlertCoordinator*> _dialogCoordinatorsForWebStates; + // The WebStateObserver listening for navigation events from the queued + // WebStates. + std::unique_ptr<web::WebStateObserver> _webStateObserver; +} + +// The delegate passed on initialization. +@property(weak, nonatomic, readonly) id<DialogPresenterDelegate> delegate; + +// The presenting view controller passed on initialization. +@property(weak, nonatomic, readonly) UIViewController* viewController; + +// Whether a modal dialog is currently being shown. +@property(nonatomic, readonly, getter=isShowingDialog) BOOL showingDialog; + +// The webState for |presentedDialog|. +@property(nonatomic) web::WebState* presentedDialogWebState; + +// The dialog that's currently being shown, if any. +@property(nonatomic, strong) AlertCoordinator* presentedDialogCoordinator; + +// The JavaScript dialog blocking confirmation action sheet being shown, if any. +@property(nonatomic, strong) AlertCoordinator* blockingConfirmationCoordinator; + +// Adds |context| and |coordinator| to the queue. If a dialog is not already +// being shown, |coordinator| will be presented. Otherwise, |coordinator| will +// be displayed once the previously shown dialog is dismissed. +- (void)addDialogCoordinator:(AlertCoordinator*)coordinator + forWebState:(web::WebState*)webState; + +// Shows the dialog associated with the next context in |contextQueue|. +- (void)showNextDialog; + +// Called when |coordinator| is stopped. +- (void)dialogCoordinatorWasStopped:(AlertCoordinator*)coordinator; + +// Adds buttons to |alertCoordinator|. A confirmation button with |label| as +// the text will be added for |confirmAction|, and a cancel button will be added +// for |cancelAction|. +- (void)setUpAlertCoordinator:(AlertCoordinator*)alertCoordinator + confirmAction:(ProceduralBlock)confirmAction + cancelAction:(ProceduralBlock)cancelAction + OKLabel:(NSString*)label; + +// Sets up the JavaScript dialog blocking option for |alertCoordinator|. +// Overrides |alertCoordinator|'s |startAction| to call +// JavaScriptDialogWasShown(). Depending on the value of +// ShouldShowDialogBlockingOption() for |webState|, optionally adds a button to +// |alertCoordinator| allowing for the blocking of future dialogs. In addition +// to blocking dialogs for the WebState, the added button will call +// |alertCoordinator|'s |cancelAction|. +- (void)setUpBlockingOptionForCoordinator:(AlertCoordinator*)alertCoordinator + webState:(web::WebState*)webState; + +// The block to use for the JavaScript dialog blocking option for |coordinator|. +- (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator; + +// Creates a title for the alert based on the URL (|pageURL|), and its +// relationship to the |mainFrameURL| (typically these are identical except for +// when posting alerts from an embedded iframe). ++ (NSString*)localizedTitleForJavaScriptAlertFromPage:(const GURL&)pageURL + mainFrameURL:(const GURL&)mainFrameURL; + +@end + +@implementation DialogPresenter + +@synthesize active = _active; +@synthesize delegate = _delegate; +@synthesize viewController = _viewController; +@synthesize presentedDialogCoordinator = _presentedDialogCoordinator; +@synthesize blockingConfirmationCoordinator = _blockingConfirmationCoordinator; +@synthesize presentedDialogWebState = _presentedDialogWebState; + +- (instancetype)initWithDelegate:(id<DialogPresenterDelegate>)delegate + presentingViewController:(UIViewController*)viewController { + if ((self = [super init])) { + DCHECK(delegate); + DCHECK(viewController); + _delegate = delegate; + _viewController = viewController; + _webStateObserver = std::make_unique<web::WebStateObserverBridge>(self); + } + return self; +} + +#pragma mark - Accessors + +- (void)setActive:(BOOL)active { + if (_active != active) { + _active = active; + [self tryToPresent]; + } +} + +- (BOOL)isShowingDialog { + DCHECK_EQ(self.presentedDialogWebState != nullptr, + self.presentedDialogCoordinator != nil); + return self.presentedDialogCoordinator != nil; +} + +#pragma mark - Public + +- (void)runJavaScriptAlertPanelWithMessage:(NSString*)message + requestURL:(const GURL&)requestURL + webState:(web::WebState*)webState + completionHandler:(void (^)(void))completionHandler { + AlertCallback safeCallback = + GetSafeJavaScriptAlertCompletion(completionHandler); + NSString* title = [DialogPresenter + localizedTitleForJavaScriptAlertFromPage:requestURL + mainFrameURL:webState->GetLastCommittedURL()]; + AlertCoordinator* alertCoordinator = + [[AlertCoordinator alloc] initWithBaseViewController:self.viewController + browser:self.browser + title:title + message:message]; + + // Handler. + __weak DialogPresenter* weakSelf = self; + __weak AlertCoordinator* weakCoordinator = alertCoordinator; + ProceduralBlock OKHandler = ^{ + if (safeCallback) + safeCallback(); + [weakSelf dialogCoordinatorWasStopped:weakCoordinator]; + }; + + // Add button. + [alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_OK) + action:OKHandler + style:UIAlertActionStyleDefault]; + + // Add cancel handler. + alertCoordinator.cancelAction = safeCallback; + alertCoordinator.noInteractionAction = safeCallback; + + // Blocking option setup. + [self setUpBlockingOptionForCoordinator:alertCoordinator webState:webState]; + + [self addDialogCoordinator:alertCoordinator forWebState:webState]; +} + +- (void)runJavaScriptConfirmPanelWithMessage:(NSString*)message + requestURL:(const GURL&)requestURL + webState:(web::WebState*)webState + completionHandler: + (void (^)(BOOL isConfirmed))completionHandler { + ConfirmCallback safeCallback = + GetSafeJavaScriptConfirmationCompletion(completionHandler); + NSString* title = [DialogPresenter + localizedTitleForJavaScriptAlertFromPage:requestURL + mainFrameURL:webState->GetLastCommittedURL()]; + AlertCoordinator* alertCoordinator = + [[AlertCoordinator alloc] initWithBaseViewController:self.viewController + browser:self.browser + title:title + message:message]; + + // Actions. + ProceduralBlock confirmAction = ^{ + if (safeCallback) + safeCallback(YES); + }; + + ProceduralBlock cancelAction = ^{ + if (safeCallback) + safeCallback(NO); + }; + + // Coordinator Setup. + NSString* OKLabel = l10n_util::GetNSString(IDS_OK); + [self setUpAlertCoordinator:alertCoordinator + confirmAction:confirmAction + cancelAction:cancelAction + OKLabel:OKLabel]; + + // Blocking option setup. + [self setUpBlockingOptionForCoordinator:alertCoordinator webState:webState]; + + [self addDialogCoordinator:alertCoordinator forWebState:webState]; +} + +- (void)runJavaScriptTextInputPanelWithPrompt:(NSString*)message + defaultText:(NSString*)defaultText + requestURL:(const GURL&)requestURL + webState:(web::WebState*)webState + completionHandler: + (void (^)(NSString* input))completionHandler { + PromptCallback safeCallback = + GetSafeJavaScriptPromptCompletion(completionHandler); + NSString* title = [DialogPresenter + localizedTitleForJavaScriptAlertFromPage:requestURL + mainFrameURL:webState->GetLastCommittedURL()]; + InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc] + initWithBaseViewController:self.viewController + browser:self.browser + title:title + message:message]; + + // Actions. + __weak InputAlertCoordinator* weakCoordinator = alertCoordinator; + ProceduralBlock confirmAction = ^{ + if (safeCallback) { + NSString* textInput = [weakCoordinator textFields].firstObject.text; + safeCallback(textInput ? textInput : @""); + } + }; + + ProceduralBlock cancelAction = ^{ + if (safeCallback) + safeCallback(nil); + }; + + // Coordinator Setup. + NSString* OKLabel = l10n_util::GetNSString(IDS_OK); + [self setUpAlertCoordinator:alertCoordinator + confirmAction:confirmAction + cancelAction:cancelAction + OKLabel:OKLabel]; + + // Blocking option setup. + [self setUpBlockingOptionForCoordinator:alertCoordinator webState:webState]; + + // Add text field. + [alertCoordinator + addTextFieldWithConfigurationHandler:^(UITextField* textField) { + textField.text = defaultText; + textField.accessibilityIdentifier = + kJavaScriptDialogTextFieldAccessibilityIdentifier; + }]; + + [self addDialogCoordinator:alertCoordinator forWebState:webState]; +} + +- (void)runAuthDialogForProtectionSpace:(NSURLProtectionSpace*)protectionSpace + proposedCredential:(NSURLCredential*)credential + webState:(web::WebState*)webState + completionHandler:(void (^)(NSString* user, + NSString* password))handler { + HTTPAuthCallack safeCallback = GetSafeHTTPAuthCompletion(handler); + NSString* title = l10n_util::GetNSStringWithFixup(IDS_LOGIN_DIALOG_TITLE); + NSString* message = + nsurlprotectionspace_util::MessageForHTTPAuth(protectionSpace); + + InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc] + initWithBaseViewController:self.viewController + browser:self.browser + title:title + message:message]; + + // Actions. + __weak InputAlertCoordinator* weakCoordinator = alertCoordinator; + ProceduralBlock confirmAction = ^{ + if (safeCallback) { + NSString* username = [[weakCoordinator textFields] objectAtIndex:0].text; + NSString* password = [[weakCoordinator textFields] objectAtIndex:1].text; + safeCallback(username, password); + } + }; + + ProceduralBlock cancelAction = ^{ + if (safeCallback) + safeCallback(nil, nil); + }; + + // Coordinator Setup. + NSString* OKLabel = + l10n_util::GetNSStringWithFixup(IDS_LOGIN_DIALOG_OK_BUTTON_LABEL); + [self setUpAlertCoordinator:alertCoordinator + confirmAction:confirmAction + cancelAction:cancelAction + OKLabel:OKLabel]; + + // Add text fields. + NSString* username = credential.user ? credential.user : @""; + [alertCoordinator + addTextFieldWithConfigurationHandler:^(UITextField* textField) { + textField.text = username; + textField.placeholder = l10n_util::GetNSString( + IDS_IOS_HTTP_LOGIN_DIALOG_USERNAME_PLACEHOLDER); + }]; + [alertCoordinator + addTextFieldWithConfigurationHandler:^(UITextField* textField) { + textField.placeholder = l10n_util::GetNSString( + IDS_IOS_HTTP_LOGIN_DIALOG_PASSWORD_PLACEHOLDER); + textField.secureTextEntry = YES; + }]; + + [self addDialogCoordinator:alertCoordinator forWebState:webState]; +} + +- (void)cancelDialogForWebState:(web::WebState*)webState { + BOOL cancelingPresentedDialog = webState == self.presentedDialogWebState; + AlertCoordinator* dialogToCancel = + cancelingPresentedDialog ? self.presentedDialogCoordinator + : _dialogCoordinatorsForWebStates[webState]; + DCHECK(!cancelingPresentedDialog || dialogToCancel); + [dialogToCancel executeCancelHandler]; + [dialogToCancel stop]; + + if (cancelingPresentedDialog) { + DCHECK(_dialogCoordinatorsForWebStates[webState] == nil); + // Simulate a button tap to trigger showing the next dialog. + [self dialogCoordinatorWasStopped:dialogToCancel]; + } else if (dialogToCancel) { + // Clean up queued state. + auto it = + std::find(_queuedWebStates.begin(), _queuedWebStates.end(), webState); + DCHECK(it != _queuedWebStates.end()); + webState->RemoveObserver(_webStateObserver.get()); + _queuedWebStates.erase(it); + _dialogCoordinatorsForWebStates.erase(webState); + } +} + +- (void)cancelAllDialogs { + while (!_queuedWebStates.empty()) { + [self cancelDialogForWebState:_queuedWebStates.front()]; + } + if (self.presentedDialogWebState) + [self cancelDialogForWebState:self.presentedDialogWebState]; +} + +- (void)tryToPresent { + // Don't try to present if a JavaScript dialog blocking confirmation sheet is + // displayed. + if (self.blockingConfirmationCoordinator) + return; + if (!self.showingDialog && _active && !_queuedWebStates.empty() && + [self.delegate shouldDialogPresenterPresentDialog:self]) { + [self showNextDialog]; + } +} + ++ (NSString*)localizedTitleForJavaScriptAlertFromPage:(const GURL&)pageURL + mainFrameURL: + (const GURL&)mainFrameURL { + bool sameOriginAsMainFrame = pageURL.GetOrigin() == mainFrameURL.GetOrigin(); + if (!sameOriginAsMainFrame) { + return l10n_util::GetNSString( + IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME); + } + base::string16 title = url_formatter::FormatUrlForSecurityDisplay( + pageURL, url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS); + return l10n_util::GetNSStringF(IDS_JAVASCRIPT_MESSAGEBOX_TITLE, title); +} + +#pragma mark - CRWWebStateObserver + +- (void)webState:(web::WebState*)webState + didStartNavigation:(web::NavigationContext*)navigation { + [self cancelDialogForWebState:webState]; +} + +- (void)webState:(web::WebState*)webState + didFinishNavigation:(web::NavigationContext*)navigation { + if (navigation->HasCommitted() && !navigation->IsSameDocument()) + [self cancelDialogForWebState:webState]; +} + +- (void)renderProcessGoneForWebState:(web::WebState*)webState { + [self cancelDialogForWebState:webState]; +} + +- (void)webStateDestroyed:(web::WebState*)webState { + [self cancelDialogForWebState:webState]; + webState->RemoveObserver(_webStateObserver.get()); +} + +#pragma mark - Private methods. + +- (void)addDialogCoordinator:(AlertCoordinator*)coordinator + forWebState:(web::WebState*)webState { + DCHECK(coordinator); + DCHECK(webState); + DCHECK_NE(webState, self.presentedDialogWebState); + DCHECK(!_dialogCoordinatorsForWebStates[webState]); + _queuedWebStates.push_back(webState); + _dialogCoordinatorsForWebStates[webState] = coordinator; + + webState->AddObserver(_webStateObserver.get()); + + if (self.active && !self.showingDialog && + [self.delegate shouldDialogPresenterPresentDialog:self]) { + [self showNextDialog]; + } +} + +- (void)showNextDialog { + DCHECK(self.active); + DCHECK(!self.showingDialog); + DCHECK(!_queuedWebStates.empty()); + // Update properties and remove context and the dialog from queue. + self.presentedDialogWebState = _queuedWebStates.front(); + _queuedWebStates.pop_front(); + self.presentedDialogCoordinator = + _dialogCoordinatorsForWebStates[self.presentedDialogWebState]; + _dialogCoordinatorsForWebStates.erase(self.presentedDialogWebState); + // Notify the delegate and display the dialog. + [self.delegate dialogPresenter:self + willShowDialogForWebState:self.presentedDialogWebState]; + [self.presentedDialogCoordinator start]; + self.presentedDialogCoordinator.alertController.view.accessibilityIdentifier = + kJavaScriptDialogAccessibilityIdentifier; +} + +- (void)dialogCoordinatorWasStopped:(AlertCoordinator*)coordinator { + if (coordinator != self.presentedDialogCoordinator) + return; + self.presentedDialogWebState->RemoveObserver(_webStateObserver.get()); + self.presentedDialogWebState = nil; + self.presentedDialogCoordinator = nil; + self.blockingConfirmationCoordinator = nil; + if (!_queuedWebStates.empty() && + [self.delegate shouldDialogPresenterPresentDialog:self]) { + [self showNextDialog]; + } +} + +- (void)setUpAlertCoordinator:(AlertCoordinator*)alertCoordinator + confirmAction:(ProceduralBlock)confirmAction + cancelAction:(ProceduralBlock)cancelAction + OKLabel:(NSString*)label { + // Handlers. + __weak DialogPresenter* weakSelf = self; + __weak AlertCoordinator* weakCoordinator = alertCoordinator; + + ProceduralBlock confirmHandler = ^{ + if (confirmAction) + confirmAction(); + [weakSelf dialogCoordinatorWasStopped:weakCoordinator]; + }; + + ProceduralBlock cancelHandler = ^{ + if (cancelAction) + cancelAction(); + [weakSelf dialogCoordinatorWasStopped:weakCoordinator]; + }; + + // Add buttons. + [alertCoordinator addItemWithTitle:label + action:confirmHandler + style:UIAlertActionStyleDefault]; + [alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL) + action:cancelHandler + style:UIAlertActionStyleCancel]; + + // Add cancel handler. + alertCoordinator.cancelAction = cancelAction; + alertCoordinator.noInteractionAction = cancelAction; +} + +- (void)setUpBlockingOptionForCoordinator:(AlertCoordinator*)alertCoordinator + webState:(web::WebState*)webState { + DCHECK(alertCoordinator); + DCHECK(webState); + + JavaScriptDialogBlockingState::CreateForWebState(webState); + JavaScriptDialogBlockingState* blockingState = + JavaScriptDialogBlockingState::FromWebState(webState); + + // Set up the start action. + ProceduralBlock originalStartAction = alertCoordinator.startAction; + alertCoordinator.startAction = ^{ + if (originalStartAction) + originalStartAction(); + blockingState->JavaScriptDialogWasShown(); + }; + + // Early return if a blocking option should not be added. + if (!blockingState->show_blocking_option()) + return; + + ProceduralBlock blockingAction = + [self blockingActionForCoordinator:alertCoordinator]; + NSString* blockingOptionTitle = + l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT); + [alertCoordinator addItemWithTitle:blockingOptionTitle + action:blockingAction + style:UIAlertActionStyleDefault]; +} + +- (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator { + __weak DialogPresenter* weakSelf = self; + __weak AlertCoordinator* weakCoordinator = coordinator; + __weak UIViewController* weakBaseViewController = + coordinator.baseViewController; + ProceduralBlock cancelAction = coordinator.cancelAction; + return [^{ + // Create the confirmation coordinator. Use an action sheet on iPhone and + // an alert on iPhone. + NSString* confirmMessage = + l10n_util::GetNSString(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION); + AlertCoordinator* confirmationCoordinator = + IsIPadIdiom() ? [[AlertCoordinator alloc] + initWithBaseViewController:weakBaseViewController + browser:self.browser + title:nil + message:confirmMessage] + : [[ActionSheetCoordinator alloc] + initWithBaseViewController:weakBaseViewController + browser:self.browser + title:nil + message:confirmMessage + rect:CGRectZero + view:nil]; + // Set up button actions. + ProceduralBlock confirmHandler = ^{ + if (cancelAction) + cancelAction(); + DialogPresenter* strongSelf = weakSelf; + if (!strongSelf) + return; + web::WebState* webState = [strongSelf presentedDialogWebState]; + JavaScriptDialogBlockingState::FromWebState(webState) + ->JavaScriptDialogBlockingOptionSelected(); + [strongSelf dialogCoordinatorWasStopped:weakCoordinator]; + }; + ProceduralBlock cancelHandler = ^{ + if (cancelAction) + cancelAction(); + [weakSelf dialogCoordinatorWasStopped:weakCoordinator]; + }; + NSString* blockingOptionTitle = + l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT); + [confirmationCoordinator addItemWithTitle:blockingOptionTitle + action:confirmHandler + style:UIAlertActionStyleDestructive]; + [confirmationCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL) + action:cancelHandler + style:UIAlertActionStyleCancel]; + [weakSelf setBlockingConfirmationCoordinator:confirmationCoordinator]; + [[weakSelf blockingConfirmationCoordinator] start]; + } copy]; +} + +@end
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator.mm b/ios/chrome/browser/ui/download/download_manager_coordinator.mm index 1bf7b0f39..bcecc55 100644 --- a/ios/chrome/browser/ui/download/download_manager_coordinator.mm +++ b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
@@ -466,6 +466,7 @@ _installDriveAlertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self.baseViewController + browser:self.browser title:title message:message];
diff --git a/ios/chrome/browser/ui/image_util/BUILD.gn b/ios/chrome/browser/ui/image_util/BUILD.gn index 50f4f7174..121431e 100644 --- a/ios/chrome/browser/ui/image_util/BUILD.gn +++ b/ios/chrome/browser/ui/image_util/BUILD.gn
@@ -25,6 +25,7 @@ "//components/image_fetcher/ios", "//components/strings", "//ios/chrome/app/strings", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/ui/alert_coordinator", "//ios/chrome/browser/web", "//ios/web",
diff --git a/ios/chrome/browser/ui/image_util/image_copier.h b/ios/chrome/browser/ui/image_util/image_copier.h index 237a3a14..3186c65 100644 --- a/ios/chrome/browser/ui/image_util/image_copier.h +++ b/ios/chrome/browser/ui/image_util/image_copier.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +class Browser; class GURL; namespace web { @@ -18,8 +19,8 @@ @interface ImageCopier : NSObject // Init the ImageCopier with a |baseViewController| used to display alerts. -- (instancetype)initWithBaseViewController: - (UIViewController*)baseViewController; +- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController + browser:(Browser*)browser; // Copies the image at |url|. |web_state| is used for fetching image data by // JavaScript. |referrer| is used for download.
diff --git a/ios/chrome/browser/ui/image_util/image_copier.mm b/ios/chrome/browser/ui/image_util/image_copier.mm index 03d5d5be..d9371e8 100644 --- a/ios/chrome/browser/ui/image_util/image_copier.mm +++ b/ios/chrome/browser/ui/image_util/image_copier.mm
@@ -11,6 +11,7 @@ #import "base/strings/sys_string_conversions.h" #include "base/task/post_task.h" #include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" #import "ios/chrome/browser/ui/image_util/image_util.h" #import "ios/chrome/browser/web/image_fetch_tab_helper.h" @@ -56,6 +57,8 @@ @interface ImageCopier () // Base view controller for the alerts. @property(nonatomic, weak) UIViewController* baseViewController; +// The browser. +@property(nonatomic, assign) Browser* browser; // Alert coordinator to give feedback to the user. @property(nonatomic, strong) AlertCoordinator* alertCoordinator; // A counter which generates one ID for each call on @@ -74,14 +77,16 @@ @synthesize baseViewController = _baseViewController; @synthesize idGenerator = _idGenerator; @synthesize activeID = _activeID; +@synthesize browser = _browser; -- (instancetype)initWithBaseViewController: - (UIViewController*)baseViewController { +- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController + browser:(Browser*)browser { self = [super init]; if (self) { self.idGenerator = 1; self.activeID = kNoActiveCopy; self.baseViewController = baseViewController; + self.browser = browser; } return self; } @@ -133,6 +138,7 @@ [self.alertCoordinator stop]; self.alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self.baseViewController + browser:self.browser title:l10n_util::GetNSStringWithFixup( IDS_IOS_CONTENT_COPYIMAGE_ALERT_COPYING) message:nil];
diff --git a/ios/chrome/browser/ui/image_util/image_saver.h b/ios/chrome/browser/ui/image_util/image_saver.h index 3023ba0..0eb63e3 100644 --- a/ios/chrome/browser/ui/image_util/image_saver.h +++ b/ios/chrome/browser/ui/image_util/image_saver.h
@@ -9,6 +9,7 @@ #include "components/image_fetcher/core/request_metadata.h" +class Browser; class GURL; namespace web { class WebState; @@ -19,8 +20,8 @@ @interface ImageSaver : NSObject // Init the ImageSaver with a |baseViewController| used to display alerts. -- (instancetype)initWithBaseViewController: - (UIViewController*)baseViewController; +- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController + browser:(Browser*)browser; // Fetches and saves the image at |url| to the system's album. |web_state| is // used for fetching image data by JavaScript and must not be nullptr.
diff --git a/ios/chrome/browser/ui/image_util/image_saver.mm b/ios/chrome/browser/ui/image_util/image_saver.mm index 28af9e77..22aa2a33 100644 --- a/ios/chrome/browser/ui/image_util/image_saver.mm +++ b/ios/chrome/browser/ui/image_util/image_saver.mm
@@ -15,6 +15,7 @@ #include "base/threading/scoped_blocking_call.h" #include "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h" #include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" #import "ios/chrome/browser/ui/image_util/image_util.h" #import "ios/chrome/browser/web/image_fetch_tab_helper.h" @@ -32,18 +33,21 @@ @property(nonatomic, weak) UIViewController* baseViewController; // Alert coordinator to give feedback to the user. @property(nonatomic, strong) AlertCoordinator* alertCoordinator; +@property(nonatomic, readonly) Browser* browser; @end @implementation ImageSaver @synthesize alertCoordinator = _alertCoordinator; @synthesize baseViewController = _baseViewController; +@synthesize browser = _browser; -- (instancetype)initWithBaseViewController: - (UIViewController*)baseViewController { +- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController + browser:(Browser*)browser { self = [super init]; if (self) { _baseViewController = baseViewController; + _browser = browser; } return self; } @@ -203,6 +207,7 @@ self.alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self.baseViewController + browser:_browser title:title message:message]; @@ -236,6 +241,7 @@ self.alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self.baseViewController + browser:_browser title:title message:errorContent]; [self.alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_OK)
diff --git a/ios/chrome/browser/ui/open_in/BUILD.gn b/ios/chrome/browser/ui/open_in/BUILD.gn index 72f37b66..abbfc6c 100644 --- a/ios/chrome/browser/ui/open_in/BUILD.gn +++ b/ios/chrome/browser/ui/open_in/BUILD.gn
@@ -17,6 +17,7 @@ "//base", "//components/strings", "//ios/chrome/app/strings", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/open_in", "//ios/chrome/browser/ui/alert_coordinator", "//ios/chrome/browser/ui/colors", @@ -46,6 +47,7 @@ deps = [ ":open_in", "//ios/chrome/browser/browser_state:test_support", + "//ios/chrome/browser/main:test_support", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:test_support", "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/open_in/open_in_controller.h b/ios/chrome/browser/ui/open_in/open_in_controller.h index 737a7e97..fe0bfdd 100644 --- a/ios/chrome/browser/ui/open_in/open_in_controller.h +++ b/ios/chrome/browser/ui/open_in/open_in_controller.h
@@ -21,6 +21,8 @@ class WebState; } +class Browser; + // Enum for the IOS.OpenIn.DownloadResult UMA histogram to log the result of // the file download initiated when the user tap on "open in" button. // These values are persisted to logs. Entries should not be renumbered and @@ -43,6 +45,8 @@ // Base view on which the Open In toolbar will be presented. @property(nonatomic, weak) UIView* baseView; +@property(nonatomic, assign) Browser* browser; + // Removes the |openInToolbar_| from the |webController_|'s view and resets the // variables specific to the loaded document. - (void)disable;
diff --git a/ios/chrome/browser/ui/open_in/open_in_controller.mm b/ios/chrome/browser/ui/open_in/open_in_controller.mm index d9303fa..528a1f4 100644 --- a/ios/chrome/browser/ui/open_in/open_in_controller.mm +++ b/ios/chrome/browser/ui/open_in/open_in_controller.mm
@@ -222,6 +222,7 @@ } @synthesize baseView = _baseView; +@synthesize browser = _browser; @synthesize previousScrollViewOffset = _previousScrollViewOffset; - (id)initWithURLLoaderFactory: @@ -424,6 +425,7 @@ _alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:topViewController + browser:_browser title:nil message:message];
diff --git a/ios/chrome/browser/ui/open_in/open_in_mediator.h b/ios/chrome/browser/ui/open_in/open_in_mediator.h index 67e3529..24768038 100644 --- a/ios/chrome/browser/ui/open_in/open_in_mediator.h +++ b/ios/chrome/browser/ui/open_in/open_in_mediator.h
@@ -9,12 +9,12 @@ #import "ios/chrome/browser/open_in/open_in_tab_helper_delegate.h" -class WebStateList; +class Browser; // Mediator which mediates between openIn views and openIn tab helpers. @interface OpenInMediator : NSObject <OpenInTabHelperDelegate> -- (instancetype)initWithWebStateList:(WebStateList*)webStateList; +- (instancetype)initWithBrowser:(Browser*)browser; // Disables all registered openInControllers. - (void)disableAll;
diff --git a/ios/chrome/browser/ui/open_in/open_in_mediator.mm b/ios/chrome/browser/ui/open_in/open_in_mediator.mm index 624486b6..cd779db2 100644 --- a/ios/chrome/browser/ui/open_in/open_in_mediator.mm +++ b/ios/chrome/browser/ui/open_in/open_in_mediator.mm
@@ -6,6 +6,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/open_in/open_in_tab_helper.h" #import "ios/chrome/browser/ui/open_in/open_in_controller.h" #include "ios/chrome/browser/web_state_list/web_state_list.h" @@ -24,6 +25,8 @@ // A map associating webStates with their OpenInControllers. std::map<web::WebState*, OpenInController*> _openInControllersForWebStates; } +// The Browser that accesses the WebStateList. +@property(nonatomic, assign) Browser* browser; // The WebStateList that this mediator listens for newly added Webstates. @property(nonatomic, assign) WebStateList* webStateList; @@ -31,12 +34,14 @@ @implementation OpenInMediator +@synthesize browser = _browser; @synthesize webStateList = _webStateList; -- (instancetype)initWithWebStateList:(WebStateList*)webStateList { +- (instancetype)initWithBrowser:(Browser*)browser { self = [super init]; if (self) { - _webStateList = webStateList; + _browser = browser; + _webStateList = browser->GetWebStateList(); // Set the delegates for all existing webstates in the |_webStateList|. for (int i = 0; i < _webStateList->count(); i++) { web::WebState* webState = _webStateList->GetWebStateAt(i); @@ -85,10 +90,12 @@ withDocumentURL:(const GURL&)documentURL suggestedFileName:(NSString*)suggestedFileName { if (!_openInControllersForWebStates[webState]) { - _openInControllersForWebStates[webState] = [[OpenInController alloc] + OpenInController* openInController = [[OpenInController alloc] initWithURLLoaderFactory:webState->GetBrowserState() ->GetSharedURLLoaderFactory() webState:webState]; + openInController.browser = _browser; + _openInControllersForWebStates[webState] = openInController; } OpenInController* controller = _openInControllersForWebStates[webState]; controller.baseView = webState->GetView();
diff --git a/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm b/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm index eb59123..1dd79c3a 100644 --- a/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm +++ b/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm
@@ -5,9 +5,8 @@ #import "ios/chrome/browser/ui/open_in/open_in_mediator.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#import "ios/chrome/browser/main/test_browser.h" #import "ios/chrome/browser/ui/open_in/open_in_toolbar.h" -#include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" -#include "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/web/public/test/fakes/test_web_state.h" #include "ios/web/public/test/web_task_environment.h" #import "ios/web/public/ui/crw_web_view_proxy.h" @@ -25,10 +24,9 @@ class OpenInMediatorTest : public PlatformTest { protected: OpenInMediatorTest() - : web_state_list_(&web_state_list_delegate_), - browser_state_(TestChromeBrowserState::Builder().Build()), - mediator_( - [[OpenInMediator alloc] initWithWebStateList:&web_state_list_]) {} + : browser_state_(TestChromeBrowserState::Builder().Build()), + browser_(std::make_unique<TestBrowser>(browser_state_.get())), + mediator_([[OpenInMediator alloc] initWithBrowser:browser_.get()]) {} std::unique_ptr<web::TestWebState> CreateWebStateWithView() { auto web_state = std::make_unique<web::TestWebState>(); @@ -44,9 +42,8 @@ } web::WebTaskEnvironment task_environment_; - FakeWebStateListDelegate web_state_list_delegate_; - WebStateList web_state_list_; std::unique_ptr<TestChromeBrowserState> browser_state_; + std::unique_ptr<Browser> browser_; id web_view_proxy_mock; CRWWebViewScrollViewProxy* scroll_view_proxy_; OpenInMediator* mediator_;
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn index 18abca6..835a6c66 100644 --- a/ios/chrome/browser/ui/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -38,6 +38,7 @@ "//ios/chrome/browser/favicon", "//ios/chrome/browser/feature_engagement", "//ios/chrome/browser/main", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/metrics:metrics_internal", "//ios/chrome/browser/reading_list", "//ios/chrome/browser/tabs", @@ -109,6 +110,7 @@ "//components/url_formatter", "//ios/chrome/app/strings", "//ios/chrome/browser", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/ui/alert_coordinator", "//ios/chrome/browser/ui/keyboard", "//ios/chrome/browser/ui/list_model",
diff --git a/ios/chrome/browser/ui/reading_list/context_menu/BUILD.gn b/ios/chrome/browser/ui/reading_list/context_menu/BUILD.gn index 797bbb91..2854787 100644 --- a/ios/chrome/browser/ui/reading_list/context_menu/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/context_menu/BUILD.gn
@@ -4,9 +4,9 @@ source_set("context_menu") { sources = [ - "reading_list_context_menu_commands.h", "reading_list_context_menu_coordinator.h", "reading_list_context_menu_coordinator.mm", + "reading_list_context_menu_delegate.h", "reading_list_context_menu_params.h", "reading_list_context_menu_params.mm", ] @@ -15,7 +15,9 @@ "//base", "//components/feature_engagement/public", "//ios/chrome/app/strings:ios_strings_grit", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/ui/alert_coordinator", + "//ios/chrome/browser/ui/commands", "//ui/base", "//ui/strings:ui_strings_grit", "//url",
diff --git a/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.h b/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.h index d9afcfb..12496d66 100644 --- a/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.h +++ b/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.h
@@ -7,7 +7,7 @@ #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" -@protocol ReadingListContextMenuCommands; +@protocol ReadingListContextMenuDelegate; @class ReadingListContextMenuParams; // Coordinator used for the Reading List context menu. @@ -15,27 +15,31 @@ // The parameters passed on initialization. @property(nonatomic, strong, readonly) ReadingListContextMenuParams* params; -// The handler for commands originating from the context menu. -@property(nonatomic, weak) id<ReadingListContextMenuCommands> commandHandler; +// The delegate to communicate with the context menu. +@property(nonatomic, weak) id<ReadingListContextMenuDelegate> delegate; // Designated initializer. - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser params:(ReadingListContextMenuParams*)params NS_DESIGNATED_INITIALIZER; // ReadingListContextMenuCoordinator must be created using // ReadingListContextMenuParams. - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message rect:(CGRect)rect view:(UIView*)view NS_UNAVAILABLE; - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message barButtonItem:(UIBarButtonItem*)barButtonItem NS_UNAVAILABLE; - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser title:(NSString*)title message:(NSString*)message NS_UNAVAILABLE; @end
diff --git a/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.mm b/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.mm index f47e319..b7f26d9 100644 --- a/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.mm
@@ -9,7 +9,9 @@ #include "base/metrics/user_metrics_action.h" #include "components/feature_engagement/public/event_constants.h" #include "components/feature_engagement/public/tracker.h" -#import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_commands.h" +#import "ios/chrome/browser/main/browser.h" +#import "ios/chrome/browser/ui/commands/command_dispatcher.h" +#import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_delegate.h" #import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_params.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -47,14 +49,16 @@ @end @implementation ReadingListContextMenuCoordinator -@synthesize commandHandler = _commandHandler; +@synthesize delegate = _delegate; @synthesize params = _params; @synthesize started = _started; - (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser params: (ReadingListContextMenuParams*)params { self = [super initWithBaseViewController:viewController + browser:browser title:params.title message:params.message rect:params.rect @@ -72,8 +76,7 @@ if (self.started) return; - __weak id<ReadingListContextMenuCommands> weakCommandHandler = - self.commandHandler; + __weak id<ReadingListContextMenuDelegate> weakDelegate = self.delegate; __weak ReadingListContextMenuParams* weakParams = self.params; // Add "Open In New Tab" option. @@ -81,11 +84,10 @@ l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB); [self addItemWithTitle:openInNewTabTitle action:^{ - [weakCommandHandler + [weakDelegate openURLInNewTabForContextMenuWithParams:weakParams]; UMA_HISTOGRAM_ENUMERATION("ReadingList.ContextMenu", NEW_TAB, ENUM_MAX); - } style:UIAlertActionStyleDefault]; @@ -94,7 +96,7 @@ l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB); [self addItemWithTitle:openInNewTabIncognitoTitle action:^{ - [weakCommandHandler + [weakDelegate openURLInNewIncognitoTabForContextMenuWithParams: weakParams]; UMA_HISTOGRAM_ENUMERATION("ReadingList.ContextMenu", @@ -107,8 +109,7 @@ l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_COPY); [self addItemWithTitle:copyLinkTitle action:^{ - [weakCommandHandler - copyURLForContextMenuWithParams:weakParams]; + [weakDelegate copyURLForContextMenuWithParams:weakParams]; UMA_HISTOGRAM_ENUMERATION("ReadingList.ContextMenu", COPY_LINK, ENUM_MAX); } @@ -120,7 +121,7 @@ l10n_util::GetNSString(IDS_IOS_READING_LIST_CONTENT_CONTEXT_OFFLINE); [self addItemWithTitle:viewOfflineVersionTitle action:^{ - [weakCommandHandler + [weakDelegate openOfflineURLInNewTabForContextMenuWithParams: weakParams]; UMA_HISTOGRAM_ENUMERATION("ReadingList.ContextMenu", @@ -132,7 +133,7 @@ // Add "Cancel" option. [self addItemWithTitle:l10n_util::GetNSString(IDS_APP_CANCEL) action:^{ - [weakCommandHandler + [weakDelegate cancelReadingListContextMenuWithParams:weakParams]; UMA_HISTOGRAM_ENUMERATION("ReadingList.ContextMenu", CANCEL, ENUM_MAX);
diff --git a/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_commands.h b/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_delegate.h similarity index 82% rename from ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_commands.h rename to ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_delegate.h index b0b8784..f732fd6 100644 --- a/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_commands.h +++ b/ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_delegate.h
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_UI_READING_LIST_CONTEXT_MENU_READING_LIST_CONTEXT_MENU_COMMANDS_H_ -#define IOS_CHROME_BROWSER_UI_READING_LIST_CONTEXT_MENU_READING_LIST_CONTEXT_MENU_COMMANDS_H_ +#ifndef IOS_CHROME_BROWSER_UI_READING_LIST_CONTEXT_MENU_READING_LIST_CONTEXT_MENU_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_READING_LIST_CONTEXT_MENU_READING_LIST_CONTEXT_MENU_DELEGATE_H_ @class ReadingListContextMenuParams; -// Commands issued from the context menu shown for reading list items. -@protocol ReadingListContextMenuCommands +// Delegate to handle commands issued from the context menu shown for reading +// list items. +@protocol ReadingListContextMenuDelegate // Opens |param|'s online URL in a new tab. - (void)openURLInNewTabForContextMenuWithParams: (ReadingListContextMenuParams*)params; @@ -25,4 +26,4 @@ (ReadingListContextMenuParams*)params; @end -#endif // IOS_CHROME_BROWSER_UI_READING_LIST_CONTEXT_MENU_READING_LIST_CONTEXT_MENU_COMMANDS_H_ +#endif // IOS_CHROME_BROWSER_UI_READING_LIST_CONTEXT_MENU_READING_LIST_CONTEXT_MENU_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm index 2f40231..c74fe0e5 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -20,8 +20,8 @@ #include "ios/chrome/browser/reading_list/offline_url_utils.h" #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" -#import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_commands.h" #import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_coordinator.h" +#import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_delegate.h" #import "ios/chrome/browser/ui/reading_list/context_menu/reading_list_context_menu_params.h" #import "ios/chrome/browser/ui/reading_list/reading_list_list_item_factory.h" #import "ios/chrome/browser/ui/reading_list/reading_list_list_view_controller_audience.h" @@ -47,10 +47,10 @@ #error "This file requires ARC support." #endif -@interface ReadingListCoordinator ()<ReadingListContextMenuCommands, - ReadingListListViewControllerAudience, - ReadingListListViewControllerDelegate, - UIViewControllerTransitioningDelegate> +@interface ReadingListCoordinator () <ReadingListContextMenuDelegate, + ReadingListListViewControllerAudience, + ReadingListListViewControllerDelegate, + UIViewControllerTransitioningDelegate> // Whether the coordinator is started. @property(nonatomic, assign, getter=isStarted) BOOL started; @@ -108,6 +108,7 @@ self.tableViewController.delegate = self; self.tableViewController.audience = self; self.tableViewController.dataSource = self.mediator; + self.tableViewController.browser = self.browser; itemFactory.accessibilityDelegate = self.tableViewController; // Add the "Done" button and hook it up to |stop|. @@ -181,7 +182,7 @@ self.navigationController.toolbarHidden = !hasItems; } -#pragma mark - ReadingListContextMenuCommands +#pragma mark - ReadingListContextMenuDelegate - (void)openURLInNewTabForContextMenuWithParams: (ReadingListContextMenuParams*)params { @@ -253,8 +254,9 @@ self.contextMenuCoordinator = [[ReadingListContextMenuCoordinator alloc] initWithBaseViewController:self.navigationController + browser:self.browser params:params]; - self.contextMenuCoordinator.commandHandler = self; + self.contextMenuCoordinator.delegate = self; [self.contextMenuCoordinator start]; }
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.h b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.h index b9d35d3..500d6d20 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.h
@@ -12,6 +12,7 @@ @protocol ReadingListDataSource; @protocol ReadingListListViewControllerAudience; @protocol ReadingListListViewControllerDelegate; +class Browser; // View controller that displays reading list items in a table view. @interface ReadingListTableViewController @@ -24,6 +25,8 @@ @property(nonatomic, weak) id<ReadingListListViewControllerAudience> audience; // The table's data source. @property(nonatomic, weak) id<ReadingListDataSource> dataSource; +// The browser. +@property(nonatomic, assign) Browser* browser; // Initializers. - (instancetype)init NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm index b26d67a..5743d46 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm
@@ -12,6 +12,7 @@ #include "base/metrics/user_metrics_action.h" #include "base/stl_util.h" #include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/list_model/list_item+Controller.h" #import "ios/chrome/browser/ui/reading_list/empty_reading_list_message_util.h" @@ -92,6 +93,7 @@ @synthesize delegate = _delegate; @synthesize audience = _audience; @synthesize dataSource = _dataSource; +@synthesize browser = _browser; @dynamic tableViewModel; @synthesize dataSourceModifiedWhileEditing = _dataSourceModifiedWhileEditing; @synthesize toolbarManager = _toolbarManager; @@ -524,8 +526,9 @@ // Creates a confirmation action sheet for the "Mark" toolbar button item. - (void)initializeMarkConfirmationSheet { - self.markConfirmationSheet = - [self.toolbarManager markButtonConfirmationWithBaseViewController:self]; + self.markConfirmationSheet = [self.toolbarManager + markButtonConfirmationWithBaseViewController:self + browser:_browser]; [self.markConfirmationSheet addItemWithTitle:l10n_util::GetNSStringWithFixup(IDS_CANCEL)
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.h b/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.h index 68366052d..75e2fc0 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.h
@@ -9,6 +9,7 @@ @class ActionSheetCoordinator; @protocol ReadingListToolbarButtonCommands; +class Browser; // Enum type describing the items that are currently selected. enum class ReadingListSelectionState { @@ -47,8 +48,10 @@ // Returns an empty ActionSheetCoordinator anchored to the mark button with no // message and no title. -- (ActionSheetCoordinator*)markButtonConfirmationWithBaseViewController: - (UIViewController*)viewController; +- (ActionSheetCoordinator*) + markButtonConfirmationWithBaseViewController: + (UIViewController*)viewController + browser:(Browser*)browser; @end
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm b/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm index ecd4339..8b2c2395 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm
@@ -5,13 +5,13 @@ #import "ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.h" #include "base/logging.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/reading_list/reading_list_constants.h" #import "ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_commands.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" - #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @@ -216,10 +216,13 @@ return _buttonItems; } -- (ActionSheetCoordinator*)markButtonConfirmationWithBaseViewController: - (UIViewController*)viewController { +- (ActionSheetCoordinator*) + markButtonConfirmationWithBaseViewController: + (UIViewController*)viewController + browser:(Browser*)browser { return [[ActionSheetCoordinator alloc] initWithBaseViewController:viewController + browser:browser title:nil message:nil barButtonItem:self.markButton];
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.mm b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.mm index 26d2a18..92fbfc9 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.mm
@@ -134,6 +134,7 @@ - (void)showActionSheetAlert { self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self.addCreditCardViewController + browser:self.browser title: l10n_util::GetNSString( IDS_IOS_ADD_CREDIT_CARD_VIEW_CONTROLLER_DISMISS_ALERT_TITLE) @@ -165,6 +166,7 @@ - (void)showAlertWithMessage:(NSString*)message { self.alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self.addCreditCardViewController + browser:self.browser title:message message:nil];
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn index e780278..a5c6e73 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -87,6 +87,7 @@ "//ios/chrome/browser/browsing_data:counters", "//ios/chrome/browser/browsing_data:feature_flags", "//ios/chrome/browser/browsing_data:test_support", + "//ios/chrome/browser/main:test_support", "//ios/chrome/browser/prefs:browser_prefs", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:test_support",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h index 36825ad..5383d14 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
@@ -8,6 +8,7 @@ #include "components/browsing_data/core/counters/browsing_data_counter.h" #import "ios/chrome/browser/ui/list_model/list_model.h" +class Browser; class BrowsingDataRemover; enum class BrowsingDataRemoveMask; class ChromeBrowserState; @@ -92,6 +93,7 @@ (BrowsingDataRemoveMask)dataTypeMaskToRemove baseViewController: (UIViewController*)baseViewController + browser:(Browser*)browser sourceBarButtonItem: (UIBarButtonItem*)sourceBarButtonItem;
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm index 0b03af7..68b65be 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -31,6 +31,7 @@ #include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/browser/feature_engagement/tracker_factory.h" #include "ios/chrome/browser/history/web_history_service_factory.h" +#import "ios/chrome/browser/main/browser.h" #include "ios/chrome/browser/signin/identity_manager_factory.h" #include "ios/chrome/browser/sync/profile_sync_service_factory.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" @@ -281,6 +282,7 @@ (BrowsingDataRemoveMask)dataTypeMaskToRemove baseViewController: (UIViewController*)baseViewController + browser:(Browser*)browser sourceBarButtonItem: (UIBarButtonItem*)sourceBarButtonItem { if (dataTypeMaskToRemove == BrowsingDataRemoveMask::REMOVE_NOTHING) { @@ -291,6 +293,7 @@ ActionSheetCoordinator* actionCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:baseViewController + browser:browser title:l10n_util::GetNSString( IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE) message:nil
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm index fe1fc4c..f03c7c3 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -358,6 +358,7 @@ self.alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self + browser:_browser title:title message:message]; @@ -411,6 +412,7 @@ self.actionSheetCoordinator = [self.dataManager actionSheetCoordinatorWithDataTypesToRemove:dataTypeMaskToRemove baseViewController:self + browser:_browser sourceBarButtonItem:sender]; [self.actionSheetCoordinator start]; }
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index a294a55a..231499c 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -456,6 +456,7 @@ _alertCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self + browser:_browser title:nil message:alertMessage rect:itemView.frame @@ -502,6 +503,7 @@ _alertCoordinator = [[AlertCoordinator alloc] initWithBaseViewController:self + browser:_browser title:title message:message];
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm index a8054b9..f67fea1 100644 --- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm +++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm
@@ -230,8 +230,8 @@ DCHECK(!self.alertCoordinator); DCHECK(self.topViewController); DCHECK(![self.topViewController presentedViewController]); - self.alertCoordinator = - ErrorCoordinator(error, dismissAction, self.topViewController); + self.alertCoordinator = ErrorCoordinator( + error, dismissAction, self.topViewController, self.browser); [self.alertCoordinator start]; }
diff --git a/ios/public/provider/chrome/browser/voice/voice_search_controller.h b/ios/public/provider/chrome/browser/voice/voice_search_controller.h index 8ccd7fd..9d98a0e5 100644 --- a/ios/public/provider/chrome/browser/voice/voice_search_controller.h +++ b/ios/public/provider/chrome/browser/voice/voice_search_controller.h
@@ -7,6 +7,7 @@ #include "base/memory/ref_counted.h" +class Browser; @protocol LoadQueryCommands; @class UIViewController; @@ -31,7 +32,8 @@ // |presenting_view_controller| is the UIViewController from which to present // the Voice Search input UI. virtual void StartRecognition(UIViewController* presenting_view_controller, - web::WebState* current_web_state); + web::WebState* current_web_state, + Browser* browser); // Whether or not the Text To Speech user preference is enabled. virtual bool IsTextToSpeechEnabled();
diff --git a/ios/public/provider/chrome/browser/voice/voice_search_controller.mm b/ios/public/provider/chrome/browser/voice/voice_search_controller.mm index 0fcf9ff..24e212c7 100644 --- a/ios/public/provider/chrome/browser/voice/voice_search_controller.mm +++ b/ios/public/provider/chrome/browser/voice/voice_search_controller.mm
@@ -20,7 +20,8 @@ void VoiceSearchController::StartRecognition( UIViewController* presenting_view_controller, - web::WebState* current_web_state) {} + web::WebState* current_web_state, + Browser* browser) {} bool VoiceSearchController::IsTextToSpeechEnabled() { return false;
diff --git a/media/capabilities/video_decode_stats_db_impl.cc b/media/capabilities/video_decode_stats_db_impl.cc index 4c4d3b86..4346d68 100644 --- a/media/capabilities/video_decode_stats_db_impl.cc +++ b/media/capabilities/video_decode_stats_db_impl.cc
@@ -5,6 +5,7 @@ #include "media/capabilities/video_decode_stats_db_impl.h" #include <memory> +#include <string> #include <tuple> #include "base/bind.h" @@ -13,10 +14,12 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/sequence_checker.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/default_clock.h" #include "components/leveldb_proto/public/proto_database_provider.h" #include "media/base/media_switches.h" @@ -28,12 +31,23 @@ namespace { +// Timeout threshold for DB operations. See OnOperationTimeout(). +// NOTE: Used by UmaHistogramOpTime. Change the name if you change the time. +static constexpr base::TimeDelta kPendingOpTimeout = + base::TimeDelta::FromSeconds(30); + const int kMaxFramesPerBufferDefault = 2500; const int kMaxDaysToKeepStatsDefault = 30; const bool kEnableUnweightedEntriesDefault = false; +void UmaHistogramOpTime(const std::string& op_name, base::TimeDelta duration) { + base::UmaHistogramCustomMicrosecondsTimes( + "Media.VideoDecodeStatsDB.OpTiming." + op_name, duration, + base::TimeDelta::FromMilliseconds(1), kPendingOpTimeout, 50); +} + } // namespace const char VideoDecodeStatsDBImpl::kMaxFramesPerBufferParamName[] = @@ -45,6 +59,41 @@ const char VideoDecodeStatsDBImpl::kEnableUnweightedEntriesParamName[] = "db_enable_unweighted_entries"; +VideoDecodeStatsDBImpl::PendingOperation::PendingOperation( + std::string uma_str, + std::unique_ptr<base::CancelableOnceClosure> timeout_closure) + : uma_str_(uma_str), + timeout_closure_(std::move(timeout_closure)), + start_ticks_(base::TimeTicks::Now()) { + DVLOG(3) << __func__ << " Started " << uma_str_; +} + +VideoDecodeStatsDBImpl::PendingOperation::~PendingOperation() { + // Destroying a pending operation that hasn't timed out yet implies the + // operation has completed. + if (timeout_closure_ && !timeout_closure_->IsCancelled()) { + base::TimeDelta op_duration = base::TimeTicks::Now() - start_ticks_; + UmaHistogramOpTime(uma_str_, op_duration); + DVLOG(3) << __func__ << " Completed " << uma_str_ << " (" + << op_duration.InMilliseconds() << ")"; + + // Ensure the timeout doesn't fire. Destruction should cancel the callback + // implicitly, but that's not a documented contract, so just taking the safe + // route. + timeout_closure_->Cancel(); + } +} + +void VideoDecodeStatsDBImpl::PendingOperation::OnTimeout() { + UmaHistogramOpTime(uma_str_, kPendingOpTimeout); + LOG(WARNING) << " Timeout performing " << uma_str_ + << " operation on VideoDecodeStatsDB"; + + // Cancel the closure to ensure we don't double report the task as completed + // in ~PendingOperation(). + timeout_closure_->Cancel(); +} + // static int VideoDecodeStatsDBImpl::GetMaxFramesPerBuffer() { return base::GetFieldTrialParamByFeatureAsDouble( @@ -97,6 +146,43 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } +VideoDecodeStatsDBImpl::PendingOpId VideoDecodeStatsDBImpl::StartPendingOp( + std::string uma_str) { + PendingOpId op_id = next_op_id_++; + + auto timeout_closure = std::make_unique<base::CancelableOnceClosure>( + base::BindOnce(&VideoDecodeStatsDBImpl::OnPendingOpTimeout, + weak_ptr_factory_.GetWeakPtr(), op_id)); + + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, timeout_closure->callback(), kPendingOpTimeout); + + pending_ops_.emplace(op_id, std::make_unique<PendingOperation>( + uma_str, std::move(timeout_closure))); + + return op_id; +} + +void VideoDecodeStatsDBImpl::CompletePendingOp(PendingOpId op_id) { + // Destructing the PendingOperation will trigger UMA for completion timing. + int count = pending_ops_.erase(op_id); + + // No big deal, but very unusual. Timeout is very generous, so tasks that + // timeout are generally assumed to be permanently hung. + if (!count) + DVLOG(2) << __func__ << " DB operation completed after timeout."; +} + +void VideoDecodeStatsDBImpl::OnPendingOpTimeout(PendingOpId op_id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + auto it = pending_ops_.find(op_id); + DCHECK(it != pending_ops_.end()); + + it->second->OnTimeout(); + pending_ops_.erase(it); +} + void VideoDecodeStatsDBImpl::Initialize(InitializeCB init_cb) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(init_cb); @@ -107,15 +193,18 @@ // spamming the cache. // TODO(chcunningham): Keep an eye on the size as the table evolves. db_->Init(base::BindOnce(&VideoDecodeStatsDBImpl::OnInit, - weak_ptr_factory_.GetWeakPtr(), std::move(init_cb))); + weak_ptr_factory_.GetWeakPtr(), + StartPendingOp("Initialize"), std::move(init_cb))); } -void VideoDecodeStatsDBImpl::OnInit(InitializeCB init_cb, +void VideoDecodeStatsDBImpl::OnInit(PendingOpId op_id, + InitializeCB init_cb, leveldb_proto::Enums::InitStatus status) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_NE(status, leveldb_proto::Enums::InitStatus::kInvalidOperation); bool success = status == leveldb_proto::Enums::InitStatus::kOK; DVLOG(2) << __func__ << (success ? " succeeded" : " FAILED!"); + CompletePendingOp(op_id); UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Initialize", success); @@ -143,10 +232,11 @@ DVLOG(3) << __func__ << " Reading key " << key.ToLogString() << " from DB with intent to update with " << entry.ToLogString(); - db_->GetEntry(key.Serialize(), - base::BindOnce(&VideoDecodeStatsDBImpl::WriteUpdatedEntry, - weak_ptr_factory_.GetWeakPtr(), key, entry, - std::move(append_done_cb))); + db_->GetEntry( + key.Serialize(), + base::BindOnce(&VideoDecodeStatsDBImpl::WriteUpdatedEntry, + weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Read"), + key, entry, std::move(append_done_cb))); } void VideoDecodeStatsDBImpl::GetDecodeStats(const VideoDescKey& key, @@ -159,7 +249,8 @@ db_->GetEntry( key.Serialize(), base::BindOnce(&VideoDecodeStatsDBImpl::OnGotDecodeStats, - weak_ptr_factory_.GetWeakPtr(), std::move(get_stats_cb))); + weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Read"), + std::move(get_stats_cb))); } bool VideoDecodeStatsDBImpl::AreStatsUsable( @@ -211,6 +302,7 @@ } void VideoDecodeStatsDBImpl::WriteUpdatedEntry( + PendingOpId op_id, const VideoDescKey& key, const DecodeStatsEntry& new_entry, AppendDecodeStatsCB append_done_cb, @@ -218,6 +310,7 @@ std::unique_ptr<DecodeStatsProto> stats_proto) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(IsInitialized()); + CompletePendingOp(op_id); // Note: outcome of "Write" operation logged in OnEntryUpdated(). UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Read", @@ -355,26 +448,31 @@ std::unique_ptr<DBType::KeyEntryVector> entries = std::make_unique<DBType::KeyEntryVector>(); entries->emplace_back(key.Serialize(), *stats_proto); - db_->UpdateEntries(std::move(entries), - std::make_unique<leveldb_proto::KeyVector>(), - base::BindOnce(&VideoDecodeStatsDBImpl::OnEntryUpdated, - weak_ptr_factory_.GetWeakPtr(), - std::move(append_done_cb))); + db_->UpdateEntries( + std::move(entries), std::make_unique<leveldb_proto::KeyVector>(), + base::BindOnce(&VideoDecodeStatsDBImpl::OnEntryUpdated, + weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Write"), + std::move(append_done_cb))); } -void VideoDecodeStatsDBImpl::OnEntryUpdated(AppendDecodeStatsCB append_done_cb, +void VideoDecodeStatsDBImpl::OnEntryUpdated(PendingOpId op_id, + AppendDecodeStatsCB append_done_cb, bool success) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Write", success); DVLOG(3) << __func__ << " update " << (success ? "succeeded" : "FAILED!"); + CompletePendingOp(op_id); + UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Write", success); std::move(append_done_cb).Run(success); } void VideoDecodeStatsDBImpl::OnGotDecodeStats( + PendingOpId op_id, GetDecodeStatsCB get_stats_cb, bool success, std::unique_ptr<DecodeStatsProto> stats_proto) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DVLOG(3) << __func__ << " get " << (success ? "succeeded" : "FAILED!"); + CompletePendingOp(op_id); UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Read", success); std::unique_ptr<DecodeStatsEntry> entry; @@ -437,16 +535,20 @@ db_->LoadKeys( base::BindOnce(&VideoDecodeStatsDBImpl::OnLoadAllKeysForClearing, - weak_ptr_factory_.GetWeakPtr(), std::move(clear_done_cb))); + weak_ptr_factory_.GetWeakPtr(), StartPendingOp("LoadKeys"), + std::move(clear_done_cb))); } void VideoDecodeStatsDBImpl::OnLoadAllKeysForClearing( + PendingOpId op_id, base::OnceClosure clear_done_cb, bool success, std::unique_ptr<std::vector<std::string>> keys) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOG(2) << __func__ << (success ? " succeeded" : " FAILED!"); + CompletePendingOp(op_id); + UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.LoadKeys", success); if (success) { @@ -455,7 +557,7 @@ std::make_unique<ProtoDecodeStatsEntry::KeyEntryVector>(), std::move(keys) /* keys_to_remove */, base::BindOnce(&VideoDecodeStatsDBImpl::OnStatsCleared, - weak_ptr_factory_.GetWeakPtr(), + weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Clear"), std::move(clear_done_cb))); } else { // Fail silently. See comment in OnStatsCleared(). @@ -463,12 +565,15 @@ } } -void VideoDecodeStatsDBImpl::OnStatsCleared(base::OnceClosure clear_done_cb, +void VideoDecodeStatsDBImpl::OnStatsCleared(PendingOpId op_id, + base::OnceClosure clear_done_cb, bool success) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOG(2) << __func__ << (success ? " succeeded" : " FAILED!"); - UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Destroy", success); + CompletePendingOp(op_id); + + UMA_HISTOGRAM_BOOLEAN("Media.VideoDecodeStatsDB.OpSuccess.Clear", success); // We don't pass success to |clear_done_cb|. Clearing is best effort and // there is no additional action for callers to take in case of failure.
diff --git a/media/capabilities/video_decode_stats_db_impl.h b/media/capabilities/video_decode_stats_db_impl.h index f2c1cae..486db823 100644 --- a/media/capabilities/video_decode_stats_db_impl.h +++ b/media/capabilities/video_decode_stats_db_impl.h
@@ -7,6 +7,8 @@ #include <memory> +#include "base/cancelable_callback.h" +#include "base/containers/flat_map.h" #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" #include "components/leveldb_proto/public/proto_database.h" @@ -58,6 +60,8 @@ private: friend class VideoDecodeStatsDBImplTest; + using PendingOpId = int; + // Private constructor only called by tests (friends). Production code // should always use the static Create() method. VideoDecodeStatsDBImpl( @@ -82,16 +86,63 @@ // regardless of how many frames were decoded. static bool GetEnableUnweightedEntries(); + // Creates a PendingOperation using |uma_str| and adds it to |pending_ops_| + // map. Returns PendingOpId for newly started operation. Callers must later + // call CompletePendingOp() with this id to destroy the PendingOperation and + // finalize timing UMA. + PendingOpId StartPendingOp(std::string uma_str); + + // Removes PendingOperation from |pending_ops_| using |op_id_| as a key. This + // destroys the object and triggers timing UMA. + void CompletePendingOp(PendingOpId op_id); + + // Unified handler for timeouts of pending DB operations. PendingOperation + // will be notified that it timed out (to trigger timing UMA) and removed from + // |penidng_ops_|. + void OnPendingOpTimeout(PendingOpId id); + + // Helper to report timing information for DB operations, including when they + // hang indefinitely. + class PendingOperation { + public: + PendingOperation( + std::string uma_str, + std::unique_ptr<base::CancelableOnceClosure> timeout_closure); + // Records task timing UMA if it hasn't already timed out. + virtual ~PendingOperation(); + + // Copies disallowed. Incompatible with move-only members and UMA logging in + // the destructor. + PendingOperation(const PendingOperation&) = delete; + PendingOperation& operator=(const PendingOperation&) = delete; + + // Trigger UMA recording for timeout. + void OnTimeout(); + + private: + friend class VideoDecodeStatsDBImplTest; + + std::string uma_str_; + std::unique_ptr<base::CancelableOnceClosure> timeout_closure_; + base::TimeTicks start_ticks_; + }; + + // Map of operation id -> outstanding PendingOperations. + base::flat_map<PendingOpId, std::unique_ptr<PendingOperation>> pending_ops_; + // Called when the database has been initialized. Will immediately call // |init_cb| to forward |success|. - void OnInit(InitializeCB init_cb, leveldb_proto::Enums::InitStatus status); + void OnInit(PendingOpId id, + InitializeCB init_cb, + leveldb_proto::Enums::InitStatus status); // Returns true if the DB is successfully initialized. bool IsInitialized(); // Passed as the callback for |OnGotDecodeStats| by |AppendDecodeStats| to // update the database once we've read the existing stats entry. - void WriteUpdatedEntry(const VideoDescKey& key, + void WriteUpdatedEntry(PendingOpId op_id, + const VideoDescKey& key, const DecodeStatsEntry& entry, AppendDecodeStatsCB append_done_cb, bool read_success, @@ -99,24 +150,30 @@ // Called when the database has been modified after a call to // |WriteUpdatedEntry|. Will run |append_done_cb| when done. - void OnEntryUpdated(AppendDecodeStatsCB append_done_cb, bool success); + void OnEntryUpdated(PendingOpId op_id, + AppendDecodeStatsCB append_done_cb, + bool success); // Called when GetDecodeStats() operation was performed. |get_stats_cb| // will be run with |success| and a |DecodeStatsEntry| created from // |stats_proto| or nullptr if no entry was found for the requested key. - void OnGotDecodeStats(GetDecodeStatsCB get_stats_cb, + void OnGotDecodeStats(PendingOpId op_id, + GetDecodeStatsCB get_stats_cb, bool success, std::unique_ptr<DecodeStatsProto> stats_proto); // Internal callback for first step of ClearStats(). Will clear all stats If // |keys| fetched successfully. - void OnLoadAllKeysForClearing(base::OnceClosure clear_done_cb, + void OnLoadAllKeysForClearing(PendingOpId op_id, + base::OnceClosure clear_done_cb, bool success, std::unique_ptr<std::vector<std::string>> keys); // Internal callback for OnLoadAllKeysForClearing(), initially triggered by // ClearStats(). Method simply logs |success| and runs |clear_done_cb|. - void OnStatsCleared(base::OnceClosure clear_done_cb, bool success); + void OnStatsCleared(PendingOpId op_id, + base::OnceClosure clear_done_cb, + bool success); // Return true if: // values aren't corrupted nonsense (e.g. way more frames dropped than @@ -130,6 +187,9 @@ wall_clock_ = tick_clock; } + // Next PendingOpId for use in |pending_ops_| map. See StartPendingOp(). + PendingOpId next_op_id_ = 0; + // Indicates whether initialization is completed. Does not indicate whether it // was successful. Will be reset upon calling DestroyStats(). Failed // initialization is signaled by setting |db_| to null.
diff --git a/media/capabilities/video_decode_stats_db_impl_unittest.cc b/media/capabilities/video_decode_stats_db_impl_unittest.cc index e3a8c74..f4fb016 100644 --- a/media/capabilities/video_decode_stats_db_impl_unittest.cc +++ b/media/capabilities/video_decode_stats_db_impl_unittest.cc
@@ -65,6 +65,20 @@ std::unique_ptr<FakeDB<DecodeStatsProto>>(fake_db_))); } + ~VideoDecodeStatsDBImplTest() override { + // Tests should always complete any pending operations + VerifyNoPendingOps(); + } + + void VerifyOnePendingOp(std::string op_name) { + EXPECT_EQ(stats_db_->pending_ops_.size(), 1u); + VideoDecodeStatsDBImpl::PendingOperation* pending_op = + stats_db_->pending_ops_.begin()->second.get(); + EXPECT_EQ(pending_op->uma_str_, op_name); + } + + void VerifyNoPendingOps() { EXPECT_TRUE(stats_db_->pending_ops_.empty()); } + int GetMaxFramesPerBuffer() { return VideoDecodeStatsDBImpl::GetMaxFramesPerBuffer(); } @@ -95,7 +109,9 @@ key, entry, base::BindOnce(&VideoDecodeStatsDBImplTest::MockAppendDecodeStatsCb, base::Unretained(this))); + VerifyOnePendingOp("Read"); fake_db_->GetCallback(true); + VerifyOnePendingOp("Write"); fake_db_->UpdateCallback(true); testing::Mock::VerifyAndClearExpectations(this); } @@ -106,6 +122,7 @@ stats_db_->GetDecodeStats( key, base::BindOnce(&VideoDecodeStatsDBImplTest::GetDecodeStatsCb, base::Unretained(this))); + VerifyOnePendingOp("Read"); fake_db_->GetCallback(true); testing::Mock::VerifyAndClearExpectations(this); } @@ -115,6 +132,7 @@ stats_db_->GetDecodeStats( key, base::BindOnce(&VideoDecodeStatsDBImplTest::GetDecodeStatsCb, base::Unretained(this))); + VerifyOnePendingOp("Read"); fake_db_->GetCallback(true); testing::Mock::VerifyAndClearExpectations(this); } @@ -157,7 +175,8 @@ MOCK_METHOD0(MockClearStatsCb, void()); protected: - base::test::TaskEnvironment task_environment_; + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; const VideoDescKey kStatsKeyVp9; const VideoDescKey kStatsKeyAvc; @@ -175,13 +194,34 @@ DISALLOW_COPY_AND_ASSIGN(VideoDecodeStatsDBImplTest); }; -TEST_F(VideoDecodeStatsDBImplTest, FailedInitialize) { +TEST_F(VideoDecodeStatsDBImplTest, InitializeFailed) { stats_db_->Initialize(base::BindOnce( &VideoDecodeStatsDBImplTest::OnInitialize, base::Unretained(this))); EXPECT_CALL(*this, OnInitialize(false)); fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError); } +TEST_F(VideoDecodeStatsDBImplTest, InitializeTimedOut) { + // Queue up an Initialize. + stats_db_->Initialize(base::BindOnce( + &VideoDecodeStatsDBImplTest::OnInitialize, base::Unretained(this))); + VerifyOnePendingOp("Initialize"); + + // Move time forward enough to trigger timeout. + EXPECT_CALL(*this, OnInitialize(_)).Times(0); + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(100)); + task_environment_.RunUntilIdle(); + + // Verify we didn't get an init callback and task is no longer considered + // pending (because it timed out). + testing::Mock::VerifyAndClearExpectations(this); + VerifyNoPendingOps(); + + // Verify callback still works if init completes very late. + EXPECT_CALL(*this, OnInitialize(false)); + fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError); +} + TEST_F(VideoDecodeStatsDBImplTest, ReadExpectingNothing) { InitializeDB(); VerifyEmptyStats(kStatsKeyVp9); @@ -204,9 +244,12 @@ VerifyReadStats(kStatsKeyVp9, aggregate_entry); // Clear all stats from the DB. + EXPECT_CALL(*this, MockClearStatsCb); stats_db_->ClearStats(base::BindOnce( &VideoDecodeStatsDBImplTest::MockClearStatsCb, base::Unretained(this))); + VerifyOnePendingOp("LoadKeys"); fake_db_->LoadKeysCallback(true); + VerifyOnePendingOp("Clear"); fake_db_->UpdateCallback(true); // Database is now empty. Expect null entry.
diff --git a/media/gpu/vaapi/h264_encoder.h b/media/gpu/vaapi/h264_encoder.h index 517ff2a..908e1f7 100644 --- a/media/gpu/vaapi/h264_encoder.h +++ b/media/gpu/vaapi/h264_encoder.h
@@ -53,7 +53,7 @@ // Bitrate window size in bits. unsigned int cpb_size_bits; - // Quantization parameter. + // Quantization parameter. Their ranges are 0-51. int initial_qp; ScalingSettings scaling_settings;
diff --git a/media/gpu/vaapi/vp8_encoder.cc b/media/gpu/vaapi/vp8_encoder.cc index 5d95914..aaf6c7b 100644 --- a/media/gpu/vaapi/vp8_encoder.cc +++ b/media/gpu/vaapi/vp8_encoder.cc
@@ -16,12 +16,14 @@ // Arbitrarily chosen bitrate window size for rate control, in ms. constexpr int kCPBWindowSizeMs = 1500; -// Based on WebRTC's defaults. +// Quantization parameter. They are vp8 ac/dc indices and their ranges are +// 0-127. Based on WebRTC's defaults. constexpr int kMinQP = 4; // b/110059922, crbug.com/1001900: Tuned 112->117 for bitrate issue in a lower // resolution (180p). constexpr int kMaxQP = 117; -constexpr int kDefaultQP = (3 * kMinQP + kMaxQP) / 4; +// This stands for 32 as a real ac value (see rfc 14.1. table ac_qlookup). +constexpr int kDefaultQP = 28; } // namespace VP8Encoder::EncodeParams::EncodeParams() @@ -161,12 +163,7 @@ DCHECK(!visible_size_.IsEmpty()); current_frame_hdr_.width = visible_size_.width(); current_frame_hdr_.height = visible_size_.height(); - // Since initial_qp is always kDefaultQP (=32), y_ac_qi should be 28 - // (the table index for kDefaultQP, see rfc 14.1. table ac_qlookup) - static_assert(kDefaultQP == 32, "kDefault QP is not 32"); - DCHECK_EQ(current_params_.initial_qp, kDefaultQP); - constexpr uint8_t kDefaultQPACQIndex = 28; - current_frame_hdr_.quantization_hdr.y_ac_qi = kDefaultQPACQIndex; + current_frame_hdr_.quantization_hdr.y_ac_qi = kDefaultQP; current_frame_hdr_.show_frame = true; // TODO(sprang): Make this dynamic. Value based on reference implementation // in libyami (https://github.com/intel/libyami).
diff --git a/media/gpu/vaapi/vp8_encoder.h b/media/gpu/vaapi/vp8_encoder.h index c382822..b7dcbea3 100644 --- a/media/gpu/vaapi/vp8_encoder.h +++ b/media/gpu/vaapi/vp8_encoder.h
@@ -38,6 +38,8 @@ // Coded picture buffer size in bits. unsigned int cpb_size_bits; + // Quantization parameter. They are vp8 ac/dc indices and their ranges are + // 0-127. int initial_qp; ScalingSettings scaling_settings;
diff --git a/media/gpu/vaapi/vp9_encoder.cc b/media/gpu/vaapi/vp9_encoder.cc index 6050678..140ac37 100644 --- a/media/gpu/vaapi/vp9_encoder.cc +++ b/media/gpu/vaapi/vp9_encoder.cc
@@ -16,10 +16,14 @@ // Arbitrarily chosen bitrate window size for rate control, in ms. constexpr int kCPBWindowSizeMs = 500; -// Based on WebRTC's defaults. +// Quantization parameter. They are vp9 ac/dc indices and their ranges are +// 0-255. Based on WebRTC's defaults. constexpr int kMinQP = 4; constexpr int kMaxQP = 112; -constexpr int kDefaultQP = (3 * kMinQP + kMaxQP) / 4; +// This stands for 31 as a real ac value (see rfc 8.6.1 table +// ac_qlookup[3][256]). Note: This needs to be revisited once we have 10&12 bit +// encoder support. +constexpr int kDefaultQP = 24; // filter level may affect on quality at lower bitrates; for now, // we set a constant value (== 10) which is what other VA-API @@ -166,12 +170,7 @@ current_frame_hdr_.frame_height = visible_size_.height(); current_frame_hdr_.render_width = visible_size_.width(); current_frame_hdr_.render_height = visible_size_.height(); - // Since initial_qp is always kDefaultQP (=31), base_q_idx should be 24 - // (the table index for kDefaultQP, see rfc 8.6.1 table ac_qlookup[3][256]) - // Note: This needs to be revisited once we have 10&12 bit encoder support - DCHECK_EQ(current_params_.initial_qp, kDefaultQP); - constexpr uint8_t kDefaultQPACQIndex = 24; - current_frame_hdr_.quant_params.base_q_idx = kDefaultQPACQIndex; + current_frame_hdr_.quant_params.base_q_idx = kDefaultQP; current_frame_hdr_.loop_filter.level = kDefaultLfLevel; current_frame_hdr_.show_frame = true; }
diff --git a/media/gpu/vaapi/vp9_encoder.h b/media/gpu/vaapi/vp9_encoder.h index 0ff69c0..2f3eda4 100644 --- a/media/gpu/vaapi/vp9_encoder.h +++ b/media/gpu/vaapi/vp9_encoder.h
@@ -40,6 +40,8 @@ // Coded picture buffer size in bits. unsigned int cpb_size_bits; + // Quantization parameter. They are vp9 ac/dc indices and their ranges are + // 0-255. int initial_qp; ScalingSettings scaling_settings;
diff --git a/media/mojo/mojom/BUILD.gn b/media/mojo/mojom/BUILD.gn index 9134ea2..0a4415f6 100644 --- a/media/mojo/mojom/BUILD.gn +++ b/media/mojo/mojom/BUILD.gn
@@ -50,7 +50,7 @@ if (is_android) { sources += [ "android_overlay.mojom" ] } else { - sources += [ "soda_service.mojom" ] + sources += [ "speech_recognition_service.mojom" ] } if (is_chromecast) {
diff --git a/media/mojo/mojom/soda_service.mojom b/media/mojo/mojom/soda_service.mojom deleted file mode 100644 index eb9057a..0000000 --- a/media/mojo/mojom/soda_service.mojom +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module media.mojom; - -import "media/mojo/mojom/media_types.mojom"; - -// The main interface a client uses to interact with a SODA service -// process. Every renderer can own one or more Remote<SodaContext>, -// with the receiver bound through the BrowserInterfaceBroker. -interface SodaContext { - // Bind the recognizers to the SODA service. - BindRecognizer(pending_receiver<SodaRecognizer> receiver, - pending_remote<SodaRecognizerClient> client); -}; - -// The main interface to a Speech On-Device API (SODA) service process. -// Used by the browser to issue top-level control requests to the service, -// acquired during process launch. -interface SodaService { - // Bind the SODA context to a new instance of SODA. - BindContext(pending_receiver<SodaContext> context); -}; - -// The interface used to pass raw audio from the renderer to the SODA -// service. The remote lives in the renderer process and the receiver -// lives in the SODA process. -interface SodaRecognizer { - // Initialize the SODA instance. SODA will use the SODA recognition client - // to return the recognition events containing the transcribed audio back - // to the originating media. - SendAudioToSoda(AudioDataS16 buffer); -}; - -// The interface used to return speech recognition events from the SODA -// service back to the originating media. The remote lives in the SODA -// process and the receiver lives in the renderer process. -interface SodaRecognizerClient { - // Triggered by SODA on a speech recognition event. - OnSodaRecognitionEvent(string transcription); -};
diff --git a/media/mojo/mojom/speech_recognition_service.mojom b/media/mojo/mojom/speech_recognition_service.mojom new file mode 100644 index 0000000..b71ebdf --- /dev/null +++ b/media/mojo/mojom/speech_recognition_service.mojom
@@ -0,0 +1,43 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module media.mojom; + +import "media/mojo/mojom/media_types.mojom"; + +// The main interface a client uses to interact with a speech recognition +// service process. Every renderer can own one or more +// Remote<SpeechRecognitionContext>, with the receiver bound through the +// BrowserInterfaceBroker. +interface SpeechRecognitionContext { + // Bind the recognizers to the speech recognition service. + BindRecognizer(pending_receiver<SpeechRecognitionRecognizer> receiver, + pending_remote<SpeechRecognitionRecognizerClient> client); +}; + +// The main interface to a speech secognition service process. +// Used by the browser to issue top-level control requests to the service, +// acquired during process launch. +interface SpeechRecognitionService { + // Bind the context to a new instance of the speech recognition. + BindContext(pending_receiver<SpeechRecognitionContext> context); +}; + +// The interface used to pass raw audio from the renderer to the speech +// recognition service. The remote lives in the renderer process and the +// receiver lives in the speech recognition process. +interface SpeechRecognitionRecognizer { + // Initialize the speech recognition instance. The speech recognition client + // will return the recognition events containing the transcribed audio back + // to the originating media. + SendAudioToSpeechRecognitionService(AudioDataS16 buffer); +}; + +// The interface used to return speech recognition events from the speech +// recognition service back to the originating media. The remote lives in the +// speech recognition process and the receiver lives in the renderer process. +interface SpeechRecognitionRecognizerClient { + // Triggered by speech recognition process on a speech recognition event. + OnSpeechRecognitionRecognitionEvent(string transcription); +};
diff --git a/media/mojo/services/video_decode_perf_history_unittest.cc b/media/mojo/services/video_decode_perf_history_unittest.cc index ac736bf0..3a5a11b 100644 --- a/media/mojo/services/video_decode_perf_history_unittest.cc +++ b/media/mojo/services/video_decode_perf_history_unittest.cc
@@ -52,6 +52,7 @@ // Call CompleteInitialize(...) to run |init_cb| callback. void Initialize(base::OnceCallback<void(bool)> init_cb) override { + EXPECT_FALSE(!!pendnding_init_cb_); pendnding_init_cb_ = std::move(init_cb); } @@ -59,7 +60,7 @@ // for success. void CompleteInitialize(bool success) { DVLOG(2) << __func__ << " running with success = " << success; - EXPECT_FALSE(!pendnding_init_cb_); + EXPECT_TRUE(!!pendnding_init_cb_); std::move(pendnding_init_cb_).Run(success); } @@ -1037,4 +1038,50 @@ VideoDecodePerfHistoryParamTest, ::testing::ValuesIn(kPerfHistoryTestParams)); -} // namespace media +// +// The following test are not parameterized. They instead always hard code +// deferred initialization. +// + +TEST_F(VideoDecodePerfHistoryTest, ClearHistoryTriggersSuccessfulInitialize) { + // Clear the DB. Completion callback shouldn't fire until initialize + // completes. + EXPECT_CALL(*this, MockOnClearedHistory()).Times(0); + perf_history_->ClearHistory( + base::BindOnce(&VideoDecodePerfHistoryParamTest::MockOnClearedHistory, + base::Unretained(this))); + + // Give completion callback a chance to fire. Confirm it did not fire. + task_environment_.RunUntilIdle(); + testing::Mock::VerifyAndClearExpectations(this); + + // Expect completion callback after we successfully initialize. + EXPECT_CALL(*this, MockOnClearedHistory()); + GetFakeDB()->CompleteInitialize(true); + + // Give deferred callback a chance to fire. + task_environment_.RunUntilIdle(); +} + +TEST_F(VideoDecodePerfHistoryTest, ClearHistoryTriggersFailedInitialize) { + // Clear the DB. Completion callback shouldn't fire until initialize + // completes. + EXPECT_CALL(*this, MockOnClearedHistory()).Times(0); + perf_history_->ClearHistory( + base::BindOnce(&VideoDecodePerfHistoryParamTest::MockOnClearedHistory, + base::Unretained(this))); + + // Give completion callback a chance to fire. Confirm it did not fire. + task_environment_.RunUntilIdle(); + testing::Mock::VerifyAndClearExpectations(this); + + // Expect completion callback after completing initialize. "Failure" is still + // a form of completion. + EXPECT_CALL(*this, MockOnClearedHistory()); + GetFakeDB()->CompleteInitialize(false); + + // Give deferred callback a chance to fire. + task_environment_.RunUntilIdle(); +} + +} // namespace media \ No newline at end of file
diff --git a/net/dns/public/doh_provider_list.cc b/net/dns/public/doh_provider_list.cc index b19219b4..158c3c2 100644 --- a/net/dns/public/doh_provider_list.cc +++ b/net/dns/public/doh_provider_list.cc
@@ -4,6 +4,8 @@ #include "net/dns/public/doh_provider_list.h" +#include <utility> + #include "base/logging.h" #include "base/no_destructor.h" @@ -86,8 +88,8 @@ "1dot1dot1dot1.cloudflare-dns.com"} /* dns_over_tls_hostnames */, "https://chrome.cloudflare-dns.com/dns-query", "Cloudflare (1.1.1.1)" /* ui_name */, - "https://developers.cloudflare.com/1.1.1.1/commitment-to-privacy/" - "privacy-policy/privacy-policy/" /* privacy_policy */, + "https://developers.cloudflare.com/1.1.1.1/privacy/" + "public-dns-resolver/" /* privacy_policy */, true /* display_globally */, {} /* display_countries */), DohProviderEntry("Comcast", base::nullopt /* provider_id_for_histogram */, {"75.75.75.75", "75.75.76.76", "2001:558:feed::1",
diff --git a/net/url_request/url_fetcher_core.cc b/net/url_request/url_fetcher_core.cc index 18fe37b0..8861e700 100644 --- a/net/url_request/url_fetcher_core.cc +++ b/net/url_request/url_fetcher_core.cc
@@ -406,6 +406,7 @@ stopped_on_redirect_ = true; url_ = redirect_info.new_url; response_code_ = request_->GetResponseCode(); + response_headers_ = request_->response_headers(); proxy_server_ = request_->proxy_server(); was_cached_ = request_->was_cached(); total_received_bytes_ += request_->GetTotalReceivedBytes();
diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc index d987b9a..dc1696f 100644 --- a/net/url_request/url_fetcher_impl_unittest.cc +++ b/net/url_request/url_fetcher_impl_unittest.cc
@@ -1185,6 +1185,9 @@ delegate.fetcher()->GetStatus().status()); EXPECT_THAT(delegate.fetcher()->GetStatus().error(), IsError(ERR_ABORTED)); EXPECT_EQ(301, delegate.fetcher()->GetResponseCode()); + ASSERT_TRUE(delegate.fetcher()->GetResponseHeaders()); + EXPECT_TRUE(delegate.fetcher()->GetResponseHeaders()->HasHeaderValue( + "Location", std::string(kRedirectTarget))); } TEST_F(URLFetcherTest, ThrottleOnRepeatedFetches) {
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index 77b6c12..9566f8a7 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -37,6 +37,7 @@ #include "pdf/pdfium/pdfium_permissions.h" #include "pdf/pdfium/pdfium_unsupported_features.h" #include "pdf/url_loader_wrapper_impl.h" +#include "ppapi/c/ppb_input_event.h" #include "ppapi/cpp/instance.h" #include "ppapi/cpp/private/pdf.h" #include "ppapi/cpp/var_dictionary.h" @@ -46,6 +47,7 @@ #include "third_party/pdfium/public/fpdf_attachment.h" #include "third_party/pdfium/public/fpdf_catalog.h" #include "third_party/pdfium/public/fpdf_ext.h" +#include "third_party/pdfium/public/fpdf_fwlevent.h" #include "third_party/pdfium/public/fpdf_ppo.h" #include "third_party/pdfium/public/fpdf_searchex.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -1056,7 +1058,8 @@ return true; if (page_index != -1) { - last_page_mouse_down_ = page_index; + focus_item_type_ = FocusElementType::kPage; + last_focused_page_ = page_index; double page_x; double page_y; DeviceToPage(page_index, point, &page_x, &page_y); @@ -1328,8 +1331,8 @@ // If in form text area while left mouse button is held down, check if form // text selection needs to be updated. if (mouse_left_button_down_ && area == PDFiumPage::FORM_TEXT_AREA && - last_page_mouse_down_ != -1) { - SetFormSelectedText(form(), pages_[last_page_mouse_down_]->GetPage()); + last_focused_page_ != -1) { + SetFormSelectedText(form(), pages_[last_focused_page_]->GetPage()); } if (kViewerImplementedPanning && mouse_middle_button_down_) { @@ -1479,10 +1482,15 @@ } bool PDFiumEngine::OnKeyDown(const pp::KeyboardInputEvent& event) { - if (last_page_mouse_down_ == -1) + // Handle tab events first as we might need to transition focus to an + // annotation in PDF. + if (event.GetKeyCode() == FWL_VKEY_Tab) + return HandleTabEvent(event.GetModifiers()); + + if (last_focused_page_ == -1) return false; - bool rv = !!FORM_OnKeyDown(form(), pages_[last_page_mouse_down_]->GetPage(), + bool rv = !!FORM_OnKeyDown(form(), pages_[last_focused_page_]->GetPage(), event.GetKeyCode(), event.GetModifiers()); if (event.GetKeyCode() == ui::VKEY_BACK || @@ -1502,11 +1510,11 @@ } bool PDFiumEngine::OnKeyUp(const pp::KeyboardInputEvent& event) { - if (last_page_mouse_down_ == -1) + if (last_focused_page_ == -1) return false; // Check if form text selection needs to be updated. - FPDF_PAGE page = pages_[last_page_mouse_down_]->GetPage(); + FPDF_PAGE page = pages_[last_focused_page_]->GetPage(); if (in_form_text_area_) SetFormSelectedText(form(), page); @@ -1514,11 +1522,11 @@ } bool PDFiumEngine::OnChar(const pp::KeyboardInputEvent& event) { - if (last_page_mouse_down_ == -1) + if (last_focused_page_ == -1) return false; base::string16 str = base::UTF8ToUTF16(event.GetCharacterText().AsString()); - return !!FORM_OnChar(form(), pages_[last_page_mouse_down_]->GetPage(), str[0], + return !!FORM_OnChar(form(), pages_[last_focused_page_]->GetPage(), str[0], event.GetModifiers()); } @@ -1953,45 +1961,45 @@ bool PDFiumEngine::HasEditableText() { DCHECK(CanEditText()); - if (last_page_mouse_down_ == -1) + if (last_focused_page_ == -1) return false; - FPDF_PAGE page = pages_[last_page_mouse_down_]->GetPage(); + FPDF_PAGE page = pages_[last_focused_page_]->GetPage(); // If the return value is 2, that corresponds to "\0\0". return FORM_GetFocusedText(form(), page, nullptr, 0) > 2; } void PDFiumEngine::ReplaceSelection(const std::string& text) { DCHECK(CanEditText()); - if (last_page_mouse_down_ != -1) { + if (last_focused_page_ != -1) { base::string16 text_wide = base::UTF8ToUTF16(text); FPDF_WIDESTRING text_pdf_wide = reinterpret_cast<FPDF_WIDESTRING>(text_wide.c_str()); - FORM_ReplaceSelection(form(), pages_[last_page_mouse_down_]->GetPage(), + FORM_ReplaceSelection(form(), pages_[last_focused_page_]->GetPage(), text_pdf_wide); } } bool PDFiumEngine::CanUndo() { - if (last_page_mouse_down_ == -1) + if (last_focused_page_ == -1) return false; - return !!FORM_CanUndo(form(), pages_[last_page_mouse_down_]->GetPage()); + return !!FORM_CanUndo(form(), pages_[last_focused_page_]->GetPage()); } bool PDFiumEngine::CanRedo() { - if (last_page_mouse_down_ == -1) + if (last_focused_page_ == -1) return false; - return !!FORM_CanRedo(form(), pages_[last_page_mouse_down_]->GetPage()); + return !!FORM_CanRedo(form(), pages_[last_focused_page_]->GetPage()); } void PDFiumEngine::Undo() { - if (last_page_mouse_down_ != -1) - FORM_Undo(form(), pages_[last_page_mouse_down_]->GetPage()); + if (last_focused_page_ != -1) + FORM_Undo(form(), pages_[last_focused_page_]->GetPage()); } void PDFiumEngine::Redo() { - if (last_page_mouse_down_ != -1) - FORM_Redo(form(), pages_[last_page_mouse_down_]->GetPage()); + if (last_focused_page_ != -1) + FORM_Redo(form(), pages_[last_focused_page_]->GetPage()); } void PDFiumEngine::HandleAccessibilityAction( @@ -2689,12 +2697,6 @@ } else { pages_[i]->Unload(); } - - // If the last mouse down was on a page that's no longer visible, reset - // that variable so that we don't send keyboard events to it (the focus - // will be lost when the page is first closed anyways). - if (static_cast<int>(i) == last_page_mouse_down_) - last_page_mouse_down_ = -1; } } @@ -3753,6 +3755,109 @@ } } +bool PDFiumEngine::HandleTabEvent(uint32_t modifiers) { + bool alt_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_ALTKEY); + bool ctrl_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_CONTROLKEY); + if (alt_key || ctrl_key) + return HandleTabEventWithModifiers(modifiers); + + return modifiers & PP_INPUTEVENT_MODIFIER_SHIFTKEY + ? HandleTabBackward(modifiers) + : HandleTabForward(modifiers); +} + +bool PDFiumEngine::HandleTabEventWithModifiers(uint32_t modifiers) { + // Only handle cases when a page is focused, else return false. + switch (focus_item_type_) { + case FocusElementType::kNone: + case FocusElementType::kDocument: + return false; + case FocusElementType::kPage: + if (last_focused_page_ == -1) + return false; + return !!FORM_OnKeyDown(form(), pages_[last_focused_page_]->GetPage(), + FWL_VKEY_Tab, modifiers); + default: + NOTREACHED(); + return false; + } +} + +bool PDFiumEngine::HandleTabForward(uint32_t modifiers) { + if (focus_item_type_ == FocusElementType::kNone) { + focus_item_type_ = FocusElementType::kDocument; + return true; + } + + int page_index = last_focused_page_; + if (page_index == -1) + page_index = 0; + + bool did_tab_forward = false; + while (!did_tab_forward && PageIndexInBounds(page_index)) { + did_tab_forward = !!FORM_OnKeyDown(form(), pages_[page_index]->GetPage(), + FWL_VKEY_Tab, modifiers); + if (!did_tab_forward) + ++page_index; + } + + if (did_tab_forward) { + last_focused_page_ = page_index; + focus_item_type_ = FocusElementType::kPage; + } else { + last_focused_page_ = -1; + focus_item_type_ = FocusElementType::kNone; + } + return did_tab_forward; +} + +bool PDFiumEngine::HandleTabBackward(uint32_t modifiers) { + if (focus_item_type_ == FocusElementType::kDocument) { + focus_item_type_ = FocusElementType::kNone; + return false; + } + + int page_index = last_focused_page_; + if (page_index == -1) + page_index = GetNumberOfPages() - 1; + + bool did_tab_backward = false; + while (!did_tab_backward && PageIndexInBounds(page_index)) { + did_tab_backward = !!FORM_OnKeyDown(form(), pages_[page_index]->GetPage(), + FWL_VKEY_Tab, modifiers); + if (!did_tab_backward) + --page_index; + } + + if (did_tab_backward) { + last_focused_page_ = page_index; + focus_item_type_ = FocusElementType::kPage; + } else { + // No focusable annotation found in pages. Possible scenarios: + // Case 1: |focus_item_type_| is None. Since no object in any page can take + // the focus, the document should take focus. + // Case 2: |focus_item_type_| is Page. Since there aren't any objects that + // could take focus, the document should take focus. + // Case 3: |focus_item_type_| is Document. Move focus_item_type_ to None. + switch (focus_item_type_) { + case FocusElementType::kPage: + case FocusElementType::kNone: + did_tab_backward = true; + last_focused_page_ = -1; + focus_item_type_ = FocusElementType::kDocument; + KillFormFocus(); + break; + case FocusElementType::kDocument: + focus_item_type_ = FocusElementType::kNone; + break; + default: + NOTREACHED(); + break; + } + } + return did_tab_backward; +} + #if defined(PDF_ENABLE_XFA) void PDFiumEngine::UpdatePageCount() { InvalidateAllPages();
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h index 996ce906..f1b8d32 100644 --- a/pdf/pdfium/pdfium_engine.h +++ b/pdf/pdfium/pdfium_engine.h
@@ -162,6 +162,11 @@ FPDF_DOCUMENT doc() const; FPDF_FORMHANDLE form() const; + // State transition when tabbing forward: + // None -> Document -> Page -> None (when focusable annotations on all pages + // are done). + enum class FocusElementType { kNone, kDocument, kPage }; + private: // This helper class is used to detect the difference in selection between // construction and destruction. At destruction, it invalidates all the @@ -209,6 +214,7 @@ }; friend class FormFillerTest; + friend class PDFiumEngineTabbingTest; friend class PDFiumFormFiller; friend class PDFiumTestBase; friend class SelectionChangeInvalidator; @@ -580,6 +586,15 @@ // Retrieves the version of the PDF (e.g. 1.4 or 2.0) as an enum. PdfVersion GetDocumentVersion() const; + // This is a layer between OnKeyDown() and actual tab handling to facilitate + // testing. + bool HandleTabEvent(uint32_t modifiers); + + // Helper functions to handle tab events. + bool HandleTabEventWithModifiers(uint32_t modifiers); + bool HandleTabForward(uint32_t modifiers); + bool HandleTabBackward(uint32_t modifiers); + PDFEngine::Client* const client_; // The current document layout. @@ -681,8 +696,12 @@ // Timer for touch long press detection. base::OneShotTimer touch_timer_; - // Holds the zero-based page index of the last page that the mouse clicked on. - int last_page_mouse_down_ = -1; + // The focus item type for the currently focused object. + FocusElementType focus_item_type_ = FocusElementType::kNone; + + // Holds the zero-based page index of the last page that had the focused + // object. + int last_focused_page_ = -1; // Holds the zero-based page index of the most visible page; refreshed by // calling CalculateVisiblePages()
diff --git a/pdf/pdfium/pdfium_engine_unittest.cc b/pdf/pdfium/pdfium_engine_unittest.cc index 21ad972..2294113 100644 --- a/pdf/pdfium/pdfium_engine_unittest.cc +++ b/pdf/pdfium/pdfium_engine_unittest.cc
@@ -4,12 +4,14 @@ #include "pdf/pdfium/pdfium_engine.h" +#include "base/test/task_environment.h" #include "pdf/document_layout.h" #include "pdf/document_metadata.h" #include "pdf/pdfium/pdfium_page.h" #include "pdf/pdfium/pdfium_test_base.h" #include "pdf/test/test_client.h" #include "pdf/test/test_utils.h" +#include "ppapi/c/ppb_input_event.h" #include "ppapi/cpp/size.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -222,4 +224,203 @@ } } // namespace + +class PDFiumEngineTabbingTest : public PDFiumTestBase { + public: + PDFiumEngineTabbingTest() = default; + ~PDFiumEngineTabbingTest() override = default; + PDFiumEngineTabbingTest(const PDFiumEngineTabbingTest&) = delete; + PDFiumEngineTabbingTest& operator=(const PDFiumEngineTabbingTest&) = delete; + + bool HandleTabEvent(PDFiumEngine* engine, uint32_t modifiers) { + return engine->HandleTabEvent(modifiers); + } + + PDFiumEngine::FocusElementType GetFocusedElementType(PDFiumEngine* engine) { + return engine->focus_item_type_; + } + + int GetLastFocusedPage(PDFiumEngine* engine) { + return engine->last_focused_page_; + } + + protected: + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; +}; + +TEST_F(PDFiumEngineTabbingTest, TabbingForwardTest) { + /* + * Document structure + * Document + * ++ Page 1 + * ++++ Annotation + * ++++ Annotation + * ++ Page 2 + * ++++ Annotation + */ + TestClient client; + std::unique_ptr<PDFiumEngine> engine = InitializeEngine( + &client, FILE_PATH_LITERAL("annotation_form_fields.pdf")); + ASSERT_TRUE(engine); + + ASSERT_EQ(2, engine->GetNumberOfPages()); + + ASSERT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); + EXPECT_EQ(-1, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kDocument, + GetFocusedElementType(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + EXPECT_EQ(0, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + EXPECT_EQ(0, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + EXPECT_EQ(1, GetLastFocusedPage(engine.get())); + + ASSERT_FALSE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); +} + +TEST_F(PDFiumEngineTabbingTest, TabbingBackwardTest) { + /* + * Document structure + * Document + * ++ Page 1 + * ++++ Annotation + * ++++ Annotation + * ++ Page 2 + * ++++ Annotation + */ + TestClient client; + std::unique_ptr<PDFiumEngine> engine = InitializeEngine( + &client, FILE_PATH_LITERAL("annotation_form_fields.pdf")); + ASSERT_TRUE(engine); + + ASSERT_EQ(2, engine->GetNumberOfPages()); + + ASSERT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); + EXPECT_EQ(-1, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + EXPECT_EQ(1, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + EXPECT_EQ(0, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + EXPECT_EQ(0, GetLastFocusedPage(engine.get())); + + ASSERT_TRUE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kDocument, + GetFocusedElementType(engine.get())); + + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); +} + +TEST_F(PDFiumEngineTabbingTest, TabbingWithModifiers) { + /* + * Document structure + * Document + * ++ Page 1 + * ++++ Annotation + * ++++ Annotation + * ++ Page 2 + * ++++ Annotation + */ + TestClient client; + std::unique_ptr<PDFiumEngine> engine = InitializeEngine( + &client, FILE_PATH_LITERAL("annotation_form_fields.pdf")); + ASSERT_TRUE(engine); + + ASSERT_EQ(2, engine->GetNumberOfPages()); + + ASSERT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); + EXPECT_EQ(-1, GetLastFocusedPage(engine.get())); + + // Tabbing with ctrl modifier. + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_CONTROLKEY)); + // Tabbing with alt modifier. + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_ALTKEY)); + + // Tab to bring document into focus. + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kDocument, + GetFocusedElementType(engine.get())); + + // Tabbing with ctrl modifier. + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_CONTROLKEY)); + // Tabbing with alt modifier. + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_ALTKEY)); + + // Tab to bring first page into focus. + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kPage, + GetFocusedElementType(engine.get())); + + // Tabbing with ctrl modifier. + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_CONTROLKEY)); + // Tabbing with alt modifier. + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_ALTKEY)); +} + +TEST_F(PDFiumEngineTabbingTest, NoFocusableItemTabbingTest) { + /* + * Document structure + * Document + * ++ Page 1 + * ++ Page 2 + */ + TestClient client; + std::unique_ptr<PDFiumEngine> engine = + InitializeEngine(&client, FILE_PATH_LITERAL("hello_world2.pdf")); + ASSERT_TRUE(engine); + + ASSERT_EQ(2, engine->GetNumberOfPages()); + + ASSERT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); + EXPECT_EQ(-1, GetLastFocusedPage(engine.get())); + + // Tabbing forward. + ASSERT_TRUE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kDocument, + GetFocusedElementType(engine.get())); + + ASSERT_FALSE(HandleTabEvent(engine.get(), 0)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); + + // Tabbing backward. + ASSERT_TRUE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kDocument, + GetFocusedElementType(engine.get())); + + ASSERT_FALSE(HandleTabEvent(engine.get(), PP_INPUTEVENT_MODIFIER_SHIFTKEY)); + EXPECT_EQ(PDFiumEngine::FocusElementType::kNone, + GetFocusedElementType(engine.get())); +} + } // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_form_filler.cc b/pdf/pdfium/pdfium_form_filler.cc index 48dec184..2a80411 100644 --- a/pdf/pdfium/pdfium_form_filler.cc +++ b/pdf/pdfium/pdfium_form_filler.cc
@@ -207,7 +207,7 @@ FPDF_PAGE PDFiumFormFiller::Form_GetCurrentPage(FPDF_FORMFILLINFO* param, FPDF_DOCUMENT document) { PDFiumEngine* engine = GetEngine(param); - int index = engine->last_page_mouse_down_; + int index = engine->last_focused_page_; if (index == -1) { index = engine->GetMostVisiblePage(); if (index == -1) { @@ -235,7 +235,7 @@ return; } - int index = engine->last_page_mouse_down_; + int index = engine->last_focused_page_; /* Don't try to calculate the most visible page if we don't have a left click before this event (this code originally copied Form_GetCurrentPage which of course needs to do that and which doesn't have recursion). This can end up
diff --git a/printing/printing_context_chromeos.cc b/printing/printing_context_chromeos.cc index 23e29002..a1241e9b5 100644 --- a/printing/printing_context_chromeos.cc +++ b/printing/printing_context_chromeos.cc
@@ -38,8 +38,7 @@ // Convert from a ColorMode setting to a print-color-mode value from PWG 5100.13 const char* GetColorModelForMode(int color_mode) { const char* mode_string; - base::Optional<bool> is_color = - PrintingContextChromeos::ColorModeIsColor(color_mode); + base::Optional<bool> is_color = IsColorModelSelected(color_mode); if (is_color.has_value()) { mode_string = is_color.value() ? CUPS_PRINT_COLOR_MODE_COLOR : CUPS_PRINT_COLOR_MODE_MONOCHROME; @@ -257,41 +256,6 @@ ReleaseContext(); } -// static -base::Optional<bool> PrintingContextChromeos::ColorModeIsColor(int color_mode) { - switch (color_mode) { - case COLOR: - case CMYK: - case CMY: - case KCMY: - case CMY_K: - case RGB: - case RGB16: - case RGBA: - case COLORMODE_COLOR: - case BROTHER_CUPS_COLOR: - case BROTHER_BRSCRIPT3_COLOR: - case HP_COLOR_COLOR: - case PRINTOUTMODE_NORMAL: - case PROCESSCOLORMODEL_CMYK: - case PROCESSCOLORMODEL_RGB: - return true; - case GRAY: - case BLACK: - case GRAYSCALE: - case COLORMODE_MONOCHROME: - case BROTHER_CUPS_MONO: - case BROTHER_BRSCRIPT3_BLACK: - case HP_COLOR_BLACK: - case PRINTOUTMODE_NORMAL_GRAY: - case PROCESSCOLORMODEL_GREYSCALE: - return false; - default: - LOG(WARNING) << "Unrecognized color mode."; - return base::nullopt; - } -} - void PrintingContextChromeos::AskUserForSettings( int max_pages, bool has_selection,
diff --git a/printing/printing_context_chromeos.h b/printing/printing_context_chromeos.h index 993d99a..c9d1fc77 100644 --- a/printing/printing_context_chromeos.h +++ b/printing/printing_context_chromeos.h
@@ -23,10 +23,6 @@ explicit PrintingContextChromeos(Delegate* delegate); ~PrintingContextChromeos() override; - // Returns true if the ColorMode setting is a color ColorMode and false if it - // is a monochrome ColorMode. - static base::Optional<bool> ColorModeIsColor(int color_mode); - // PrintingContext implementation. void AskUserForSettings(int max_pages, bool has_selection,
diff --git a/services/service_manager/sandbox/BUILD.gn b/services/service_manager/sandbox/BUILD.gn index e361e2b..4d19a0b 100644 --- a/services/service_manager/sandbox/BUILD.gn +++ b/services/service_manager/sandbox/BUILD.gn
@@ -52,8 +52,8 @@ "linux/bpf_renderer_policy_linux.h", "linux/bpf_sharing_service_policy_linux.cc", "linux/bpf_sharing_service_policy_linux.h", - "linux/bpf_soda_policy_linux.cc", - "linux/bpf_soda_policy_linux.h", + "linux/bpf_speech_recognition_policy_linux.cc", + "linux/bpf_speech_recognition_policy_linux.h", "linux/bpf_utility_policy_linux.cc", "linux/bpf_utility_policy_linux.h", "linux/sandbox_debug_handling_linux.cc",
diff --git a/services/service_manager/sandbox/linux/bpf_soda_policy_linux.h b/services/service_manager/sandbox/linux/bpf_soda_policy_linux.h deleted file mode 100644 index 5b1aa319..0000000 --- a/services/service_manager/sandbox/linux/bpf_soda_policy_linux.h +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SODA_POLICY_LINUX_H_ -#define SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SODA_POLICY_LINUX_H_ - -#include "sandbox/linux/bpf_dsl/bpf_dsl.h" -#include "services/service_manager/sandbox/linux/bpf_base_policy_linux.h" - -namespace service_manager { - -// The process policy for the sandboxed utility process that loads the Speech -// On-Device API (SODA). This policy allows the syscalls used by the libsoda.so -// binary to transcribe audio into text. -class SERVICE_MANAGER_SANDBOX_EXPORT SodaProcessPolicy : public BPFBasePolicy { - public: - SodaProcessPolicy(); - ~SodaProcessPolicy() override; - - sandbox::bpf_dsl::ResultExpr EvaluateSyscall( - int system_call_number) const override; - - private: - DISALLOW_COPY_AND_ASSIGN(SodaProcessPolicy); -}; - -} // namespace service_manager - -#endif // SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SODA_POLICY_LINUX_H_
diff --git a/services/service_manager/sandbox/linux/bpf_soda_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.cc similarity index 78% rename from services/service_manager/sandbox/linux/bpf_soda_policy_linux.cc rename to services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.cc index 6e183abf..d1eb78d 100644 --- a/services/service_manager/sandbox/linux/bpf_soda_policy_linux.cc +++ b/services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "services/service_manager/sandbox/linux/bpf_soda_policy_linux.h" +#include "services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.h" #include "sandbox/linux/bpf_dsl/bpf_dsl.h" #include "sandbox/linux/syscall_broker/broker_process.h" @@ -16,10 +16,11 @@ namespace service_manager { -SodaProcessPolicy::SodaProcessPolicy() = default; -SodaProcessPolicy::~SodaProcessPolicy() = default; +SpeechRecognitionProcessPolicy::SpeechRecognitionProcessPolicy() = default; +SpeechRecognitionProcessPolicy::~SpeechRecognitionProcessPolicy() = default; -ResultExpr SodaProcessPolicy::EvaluateSyscall(int system_call_number) const { +ResultExpr SpeechRecognitionProcessPolicy::EvaluateSyscall( + int system_call_number) const { switch (system_call_number) { #if defined(__NR_eventfd2) case __NR_eventfd2:
diff --git a/services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.h b/services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.h new file mode 100644 index 0000000..b12bc827 --- /dev/null +++ b/services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.h
@@ -0,0 +1,31 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SPEECH_RECOGNITION_POLICY_LINUX_H_ +#define SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SPEECH_RECOGNITION_POLICY_LINUX_H_ + +#include "sandbox/linux/bpf_dsl/bpf_dsl.h" +#include "services/service_manager/sandbox/linux/bpf_base_policy_linux.h" + +namespace service_manager { + +// The process policy for the sandboxed utility process that loads the Speech +// On-Device API (SODA). This policy allows the syscalls used by the libsoda.so +// binary to transcribe audio into text. +class SERVICE_MANAGER_SANDBOX_EXPORT SpeechRecognitionProcessPolicy + : public BPFBasePolicy { + public: + SpeechRecognitionProcessPolicy(); + ~SpeechRecognitionProcessPolicy() override; + + sandbox::bpf_dsl::ResultExpr EvaluateSyscall( + int system_call_number) const override; + + private: + DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionProcessPolicy); +}; + +} // namespace service_manager + +#endif // SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SPEECH_RECOGNITION_POLICY_LINUX_H_
diff --git a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc index f5d096b..9f91dba 100644 --- a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc +++ b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
@@ -44,7 +44,7 @@ #include "services/service_manager/sandbox/linux/bpf_print_compositor_policy_linux.h" #include "services/service_manager/sandbox/linux/bpf_renderer_policy_linux.h" #include "services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.h" -#include "services/service_manager/sandbox/linux/bpf_soda_policy_linux.h" +#include "services/service_manager/sandbox/linux/bpf_speech_recognition_policy_linux.h" #include "services/service_manager/sandbox/linux/bpf_utility_policy_linux.h" #if !defined(OS_NACL_NONSFI) @@ -179,8 +179,8 @@ return std::make_unique<AudioProcessPolicy>(); case SandboxType::kSharingService: return std::make_unique<SharingServiceProcessPolicy>(); - case SandboxType::kSoda: - return std::make_unique<SodaProcessPolicy>(); + case SandboxType::kSpeechRecognition: + return std::make_unique<SpeechRecognitionProcessPolicy>(); #if defined(OS_CHROMEOS) case SandboxType::kIme: return std::make_unique<ImeProcessPolicy>(); @@ -229,7 +229,7 @@ #endif // defined(OS_CHROMEOS) case SandboxType::kAudio: case SandboxType::kSharingService: - case SandboxType::kSoda: + case SandboxType::kSpeechRecognition: case SandboxType::kNetwork: case SandboxType::kUtility: case SandboxType::kNoSandbox:
diff --git a/services/service_manager/sandbox/mac/sandbox_mac.mm b/services/service_manager/sandbox/mac/sandbox_mac.mm index 6c192056..6af6ec0 100644 --- a/services/service_manager/sandbox/mac/sandbox_mac.mm +++ b/services/service_manager/sandbox/mac/sandbox_mac.mm
@@ -262,7 +262,7 @@ break; case service_manager::SandboxType::kNoSandbox: case service_manager::SandboxType::kInvalid: - case service_manager::SandboxType::kSoda: + case service_manager::SandboxType::kSpeechRecognition: CHECK(false); break; }
diff --git a/services/service_manager/sandbox/sandbox_type.cc b/services/service_manager/sandbox/sandbox_type.cc index 87996c2..ed334f0 100644 --- a/services/service_manager/sandbox/sandbox_type.cc +++ b/services/service_manager/sandbox/sandbox_type.cc
@@ -54,7 +54,7 @@ #if !defined(OS_MACOSX) case SandboxType::kSharingService: #endif - case SandboxType::kSoda: + case SandboxType::kSpeechRecognition: return false; } } @@ -112,7 +112,7 @@ #if !defined(OS_MACOSX) case SandboxType::kSharingService: #endif - case SandboxType::kSoda: + case SandboxType::kSpeechRecognition: DCHECK(command_line->GetSwitchValueASCII(switches::kProcessType) == switches::kUtilityProcess); DCHECK(!command_line->HasSwitch(switches::kServiceSandboxType)); @@ -192,8 +192,8 @@ case SandboxType::kSharingService: return switches::kSharingServiceSandbox; #endif - case SandboxType::kSoda: - return switches::kSodaSandbox; + case SandboxType::kSpeechRecognition: + return switches::kSpeechRecognitionSandbox; #if defined(OS_WIN) case SandboxType::kXrCompositing: return switches::kXrCompositingSandbox; @@ -252,8 +252,8 @@ #endif if (sandbox_string == switches::kAudioSandbox) return SandboxType::kAudio; - if (sandbox_string == switches::kSodaSandbox) - return SandboxType::kSoda; + if (sandbox_string == switches::kSpeechRecognitionSandbox) + return SandboxType::kSpeechRecognition; #if defined(OS_CHROMEOS) if (sandbox_string == switches::kImeSandbox) return SandboxType::kIme;
diff --git a/services/service_manager/sandbox/sandbox_type.h b/services/service_manager/sandbox/sandbox_type.h index f8ee0c1..1452f103 100644 --- a/services/service_manager/sandbox/sandbox_type.h +++ b/services/service_manager/sandbox/sandbox_type.h
@@ -79,10 +79,10 @@ kSharingService, #endif - // The Speech On-Device API service process. - kSoda, + // The speech recognition service process. + kSpeechRecognition, - kMaxValue = kSoda + kMaxValue = kSpeechRecognition }; SERVICE_MANAGER_SANDBOX_EXPORT bool IsUnsandboxedSandboxType(
diff --git a/services/service_manager/sandbox/switches.cc b/services/service_manager/sandbox/switches.cc index e20a0da..e4693ba 100644 --- a/services/service_manager/sandbox/switches.cc +++ b/services/service_manager/sandbox/switches.cc
@@ -29,7 +29,7 @@ const char kPrintCompositorSandbox[] = "print_compositor"; const char kAudioSandbox[] = "audio"; const char kSharingServiceSandbox[] = "sharing_service"; -const char kSodaSandbox[] = "soda"; +const char kSpeechRecognitionSandbox[] = "speech_recognition"; #if defined(OS_WIN) const char kPdfConversionSandbox[] = "pdf_conversion";
diff --git a/services/service_manager/sandbox/switches.h b/services/service_manager/sandbox/switches.h index 65165e8..b297d4a 100644 --- a/services/service_manager/sandbox/switches.h +++ b/services/service_manager/sandbox/switches.h
@@ -28,7 +28,7 @@ SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPrintCompositorSandbox[]; SERVICE_MANAGER_SANDBOX_EXPORT extern const char kAudioSandbox[]; SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSharingServiceSandbox[]; -SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSodaSandbox[]; +SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSpeechRecognitionSandbox[]; #if defined(OS_WIN) SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPdfConversionSandbox[];
diff --git a/services/service_manager/tests/sandbox/sandbox_type_unittest.cc b/services/service_manager/tests/sandbox/sandbox_type_unittest.cc index 1299d8b..9e9081d0 100644 --- a/services/service_manager/tests/sandbox/sandbox_type_unittest.cc +++ b/services/service_manager/tests/sandbox/sandbox_type_unittest.cc
@@ -85,8 +85,10 @@ EXPECT_EQ(SandboxType::kAudio, SandboxTypeFromCommandLine(command_line8)); base::CommandLine command_line9(command_line); - SetCommandLineFlagsForSandboxType(&command_line9, SandboxType::kSoda); - EXPECT_EQ(SandboxType::kSoda, SandboxTypeFromCommandLine(command_line9)); + SetCommandLineFlagsForSandboxType(&command_line9, + SandboxType::kSpeechRecognition); + EXPECT_EQ(SandboxType::kSpeechRecognition, + SandboxTypeFromCommandLine(command_line9)); #if defined(OS_WIN) base::CommandLine command_line10(command_line);
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json index e9d05c8..747eacd 100644 --- a/testing/buildbot/chromium.ci.json +++ b/testing/buildbot/chromium.ci.json
@@ -79707,24 +79707,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "nacl_loader_unittests", - "test_target": "//components/nacl/loader:nacl_loader_unittests" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "none", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "native_theme_unittests", "test_target": "//ui/native_theme:native_theme_unittests" },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index c7f2d68..e988ae44 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -1115,24 +1115,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "nacl_loader_unittests", - "test_target": "//components/nacl/loader:nacl_loader_unittests" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "none", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "native_theme_unittests", "test_target": "//ui/native_theme:native_theme_unittests" },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 4784d1d4..a80a129 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1440,6 +1440,7 @@ 'linux-win_cross-rel', # Sets enable_nacl=false, https://crbug.com/774186 'Linux TSan Tests', # The TSan bot sets enable_nacl=false 'Mac ASan 64 Tests (1)', # The mac asan bot sets enable_nacl=false + 'Mac10.15 Tests', # All 10.15 builders set enable_nacl=false ], }, 'net_unittests': {
diff --git a/third_party/blink/public/mojom/portal/portal.mojom b/third_party/blink/public/mojom/portal/portal.mojom index 7b0b723..2b06ccd 100644 --- a/third_party/blink/public/mojom/portal/portal.mojom +++ b/third_party/blink/public/mojom/portal/portal.mojom
@@ -23,6 +23,10 @@ // to load a document, or its load was canceled. kRejectedDueToPortalNotReady, + // The activation could not proceed because the portal is showing an error + // page. + kRejectedDueToErrorInPortal, + // The activation could not proceed since the predecessor main frame was // navigating and the navigation could not be cancelled. kRejectedDueToPredecessorNavigation,
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 02d7b032..4aacd0d 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -138,10 +138,11 @@ void DisplayLockContext::AdjustElementStyle(ComputedStyle* style) const { if (state_ == ESubtreeVisibility::kVisible) return; - // If not visible, element gains style and layout containment. If skipped, it - // also gains size containment. + // If not visible, element gains style, layout, and paint containment. If + // skipped, it also gains size containment. // https://wicg.github.io/display-locking/#subtree-visibility - auto contain = style->Contain() | kContainsStyle | kContainsLayout; + auto contain = + style->Contain() | kContainsStyle | kContainsLayout | kContainsPaint; if (IsLocked()) contain |= kContainsSize; style->SetContain(contain);
diff --git a/third_party/blink/renderer/core/html/portal/portal_contents.cc b/third_party/blink/renderer/core/html/portal/portal_contents.cc index 3c6dba1..4ad546c 100644 --- a/third_party/blink/renderer/core/html/portal/portal_contents.cc +++ b/third_party/blink/renderer/core/html/portal/portal_contents.cc
@@ -107,6 +107,10 @@ reject(DOMExceptionCode::kInvalidStateError, "The portal was not yet ready or was blocked."); break; + case mojom::blink::PortalActivateResult::kRejectedDueToErrorInPortal: + reject(DOMExceptionCode::kInvalidStateError, + "The portal is in an error state."); + break; case mojom::blink::PortalActivateResult::kDisconnected: // Only called when |remote_portal_| is disconnected. This usually happens // when the browser/test runner is being shut down.
diff --git a/third_party/blink/renderer/core/timing/event_counts.cc b/third_party/blink/renderer/core/timing/event_counts.cc index e269f2f..45a3fca 100644 --- a/third_party/blink/renderer/core/timing/event_counts.cc +++ b/third_party/blink/renderer/core/timing/event_counts.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/core/timing/event_counts.h" +#include "third_party/blink/renderer/platform/wtf/wtf.h" + namespace blink { class EventCountsIterationSource final @@ -37,10 +39,47 @@ void EventCounts::Add(const AtomicString& event_type) { auto iterator = event_count_map_.find(event_type); - if (iterator == event_count_map_.end()) { - event_count_map_.insert(event_type, 1u); - } else { - iterator->value++; + DCHECK_NE(iterator, event_count_map_.end()); + iterator->value++; +} + +EventCounts::EventCounts() { + // Should contain the same types that would return true in + // IsEventTypeForEventTiming() in event_timing.cc. Note that this list differs + // from https://wicg.github.io/event-timing/#sec-events-exposed in that + // dragexit is not present since it's currently not implemented in Chrome. + DCHECK(IsMainThread()); + DEFINE_STATIC_LOCAL( + const Vector<AtomicString>, event_types, + ({/* MouseEvents */ + event_type_names::kAuxclick, event_type_names::kClick, + event_type_names::kContextmenu, event_type_names::kDblclick, + event_type_names::kMousedown, event_type_names::kMouseenter, + event_type_names::kMouseleave, event_type_names::kMouseout, + event_type_names::kMouseover, event_type_names::kMouseup, + /* PointerEvents */ + event_type_names::kPointerover, event_type_names::kPointerenter, + event_type_names::kPointerdown, event_type_names::kPointerup, + event_type_names::kPointercancel, event_type_names::kPointerout, + event_type_names::kPointerleave, event_type_names::kGotpointercapture, + event_type_names::kLostpointercapture, + /* TouchEvents */ + event_type_names::kTouchstart, event_type_names::kTouchend, + event_type_names::kTouchcancel, + /* KeyboardEvents */ + event_type_names::kKeydown, event_type_names::kKeypress, + event_type_names::kKeyup, + /* InputEvents */ + event_type_names::kBeforeinput, event_type_names::kInput, + /* CompositionEvents */ + event_type_names::kCompositionstart, + event_type_names::kCompositionupdate, event_type_names::kCompositionend, + /* Drag & Drop Events */ + event_type_names::kDragstart, event_type_names::kDragend, + event_type_names::kDragenter, event_type_names::kDragleave, + event_type_names::kDragover, event_type_names::kDrop})); + for (const auto& type : event_types) { + event_count_map_.insert(type, 0u); } }
diff --git a/third_party/blink/renderer/core/timing/event_counts.h b/third_party/blink/renderer/core/timing/event_counts.h index 14908e5..a2ae143 100644 --- a/third_party/blink/renderer/core/timing/event_counts.h +++ b/third_party/blink/renderer/core/timing/event_counts.h
@@ -18,7 +18,7 @@ DEFINE_WRAPPERTYPEINFO(); public: - EventCounts() = default; + EventCounts(); const HashMap<AtomicString, unsigned>& Map() const { return event_count_map_;
diff --git a/third_party/blink/renderer/core/timing/event_timing.cc b/third_party/blink/renderer/core/timing/event_timing.cc index cfde178..c3069aa 100644 --- a/third_party/blink/renderer/core/timing/event_timing.cc +++ b/third_party/blink/renderer/core/timing/event_timing.cc
@@ -46,6 +46,7 @@ event.IsCompositionEvent() || event.IsDragEvent()) && event.type() != event_type_names::kMousemove && event.type() != event_type_names::kPointermove && + event.type() != event_type_names::kPointerrawupdate && event.type() != event_type_names::kTouchmove && event.type() != event_type_names::kWheel && event.type() != event_type_names::kDrag;
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc index dccd01e..a8b52fc 100644 --- a/third_party/blink/renderer/core/timing/window_performance_test.cc +++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -350,8 +350,7 @@ bool should_report; } inputs[] = {{"click", true}, {"keydown", true}, {"keypress", false}, {"pointerdown", false}, - {"mousedown", true}, {"mousemove", false}, - {"mouseover", false}}; + {"mousedown", true}, {"mouseover", false}}; for (const auto& input : inputs) { // first-input does not have a |duration| threshold so use close values. performance_->RegisterEventTiming( @@ -370,7 +369,7 @@ // Test that the 'firstInput' is populated after some irrelevant events are // ignored. TEST_F(WindowPerformanceTest, FirstInputAfterIgnored) { - AtomicString several_events[] = {"mousemove", "mouseover", "mousedown"}; + AtomicString several_events[] = {"mouseover", "mousedown", "pointerup"}; for (const auto& event : several_events) { performance_->RegisterEventTiming( event, GetTimeOrigin(),
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc index 47eea39..e9d07d5 100644 --- a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc +++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc
@@ -189,8 +189,7 @@ Timeline()->DispatchEvent( *TouchEvent::Create("touchstart", GetValidTouchEventInit())); - Timeline()->DispatchEvent( - *TouchEvent::Create("change", GetValidTouchEventInit())); + Timeline()->DispatchEvent(*Event::Create("change", GetValidTouchEventInit())); EXPECT_FALSE(Video()->paused()); } @@ -244,8 +243,7 @@ Timeline()->DispatchEvent( *PointerEvent::Create("pointerdown", GetValidPointerEventInit())); - Timeline()->DispatchEvent( - *TouchEvent::Create("change", GetValidTouchEventInit())); + Timeline()->DispatchEvent(*Event::Create("change", GetValidTouchEventInit())); EXPECT_TRUE(Video()->paused()); }
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc index cbcc72c3..426006d 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc
@@ -69,7 +69,8 @@ MediaControlsOrientationLockDelegate::MediaControlsOrientationLockDelegate( HTMLVideoElement& video) - : video_element_(video) { + : monitor_(video.GetDocument().ToExecutionContext()), + video_element_(video) { if (VideoElement().isConnected()) Attach(); } @@ -187,7 +188,8 @@ #if defined(OS_ANDROID) DCHECK(!monitor_.is_bound()); Platform::Current()->GetBrowserInterfaceBroker()->GetInterface( - monitor_.BindNewPipeAndPassReceiver()); + monitor_.BindNewPipeAndPassReceiver( + GetDocument().GetTaskRunner(TaskType::kMediaElementEvent))); monitor_->IsAutoRotateEnabledByUser(WTF::Bind( &MediaControlsOrientationLockDelegate::GotIsAutoRotateEnabledByUser, WrapPersistent(this))); @@ -438,6 +440,7 @@ void MediaControlsOrientationLockDelegate::Trace(Visitor* visitor) { NativeEventListener::Trace(visitor); + visitor->Trace(monitor_); visitor->Trace(video_element_); }
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.h b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.h index efcfb125..541a1f8 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.h +++ b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.h
@@ -6,11 +6,11 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_MEDIA_CONTROLS_ORIENTATION_LOCK_DELEGATE_H_ #include "base/optional.h" -#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/screen_orientation.mojom-blink.h" #include "third_party/blink/public/common/screen_orientation/web_screen_orientation_lock_type.h" #include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/modules/modules_export.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h" namespace blink { @@ -134,7 +134,9 @@ TaskHandle lock_to_any_task_; - mojo::Remote<device::mojom::blink::ScreenOrientationListener> monitor_; + HeapMojoRemote<device::mojom::blink::ScreenOrientationListener, + HeapMojoWrapperMode::kWithoutContextObserver> + monitor_; base::Optional<bool> is_auto_rotate_enabled_by_user_override_for_testing_;
diff --git a/third_party/blink/renderer/modules/payments/payment_instruments.cc b/third_party/blink/renderer/modules/payments/payment_instruments.cc index 36b523a..aacf4f53 100644 --- a/third_party/blink/renderer/modules/payments/payment_instruments.cc +++ b/third_party/blink/renderer/modules/payments/payment_instruments.cc
@@ -144,8 +144,10 @@ }; PaymentInstruments::PaymentInstruments( - const mojo::Remote<payments::mojom::blink::PaymentManager>& manager) - : manager_(manager) {} + const HeapMojoRemote<payments::mojom::blink::PaymentManager, + HeapMojoWrapperMode::kWithoutContextObserver>& manager, + ExecutionContext* context) + : manager_(manager), permission_service_(context) {} ScriptPromise PaymentInstruments::deleteInstrument( ScriptState* script_state, @@ -287,12 +289,19 @@ return promise; } +void PaymentInstruments::Trace(Visitor* visitor) { + visitor->Trace(permission_service_); + ScriptWrappable::Trace(visitor); +} + mojom::blink::PermissionService* PaymentInstruments::GetPermissionService( ScriptState* script_state) { - if (!permission_service_) { + if (!permission_service_.is_bound()) { ConnectToPermissionService( ExecutionContext::From(script_state), - permission_service_.BindNewPipeAndPassReceiver()); + permission_service_.BindNewPipeAndPassReceiver( + ExecutionContext::From(script_state) + ->GetTaskRunner(TaskType::kMiscPlatformAPI))); } return permission_service_.get(); }
diff --git a/third_party/blink/renderer/modules/payments/payment_instruments.h b/third_party/blink/renderer/modules/payments/payment_instruments.h index c7cb763..58dff8ef 100644 --- a/third_party/blink/renderer/modules/payments/payment_instruments.h +++ b/third_party/blink/renderer/modules/payments/payment_instruments.h
@@ -6,12 +6,13 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_PAYMENT_INSTRUMENTS_H_ #include "base/macros.h" -#include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/payments/payment_app.mojom-blink.h" #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { @@ -28,7 +29,9 @@ public: explicit PaymentInstruments( - const mojo::Remote<payments::mojom::blink::PaymentManager>&); + const HeapMojoRemote<payments::mojom::blink::PaymentManager, + HeapMojoWrapperMode::kWithoutContextObserver>&, + ExecutionContext*); ScriptPromise deleteInstrument(ScriptState*, const String& instrument_key, @@ -46,6 +49,8 @@ ExceptionState&); ScriptPromise clear(ScriptState*, ExceptionState&); + void Trace(Visitor*) override; + private: mojom::blink::PermissionService* GetPermissionService(ScriptState*); void OnRequestPermission(ScriptPromiseResolver*, @@ -68,9 +73,12 @@ void onClearPaymentInstruments(ScriptPromiseResolver*, payments::mojom::blink::PaymentHandlerStatus); - const mojo::Remote<payments::mojom::blink::PaymentManager>& manager_; + const HeapMojoRemote<payments::mojom::blink::PaymentManager, + HeapMojoWrapperMode::kWithoutContextObserver>& manager_; - mojo::Remote<mojom::blink::PermissionService> permission_service_; + HeapMojoRemote<mojom::blink::PermissionService, + HeapMojoWrapperMode::kWithoutContextObserver> + permission_service_; DISALLOW_COPY_AND_ASSIGN(PaymentInstruments); };
diff --git a/third_party/blink/renderer/modules/payments/payment_manager.cc b/third_party/blink/renderer/modules/payments/payment_manager.cc index f1029af..6403248 100644 --- a/third_party/blink/renderer/modules/payments/payment_manager.cc +++ b/third_party/blink/renderer/modules/payments/payment_manager.cc
@@ -17,8 +17,10 @@ namespace blink { PaymentInstruments* PaymentManager::instruments() { - if (!instruments_) - instruments_ = MakeGarbageCollected<PaymentInstruments>(manager_); + if (!instruments_) { + instruments_ = MakeGarbageCollected<PaymentInstruments>( + manager_, registration_->GetExecutionContext()); + } return instruments_; } @@ -78,13 +80,16 @@ void PaymentManager::Trace(Visitor* visitor) { visitor->Trace(registration_); + visitor->Trace(manager_); visitor->Trace(instruments_); visitor->Trace(enable_delegations_resolver_); ScriptWrappable::Trace(visitor); } PaymentManager::PaymentManager(ServiceWorkerRegistration* registration) - : registration_(registration), instruments_(nullptr) { + : registration_(registration), + manager_(registration->GetExecutionContext()), + instruments_(nullptr) { DCHECK(registration); if (ExecutionContext* context = registration->GetExecutionContext()) {
diff --git a/third_party/blink/renderer/modules/payments/payment_manager.h b/third_party/blink/renderer/modules/payments/payment_manager.h index de761ca..d1c3f08 100644 --- a/third_party/blink/renderer/modules/payments/payment_manager.h +++ b/third_party/blink/renderer/modules/payments/payment_manager.h
@@ -6,11 +6,11 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_PAYMENT_MANAGER_H_ #include "base/macros.h" -#include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/payments/payment_app.mojom-blink.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" namespace blink { @@ -45,7 +45,9 @@ payments::mojom::blink::PaymentHandlerStatus status); Member<ServiceWorkerRegistration> registration_; - mojo::Remote<payments::mojom::blink::PaymentManager> manager_; + HeapMojoRemote<payments::mojom::blink::PaymentManager, + HeapMojoWrapperMode::kWithoutContextObserver> + manager_; Member<PaymentInstruments> instruments_; String user_hint_; Member<ScriptPromiseResolver> enable_delegations_resolver_;
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc index de49ab2..85905a3 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -240,7 +240,7 @@ DCHECK(request); auto* connection = MakeGarbageCollected<ControllerPresentationConnection>( - *controller->GetFrame(), controller, presentation_info.id, + *controller->GetSupplementable(), controller, presentation_info.id, presentation_info.url); controller->RegisterConnection(connection);
diff --git a/third_party/blink/renderer/modules/presentation/presentation_controller.cc b/third_party/blink/renderer/modules/presentation/presentation_controller.cc index 5dd3bf68..f2e7db76 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_controller.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_controller.cc
@@ -22,7 +22,6 @@ PresentationController::PresentationController(LocalFrame& frame) : Supplement<LocalFrame>(frame), - ExecutionContextLifecycleObserver(frame.GetDocument()), presentation_controller_receiver_(this, frame.DomWindow()) {} PresentationController::~PresentationController() = default; @@ -60,7 +59,6 @@ visitor->Trace(connections_); visitor->Trace(availability_state_); Supplement<LocalFrame>::Trace(visitor); - ExecutionContextLifecycleObserver::Trace(visitor); } void PresentationController::SetPresentation(Presentation* presentation) { @@ -153,10 +151,10 @@ mojo::Remote<mojom::blink::PresentationService>& PresentationController::GetPresentationService() { - if (!presentation_service_remote_ && GetFrame()) { + if (!presentation_service_remote_ && GetSupplementable()) { scoped_refptr<base::SingleThreadTaskRunner> task_runner = - GetFrame()->GetTaskRunner(TaskType::kPresentation); - GetFrame()->GetBrowserInterfaceBroker().GetInterface( + GetSupplementable()->GetTaskRunner(TaskType::kPresentation); + GetSupplementable()->GetBrowserInterfaceBroker().GetInterface( presentation_service_remote_.BindNewPipeAndPassReceiver(task_runner)); presentation_service_remote_->SetController( presentation_controller_receiver_.BindNewPipeAndPassRemote(
diff --git a/third_party/blink/renderer/modules/presentation/presentation_controller.h b/third_party/blink/renderer/modules/presentation/presentation_controller.h index ba9cfbb..a5789e6 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_controller.h +++ b/third_party/blink/renderer/modules/presentation/presentation_controller.h
@@ -8,7 +8,6 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/presentation/presentation.mojom-blink.h" -#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/modules/modules_export.h" @@ -31,7 +30,6 @@ class MODULES_EXPORT PresentationController : public GarbageCollected<PresentationController>, public Supplement<LocalFrame>, - public ExecutionContextLifecycleObserver, public mojom::blink::PresentationController { USING_GARBAGE_COLLECTED_MIXIN(PresentationController); @@ -79,9 +77,6 @@ virtual void RemoveAvailabilityObserver(PresentationAvailabilityObserver*); private: - // Implementation of ExecutionContextLifecycleObserver. - void ContextDestroyed() override {} - // mojom::blink::PresentationController implementation. void OnScreenAvailabilityUpdated(const KURL&, mojom::blink::ScreenAvailability) override;
diff --git a/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.cc b/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.cc index 8de5bdd..649ed30 100644 --- a/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.cc +++ b/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.cc
@@ -13,14 +13,17 @@ // SensorProviderProxy SensorProviderProxy::SensorProviderProxy(Document& document) - : Supplement<Document>(document), inspector_mode_(false) {} + : Supplement<Document>(document), + sensor_provider_(document.ToExecutionContext()), + inspector_mode_(false) {} void SensorProviderProxy::InitializeIfNeeded() { if (IsInitialized()) return; GetSupplementable()->GetBrowserInterfaceBroker().GetInterface( - sensor_provider_.BindNewPipeAndPassReceiver()); + sensor_provider_.BindNewPipeAndPassReceiver( + GetSupplementable()->GetTaskRunner(TaskType::kSensor))); sensor_provider_.set_disconnect_handler( WTF::Bind(&SensorProviderProxy::OnSensorProviderConnectionError, WrapWeakPersistent(this))); @@ -46,6 +49,7 @@ void SensorProviderProxy::Trace(Visitor* visitor) { visitor->Trace(sensor_proxies_); + visitor->Trace(sensor_provider_); Supplement<Document>::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.h b/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.h index e356f73..46616c3a 100644 --- a/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.h +++ b/third_party/blink/renderer/modules/sensor/sensor_provider_proxy.h
@@ -6,12 +6,13 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SENSOR_SENSOR_PROVIDER_PROXY_H_ #include "base/macros.h" -#include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/sensor.mojom-blink-forward.h" #include "services/device/public/mojom/sensor_provider.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h" #include "third_party/blink/renderer/platform/supplementable.h" namespace blink { @@ -58,7 +59,9 @@ void OnSensorProviderConnectionError(); SensorsSet sensor_proxies_; - mojo::Remote<device::mojom::blink::SensorProvider> sensor_provider_; + HeapMojoRemote<device::mojom::blink::SensorProvider, + HeapMojoWrapperMode::kWithoutContextObserver> + sensor_provider_; bool inspector_mode_; DISALLOW_COPY_AND_ASSIGN(SensorProviderProxy);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc index 71366b5..42ad171 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
@@ -14,7 +14,8 @@ namespace { -WGPUTextureDescriptor AsDawnType(const GPUTextureDescriptor* webgpu_desc) { +WGPUTextureDescriptor AsDawnType(const GPUTextureDescriptor* webgpu_desc, + GPUDevice* device) { DCHECK(webgpu_desc); WGPUTextureDescriptor dawn_desc = {}; @@ -23,7 +24,17 @@ dawn_desc.dimension = AsDawnEnum<WGPUTextureDimension>(webgpu_desc->dimension()); dawn_desc.size = AsDawnType(&webgpu_desc->size()); - dawn_desc.arrayLayerCount = webgpu_desc->arrayLayerCount(); + + if (webgpu_desc->hasArrayLayerCount()) { + device->AddConsoleWarning("arrayLayerCount is deprecated: use size.depth"); + dawn_desc.arrayLayerCount = webgpu_desc->arrayLayerCount(); + } else { + if (dawn_desc.dimension == WGPUTextureDimension_2D) { + dawn_desc.arrayLayerCount = dawn_desc.size.depth; + dawn_desc.size.depth = 1; + } + } + dawn_desc.format = AsDawnEnum<WGPUTextureFormat>(webgpu_desc->format()); dawn_desc.mipLevelCount = webgpu_desc->mipLevelCount(); dawn_desc.sampleCount = webgpu_desc->sampleCount(); @@ -72,7 +83,7 @@ return nullptr; } - WGPUTextureDescriptor dawn_desc = AsDawnType(webgpu_desc); + WGPUTextureDescriptor dawn_desc = AsDawnType(webgpu_desc, device); return MakeGarbageCollected<GPUTexture>( device,
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl index 6dbb94a..cc7b320 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl
@@ -6,7 +6,8 @@ dictionary GPUTextureDescriptor : GPUObjectDescriptorBase { required GPUExtent3D size; - unsigned long arrayLayerCount = 1; + // TODO(crbug.com/1069302): arrayLayerCount is deprecated; remove it. + unsigned long arrayLayerCount; unsigned long mipLevelCount = 1; unsigned long sampleCount = 1; GPUTextureDimension dimension = "2d";
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index a769253..ec553f9 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -220,6 +220,9 @@ crbug.com/974720 [ Mac10.13 ] virtual/text-antialias/firstline/capitalize-transform-2.html [ Pass Crash ] crbug.com/974720 [ Mac10.13 ] virtual/text-antialias/firstline/capitalize-transform.html [ Pass Crash ] +# This will likely be fixed as we finish off the origin isolation architecture work +crbug.com/1067389 external/wpt/origin-isolation/parent-no-child-yes-same.sub.https.html [ Pass Failure Crash ] + # Flakily timing out or failing. # TODO(ccameron): Investigate this. crbug.com/730267 virtual/gpu-rasterization/images/color-profile-group.html [ Pass Timeout Failure ] @@ -3142,6 +3145,18 @@ crbug.com/1067277 external/wpt/css/css-content/element-replacement-on-replaced-element.tentative.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-normal-015a.xht [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-normal-015a.xht [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-normal-015a.xht [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-strict-015a.xht [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-strict-015a.xht [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-strict-015a.xht [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-strict-015b.xht [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-strict-015b.xht [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-strict-015b.xht [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-normal-015b.xht [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-normal-015b.xht [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-normal-015b.xht [ Failure ] crbug.com/626703 [ Linux ] external/wpt/css/css-pseudo/active-selection-063.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/css/css-pseudo/active-selection-063.html [ Failure ] crbug.com/626703 [ Win ] external/wpt/css/css-pseudo/active-selection-063.html [ Failure ] @@ -3200,12 +3215,6 @@ crbug.com/626703 [ Linux ] external/wpt/html/cross-origin-embedder-policy/coep-frame-javascript.https.html [ Timeout ] crbug.com/626703 [ Mac ] external/wpt/html/cross-origin-embedder-policy/coep-frame-javascript.https.html [ Timeout ] crbug.com/626703 [ Win ] external/wpt/html/cross-origin-embedder-policy/coep-frame-javascript.https.html [ Timeout ] -crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-strict-015.xht [ Failure ] -crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-strict-015.xht [ Failure ] -crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-strict-015.xht [ Failure ] -crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-normal-015.xht [ Failure ] -crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-normal-015.xht [ Failure ] -crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-normal-015.xht [ Failure ] crbug.com/626703 [ Mac10.10 ] external/wpt/css/css-layout-api/auto-block-size/absolute.https.html [ Failure ] crbug.com/626703 [ Mac10.11 ] external/wpt/css/css-layout-api/auto-block-size/absolute.https.html [ Failure ] crbug.com/626703 [ Mac10.10 ] external/wpt/css/css-layout-api/edges/all.https.html [ Failure ] @@ -6657,3 +6666,6 @@ crbug.com/1064422 external/wpt/html/user-activation/propagation-crossorigin.sub.tentative.html [ Pass Timeout ] crbug.com/1066178 external/wpt/html/user-activation/consumption-crossorigin.sub.tentative.html [ Pass Timeout ] + +# Sheriff 2020-04-10 +crbug.com/1068681 fast/peerconnection/RTCPeerConnection-insertable-streams.html [ Pass Failure Timeout ]
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-columns-shape.html b/third_party/blink/web_tests/css3/masking/clip-path-columns-shape.html deleted file mode 100644 index 05fa9e89..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-columns-shape.html +++ /dev/null
@@ -1,14 +0,0 @@ -<!DOCTYPE html> -<style> -body { margin: 0; } -.clipped { - background-color: green; - border: 5px solid red; - -webkit-clip-path: inset(5px); - clip-path: inset(5px); -} -</style> -<div style="columns: 2; column-gap: 0; width: 200px; height: 100px"> - <div style="height: 100px"></div> - <div style="height: 90px" class="clipped"></div> -</div>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-columns-svg-clippath-usou-expected.html b/third_party/blink/web_tests/css3/masking/clip-path-columns-svg-clippath-usou-expected.html deleted file mode 100644 index 4337cdf..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-columns-svg-clippath-usou-expected.html +++ /dev/null
@@ -1,4 +0,0 @@ -<!DOCTYPE html> -<body style="margin: 0"> - <div style="width: 90px; height: 90px; margin-left: 105px; margin-top: 5px; background-color: green"></div> -</body>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-columns-svg-clippath-usou.html b/third_party/blink/web_tests/css3/masking/clip-path-columns-svg-clippath-usou.html deleted file mode 100644 index f76c1afd..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-columns-svg-clippath-usou.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<style> -body { margin: 0; } -.clipped { - background-color: green; - border: 5px solid red; - -webkit-clip-path: url(#c); - clip-path: url(#c); -} -</style> -<div style="columns: 2; column-gap: 0; width: 200px; height: 100px"> - <div style="height: 100px"></div> - <div style="height: 90px" class="clipped"></div> -</div> -<svg> - <clipPath id="c" clipPathUnits="userSpaceOnUse"> - <rect x="5" y="5" width="90" height="90"/> - </clipPath> -</svg>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-css-transform-mutated-expected.html b/third_party/blink/web_tests/css3/masking/clip-path-css-transform-mutated-expected.html deleted file mode 100644 index f718ea6..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-css-transform-mutated-expected.html +++ /dev/null
@@ -1,2 +0,0 @@ -<!DOCTYPE html> -<div style="width: 100px; height: 100px; background-color: green"></div>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-css-transform-mutated.html b/third_party/blink/web_tests/css3/masking/clip-path-css-transform-mutated.html deleted file mode 100644 index b8139b3b..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-css-transform-mutated.html +++ /dev/null
@@ -1,21 +0,0 @@ -<!DOCTYPE html> -<script src="../../resources/run-after-layout-and-paint.js"></script> -<style> -#target { - width: 100px; - height: 100px; - background-color: green; - clip-path: url(#clip); -} -</style> -<div id="target"></div> -<svg> - <clipPath id="clip"> - <rect width="1" height="1"/> - </clipPath> -</svg> -<script> -runAfterLayoutAndPaint(function() { - clip.style.transform = 'scale(100, 100)'; -}, true); -</script>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-1.html b/third_party/blink/web_tests/css3/masking/clip-path-reference-box-1.html deleted file mode 100644 index f5cba31..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-1.html +++ /dev/null
@@ -1,12 +0,0 @@ -<!DOCTYPE html> -<style> -.clipped { - width: 100px; - height: 200px; - background-color: green; - -webkit-clip-path: polygon(0% 0%,100% 0%,100% 50%,0% 50%); - clip-path: polygon(0% 0%,100% 0%,100% 50%,0% 50%); - box-shadow: 100px 0px red; -} -</style> -<div class="clipped"></div>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-3-expected.html b/third_party/blink/web_tests/css3/masking/clip-path-reference-box-3-expected.html deleted file mode 100644 index f718ea6..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-3-expected.html +++ /dev/null
@@ -1,2 +0,0 @@ -<!DOCTYPE html> -<div style="width: 100px; height: 100px; background-color: green"></div>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-3.html b/third_party/blink/web_tests/css3/masking/clip-path-reference-box-3.html deleted file mode 100644 index 27e66ff..0000000 --- a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-3.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!DOCTYPE html> -<style> -.clipped { - width: 100px; - height: 200px; - background-color: green; - -webkit-clip-path: polygon(0% 0%,100% 0%,100% 50%,0% 50%); - clip-path: polygon(0% 0%,100% 0%,100% 50%,0% 50%); -} -.abs { - position: absolute; - width: 200px; - height: 200px; -} -</style> -<div class="abs"> - <div class="clipped" style="position: absolute; overflow: hidden"> - <div class="abs" style="transform: translate(0px, 100px); background-color: red;"></div> - </div> -</div>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json index 06edd2c..4b95ca2e 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
@@ -193,6 +193,24 @@ {} ] ], + "css/filter-effects/crashtests/multiple-references-id-crash-002.html": [ + [ + "css/filter-effects/crashtests/multiple-references-id-crash-002.html", + {} + ] + ], + "css/filter-effects/feimage-circular-reference-foreign-object-crash.html": [ + [ + "css/filter-effects/feimage-circular-reference-foreign-object-crash.html", + {} + ] + ], + "css/filter-effects/feimage-reference-foreign-object-crash.html": [ + [ + "css/filter-effects/feimage-reference-foreign-object-crash.html", + {} + ] + ], "dom/svg-insert-crash.html": [ [ "dom/svg-insert-crash.html", @@ -7589,9 +7607,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-bitmap-orientation-none-ref.html", @@ -7601,9 +7619,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-bitmap-swap-width-height-orientation-none-ref.html", @@ -7613,9 +7631,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-bitmap-swap-width-height-ref.html", @@ -7625,9 +7643,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-bitmap-ref.html", @@ -7637,9 +7655,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-element-orientation-none-ref.html", @@ -7649,9 +7667,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-element-swap-width-height-orientation-none-ref.html", @@ -7661,9 +7679,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-element-swap-width-height-ref.html", @@ -7673,9 +7691,9 @@ {} ] ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.tentative.html": [ [ - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.html", + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.tentative.html", [ [ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-element-ref.html", @@ -61199,6 +61217,30 @@ {} ] ], + "css/css-masking/clip-path/clip-path-columns-shape-001.html": [ + [ + "css/css-masking/clip-path/clip-path-columns-shape-001.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-columns-shape-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-masking/clip-path/clip-path-columns-shape-002.html": [ + [ + "css/css-masking/clip-path/clip-path-columns-shape-002.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-columns-shape-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-masking/clip-path/clip-path-element-userSpaceOnUse-001.html": [ [ "css/css-masking/clip-path/clip-path-element-userSpaceOnUse-001.html", @@ -61607,6 +61649,30 @@ {} ] ], + "css/css-masking/clip-path/clip-path-reference-box-001.html": [ + [ + "css/css-masking/clip-path/clip-path-reference-box-001.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-reference-box-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-masking/clip-path/clip-path-reference-box-003.html": [ + [ + "css/css-masking/clip-path/clip-path-reference-box-003.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-reference-box-003-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-masking/clip-path/clip-path-svg-invalidate.html": [ [ "css/css-masking/clip-path/clip-path-svg-invalidate.html", @@ -61619,6 +61685,18 @@ {} ] ], + "css/css-masking/clip-path/clip-path-transform-mutated-001.html": [ + [ + "css/css-masking/clip-path/clip-path-transform-mutated-001.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-transform-mutated-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-masking/clip-path/clip-path-url-reference-change-from-empty.html": [ [ "css/css-masking/clip-path/clip-path-url-reference-change-from-empty.html", @@ -76951,12 +77029,24 @@ {} ] ], - "css/css-text/line-break/line-break-normal-015.xht": [ + "css/css-text/line-break/line-break-normal-015a.xht": [ [ - "css/css-text/line-break/line-break-normal-015.xht", + "css/css-text/line-break/line-break-normal-015a.xht", [ [ - "/css/css-text/line-break/reference/line-break-normal-015-ref.xht", + "/css/css-text/line-break/reference/line-break-normal-015a-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/css-text/line-break/line-break-normal-015b.xht": [ + [ + "css/css-text/line-break/line-break-normal-015b.xht", + [ + [ + "/css/css-text/line-break/reference/line-break-normal-015b-ref.xht", "==" ] ], @@ -77119,12 +77209,24 @@ {} ] ], - "css/css-text/line-break/line-break-strict-015.xht": [ + "css/css-text/line-break/line-break-strict-015a.xht": [ [ - "css/css-text/line-break/line-break-strict-015.xht", + "css/css-text/line-break/line-break-strict-015a.xht", [ [ - "/css/css-text/line-break/reference/line-break-strict-015-ref.xht", + "/css/css-text/line-break/reference/line-break-strict-015a-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/css-text/line-break/line-break-strict-015b.xht": [ + [ + "css/css-text/line-break/line-break-strict-015b.xht", + [ + [ + "/css/css-text/line-break/reference/line-break-strict-015b-ref.xht", "==" ] ], @@ -108557,6 +108659,18 @@ {} ] ], + "css/filter-effects/drop-shadow-clipped-001.html": [ + [ + "css/filter-effects/drop-shadow-clipped-001.html", + [ + [ + "/css/filter-effects/reference/drop-shadow-clipped-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/filter-effects/dynamic-filter-changes-001.html": [ [ "css/filter-effects/dynamic-filter-changes-001.html", @@ -150311,6 +150425,12 @@ "css/css-masking/clip-path/reference/clip-path-circle-ref.html": [ [] ], + "css/css-masking/clip-path/reference/clip-path-columns-shape-001-ref.html": [ + [] + ], + "css/css-masking/clip-path/reference/clip-path-columns-shape-002-ref.html": [ + [] + ], "css/css-masking/clip-path/reference/clip-path-ellipse-ref.html": [ [] ], @@ -150338,6 +150458,12 @@ "css/css-masking/clip-path/reference/clip-path-ref-right-green-ref.html": [ [] ], + "css/css-masking/clip-path/reference/clip-path-reference-box-001-ref.html": [ + [] + ], + "css/css-masking/clip-path/reference/clip-path-reference-box-003-ref.html": [ + [] + ], "css/css-masking/clip-path/reference/clip-path-square-001-ref.html": [ [] ], @@ -150353,6 +150479,9 @@ "css/css-masking/clip-path/reference/clip-path-stripes-003-ref.html": [ [] ], + "css/css-masking/clip-path/reference/clip-path-transform-mutated-001-ref.html": [ + [] + ], "css/css-masking/clip-path/reference/green-100x100.html": [ [] ], @@ -153935,7 +154064,10 @@ "css/css-text/line-break/reference/line-break-normal-014-ref.xht": [ [] ], - "css/css-text/line-break/reference/line-break-normal-015-ref.xht": [ + "css/css-text/line-break/reference/line-break-normal-015a-ref.xht": [ + [] + ], + "css/css-text/line-break/reference/line-break-normal-015b-ref.xht": [ [] ], "css/css-text/line-break/reference/line-break-normal-016a-ref.xht": [ @@ -153974,7 +154106,10 @@ "css/css-text/line-break/reference/line-break-strict-014-ref.xht": [ [] ], - "css/css-text/line-break/reference/line-break-strict-015-ref.xht": [ + "css/css-text/line-break/reference/line-break-strict-015a-ref.xht": [ + [] + ], + "css/css-text/line-break/reference/line-break-strict-015b-ref.xht": [ [] ], "css/css-text/line-break/reference/line-break-strict-016a-ref.xht": [ @@ -160256,6 +160391,9 @@ "css/filter-effects/reference/clip-under-filter-002-ref.html": [ [] ], + "css/filter-effects/reference/drop-shadow-clipped-001-ref.html": [ + [] + ], "css/filter-effects/reference/dynamic-filter-changes-001-ref.html": [ [] ], @@ -164603,6 +164741,9 @@ "event-timing/META.yml": [ [] ], + "event-timing/idlharness.any-expected.txt": [ + [] + ], "event-timing/resources/crossiframe-childframe.html": [ [] ], @@ -177200,6 +177341,33 @@ "orientation-sensor/orientation-sensor-tests.js": [ [] ], + "origin-isolation/META.yml": [ + [] + ], + "origin-isolation/OWNERS": [ + [] + ], + "origin-isolation/README.md": [ + [] + ], + "origin-isolation/parent-yes-child-no-same.sub.https.html.headers": [ + [] + ], + "origin-isolation/parent-yes-child-no-subdomain.sub.https.html.headers": [ + [] + ], + "origin-isolation/parent-yes-child-yes-same.sub.https.html.headers": [ + [] + ], + "origin-isolation/parent-yes-child-yes-subdomain.sub.https.html.headers": [ + [] + ], + "origin-isolation/resources/helpers.mjs": [ + [] + ], + "origin-isolation/resources/send-origin-isolation-header.py": [ + [] + ], "origin-policy/bad-server/resources/subframe-with-bad-header.py": [ [] ], @@ -177353,9 +177521,6 @@ "paint-timing/OWNERS": [ [] ], - "paint-timing/fcp-only/fcp-text-input-expected.txt": [ - [] - ], "paint-timing/resources/circle.svg": [ [] ], @@ -177668,6 +177833,9 @@ "portals/resources/focus-page-with-x-origin-iframe.sub.html": [ [] ], + "portals/resources/invalid.asis": [ + [] + ], "portals/resources/open-blank-host.js": [ [] ], @@ -253396,6 +253564,14 @@ } ] ], + "event-timing/event-counts-zero.html": [ + [ + "event-timing/event-counts-zero.html", + { + "testdriver": true + } + ] + ], "event-timing/idlharness.any.js": [ [ "event-timing/idlharness.any.html", @@ -291023,6 +291199,42 @@ } ] ], + "origin-isolation/parent-no-child-yes-same.sub.https.html": [ + [ + "origin-isolation/parent-no-child-yes-same.sub.https.html", + {} + ] + ], + "origin-isolation/parent-no-child-yes-subdomain.sub.https.html": [ + [ + "origin-isolation/parent-no-child-yes-subdomain.sub.https.html", + {} + ] + ], + "origin-isolation/parent-yes-child-no-same.sub.https.html": [ + [ + "origin-isolation/parent-yes-child-no-same.sub.https.html", + {} + ] + ], + "origin-isolation/parent-yes-child-no-subdomain.sub.https.html": [ + [ + "origin-isolation/parent-yes-child-no-subdomain.sub.https.html", + {} + ] + ], + "origin-isolation/parent-yes-child-yes-same.sub.https.html": [ + [ + "origin-isolation/parent-yes-child-yes-same.sub.https.html", + {} + ] + ], + "origin-isolation/parent-yes-child-yes-subdomain.sub.https.html": [ + [ + "origin-isolation/parent-yes-child-yes-subdomain.sub.https.html", + {} + ] + ], "origin-policy/bad-server/bad-headers.https.html": [ [ "origin-policy/bad-server/bad-headers.https.html", @@ -293651,6 +293863,12 @@ {} ] ], + "portals/portals-activate-network-error.html": [ + [ + "portals/portals-activate-network-error.html", + {} + ] + ], "portals/portals-activate-no-browsing-context.html": [ [ "portals/portals-activate-no-browsing-context.html", @@ -323262,6 +323480,12 @@ {} ] ], + "webaudio/the-audio-api/the-audioparam-interface/k-rate-oscillator-connections.html": [ + [ + "webaudio/the-audio-api/the-audioparam-interface/k-rate-oscillator-connections.html", + {} + ] + ], "webaudio/the-audio-api/the-audioparam-interface/k-rate-oscillator.html": [ [ "webaudio/the-audio-api/the-audioparam-interface/k-rate-oscillator.html", @@ -344945,35 +345169,35 @@ "f29b2bf5a8a7eb45c22306faaf5028428e28cf9b", "testharness" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.tentative.html": [ "f629caf27f0c6a4353443a37b5a6618606f193b4", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.tentative.html": [ "2e88ae2e604209130c3318c7cd347f436cad10d9", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.tentative.html": [ "bca00b3825678a8211c40fd6714b4a5d80b482bd", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.tentative.html": [ "2014f9c5a2f349986c01ff32b129764246266e64", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.tentative.html": [ "e18beb9e3cd78cd6bc575f06e5904cc8d21ee63e", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.tentative.html": [ "253c5361327bfbc4d3277527fc9a85dacc1cf708", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.tentative.html": [ "fb59013645a304a44851eb9395e051234b8d29f6", "reftest" ], - "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.html": [ + "2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.tentative.html": [ "7bad16cc31ccd91a0ad1e9687db46d5c4610f4a9", "reftest" ], @@ -403021,6 +403245,14 @@ "31ae8ee5823b6d2e1d34d2ca31d71399ddd08a1c", "reftest" ], + "css/css-masking/clip-path/clip-path-columns-shape-001.html": [ + "de13607ad83c9f06382c8584613883bb8e93639d", + "reftest" + ], + "css/css-masking/clip-path/clip-path-columns-shape-002.html": [ + "6bd11a5e49a0c5ea810a272b44b9b1a081f4b672", + "reftest" + ], "css/css-masking/clip-path/clip-path-element-userSpaceOnUse-001.html": [ "1381f53cb0c0aefc82a91a232b712d18be625b97", "reftest" @@ -403165,6 +403397,14 @@ "8d2c049a7e758e496eb2f823b808fd971468b795", "reftest" ], + "css/css-masking/clip-path/clip-path-reference-box-001.html": [ + "35b31ebaef1fc184e7f4e6202093d650e6b1db65", + "reftest" + ], + "css/css-masking/clip-path/clip-path-reference-box-003.html": [ + "ac88439d7b2e70a235b7b991b83450083fb8a94c", + "reftest" + ], "css/css-masking/clip-path/clip-path-svg-invalidate-ref.html": [ "20c8085b948f7ce9f3268b1f3cfb653673e335e9", "support" @@ -403173,6 +403413,10 @@ "0bf921c7cf125c1e8a9e6842c62f294b13104790", "reftest" ], + "css/css-masking/clip-path/clip-path-transform-mutated-001.html": [ + "01f11a34a33823651d46f4788ca12074f91560ed", + "reftest" + ], "css/css-masking/clip-path/clip-path-url-reference-change-from-empty.html": [ "2de0bb866f1c837887d6fa3c5889f8d38da3c055", "reftest" @@ -403201,6 +403445,14 @@ "c427e696bfd64a7fb550d777ce8a8c3d28598245", "support" ], + "css/css-masking/clip-path/reference/clip-path-columns-shape-001-ref.html": [ + "4337cdf63758c06d261eb42bd0abc595261350c1", + "support" + ], + "css/css-masking/clip-path/reference/clip-path-columns-shape-002-ref.html": [ + "4337cdf63758c06d261eb42bd0abc595261350c1", + "support" + ], "css/css-masking/clip-path/reference/clip-path-ellipse-ref.html": [ "5adc91a5c00f27f0d3225c99a6c2534b5b868a8d", "support" @@ -403237,6 +403489,14 @@ "a19be598ca4b5c428627298d5424eba34bf870f8", "support" ], + "css/css-masking/clip-path/reference/clip-path-reference-box-001-ref.html": [ + "f718ea6abfbab54333ba674ff0dcd320d8672bcd", + "support" + ], + "css/css-masking/clip-path/reference/clip-path-reference-box-003-ref.html": [ + "f718ea6abfbab54333ba674ff0dcd320d8672bcd", + "support" + ], "css/css-masking/clip-path/reference/clip-path-square-001-ref.html": [ "6bc5a16754b1d174bec65817d02d25fb7615f305", "support" @@ -403257,6 +403517,10 @@ "e31282c02fdbfd08bbe80acb245bb7b85c28bee9", "support" ], + "css/css-masking/clip-path/reference/clip-path-transform-mutated-001-ref.html": [ + "f718ea6abfbab54333ba674ff0dcd320d8672bcd", + "support" + ], "css/css-masking/clip-path/reference/green-100x100.html": [ "f718ea6abfbab54333ba674ff0dcd320d8672bcd", "support" @@ -417033,8 +417297,12 @@ "86a35bfb6b309e45dbb52bca3f23f6ce72f5ec13", "reftest" ], - "css/css-text/line-break/line-break-normal-015.xht": [ - "3d2f239bbdbce1cb8fe181d753a880c54fafadca", + "css/css-text/line-break/line-break-normal-015a.xht": [ + "db3ee2a586fb90433f85b626cf05c2da5eb143cb", + "reftest" + ], + "css/css-text/line-break/line-break-normal-015b.xht": [ + "904b009ac69553af92859ec32ef3146669d8219d", "reftest" ], "css/css-text/line-break/line-break-normal-016a.xht": [ @@ -417089,8 +417357,12 @@ "90710cbdbe4eace92c480c8c68262b9f2319b2f0", "reftest" ], - "css/css-text/line-break/line-break-strict-015.xht": [ - "ea8caab699fbe16fcdab530809a44867cd7299d3", + "css/css-text/line-break/line-break-strict-015a.xht": [ + "9114120bc86e2b629a555539fd97682c8bfe6d6e", + "reftest" + ], + "css/css-text/line-break/line-break-strict-015b.xht": [ + "563ae9da9a26ab80ba7b6bf89af8e90c52213a76", "reftest" ], "css/css-text/line-break/line-break-strict-016a.xht": [ @@ -417205,7 +417477,11 @@ "577bf29a5181640a49169cb53b3fdc093d8affcc", "support" ], - "css/css-text/line-break/reference/line-break-normal-015-ref.xht": [ + "css/css-text/line-break/reference/line-break-normal-015a-ref.xht": [ + "941e18242d9868a45dbde986a189feecaed8b05c", + "support" + ], + "css/css-text/line-break/reference/line-break-normal-015b-ref.xht": [ "b4697babbc212753389385a1376f04331af44817", "support" ], @@ -417257,7 +417533,11 @@ "2af0a903eb6776ff7b0ccaf1297dfc8a94d501ed", "support" ], - "css/css-text/line-break/reference/line-break-strict-015-ref.xht": [ + "css/css-text/line-break/reference/line-break-strict-015a-ref.xht": [ + "f8a1222a3334edb8117e9141359958c9b8f51748", + "support" + ], + "css/css-text/line-break/reference/line-break-strict-015b-ref.xht": [ "8eceb2ae9dc30e4a757675ae952829ba8e932ecd", "support" ], @@ -441601,6 +441881,10 @@ "9ee04e1015d3c9fc04e8fab240a15d59ae92892d", "crashtest" ], + "css/filter-effects/crashtests/multiple-references-id-crash-002.html": [ + "f7141da63c7a8ce60fa2670486312d77f58b567b", + "crashtest" + ], "css/filter-effects/css-backdrop-filters-animation-blur-ref.html": [ "e433070b686781c43ca186c9c1808c9f86dbf69a", "support" @@ -441777,6 +442061,10 @@ "223970111080d999bcceb6f3c258301c77c0f382", "reftest" ], + "css/filter-effects/drop-shadow-clipped-001.html": [ + "c08331d77ff3b1c4bfda9262e62d947b55eecf79", + "reftest" + ], "css/filter-effects/dynamic-filter-changes-001.html": [ "e2a28a3fe45ba90ad512e47b8756a01680b36511", "reftest" @@ -441861,6 +442149,14 @@ "5d003f7f9c5175edfa869567d2fe69b95160644d", "reftest" ], + "css/filter-effects/feimage-circular-reference-foreign-object-crash.html": [ + "00f0e362237ab3fdb856ea648e950608e8c3f06c", + "crashtest" + ], + "css/filter-effects/feimage-reference-foreign-object-crash.html": [ + "dde4805a368e5b7d9e4dd83ed977d6eb841f4fe4", + "crashtest" + ], "css/filter-effects/filter-cb-abspos-inline-001-ref.html": [ "b4beae8004155c30dad4f48db3e2087f66c42c4f", "support" @@ -442217,6 +442513,10 @@ "60c2c336346dbd236ba29104fdd7a20fa29e7264", "support" ], + "css/filter-effects/reference/drop-shadow-clipped-001-ref.html": [ + "305b1d2233de6845713fd43f2cfc1f72b1afdb60", + "support" + ], "css/filter-effects/reference/dynamic-filter-changes-001-ref.html": [ "699d57c2a8c087c25079232a443a6e2b72c1e79e", "support" @@ -457230,9 +457530,17 @@ "testharness" ], "event-timing/event-click-counts.html": [ - "5c67ac8708271a2d26cdb5b74aaaa8629398b291", + "034e172c1df8d051fde76c2e8787832f2a7c213b", "testharness" ], + "event-timing/event-counts-zero.html": [ + "0cc9e2ee38aa9f0a720952d5c27d3b01537fbdd4", + "testharness" + ], + "event-timing/idlharness.any-expected.txt": [ + "a13cb8d1e48c9418913a91e84ba081d6692cddac", + "support" + ], "event-timing/idlharness.any.js": [ "5ee98548fb6f2209b8c4b5346830c0d723e68170", "testharness" @@ -482310,7 +482618,7 @@ "testharness" ], "html/user-activation/chained-setTimeout.tentative.html": [ - "133f137eed6f42c6160556eb08efc8290026f1ec", + "b815adab605a33405004556e479dbe53d32cf091", "testharness" ], "html/user-activation/consumption-crossorigin.sub.tentative.html": [ @@ -485458,7 +485766,7 @@ "support" ], "interfaces/event-timing.idl": [ - "e8475d31922f03d34dd70f1fbee094c7977f6676", + "be9918fa9a698ce3c5f35089865becf3307aca65", "support" ], "interfaces/feature-policy.idl": [ @@ -497937,6 +498245,66 @@ "9d44d63870526a2d1625be08dabf2d6990582a0e", "support" ], + "origin-isolation/META.yml": [ + "937eca52e71dffcbd50b6f9dd869cb95e1808cd5", + "support" + ], + "origin-isolation/OWNERS": [ + "263ee12ddb3e9a1f485fcc61802915f7bfb14bcd", + "support" + ], + "origin-isolation/README.md": [ + "b028fcd9a36ff71b0eacd0363121a1fe2774f384", + "support" + ], + "origin-isolation/parent-no-child-yes-same.sub.https.html": [ + "4239e1644638b04d330ff70f8a27e97f5af88ab0", + "testharness" + ], + "origin-isolation/parent-no-child-yes-subdomain.sub.https.html": [ + "f2389eaa6a02ccb42f232e35f1c4600ddbf92fa6", + "testharness" + ], + "origin-isolation/parent-yes-child-no-same.sub.https.html": [ + "a1b9e4e3f5a230e8e49d3552d338d48f029d07cd", + "testharness" + ], + "origin-isolation/parent-yes-child-no-same.sub.https.html.headers": [ + "ea3f6b335c7620acf59f546fd48484bf624ccb38", + "support" + ], + "origin-isolation/parent-yes-child-no-subdomain.sub.https.html": [ + "b167b1b4954080c57ed718996f50ff2c6586a9ad", + "testharness" + ], + "origin-isolation/parent-yes-child-no-subdomain.sub.https.html.headers": [ + "ea3f6b335c7620acf59f546fd48484bf624ccb38", + "support" + ], + "origin-isolation/parent-yes-child-yes-same.sub.https.html": [ + "f43526cd5529fc8346c338545f9cbba99769cb7e", + "testharness" + ], + "origin-isolation/parent-yes-child-yes-same.sub.https.html.headers": [ + "ea3f6b335c7620acf59f546fd48484bf624ccb38", + "support" + ], + "origin-isolation/parent-yes-child-yes-subdomain.sub.https.html": [ + "5c3567cee570757305189263ed6149392b3c4fd5", + "testharness" + ], + "origin-isolation/parent-yes-child-yes-subdomain.sub.https.html.headers": [ + "ea3f6b335c7620acf59f546fd48484bf624ccb38", + "support" + ], + "origin-isolation/resources/helpers.mjs": [ + "e088ffb4e9034216c356366fcc25b18cbe60406a", + "support" + ], + "origin-isolation/resources/send-origin-isolation-header.py": [ + "8654b087dfa0a859c5f29886e0208eb8f5c4af15", + "support" + ], "origin-policy/bad-server/bad-headers.https.html": [ "127aa41cef8761d8a331933302bebfa23670ae8d", "testharness" @@ -498338,11 +498706,11 @@ "testharness" ], "paint-timing/fcp-only/fcp-canvas-context.html": [ - "18eb07bfdea11aa1c5eef9e77b5aeccd1b0c3332", + "5f3c9d9983bf0404509fc960d1b7dd66b058950f", "testharness" ], "paint-timing/fcp-only/fcp-gradient.html": [ - "3a356f3dd1abf0f35c248fece3c877210162550b", + "1d15812a0f3ea5c274017f028f42cc2c242a83b3", "testharness" ], "paint-timing/fcp-only/fcp-invisible-3d-rotate-descendant.html": [ @@ -498405,12 +498773,8 @@ "bcd2372cfc3b7374ecba7e4ee1cd077b3e51f798", "testharness" ], - "paint-timing/fcp-only/fcp-text-input-expected.txt": [ - "05d727e181d02f56bb7b3d7c5d184af30fc2072f", - "support" - ], "paint-timing/fcp-only/fcp-text-input.html": [ - "6a0cd86881fd8f7ebeee2d79dc173c063e8bc181", + "b22c618c119fd7cf99cfbf2b53c0dfbaaef5983e", "testharness" ], "paint-timing/fcp-only/fcp-typographic-pseudo.html": [ @@ -498418,11 +498782,11 @@ "testharness" ], "paint-timing/fcp-only/fcp-video-frame.html": [ - "fff38cd2c811937cac38c605e94402eab1e4e977", + "0f61b7e5289b69457258258db4b2daea6224b5df", "testharness" ], "paint-timing/fcp-only/fcp-video-poster.html": [ - "ed9cabcaeeb8c62687aee7ec4033650eeea3295c", + "5c1048ac0a7992c454ce9f542036a0b6bcf2edc2", "testharness" ], "paint-timing/fcp-only/fcp-whitespace.html": [ @@ -498430,7 +498794,7 @@ "testharness" ], "paint-timing/fcp-only/fcp-with-rtl.html": [ - "35a73d490c4df57263f7b115644ad0c97214db48", + "868d2fcaf8fdfaf3f20713375688aa106c579b03", "testharness" ], "paint-timing/first-contentful-bg-image.html": [ @@ -498502,7 +498866,7 @@ "support" ], "paint-timing/resources/utils.js": [ - "fb60500f3b5f806783a394eed17accc36c75e87c", + "a1fb993eb90e9e24f6502e4aed53a79420d360a6", "support" ], "paint-timing/sibling-painting-first-image.html": [ @@ -499965,6 +500329,10 @@ "bd0d9e27bb6b25adbc3844adc8f8f947cf83dce1", "testharness" ], + "portals/portals-activate-network-error.html": [ + "c2094fd4ded233f33f5a7631c2f9d2309567d624", + "testharness" + ], "portals/portals-activate-no-browsing-context.html": [ "bfc45f68c1859401b015d9cd22aaf50cdefb1770", "testharness" @@ -500081,6 +500449,10 @@ "7c9df9dba643a8202529d9f0b154a504535d7bcb", "support" ], + "portals/resources/invalid.asis": [ + "20f7c7f7e515de5f41f423f2dbf6b88a0507b8cc", + "support" + ], "portals/resources/open-blank-host.js": [ "f7580bd15212234c36b55a368efa0c729bd64e5b", "support" @@ -500202,7 +500574,7 @@ "support" ], "portals/xfo/portals-xfo-deny.sub.html": [ - "dde09c6e72bf9d2f0632aecbf6f8ca1cd0006436", + "2110d4906f9dd0769beb07cf428ecf3ce40ef370", "testharness" ], "portals/xfo/resources/xfo-deny.asis": [ @@ -526693,6 +527065,10 @@ "887d9f78db8a79b0aae96b9cdf818cde7b33aa6c", "testharness" ], + "webaudio/the-audio-api/the-audioparam-interface/k-rate-oscillator-connections.html": [ + "475b36436728709ad58d25ee300af094ea208eac", + "testharness" + ], "webaudio/the-audio-api/the-audioparam-interface/k-rate-oscillator.html": [ "6803f55eab00bbfb9766cc044a7240e6b4a0fda0", "testharness" @@ -529602,7 +529978,7 @@ "testharness" ], "webrtc/RTCPeerConnection-helper.js": [ - "24b3db7a0880fcc20cb8841e8d03e09731b8e0c0", + "8a11a1ca1e9a00695d8103f79f7bd2eeabbf7956", "support" ], "webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html": [ @@ -529882,11 +530258,11 @@ "testharness" ], "webrtc/RTCRtpSender-replaceTrack.https-expected.txt": [ - "d78abf94548c77ec8b92797599e6ce12b6aa5115", + "484741a9ef26eb8829a3c0dafb7b6ef7566f592a", "support" ], "webrtc/RTCRtpSender-replaceTrack.https.html": [ - "a2c790b144e2de1f6db418f5e02b2f68f22b15a1", + "671e86fd4e893a061944333c03fc3158368ae5ca", "testharness" ], "webrtc/RTCRtpSender-setParameters-expected.txt": [
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-orientation-none.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height-orientation-none.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap-swap-width-height.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-bitmap.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-orientation-none.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height-orientation-none.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element-swap-width-height.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.html rename to third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-element.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-columns-shape-001.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-columns-shape-001.html new file mode 100644 index 0000000..de13607 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-columns-shape-001.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<title>CSS Masking: Test clip-path property in column</title> +<link rel="author" title="Fredrik Söderquist" href="mailto:fs@opera.com"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> +<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=626097"> +<link rel="match" href="reference/clip-path-columns-shape-001-ref.html"> +<meta name="assert" content="This test ensures that clip-path property works correctly in column layout."> +<style> +body { margin: 0; } +.clipped { + background-color: green; + border: 5px solid red; + -webkit-clip-path: inset(5px); + clip-path: inset(5px); +} +</style> +<div style="columns: 2; column-gap: 0; width: 200px; height: 100px"> + <div style="height: 100px"></div> + <div style="height: 90px" class="clipped"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-columns-shape-002.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-columns-shape-002.html new file mode 100644 index 0000000..6bd11a5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-columns-shape-002.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>CSS Masking: Test clip-path property with svg clipPath element in column</title> +<link rel="author" title="Fredrik Söderquist" href="mailto:fs@opera.com"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> +<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=626097"> +<link rel="match" href="reference/clip-path-columns-shape-002-ref.html"> +<meta name="assert" content="This test ensures that clip-path property works correctly in column layout when SVG <clipPath> elements with clipPathUnits='userSpaceOnUse' is referenced."> +<style> +body { margin: 0; } +.clipped { + background-color: green; + border: 5px solid red; + -webkit-clip-path: url(#c); + clip-path: url(#c); +} +</style> +<div style="columns: 2; column-gap: 0; width: 200px; height: 100px"> + <div style="height: 100px"></div> + <div style="height: 90px" class="clipped"></div> +</div> +<svg> + <clipPath id="c" clipPathUnits="userSpaceOnUse"> + <rect x="5" y="5" width="90" height="90"/> + </clipPath> +</svg>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-reference-box-001.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-reference-box-001.html new file mode 100644 index 0000000..35b31eba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-reference-box-001.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>CSS Masking: clip path reference box with box-shadow</title> +<link rel="author" title="Fredrik Söderquist" href="mailto:fs@opera.com"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#propdef-box-shadow"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=418484"> +<link rel="match" href="reference/clip-path-reference-box-001-ref.html"> +<meta name="assert" content="Check that the 'clip-path' property uses the border box as the reference box."> + +<style> +.clipped { + width: 100px; + height: 200px; + background-color: green; + clip-path: polygon(0% 0%,100% 0%,100% 50%,0% 50%); + box-shadow: 100px 0px red; +} +</style> +<div class="clipped"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-reference-box-003.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-reference-box-003.html new file mode 100644 index 0000000..ac88439 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-reference-box-003.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>CSS Masking: clip path reference box with transform</title> +<link rel="author" title="Fredrik Söderquist" href="mailto:fs@opera.com"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=418484"> +<link rel="match" href="reference/clip-path-reference-box-003-ref.html"> +<meta name="assert" content="Check that the 'clip-path' property uses the border box as the reference box when using transform."> + +<style> +.clipped { + width: 100px; + height: 200px; + background-color: green; + clip-path: polygon(0% 0%,100% 0%,100% 50%,0% 50%); +} +.abs { + position: absolute; + width: 200px; + height: 200px; +} +</style> +<div class="abs"> + <div class="clipped" style="position: absolute; overflow: hidden"> + <div class="abs" style="transform: translate(0px, 100px); background-color: red;"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-transform-mutated-001.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-transform-mutated-001.html new file mode 100644 index 0000000..01f11a34 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-transform-mutated-001.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>CSS Masking: Test clip-path after updating its transform</title> +<link rel="author" title="Fredrik Söderquist" href="mailto:fs@opera.com"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path"> +<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=881700"> +<link rel="match" href="reference/clip-path-transform-mutated-001-ref.html"> +<meta name="assert" content="This test ensures that updating clipPath transform works properly."> +<script> +setup({ explicit_done: true }); +</script> +<style> +#target { + width: 100px; + height: 100px; + background-color: green; + clip-path: url(#clip); +} +</style> +<div id="target"></div> +<svg> + <clipPath id="clip"> + <rect width="1" height="1"/> + </clipPath> +</svg> +<script> +clip.style.transform = 'scale(100, 100)'; +</script>
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-columns-shape-expected.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-columns-shape-001-ref.html similarity index 100% rename from third_party/blink/web_tests/css3/masking/clip-path-columns-shape-expected.html rename to third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-columns-shape-001-ref.html
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-columns-shape-expected.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-columns-shape-002-ref.html similarity index 100% copy from third_party/blink/web_tests/css3/masking/clip-path-columns-shape-expected.html copy to third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-columns-shape-002-ref.html
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-1-expected.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-reference-box-001-ref.html similarity index 100% rename from third_party/blink/web_tests/css3/masking/clip-path-reference-box-1-expected.html rename to third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-reference-box-001-ref.html
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-1-expected.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-reference-box-003-ref.html similarity index 100% copy from third_party/blink/web_tests/css3/masking/clip-path-reference-box-1-expected.html copy to third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-reference-box-003-ref.html
diff --git a/third_party/blink/web_tests/css3/masking/clip-path-reference-box-1-expected.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-transform-mutated-001-ref.html similarity index 100% copy from third_party/blink/web_tests/css3/masking/clip-path-reference-box-1-expected.html copy to third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/reference/clip-path-transform-mutated-001-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015a.xht similarity index 87% copy from third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015.xht copy to third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015a.xht index 3d2f239..db3ee2a5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015.xht +++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015a.xht
@@ -7,7 +7,7 @@ <link rel="author" title="Taka Oshiyama" href="mailto:takaoshiyama@gmail.com" /> <link rel="author" title="Shinyu Murakami" href="mailto:murakami@vivliostyle.org" /> <link rel="help" title="5.3. Line Breaking Rules: the 'line-break' property" href="https://drafts.csswg.org/css-text-3/#line-break-property" /> - <link rel="match" href="reference/line-break-normal-015-ref.xht" /> + <link rel="match" href="reference/line-break-normal-015a-ref.xht" /> <meta http-equiv="content-language" content="en, ja" /> <meta name="assert" content="This test verifies that 'line-break: normal' does not allow line breaking between inseparable characters such as TWO DOT LEADER (U+2025) and HORIZONTAL ELLIPSIS (U+2026)." /> <style type="text/css"> @@ -47,19 +47,19 @@ <div class="wrapper"> <!-- inseparable characters TWO DOT LEADER --> <p class="test" lang="ja"> - <span>サンプルサンプル。<span class="target">‥‥</span>サンプル文</span> + <span>サンプルサンプル文<span class="target">‥‥</span>サンプル文</span> </p> <p class="control" lang="ja"> - <span>サンプルサンプ<br />ル。<span class="target">‥‥</span>サンプル文</span> + <span>サンプルサンプル文<br /><span class="target">‥‥</span>サンプル文</span> </p> </div> <div class="wrapper"> <!-- inseparable characters HORIZONTAL ELLIPSIS --> <p class="test" lang="ja"> - <span>サンプルサンプル。<span class="target">……</span>サンプル文</span> + <span>サンプルサンプル文<span class="target">……</span>サンプル文</span> </p> <p class="control" lang="ja"> - <span>サンプルサンプ<br />ル。<span class="target">……</span>サンプル文</span> + <span>サンプルサンプル文<br /><span class="target">……</span>サンプル文</span> </p> </div> </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015b.xht similarity index 92% rename from third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015.xht rename to third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015b.xht index 3d2f239..904b009a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015.xht +++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-normal-015b.xht
@@ -7,9 +7,10 @@ <link rel="author" title="Taka Oshiyama" href="mailto:takaoshiyama@gmail.com" /> <link rel="author" title="Shinyu Murakami" href="mailto:murakami@vivliostyle.org" /> <link rel="help" title="5.3. Line Breaking Rules: the 'line-break' property" href="https://drafts.csswg.org/css-text-3/#line-break-property" /> - <link rel="match" href="reference/line-break-normal-015-ref.xht" /> + <link rel="match" href="reference/line-break-normal-015b-ref.xht" /> <meta http-equiv="content-language" content="en, ja" /> - <meta name="assert" content="This test verifies that 'line-break: normal' does not allow line breaking between inseparable characters such as TWO DOT LEADER (U+2025) and HORIZONTAL ELLIPSIS (U+2026)." /> + <meta name="assert" content="This test verifies that 'line-break: normal' does not allow line breaking between inseparable characters such as TWO DOT LEADER (U+2025) and HORIZONTAL ELLIPSIS (U+2026). Tailorable breaks between ID and CL, as well as CL and IN are also disallowed." /> + <meta name="flags" content="should" /> <style type="text/css"> @font-face {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015a.xht similarity index 87% copy from third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015.xht copy to third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015a.xht index ea8caab..9114120 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015.xht +++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015a.xht
@@ -7,7 +7,7 @@ <link rel="author" title="Taka Oshiyama" href="mailto:takaoshiyama@gmail.com" /> <link rel="author" title="Shinyu Murakami" href="mailto:murakami@vivliostyle.org" /> <link rel="help" title="5.3. Line Breaking Rules: the 'line-break' property" href="https://drafts.csswg.org/css-text-3/#line-break-property" /> - <link rel="match" href="reference/line-break-strict-015-ref.xht" /> + <link rel="match" href="reference/line-break-strict-015a-ref.xht" /> <meta http-equiv="content-language" content="en, ja" /> <meta name="assert" content="This test verifies that 'line-break: strict' does not allow line breaking between inseparable characters such as TWO DOT LEADER (U+2025) and HORIZONTAL ELLIPSIS (U+2026)." /> <style type="text/css"> @@ -47,19 +47,19 @@ <div class="wrapper"> <!-- inseparable characters TWO DOT LEADER --> <p class="test" lang="ja"> - <span>サンプルサンプル。<span class="target">‥‥</span>サンプル文</span> + <span>サンプルサンプル文<span class="target">‥‥</span>サンプル文</span> </p> <p class="control" lang="ja"> - <span>サンプルサンプ<br />ル。<span class="target">‥‥</span>サンプル文</span> + <span>サンプルサンプル文<br /><span class="target">‥‥</span>サンプル文</span> </p> </div> <div class="wrapper"> <!-- inseparable characters HORIZONTAL ELLIPSIS --> <p class="test" lang="ja"> - <span>サンプルサンプル。<span class="target">……</span>サンプル文</span> + <span>サンプルサンプル文<span class="target">……</span>サンプル文</span> </p> <p class="control" lang="ja"> - <span>サンプルサンプ<br />ル。<span class="target">……</span>サンプル文</span> + <span>サンプルサンプル文<br /><span class="target">……</span>サンプル文</span> </p> </div> </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015b.xht similarity index 92% rename from third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015.xht rename to third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015b.xht index ea8caab..563ae9d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015.xht +++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-strict-015b.xht
@@ -7,9 +7,10 @@ <link rel="author" title="Taka Oshiyama" href="mailto:takaoshiyama@gmail.com" /> <link rel="author" title="Shinyu Murakami" href="mailto:murakami@vivliostyle.org" /> <link rel="help" title="5.3. Line Breaking Rules: the 'line-break' property" href="https://drafts.csswg.org/css-text-3/#line-break-property" /> - <link rel="match" href="reference/line-break-strict-015-ref.xht" /> + <link rel="match" href="reference/line-break-strict-015b-ref.xht" /> <meta http-equiv="content-language" content="en, ja" /> - <meta name="assert" content="This test verifies that 'line-break: strict' does not allow line breaking between inseparable characters such as TWO DOT LEADER (U+2025) and HORIZONTAL ELLIPSIS (U+2026)." /> + <meta name="assert" content="This test verifies that 'line-break: strict' does not allow line breaking between inseparable characters such as TWO DOT LEADER (U+2025) and HORIZONTAL ELLIPSIS (U+2026). Tailorable breaks between ID and CL, as well as CL and IN are also disallowed." /> + <meta name="flags" content="should" /> <style type="text/css"> @font-face {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015a-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015a-ref.xht new file mode 100644 index 0000000..941e182 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015a-ref.xht
@@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <!-- reftest for line-break-normal-015.xht --> + <link rel="author" title="Taka Oshiyama" href="mailto:takaoshiyama@gmail.com" /> + <link rel="author" title="Shinyu Murakami" href="mailto:murakami@vivliostyle.org" /> + <meta http-equiv="content-language" content="en, ja" /> + <style type="text/css"> + @font-face + { + font-family: "mplus-1p-regular"; + src: url("/fonts/mplus-1p-regular.woff") format("woff"); + /* filesize: 803300 bytes (784.5 KBytes) */ + /* + mplus-1p-regular.ttf can be downloaded at/from [TBD later] + */ + } + p.control { + border: 1px solid gray; + color: blue; + font-family: "mplus-1p-regular"; + width: 10.2em; /* added extra .2em for some symbols wider than 1em */ + } + span.target { + background-color: aqua; + } + div.wrapper { + display: inline-block; + border: 1px solid; + margin: 10px; + padding: 10px; + } + </style> + </head> + <body lang="en"> + <p> + Test passes if the highlighted characters in each pair of rectangles are at the exact same horizontal position. + </p> + <div class="wrapper"> + <!-- inseparable characters TWO DOT LEADER --> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">‥‥</span>サンプル文</span> + </p> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">‥‥</span>サンプル文</span> + </p> + </div> + <div class="wrapper"> + <!-- inseparable characters HORIZONTAL ELLIPSIS --> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">……</span>サンプル文</span> + </p> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">……</span>サンプル文</span> + </p> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015b-ref.xht similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015-ref.xht rename to third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-normal-015b-ref.xht
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015a-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015a-ref.xht new file mode 100644 index 0000000..f8a1222a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015a-ref.xht
@@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <!-- reftest for line-break-strict-015.xht --> + <link rel="author" title="Taka Oshiyama" href="mailto:takaoshiyama@gmail.com" /> + <link rel="author" title="Shinyu Murakami" href="mailto:murakami@vivliostyle.org" /> + <meta http-equiv="content-language" content="en, ja" /> + <style type="text/css"> + @font-face + { + font-family: "mplus-1p-regular"; + src: url("/fonts/mplus-1p-regular.woff") format("woff"); + /* filesize: 803300 bytes (784.5 KBytes) */ + /* + mplus-1p-regular.ttf can be downloaded at/from [TBD later] + */ + } + p.control { + border: 1px solid gray; + color: blue; + font-family: "mplus-1p-regular"; + width: 10.2em; /* added extra .2em for some symbols wider than 1em */ + } + span.target { + background-color: aqua; + } + div.wrapper { + display: inline-block; + border: 1px solid; + margin: 10px; + padding: 10px; + } + </style> + </head> + <body lang="en"> + <p> + Test passes if the highlighted characters in each pair of rectangles are at the exact same horizontal position. + </p> + <div class="wrapper"> + <!-- inseparable characters TWO DOT LEADER --> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">‥‥</span>サンプル文</span> + </p> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">‥‥</span>サンプル文</span> + </p> + </div> + <div class="wrapper"> + <!-- inseparable characters HORIZONTAL ELLIPSIS --> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">……</span>サンプル文</span> + </p> + <p class="control" lang="ja"> + <span>サンプルサンプル文<br /><span class="target">……</span>サンプル文</span> + </p> + </div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015b-ref.xht similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015-ref.xht rename to third_party/blink/web_tests/external/wpt/css/css-text/line-break/reference/line-break-strict-015b-ref.xht
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/drop-shadow-clipped-001.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/drop-shadow-clipped-001.html new file mode 100644 index 0000000..c08331d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/drop-shadow-clipped-001.html
@@ -0,0 +1,11 @@ +<!doctype HTML> +<title>CSS Filters: drop-shadow clipping</title> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#dropshadowEquivalent"> +<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=804670"> +<link rel="match" href="reference/drop-shadow-clipped-001-ref.html"> +<meta name="assert" content="This test ensures that the overflowing parts of drop-shadowed elements cast shadows."> +<div style="overflow: hidden; width: 100px; height: 100px"> + <div style="filter: drop-shadow(-105px 0 0 green);"> + <div style="width: 50px; height: 50px; position: relative; left: 105px; background: red"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/paint/filters/drop-shadow-clipped-expected.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/reference/drop-shadow-clipped-001-ref.html similarity index 100% rename from third_party/blink/web_tests/paint/filters/drop-shadow-clipped-expected.html rename to third_party/blink/web_tests/external/wpt/css/filter-effects/reference/drop-shadow-clipped-001-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/event-click-counts.html b/third_party/blink/web_tests/external/wpt/event-timing/event-click-counts.html index 5c67ac8..034e172c 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/event-click-counts.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/event-click-counts.html
@@ -13,7 +13,7 @@ assert_precondition(window.EventCounts, "Event Counts isn't supported"); function testClicks(expectedCount, resolve) { const clickCount = performance.eventCounts.get('click'); - if (!clickCount || clickCount < expectedCount) { + if (clickCount < expectedCount) { t.step_timeout(function() { testClicks(expectedCount, resolve); }, 5); @@ -23,11 +23,8 @@ assert_equals(performance.eventCounts.get('mousedown'), expectedCount, 'Incorrect mousedown count'); assert_equals(performance.eventCounts.get('mouseup'), expectedCount, 'Incorrect mouseup count.'); assert_equals(performance.eventCounts.get('mouseover'), expectedCount, 'Incorrect mouseover count.'); - if (expectedCount == 1) { - assert_equals(performance.eventCounts.size, 4, 'There should only be 4 types observed.'); - } else { + if (expectedCount != 1) { assert_equals(performance.eventCounts.get('mouseout'), expectedCount - 1, 'Incorrect mouseout count.'); - assert_equals(performance.eventCounts.size, 5, 'There should only be 5 types observed.'); } resolve(); } @@ -37,7 +34,6 @@ }); } - assert_equals(performance.eventCounts.size, 0); return test_driver.click(document.getElementById('div')).then(() => { return promiseClicks(1); }).then(() => {
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/event-counts-zero.html b/third_party/blink/web_tests/external/wpt/event-timing/event-counts-zero.html new file mode 100644 index 0000000..0cc9e2e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/event-timing/event-counts-zero.html
@@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: eventCounts.</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script> + test(() => { + assert_precondition(window.EventCounts, "Event Counts isn't supported"); + const eventTypes = [ + 'auxclick', + 'click', + 'contextmenu', + 'dblclick', + 'mousedown', + 'mouseenter', + 'mouseleave', + 'mouseout', + 'mouseover', + 'mouseup', + 'pointerover', + 'pointerenter', + 'pointerdown', + 'pointerup', + 'pointercancel', + 'pointerout', + 'pointerleave', + 'gotpointercapture', + 'lostpointercapture', + 'touchstart', + 'touchend', + 'touchcancel', + 'keydown', + 'keypress', + 'keyup', + 'beforeinput', + 'input', + 'compositionstart', + 'compositionupdate', + 'compositionend', + 'dragstart', + 'dragend', + 'dragenter', + // 'dragexit'? Unclear if it will be removed from HTML spec or not. + 'dragleave', + 'dragover', + 'drop' + ]; + eventTypes.forEach(type => { + assert_equals(performance.eventCounts.get(type), 0, 'There is a nonzero value for ' + type); + }) + assert_equals(performance.eventCounts.size, eventTypes.length, + 'The size of performance.eventCounts is incorrect.'); + }) +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/idlharness.any-expected.txt b/third_party/blink/web_tests/external/wpt/event-timing/idlharness.any-expected.txt new file mode 100644 index 0000000..a13cb8d1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/event-timing/idlharness.any-expected.txt
@@ -0,0 +1,28 @@ +This is a testharness.js-based test. +PASS idl_test setup +PASS idl_test validation +PASS Partial interface Performance: original interface defined +PASS Partial interface Performance: valid exposure set +PASS Partial interface Performance: member names are unique +PASS Partial interface Performance[2]: member names are unique +PASS PerformanceEventTiming interface: existence and properties of interface object +PASS PerformanceEventTiming interface object length +PASS PerformanceEventTiming interface object name +PASS PerformanceEventTiming interface: existence and properties of interface prototype object +PASS PerformanceEventTiming interface: existence and properties of interface prototype object's "constructor" property +PASS PerformanceEventTiming interface: existence and properties of interface prototype object's @@unscopables property +PASS PerformanceEventTiming interface: attribute processingStart +PASS PerformanceEventTiming interface: attribute processingEnd +PASS PerformanceEventTiming interface: attribute cancelable +FAIL PerformanceEventTiming interface: attribute target assert_true: The prototype object must have a property "target" expected true got false +PASS PerformanceEventTiming interface: operation toJSON() +PASS EventCounts interface: existence and properties of interface object +PASS EventCounts interface object length +PASS EventCounts interface object name +PASS EventCounts interface: existence and properties of interface prototype object +PASS EventCounts interface: existence and properties of interface prototype object's "constructor" property +PASS EventCounts interface: existence and properties of interface prototype object's @@unscopables property +PASS Performance interface: attribute eventCounts +PASS Performance interface: performance must inherit property "eventCounts" with the proper type +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/event-timing.idl b/third_party/blink/web_tests/external/wpt/interfaces/event-timing.idl index e8475d3..be9918fa 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/event-timing.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/event-timing.idl
@@ -8,6 +8,7 @@ readonly attribute DOMHighResTimeStamp processingStart; readonly attribute DOMHighResTimeStamp processingEnd; readonly attribute boolean cancelable; + readonly attribute Node? target; [Default] object toJSON(); };
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/META.yml b/third_party/blink/web_tests/external/wpt/origin-isolation/META.yml new file mode 100644 index 0000000..937eca5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/META.yml
@@ -0,0 +1,5 @@ +spec: https://github.com/WICG/origin-isolation +suggested_reviewers: + - domenic + - annevk + - wjmaclean
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/OWNERS b/third_party/blink/web_tests/external/wpt/origin-isolation/OWNERS new file mode 100644 index 0000000..263ee12 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/OWNERS
@@ -0,0 +1,2 @@ +domenic@chromium.org +wjmaclean@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/README.md b/third_party/blink/web_tests/external/wpt/origin-isolation/README.md new file mode 100644 index 0000000..b028fcd9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/README.md
@@ -0,0 +1,3 @@ +# Origin isolation tests + +These tests are for the proposal at [WICG/origin-isolation](https://github.com/WICG/origin-isolation). They should eventually move into a subdirectory of `html/` if/when that proposal merges into the HTML Standard.
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-no-child-yes-same.sub.https.html b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-no-child-yes-same.sub.https.html new file mode 100644 index 0000000..4239e164 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-no-child-yes-same.sub.https.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Parent is not isolated, child is isolated, child is same-origin to the parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script type="module"> +import { insertIframe, sendWasmModule, setBothDocumentDomains } from "./resources/helpers.mjs"; + +let frameWindow; +promise_setup(async () => { + frameWindow = await insertIframe("{{hosts[][]}}", "?1"); +}); + +// Since they're same-origin, and the parent loaded without isolation, the +// child's request for isolation gets ignored, and both end up site-keyed. + +promise_test(async () => { + const whatHappened = await sendWasmModule(frameWindow); + + assert_equals(whatHappened, "WebAssembly.Module message received"); +}, "message event must occur"); + +promise_test(async () => { + await setBothDocumentDomains(frameWindow); + + // Must not throw + frameWindow.document; +}, "setting document.domain must give sync access"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-no-child-yes-subdomain.sub.https.html b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-no-child-yes-subdomain.sub.https.html new file mode 100644 index 0000000..f2389eaa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-no-child-yes-subdomain.sub.https.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Parent is not isolated, child is isolated, child is a subdomain of the parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script type="module"> +import { insertIframe, sendWasmModule, setBothDocumentDomains } from "./resources/helpers.mjs"; + +let frameWindow; +promise_setup(async () => { + frameWindow = await insertIframe("{{hosts[][www]}}", "?1"); +}); + +// Since they're different-origin, the child's isolation request is respected, +// so the parent ends up in the site-keyed agent cluster and the child in the +// origin-keyed one. + +promise_test(async () => { + const whatHappened = await sendWasmModule(frameWindow); + + assert_equals(whatHappened, "messageerror"); +}, "messageerror event must occur"); + +promise_test(async () => { + await setBothDocumentDomains(frameWindow); + + assert_throws_dom("SecurityError", DOMException, () => { + frameWindow.document; + }); +}, "setting document.domain should no-op instead of giving sync access"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-same.sub.https.html b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-same.sub.https.html new file mode 100644 index 0000000..a1b9e4e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-same.sub.https.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Parent is isolated, child is not isolated, child is same-origin to the parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script type="module"> +import { insertIframe, sendWasmModule, setBothDocumentDomains } from "./resources/helpers.mjs"; + +let frameWindow; +promise_setup(async () => { + frameWindow = await insertIframe("{{hosts[][]}}"); +}); + +// Since they're same-origin, and the parent loaded with isolation, the +// child's non-request for isolation gets ignored, and both end up origin-keyed. + +promise_test(async () => { + const whatHappened = await sendWasmModule(frameWindow); + + assert_equals(whatHappened, "WebAssembly.Module message received"); +}, "message event must occur"); + +promise_test(async () => { + await setBothDocumentDomains(frameWindow); + + // Must not throw + frameWindow.document; +}, "setting document.domain must give sync access"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-same.sub.https.html.headers b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-same.sub.https.html.headers new file mode 100644 index 0000000..ea3f6b33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-same.sub.https.html.headers
@@ -0,0 +1 @@ +Origin-Isolation: ?1
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-subdomain.sub.https.html b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-subdomain.sub.https.html new file mode 100644 index 0000000..b167b1b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-subdomain.sub.https.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Parent is isolated, child is not isolated, child is a subdomain of the parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script type="module"> +import { insertIframe, sendWasmModule, setBothDocumentDomains } from "./resources/helpers.mjs"; + +let frameWindow; +promise_setup(async () => { + frameWindow = await insertIframe("{{hosts[][www]}}"); +}); + +// Since they're different-origin, the parent's isolation request is respected, +// as is the child's non-request. So the parent ends up in the origin-keyed +// agent cluster and the child ends up in the site-keyed one. + +promise_test(async () => { + const whatHappened = await sendWasmModule(frameWindow); + + assert_equals(whatHappened, "messageerror"); +}, "messageerror event must occur"); + +promise_test(async () => { + await setBothDocumentDomains(frameWindow); + + assert_throws_dom("SecurityError", DOMException, () => { + frameWindow.document; + }); +}, "setting document.domain must not give sync access"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-subdomain.sub.https.html.headers b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-subdomain.sub.https.html.headers new file mode 100644 index 0000000..ea3f6b33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-no-subdomain.sub.https.html.headers
@@ -0,0 +1 @@ +Origin-Isolation: ?1
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-same.sub.https.html b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-same.sub.https.html new file mode 100644 index 0000000..f43526c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-same.sub.https.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Parent is isolated, child is not isolated, child is same-origin to the parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script type="module"> +import { insertIframe, sendWasmModule, setBothDocumentDomains } from "./resources/helpers.mjs"; + +let frameWindow; +promise_setup(async () => { + frameWindow = await insertIframe("{{hosts[][]}}", "?1"); +}); + +// Both request isolation, and they're same-origin, so they both end up in the +// same origin-keyed agent cluster. + +promise_test(async () => { + const whatHappened = await sendWasmModule(frameWindow); + + assert_equals(whatHappened, "WebAssembly.Module message received"); +}, "message event must occur"); + +promise_test(async () => { + await setBothDocumentDomains(frameWindow); + + // Must not throw + frameWindow.document; +}, "setting document.domain must give sync access"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-same.sub.https.html.headers b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-same.sub.https.html.headers new file mode 100644 index 0000000..ea3f6b33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-same.sub.https.html.headers
@@ -0,0 +1 @@ +Origin-Isolation: ?1
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-subdomain.sub.https.html b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-subdomain.sub.https.html new file mode 100644 index 0000000..5c3567c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-subdomain.sub.https.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Parent is isolated, child is not isolated, child is a subdomain of the parent</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<script type="module"> +import { insertIframe, sendWasmModule, setBothDocumentDomains } from "./resources/helpers.mjs"; + +let frameWindow; +promise_setup(async () => { + frameWindow = await insertIframe("{{hosts[][www]}}", "?1"); +}); + +// Both request isolation, so the parent ends up in one origin-keyed agent +// cluster (the base domain's origin), and the child ends up in a different +// origin-keyed agent cluster (the www subdomain's origin). + +promise_test(async () => { + const whatHappened = await sendWasmModule(frameWindow); + + assert_equals(whatHappened, "messageerror"); +}, "messageerror event must occur"); + +promise_test(async () => { + await setBothDocumentDomains(frameWindow); + + assert_throws_dom("SecurityError", DOMException, () => { + frameWindow.document; + }); +}, "setting document.domain must not give sync access"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-subdomain.sub.https.html.headers b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-subdomain.sub.https.html.headers new file mode 100644 index 0000000..ea3f6b33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/parent-yes-child-yes-subdomain.sub.https.html.headers
@@ -0,0 +1 @@ +Origin-Isolation: ?1
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/resources/helpers.mjs b/third_party/blink/web_tests/external/wpt/origin-isolation/resources/helpers.mjs new file mode 100644 index 0000000..e088ffb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/resources/helpers.mjs
@@ -0,0 +1,53 @@ +export function insertIframe(hostname, header) { + const url = new URL("send-origin-isolation-header.py", import.meta.url); + url.hostname = hostname; + + if (header !== undefined) { + url.searchParams.set("header", header); + } + + const iframe = document.createElement("iframe"); + iframe.src = url.href; + + return new Promise((resolve, reject) => { + iframe.onload = () => resolve(iframe.contentWindow); + iframe.onerror = () => reject(new Error(`Could not load ${iframe.src}`)); + document.body.append(iframe); + }); +} + +// This function is coupled to ./send-origin-isolation-header.py, which ensures +// that sending such a message will result in a message back. +export async function sendWasmModule(frameWindow) { + frameWindow.postMessage(await createWasmModule(), "*"); + return waitForMessage(); +} + +// This function is coupled to ./send-origin-isolation-header.py, which ensures +// that sending such a message will result in a message back. +export async function setBothDocumentDomains(frameWindow) { + // By setting both this page's document.domain and the iframe's document.domain to the same + // value, we ensure that they can synchronously access each other, unless they are + // origin-isolated. + // NOTE: document.domain being unset is different than it being set to its current value. + // It is a terrible API. + document.domain = document.domain; + + frameWindow.postMessage({ command: "set document.domain", newDocumentDomain: document.domain }, "*"); + const whatHappened = await waitForMessage(); + assert_equals(whatHappened, "document.domain is set"); +} + +function waitForMessage() { + return new Promise(resolve => { + window.addEventListener("message", e => resolve(e.data), { once: true }); + }); +} + +// Any WebAssembly.Module will work fine for our tests; we just want to find out if it gives +// message or messageerror. So, we reuse one from the /wasm/ tests. +async function createWasmModule() { + const response = await fetch("/wasm/serialization/module/resources/incrementer.wasm"); + const ab = await response.arrayBuffer(); + return WebAssembly.compile(ab); +}
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/resources/send-origin-isolation-header.py b/third_party/blink/web_tests/external/wpt/origin-isolation/resources/send-origin-isolation-header.py new file mode 100644 index 0000000..8654b087d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/origin-isolation/resources/send-origin-isolation-header.py
@@ -0,0 +1,33 @@ +def main(request, response): + """Send a response with the Origin-Isolation header given in the "header" + query parameter, or no header if that is not provided. In either case, the + response will listen for message and messageerror events and echo them back + to the parent. See ./helpers.mjs for how these handlers are used. + """ + + if "header" in request.GET: + header = request.GET.first("header") + response.headers.set("Origin-Isolation", header) + + response.headers.set("Content-Type", "text/html") + + return """ + <!DOCTYPE html> + <meta charset="utf-8"> + <title>Helper page for origin isolation tests</title> + + <script type="module"> + window.onmessage = e => { + if (e.data.constructor === WebAssembly.Module) { + parent.postMessage("WebAssembly.Module message received", "*"); + } else if (e.data.command === "set document.domain") { + document.domain = e.data.newDocumentDomain; + parent.postMessage("document.domain is set", "*"); + } + }; + + window.onmessageerror = () => { + parent.postMessage("messageerror", "*"); + }; + </script> + """
diff --git a/third_party/blink/web_tests/external/wpt/portals/portals-activate-network-error.html b/third_party/blink/web_tests/external/wpt/portals/portals-activate-network-error.html new file mode 100644 index 0000000..c2094fd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/portals/portals-activate-network-error.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +async_test(t => { + assert_precondition("HTMLPortalElement" in self); + let portal = document.createElement('portal'); + portal.src = "resources/invalid.asis"; + document.body.appendChild(portal); + t.add_cleanup(() => { document.body.removeChild(portal); }); + t.step_timeout(async () => { + await promise_rejects_dom(t, 'InvalidStateError', portal.activate()); + t.done(); + }, 2000); +}, "A portal that is showing inline content for a network error cannot be activated"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/portals/resources/invalid.asis b/third_party/blink/web_tests/external/wpt/portals/resources/invalid.asis new file mode 100644 index 0000000..20f7c7f7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/portals/resources/invalid.asis
@@ -0,0 +1 @@ +This is an invalid HTTP response used to produce a network error.
diff --git a/third_party/blink/web_tests/external/wpt/portals/xfo/portals-xfo-deny.sub.html b/third_party/blink/web_tests/external/wpt/portals/xfo/portals-xfo-deny.sub.html index dde09c6e..2110d49 100644 --- a/third_party/blink/web_tests/external/wpt/portals/xfo/portals-xfo-deny.sub.html +++ b/third_party/blink/web_tests/external/wpt/portals/xfo/portals-xfo-deny.sub.html
@@ -26,5 +26,18 @@ t.add_cleanup(() => portal.remove()); t.step_timeout(() => t.done(), 2000); }, "`XFO: DENY` blocks cross-origin portals."); + +async_test(t => { + assert_precondition("HTMLPortalElement" in self); + var portal = document.createElement('portal'); + portal.src = "/portals/xfo/resources/xfo-deny.asis"; + portal.onmessage = t.unreached_func("should not have received a message"); + document.body.appendChild(portal); + t.add_cleanup(() => portal.remove()); + t.step_timeout(async () => { + await promise_rejects_dom(t, 'InvalidStateError', portal.activate()); + t.done(); + }, 2000); +}, "Portals blocked by `XFO: DENY` cannot be activated."); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-helper.js b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-helper.js index 24b3db7..8a11a1c 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-helper.js +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-helper.js
@@ -582,7 +582,7 @@ return dst.stream.getAudioTracks()[0]; }, - video({width = 640, height = 480} = {}) { + video({width = 640, height = 480, signal = null} = {}) { const canvas = Object.assign( document.createElement("canvas"), {width, height} ); @@ -593,8 +593,13 @@ setInterval(() => { ctx.fillStyle = `rgb(${count%255}, ${count*count%255}, ${count%255})`; count += 1; - ctx.fillRect(0, 0, width, height); + // If signal is set, add a constant-color box to the video frame. + if (signal !== null) { + ctx.fillStyle = `rgb(${signal}, ${signal}, ${signal})`; + ctx.fillRect(10, 10, 20, 20); + let pixel = ctx.getImageData(15, 15, 1, 1); + } }, 100); if (document.body) { @@ -609,13 +614,40 @@ } }; +// Get the signal from a video element inserted by createNoiseStream +function getVideoSignal(v) { + if (v.videoWidth < 21 || v.videoHeight < 21) { + return null; + } + const canvas = new OffscreenCanvas(v.videoWidth, v.videoHeight); + let context = canvas.getContext('2d'); + context.drawImage(v, 0, 0, v.videoWidth, v.videoHeight); + // Extract pixel value at position 20, 20 + let pixel = context.getImageData(20, 20, 1, 1); + return (pixel.data[0] + pixel.data[1] + pixel.data[2]) / 3; +} + +function detectSignal(t, v, value) { + return new Promise((resolve) => { + let check = () => { + const signal = getVideoSignal(v); + if (signal !== null && signal < value + 1 && signal > value - 1) { + resolve(); + } else { + t.step_timeout(check, 100); + } + } + check(); + }); +} + // Generate a MediaStream bearing the specified tracks. // // @param {object} [caps] // @param {boolean} [caps.audio] - flag indicating whether the generated stream // should include an audio track // @param {boolean} [caps.video] - flag indicating whether the generated stream -// should include a video track +// should include a video track, or parameters for video async function getNoiseStream(caps = {}) { if (!trackFactories.canCreate(caps)) { return navigator.mediaDevices.getUserMedia(caps); @@ -627,7 +659,7 @@ } if (caps.video) { - tracks.push(trackFactories.video()); + tracks.push(trackFactories.video(caps.video)); } return new MediaStream(tracks);
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt index d78abf94..484741a9 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt
@@ -8,5 +8,6 @@ PASS Calling replaceTrack(null) on sender set to session description should resolve with sender.track set to null PASS Calling replaceTrack on sender with stopped track and and set to session description should resolve with sender.track set to given track PASS Calling replaceTrack on sender with similar track and and set to session description should resolve with sender.track set to new track +PASS ReplaceTrack transmits the new track not the old track Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html index a2c790b1..671e86fd 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html
@@ -272,5 +272,35 @@ without negotiating. 3. Queue a task that runs the following steps: 1. If connection's [[isClosed]] slot is true, abort these steps. - */ + */ + +promise_test(async t => { + const v = document.createElement('video'); + v.autoplay = true; + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + const stream1 = await getNoiseStream({video: {signal: 20}}); + t.add_cleanup(() => stream1.getTracks().forEach(track => track.stop())); + const [track1] = stream1.getTracks(); + const stream2 = await getNoiseStream({video: {signal: 250}}); + t.add_cleanup(() => stream2.getTracks().forEach(track => track.stop())); + const [track2] = stream2.getTracks(); + const sender = pc1.addTrack(track1); + pc2.ontrack = (e) => { + v.srcObject = new MediaStream([e.track]); + }; + const metadataToBeLoaded = new Promise((resolve) => { + v.addEventListener('loadedmetadata', () => { + resolve(); + }); + }); + exchangeIceCandidates(pc1, pc2); + doSignalingHandshake(pc1, pc2); + await metadataToBeLoaded; + await detectSignal(t, v, 20); + await sender.replaceTrack(track2); + await detectSignal(t, v, 250); +}, 'ReplaceTrack transmits the new track not the old track'); </script>
diff --git a/third_party/blink/web_tests/paint/filters/drop-shadow-clipped.html b/third_party/blink/web_tests/paint/filters/drop-shadow-clipped.html deleted file mode 100644 index ede165df..0000000 --- a/third_party/blink/web_tests/paint/filters/drop-shadow-clipped.html +++ /dev/null
@@ -1,6 +0,0 @@ -<!doctype HTML> -<div style="overflow: hidden; width: 100px; height: 100px"> - <div style="filter: drop-shadow(-105px 0 0 green);"> - <div style="width: 50px; height: 50px; position: relative; left: 105px; background: red"></div> - </div> -</div>
diff --git a/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt b/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt index d775793..d2e40876b 100644 --- a/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt +++ b/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpSender-replaceTrack.https-expected.txt
@@ -8,5 +8,6 @@ FAIL Calling replaceTrack(null) on sender set to session description should resolve with sender.track set to null promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." FAIL Calling replaceTrack on sender with stopped track and and set to session description should resolve with sender.track set to given track promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." FAIL Calling replaceTrack on sender with similar track and and set to session description should resolve with sender.track set to new track promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +PASS ReplaceTrack transmits the new track not the old track Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-026.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-026.html index f2d027c..41c2046 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-026.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-026.html
@@ -33,13 +33,13 @@ test(() => { setUp(container); container.classList.add("hidden"); - assert_equals(getComputedStyle(container).contain, "size layout style"); + assert_equals(getComputedStyle(container).contain, "size layout style paint"); }, "subtree-visibility: hidden adds contain: size layout style;"); async_test((t) => { setUp(async_container); async_container.classList.add("auto"); - t.step(() => assert_equals(getComputedStyle(async_container).contain, "size layout style")); + t.step(() => assert_equals(getComputedStyle(async_container).contain, "size layout style paint")); // Considering this as frame 1: // At frame 2, the container has size-containment, and intersection // observations will be delivered at the end of that frame. @@ -48,31 +48,31 @@ // At frame 4, the container is no longer size-contained since it is visible. requestAnimationFrame(() => { // Frame 2 checks: - t.step(() => assert_equals(getComputedStyle(async_container).contain, "size layout style")); + t.step(() => assert_equals(getComputedStyle(async_container).contain, "size layout style paint")); requestAnimationFrame(() => { // Frame 3 checks: - t.step(() => assert_equals(getComputedStyle(async_container).contain, "size layout style")); + t.step(() => assert_equals(getComputedStyle(async_container).contain, "size layout style paint")); requestAnimationFrame(() => { // Frame 4 checks: - t.step(() => assert_equals(getComputedStyle(async_container).contain, "layout style")); + t.step(() => assert_equals(getComputedStyle(async_container).contain, "layout style paint")); t.done(); }); }); }); -}, "subtree-visibility: auto adds contain: size layout style;"); +}, "subtree-visibility: auto adds contain: size layout style paint;"); test(() => { setUp(container); container.classList.add("auto"); container.style = "contain: style;"; - assert_equals(getComputedStyle(container).contain, "size layout style"); + assert_equals(getComputedStyle(container).contain, "size layout style paint"); container.style = "contain: style layout;"; - assert_equals(getComputedStyle(container).contain, "size layout style"); + assert_equals(getComputedStyle(container).contain, "size layout style paint"); container.style = ""; - assert_equals(getComputedStyle(container).contain, "size layout style"); -}, "subtree-visibility: auto adds contain: size layout style, can't be overridden"); + assert_equals(getComputedStyle(container).contain, "size layout style paint"); +}, "subtree-visibility: auto adds contain: size layout style paint, can't be overridden"); test(() => { setUp(container); @@ -83,5 +83,5 @@ assert_equals(getComputedStyle(container).contain, "size layout style paint"); container.style = "contain: content;"; assert_equals(getComputedStyle(container).contain, "size layout style paint"); -}, "subtree-visibility adds contain: size layout style and keeps paint if it exists"); +}, "subtree-visibility keeps all containment even when shorthands are specified"); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-069-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-069-ref.html index e05d2fe1..009997c0 100644 --- a/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-069-ref.html +++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-069-ref.html
@@ -15,6 +15,7 @@ position: relative; width: 150px; background: lightblue; + contain: paint; } #child { width: 150px;
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index 178084a..f3b969b 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -1647,7 +1647,7 @@ '../../testing/test_env.py', '../../build/android/test_wrapper/logdog_wrapper.py', '--target', target, - '--logdog-bin-cmd', '../../bin/logdog_butler', + '--logdog-bin-cmd', '../../.task_template_packages/logdog_butler', '--store-tombstones'] if clang_coverage or java_coverage: cmdline += ['--coverage-dir', '${ISOLATED_OUTDIR}']
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index e821bf7..ec65f174 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -76564,10 +76564,12 @@ </summary> </histogram> -<histogram name="Media.VideoDecodeStatsDB.OpSuccess" enum="BooleanSuccess" - expires_after="never"> +<histogram base="true" name="Media.VideoDecodeStatsDB.OpSuccess" + enum="BooleanSuccess" expires_after="never"> <!-- expires-never: MediaCapabilities DB health metric. --> +<!-- Name completed by histogram_suffixes name="VideoDecodeStatsDBOperations" --> + <owner>chcunningham@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -76576,6 +76578,19 @@ </summary> </histogram> +<histogram name="Media.VideoDecodeStatsDB.OpTiming" units="ms" + expires_after="never"> +<!-- expires-never: MediaCapabilities DB health metric. --> + +<!-- Name completed by histogram_suffixes name="VideoDecodeStatsDBOperations" --> + + <owner>chcunningham@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary> + Indicates duration of time performing some database operation. + </summary> +</histogram> + <histogram name="Media.VideoFormat" enum="VideoFormat" expires_after="2015-05-29"> <obsolete> @@ -84585,6 +84600,19 @@ </summary> </histogram> +<histogram name="Navigation.OnReceiveResponseToOnStartLoadingResponseBody" + units="ms" expires_after="M85"> + <owner>falken@chromium.org</owner> + <owner>chrome-loading@google.com</owner> + <summary> + Time between the two messages OnReceiveResponse and + OnStartLoadingResponseBody as observed by the browser process during a + navigation by NavigationURLLoader::URLLoaderRequestController. The idea is + to see whether there is a performance cost in having two separate messages, + as the plan is to combine them into one. + </summary> +</histogram> + <histogram name="Navigation.ReadyToCommitUntilCommit" units="ms" expires_after="2019-01-04"> <obsolete> @@ -201615,16 +201643,19 @@ </histogram_suffixes> <histogram_suffixes name="VideoDecodeStatsDBOperations" separator="."> - <suffix name="Clear" label="Success status for clearing the DB"/> - <suffix name="Destroy" - label="Success status for destroying the DB - DEPRECATED Sept 2018"/> - <suffix name="Initialize" label="Success status for initializing the DB."/> - <suffix name="LoadKeys" label="Success status for loading all DB keys"/> - <suffix name="Read" label="Success status for reading from the DB"/> - <suffix name="Validate" - label="Success validating that an entry from the DB is not corrupt"/> - <suffix name="Write" label="Success status for writing to the DB"/> + <suffix name="Clear" label="Remove all keys"/> + <suffix name="Destroy" label="Destroy DB"> + <obsolete> + Deprecated in favor of [LoadKeys, Clear] as of 2020-04-03. + </obsolete> + </suffix> + <suffix name="Initialize" label="Initialize the DB."/> + <suffix name="LoadKeys" label="Load all DB keys"/> + <suffix name="Read" label="Read an entry from the DB"/> + <suffix name="Validate" label="Check for DB entry corruption"/> + <suffix name="Write" label="Write an entry to the DB"/> <affected-histogram name="Media.VideoDecodeStatsDB.OpSuccess"/> + <affected-histogram name="Media.VideoDecodeStatsDB.OpTiming"/> </histogram_suffixes> <histogram_suffixes name="VideoEncodedQpStats" separator=".">
diff --git a/tools/polymer/polymer.gni b/tools/polymer/polymer.gni index a4983f5..ca64f28 100644 --- a/tools/polymer/polymer.gni +++ b/tools/polymer/polymer.gni
@@ -67,5 +67,9 @@ if (defined(invoker.ignore_imports)) { args += [ "--ignore_imports" ] + invoker.ignore_imports } + + if (defined(invoker.migrated_imports)) { + args += [ "--migrated_imports" ] + invoker.migrated_imports + } } }
diff --git a/tools/polymer/polymer.py b/tools/polymer/polymer.py index 8a22bf8c..6016f85 100644 --- a/tools/polymer/polymer.py +++ b/tools/polymer/polymer.py
@@ -76,6 +76,8 @@ # ignore when converting HTML imports to JS modules. _ignore_imports = [] +_migrated_imports = [] + _chrome_redirects = { 'chrome://resources/polymer/v1_0/': POLYMER_V1_DIR, 'chrome://resources/html/': 'ui/webui/resources/html/', @@ -139,7 +141,9 @@ .replace(r'ui/webui/resources/html/', 'ui/webui/resources/js/') .replace(r'.html', '.m.js')) - return self.html_path_normalized.replace(r'.html', '.m.js') + extension = ( + '.js' if self.html_path_normalized in _migrated_imports else '.m.js') + return self.html_path_normalized.replace(r'.html', extension) def _to_js(self): js_path = self.js_path_normalized @@ -481,6 +485,15 @@ out_filename = os.path.basename(js_file) return js_template, out_filename +def _resetGlobals(): + global _namespace_rewrites + _namespace_rewrites = {} + global _auto_imports + _auto_imports = {} + global _ignore_imports + _ignore_imports = [] + global _migrated_imports + _migrated_imports = [] def main(argv): parser = argparse.ArgumentParser() @@ -491,6 +504,7 @@ parser.add_argument('--namespace_rewrites', required=False, nargs="*") parser.add_argument('--ignore_imports', required=False, nargs="*") parser.add_argument('--auto_imports', required=False, nargs="*") + parser.add_argument('--migrated_imports', required=False, nargs="*") parser.add_argument( '--html_type', choices=['dom-module', 'style-module', 'custom-style', 'iron-iconset', 'v3-ready'], @@ -505,15 +519,23 @@ # Extract automatic imports from arguments. if args.auto_imports: + global _auto_imports for entry in args.auto_imports: path, imports = entry.split('|') _auto_imports[path] = imports.split(',') # Extract ignored imports from arguments. if args.ignore_imports: + assert args.html_type != 'v3-ready' global _ignore_imports _ignore_imports = args.ignore_imports + # Extract migrated imports from arguments. + if args.migrated_imports: + assert args.html_type != 'v3-ready' + global _migrated_imports + _migrated_imports = args.migrated_imports + in_folder = os.path.normpath(os.path.join(_CWD, args.in_folder)) out_folder = os.path.normpath(os.path.join(_CWD, args.out_folder)) @@ -538,6 +560,10 @@ with io.open(os.path.join(out_folder, result[1]), mode='wb') as f: for l in result[0]: f.write(l.encode('utf-8')) + + # Reset global variables so that main() can be invoked multiple times during + # testing without leaking state from one test to the next. + _resetGlobals() return
diff --git a/tools/polymer/polymer_test.py b/tools/polymer/polymer_test.py index f3373cde..5822bba 100755 --- a/tools/polymer/polymer_test.py +++ b/tools/polymer/polymer_test.py
@@ -16,6 +16,7 @@ class PolymerModulizerTest(unittest.TestCase): def setUp(self): self._out_folder = None + self._additional_flags = [] def tearDown(self): if self._out_folder: @@ -37,12 +38,10 @@ '--html_type', html_type, '--namespace_rewrites', 'Polymer.PaperRippleBehavior|PaperRippleBehavior', - '--ignore_imports', - 'ui/webui/resources/html/ignore_me.html', '--auto_imports', 'ui/webui/resources/html/polymer.html|Polymer,html', 'third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior.html|PaperRippleBehavior', - ]) + ] + self._additional_flags) actual_js = self._read_out_file(js_out_file) expected_js = open(os.path.join( @@ -83,6 +82,27 @@ 'dom_module_with_ignore.m.js', 'dom_module_with_ignore_expected.js') + # Test case where some HTML imports should be ignored. + def testDomModuleWithIgnoreImports(self): + self._additional_flags = [ + '--ignore_imports', + 'ui/webui/resources/html/ignore_me.html', + ] + self._run_test('dom-module', 'dom_module.html', 'dom_module.js', + 'dom_module.m.js', + 'dom_module_with_ignore_imports_expected.js') + + # Test case where some HTML imports have already been fully migrated to + # Polymer3. + def testDomModuleWithMigratedImports(self): + self._additional_flags = [ + '--migrated_imports', + 'tools/polymer/tests/foo.html', + ] + self._run_test('dom-module', 'dom_module.html', 'dom_module.js', + 'dom_module.m.js', + 'dom_module_with_migrated_imports_expected.js') + # Test case where HTML is extracted from a Polymer2 <dom-module> that also # uses <if expr> for imports. def testDomModuleWithConditionalImport(self):
diff --git a/tools/polymer/tests/dom_module_expected.js b/tools/polymer/tests/dom_module_expected.js index a3d2d69..53cebfbd5 100644 --- a/tools/polymer/tests/dom_module_expected.js +++ b/tools/polymer/tests/dom_module_expected.js
@@ -1,7 +1,7 @@ import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; -// import 'chrome://resources/js/ignore_me.m.js'; +import 'chrome://resources/js/ignore_me.m.js'; import '../shared_vars_css.m.js'; import './foo.m.js';
diff --git a/tools/polymer/tests/dom_module_iife_expected.js b/tools/polymer/tests/dom_module_iife_expected.js index dffa88b..db1fefa 100644 --- a/tools/polymer/tests/dom_module_iife_expected.js +++ b/tools/polymer/tests/dom_module_iife_expected.js
@@ -1,7 +1,7 @@ import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; -// import 'chrome://resources/js/ignore_me.m.js'; +import 'chrome://resources/js/ignore_me.m.js'; import '../shared_vars_css.m.js'; import './foo.m.js';
diff --git a/tools/polymer/tests/dom_module_with_define_expected.js b/tools/polymer/tests/dom_module_with_define_expected.js index 525d45e2..0c1a528 100644 --- a/tools/polymer/tests/dom_module_with_define_expected.js +++ b/tools/polymer/tests/dom_module_with_define_expected.js
@@ -1,7 +1,7 @@ import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; -// import 'chrome://resources/js/ignore_me.m.js'; +import 'chrome://resources/js/ignore_me.m.js'; import '../shared_vars_css.m.js'; import './foo.m.js';
diff --git a/tools/polymer/tests/dom_module_with_ignore_expected.js b/tools/polymer/tests/dom_module_with_ignore_expected.js index 64429d8..ab3693d 100644 --- a/tools/polymer/tests/dom_module_with_ignore_expected.js +++ b/tools/polymer/tests/dom_module_with_ignore_expected.js
@@ -1,7 +1,7 @@ import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; -// import 'chrome://resources/js/ignore_me.m.js'; +import 'chrome://resources/js/ignore_me.m.js'; import '../shared_vars_css.m.js'; import './foo.m.js';
diff --git a/tools/polymer/tests/dom_module_with_ignore_imports_expected.js b/tools/polymer/tests/dom_module_with_ignore_imports_expected.js new file mode 100644 index 0000000..a3d2d69 --- /dev/null +++ b/tools/polymer/tests/dom_module_with_ignore_imports_expected.js
@@ -0,0 +1,19 @@ +import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; +// import 'chrome://resources/js/ignore_me.m.js'; +import '../shared_vars_css.m.js'; +import './foo.m.js'; + +Polymer({ + _template: html`<!--_html_template_start_--> + <style> + div { + font-size: 2rem; + } + </style> + <div>Hello world</div> +<!--_html_template_end_-->`, + is: 'cr-test-foo', + behaviors: [PaperRippleBehavior], +});
diff --git a/tools/polymer/tests/dom_module_with_migrated_imports_expected.js b/tools/polymer/tests/dom_module_with_migrated_imports_expected.js new file mode 100644 index 0000000..c3a202c --- /dev/null +++ b/tools/polymer/tests/dom_module_with_migrated_imports_expected.js
@@ -0,0 +1,19 @@ +import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; +import 'chrome://resources/js/ignore_me.m.js'; +import '../shared_vars_css.m.js'; +import './foo.js'; + +Polymer({ + _template: html`<!--_html_template_start_--> + <style> + div { + font-size: 2rem; + } + </style> + <div>Hello world</div> +<!--_html_template_end_-->`, + is: 'cr-test-foo', + behaviors: [PaperRippleBehavior], +});
diff --git a/ui/accessibility/ax_table_info.cc b/ui/accessibility/ax_table_info.cc index e571168..e4bdb7c6 100644 --- a/ui/accessibility/ax_table_info.cc +++ b/ui/accessibility/ax_table_info.cc
@@ -157,6 +157,8 @@ unique_cell_ids.clear(); cell_data_vector.clear(); row_nodes.clear(); + cell_id_to_index.clear(); + row_id_to_index.clear(); } void AXTableInfo::BuildCellDataVectorFromRowAndCellNodes(
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc index 2d57de6..e36c8f7 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -1525,19 +1525,10 @@ if (!obj) return nullptr; - int child_count = obj->GetChildCount(); - gint selected_count = 0; - for (int i = 0; i < child_count; ++i) { - AtkObject* child = obj->ChildAtIndex(i); - AXPlatformNodeAuraLinux* child_ax_node = - AXPlatformNodeAuraLinux::FromAtkObject(child); - if (!child_ax_node) - continue; - - if (child_ax_node->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) { - if (selected_count == requested_child_index) - return static_cast<AtkObject*>(g_object_ref(child)); - ++selected_count; + if (auto* selected_child = obj->GetSelectedItem(requested_child_index)) { + if (AtkObject* atk_object = selected_child->GetNativeViewAccessible()) { + g_object_ref(atk_object); + return atk_object; } } @@ -1552,19 +1543,7 @@ if (!obj) return 0; - int child_count = obj->GetChildCount(); - gint selected_count = 0; - for (int i = 0; i < child_count; ++i) { - AXPlatformNodeAuraLinux* child = - AXPlatformNodeAuraLinux::FromAtkObject(obj->ChildAtIndex(i)); - if (!child) - continue; - - if (child->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) - ++selected_count; - } - - return selected_count; + return obj->GetSelectionCount(); } gboolean IsChildSelected(AtkSelection* selection, gint index) {
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc index fdae0972..9ce1fa7 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
@@ -1859,6 +1859,8 @@ AXNodeData root; root.id = 1; root.role = ax::mojom::Role::kListBox; + root.AddState(ax::mojom::State::kFocusable); + root.AddState(ax::mojom::State::kMultiselectable); root.child_ids.push_back(2); root.child_ids.push_back(3); root.child_ids.push_back(4);
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc index 97fa9f80..b357640 100644 --- a/ui/accessibility/platform/ax_platform_node_base.cc +++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -130,7 +130,7 @@ return 0; } -gfx::NativeViewAccessible AXPlatformNodeBase::ChildAtIndex(int index) { +gfx::NativeViewAccessible AXPlatformNodeBase::ChildAtIndex(int index) const { if (delegate_) return delegate_->ChildAtIndex(index); return nullptr; @@ -2054,6 +2054,54 @@ return attributes; } +int AXPlatformNodeBase::GetSelectionCount() const { + int max_items = GetMaxSelectableItems(); + if (!max_items) + return 0; + return GetSelectedItems(max_items); +} + +AXPlatformNodeBase* AXPlatformNodeBase::GetSelectedItem( + int selected_index) const { + DCHECK_GE(selected_index, 0); + int max_items = GetMaxSelectableItems(); + if (max_items == 0) + return nullptr; + if (selected_index >= max_items) + return nullptr; + + std::vector<AXPlatformNodeBase*> selected_children; + int requested_count = selected_index + 1; + int returned_count = GetSelectedItems(requested_count, &selected_children); + + if (returned_count <= selected_index) + return nullptr; + + DCHECK(!selected_children.empty()); + DCHECK_LT(selected_index, static_cast<int>(selected_children.size())); + return selected_children[selected_index]; +} + +int AXPlatformNodeBase::GetSelectedItems( + int max_items, + std::vector<AXPlatformNodeBase*>* out_selected_items) const { + int selected_count = 0; + // TODO(Nektar): Remove const_cast by making all tree traversal methods const. + for (AXPlatformNodeBase* child = + const_cast<AXPlatformNodeBase*>(this)->GetFirstChild(); + child && selected_count < max_items; child = child->GetNextSibling()) { + if (!IsItemLike(child->GetData().role)) { + selected_count += child->GetSelectedItems(max_items - selected_count, + out_selected_items); + } else if (child->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) { + selected_count++; + if (out_selected_items) + out_selected_items->emplace_back(child); + } + } + return selected_count; +} + void AXPlatformNodeBase::SanitizeTextAttributeValue(const std::string& input, std::string* output) const { DCHECK(output); @@ -2112,4 +2160,20 @@ return base::JoinString(details_roles_vector, " "); } +int AXPlatformNodeBase::GetMaxSelectableItems() const { + if (!GetData().HasState(ax::mojom::State::kFocusable)) + return 0; + + if (IsLeaf()) + return 0; + + if (!IsContainerWithSelectableChildren(GetData().role)) + return 0; + + int max_items = 1; + if (GetData().HasState(ax::mojom::State::kMultiselectable)) + max_items = std::numeric_limits<int>::max(); + return max_items; +} + } // namespace ui
diff --git a/ui/accessibility/platform/ax_platform_node_base.h b/ui/accessibility/platform/ax_platform_node_base.h index 4901fab..9cb3364d 100644 --- a/ui/accessibility/platform/ax_platform_node_base.h +++ b/ui/accessibility/platform/ax_platform_node_base.h
@@ -64,7 +64,7 @@ gfx::NativeViewAccessible GetFocus(); gfx::NativeViewAccessible GetParent() const; int GetChildCount() const; - gfx::NativeViewAccessible ChildAtIndex(int index); + gfx::NativeViewAccessible ChildAtIndex(int index) const; std::string GetName() const; base::string16 GetNameAsString16() const; @@ -313,6 +313,24 @@ ui::TextAttributeList ComputeTextAttributes() const; + // Get the number of items selected. It checks kMultiselectable and + // kFocusable. and uses GetSelectedItems to get the selected number. + int GetSelectionCount() const; + + // If this object is a container that supports selectable children, returns + // the selected item at the provided index. + AXPlatformNodeBase* GetSelectedItem(int selected_index) const; + + // If this object is a container that supports selectable children, + // returns the number of selected items in this container. + // |out_selected_items| could be set to nullptr if the caller just + // needs to know the number of items selected. + // |max_items| represents the number that the caller expects as a + // maximum. For a single selection list box, it will be 1. + int GetSelectedItems( + int max_items, + std::vector<AXPlatformNodeBase*>* out_selected_items = nullptr) const; + // // Delegate. This is a weak reference which owns |this|. // @@ -455,6 +473,11 @@ std::string GetInvalidValue() const; + // Based on the characteristics of this object, such as its role and the + // presence of a multiselectable attribute, returns the maximum number of + // selectable children that this object could potentially contain. + int GetMaxSelectableItems() const; + mutable AXHypertext hypertext_; private:
diff --git a/ui/accessibility/platform/ax_platform_node_base_unittest.cc b/ui/accessibility/platform/ax_platform_node_base_unittest.cc index d0bc34a..401d5be2 100644 --- a/ui/accessibility/platform/ax_platform_node_base_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_base_unittest.cc
@@ -96,4 +96,200 @@ } } +TEST(AXPlatformNodeBaseTest, TestSelectedChildren) { + AXPlatformNode::NotifyAddAXModeFlags(kAXModeComplete); + + AXNodeData root_data; + root_data.id = 1; + root_data.role = ax::mojom::Role::kListBox; + root_data.AddState(ax::mojom::State::kFocusable); + root_data.child_ids = {2, 3}; + + AXNodeData item_1_data; + item_1_data.id = 2; + item_1_data.role = ax::mojom::Role::kListBoxOption; + item_1_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXNodeData item_2_data; + item_2_data.id = 3; + item_2_data.role = ax::mojom::Role::kListBoxOption; + + AXTreeUpdate update; + update.root_id = 1; + update.nodes = {root_data, item_1_data, item_2_data}; + AXTree tree(update); + + auto* root = static_cast<AXPlatformNodeBase*>( + TestAXNodeWrapper::GetOrCreate(&tree, tree.root())->ax_platform_node()); + + int num = root->GetSelectionCount(); + EXPECT_EQ(num, 1); + + gfx::NativeViewAccessible first_child = root->ChildAtIndex(0); + AXPlatformNodeBase* first_selected_node = root->GetSelectedItem(0); + EXPECT_EQ(first_child, first_selected_node->GetNativeViewAccessible()); + EXPECT_EQ(nullptr, root->GetSelectedItem(1)); +} + +TEST(AXPlatformNodeBaseTest, TestSelectedChildrenWithGroup) { + AXPlatformNode::NotifyAddAXModeFlags(kAXModeComplete); + + AXNodeData root_data; + root_data.id = 1; + root_data.role = ax::mojom::Role::kListBox; + root_data.AddState(ax::mojom::State::kFocusable); + root_data.AddState(ax::mojom::State::kMultiselectable); + root_data.child_ids = {2, 3}; + + AXNodeData group_1_data; + group_1_data.id = 2; + group_1_data.role = ax::mojom::Role::kGroup; + group_1_data.child_ids = {4, 5}; + + AXNodeData group_2_data; + group_2_data.id = 3; + group_2_data.role = ax::mojom::Role::kGroup; + group_2_data.child_ids = {6, 7}; + + AXNodeData item_1_data; + item_1_data.id = 4; + item_1_data.role = ax::mojom::Role::kListBoxOption; + item_1_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXNodeData item_2_data; + item_2_data.id = 5; + item_2_data.role = ax::mojom::Role::kListBoxOption; + + AXNodeData item_3_data; + item_3_data.id = 6; + item_3_data.role = ax::mojom::Role::kListBoxOption; + + AXNodeData item_4_data; + item_4_data.id = 7; + item_4_data.role = ax::mojom::Role::kListBoxOption; + item_4_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXTreeUpdate update; + update.root_id = 1; + update.nodes = {root_data, group_1_data, group_2_data, item_1_data, + item_2_data, item_3_data, item_4_data}; + AXTree tree(update); + + auto* root = static_cast<AXPlatformNodeBase*>( + TestAXNodeWrapper::GetOrCreate(&tree, tree.root())->ax_platform_node()); + + int num = root->GetSelectionCount(); + EXPECT_EQ(num, 2); + + gfx::NativeViewAccessible first_group_child = + static_cast<AXPlatformNodeBase*>( + AXPlatformNode::FromNativeViewAccessible(root->ChildAtIndex(0))) + ->ChildAtIndex(0); + AXPlatformNodeBase* first_selected_node = root->GetSelectedItem(0); + EXPECT_EQ(first_group_child, first_selected_node->GetNativeViewAccessible()); + + gfx::NativeViewAccessible second_group_child = + static_cast<AXPlatformNodeBase*>( + AXPlatformNode::FromNativeViewAccessible(root->ChildAtIndex(1))) + ->ChildAtIndex(1); + AXPlatformNodeBase* second_selected_node = root->GetSelectedItem(1); + EXPECT_EQ(second_group_child, + second_selected_node->GetNativeViewAccessible()); +} + +TEST(AXPlatformNodeBaseTest, TestSelectedChildrenMixed) { + AXPlatformNode::NotifyAddAXModeFlags(kAXModeComplete); + + // Build the below tree which is mixed with listBoxOption and group. + // id=1 listBox FOCUSABLE MULTISELECTABLE (0, 0)-(0, 0) child_ids=2,3,4,9 + // ++id=2 listBoxOption (0, 0)-(0, 0) selected=true + // ++id=3 group (0, 0)-(0, 0) child_ids=5,6 + // ++++id=5 listBoxOption (0, 0)-(0, 0) selected=true + // ++++id=6 listBoxOption (0, 0)-(0, 0) + // ++id=4 group (0, 0)-(0, 0) child_ids=7,8 + // ++++id=7 listBoxOption (0, 0)-(0, 0) + // ++++id=8 listBoxOption (0, 0)-(0, 0) selected=true + // ++id=9 listBoxOption (0, 0)-(0, 0) selected=true + + AXNodeData root_data; + root_data.id = 1; + root_data.role = ax::mojom::Role::kListBox; + root_data.AddState(ax::mojom::State::kFocusable); + root_data.AddState(ax::mojom::State::kMultiselectable); + root_data.child_ids = {2, 3, 4, 9}; + + AXNodeData item_1_data; + item_1_data.id = 2; + item_1_data.role = ax::mojom::Role::kListBoxOption; + item_1_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXNodeData group_1_data; + group_1_data.id = 3; + group_1_data.role = ax::mojom::Role::kGroup; + group_1_data.child_ids = {5, 6}; + + AXNodeData item_2_data; + item_2_data.id = 5; + item_2_data.role = ax::mojom::Role::kListBoxOption; + item_2_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXNodeData item_3_data; + item_3_data.id = 6; + item_3_data.role = ax::mojom::Role::kListBoxOption; + + AXNodeData group_2_data; + group_2_data.id = 4; + group_2_data.role = ax::mojom::Role::kGroup; + group_2_data.child_ids = {7, 8}; + + AXNodeData item_4_data; + item_4_data.id = 7; + item_4_data.role = ax::mojom::Role::kListBoxOption; + + AXNodeData item_5_data; + item_5_data.id = 8; + item_5_data.role = ax::mojom::Role::kListBoxOption; + item_5_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXNodeData item_6_data; + item_6_data.id = 9; + item_6_data.role = ax::mojom::Role::kListBoxOption; + item_6_data.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true); + + AXTreeUpdate update; + update.root_id = 1; + update.nodes = {root_data, item_1_data, group_1_data, + item_2_data, item_3_data, group_2_data, + item_4_data, item_5_data, item_6_data}; + AXTree tree(update); + + auto* root = static_cast<AXPlatformNodeBase*>( + TestAXNodeWrapper::GetOrCreate(&tree, tree.root())->ax_platform_node()); + + int num = root->GetSelectionCount(); + EXPECT_EQ(num, 4); + + gfx::NativeViewAccessible first_child = root->ChildAtIndex(0); + AXPlatformNodeBase* first_selected_node = root->GetSelectedItem(0); + EXPECT_EQ(first_child, first_selected_node->GetNativeViewAccessible()); + + gfx::NativeViewAccessible first_group_child = + static_cast<AXPlatformNodeBase*>( + AXPlatformNode::FromNativeViewAccessible(root->ChildAtIndex(1))) + ->ChildAtIndex(0); + AXPlatformNodeBase* second_selected_node = root->GetSelectedItem(1); + EXPECT_EQ(first_group_child, second_selected_node->GetNativeViewAccessible()); + + gfx::NativeViewAccessible second_group_child = + static_cast<AXPlatformNodeBase*>( + AXPlatformNode::FromNativeViewAccessible(root->ChildAtIndex(2))) + ->ChildAtIndex(1); + AXPlatformNodeBase* third_selected_node = root->GetSelectedItem(2); + EXPECT_EQ(second_group_child, third_selected_node->GetNativeViewAccessible()); + + gfx::NativeViewAccessible fourth_child = root->ChildAtIndex(3); + AXPlatformNodeBase* fourth_selected_node = root->GetSelectedItem(3); + EXPECT_EQ(fourth_child, fourth_selected_node->GetNativeViewAccessible()); +} + } // namespace ui
diff --git a/ui/accessibility/platform/ax_platform_node_unittest.cc b/ui/accessibility/platform/ax_platform_node_unittest.cc index c652b37e..480a723 100644 --- a/ui/accessibility/platform/ax_platform_node_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_unittest.cc
@@ -356,13 +356,13 @@ bool option_1_is_selected, bool option_2_is_selected, bool option_3_is_selected, - ax::mojom::State additional_state /* ax::mojom::State::kNone */) { + const std::vector<ax::mojom::State>& additional_state) { AXNodeData listbox; listbox.id = 1; listbox.SetName("ListBox"); listbox.role = ax::mojom::Role::kListBox; - if (additional_state != ax::mojom::State::kNone) - listbox.AddState(additional_state); + for (auto state : additional_state) + listbox.AddState(state); AXNodeData option_1; option_1.id = 2;
diff --git a/ui/accessibility/platform/ax_platform_node_unittest.h b/ui/accessibility/platform/ax_platform_node_unittest.h index 3207332..d004a05 100644 --- a/ui/accessibility/platform/ax_platform_node_unittest.h +++ b/ui/accessibility/platform/ax_platform_node_unittest.h
@@ -48,10 +48,11 @@ AXTreeUpdate Build3X3Table(); AXTreeUpdate BuildAriaColumnAndRowCountGrids(); - AXTreeUpdate BuildListBox(bool option_1_is_selected, - bool option_2_is_selected, - bool option_3_is_selected, - ax::mojom::State additional_state); + AXTreeUpdate BuildListBox( + bool option_1_is_selected, + bool option_2_is_selected, + bool option_3_is_selected, + const std::vector<ax::mojom::State>& additional_state); }; } // namespace ui
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index c7a33acd..12c2eafc 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -2134,15 +2134,10 @@ WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SELECTION_GETSELECTION); UIA_VALIDATE_CALL_1_ARG(result); - std::vector<AXPlatformNodeWin*> selected_children; - LONG child_count = GetDelegate()->GetChildCount(); - for (LONG i = 0; i < child_count; ++i) { - auto* child = static_cast<AXPlatformNodeWin*>( - FromNativeViewAccessible(GetDelegate()->ChildAtIndex(i))); - DCHECK(child); - if (child->GetData().GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) - selected_children.push_back(child); - } + std::vector<AXPlatformNodeBase*> selected_children; + int max_items = GetMaxSelectableItems(); + if (max_items) + GetSelectedItems(max_items, &selected_children); LONG selected_children_count = selected_children.size(); *result = SafeArrayCreateVector(VT_UNKNOWN, 0, selected_children_count); @@ -2150,9 +2145,10 @@ return E_OUTOFMEMORY; for (LONG i = 0; i < selected_children_count; ++i) { + AXPlatformNodeWin* children = + static_cast<AXPlatformNodeWin*>(selected_children[i]); HRESULT hr = SafeArrayPutElement( - *result, &i, - static_cast<IRawElementProviderSimple*>(selected_children[i])); + *result, &i, static_cast<IRawElementProviderSimple*>(children)); if (FAILED(hr)) { SafeArrayDestroy(*result); *result = nullptr;
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc index 1cbf2e81..1ca2ced 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -4654,8 +4654,7 @@ TEST_F(AXPlatformNodeWinTest, TestISelectionProviderCanSelectMultipleDefault) { Init(BuildListBox(/*option_1_is_selected*/ false, /*option_2_is_selected*/ false, - /*option_3_is_selected*/ false, - /*additional_state*/ ax::mojom::State::kNone)); + /*option_3_is_selected*/ false, {})); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode())); @@ -4667,10 +4666,12 @@ } TEST_F(AXPlatformNodeWinTest, TestISelectionProviderCanSelectMultipleTrue) { + const std::vector<ax::mojom::State> state = { + ax::mojom::State::kMultiselectable, ax::mojom::State::kFocusable}; Init(BuildListBox(/*option_1_is_selected*/ false, /*option_2_is_selected*/ false, /*option_3_is_selected*/ false, - /*additional_state*/ ax::mojom::State::kMultiselectable)); + /*additional_state*/ state)); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode())); @@ -4686,7 +4687,7 @@ Init(BuildListBox(/*option_1_is_selected*/ false, /*option_2_is_selected*/ false, /*option_3_is_selected*/ false, - /*additional_state*/ ax::mojom::State::kNone)); + /*additional_state*/ {})); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode())); @@ -4701,7 +4702,7 @@ Init(BuildListBox(/*option_1_is_selected*/ false, /*option_2_is_selected*/ false, /*option_3_is_selected*/ false, - /*additional_state*/ ax::mojom::State::kRequired)); + /*additional_state*/ {ax::mojom::State::kRequired})); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode())); @@ -4716,7 +4717,7 @@ Init(BuildListBox(/*option_1_is_selected*/ false, /*option_2_is_selected*/ false, /*option_3_is_selected*/ false, - /*additional_state*/ ax::mojom::State::kNone)); + /*additional_state*/ {ax::mojom::State::kFocusable})); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode())); @@ -4742,7 +4743,7 @@ Init(BuildListBox(/*option_1_is_selected*/ false, /*option_2_is_selected*/ true, /*option_3_is_selected*/ false, - /*additional_state*/ ax::mojom::State::kNone)); + /*additional_state*/ {ax::mojom::State::kFocusable})); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode())); @@ -4774,10 +4775,12 @@ TEST_F(AXPlatformNodeWinTest, TestISelectionProviderGetSelectionMultipleItemsSelected) { + const std::vector<ax::mojom::State> state = { + ax::mojom::State::kMultiselectable, ax::mojom::State::kFocusable}; Init(BuildListBox(/*option_1_is_selected*/ true, /*option_2_is_selected*/ true, /*option_3_is_selected*/ true, - /*additional_state*/ ax::mojom::State::kNone)); + /*additional_state*/ state)); ComPtr<ISelectionProvider> selection_provider( QueryInterfaceFromNode<ISelectionProvider>(GetRootAsAXNode()));
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html index 57e03e2..92c7e7d 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -28,8 +28,8 @@ --cr-icon-button-fill-color-focus: var( --cr-toolbar-search-field-input-bg-color, var(--cr-toolbar-background-color)); - --cr-icon-button-size: 32px; - margin: 6px; + --cr-icon-button-size: var(--cr-toolbar-icon-container-size, 32px); + margin: var(--cr-toolbar-icon-margin, 6px); } @media (prefers-color-scheme: light) { @@ -67,7 +67,7 @@ --paper-spinner-color: var(--cr-toolbar-search-field-input-color, white); height: var(--cr-icon-size); - margin: 0 6px; + margin: var(--cr-toolbar-search-field-paper-spinner-margin, 0 6px); opacity: 0; padding: 6px; position: absolute; @@ -88,8 +88,7 @@ -webkit-font-smoothing: antialiased; flex: 1; line-height: 185%; - margin-inline-end: 2px; - margin-inline-start: 2px; + margin: var(--cr-toolbar-search-field-term-margin, 0 2px); position: relative; } @@ -141,6 +140,8 @@ } :host(:not([narrow])) #prompt { + margin-inline-start: + var(--cr-toolbar-search-field-prompt-margin-inline-start); opacity: var(--cr-toolbar-search-field-prompt-opacity); }