diff --git a/DEPS b/DEPS index 8fef72a3..20bd350 100644 --- a/DEPS +++ b/DEPS
@@ -297,15 +297,15 @@ # 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': '3fbcfbbd908e05e6511003355df6b593205641bf', + 'skia_revision': 'b6a7a4a011b81b9743dbf3c50e671e55feca81e6', # 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': '41bc7435693fbce8ef86753cd9239e30550a3e2d', + 'v8_revision': 'd2ee35406cbb30f2244ca7c423b90dc83f5848af', # 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': '9a25828113d57cf95b0c9f583e904af151a2edde', + 'angle_revision': 'b9c3c5d675675100858019d87cd8c82f5a8429cf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -324,7 +324,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:9.20220819.2.1', + 'fuchsia_version': 'version:9.20220820.0.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -412,7 +412,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '6debc15d25d9ccdcf783febeed55364b7e5592ea', + 'dawn_revision': '16791e67d5c055d53056452810168df54cd3e2cf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -456,11 +456,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. - 'libcxxabi_revision': 'd2e4dc765578111c592a7eeceeb00be13592e758', + 'libcxxabi_revision': 'ee4f792d1c270b8cc451fa28851d62f41a714ff3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': 'f87795ea5ba1ea2b5f921bba69bdf723c86a229f', + 'libunwind_revision': '49d0f0ce881cf0620a18790f33010ffe6c6e312a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -792,7 +792,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '72dcc44075ab9977db264c693eb883212584c1a0', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'a127cc06cd4128e905fbaa0b20a87eb59f1418c3', 'condition': 'checkout_ios', }, @@ -1573,7 +1573,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f87b4c862dcd8acc8879f7d69aa8e2a968f07bed', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '695a70b29174a7dc11107885a7f713d75b3856d4', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1729,10 +1729,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '44e4c8770158c505b03ee7feafa4859d083b0912', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'fef5f14679a5ec7185835be9142220bd8b79db6c', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e204a3c377547e11d2be1edecb1593c3259acc8e', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'f7f9791cc740ecf855261e28090651db98bb3d37', + Var('webrtc_git') + '/src.git' + '@' + 'a9627e770ecfd33313b0e532bbf38d093527517d', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1805,7 +1805,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@31585af7148cabee01eef21c8ef70c46f6fbab21', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ead2cb8098ae642b5d02d8545bd3c98c20f24c58', 'condition': 'checkout_src_internal', },
diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index 038c2522..80946c1 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc
@@ -650,8 +650,9 @@ // TODO(https://crbug.com/1160925): Avoid nested RunLoop in exo // DataDevice::GetDropCallback() - remove the block below when it is fixed. if (!window_tracker.Contains(drag_window_) || - !window_tracker.Contains(drag_window_->parent())) + !window_tracker.Contains(drag_window_->parent())) { ui::Event::DispatcherApi(&e).set_target(nullptr); + } for (aura::client::DragDropClientObserver& observer : observers_) observer.OnDragCompleted(e);
diff --git a/ash/public/cpp/holding_space/holding_space_item.cc b/ash/public/cpp/holding_space/holding_space_item.cc index 8c8c4f4..fb719de 100644 --- a/ash/public/cpp/holding_space/holding_space_item.cc +++ b/ash/public/cpp/holding_space/holding_space_item.cc
@@ -9,7 +9,6 @@ #include "ash/strings/grit/ash_strings.h" #include "base/json/values_util.h" #include "base/memory/ptr_util.h" -#include "base/strings/strcat.h" #include "base/unguessable_token.h" #include "ui/base/l10n/l10n_util.h" @@ -116,13 +115,36 @@ case Type::kLacrosDownload: return true; case Type::kDiagnosticsLog: + case Type::kDriveSuggestion: + case Type::kLocalSuggestion: case Type::kNearbyShare: + case Type::kPhoneHubCameraRoll: case Type::kPinnedFile: case Type::kPrintedPdf: case Type::kScan: case Type::kScreenRecording: case Type::kScreenshot: + return false; + } +} + +// static +bool HoldingSpaceItem::IsSuggestion(HoldingSpaceItem::Type type) { + switch (type) { + case Type::kDriveSuggestion: + case Type::kLocalSuggestion: + return true; + case Type::kArcDownload: + case Type::kDiagnosticsLog: + case Type::kDownload: + case Type::kLacrosDownload: + case Type::kNearbyShare: case Type::kPhoneHubCameraRoll: + case Type::kPinnedFile: + case Type::kPrintedPdf: + case Type::kScan: + case Type::kScreenRecording: + case Type::kScreenshot: return false; } } @@ -308,12 +330,14 @@ case Type::kArcDownload: case Type::kDiagnosticsLog: case Type::kDownload: + case Type::kDriveSuggestion: case Type::kLacrosDownload: + case Type::kLocalSuggestion: case Type::kNearbyShare: + case Type::kPhoneHubCameraRoll: case Type::kPinnedFile: case Type::kPrintedPdf: case Type::kScan: - case Type::kPhoneHubCameraRoll: return false; } }
diff --git a/ash/public/cpp/holding_space/holding_space_item.h b/ash/public/cpp/holding_space/holding_space_item.h index bb2581d..191eef07 100644 --- a/ash/public/cpp/holding_space/holding_space_item.h +++ b/ash/public/cpp/holding_space/holding_space_item.h
@@ -85,7 +85,9 @@ kLacrosDownload = 8, kScan = 9, kPhoneHubCameraRoll = 10, - kMaxValue = kPhoneHubCameraRoll, + kDriveSuggestion = 11, + kLocalSuggestion = 12, + kMaxValue = kLocalSuggestion, }; HoldingSpaceItem(const HoldingSpaceItem&) = delete; @@ -118,6 +120,9 @@ // Returns `true` if `type` is a download type, `false` otherwise. static bool IsDownload(HoldingSpaceItem::Type type); + // Returns `true` if `type` is a suggestion type, `false` otherwise. + static bool IsSuggestion(HoldingSpaceItem::Type type); + // Deserializes from `base::DictionaryValue` to `HoldingSpaceItem`. // This creates a partially initialized item with an empty file system URL. // The item should be fully initialized using `Initialize()`.
diff --git a/ash/public/cpp/holding_space/holding_space_metrics.cc b/ash/public/cpp/holding_space/holding_space_metrics.cc index 8c432bd2..8290e192d 100644 --- a/ash/public/cpp/holding_space/holding_space_metrics.cc +++ b/ash/public/cpp/holding_space/holding_space_metrics.cc
@@ -12,8 +12,7 @@ #include "base/strings/string_util.h" #include "base/time/time.h" -namespace ash { -namespace holding_space_metrics { +namespace ash::holding_space_metrics { namespace { @@ -80,10 +79,16 @@ return "DiagnosticsLog"; case HoldingSpaceItem::Type::kDownload: return "Download"; + case HoldingSpaceItem::Type::kDriveSuggestion: + return "DriveSuggestion"; case HoldingSpaceItem::Type::kLacrosDownload: return "LacrosDownload"; + case HoldingSpaceItem::Type::kLocalSuggestion: + return "LocalSuggestion"; case HoldingSpaceItem::Type::kNearbyShare: return "NearbyShare"; + case HoldingSpaceItem::Type::kPhoneHubCameraRoll: + return "PhoneHubCameraRoll"; case HoldingSpaceItem::Type::kPinnedFile: return "PinnedFile"; case HoldingSpaceItem::Type::kPrintedPdf: @@ -94,8 +99,6 @@ return "ScreenRecording"; case HoldingSpaceItem::Type::kScreenshot: return "Screenshot"; - case HoldingSpaceItem::Type::kPhoneHubCameraRoll: - return "PhoneHubCameraRoll"; } NOTREACHED(); return std::string(); @@ -217,5 +220,4 @@ smoothness); } -} // namespace holding_space_metrics -} // namespace ash +} // namespace ash::holding_space_metrics
diff --git a/ash/public/cpp/holding_space/holding_space_util.cc b/ash/public/cpp/holding_space/holding_space_util.cc index d2b6490..acc5145 100644 --- a/ash/public/cpp/holding_space/holding_space_util.cc +++ b/ash/public/cpp/holding_space/holding_space_util.cc
@@ -6,8 +6,7 @@ #include "ash/public/cpp/holding_space/holding_space_constants.h" -namespace ash { -namespace holding_space_util { +namespace ash::holding_space_util { gfx::Size GetMaxImageSizeForType(HoldingSpaceItem::Type type) { gfx::Size max_size; @@ -15,12 +14,14 @@ case HoldingSpaceItem::Type::kArcDownload: case HoldingSpaceItem::Type::kDiagnosticsLog: case HoldingSpaceItem::Type::kDownload: + case HoldingSpaceItem::Type::kDriveSuggestion: case HoldingSpaceItem::Type::kLacrosDownload: + case HoldingSpaceItem::Type::kLocalSuggestion: case HoldingSpaceItem::Type::kNearbyShare: + case HoldingSpaceItem::Type::kPhoneHubCameraRoll: case HoldingSpaceItem::Type::kPinnedFile: case HoldingSpaceItem::Type::kPrintedPdf: case HoldingSpaceItem::Type::kScan: - case HoldingSpaceItem::Type::kPhoneHubCameraRoll: max_size = gfx::Size(kHoldingSpaceChipIconSize, kHoldingSpaceChipIconSize); break; @@ -70,5 +71,4 @@ return false; } -} // namespace holding_space_util -} // namespace ash +} // namespace ash::holding_space_util
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 2b1d313..5f511209 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -853,6 +853,7 @@ <translation id="5860033963881614850">Off</translation> <translation id="5860491529813859533">Turn on</translation> <translation id="5867217927013474703">Collecting network information</translation> +<translation id="5867606971598166637">Your system administrator is monitoring your screens</translation> <translation id="5876666360658629066">Enter parental code</translation> <translation id="5881540930187678962">Set up Phone Hub later</translation> <translation id="5887954372087850114">Window <ph name="WINDOW_TITLE" /> assigned to <ph name="DESK_TITLE" /> and unassigned from all other desks</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index f937ab1..377bb1a 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -671,6 +671,7 @@ <translation id="479989351350248267">chercher</translation> <translation id="4804818685124855865">Déconnecter</translation> <translation id="4814539958450445987">Écran de connexion</translation> +<translation id="481455355267255546">À venir</translation> <translation id="4831034276697007977">Voulez-vous vraiment désactiver les clics automatiques?</translation> <translation id="4849058404725798627">Mettre l'élément sélectionné par le clavier en surbrillance</translation> <translation id="485592688953820832">Aucune action (pause)</translation> @@ -1013,6 +1014,7 @@ <translation id="6757237461819837179">Aucun élément multimédia en cours de lecture</translation> <translation id="6777216307882431711">Alimente des appareils connectés par USB-C</translation> <translation id="6786750046913594791">Fermer le dossier</translation> +<translation id="6787595647772650851">Restaurer la dernière session</translation> <translation id="6790428901817661496">Jouer</translation> <translation id="6801878137098616817">Modifié récemment</translation> <translation id="6803622936009808957">La mise en miroir n'a pas été possible faute de résolutions prises en charge. Le mode de bureau étendu a plutôt été sélectionné.</translation> @@ -1261,6 +1263,7 @@ <translation id="8214996719228530800">Version Canary</translation> <translation id="8219451629189078428">Votre Chromebook doit rester allumé et branché sur une source d'alimentation pendant ce temps. Vérifiez que les câbles de l'adaptateur ou du chargeur sont bien branchés sur votre Chromebook et sur la prise de courant. N'éteignez pas votre Chromebook.</translation> <translation id="8236042855478648955">C'est le moment de prendre une pause</translation> +<translation id="8246282815785366524">Bon retour, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" />, pile du téléphone <ph name="BATTERY_STATUS" /></translation> <translation id="8247998213073982446"><ph name="APP_NAME" />, application</translation> <translation id="8255234195843591763">Réinitialiser pour mettre à jour</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index ca88837d..92af97c 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -1262,6 +1262,7 @@ <translation id="8214996719228530800">Canary csatorna</translation> <translation id="8219451629189078428">Ez idő alatt Chromebookjának bekapcsolva kell maradnia, és csatlakoztatva kell lennie áramforráshoz. Gondoskodjon arról, hogy a töltő-, illetve adapterkábelek teljes mértékben csatlakoztatva legyenek mind a Chromebookhoz, mind a konnektorhoz. Ne kapcsolja ki a Chromebookot.</translation> <translation id="8236042855478648955">Ideje pihenni</translation> +<translation id="8246282815785366524">Üdvözöljük ismét, kedves <ph name="GIVEN_NAME" />!</translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />, a telefon akkumulátora: <ph name="BATTERY_STATUS" /></translation> <translation id="8247998213073982446"><ph name="APP_NAME" />, alkalmazás</translation> <translation id="8255234195843591763">Indítsa újra a frissítéshez!</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index d3c7d4a4..cfd7cf98 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -671,6 +671,7 @@ <translation id="479989351350248267">ಹುಡುಕಾಡಿ</translation> <translation id="4804818685124855865">ಡಿಸ್ಕನೆಕ್ಟ್</translation> <translation id="4814539958450445987">ಲಾಗಿನ್ ಪರದೆ</translation> +<translation id="481455355267255546">ಮುಂದಿನದು</translation> <translation id="4831034276697007977">ಸ್ವಯಂಚಾಲಿತ ಕ್ಲಿಕ್ಗಳನ್ನು ಖಚಿತವಾಗಿಯೂ ಆಫ್ ಮಾಡಲು ಬಯಸುವಿರಾ?</translation> <translation id="4849058404725798627">ಕೀಬೋರ್ಡ್ ಫೋಕಸ್ ಮೂಲಕ ವಿಷಯವನ್ನು ಎದ್ದುಗಾಣಿಸಿ</translation> <translation id="485592688953820832">ಯಾವುದೇ ಕ್ರಮ ಕೈಗೊಳ್ಳಬೇಡಿ (ವಿರಾಮಗೊಳಿಸಿ)</translation> @@ -1014,6 +1015,7 @@ <translation id="6757237461819837179">ಯಾವುದೇ ಮೀಡಿಯಾ ಪ್ಲೇ ಆಗುತ್ತಿಲ್ಲ</translation> <translation id="6777216307882431711">ಸಂಪರ್ಕಿತ USB-C ಸಾಧನಗಳನ್ನು ಚಾರ್ಜ್ ಮಾಡುತ್ತಿದೆ</translation> <translation id="6786750046913594791">ಫೋಲ್ಡರ್ ಮುಚ್ಚಿರಿ</translation> +<translation id="6787595647772650851">ಕೊನೆಯ ಸೆಶನ್ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಿ</translation> <translation id="6790428901817661496">ಪ್ಲೇ ಮಾಡು</translation> <translation id="6801878137098616817">ಇತ್ತೀಚೆಗೆ ಎಡಿಟ್ ಮಾಡಿದ್ದೀರಿ</translation> <translation id="6803622936009808957">ಯಾವುದೇ ಬೆಂಬಲಿತ ಪರಿಹಾರಗಳು ಕಂಡುಬರದ ಕಾರಣ ಪ್ರದರ್ಶನಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಲಾಗಲಿಲ್ಲ. ಬದಲಿಗೆ ವಿಸ್ತರಿತ ಡೆಸ್ಕ್ಟಾಪ್ ಅನ್ನು ನಮೂದಿಸಲಾಗಿದೆ.</translation> @@ -1262,6 +1264,7 @@ <translation id="8214996719228530800">Canary ಚಾನಲ್</translation> <translation id="8219451629189078428">ಈ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ Chromebook ಆನ್ನಲ್ಲಿ ಇರಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ವಿದ್ಯುತ್ ಸಂಪರ್ಕ ಹೊಂದಿರಬೇಕಾಗುತ್ತದೆ. ನಿಮ್ಮ Chromebook ಮತ್ತು ವಿದ್ಯುತ್ ಔಟ್ಲೆಟ್ ಎರಡಕ್ಕೂ ಚಾರ್ಜರ್ ಅಥವಾ ಅಡಾಪ್ಟರ್ ಕೇಬಲ್ಗಳನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಪ್ಲಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ನಿಮ್ಮ Chromebook ಅನ್ನು ಆಫ್ ಮಾಡಬೇಡಿ.</translation> <translation id="8236042855478648955">ವಿರಾಮದ ಸಮಯ</translation> +<translation id="8246282815785366524">ಮರಳಿ ಸುಸ್ವಾಗತ, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />, ಫೋನ್ ಬ್ಯಾಟರಿ <ph name="BATTERY_STATUS" /></translation> <translation id="8247998213073982446"><ph name="APP_NAME" />, ಆ್ಯಪ್</translation> <translation id="8255234195843591763">ಅಪ್ಡೇಟ್ ಮಾಡಲು ರೀಸೆಟ್ ಮಾಡಿ</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 912689dd..8b8d11e65 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -852,6 +852,7 @@ <translation id="5860033963881614850">Izsl.</translation> <translation id="5860491529813859533">Ieslēgt</translation> <translation id="5867217927013474703">Notiek tīkla informācijas vākšana</translation> +<translation id="5867606971598166637">Sistēmas administrators uzrauga jūsu ekrānus</translation> <translation id="5876666360658629066">Ievadiet vecāku kodu</translation> <translation id="5881540930187678962">Tālruņa centrmezgla iestatīšana vēlāk</translation> <translation id="5887954372087850114">Logs <ph name="WINDOW_TITLE" /> ir piešķirts darbvietai <ph name="DESK_TITLE" /> un ir atsaistīts no citām darbvietām.</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index b89d0698..de8f522 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -672,6 +672,7 @@ <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Прекини врска</translation> <translation id="4814539958450445987">Екран за најавување</translation> +<translation id="481455355267255546">Следни настани</translation> <translation id="4831034276697007977">Дали сигурно сакате да ги исклучите автоматските кликови?</translation> <translation id="4849058404725798627">Нагласи го предметот со фокус на тастатурата</translation> <translation id="485592688953820832">Нема дејство (пауза)</translation> @@ -1014,6 +1015,7 @@ <translation id="6757237461819837179">Нема пуштени аудиовизуелни содржини</translation> <translation id="6777216307882431711">Се напојуваат поврзани USB-C уреди</translation> <translation id="6786750046913594791">Затвори папка</translation> +<translation id="6787595647772650851">Обнови ја последната сесија</translation> <translation id="6790428901817661496">Репродуцирај</translation> <translation id="6801878137098616817">Изменето неодамна</translation> <translation id="6803622936009808957">Не можеа да се отсликаат екрани затоа што не се пронајдени поддржани резолуции. Наместо тоа, влеговме во проширен десктоп.</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 3d7f3ead..81a608c 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -1261,6 +1261,7 @@ <translation id="8214996719228530800">क्यानरी च्यानल</translation> <translation id="8219451629189078428">त्यतिन्जेल तपाईंको Chromebook खुला हुनु पर्छ र बिजुलीको स्रोतमा जोडिएको हुनु पर्छ। चार्जर वा एड्याप्टर केबल तपाईंको Chromebook र पावर सकेट दुवैतिर राम्ररी जोडिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्। आफ्नो Chromebook बन्द नगर्नुहोला।</translation> <translation id="8236042855478648955">आराम गर्ने समय भयो</translation> +<translation id="8246282815785366524">फेरि स्वागत छ, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, सिग्नलको क्षमता <ph name="SIGNAL_STRENGTH" />, फोनको ब्याट्री <ph name="BATTERY_STATUS" /></translation> <translation id="8247998213073982446"><ph name="APP_NAME" />,एप</translation> <translation id="8255234195843591763">अपडेट गर्न रिसेट गर्नुहोस्</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index e6857f3..d770014 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -1261,6 +1261,7 @@ <translation id="8214996719228530800">Canary-kanal</translation> <translation id="8219451629189078428">Chromebooken må være påslått og koblet til strøm i denne perioden. Sørg for at lader- eller adapterkabelen er plugget helt inn i både Chromebooken og stikkontakten. Ikke slå av Chromebook.</translation> <translation id="8236042855478648955">På tide med en pause</translation> +<translation id="8246282815785366524">Velkommen tilbake, <ph name="GIVEN_NAME" /></translation> <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /> – telefonbatterinivå <ph name="BATTERY_STATUS" /></translation> <translation id="8247998213073982446"><ph name="APP_NAME" /> – app</translation> <translation id="8255234195843591763">Tilbakestill for å oppdatere</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 24b5fae..1d861522 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -671,6 +671,7 @@ <translation id="479989351350248267">ਖੋਜੋ</translation> <translation id="4804818685124855865">ਡਿਸਕਨੈਕਟ ਕਰੋ</translation> <translation id="4814539958450445987">ਲੌਗ-ਇਨ ਸਕ੍ਰੀਨ</translation> +<translation id="481455355267255546">ਇਸ ਤੋਂ ਬਾਅਦ</translation> <translation id="4831034276697007977">ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਸਵੈਚਲਿਤ ਕਲਿੱਕਾਂ ਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="4849058404725798627">ਕੀ-ਬੋਰਡ ਫੋਕਸ ਨਾਲ ਵਸਤੂ ਨੂੰ ਉਜਾਗਰ ਕਰੋ</translation> <translation id="485592688953820832">ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ (ਰੋਕੋ)</translation> @@ -1014,6 +1015,7 @@ <translation id="6757237461819837179">ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ ਚੱਲ ਰਿਹਾ ਹੈ</translation> <translation id="6777216307882431711">ਕਨੈਕਟ ਕੀਤੇ USB-C ਡੀਵਾਈਸਾਂ ਨੂੰ ਪਾਵਰ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="6786750046913594791">ਫੋਲਡਰ ਬੰਦ ਕਰੋ</translation> +<translation id="6787595647772650851">ਪਿਛਲੇ ਸੈਸ਼ਨ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰੋ</translation> <translation id="6790428901817661496">ਪਲੇ ਕਰੋ</translation> <translation id="6801878137098616817">ਹਾਲ ਹੀ ਵਿੱਚ ਸੰਪਾਦਨ ਕੀਤਾ ਗਿਆ</translation> <translation id="6803622936009808957">ਡਿਸਪਲੇਆਂ ਨੂੰ ਮਿਰਰ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਕੋਈ ਸਮਰਥਿਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਹੀਂ ਮਿਲੇ। ਇਸਦੀ ਬਜਾਏ ਵਿਸਤ੍ਰਿਤ ਡੈਸਕਟਾਪ ਵਿੱਚ ਚਲਾ ਗਿਆ।</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 01241d04..16c5ebc 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -671,6 +671,7 @@ <translation id="479989351350248267">pesquisar</translation> <translation id="4804818685124855865">Desconectar</translation> <translation id="4814539958450445987">Tela de login</translation> +<translation id="481455355267255546">Próximos eventos</translation> <translation id="4831034276697007977">Tem certeza de que você quer desativar os cliques automáticos?</translation> <translation id="4849058404725798627">Destacar objeto com o foco de teclado</translation> <translation id="485592688953820832">Nenhuma ação (pausar)</translation> @@ -1013,6 +1014,7 @@ <translation id="6757237461819837179">Nenhuma mídia em reprodução</translation> <translation id="6777216307882431711">Carregando dispositivos USB-C conectados</translation> <translation id="6786750046913594791">Fechar pasta</translation> +<translation id="6787595647772650851">Restaurar a última sessão</translation> <translation id="6790428901817661496">Reproduzir</translation> <translation id="6801878137098616817">Editado recentemente</translation> <translation id="6803622936009808957">Não foi possível espelhar os displays porque não foram encontradas resoluções suportadas. Em vez disso, foi ativada a área de trabalho estendida.</translation>
diff --git a/ash/system/accessibility/floating_accessibility_controller_unittest.cc b/ash/system/accessibility/floating_accessibility_controller_unittest.cc index afca82f..1837f82 100644 --- a/ash/system/accessibility/floating_accessibility_controller_unittest.cc +++ b/ash/system/accessibility/floating_accessibility_controller_unittest.cc
@@ -7,6 +7,8 @@ #include "ash/accelerators/accelerator_controller_impl.h" #include "ash/accessibility/accessibility_controller_impl.h" #include "ash/accessibility/autoclick/autoclick_controller.h" +#include "ash/ime/ime_controller_impl.h" +#include "ash/public/cpp/ime_info.h" #include "ash/public/cpp/session/session_types.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" @@ -30,6 +32,7 @@ // but is still smaller than half the screen size, so that we can check the // general corner in which the menu is displayed. const int kMenuViewBoundsBuffer = 100; +const char ImeEnglishId[] = "ime:english"; ui::GestureEvent CreateTapEvent() { return ui::GestureEvent(0, 0, 0, base::TimeTicks(), @@ -39,6 +42,12 @@ } // namespace class FloatingAccessibilityControllerTest : public AshTestBase { public: + void SetUp() override { + AshTestBase::SetUp(); + // Ensure 2 Ime's are available so we show the ime switch button. + SetTwoAvailableImes(); + } + AccessibilityControllerImpl* accessibility_controller() { return Shell::Get()->accessibility_controller(); } @@ -81,18 +90,19 @@ return view->GetViewByID(static_cast<int>(button_id)); } + bool IsButtonVisible(FloatingAccessibilityView::ButtonId button_id) { + views::View* button = GetMenuButton(button_id); + return button != nullptr; + } + ImeMenuTray* GetImeTray() { - FloatingAccessibilityView* view = menu_view(); - if (!view) - return nullptr; - return view->ime_button_; + ImeMenuTray* result = menu_view() ? menu_view()->ime_button_ : nullptr; + EXPECT_NE(result, nullptr) << "Ime tray is not currently visible"; + return result; } // Returns true if the IME menu bubble has been shown. - bool IsImeTrayShown() { - return (GetImeTray() != nullptr) && - (GetImeTray()->GetBubbleView() != nullptr); - } + bool IsImeTrayShown() { return GetImeTray()->GetBubbleView() != nullptr; } void SetUpKioskSession() { SessionInfo info; @@ -132,6 +142,38 @@ controller()->on_layout_change_ = std::move(closure); } + void SetCurrentAndAvailableImes(const std::string& current_ime_id, + const std::vector<ImeInfo>& available_imes) { + Shell::Get()->ime_controller()->RefreshIme(current_ime_id, available_imes, + std::vector<ImeMenuItem>()); + } + + // Setup one language + void SetSingleAvailableIme() { + ImeInfo ime_english; + ime_english.id = ImeEnglishId; + ime_english.name = u"English"; + ime_english.short_name = u"US"; + + SetCurrentAndAvailableImes(ImeEnglishId, /*available_imes=*/{ime_english}); + } + + // Should have at least two languages to show the button + void SetTwoAvailableImes() { + ImeInfo ime_english; + ime_english.id = ImeEnglishId; + ime_english.name = u"English"; + ime_english.short_name = u"US"; + + ImeInfo ime_pinyin; + ime_pinyin.id = "ime:pinyin"; + ime_pinyin.name = u"Pinyin"; + ime_pinyin.short_name = u"拼"; + + SetCurrentAndAvailableImes(ImeEnglishId, + /*available_imes=*/{ime_english, ime_pinyin}); + } + protected: base::test::ScopedFeatureList features_; }; @@ -139,24 +181,29 @@ TEST_F(FloatingAccessibilityControllerTest, ImeButtonNotShowWhenDisabled) { SetUpVisibleMenu(); - views::View* button = - GetMenuButton(FloatingAccessibilityView::ButtonId::kIme); - EXPECT_FALSE(button); + EXPECT_FALSE(IsButtonVisible(FloatingAccessibilityView::ButtonId::kIme)); } -TEST_F(FloatingAccessibilityControllerTest, ImeButtonShowWhenEnabled) { +TEST_F(FloatingAccessibilityControllerTest, ImeButtonShownWhenEnabled) { features_.InitAndEnableFeature(features::kKioskEnableImeButton); - EXPECT_TRUE(base::FeatureList::IsEnabled(features::kKioskEnableImeButton)); + SetUpVisibleMenu(); - views::View* button = - GetMenuButton(FloatingAccessibilityView::ButtonId::kIme); - EXPECT_TRUE(button); + EXPECT_TRUE(IsButtonVisible(FloatingAccessibilityView::ButtonId::kIme)); +} + +TEST_F(FloatingAccessibilityControllerTest, ImeButtonHiddenWhenSingleLanguage) { + features_.InitAndEnableFeature(features::kKioskEnableImeButton); + + SetSingleAvailableIme(); + SetUpVisibleMenu(); + + EXPECT_FALSE(IsButtonVisible(FloatingAccessibilityView::ButtonId::kIme)); } TEST_F(FloatingAccessibilityControllerTest, KioskImeTrayVisibility) { features_.InitAndEnableFeature(features::kKioskEnableImeButton); - EXPECT_TRUE(base::FeatureList::IsEnabled(features::kKioskEnableImeButton)); + SetUpVisibleMenu(); // Tray bubble is visible when a user taps on the IME icon. @@ -170,7 +217,7 @@ TEST_F(FloatingAccessibilityControllerTest, KioskImeTrayBottomButtons) { features_.InitAndEnableFeature(features::kKioskEnableImeButton); - EXPECT_TRUE(base::FeatureList::IsEnabled(features::kKioskEnableImeButton)); + SetUpVisibleMenu(); EXPECT_FALSE(GetImeTray()->ShouldShowBottomButtons()); }
diff --git a/ash/system/accessibility/floating_accessibility_view.cc b/ash/system/accessibility/floating_accessibility_view.cc index 635d522..de95109 100644 --- a/ash/system/accessibility/floating_accessibility_view.cc +++ b/ash/system/accessibility/floating_accessibility_view.cc
@@ -97,7 +97,8 @@ bool IsKioskImeButtonEnabled() { return Shell::Get()->session_controller()->IsRunningInAppMode() && - base::FeatureList::IsEnabled(features::kKioskEnableImeButton); + base::FeatureList::IsEnabled(features::kKioskEnableImeButton) && + Shell::Get()->ime_controller()->GetVisibleImes().size() > 1; } } // namespace @@ -176,6 +177,7 @@ AddChildView(std::move(ime_button_container)); AddChildView(CreateSeparator()); } + AddChildView(std::move(feature_buttons_container)); AddChildView(std::move(tray_button_container)); AddChildView(CreateSeparator());
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc index f5073fc..f8847a57 100644 --- a/ash/system/holding_space/holding_space_tray_unittest.cc +++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -8,7 +8,6 @@ #include <deque> #include <vector> -#include "ash/constants/ash_features.h" #include "ash/public/cpp/holding_space/holding_space_client.h" #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_controller.h" @@ -44,12 +43,10 @@ #include "base/strings/strcat.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "testing/gmock/include/gmock/gmock.h" #include "ui/compositor/layer.h" #include "ui/events/base_event_utils.h" #include "ui/gfx/geometry/transform_util.h" -#include "ui/gfx/image/image_skia.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/controls/menu/menu_controller.h" #include "ui/views/controls/menu/menu_item_view.h" @@ -193,8 +190,15 @@ std::vector<HoldingSpaceItem::Type> GetHoldingSpaceItemTypes() { std::vector<HoldingSpaceItem::Type> types; - for (int i = 0; i <= static_cast<int>(HoldingSpaceItem::Type::kMaxValue); ++i) - types.push_back(static_cast<HoldingSpaceItem::Type>(i)); + for (int i = 0; i <= static_cast<int>(HoldingSpaceItem::Type::kMaxValue); + ++i) { + // TODO(crbug/1353993): Remove check once the suggestions section is added + // to the holding space tray bubble. + if (!HoldingSpaceItem::IsSuggestion( + static_cast<HoldingSpaceItem::Type>(i))) { + types.push_back(static_cast<HoldingSpaceItem::Type>(i)); + } + } return types; } @@ -975,6 +979,7 @@ HoldingSpaceItem::Type::kDownload, HoldingSpaceItem::Type::kLacrosDownload, HoldingSpaceItem::Type::kNearbyShare, + HoldingSpaceItem::Type::kPhoneHubCameraRoll, HoldingSpaceItem::Type::kPrintedPdf, HoldingSpaceItem::Type::kScan));
diff --git a/ash/system/message_center/ash_notification_view.cc b/ash/system/message_center/ash_notification_view.cc index 05e9b919..67a7299 100644 --- a/ash/system/message_center/ash_notification_view.cc +++ b/ash/system/message_center/ash_notification_view.cc
@@ -251,7 +251,14 @@ END_METADATA void AshNotificationView::AddedToWidget() { - widget_observation_.Observe(GetWidget()); + // crbug/1337661: We need to abort animations in a grouped parent view when + // it's widget is being destroyed. By default when a widget is destroyed, all + // current animations are forced to finish. The grouped notification removal + // animation triggers an additional resize animation when it is finished. This + // needs to be aborted explicitly to prevent a crash. We do not need to this + // observation for grouped notification views. + if (!is_grouped_child_view_) + widget_observation_.Observe(GetWidget()); } void AshNotificationView::Layout() { @@ -395,7 +402,10 @@ AshNotificationView::AshNotificationView( const message_center::Notification& notification, bool shown_in_popup) - : NotificationViewBase(notification), shown_in_popup_(shown_in_popup) { + : NotificationViewBase(notification), + is_grouped_parent_view_(notification.group_parent()), + is_grouped_child_view_(notification.group_child()), + shown_in_popup_(shown_in_popup) { message_center_observer_.Observe(message_center::MessageCenter::Get()); // TODO(crbug/1232197): fix views and layout to match spec. // Instantiate view instances and define layout and view hierarchy. @@ -1341,8 +1351,8 @@ } void AshNotificationView::OnWidgetClosing(views::Widget* widget) { - AbortAllAnimations(); widget_observation_.Reset(); + AbortAllAnimations(); } void AshNotificationView::OnWidgetDestroying(views::Widget* widget) {
diff --git a/ash/webui/os_feedback_ui/backend/histogram_util.cc b/ash/webui/os_feedback_ui/backend/histogram_util.cc index 2496afe..cb84b1e3 100644 --- a/ash/webui/os_feedback_ui/backend/histogram_util.cc +++ b/ash/webui/os_feedback_ui/backend/histogram_util.cc
@@ -30,8 +30,8 @@ case mojom::FeedbackAppPreSubmitAction::kViewedMetrics: base::UmaHistogramBoolean(kFeedbackAppViewedMetrics, true); break; - // TODO(longbowei): Handle ViewedHelpContent case. case mojom::FeedbackAppPreSubmitAction::kViewedHelpContent: + base::UmaHistogramBoolean(kFeedbackAppViewedHelpContent, true); break; } }
diff --git a/ash/webui/os_feedback_ui/backend/histogram_util.h b/ash/webui/os_feedback_ui/backend/histogram_util.h index f28f764..5a5012c3 100644 --- a/ash/webui/os_feedback_ui/backend/histogram_util.h +++ b/ash/webui/os_feedback_ui/backend/histogram_util.h
@@ -25,6 +25,8 @@ "Feedback.ChromeOSApp.ViewedMetrics"; constexpr char kFeedbackAppViewedSystemAndAppInfo[] = "Feedback.ChromeOSApp.ViewedSystemAndAppInfo"; +constexpr char kFeedbackAppViewedHelpContent[] = + "Feedback.ChromeOSApp.ViewedHelpContent"; constexpr char kFeedbackAppCanContactUser[] = "Feedback.ChromeOSApp.CanContactUser"; constexpr char kFeedbackAppIncludedFile[] = "Feedback.ChromeOSApp.IncludedFile";
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js index daf855c..93df50f 100644 --- a/ash/webui/os_feedback_ui/resources/feedback_flow.js +++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -11,7 +11,7 @@ import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {FeedbackAppExitPath, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js'; +import {FeedbackAppExitPath, FeedbackAppPreSubmitAction, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js'; import {getFeedbackServiceProvider} from './mojo_interface_provider.js'; /** @@ -133,6 +133,8 @@ return; } this.helpContentClicked_ = true; + this.feedbackServiceProvider_.recordPreSubmitAction( + FeedbackAppPreSubmitAction.kViewedHelpContent); }); window.addEventListener('beforeunload', event => {
diff --git a/base/BUILD.gn b/base/BUILD.gn index 20e49fa..57ce146 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -362,6 +362,7 @@ "functional/identity.h", "functional/invoke.h", "functional/not_fn.h", + "functional/overloaded.h", "gtest_prod_util.h", "guid.cc", "guid.h", @@ -3140,6 +3141,7 @@ "functional/identity_unittest.cc", "functional/invoke_unittest.cc", "functional/not_fn_unittest.cc", + "functional/overloaded_unittest.cc", "gmock_unittest.cc", "guid_unittest.cc", "hash/hash_unittest.cc", @@ -3996,6 +3998,7 @@ "containers/span_unittest.nc", "debug/crash_logging_unittest.nc", "functional/function_ref_unittest.nc", + "functional/overloaded_unittest.nc", "memory/raw_ptr_unittest.nc", "memory/ref_counted_unittest.nc", "memory/weak_ptr_unittest.nc",
diff --git a/base/functional/overloaded.h b/base/functional/overloaded.h new file mode 100644 index 0000000..13ad5793 --- /dev/null +++ b/base/functional/overloaded.h
@@ -0,0 +1,51 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FUNCTIONAL_OVERLOADED_H_ +#define BASE_FUNCTIONAL_OVERLOADED_H_ + +namespace base { + +// absl::visit needs to be called with a functor object, such as +// +// struct Visitor { +// std::string operator()(const PackageA& source) { +// return "PackageA"; +// } +// +// std::string operator()(const PackageB& source) { +// return "PackageB"; +// } +// }; +// +// return absl::visit(Visitor(), event.first); +// +// The following file enables the above code to be written as shown below: +// +// absl::variant<PackageA, PackageB> var = PackageA(); +// absl::visit( +// Overloaded{ +// [](PackageA& pack) { return "PackageA"; }, +// [](PackageB& pack) { return "PackageB"; } +// }, var); +// +// Note: Lambdas should be implemented for all the variant options. Otherwise, there +// will be compilation error. + +// This struct inherits operator() method from all its base classes. +// Introduces operator() method from all its base classes into its definition. +template <typename... Callables> +struct Overloaded : Callables... { + using Callables::operator()...; +}; + +// Uses template argument deduction so that the struct |Overloaded| can be used +// without specifying its template argument. This allows anonymous lambdas +// passed into |Overloaded| constructor. +template <typename... Callables> +Overloaded(Callables...) -> Overloaded<Callables...>; + +} // namespace base + +#endif // BASE_FUNCTIONAL_OVERLOADED_H_
diff --git a/base/functional/overloaded_unittest.cc b/base/functional/overloaded_unittest.cc new file mode 100644 index 0000000..31b9645 --- /dev/null +++ b/base/functional/overloaded_unittest.cc
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/functional/overloaded.h" + +#include <string> + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/variant.h" + +namespace base { + +TEST(FunctionalTest, Overloaded) { + struct PackageA {}; + struct PackageB {}; + + absl::variant<PackageA, PackageB> var = PackageA(); + + const std::string output = + absl::visit(Overloaded{[](const PackageA& pack) { return "PackageA"; }, + [](const PackageB& pack) { return "PackageB"; }}, + var); + EXPECT_EQ(output, "PackageA"); +} + +} // namespace base
diff --git a/base/functional/overloaded_unittest.nc b/base/functional/overloaded_unittest.nc new file mode 100644 index 0000000..9f4087c --- /dev/null +++ b/base/functional/overloaded_unittest.nc
@@ -0,0 +1,25 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is a "No Compile Test" suite. +// http://dev.chromium.org/developers/testing/no-compile-tests + +#include "base/functional/overloaded.h" + +#include "third_party/abseil-cpp/absl/types/variant.h" + +namespace base { + +#if defined(TEST_LAMDA_MISSING_FOR_A_VARIANT_OPTION) // [r"error: no type named 'type' in 'absl::type_traits_internal::result_of<base::Overloaded<\(lambda at *\)> \(PackageB &\)>'"] + struct PackageA {}; + struct PackageB {}; + + absl::variant<PackageA, PackageB> var = PackageA(); + absl::visit( + Overloaded{[](PackageA& pack) { return "PackageA"; }}, + var); + +#endif + +} // namespace base \ No newline at end of file
diff --git a/chrome/VERSION b/chrome/VERSION index f30e4c9f..db8b101 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=107 MINOR=0 -BUILD=5250 +BUILD=5252 PATCH=0
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb index 6f21d00..14c57a5 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb
@@ -58,6 +58,7 @@ <translation id="575494663145460764">Kry opletberigte oor prysdalings?</translation> <translation id="58326064309361797">Sleep oortjies om hulle te groepeer</translation> <translation id="5846292395804797011">Maak <ph name="TITLE_OF_GROUP" />-groep met <ph name="NUMBER_OF_TABS" /> oortjies toe</translation> +<translation id="5972844218283131174">Ontkies alles</translation> <translation id="6040143037577758943">Maak toe</translation> <translation id="6054741997831917303">Hierdie item se prys het onlangs van <ph name="PREVIOUS_PRICE" /> na <ph name="NEW_PRICE" /> gedaal</translation> <translation id="6193448654517602979">Kies oortjies</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb index 72b2645..8d69dea7 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
@@ -58,6 +58,7 @@ <translation id="575494663145460764">ဈေးကျသွားသည်များအတွက် သတိပေးချက် ရယူမလား။</translation> <translation id="58326064309361797">တဘ်များကို အုပ်စုဖွဲ့ရန် ၎င်းတို့ကို ဖိဆွဲပါ</translation> <translation id="5846292395804797011">တဘ် <ph name="NUMBER_OF_TABS" /> ခုဖြင့် <ph name="TITLE_OF_GROUP" /> အုပ်စုကို ပိတ်ရန်</translation> +<translation id="5972844218283131174">အားလုံးမရွေးပါနှင့်</translation> <translation id="6040143037577758943">ပိတ်ရန်</translation> <translation id="6054741997831917303">ဤပစ္စည်းမှာ မကြာမီက <ph name="PREVIOUS_PRICE" /> မှ <ph name="NEW_PRICE" /> သို့ ဈေးကျသွားသည်</translation> <translation id="6193448654517602979">တဘ်ရွေးရန်</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb index cb208c51..afc9ded9 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb
@@ -58,6 +58,7 @@ <translation id="575494663145460764">मूल्य घटेको कुरासम्बन्धी अलर्ट प्राप्त गर्ने हो?</translation> <translation id="58326064309361797">ट्याबहरूलाई समूहबद्ध गर्न तिनीहरूलाई ड्र्याग गर्नुहोस्</translation> <translation id="5846292395804797011"><ph name="NUMBER_OF_TABS" /> वटा ट्याब भएको <ph name="TITLE_OF_GROUP" /> समूह बन्द गर्नुहोस्</translation> +<translation id="5972844218283131174">सबैको चयन रद्द गर्नुहोस्</translation> <translation id="6040143037577758943">बन्द गर्नुहोस्</translation> <translation id="6054741997831917303">यो वस्तुको मूल्य हालसालै घटेर <ph name="PREVIOUS_PRICE" /> बाट <ph name="NEW_PRICE" /> भएको छ</translation> <translation id="6193448654517602979">ट्याबहरू चयन गर्नुहोस्</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb index a10afb7..2bf1ba1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
@@ -58,6 +58,7 @@ <translation id="575494663145460764">Vil du ha varsler om avslag?</translation> <translation id="58326064309361797">Dra faner for å gruppere dem</translation> <translation id="5846292395804797011">Lukk <ph name="TITLE_OF_GROUP" />-gruppen med <ph name="NUMBER_OF_TABS" /> faner</translation> +<translation id="5972844218283131174">Velg bort alle</translation> <translation id="6040143037577758943">Lukk</translation> <translation id="6054741997831917303">Prisen på denne varen falt nylig fra <ph name="PREVIOUS_PRICE" /> til <ph name="NEW_PRICE" /></translation> <translation id="6193448654517602979">Velg faner</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb index ea3123f..2d5df286 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb
@@ -58,6 +58,7 @@ <translation id="575494663145460764">قیمتوں میں کمی کے لیے الرٹس حاصل کریں؟</translation> <translation id="58326064309361797">ان کی گروپ بندی کرنے کے لیے ٹیبز کو گھسیٹیں</translation> <translation id="5846292395804797011"><ph name="TITLE_OF_GROUP" /> گروپ کو <ph name="NUMBER_OF_TABS" /> ٹیبز کے ساتھ بند کریں</translation> +<translation id="5972844218283131174">سبھی کو غیر منتخب کریں</translation> <translation id="6040143037577758943">بند کریں</translation> <translation id="6054741997831917303">اس آئٹم کی قیمت حال ہی میں کم ہو کر <ph name="PREVIOUS_PRICE" /> سے <ph name="NEW_PRICE" /> ہوئی ہے</translation> <translation id="6193448654517602979">ٹیبز منتخب کریں</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb index 74c018f..f9ed4864 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb
@@ -58,6 +58,7 @@ <translation id="575494663145460764">Thola izexwayiso zokwehla kwentengo?</translation> <translation id="58326064309361797">Hudula amathebhu ukuze uwafake eqenjini</translation> <translation id="5846292395804797011">Vala iqembu elingu-<ph name="TITLE_OF_GROUP" /> lamathebhu angu-<ph name="NUMBER_OF_TABS" /></translation> +<translation id="5972844218283131174">Susa ukukhetha konke</translation> <translation id="6040143037577758943">Vala</translation> <translation id="6054741997831917303">Intengo yale nto isanda kwehla kusuka ku-<ph name="PREVIOUS_PRICE" /> ukuya ku-<ph name="NEW_PRICE" /></translation> <translation id="6193448654517602979">Khetha amathebhu</translation>
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index c852711..e5806d3 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-106.0.5249.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-106.0.5249.4_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 580f00d..15ef3f3 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Jou organisasie bestuur opsies om te deel. Sommige items word dalk versteek.</translation> <translation id="1622054403950683339">Vergeet Wi-Fi-netwerk</translation> <translation id="1623723619460186680">Dowwer blou lig</translation> -<translation id="1624012933569991823">Instellings</translation> <translation id="1624599281783425761">Jy sal <ph name="MERCHANT" /> nie weer sien nie</translation> <translation id="1624863973697515675">Hierdie lêers is te groot vir jou toestel om te bestuur. Probeer dit op ’n ander toestel aflaai</translation> <translation id="1627276047960621195">Lêerbeskrywers</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">Gebruik sterk wagwoord</translation> <translation id="1900305421498694955">Programme van Google Play af moet dalk volle toegang tot lêerstelsels hê om lêers op eksterne bergingtoestelle te lees en te skryf. Enigiemand wat die eksterne skyf gebruik, kan lêers en vouers sien wat op die toestel geskep is. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Kies almal</translation> -<translation id="1901396183631570154">Chrome kon nie hierdie wagwoorde in jou Google-rekening stoor nie. Jy kan hulle steeds op hierdie toestel stoor.</translation> <translation id="1903995858055162096">Nie jou toestel nie? Gebruik <ph name="BEGIN_LINK" />Gasmodus<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Die URL'e wat jy besoek, word in jou Google-rekening gestoor</translation> <translation id="1905375423839394163">Chromebook-toestelnaam</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506">Skakel Windows af om <ph name="PARALLELS_DESKTOP" /> te deïnstalleer.</translation> <translation id="2477065602824695373">Outoskandeer is afgeskakel aangesien jy veelvuldige skakelaars opgestel het.</translation> <translation id="2478176599153288112">Medialêer-toestemmings vir "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Wagwoorde is nie gestoor nie</translation> <translation id="2480868415629598489">Verander data wat jy kopieer en plak</translation> <translation id="2482878487686419369">Kennisgewings</translation> <translation id="2482895651873876648">Oortjie is geskuif na groep <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">Ouerkontroles</translation> <translation id="281390819046738856">Versoek kon nie onderteken word nie.</translation> <translation id="2814489978934728345">Hou op om hierdie bladsy te laai</translation> -<translation id="281504910091592009">Bekyk en bestuur gestoorde wagwoorde in jou <ph name="BEGIN_LINK" />Google-rekening<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Boekmerkvouer</translation> <translation id="2816319641769218778">Skakel sinkronisering aan om wagwoorde in jou Google-rekening te stoor.</translation> <translation id="2816628817680324566">Laat hierdie werf toe om jou sekuriteitsleutel te identifiseer?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">Boekmerk alle oortjies</translation> <translation id="5078796286268621944">Verkeerde PIN</translation> <translation id="5079010647467150187">Voeg ingeboude VPN by …</translation> -<translation id="5079950360618752063">Gebruik voorgestelde wagwoord</translation> <translation id="508059534790499809">Herlaai 'n Kerberos-kaartjie</translation> <translation id="5084328598860513926">Voorsieningvloei is onderbreek. Probeer weer of kontak jou toesteleienaar of administrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Gaan tans na vir opdaterings …</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">Vee "<ph name="CERTIFICATE_NAME" />" uit?</translation> <translation id="520621735928254154">Sertifikaatinvoerfout</translation> <translation id="5206562235913517859">Kleinhandelwinkel-ID is ABC-1234-formaat</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Die gekompromitteerde wagwoord is suksesvol verander. Jy het nog # gekompromitteerde wagwoord. Chrome beveel aan dat jy hierdie wagwoord nou nagaan.}other{Die gekompromitteerde wagwoord is suksesvol verander. Jy het nog # gekompromitteerde wagwoorde. Chrome beveel aan dat jy hierdie wagwoorde nou nagaan.}}</translation> <translation id="5207949376430453814">Lig tekskaret uit</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> wil kyk of jy ’n geskikte Chrome-bedryfstelseltoestel gebruik.</translation> <translation id="5208548918290612795">Berg tans <ph name="WEB_DRIVE" />-stawingstoken</translation> @@ -5303,6 +5297,7 @@ <translation id="6065289257230303064">Sertifikaatonderwerp se gidseienskappe</translation> <translation id="6066794465984119824">Prenthuts is nie gestel nie</translation> <translation id="6069464830445383022">Jou Google-rekening is jou Chromebook-aanmelding</translation> +<translation id="6070311415473175157">Kies prent-area om te deursoek</translation> <translation id="6071181508177083058">bevestig wagwoord</translation> <translation id="6071576563962215370">Die stelsel kon nie die toestel se kenmerkeslot by installering vasmaak nie.</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> word nie op hierdie toestel toegelaat nie. Kontak jou administrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> @@ -6246,7 +6241,6 @@ <translation id="6970861306198150268">Maak seker jy stoor jou huidige wagwoord vir hierdie werf</translation> <translation id="6972180789171089114">Oudio/Video</translation> <translation id="6972754398087986839">Kom aan die gang</translation> -<translation id="6972887130317925583">Die gekompromitteerde wagwoord is suksesvol verander. Gaan jou wagwoorde enige tyd na in <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Mag opspringers stuur en herleidings gebruik</translation> <translation id="6973611239564315524">'n Opgradering na Debian 10 (Buster) is beskikbaar</translation> <translation id="69739764870135975">As Google ook jou versteksoekenjin is, sal jy beter, kontekstueel relevante voorstelle sien</translation> @@ -7134,6 +7128,7 @@ <translation id="7842692330619197998">Besoek g.co/ChromeEnterpriseAccount as jy 'n nuwe rekening moet skep.</translation> <translation id="78427265591841839">Deursoek enige deel van die bladsy met <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="784273751836026224">Deïnstalleer Linux</translation> +<translation id="7842851769217535639">Kies enige deel van die bladsy om te deursoek</translation> <translation id="7843786652787044762">Meld op <ph name="WEB_DRIVE" /> aan</translation> <translation id="7844992432319478437">Dateer tans verskilvergelyking op</translation> <translation id="7846634333498149051">Sleutelbord</translation> @@ -7190,6 +7185,7 @@ <translation id="7893008570150657497">Gaan vanaf jou rekenaar by foto's, musiek en ander media in</translation> <translation id="7893153962594818789">Bluetooth is af op hierdie <ph name="DEVICE_TYPE" />. Voer jou wagwoord in en skakel Bluetooth aan.</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (Verstek)</translation> +<translation id="7896292361319775586">Stoor <ph name="FILE" />?</translation> <translation id="789722939441020330">Moenie werwe toelaat om outomaties veelvuldige lêers af te laai nie</translation> <translation id="7897900149154324287">In die toekoms moet jy seker maak dat jy jou verwyderbare toestel in die Lêersprogram verwyder voor jy dit uitprop. Anders kan jy dalk data verloor.</translation> <translation id="7898725031477653577">Vertaal altyd</translation> @@ -8326,6 +8322,7 @@ <translation id="899403249577094719">Netscape-sertifikaatbasis se URL</translation> <translation id="899657321862108550">Jou Chrome, oral</translation> <translation id="899676909165543803">Die vingerafdruksensor is die sleutel onder regs op jou sleutelbord. Raak met enige vinger liggies daaraan.</translation> +<translation id="8998078711690114234">Hierdie soort lêer kan gevaarlik wees. Stoor hierdie lêer net as jy <ph name="ORIGIN" /> vertrou</translation> <translation id="8999560016882908256">Afdelingsinsboufout: <ph name="ERROR_LINE" /></translation> <translation id="9003185744423389627">Koppeling aan toestelbestuurbediener het om <ph name="FAILURE_TIME" /> met status "<ph name="STATUS_TEXT" />" misluk</translation> <translation id="9003647077635673607">Laat op alle webwerwe toe</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 2da211f..87197be 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">የማጋራት አማራጮች በድርጅትዎ የሚተዳደሩ ናቸው። አንዳንድ ንጥሎዎች ተደብቀው ሊሆኑ ይችላሉ።</translation> <translation id="1622054403950683339">የWi-Fi አውታረ መረብን እርሳ</translation> <translation id="1623723619460186680">የሰማያዊ ብርሃን ቅነሳ</translation> -<translation id="1624012933569991823">ቅንብሮች</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> ዳግም አያዩም</translation> <translation id="1624863973697515675">መሣሪያዎ ይህን ፋይል እንዳያቀናብረው በጣም ትልቅ ነው። በሌላ መሣሪያ ላይ እሱን ለማውረድ ይሞክሩ</translation> <translation id="1627276047960621195">የፋይል ገላጮች</translation> @@ -988,7 +987,6 @@ <translation id="1897120393475391208">ጠንካራ የይለፍ ቃል ይጠቀሙ</translation> <translation id="1900305421498694955">ከGoogle Play የመጡ መተግበሪያዎች በውጫዊ የማከማቻ መሣሪያዎች ላይ ፋይሎችን ለማንበብ እና ለመጻፍ ሙሉ የፋይል ሥርዓት መዳረሻ ሊያስፈልጋቸው ይችላሉ። በዚህ መሣሪያ ላይ የተፈጠሩ ፋይሎች እና አቃፊዎች ውጫዊውን አንጻፊ ለሚጠቀሙ ለማናቸውም ሰዎች የሚታዩ ናቸው። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&ሁሉንም ምረጥ</translation> -<translation id="1901396183631570154">Chrome እነዚህን የይለፍ ቃላት በእርስዎ የGoogle መለያ ውስጥ ሊያስቀምጣቸው አልቻለም። አሁንም በዚህ መሣሪያ ላይ እነሱን ማስቀመጥ ይችላሉ።</translation> <translation id="1903995858055162096">የእርስዎ መሣሪያ አይደለም? <ph name="BEGIN_LINK" />የእንግዳ ሁነታ<ph name="END_LINK" />ን ይጠቀሙ።</translation> <translation id="1904580727789512086">የሚጎበኟቸው ዩአርኤሎች በGoogle መለያዎ ላይ ይቀመጣሉ።</translation> <translation id="1905375423839394163">የChromebook መሣሪያ ስም</translation> @@ -1624,7 +1622,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ለማራገፍ መስኮቶቹን ይዝጉ።</translation> <translation id="2477065602824695373">ብዙ መቀየሪያዎችን ስላዋቀሩ ራስ-ቅኝት ጠፍቷል።</translation> <translation id="2478176599153288112">የ«<ph name="EXTENSION" />» ማህደረ መረጃ ፋይል ፍቃዶች</translation> -<translation id="248003956660572823">የይለፍ ቃል አልተቀመጠም</translation> <translation id="2480868415629598489">እርስዎ የሚቀዱትን እና የሚለጥፉትን ውሂብ መቀየር</translation> <translation id="2482878487686419369">ማስታወቂያዎች</translation> <translation id="2482895651873876648">ትር ወደ ቡድን <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> ተወስዷል</translation> @@ -1986,7 +1983,6 @@ <translation id="2813094189969465044">የወላጅ መቆጣጠሪያዎች</translation> <translation id="281390819046738856">ጥያቄ ሊፈረም አልተቻለም።</translation> <translation id="2814489978934728345">ይህን ገጽ መጫን አቁም</translation> -<translation id="281504910091592009">የተቀመጡ የይለፍ ቃላትን በእርስዎ <ph name="BEGIN_LINK" />Google መለያ<ph name="END_LINK" /> ውስጥ ይመልከቱ እና ያስተዳድሩ</translation> <translation id="2815693974042551705">የዕልባት አቃፊ</translation> <translation id="2816319641769218778">የይለፍ ቃላትን ውወደ Google መለያዎ ለማስቀመት ስምረትን ያብሩ።</translation> <translation id="2816628817680324566">ይህ ጣቢያ የደህንነት ቁልፍዎ እንዲለይ ይፈቀድለት?</translation> @@ -4283,7 +4279,6 @@ <translation id="5078638979202084724">ለሁሉም ትሮች ዕልባት ያብጁ</translation> <translation id="5078796286268621944">የተሳሳተ ፒን</translation> <translation id="5079010647467150187">አብሮገነብ VPN አክል...</translation> -<translation id="5079950360618752063">የተጠቆመ የይለፍ ቃልን ይጠቀሙ</translation> <translation id="508059534790499809">የKerberos ቲኬት ያድሱ</translation> <translation id="5084328598860513926">የማቅረብ ፍሰት ተቋርጧል። እባክዎ እንደገና ይሞክሩ ወይም የእርስዎን መሣሪያ ባለቤት ወይም አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> <translation id="5085162214018721575">ዝማኔዎችን በመፈተሽ ላይ</translation> @@ -4408,7 +4403,6 @@ <translation id="5206215183583316675">«<ph name="CERTIFICATE_NAME" />» ይሰረዝ?</translation> <translation id="520621735928254154">የእውቅና ማረጋገጫ ማስመጣት ስህተት</translation> <translation id="5206562235913517859">የቸርቻሪ-መደብር መታወቂያ የ ABC-1234 ቅርጸት ነው</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{የተጠለፈው የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል። # ተጨማሪ የተጠለፈ ይለፍ ቃል አለዎት። Chrome ይህን የይለፍ ቃል አሁን መፈተሽ ይመክራል።}one{የተጠለፈው የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል። # ተጨማሪ የተጠለፉ የይለፍ ቃላት አለዎት። Chrome እነዚህን የይለፍ ቃላት አሁን መፈተሽ ይመክራል።}other{የተጠለፈው የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል። # ተጨማሪ የተጠለፉ የይለፍ ቃላት አለዎት። Chrome እነዚህን የይለፍ ቃላት አሁን መፈተሽ ይመክራል።}}</translation> <translation id="5207949376430453814">የጽሑፍ ድፋቱን አድምቅ</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> እርስዎ ብቁ የሆነ የChromeOS መሣሪያ እየተጠቀሙ መሆንዎን ማረጋገጥ ይፈልጋል።</translation> <translation id="5208548918290612795">የ<ph name="WEB_DRIVE" /> ማረጋገጫ ማስመሰያን በማስቀመጥ ላይ</translation> @@ -6238,7 +6232,6 @@ <translation id="6970861306198150268">ለዚህ ጣቢያ የአሁኑን የይለፍ ቃልዎን ማስቀመጥዎን ያረጋግጡ</translation> <translation id="6972180789171089114">ኦዲዮ/ቪዲዮ</translation> <translation id="6972754398087986839">አስጀማሪ መመሪያ</translation> -<translation id="6972887130317925583">የተጠለፈው የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል። በ<ph name="SETTINGS" /> ዉስጥ የእርስዎን ይለፍ ቃላትን በማንኛውም ጊዜ ያረጋግጡ።</translation> <translation id="697312151395002334">ብቅ-ባዮችን ለመላክ እና ማዞሪያዎችን ለመጠቀም ተፈቅዷል</translation> <translation id="6973611239564315524">ወደ Debian 10 (Buster) ደረጃ ማሻሻያ ይገኛል</translation> <translation id="69739764870135975">Google እንዲሁ የእርስዎ ነባሪ የፍለጋ ፕሮግራምዎ ከሆነ፣ የተሻለ፣ ከአውድ ጋር ተዛማጅነት ያላቸውን የአስተያየት ጥቆማዎች ያያሉ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 16a40c9..6f433d5 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">تتولّى مؤسستك إدارة خيارات المشاركة. وقد تكون بعض العناصر مخفية.</translation> <translation id="1622054403950683339">حذف شبكة Wi-Fi</translation> <translation id="1623723619460186680">خفض الإضاءة الزرقاء</translation> -<translation id="1624012933569991823">الإعدادات</translation> <translation id="1624599281783425761">لن يظهر لك <ph name="MERCHANT" /> مرة أخرى.</translation> <translation id="1624863973697515675">هذا الملف كبير بدرجة لا تسمح لجهازك بإدارته. جرِّب تنزيله على جهاز آخر.</translation> <translation id="1627276047960621195">أدوات وصف الملفات</translation> @@ -983,7 +982,6 @@ <translation id="1897120393475391208">ننصحك باستخدام كلمة مرور قوية.</translation> <translation id="1900305421498694955">يمكن أن تتطلب التطبيقات من Google Play إذن الوصول الكامل إلى نظام الملفات لقراءة الملفات وكتابتها على أجهزة التخزين الخارجية. تظهر الملفات والمجلدات التي تم إنشاؤها على الجهاز لأيّ شخص يستخدم محرك الأقراص الخارجي. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="1901303067676059328">تح&ديد الكلّ</translation> -<translation id="1901396183631570154">تعذَّر حفظ كلمات المرور هذه على Chrome في حسابك على Google. ولا يزال بإمكانك حفظها على هذا الجهاز.</translation> <translation id="1903995858055162096">إذا لم يكن هذا جهازك، يمكنك استخدام <ph name="BEGIN_LINK" />وضع الضيف<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">يتم حفظ عناوين URL التي تنتقل إليها في حسابك على Google.</translation> <translation id="1905375423839394163">اسم جهاز Chromebook</translation> @@ -1618,7 +1616,6 @@ <translation id="2476974672882258506">يجب إيقاف تشغيل نظام Windows لإلغاء تثبيت <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">بما أنّه سبق لك إعداد عدة مفاتيح تحكّم، تم إيقاف ميزة "المسح التلقائي".</translation> <translation id="2478176599153288112">أذونات ملف الوسائط لـ "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">لم يتم حفظ كلمات المرور</translation> <translation id="2480868415629598489">تعديل البيانات التي يتم نسخها ولصقها</translation> <translation id="2482878487686419369">الإشعارات</translation> <translation id="2482895651873876648">تم نقل علامة التبويب إلى المجموعة <ph name="GROUP_NAME" /> والتي تحتوي على <ph name="GROUP_CONTENTS" />.</translation> @@ -1981,7 +1978,6 @@ <translation id="2813094189969465044">أدوات الرقابة الأبوية</translation> <translation id="281390819046738856">تعذَّر توقيع الطلب.</translation> <translation id="2814489978934728345">وقف تحميل هذه الصفحة</translation> -<translation id="281504910091592009">بإمكانك عرض كلمات المرور المحفوظة وإدارتها في <ph name="BEGIN_LINK" />حسابك على Google<ph name="END_LINK" />.</translation> <translation id="2815693974042551705">مجلد الإشارات المرجعية</translation> <translation id="2816319641769218778">لحفظ كلمات المرور في حسابك على Google، يُرجى تفعيل المزامنة.</translation> <translation id="2816628817680324566">هل تريد السماح لهذا الموقع الإلكتروني بالتعرُّف على مفتاح الأمان الخاص بك؟</translation> @@ -4279,7 +4275,6 @@ <translation id="5078638979202084724">وضع إشارات على كل علامات التبويب</translation> <translation id="5078796286268621944">رقم التعريف الشخصي غير صحيح</translation> <translation id="5079010647467150187">إضافة شبكة افتراضية خاصة مُدمجة...</translation> -<translation id="5079950360618752063">استخدام كلمة مرور مُقترَحة</translation> <translation id="508059534790499809">تحديث تذكرة Kerberos</translation> <translation id="5084328598860513926">تمّت مقاطعة عملية الإعداد. يُرجى إعادة المحاولة أو التواصل مع مشرف الجهاز أو مالكه. رمز الخطأ: <ph name="ERROR_CODE" /></translation> <translation id="5085162214018721575">جارٍ البحث عن تحديثات</translation> @@ -4404,7 +4399,6 @@ <translation id="5206215183583316675">هل تريد حذف "<ph name="CERTIFICATE_NAME" />"؟</translation> <translation id="520621735928254154">خطأ في استيراد الشهادة</translation> <translation id="5206562235913517859">التنسيق المستخدَم مع رقم التعريف لمتجر بائع التجزئة هو ABC-1234.</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق بنجاح. لديك كلمة مرور واحدة إضافية محتمَل تعرّضها للاختراق. لذا ينصح متصفِّح Chrome بالتحقُّق منها الآن.}zero{تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق بنجاح. لديك # كلمة مرور إضافية محتمَل تعرّضها للاختراق. لذا ينصح متصفّح Chrome بالتحقُّق منها الآن.}two{تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق بنجاح. لديك كلمتا مرور إضافيتان محتمَل تعرّضهما للاختراق. لذا ينصح متصفّح Chrome بالتحقُّق منهما الآن.}few{تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق بنجاح. لديك # كلمات مرور إضافية محتمَل تعرّضها للاختراق. لذا ينصح متصفّح Chrome بالتحقُّق منها الآن.}many{تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق بنجاح. لديك # كلمة مرور إضافية محتمَل تعرّضها للاختراق. لذا ينصح متصفّح Chrome بالتحقُّق منها الآن.}other{تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق بنجاح. لديك # كلمة مرور إضافية محتمَل تعرّضها للاختراق. لذا ينصح متصفّح Chrome بالتحقُّق منها الآن.}}</translation> <translation id="5207949376430453814">تمييز علامة إقحام النص</translation> <translation id="520840839826327499">تريد خدمة <ph name="SERVICE_NAME" /> التحقق من أنّك تستخدم جهازًا مؤهَّلاً يعمل بنظام التشغيل Chrome.</translation> <translation id="5208548918290612795">حفظ الرمز المميز لمصادقة <ph name="WEB_DRIVE" /></translation> @@ -6240,7 +6234,6 @@ <translation id="6970861306198150268">احرص على حفظ كلمة المرور الحالية لهذا الموقع الإلكتروني.</translation> <translation id="6972180789171089114">صوت/فيديو</translation> <translation id="6972754398087986839">البدء</translation> -<translation id="6972887130317925583">تمّ تغيير كلمة المرور المحتمَل تعرّضها للاختراق. يمكنك التحقُّق من كلمات المرور في أيّ وقت في <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">المواقع الإلكترونية التي يُسمح لها بإرسال النوافذ المنبثقة واستخدام عمليات إعادة التوجيه</translation> <translation id="6973611239564315524">تتوفّر ترقية إلى Debian 10 (Buster).</translation> <translation id="69739764870135975">إذا كان محرك البحث التلقائي هو Google، ستظهر لك اقتراحات أفضل وأكثر صلة بسياق عمليات البحث التي تجريها.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index cb35fcd9..79cdd3f 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">আপোনাৰ প্ৰতিষ্ঠানে শ্বেয়াৰ কৰাৰ বিকল্পসমূহ পৰিচালনা কৰে। কিছুমান বস্তু লুকুৱাই ৰখা হ’ব পাৰে।</translation> <translation id="1622054403950683339">ৱাই-ফাই নেটৱৰ্কটো পাহৰি যাওক</translation> <translation id="1623723619460186680">নীলা পোহৰ হ্ৰাসকৰণ</translation> -<translation id="1624012933569991823">ছেটিংসমূহ</translation> <translation id="1624599281783425761">আপুনি <ph name="MERCHANT" />ক পুনৰ দেখা নাপায়</translation> <translation id="1624863973697515675">এই ফাইলটোৰ আকাৰ ইমানেই ডাঙৰ যে এইটোক আপোনাৰ ডিভাইচটোৱে পৰিচালনা কৰিব নোৱাৰে। ইয়াক অন্য এটা ডিভাইচত ডাউনল’ড কৰি চাওক</translation> <translation id="1627276047960621195">ফাইলৰ বিৱৰণ</translation> @@ -990,7 +989,6 @@ <translation id="1897120393475391208">বিশ্বস্ত পাছৱৰ্ড ব্যৱহাৰ কৰক</translation> <translation id="1900305421498694955">Google Playৰ এপ্সমূহক বাহ্যিক ষ্ট’ৰেজ ডিভাইচসমূহত থকা ফাইলসমূহ পঢ়িবলৈ আৰু লিখিবলৈ সম্পূৰ্ণ ফাইল ছিষ্টেমৰ এক্সেছ প্ৰয়োজন হ’ব পাৰে। ডিভাইচটোত সৃষ্টি কৰা ফাইল আৰু ফ’ল্ডাৰসমূহ বাহ্যিক ড্ৰাইভটো ব্যৱহাৰ কৰা সকলোৰে বাবে দৃশ্যমান। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&সকলো বাছনি কৰক</translation> -<translation id="1901396183631570154">Chromeএ আপোনাৰ Google একাউণ্টত এই পাছৱৰ্ডসমূহ ছেভ কৰিব নোৱাৰিলে। আপুনি তথাপি সেইসমূহ এই ডিভাইচটোত ছেভ কৰিব পাৰে।</translation> <translation id="1903995858055162096">আপোনাৰ ডিভাইচ নহয় নেকি? <ph name="BEGIN_LINK" />অতিথি ম’ড<ph name="END_LINK" /> ব্যৱহাৰ কৰক।</translation> <translation id="1904580727789512086">আপুনি চোৱা URLসমূহ আপোনাৰ Google একাউণ্টত ছেভ কৰা হৈছে</translation> <translation id="1905375423839394163">Chromebook ডিভাইচৰ নাম</translation> @@ -1628,7 +1626,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> আনইনষ্টল কৰিবলৈ Windows শ্বাট ডাউন কৰক।</translation> <translation id="2477065602824695373">আপুনি একাধিক ছুইচ ছেট আপ কৰাৰ বাবে স্বয়ং-স্কেনৰ সুবিধাটো অফ কৰা হৈছে।</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />"ৰ মিডিয়া ফাইল অনুমতি</translation> -<translation id="248003956660572823">পাছৱৰ্ডসমূহ ছেভ কৰা নহ’ল</translation> <translation id="2480868415629598489">আপুনি প্ৰতিলিপি আৰু পে’ষ্ট কৰা ডেটা সংশোধন কৰক</translation> <translation id="2482878487686419369">জাননী</translation> <translation id="2482895651873876648">টেবটো <ph name="GROUP_NAME" /> গোটলৈ নিয়া হ'ল - <ph name="GROUP_CONTENTS" /></translation> @@ -1990,7 +1987,6 @@ <translation id="2813094189969465044">অভিভাৱকীয় নিয়ন্ত্ৰণবোৰ</translation> <translation id="281390819046738856">অনুৰোধ ছাইন কৰিব পৰা নগ’ল।</translation> <translation id="2814489978934728345">এই পৃষ্ঠাটো ল'ড কৰাটো বন্ধ কৰক</translation> -<translation id="281504910091592009">আপোনাৰ <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" />ত ছেভ কৰি থোৱা পাছৱর্ডসমূহ চাওক আৰু পৰিচালনা কৰক</translation> <translation id="2815693974042551705">ফ’ল্ডাৰ বুকমাৰ্ক কৰক</translation> <translation id="2816319641769218778">আপোনাৰ Google একাউণ্টটোত পাছৱৰ্ডবোৰ ছেভ কৰিবলৈ ছিংক অন কৰক।</translation> <translation id="2816628817680324566">এই ছাইটটোক আপোনাৰ সুৰক্ষা সম্পৰ্কীয় চাবিটো চিনাক্ত কৰিবলৈ অনুমতি দিবনে?</translation> @@ -4289,7 +4285,6 @@ <translation id="5078638979202084724">সকলো টেব বুকমাৰ্ক কৰক</translation> <translation id="5078796286268621944">ভুল পিন</translation> <translation id="5079010647467150187">বিল্ট ইন ভিপিএন যোগ দিয়ক...</translation> -<translation id="5079950360618752063">চুপাৰিছ কৰা পাছৱৰ্ড ব্যৱহাৰ কৰক</translation> <translation id="508059534790499809">কোনো Kerberos টিকেট ৰিফ্ৰেশ্ব কৰক</translation> <translation id="5084328598860513926">প্ৰ’ভিজনিং ফ্ল’ ব্যাহত হৈছে। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক অথবা আপোনাৰ ডিভাইচৰ গৰাকী অথবা প্ৰশাসকৰ সৈতে যোগাযোগ কৰক। আসোঁৱাহ ক’ড: <ph name="ERROR_CODE" />।</translation> <translation id="5085162214018721575">আপডে’ট আছে নেকি বিচাৰি থকা হৈছে</translation> @@ -4414,7 +4409,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ক মচিবনে?</translation> <translation id="520621735928254154">প্ৰমাণপত্ৰ আমদানি কৰাত আসোঁৱাহ</translation> <translation id="5206562235913517859">খুচুৰা বিক্ৰেতা-ষ্ট’ৰৰ আইটো ABC-1234 ফৰ্মেট আছে</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{হেক কৰা পাছৱৰ্ডটো সফলভাৱে সলনি কৰা হ’ল। আপোনাৰ আৰু # টা হেক কৰা পাছৱৰ্ড আছে। Chromeএ এই পাছৱৰ্ডটো এতিয়াই পৰীক্ষা কৰাটো চুপাৰিছ কৰে।}one{হেক কৰা পাছৱৰ্ডটো সফলভাৱে সলনি কৰা হ’ল। আপোনাৰ আৰু # টা হেক কৰা পাছৱৰ্ড আছে। Chromeএ এই পাছৱৰ্ডসমূহ এতিয়াই পৰীক্ষা কৰাটো চুপাৰিছ কৰে।}other{হেক কৰা পাছৱৰ্ডটো সফলভাৱে সলনি কৰা হ’ল। আপোনাৰ আৰু # টা হেক কৰা পাছৱৰ্ড আছে। Chromeএ এই পাছৱৰ্ডসমূহ এতিয়াই পৰীক্ষা কৰাটো চুপাৰিছ কৰে।}}</translation> <translation id="5207949376430453814">পাঠৰ কেৰেট হাইলাইট কৰক</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" />এ আপুনি যোগ্য ChromeOS ডিভাইচ ব্যৱহাৰ কৰি আছেনে সেয়া পৰীক্ষা কৰিবলৈ বিচাৰে।</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" />ৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ ট’কেন ষ্ট’ৰ কৰি থকা হৈছে</translation> @@ -6244,7 +6238,6 @@ <translation id="6970861306198150268">আপুনি এই ছাইটটোৰ বাবে নিজৰ বৰ্তমানৰ পাছৱৰ্ডটো ছেভ কৰাটো নিশ্চিত কৰক</translation> <translation id="6972180789171089114">অডিঅ’/ভিডিঅ’</translation> <translation id="6972754398087986839">আৰম্ভ কৰক</translation> -<translation id="6972887130317925583">হেক কৰা পাছৱৰ্ডটো সফলভাৱে সলনি কৰা হ’ল। যিকোনো সময়তে <ph name="SETTINGS" />ত আপোনাৰ পাছৱৰ্ডসমূহ পৰীক্ষা কৰক।</translation> <translation id="697312151395002334">পপ-আপ পঠিওৱা আৰু ৰিডাইৰেক্ট ব্যৱহাৰ কৰাৰ অনুমতি আছে</translation> <translation id="6973611239564315524">Debian 10 (Buster)ৰ এটা আপগ্ৰে’ড উপলব্ধ</translation> <translation id="69739764870135975">লগতে যদি Google আপোনাৰ ডিফ’ল্ট সন্ধান ইঞ্জিন, তেন্তে আপুনি উন্নত, প্ৰাসংগিক পৰামৰ্শসমূহ দেখা পাব</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 53238c97..27cddc2 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -660,7 +660,6 @@ <translation id="1621984899599015181">Paylaşım seçimləri təşkilatınız tərəfindən idarə olunur. Bəzi elementlər gizlədilə bilər.</translation> <translation id="1622054403950683339">Wi-Fi şəbəkəsini unudun</translation> <translation id="1623723619460186680">Mavi işığın azaldılması</translation> -<translation id="1624012933569991823">Ayarlar</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> platformasını bir daha görməyəcəksiniz</translation> <translation id="1624863973697515675">Bu fayl cihazınıza endirmək üçün çox böyükdür. Onu başqa cihaza endirməyə çalışın</translation> <translation id="1627276047960621195">Fayl Açıqlayıcıları</translation> @@ -976,7 +975,6 @@ <translation id="1897120393475391208">Güclü paroldan istifadə edin</translation> <translation id="1900305421498694955">Google Play tətbiqləri xarici yaddaş cihazlarında faylları oxumaq və yazmaq üçün bütün fayl sisteminə giriş istəyə bilər. Cihazda yaradılan fayl və qovluqları xarici diskdən istifadə edən hər kəs görə bilər. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Hamısını seçin</translation> -<translation id="1901396183631570154">Chrome bu parolları Google Hesabınızda saxlaya bilmədi. Onları bu cihazda saxlaya bilərsiniz.</translation> <translation id="1903995858055162096">Sizin cihazınız deyil? <ph name="BEGIN_LINK" />Qonaq rejimindən<ph name="END_LINK" /> istifadə edin.</translation> <translation id="1904580727789512086">Ziyarət etdiyiniz keçidlər Google Hesabınızda saxlanılır</translation> <translation id="1905375423839394163">Chromebook cihaz adı</translation> @@ -1614,7 +1612,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> tətbiqini quraşdırmaq üçün Windows'u söndürün.</translation> <translation id="2477065602824695373">Birdən çox keçirici ayarladığınıza görə avtomatik skanlama deaktiv edilib.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" üçün Media-Fayl İcazələri</translation> -<translation id="248003956660572823">Parollar yadda saxlanmayıb</translation> <translation id="2480868415629598489">Kopyaladığınız və yerləşdirdiyiniz datanı dəyişdirin</translation> <translation id="2482878487686419369">Bildirişlər</translation> <translation id="2482895651873876648">Tab bu qrupa köçürüldü: <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1976,7 +1973,6 @@ <translation id="2813094189969465044">Valideyn nəzarətləri</translation> <translation id="281390819046738856">Sorğuya giriş etmək mümkün olmadı.</translation> <translation id="2814489978934728345">Bu səhifəni yükləməyi dayandırın</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google Hesabınızda<ph name="END_LINK" /> yadda saxlanılmış parollara baxın və idarə edin</translation> <translation id="2815693974042551705">Qovluğu əlfəcinləyin</translation> <translation id="2816319641769218778">Parolları Google Hesabınızda saxlamaq üçün sinxronlaşdırmanı aktiv edin.</translation> <translation id="2816628817680324566">Bu saytın təhlüksizlik açarınızı təyin etməsinə icazə verilsin?</translation> @@ -4273,7 +4269,6 @@ <translation id="5078638979202084724">Bütün vərəqələri əlfəcinləyin</translation> <translation id="5078796286268621944">Yanlış PIN</translation> <translation id="5079010647467150187">Daxili VPN əlavə edin...</translation> -<translation id="5079950360618752063">Təklif edilmiş paroldan istifadə edin</translation> <translation id="508059534790499809">Kerberos biletini yeniləyin</translation> <translation id="5084328598860513926">Təchizat axını kəsildi. Yenidən cəhd edin və ya cihaz sahibi və ya administrator ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Güncəlləşmələr yoxlanır</translation> @@ -4398,7 +4393,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" silinsin?</translation> <translation id="520621735928254154">Sertifikat İmport Xətası</translation> <translation id="5206562235913517859">Pərakəndə satıcı mağaza ID-si ABC-1234 formatındadır</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Oğurlanmış parol uğurla dəyişdirildi. Daha # oğurlanmış parolunuz var. Chrome bu parolu indi yoxlamağı tövsiyə edir.}other{Oğurlanmış parol uğurla dəyişdirildi. Daha # oğurlanmış parolunuz var. Chrome bu parolları indi yoxlamağı tövsiyə edir.}}</translation> <translation id="5207949376430453814">Mətn karetini vurğulayın</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> uyğun ChromeOS cihazı istifadə edib-etmədiyinizi yoxlamaq istəyir.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> identifikasiya açarının saxlanılması</translation> @@ -6225,7 +6219,6 @@ <translation id="6970861306198150268">Bu sayt üçün cari parolunuzu saxladığınıza əmin olun</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Başlayın</translation> -<translation id="6972887130317925583">Oğurlanmış parol uğurla dəyişdirildi. Parollarınızı istənilən vaxt <ph name="SETTINGS" /> bölməsində yoxlaya bilərsiniz.</translation> <translation id="697312151395002334">Ani bildirişlər göndərmək və yönləndirmələrdən istifadə etmək icazəsi verilib</translation> <translation id="6973611239564315524">Debian 10 (Buster) üçün güncəlləmə əlçatandır</translation> <translation id="69739764870135975">Google həm də defolt axtarış sisteminizdirsə daha yaxşı, kontekstə uyğun təkliflər görəcəksiniz</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index ec23926..746550f 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Параметрамі абагульвання кіруе ваша арганізацыя. Некаторыя элементы могуць быць схаваны.</translation> <translation id="1622054403950683339">Скасаваць сувязь з сеткай Wi-Fi</translation> <translation id="1623723619460186680">Памяншэнне сіняга святла</translation> -<translation id="1624012933569991823">Налады</translation> <translation id="1624599281783425761">Вы больш не будзеце бачыць гэтага прадаўца (<ph name="MERCHANT" />)</translation> <translation id="1624863973697515675">Гэты файл занадта вялікі, і ваша прылада не можа з ім працаваць. Паспрабуйце спампаваць яго на іншую прыладу.</translation> <translation id="1627276047960621195">Дэскрыптары файлаў</translation> @@ -983,7 +982,6 @@ <translation id="1897120393475391208">Выкарыстоўвайце надзейны пароль</translation> <translation id="1900305421498694955">Праграмы з Google Play могуць патрабаваць поўнага доступу да файлавай сістэмы – каб чытаць і запісваць файлы на знешніх прыладах сховішча. Створаныя на прыладзе файлы і папкі бачныя ўсім, хто выкарыстоўвае знешні дыск. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Выбраць &усё</translation> -<translation id="1901396183631570154">Браўзеру Chrome не ўдалося захаваць гэтыя паролі ва Уліковым запісе Google. Можна захаваць іх на гэтай прыладзе.</translation> <translation id="1903995858055162096">Не ваша прылада? Выкарыстайце <ph name="BEGIN_LINK" />Гасцявы рэжым<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-адрасы, якія вы наведвалі, захоўваюцца ва Уліковы запіс Google</translation> <translation id="1905375423839394163">Назва прылады Chromebook</translation> @@ -1618,7 +1616,6 @@ <translation id="2476974672882258506">Каб выдаліць <ph name="PARALLELS_DESKTOP" />, завяршыце працу Windows.</translation> <translation id="2477065602824695373">Аўтаматычнае сканіраванне было выключана, бо вы наладзілі некалькі пераключальнікаў.</translation> <translation id="2478176599153288112">Дазволы выкарыстання мультымедыйных файлаў для пашырэння "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Паролі не захаваны</translation> <translation id="2480868415629598489">Змена даных, якія вы капіруеце і ўстаўляеце</translation> <translation id="2482878487686419369">Апавяшчэнні</translation> <translation id="2482895651873876648">Укладка перамешчана ў групу "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /></translation> @@ -1980,7 +1977,6 @@ <translation id="2813094189969465044">Бацькоўскі кантроль</translation> <translation id="281390819046738856">Не ўдалося падпісаць запыт.</translation> <translation id="2814489978934728345">Спыніць загрузку гэтай старонкі</translation> -<translation id="281504910091592009">Праглядайце захаваныя паролі і кіруйце імі праз <ph name="BEGIN_LINK" />Уліковы запіс Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Папка з закладкамі</translation> <translation id="2816319641769218778">Каб захоўваць паролі ў свой Уліковы запіс Google, уключыце сінхранізацыю.</translation> <translation id="2816628817680324566">Дазволіць гэтаму сайту ідэнтыфікаваць ключ бяспекі?</translation> @@ -4279,7 +4275,6 @@ <translation id="5078638979202084724">Дадаць у закладкі ўсе ўкладкі</translation> <translation id="5078796286268621944">Няправільны PIN-код</translation> <translation id="5079010647467150187">Дадаць убудаваную сетку VPN...</translation> -<translation id="5079950360618752063">Выкарыстайце прапанаваны пароль</translation> <translation id="508059534790499809">Абнаўленне білета Kerberos</translation> <translation id="5084328598860513926">Паток падрыхтоўкі быў перапынены. Паўтарыце спробу або звярніцеся да адміністратара ці ўладальніка прылады. Код памылкі: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Ідзе праверка наяўнасці абнаўленняў</translation> @@ -4404,7 +4399,6 @@ <translation id="5206215183583316675">Выдаліць "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Памылка імпарту сертыфіката</translation> <translation id="5206562235913517859">Ідэнтыфікатар крамы рознічнага гандлю ў фармаце ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Раскрыты пароль зменены. Застаўся яшчэ # раскрыты пароль. Chrome рэкамендуе праверыць гэты пароль зараз.}one{Раскрыты пароль зменены. Застаўся яшчэ # раскрыты пароль. Chrome рэкамендуе праверыць гэтыя паролі зараз.}few{Раскрыты пароль зменены. Засталіся яшчэ # раскрытыя паролі. Chrome рэкамендуе праверыць гэтыя паролі зараз.}many{Раскрыты пароль зменены. Засталіся яшчэ # раскрытых пароляў. Chrome рэкамендуе праверыць гэтыя паролі зараз.}other{Раскрыты пароль зменены. Засталіся яшчэ # раскрытага пароля. Chrome рэкамендуе праверыць гэтыя паролі зараз.}}</translation> <translation id="5207949376430453814">Указваць на курсор рэдагавання тэксту</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> запытвае дазвол праверыць, ці выкарыстоўваеце вы прыдатную прыладу Chrome OS.</translation> <translation id="5208548918290612795">Захоўванне токена аўтэнтыфікацыі сэрвісу <ph name="WEB_DRIVE" /></translation> @@ -6238,7 +6232,6 @@ <translation id="6970861306198150268">Вы павінны захаваць бягучы пароль для гэтага сайта</translation> <translation id="6972180789171089114">Аўдыя/Відэа</translation> <translation id="6972754398087986839">Пачатак працы</translation> -<translation id="6972887130317925583">Раскрыты пароль зменены. Праверыць паролі можна ў любы час у раздзеле "<ph name="SETTINGS" />".</translation> <translation id="697312151395002334">Дазволена паказваць усплывальныя вокны або ажыццяўляць перанакіраванне</translation> <translation id="6973611239564315524">Даступна абнаўленне да Debian 10 (Buster)</translation> <translation id="69739764870135975">Калі Google з'яўляецца вашай стандартнай пошукавай сістэмай, вам будуць паказвацца больш адпаведныя кантэксту прапановы</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 90bdceb2..f6e1024 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Опциите за споделяне се управляват от организацията ви. Някои от тях може да са скрити.</translation> <translation id="1622054403950683339">Забравяне на Wi-Fi мрежа</translation> <translation id="1623723619460186680">Намаляване на синята светлина</translation> -<translation id="1624012933569991823">настройките</translation> <translation id="1624599281783425761">Повече няма да виждате <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Този файл е твърде голям и не може да се управлява от устройството ви. Опитайте да го изтеглите на друго устройство</translation> <translation id="1627276047960621195">Файлови описатели</translation> @@ -988,7 +987,6 @@ <translation id="1897120393475391208">Използване на надеждна парола</translation> <translation id="1900305421498694955">Приложенията от Google Play може да искат пълен достъп до файловата система, за да четат и записват файлове във външни устройства за съхранение. Създадените на устройството файлове и папки са видими за всички, които използват външното хранилище. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Избиране на всички</translation> -<translation id="1901396183631570154">Chrome не успя да запази тези пароли в профила ви в Google. Можете обаче да ги запазите на това устройство.</translation> <translation id="1903995858055162096">Това устройство не е ваше? Използвайте <ph name="BEGIN_LINK" />режима на гост<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL адресите, които посещавате, се запазват в профила ви в Google</translation> <translation id="1905375423839394163">Име на устройството Chromebook</translation> @@ -1626,7 +1624,6 @@ <translation id="2476974672882258506">Изключете Windows, за да деинсталирате <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Тъй като настроихте няколко превключвателя, автоматичното сканиране бе изключено.</translation> <translation id="2478176599153288112">Разрешения за медийни файлове за <ph name="EXTENSION" /></translation> -<translation id="248003956660572823">Паролите не са запазени</translation> <translation id="2480868415629598489">Промяна на данните, които копирате и поставяте</translation> <translation id="2482878487686419369">Известия</translation> <translation id="2482895651873876648">Разделът бе преместен в групата „<ph name="GROUP_NAME" />“ – <ph name="GROUP_CONTENTS" /></translation> @@ -1988,7 +1985,6 @@ <translation id="2813094189969465044">Родителски контроли</translation> <translation id="281390819046738856">Заявката не можа да бъде подписана.</translation> <translation id="2814489978934728345">Спира зареждането на тази страница</translation> -<translation id="281504910091592009">Преглеждайте и управлявайте запазените пароли в <ph name="BEGIN_LINK" />профила си в Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Папка на отметката</translation> <translation id="2816319641769218778">За да запазвате пароли в профила си в Google, включете синхронизирането.</translation> <translation id="2816628817680324566">Да се разреши ли на сайта да идентифицира ключа ви за сигурност?</translation> @@ -4289,7 +4285,6 @@ <translation id="5078638979202084724">Запазване на отметки към всички раздели</translation> <translation id="5078796286268621944">Неправилен ПИН</translation> <translation id="5079010647467150187">Добавяне на вградена VPN...</translation> -<translation id="5079950360618752063">Използване на предложената парола</translation> <translation id="508059534790499809">Опресняване на пропуск за Kerberos</translation> <translation id="5084328598860513926">Процесът на обезпечаване бе прекъснат. Моля, опитайте отново или се обърнете към собственика или администратора на устройството си. Код на грешката: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Проверява се за актуализации</translation> @@ -4414,7 +4409,6 @@ <translation id="5206215183583316675">Да се изтрие ли „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Грешка при импортирането на сертификата</translation> <translation id="5206562235913517859">Идентификаторът на магазина на търговеца е във формат ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Успешно променихте компрометираната парола. Имате още # компрометирана парола. Chrome препоръчва да я проверите сега.}other{Успешно променихте компрометираната парола. Имате още # компрометирани пароли. Chrome препоръчва да ги проверите сега.}}</translation> <translation id="5207949376430453814">Открояване на точката на вмъкване в текста</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> иска да провери дали използвате отговарящо на условията устройство с Chrome OS.</translation> <translation id="5208548918290612795">Съхраняване на означение за удостоверяване за <ph name="WEB_DRIVE" /></translation> @@ -6243,7 +6237,6 @@ <translation id="6970861306198150268">Уверете се, че запазвате текущата си парола за този сайт</translation> <translation id="6972180789171089114">Аудио/видео</translation> <translation id="6972754398087986839">Първи стъпки</translation> -<translation id="6972887130317925583">Успешно променихте компрометираната парола. Проверявайте паролите си по всяко време в <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Сайтове с разрешение за изпращане на изскачащи прозорци и използване на пренасочвания</translation> <translation id="6973611239564315524">Налице е надстройка до Debian 10 (Buster)</translation> <translation id="69739764870135975">Ако Google е и търсещата ви машина по подразбиране, ще виждате по-добри и контекстуално уместни предложения</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 21687766..15a84e47 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">আপনার প্রতিষ্ঠান, শেয়ার করার বিকল্প ম্যানেজ করে। কিছু আইটেম হয়ত লুকানো থাকতে পারে।</translation> <translation id="1622054403950683339">ওয়াই-ফাই নেটওয়ার্ক মুছুন</translation> <translation id="1623723619460186680">নীল আলো কমানো</translation> -<translation id="1624012933569991823">সেটিংস</translation> <translation id="1624599281783425761">আপনি আর <ph name="MERCHANT" /> দেখতে পাবেন না</translation> <translation id="1624863973697515675">আপনার ডিভাইস ম্যানেজ করার জন্য এই ফাইলটি খুব বড়। অন্য ডিভাইসে এটি ডাউনলোড করার চেষ্টা করুন</translation> <translation id="1627276047960621195">ফাইল বর্ণনাকারী</translation> @@ -994,7 +993,6 @@ <translation id="1897120393475391208">শক্তিশালী পাসওয়ার্ড ব্যবহার করুন</translation> <translation id="1900305421498694955">এক্সটার্নাল স্টোরেজ ডিভাইসে ফাইল পড়তে এবং সেভ করতে Google Play থেকে ডাউনলোড করা অ্যাপের সম্পূর্ণ ফাইল সিস্টেমে অ্যাক্সেসের প্রয়োজন হতে পারে। ডিভাইসে তৈরি করা ফাইল এবং ফোল্ডার এক্সটার্নাল ড্রাইভ ব্যবহারকারীরা দেখতে পারবেন। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&সকল বেছে নিন</translation> -<translation id="1901396183631570154">আপনার Google অ্যাকাউন্টে Chrome এই পাসওয়ার্ডগুলি সেভ করতে পারেনি। যদিও আপনি এখনও এগুলিকে এই ডিভাইসে সেভ করে রাখতে পারেন।</translation> <translation id="1903995858055162096">এটি আপনার ডিভাইস নয়? <ph name="BEGIN_LINK" />গেস্ট মোড<ph name="END_LINK" /> ব্যবহার করুন।</translation> <translation id="1904580727789512086">আপনার ভিজিট করা URL আপনার Google অ্যাকাউন্টে সেভ করা হয়</translation> <translation id="1905375423839394163">Chromebook ডিভাইসের নাম</translation> @@ -1632,7 +1630,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> আনইনস্টল করার জন্য Windows বন্ধ করুন।</translation> <translation id="2477065602824695373">আপনি একাধিক সুইচ সেট আপ করার জন্য, অটো-স্ক্যান বন্ধ হয়ে গেছে।</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" এর জন্য মিডিয়া-ফাইলের অনুমতি</translation> -<translation id="248003956660572823">পাসওয়ার্ড সেভ করা হয়নি</translation> <translation id="2480868415629598489">আপনি যে ডেটা কপি করে আটকান তা সংশোধন করুন</translation> <translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation> <translation id="2482895651873876648">এই গ্রুপে ট্যাব সরানো হয়েছে: <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1994,7 +1991,6 @@ <translation id="2813094189969465044">অভিভাবকীয় নিয়ন্ত্রণ</translation> <translation id="281390819046738856">অনুরোধ সাইন করা যায়নি।</translation> <translation id="2814489978934728345">এই পৃষ্ঠা লোড করা বন্ধ করুন</translation> -<translation id="281504910091592009">আপনার <ph name="BEGIN_LINK" />Google অ্যাকাউন্ট<ph name="END_LINK" />-এ সেভ করা পাসওয়ার্ড দেখুন এবং পরিচালনা করুন</translation> <translation id="2815693974042551705">বুকমার্ক ফোল্ডার</translation> <translation id="2816319641769218778">আপনার Google অ্যাকাউন্টে পাসওয়ার্ড সেভ করতে, সিঙ্ক চালু করুন।</translation> <translation id="2816628817680324566">এই সাইটকে আপনার নিরাপত্তা কী দেখার অনুমতি দিতে চান?</translation> @@ -4296,7 +4292,6 @@ <translation id="5078638979202084724">সকল ট্যাব বুকমার্ক করুন</translation> <translation id="5078796286268621944">ভুল পিন</translation> <translation id="5079010647467150187">বিল্ট-ইন ভিপিএন যোগ করুন...</translation> -<translation id="5079950360618752063">প্রস্তাবিত পাসওয়ার্ড ব্যবহার করুন</translation> <translation id="508059534790499809">একটি Kerberos টিকিট রিফ্রেশ করুন</translation> <translation id="5084328598860513926">প্রভিশনিং ফ্লোতে বিঘ্ন ঘটেছে। আবার চেষ্টা করুন অথবা আপনার ডিভাইসের মালিক বা অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন। সমস্যার কোড: <ph name="ERROR_CODE" /></translation> <translation id="5085162214018721575">আপডেটের জন্য চেক করা হচ্ছে</translation> @@ -4422,7 +4417,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" মুছবেন?</translation> <translation id="520621735928254154">সার্টিফিকেটের আমদানি ত্রুটি</translation> <translation id="5206562235913517859">রিটেলার-স্টোর আইডি ABC-1234 ফর্ম্যাটে আছে</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{চুরি হয়ে যাওয়া পাসওয়ার্ড পরিবর্তন করা হয়েছে। আপনার আরও #টি পাসওয়ার্ড চুরি হয়েছে। Chrome আপনাকে এই পাসওয়ার্ড এখনই চেক করতে সাজেস্ট করছে।}one{চুরি হয়ে যাওয়া পাসওয়ার্ড পরিবর্তন করা হয়েছে। আপনার আরও #টি পাসওয়ার্ড চুরি হয়েছে। Chrome আপনাকে এই পাসওয়ার্ড এখনই চেক করতে সাজেস্ট করছে।}other{চুরি হয়ে যাওয়া পাসওয়ার্ড পরিবর্তন করা হয়েছে। আপনার আরও #টি পাসওয়ার্ড চুরি হয়েছে। Chrome আপনাকে এই পাসওয়ার্ডগুলি এখনই চেক করতে সাজেস্ট করছে।}}</translation> <translation id="5207949376430453814">পাঠ্যের কার্সার হাইলাইট করুন</translation> <translation id="520840839826327499">আপনি একটি উপযুক্ত ChromeOS ডিভাইস ব্যবহার করছেন কিনা তা <ph name="SERVICE_NAME" /> দেখতে চায়।</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> যাচাইকরণ টোকেন স্টোর করা হচ্ছে</translation> @@ -6255,7 +6249,6 @@ <translation id="6970861306198150268">আপনি এই সাইটের জন্য আপনার বর্তমান পাসওয়ার্ড সেভ করছেন কিনা দেখুন</translation> <translation id="6972180789171089114">অডিও/ভিডিও</translation> <translation id="6972754398087986839">শুরু করুন</translation> -<translation id="6972887130317925583">চুরি হয়ে যাওয়া পাসওয়ার্ড পরিবর্তন করা হয়েছে। <ph name="SETTINGS" /> থেকে যেকোনও সময় আপনার পাসওয়ার্ড চেক করুন।</translation> <translation id="697312151395002334">পপ-আপ পাঠানো ও রিডাইরেক্ট করার অনুমতি দেওয়া হয়েছে</translation> <translation id="6973611239564315524">Debian 10 (Buster) ভার্সনে আপগ্রেড করার সুবিধা পাওয়া যাচ্ছে</translation> <translation id="69739764870135975">তাছাড়া, Google আপনার ডিফল্ট সার্চ ইঞ্জিন হিসেবে সেট করা থাকলে, আপনি আরও ভাল ও প্রাসঙ্গিক সাজেশন দেখতে পাবেন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 752d62d..6628e5a 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -669,7 +669,6 @@ <translation id="1621984899599015181">Opcijama dijeljenja upravlja vaša organizacija. Neke stavke su možda sakrivene.</translation> <translation id="1622054403950683339">Zanemari WiFi mrežu</translation> <translation id="1623723619460186680">Smanjenje plavog svjetla</translation> -<translation id="1624012933569991823">Postavke</translation> <translation id="1624599281783425761">Neće vam se više prikazivati <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Ovaj fajl je prevelik za vaš uređaj. Pokušajte ga preuzeti na drugom uređaju</translation> <translation id="1627276047960621195">Deskriptori fajlova</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">Koristite jaku lozinku</translation> <translation id="1900305421498694955">Aplikacije iz Google Playa mogu tražiti puni pristup sistemu fajlova za čitanje i zapisivanje fajlova na vašim vanjskim uređajima za pohranu. Fajlovi i folderi koji su kreirani na uređaju vidljivi su svakome ko koristi vanjski disk. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Odaberi &sve</translation> -<translation id="1901396183631570154">Chrome nije uspio sačuvati ove lozinke na vaš Google račun. I dalje ih možete sačuvati na ovom uređaju.</translation> <translation id="1903995858055162096">Ovo nije vaš uređaj? Koristite <ph name="BEGIN_LINK" />način rada za gosta<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-ovi koje posjećujete pohranjuju se na vaš Google račun</translation> <translation id="1905375423839394163">Naziv Chromebook uređaja</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506">Isključite Windows da deinstalirate <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Pošto ste postavili više prekidača, automatsko skeniranje je isključeno.</translation> <translation id="2478176599153288112">Odobrenja medijskog fajla za ekstenziju "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Lozinke nisu sačuvane</translation> <translation id="2480868415629598489">Mijenjanje podataka koje kopirate i zalijepite</translation> <translation id="2482878487686419369">Obavještenja</translation> <translation id="2482895651873876648">Kartica je premještena u grupu <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">Roditeljski nadzor</translation> <translation id="281390819046738856">Zahtjev nije potpisan.</translation> <translation id="2814489978934728345">Zaustavi učitavanje ove stranice</translation> -<translation id="281504910091592009">Prikažite i upravljajte sačuvanim lozinkama u svom <ph name="BEGIN_LINK" />Google računu<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Folder s oznakama</translation> <translation id="2816319641769218778">Da sačuvate lozinke na svoj Google račun, uključite sinhronizaciju.</translation> <translation id="2816628817680324566">Dozvoliti ovoj web lokaciji da identificira vaš sigurnosni ključ?</translation> @@ -4291,7 +4287,6 @@ <translation id="5078638979202084724">Označite sve kartice</translation> <translation id="5078796286268621944">Pogrešan PIN</translation> <translation id="5079010647467150187">Dodaj ugrađeni VPN...</translation> -<translation id="5079950360618752063">Koristite predloženu lozinku</translation> <translation id="508059534790499809">Osvježavanje Kerberos tiketa</translation> <translation id="5084328598860513926">Tok pružanja usluga je prekinut. Pokušajte ponovo ili kontaktirajte vlasnika ili administratora uređaja. Kȏd greške: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Provjera ažuriranja</translation> @@ -4416,7 +4411,6 @@ <translation id="5206215183583316675">Izbrisati potvrdu "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Greška prilikom uvoza potvrde</translation> <translation id="5206562235913517859">ID maloprodavca-trgovine ima format ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Ugrožena lozinka je uspješno promijenjena. Imate još # ugroženu lozinku. Chrome preporučuje da odmah provjerite tu lozinku.}one{Ugrožena lozinka je uspješno promijenjena. Imate još # ugroženu lozinku. Chrome preporučuje da odmah provjerite te lozinke.}few{Ugrožena lozinka je uspješno promijenjena. Imate još # ugrožene lozinke. Chrome preporučuje da odmah provjerite te lozinke.}other{Ugrožena lozinka je uspješno promijenjena. Imate još # ugroženih lozinki. Chrome preporučuje da odmah provjerite te lozinke.}}</translation> <translation id="5207949376430453814">Istakni kursor u tekstu</translation> <translation id="520840839826327499">Usluga <ph name="SERVICE_NAME" /> želi provjeriti koristite li ChromeOS uređaj koji ispunjava uslove.</translation> <translation id="5208548918290612795">Pohranjivanje tokena za autentifikaciju za <ph name="WEB_DRIVE" /></translation> @@ -6249,7 +6243,6 @@ <translation id="6970861306198150268">Vodite računa da pohranite trenutnu lozinku za ovu web lokaciju</translation> <translation id="6972180789171089114">Zvuk/video</translation> <translation id="6972754398087986839">Započnite</translation> -<translation id="6972887130317925583">Ugrožena lozinka je uspješno promijenjena. Otvorite <ph name="SETTINGS" /> da bilo kada provjerite lozinke.</translation> <translation id="697312151395002334">Dozvoljeno je slanje skočnih prozora i korištenje preusmjeravanja</translation> <translation id="6973611239564315524">Dostupna je nadogradnja na Debian 10 (Buster)</translation> <translation id="69739764870135975">Ako je Google vaš zadani pretraživač, vidjet ćete bolje, kontekstualno relevantne prijedloge</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index c1a1b4f..1bb25cf 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">La teva organització gestiona les opcions de compartició. Pot ser que alguns elements estiguin amagats.</translation> <translation id="1622054403950683339">Oblida la xarxa Wi-Fi</translation> <translation id="1623723619460186680">Reducció de la llum blava</translation> -<translation id="1624012933569991823">Configuració</translation> <translation id="1624599281783425761">No tornaràs a veure <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Aquest fitxer és massa gran perquè el teu dispositiu pugui gestionar-lo. Prova de baixar-lo en un altre dispositiu.</translation> <translation id="1627276047960621195">Descriptors dels fitxers</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Utilitza una contrasenya segura</translation> <translation id="1900305421498694955">Pot ser que les aplicacions de Google Play requereixin accés complet al sistema de fitxers per llegir i escriure fitxers en dispositius d'emmagatzematge externs. Qualsevol persona que faci servir la unitat externa podrà veure les carpetes i els fitxers creats al dispositiu. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Selecciona-ho &tot</translation> -<translation id="1901396183631570154">Chrome no ha pogut desar aquestes contrasenyes al teu Compte de Google. Pots continuar desant-les en aquest dispositiu.</translation> <translation id="1903995858055162096">No és el teu dispositiu? Fes servir el <ph name="BEGIN_LINK" />mode de convidat<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Els URL que visites es desen al teu Compte de Google</translation> <translation id="1905375423839394163">Nom del dispositiu Chromebook</translation> @@ -1615,7 +1613,6 @@ <translation id="2476974672882258506">Apaga Windows per desinstal·lar <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Com que has configurat diversos interruptors, la cerca automàtica s'ha desactivat.</translation> <translation id="2478176599153288112">Permisos de fitxer multimèdia per a "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Les contrasenyes no s'han desat</translation> <translation id="2480868415629598489">Modificar les dades que copies i enganxes</translation> <translation id="2482878487686419369">Notificacions</translation> <translation id="2482895651873876648">La pestanya s'ha mogut al grup <ph name="GROUP_NAME" />: <ph name="GROUP_CONTENTS" /></translation> @@ -1977,7 +1974,6 @@ <translation id="2813094189969465044">Controls parentals</translation> <translation id="281390819046738856">La sol·licitud no s'ha pogut signar.</translation> <translation id="2814489978934728345">Atura la càrrega d'aquesta pàgina</translation> -<translation id="281504910091592009">Consulta i gestiona les contrasenyes desades al <ph name="BEGIN_LINK" />Compte de Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Carpeta d'adreces d'interès</translation> <translation id="2816319641769218778">Per desar les contrasenyes al teu Compte de Google, activa la sincronització.</translation> <translation id="2816628817680324566">Vols permetre que aquest lloc web identifiqui la teva clau de seguretat?</translation> @@ -4275,7 +4271,6 @@ <translation id="5078638979202084724">Afegeix totes les pestanyes a les adreces d'interès</translation> <translation id="5078796286268621944">PIN incorrecte</translation> <translation id="5079010647467150187">Afegeix una VPN integrada...</translation> -<translation id="5079950360618752063">Utilitza la contrasenya suggerida</translation> <translation id="508059534790499809">Actualitza un tiquet de Kerberos</translation> <translation id="5084328598860513926">El flux de proveïment s'ha interromput. Torna-ho a provar o contacta amb el propietari o l'administrador del dispositiu. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">S'està comprovant si hi ha actualitzacions</translation> @@ -4400,7 +4395,6 @@ <translation id="5206215183583316675">Vols suprimir "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">S'ha produït un error en importar el certificat</translation> <translation id="5206562235913517859">L'identificador de la botiga té el format ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{La contrasenya en perill s'ha canviat correctament. Tens # contrasenya més en perill. Chrome et recomana que comprovis aquesta contrasenya ara.}other{La contrasenya en perill s'ha canviat correctament. Tens # contrasenyes més en perill. Chrome et recomana que comprovis aquestes contrasenyes ara.}}</translation> <translation id="5207949376430453814">Ressalta la marca d'inserció de text</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> vol comprovar si fas servir un dispositiu Chrome OS apte.</translation> <translation id="5208548918290612795">S'emmagatzemarà el testimoni d'autenticació de: <ph name="WEB_DRIVE" /></translation> @@ -6227,7 +6221,6 @@ <translation id="6970861306198150268">Comprova que estiguis desant la teva contrasenya actual per a aquest lloc web</translation> <translation id="6972180789171089114">Àudio/Vídeo</translation> <translation id="6972754398087986839">Comença</translation> -<translation id="6972887130317925583">La contrasenya en perill s'ha canviat correctament. Pots comprovar les contrasenyes sempre que vulguis a <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Amb permís per enviar finestres emergents i utilitzar redireccions</translation> <translation id="6973611239564315524">Hi ha disponible una actualització a Debian 10 (Buster)</translation> <translation id="69739764870135975">Si Google també és el teu motor de cerca predeterminat, veuràs suggeriments millors i més rellevants per al context</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index fa00f9b..516a8d57 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Možnosti sdílení spravuje vaše organizace. Některé položky mohou být skryty.</translation> <translation id="1622054403950683339">Zapomenout síť Wi-Fi</translation> <translation id="1623723619460186680">Snížení intenzity modrého světla</translation> -<translation id="1624012933569991823">Nastavení</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> už neuvidíte</translation> <translation id="1624863973697515675">Tento soubor je na vaše zařízení příliš velký. Zkuste ho stáhnout do jiného zařízení.</translation> <translation id="1627276047960621195">Deskriptory souborů</translation> @@ -983,7 +982,6 @@ <translation id="1897120393475391208">Použít silné heslo</translation> <translation id="1900305421498694955">Aplikace z Google Play mohou vyžadovat úplný přístup k systému souborů, aby mohly číst a zapisovat soubory na externích úložných zařízeních. Soubory a složky vytvořené na zařízení jsou viditelné pro každého, kdo daný externí disk používá. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Vybrat vše</translation> -<translation id="1901396183631570154">Chrome tato hesla nemohl uložit do vašeho účtu Google. Můžete si je však uložit na tomto zařízení.</translation> <translation id="1903995858055162096">Není to vaše zařízení? Použijte <ph name="BEGIN_LINK" />režim hosta<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Navštívené adresy URL se ukládají do vašeho účtu Google</translation> <translation id="1905375423839394163">Název Chromebooku</translation> @@ -1618,7 +1616,6 @@ <translation id="2476974672882258506">Pokud chcete odinstalovat <ph name="PARALLELS_DESKTOP" />, ukončete Windows.</translation> <translation id="2477065602824695373">Protože jste nastavili několik přepínačů, automatické prohledávání bylo vypnuto.</translation> <translation id="2478176599153288112">Oprávnění souborů médií pro rozšíření <ph name="EXTENSION" /></translation> -<translation id="248003956660572823">Hesla se neuložila</translation> <translation id="2480868415629598489">Upravovat data, která kopírujete a vkládáte</translation> <translation id="2482878487686419369">Oznámení</translation> <translation id="2482895651873876648">Karta byla přesunuta do skupiny <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1980,7 +1977,6 @@ <translation id="2813094189969465044">Rodičovská kontrola</translation> <translation id="281390819046738856">Požadavek nebylo možné podepsat.</translation> <translation id="2814489978934728345">Přerušit načítání této stránky</translation> -<translation id="281504910091592009">Zobrazit a spravovat uložená hesla v <ph name="BEGIN_LINK" />účtu Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Složka záložek</translation> <translation id="2816319641769218778">Chcete-li ukládat hesla na účet Google, zapněte synchronizaci.</translation> <translation id="2816628817680324566">Povolit tomuto webu přístup k vašemu bezpečnostnímu klíči?</translation> @@ -4279,7 +4275,6 @@ <translation id="5078638979202084724">Přidat do záložek všechny karty</translation> <translation id="5078796286268621944">Nesprávný kód PIN</translation> <translation id="5079010647467150187">Přidat vestavěnou VPN…</translation> -<translation id="5079950360618752063">Použít navrhované heslo</translation> <translation id="508059534790499809">Obnovení lístku Kerberos</translation> <translation id="5084328598860513926">Proces nastavení byl přerušen. Zkuste to znovu nebo kontaktujte vlastníka nebo administrátora zařízení. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Kontrola aktualizací</translation> @@ -4405,7 +4400,6 @@ <translation id="5206215183583316675">Smazat certifikát <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Chyba při importu certifikátu</translation> <translation id="5206562235913517859">ID prodejce má formát ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Úspěšně jste změnili prolomené heslo. Máte # další prolomené heslo. Chrome doporučuje toto heslo okamžitě zkontrolovat.}few{Úspěšně jste změnili prolomené heslo. Máte # další prolomená hesla. Chrome doporučuje tato hesla okamžitě zkontrolovat.}many{Úspěšně jste změnili prolomené heslo. Máte # dalšího prolomeného hesla. Chrome doporučuje tato hesla okamžitě zkontrolovat.}other{Úspěšně jste změnili prolomené heslo. Máte # dalších prolomených hesel. Chrome doporučuje tato hesla okamžitě zkontrolovat.}}</translation> <translation id="5207949376430453814">Zvýraznit textový kurzor</translation> <translation id="520840839826327499">Služba <ph name="SERVICE_NAME" /> chce ověřit, zda používáte vhodné zařízení se systémem ChromeOS.</translation> <translation id="5208548918290612795">Ukládání ověřovacího tokenu <ph name="WEB_DRIVE" /></translation> @@ -6234,7 +6228,6 @@ <translation id="6970861306198150268">Dejte pozor, abyste uložili aktuální heslo pro tento web</translation> <translation id="6972180789171089114">Zvuk/video</translation> <translation id="6972754398087986839">Začínáme</translation> -<translation id="6972887130317925583">Úspěšně jste změnili prolomené heslo. Hesla můžete kdykoli zobrazit v <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Povolení zobrazovat vyskakovací okna a používat přesměrování</translation> <translation id="6973611239564315524">Je k dispozici upgrade na Debian 10 (Buster)</translation> <translation id="69739764870135975">Pokud je Google zároveň váš výchozí vyhledávač, budou se zobrazovat lepší, kontextově relevantní návrhy</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 9c0c42c..051bf3093 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -670,7 +670,6 @@ <translation id="1621984899599015181">Mae eich sefydliad yn rheoli opsiynau ar gyfer rhannu. Mae'n bosib y bydd rhai eitemau wedi'u cuddio.</translation> <translation id="1622054403950683339">Anghofio rhwydwaith Wi-Fi</translation> <translation id="1623723619460186680">Golau gwan</translation> -<translation id="1624012933569991823">Gosodiadau</translation> <translation id="1624599281783425761">Ni fyddwch yn gweld <ph name="MERCHANT" /> eto</translation> <translation id="1624863973697515675">Mae'r ffeil hon yn rhy fawr i'ch dyfais ei rheoli. Rhowch gynnig ar lawrlwytho'r ffeil ar ddyfais arall</translation> <translation id="1627276047960621195">Disgrifyddion Ffeiliau</translation> @@ -995,7 +994,6 @@ <translation id="1897120393475391208">Defnyddiwch gyfrinair cryf</translation> <translation id="1900305421498694955">Mae'n bosib y bydd apiau o Google Play yn gofyn am fynediad system ffeiliau llawn i ddarllen ac ysgrifennu ffeiliau ar ddyfeisiau storfa allanol. Mae ffeiliau a ffolderi a grëir ar y ddyfais yn weladwy i unrhyw un sy'n defnyddio'r gyriant allanol. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Dewis &popeth</translation> -<translation id="1901396183631570154">Ni allai Chrome gadw'r cyfrineiriau hyn yn eich Cyfrif Google. Gallwch eu cadw ar y ddyfais hon o hyd.</translation> <translation id="1903995858055162096">Nid eich dyfais chi yw hon? Defnyddiwch y <ph name="BEGIN_LINK" />Modd gwestai<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Mae'r cyfeiriadau URL rydych yn ymweld â nhw wedi'u cadw i'ch Cyfrif Google</translation> <translation id="1905375423839394163">Enw dyfais Chromebook</translation> @@ -1633,7 +1631,6 @@ <translation id="2476974672882258506">Diffoddwch Windows i ddadosod <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Gan eich bod wedi gosod sawl switsh, mae awtosganio wedi'i ddiffodd.</translation> <translation id="2478176599153288112">Caniatadau Ffeil Cyfryngau ar gyfer "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Cyfrineiriau heb eu cadw</translation> <translation id="2480868415629598489">Addasu'r data rydych yn eu copïo a'u gludo</translation> <translation id="2482878487686419369">Hysbysiadau</translation> <translation id="2482895651873876648">Symudodd tab i'r grŵp <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1995,7 +1992,6 @@ <translation id="2813094189969465044">Rheolaethau rhieni</translation> <translation id="281390819046738856">Ni ellid llofnodi'r cais.</translation> <translation id="2814489978934728345">Stopio llwytho'r dudalen hon</translation> -<translation id="281504910091592009">Gweld a rheoli cyfrineiriau sydd wedi'u cadw yn eich <ph name="BEGIN_LINK" />Cyfrif Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Ffolder nodau tudalen</translation> <translation id="2816319641769218778">I gadw cyfrineiriau i'ch Cyfrif Google, trowch gysoni ymlaen.</translation> <translation id="2816628817680324566">Ydych chi am ganiatáu i'r wefan hon adnabod eich allwedd ddiogelwch?</translation> @@ -4295,7 +4291,6 @@ <translation id="5078638979202084724">Creu nod tudalen ar gyfer pob tab</translation> <translation id="5078796286268621944">PIN anghywir</translation> <translation id="5079010647467150187">Ychwanegu VPN integredig...</translation> -<translation id="5079950360618752063">Defnyddiwch y cyfrinair a awgrymir</translation> <translation id="508059534790499809">Ail-lwytho tocyn Kerberos</translation> <translation id="5084328598860513926">Methu â chwblhau'r llif darparu. Rhowch gynnig arall arni neu cysylltwch â pherchennog neu weinyddwr eich dyfais. Cod gwall: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Wrthi'n gwirio am ddiweddariadau</translation> @@ -4420,7 +4415,6 @@ <translation id="5206215183583316675">Dileu "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Gwall Mewnforio Tystysgrif</translation> <translation id="5206562235913517859">Mae rhif adnabod y siop adwerthwr yn y fformat ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Mae gennych # cyfrinair arall sydd wedi'i ddarganfod. Mae Chrome yn argymell gwirio'r cyfrinair hwn ar unwaith.}zero{Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Mae gennych # cyfrinair arall sydd wedi'u darganfod. Mae Chrome yn argymell gwirio'r cyfrineiriau hyn ar unwaith.}two{Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Mae gennych # gyfrinair arall sydd wedi'u darganfod. Mae Chrome yn argymell gwirio'r cyfrineiriau hyn ar unwaith.}few{Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Mae gennych # chyfrinair arall sydd wedi'u darganfod. Mae Chrome yn argymell gwirio'r cyfrineiriau hyn ar unwaith.}many{Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Mae gennych # chyfrinair arall sydd wedi'u darganfod. Mae Chrome yn argymell gwirio'r cyfrineiriau hyn ar unwaith.}other{Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Mae gennych # cyfrinair arall sydd wedi'u darganfod. Mae Chrome yn argymell gwirio'r cyfrineiriau hyn ar unwaith.}}</translation> <translation id="5207949376430453814">Amlygu caret testun</translation> <translation id="520840839826327499">Mae <ph name="SERVICE_NAME" /> eisiau gwirio a ydych yn defnyddio dyfais ChromeOS cymwys.</translation> <translation id="5208548918290612795">Wrthi'n storio Tocyn Dilysu <ph name="WEB_DRIVE" /></translation> @@ -6256,7 +6250,6 @@ <translation id="6970861306198150268">Gwnewch yn siŵr eich bod yn cadw'ch cyfrinair presennol ar gyfer y wefan hon</translation> <translation id="6972180789171089114">Sain/Fideo</translation> <translation id="6972754398087986839">Cychwyn arni</translation> -<translation id="6972887130317925583">Wedi newid y cyfrinair a ddarganfuwyd yn llwyddiannus. Gwiriwch eich cyfrineiriau unrhyw bryd yn y <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Caniateir i anfon ffenestri naid ac i ddefnyddio ailgyfeiriadau</translation> <translation id="6973611239564315524">Mae uwchraddiad i Debian 10 (Buster) ar gael</translation> <translation id="69739764870135975">Os mai Google yw eich peiriant chwilio diofyn hefyd, byddwch yn gweld awgrymiadau gwell sy'n berthnasol yn eu cyd-destun</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index c387f77..5b9a74b 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">Delingsindstilingerne administreres af din organisation. Nogle elementer er muligvis skjult.</translation> <translation id="1622054403950683339">Glem Wi-Fi-netværk</translation> <translation id="1623723619460186680">Reduktion af blåt lys</translation> -<translation id="1624012933569991823">Indstillinger</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> vises ikke igen</translation> <translation id="1624863973697515675">Denne fil er for stor til, at den kan administreres af din enhed. Prøv at downloade den på en anden enhed</translation> <translation id="1627276047960621195">Filbeskrivelser</translation> @@ -993,7 +992,6 @@ <translation id="1897120393475391208">Brug en stærk adgangskode</translation> <translation id="1900305421498694955">Apps fra Google Play skal muligvis have fuld adgang til filsystemet for at læse og skrive filer på eksterne lagerenheder. De filer og mapper, som oprettes på enheden, er synlige for alle, der bruger det eksterne drev. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Vælg &alle</translation> -<translation id="1901396183631570154">Chrome kunne ikke gemme disse adgangskoder på din Google-konto. Du kan stadig gemme dem på denne enhed.</translation> <translation id="1903995858055162096">Er det ikke din enhed? Brug <ph name="BEGIN_LINK" />Gæstetilstand<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">De webadresser, du besøger, gemmes på din Google-konto</translation> <translation id="1905375423839394163">Navn på Chromebook-enhed</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">Luk Windows ned for at afinstallere <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Automatisk scanning er blevet deaktiveret, da du har konfigureret flere kontakter.</translation> <translation id="2478176599153288112">Mediefiltilladelser for "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Adgangskoderne blev ikke gemt</translation> <translation id="2480868415629598489">Redigere data, du kopierer og indsætter</translation> <translation id="2482878487686419369">Notifikationer</translation> <translation id="2482895651873876648">Fanen blev flyttet til gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Børnesikring</translation> <translation id="281390819046738856">Anmodningen kunne ikke signeres.</translation> <translation id="2814489978934728345">Stop indlæsning af denne side</translation> -<translation id="281504910091592009">Se og administrer gemte adgangskoder på din <ph name="BEGIN_LINK" />Google-konto<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Bogmærkemappe</translation> <translation id="2816319641769218778">Du skal aktivere synkronisering for at gemme adgangskoder på din Google-konto.</translation> <translation id="2816628817680324566">Vil du tillade, at dette website identificerer din sikkerhedsnøgle?</translation> @@ -4293,7 +4289,6 @@ <translation id="5078638979202084724">Tilføj alle faner som bogmærker</translation> <translation id="5078796286268621944">Forkert pinkode</translation> <translation id="5079010647467150187">Tilføj indbygget VPN…</translation> -<translation id="5079950360618752063">Brug den foreslåede adgangskode</translation> <translation id="508059534790499809">Opdater en Kerberos-billet</translation> <translation id="5084328598860513926">Provisioneringsflowet blev afbrudt. Prøv igen, eller kontakt enhedens ejer eller administrator. Fejlkode: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Søger efter opdateringer</translation> @@ -4418,7 +4413,6 @@ <translation id="5206215183583316675">Vil du slette "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Fejl ved import af certifikat</translation> <translation id="5206562235913517859">Forhandler-id'et skal angives i formatet ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Den kompromitterede adgangskode blev ændret. Du har # anden kompromitteret adgangskode. Chrome anbefaler, at du tjekker denne adgangskode nu.}one{Den kompromitterede adgangskode blev ændret. Du har # anden kompromitteret adgangskode. Chrome anbefaler, at du tjekker denne adgangskode nu.}other{Den kompromitterede adgangskode blev ændret. Du har # andre kompromitterede adgangskoder. Chrome anbefaler, at du tjekker disse adgangskoder nu.}}</translation> <translation id="5207949376430453814">Fremhæv tekstmarkør</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> vil gerne tjekke, om du bruger en kvalificeret Chrome OS-enhed.</translation> <translation id="5208548918290612795">Gemmer godkendelsestoken for <ph name="WEB_DRIVE" /></translation> @@ -6249,7 +6243,6 @@ <translation id="6970861306198150268">Sørg for at gemme din aktuelle adgangskode til dette website</translation> <translation id="6972180789171089114">Lyd/video</translation> <translation id="6972754398087986839">Kom godt i gang</translation> -<translation id="6972887130317925583">Den kompromitterede adgangskode er blevet ændret. Du kan til enhver tid tjekke dine adgangskoder i <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Har tilladelse til at sende pop op-vinduer og bruge omdirigeringer</translation> <translation id="6973611239564315524">Der er en tilgængelig opdatering til Debian 10 (Buster)</translation> <translation id="69739764870135975">Hvis Google også er din standardsøgemaskine, får du bedre og mere relevante forslag</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index dd6b160b..28071846 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -661,7 +661,6 @@ <translation id="1621984899599015181">Freigabeoptionen werden von deiner Organisation verwaltet. Einige Elemente sind möglicherweise ausgeblendet.</translation> <translation id="1622054403950683339">WLAN löschen</translation> <translation id="1623723619460186680">Reduzierung von blauem Licht</translation> -<translation id="1624012933569991823">Einstellungen</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> wird nicht mehr angezeigt</translation> <translation id="1624863973697515675">Diese Datei ist zu groß für dein Gerät. Du kannst versuchen, sie auf einem anderen Gerät herunterzuladen.</translation> <translation id="1627276047960621195">Dateideskriptoren</translation> @@ -976,7 +975,6 @@ <translation id="1897120393475391208">Starkes Passwort verwenden</translation> <translation id="1900305421498694955">Google Play-Apps benötigen möglicherweise vollständigen Zugriff auf dein Dateisystem, um auf externen Speichergeräten Dateien lesen und schreiben zu können. Dateien und Ordner, die auf dem Gerät erstellt werden, sind für alle Nutzer des externen Speichergeräts sichtbar. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Alles auswählen</translation> -<translation id="1901396183631570154">Chrome konnte diese Passwörter nicht in deinem Google-Konto speichern. Du kannst sie aber auf diesem Gerät speichern.</translation> <translation id="1903995858055162096">Nicht dein Gerät? <ph name="BEGIN_LINK" />Gastmodus<ph name="END_LINK" /> verwenden.</translation> <translation id="1904580727789512086">Die von dir besuchten URLs werden in deinem Google-Konto gespeichert</translation> <translation id="1905375423839394163">Name des Chromebooks</translation> @@ -1611,7 +1609,6 @@ <translation id="2476974672882258506">Bitte Windows herunterfahren, um <ph name="PARALLELS_DESKTOP" /> zu deinstallieren.</translation> <translation id="2477065602824695373">Da du mehrere Schalter eingerichtet hast, wurde der automatische Scan deaktiviert.</translation> <translation id="2478176599153288112">Mediendatei-Berechtigungen für "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Passwörter nicht gespeichert</translation> <translation id="2480868415629598489">Daten ändern, die du kopierst und einfügst</translation> <translation id="2482878487686419369">Benachrichtigungen</translation> <translation id="2482895651873876648">Tab wurde in die folgende Gruppe verschoben: <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1972,7 +1969,6 @@ <translation id="2813094189969465044">Jugendschutzeinstellungen</translation> <translation id="281390819046738856">Die Anfrage konnte nicht signiert werden.</translation> <translation id="2814489978934728345">Seite nicht weiter laden</translation> -<translation id="281504910091592009">Gespeicherte Passwörter in meinem <ph name="BEGIN_LINK" />Google-Konto<ph name="END_LINK" /> ansehen und verwalten</translation> <translation id="2815693974042551705">Lesezeichenordner</translation> <translation id="2816319641769218778">Aktiviere die Synchronisierung, um Passwörter in deinem Google-Konto zu speichern.</translation> <translation id="2816628817680324566">Zulassen, dass diese Website deinen Sicherheitsschlüssel identifiziert?</translation> @@ -4269,7 +4265,6 @@ <translation id="5078638979202084724">Alle Tabs als Lesezeichen speichern</translation> <translation id="5078796286268621944">Falsche PIN</translation> <translation id="5079010647467150187">Integriertes VPN hinzufügen…</translation> -<translation id="5079950360618752063">Vorgeschlagenes Passwort verwenden</translation> <translation id="508059534790499809">Kerberos-Ticket aktualisieren</translation> <translation id="5084328598860513926">Bereitstellung wurde unterbrochen. Bitte noch einmal versuchen oder an den Eigentümer des Geräts oder an den Administrator wenden. Fehlercode: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Suche nach Updates...</translation> @@ -4394,7 +4389,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" löschen?</translation> <translation id="520621735928254154">Fehler beim Importieren des Zertifikats</translation> <translation id="5206562235913517859">Geschäfts-ID des Händlers hat das Format „ABC-1234“</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Das gehackte Passwort wurde erfolgreich geändert. Du hast # weiteres gehacktes Passwort. Chrome empfiehlt, dieses Passwort jetzt zu prüfen.}other{Das gehackte Passwort wurde erfolgreich geändert. Du hast # weitere gehackte Passwörter. Chrome empfiehlt, diese Passwörter jetzt zu prüfen.}}</translation> <translation id="5207949376430453814">Textcursor hervorheben</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> möchte überprüfen, ob du ein unterstütztes Chrome OS-Gerät verwendest.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" />-Authentifizierungs-Token speichern</translation> @@ -6215,7 +6209,6 @@ <translation id="6970861306198150268">Speichere dein aktuelles Passwort für diese Website</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Erste Schritte</translation> -<translation id="6972887130317925583">Das gehackte Passwort wurde erfolgreich geändert. Du kannst deine Passwörter jederzeit in den <ph name="SETTINGS" /> prüfen.</translation> <translation id="697312151395002334">Dürfen Pop-ups senden und Weiterleitungen verwenden</translation> <translation id="6973611239564315524">Ein Upgrade auf Debian 10 (Buster) ist verfügbar</translation> <translation id="69739764870135975">Wenn Google als Standardsuchmaschine festgelegt ist, siehst du bessere und relevantere Vorschläge</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 1dc7e3a..1b268cc8 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Η διαχείριση των επιλογών κοινοποίησης πραγματοποιείται από τον οργανισμό σας. Ορισμένα στοιχεία ενδέχεται να είναι κρυφά.</translation> <translation id="1622054403950683339">Διαγραφή δικτύου Wi-Fi</translation> <translation id="1623723619460186680">Μείωση μπλε φωτός</translation> -<translation id="1624012933569991823">Ρυθμίσεις</translation> <translation id="1624599281783425761">Δεν θα δείτε ξανά τον έμπορο <ph name="MERCHANT" />.</translation> <translation id="1624863973697515675">Αυτό το αρχείο είναι πολύ μεγάλο για να το διαχειριστεί η συσκευή σας. Δοκιμάστε να το κατεβάσετε σε άλλη συσκευή.</translation> <translation id="1627276047960621195">Περιγραφές αρχείων</translation> @@ -993,7 +992,6 @@ <translation id="1897120393475391208">Χρήση ισχυρού κωδικού πρόσβασης</translation> <translation id="1900305421498694955">Οι εφαρμογές από το Google Play μπορεί να απαιτούν πλήρη πρόσβαση στο σύστημα αρχείων για την ανάγνωση και την εγγραφή αρχείων σε εξωτερικές συσκευές αποθηκευτικού χώρου. Τα αρχεία και οι φάκελοι που δημιουργούνται στη συσκευή είναι ορατά σε οποιονδήποτε χρησιμοποιεί την εξωτερική μονάδα δίσκου. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Επιλογή όλ&ων</translation> -<translation id="1901396183631570154">Το Chrome δεν κατάφερε να αποθηκεύσει αυτούς τους κωδικούς πρόσβασης στον Λογαριασμό σας Google. Μπορείτε ακόμη να τους αποθηκεύσετε σε αυτήν τη συσκευή.</translation> <translation id="1903995858055162096">Δεν είναι η συσκευή σας; Χρησιμοποιήστε την <ph name="BEGIN_LINK" />Κατάσταση επισκέπτη<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Τα URL που επισκέπτεστε αποθηκεύονται στον Λογαριασμό σας Google.</translation> <translation id="1905375423839394163">Όνομα συσκευής Chromebook</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">Τερματίστε τα Windows για την απεγκατάσταση του <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Καθώς ρυθμίσατε πολλούς διακόπτες, η αυτόματη σάρωση έχει απενεργοποιηθεί.</translation> <translation id="2478176599153288112">Άδειες αρχείων πολυμέσων για την επέκταση "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Οι κωδικοί πρόσβασης δεν αποθηκεύτηκαν</translation> <translation id="2480868415629598489">Τροποποίηση των δεδομένων που αντιγράφετε και επικολλάτε</translation> <translation id="2482878487686419369">Ειδοποιήσεις</translation> <translation id="2482895651873876648">Η καρτέλα μεταφέρθηκε στην ομάδα <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Γονικοί έλεγχοι</translation> <translation id="281390819046738856">Δεν ήταν δυνατή η έγκριση του αιτήματος.</translation> <translation id="2814489978934728345">Διακοπή φόρτωσης αυτής της σελίδας</translation> -<translation id="281504910091592009">Προβολή και διαχείριση αποθηκευμένων κωδικών πρόσβασης στον <ph name="BEGIN_LINK" />Λογαριασμό σας Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Φάκελος σελιδοδεικτών</translation> <translation id="2816319641769218778">Για να αποθηκεύσετε κωδικούς πρόσβασης στον Λογαριασμό σας Google, ενεργοποιήστε τον συγχρονισμό.</translation> <translation id="2816628817680324566">Να επιτραπεί σε αυτόν τον ιστότοπο η ανάγνωση του κλειδιού ασφαλείας σας;</translation> @@ -4294,7 +4290,6 @@ <translation id="5078638979202084724">Δημιουργία σελιδοδείκτη για όλες τις καρτέλες</translation> <translation id="5078796286268621944">Εσφαλμένο PIN</translation> <translation id="5079010647467150187">Προσθήκη ενσωματωμένου VPN…</translation> -<translation id="5079950360618752063">Χρήση προτεινόμενου κωδικού πρόσβασης</translation> <translation id="508059534790499809">Ανανέωση ενός εισιτηρίου Kerberos</translation> <translation id="5084328598860513926">Η ροή παροχής διακόπηκε. Δοκιμάστε ξανά ή επικοινωνήστε με τον κάτοχο ή τον διαχειριστή της συσκευής σας. Κωδικός σφάλματος: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Έλεγχος για ενημερώσεις</translation> @@ -4420,7 +4415,6 @@ <translation id="5206215183583316675">Να διαγραφεί το "<ph name="CERTIFICATE_NAME" />";</translation> <translation id="520621735928254154">Σφάλμα εισαγωγής πιστοποιητικού</translation> <translation id="5206562235913517859">Η μορφή του αναγνωριστικού καταστήματος λιανικής είναι ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Ο παραβιασμένος κωδικός πρόσβασης άλλαξε με επιτυχία. Έχετε ακόμη # παραβιασμένο κωδικό πρόσβασης. Το Chrome προτείνει να ελέγξετε άμεσα αυτόν τον κωδικό πρόσβασης.}other{Ο παραβιασμένος κωδικός πρόσβασης άλλαξε με επιτυχία. Έχετε ακόμη # παραβιασμένους κωδικούς πρόσβασης. Το Chrome προτείνει να ελέγξετε άμεσα αυτούς τους κωδικούς πρόσβασης.}}</translation> <translation id="5207949376430453814">Επισήμανση δρομέα κειμένου</translation> <translation id="520840839826327499">Η υπηρεσία <ph name="SERVICE_NAME" /> θέλει να ελέγξει εάν χρησιμοποιείτε μια κατάλληλη συσκευή Chrome OS.</translation> <translation id="5208548918290612795">Αποθήκευση διακριτικού ελέγχου ταυτότητας <ph name="WEB_DRIVE" /></translation> @@ -6250,7 +6244,6 @@ <translation id="6970861306198150268">Βεβαιωθείτε ότι αποθηκεύετε τον τρέχοντα κωδικό πρόσβασής σας για αυτόν τον ιστότοπο</translation> <translation id="6972180789171089114">Ήχος/Βίντεο</translation> <translation id="6972754398087986839">Έναρξη</translation> -<translation id="6972887130317925583">Ο παραβιασμένος κωδικός πρόσβασης άλλαξε με επιτυχία. Ελέγξτε ανά πάσα στιγμή τους κωδικούς πρόσβασής σας στις <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Επιτρέπεται να αποστέλλουν αναδυόμενα παράθυρα και να χρησιμοποιούν ανακατευθύνσεις</translation> <translation id="6973611239564315524">Υπάρχει διαθέσιμη αναβάθμιση σε Debian 10 (Buster)</translation> <translation id="69739764870135975">Εάν το Google είναι και η προεπιλεγμένη μηχανή αναζήτησης, θα βλέπετε καλύτερες προτάσεις που είναι σχετικές με τα συμφραζόμενα.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 639c54b..b7cc423 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Options for sharing are managed by your organisation. Some items may be hidden.</translation> <translation id="1622054403950683339">Forget Wi-Fi network</translation> <translation id="1623723619460186680">Blue light reduction</translation> -<translation id="1624012933569991823">Settings</translation> <translation id="1624599281783425761">You won't see <ph name="MERCHANT" /> again</translation> <translation id="1624863973697515675">This file is too big for your device to manage. Try to download it on another device</translation> <translation id="1627276047960621195">File Descriptors</translation> @@ -993,7 +992,6 @@ <translation id="1897120393475391208">Use strong password</translation> <translation id="1900305421498694955">Apps from Google Play may require full file system access to read and write files on external storage devices. Files and folders created on the device are visible to anyone who uses the external drive. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Select &all</translation> -<translation id="1901396183631570154">Chrome couldn't save these passwords in your Google Account. You can still save them on this device.</translation> <translation id="1903995858055162096">Not your device? Use <ph name="BEGIN_LINK" />guest mode<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">The URLs that you visit are saved to your Google Account</translation> <translation id="1905375423839394163">Chromebook device name</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">Shut down Windows to uninstall <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Since you set up multiple switches, auto-scan has been turned off.</translation> <translation id="2478176599153288112">Media-File Permissions for "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Passwords not saved</translation> <translation id="2480868415629598489">Modify data that you copy and paste</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2482895651873876648">Tab moved into group <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Parental controls</translation> <translation id="281390819046738856">Request could not be signed.</translation> <translation id="2814489978934728345">Stop loading this page</translation> -<translation id="281504910091592009">View and manage saved passwords in your <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Bookmark folder</translation> <translation id="2816319641769218778">To save passwords to your Google account, turn on sync.</translation> <translation id="2816628817680324566">Allow this site to identify your security key?</translation> @@ -2571,6 +2567,7 @@ <translation id="3406290648907941085">Allowed to use virtual reality devices and data</translation> <translation id="3406396172897554194">Search by language or input name</translation> <translation id="3406605057700382950">&Show bookmarks bar</translation> +<translation id="3408849592677950451">{NUM_PASSWORDS,plural, =1{1 password imported to Google Password Manager for <ph name="USER_EMAIL" />}other{{NUM_PASSWORDS} passwords imported to Google Password Manager for <ph name="USER_EMAIL" />}}</translation> <translation id="3409785640040772790">Maps</translation> <translation id="3412265149091626468">Jump to Selection</translation> <translation id="3413122095806433232">CA Issuers: <ph name="LOCATION" /></translation> @@ -3755,6 +3752,7 @@ <translation id="4541123282641193691">Couldn't verify your account. Please try again or restart your Chromebook.</translation> <translation id="4541662893742891060">Unable to connect to this profile. For technical support, please contact your operator.</translation> <translation id="4541706525461326392">Removing profile. This may take a few minutes.</translation> +<translation id="4542332958571335077">{NUM_PASSWORDS,plural, =1{1 password imported to Google Password Manager on this device}other{{NUM_PASSWORDS} passwords imported to Google Password Manager on this device}}</translation> <translation id="4542520061254486227">Read your data on <ph name="WEBSITE_1" /> and <ph name="WEBSITE_2" /></translation> <translation id="4543778593405494224">Certificate manager</translation> <translation id="4544174279960331769">Default blue avatar</translation> @@ -4294,7 +4292,6 @@ <translation id="5078638979202084724">Bookmark all tabs</translation> <translation id="5078796286268621944">Incorrect PIN</translation> <translation id="5079010647467150187">Add built-in VPN…</translation> -<translation id="5079950360618752063">Use suggested password</translation> <translation id="508059534790499809">Refresh a Kerberos ticket</translation> <translation id="5084328598860513926">Provisioning flow was interrupted. Please try again or contact your device owner or administrator. Error code: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Checking for updates</translation> @@ -4420,7 +4417,6 @@ <translation id="5206215183583316675">Delete "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Certificate import error</translation> <translation id="5206562235913517859">Retailer-store ID is ABC-1234 format</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Successfully changed the compromised password. You have # more compromised password. Chrome recommends checking this password now.}other{Successfully changed the compromised password. You have # more compromised passwords. Chrome recommends checking these passwords now.}}</translation> <translation id="5207949376430453814">Highlight text caret</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> wants to check if you are using an eligible Chrome OS device.</translation> <translation id="5208548918290612795">Storing <ph name="WEB_DRIVE" /> authentication token</translation> @@ -6244,11 +6240,11 @@ <translation id="6968288415730398122">Enter your password to configure screen lock</translation> <translation id="6969047215179982698">Turn off Nearby Share</translation> <translation id="6970480684834282392">Startup type</translation> +<translation id="6970543303783413625">Can't import passwords. You can only import up to <ph name="COUNT" /> passwords at a time.</translation> <translation id="6970856801391541997">Print Specific Pages</translation> <translation id="6970861306198150268">Make sure that you're saving your current password for this site</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Get started</translation> -<translation id="6972887130317925583">Successfully changed the compromised password. Check your passwords at any time in <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Allowed to send pop-ups and use redirects</translation> <translation id="6973611239564315524">An upgrade to Debian 10 (Buster) is available</translation> <translation id="69739764870135975">If Google is also your default search engine, you'll see better, contextually relevant suggestions</translation> @@ -6476,6 +6472,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Exit page}other{Exit pages}}</translation> <translation id="7207457272187520234">Send usage and diagnostic data. This device is currently automatically sending diagnostic, device and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This setting is enforced by the owner. If your additional Web & App Activity setting is turned on, this data may be saved to your Google Account.</translation> <translation id="7207631048330366454">Search apps</translation> +<translation id="7210471695184432500">To import passwords to Google Password Manager on this device, select a CSV file</translation> <translation id="7210499381659830293">Extension printers</translation> <translation id="7211783048245131419">No switch has been assigned yet</translation> <translation id="7212097698621322584">Enter your current PIN to change it. If you don’t know your PIN, you’ll need to reset the security key, then create a new PIN.</translation> @@ -7534,6 +7531,7 @@ <translation id="8206859287963243715">Mobile</translation> <translation id="8208216423136871611">Don't save</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{New notification}other{# new notifications}}</translation> +<translation id="821119981794423735">To import passwords to Google Password Manager for <ph name="USER_EMAIL" />, select a CSV file</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Download is in progress}other{Downloads are in progress}}</translation> <translation id="8213449224684199188">Photo mode entered</translation> <translation id="8214489666383623925">Open File...</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index e77a970e..6420468 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -661,7 +661,6 @@ <translation id="1621984899599015181">Tu organización administra las opciones de uso compartido. Es posible que algunos elementos estén ocultos.</translation> <translation id="1622054403950683339">Olvidar la red Wi-Fi</translation> <translation id="1623723619460186680">Reducción de la luz azul</translation> -<translation id="1624012933569991823">Configuración</translation> <translation id="1624599281783425761">No se volverá a mostrar <ph name="MERCHANT" />.</translation> <translation id="1624863973697515675">Este archivo es demasiado grande para que tu dispositivo pueda administrarlo. Intenta descargarlo en otro dispositivo.</translation> <translation id="1627276047960621195">Descriptores de archivos</translation> @@ -977,7 +976,6 @@ <translation id="1897120393475391208">Usar una contraseña segura</translation> <translation id="1900305421498694955">Es posible que las apps de Google Play necesiten acceder a todo el sistema de archivos para leer y escribir archivos en dispositivos externos de almacenamiento. Cualquier persona que use la unidad externa podrá ver los archivos y carpetas creados en este dispositivo. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Seleccionar &todo</translation> -<translation id="1901396183631570154">Chrome no pudo guardar estas contraseñas en tu Cuenta de Google. De todos modos puedes guardarlas en este dispositivo.</translation> <translation id="1903995858055162096">¿No es tu dispositivo? Usa el <ph name="BEGIN_LINK" />Modo de invitado<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Las URL que visitas se guardan en tu Cuenta de Google</translation> <translation id="1905375423839394163">Nombre de la Chromebook</translation> @@ -1612,7 +1610,6 @@ <translation id="2476974672882258506">Para desinstalar <ph name="PARALLELS_DESKTOP" />, debes cerrar Windows.</translation> <translation id="2477065602824695373">Dado que configuraste varios interruptores, se desactivó el escaneo automático.</translation> <translation id="2478176599153288112">Permisos de archivo de medios para "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">No se guardaron las contraseñas</translation> <translation id="2480868415629598489">Modificar los datos copiados y pegados</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2482895651873876648">Se movió la pestaña al grupo <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1974,7 +1971,6 @@ <translation id="2813094189969465044">Controles parentales</translation> <translation id="281390819046738856">La solicitud no se pudo firmar.</translation> <translation id="2814489978934728345">Interrumpir la carga de esta página</translation> -<translation id="281504910091592009">Ver y administrar las contraseñas guardadas en tu <ph name="BEGIN_LINK" />cuenta de Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Carpeta de favoritos</translation> <translation id="2816319641769218778">Para guardar contraseñas en tu Cuenta de Google, activa la sincronización.</translation> <translation id="2816628817680324566">¿Quieres permitir que este sitio identifique tu llave de seguridad?</translation> @@ -4273,7 +4269,6 @@ <translation id="5078638979202084724">Agregar a favoritos todas las pestañas</translation> <translation id="5078796286268621944">Número de PIN incorrecto</translation> <translation id="5079010647467150187">Agregar VPN integrada…</translation> -<translation id="5079950360618752063">Usar la contraseña sugerida</translation> <translation id="508059534790499809">Actualizar un ticket de Kerberos</translation> <translation id="5084328598860513926">Se interrumpió el flujo de aprovisionamiento. Vuelve a intentarlo o comunícate con el administrador o propietario de tu dispositivo. Código de error: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Buscando actualizaciones...</translation> @@ -4398,7 +4393,6 @@ <translation id="5206215183583316675">¿Deseas borrar el certificado "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Error en la importación de certificado</translation> <translation id="5206562235913517859">La ID de la tienda minorista está en formato ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Cambiaste correctamente la contraseña hackeada. Tienes # contraseña hackeada más. Chrome te recomienda revisar esta contraseña ahora.}other{Cambiaste correctamente la contraseña hackeada. Tienes # contraseñas hackeadas más. Chrome te recomienda revisar estas contraseñas ahora.}}</translation> <translation id="5207949376430453814">Destacar el símbolo de intercalación de texto</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> quiere comprobar si estás usando un dispositivo apto para Chrome OS.</translation> <translation id="5208548918290612795">Almacenamiento del token de autenticación de <ph name="WEB_DRIVE" /></translation> @@ -6226,7 +6220,6 @@ <translation id="6970861306198150268">Asegúrate de guardar la contraseña actual para este sitio</translation> <translation id="6972180789171089114">Audio/video</translation> <translation id="6972754398087986839">Comenzar</translation> -<translation id="6972887130317925583">Cambiaste correctamente la contraseña hackeada. Puedes revisar las contraseñas en cualquier momento, en <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Puede enviar ventanas emergentes y usar redireccionamientos</translation> <translation id="6973611239564315524">Hay disponible una actualización a Debian 10 (Buster)</translation> <translation id="69739764870135975">Si Google también es tu motor de búsqueda predeterminado, verás sugerencias mejores y relevantes según el contexto</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index dd1dd14..aeb234c1 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Las opciones de compartir las gestiona tu organización. Es posible que se oculten algunos elementos.</translation> <translation id="1622054403950683339">Olvidar red Wi-Fi</translation> <translation id="1623723619460186680">Reducción de luz azul</translation> -<translation id="1624012933569991823">Configuración</translation> <translation id="1624599281783425761">No volverás a ver <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Este archivo es demasiado grande para que lo gestione tu dispositivo. Prueba a descargarlo en otro dispositivo.</translation> <translation id="1627276047960621195">Descriptores de archivo</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Usar contraseña segura</translation> <translation id="1900305421498694955">Es posible que las aplicaciones de Google Play necesiten acceso completo al sistema de archivos para leer y escribir archivos en dispositivos de almacenamiento externo. Los usuarios de la unidad externa podrán ver los archivos y las carpetas que se hayan creado en el dispositivo. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Seleccionar &todo</translation> -<translation id="1901396183631570154">Chrome no ha podido guardar estas contraseñas en tu cuenta de Google. Sin embargo, puedes guardarlas en este dispositivo.</translation> <translation id="1903995858055162096">¿No es tu dispositivo? Usa el <ph name="BEGIN_LINK" />Modo Invitado<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Las URLs que visitas se guardan en tu cuenta de Google</translation> <translation id="1905375423839394163">Nombre del dispositivo Chromebook</translation> @@ -1616,7 +1614,6 @@ <translation id="2476974672882258506">Apaga Windows para desinstalar <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Como has configurado varios interruptores, se ha desactivado la búsqueda automática.</translation> <translation id="2478176599153288112">Permisos de archivos multimedia para "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">No se han guardado las contraseñas</translation> <translation id="2480868415629598489">Modificar los datos que se copian y se pegan</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2482895651873876648">Pestaña movida al grupo <ph name="GROUP_NAME" /> (<ph name="GROUP_CONTENTS" />)</translation> @@ -1978,7 +1975,6 @@ <translation id="2813094189969465044">Controles parentales</translation> <translation id="281390819046738856">No se ha podido firmar la solicitud</translation> <translation id="2814489978934728345">Interrumpir la carga de esta página</translation> -<translation id="281504910091592009">Consulta y gestiona las contraseñas guardadas en tu <ph name="BEGIN_LINK" />cuenta de Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Carpeta de marcadores</translation> <translation id="2816319641769218778">Para guardar contraseñas en tu cuenta de Google, activa la sincronización.</translation> <translation id="2816628817680324566">¿Permitir que este sitio vea tu llave de seguridad?</translation> @@ -4276,7 +4272,6 @@ <translation id="5078638979202084724">Añadir todas las pestañas a marcadores</translation> <translation id="5078796286268621944">PIN incorrecto</translation> <translation id="5079010647467150187">Añadir VPN integrada...</translation> -<translation id="5079950360618752063">Usar contraseña sugerida</translation> <translation id="508059534790499809">Actualizar un ticket de Kerberos</translation> <translation id="5084328598860513926">Se ha interrumpido el flujo de configuración. Vuelve a intentarlo o ponte en contacto con el propietario o el administrador del dispositivo. Código de error: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Buscando actualizaciones...</translation> @@ -4401,7 +4396,6 @@ <translation id="5206215183583316675">¿Eliminar el certificado <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Error al importar el certificado</translation> <translation id="5206562235913517859">El formato del ID de la tienda es ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Contraseña vulnerada cambiada correctamente. Tienes # contraseña vulnerada más. Chrome te recomienda que compruebes esta contraseña ahora.}other{Contraseña vulnerada cambiada correctamente. Tienes # contraseñas vulneradas más. Chrome te recomienda que compruebes estas contraseñas ahora.}}</translation> <translation id="5207949376430453814">Resaltar el símbolo de intercalación del texto</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> quiere comprobar si estás utilizando un dispositivo ChromeOS apto.</translation> <translation id="5208548918290612795">Almacenar token de autenticación de <ph name="WEB_DRIVE" /></translation> @@ -6229,7 +6223,6 @@ <translation id="6970861306198150268">Asegúrate de guardar tu contraseña actual para este sitio</translation> <translation id="6972180789171089114">Audio/Vídeo</translation> <translation id="6972754398087986839">Empezar</translation> -<translation id="6972887130317925583">Contraseña vulnerada cambiada correctamente. Comprueba tus contraseñas en cualquier momento en <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Puede enviar ventanas emergentes y usar redirecciones</translation> <translation id="6973611239564315524">Actualización a Debian 10 (Buster) disponible</translation> <translation id="69739764870135975">Si Google también es tu buscador predeterminado, verás mejores sugerencias y más relevantes contextualmente</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index b7d676f..9d2eed5 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Jagamisvalikuid haldab teie organisatsioon. Mõni üksus võib olla peidetud.</translation> <translation id="1622054403950683339">WiFi-võrgu unustamine</translation> <translation id="1623723619460186680">Sinise valguse vähendamine</translation> -<translation id="1624012933569991823">Seaded</translation> <translation id="1624599281783425761">Te ei näe enam kaupmeest <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">See fail on teie seadme jaoks liiga suur. Proovige seda teises seadmes alla laadida</translation> <translation id="1627276047960621195">Faili deskriptorid</translation> @@ -983,7 +982,6 @@ <translation id="1897120393475391208">Kasutage tugevat parooli</translation> <translation id="1900305421498694955">Google Playst pärinevad rakendused võivad vajada täielikku juurdepääsu failisüsteemile, et välistelt salvestusseadmetelt faile lugeda ja neid sinna kirjutada. Selles seadmes loodud failid ja kaustad on nähtavad kõigile, kes välist ketast kasutavad. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Vali &kõik</translation> -<translation id="1901396183631570154">Chrome'il ei õnnestunud neid paroole teie Google'i kontole salvestada. Saate need siiski salvestada sellesse seadmesse.</translation> <translation id="1903995858055162096">Kas see pole teie seade? Kasutage <ph name="BEGIN_LINK" />külalisrežiimi<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Teie külastatavad URL-id salvestatakse teie Google'i kontole</translation> <translation id="1905375423839394163">Chromebooki seadme nimi</translation> @@ -1621,7 +1619,6 @@ <translation id="2476974672882258506">Tarkvara <ph name="PARALLELS_DESKTOP" /> desinstallimiseks lülitage Windows välja.</translation> <translation id="2477065602824695373">Kuna seadistasite mitu seadet, on automaatne skannimine välja lülitatud.</translation> <translation id="2478176599153288112">Meediafaili load laiendusele „<ph name="EXTENSION" />”</translation> -<translation id="248003956660572823">Paroole ei salvestatud</translation> <translation id="2480868415629598489">Kopeeritud ja kleebitud andmete muutmine</translation> <translation id="2482878487686419369">Märguanded</translation> <translation id="2482895651873876648">Vaheleht teisaldati gruppi <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1983,7 +1980,6 @@ <translation id="2813094189969465044">Vanemlik järelevalve</translation> <translation id="281390819046738856">Taotlust ei saanud allkirjastada.</translation> <translation id="2814489978934728345">Peata selle lehekülje laadimine</translation> -<translation id="281504910091592009">Vaadake ja hallake salvestatud paroole oma <ph name="BEGIN_LINK" />Google'i kontol<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Järjehoidjakaust</translation> <translation id="2816319641769218778">Paroolide salvestamiseks oma Google'i kontole lülitage sisse sünkroonimine.</translation> <translation id="2816628817680324566">Kas lubada sellel saidil teie turvavõti tuvastada?</translation> @@ -4282,7 +4278,6 @@ <translation id="5078638979202084724">Lisab kõik vahelehed järjehoidjatesse</translation> <translation id="5078796286268621944">Vale PIN-kood</translation> <translation id="5079010647467150187">Sisseehitatud VPN-i lisamine …</translation> -<translation id="5079950360618752063">Kasuta soovitatud parooli</translation> <translation id="508059534790499809">Kerberose pileti värskendamine</translation> <translation id="5084328598860513926">Ettevalmistamise voogu katkestati. Proovige uuesti või võtke ühendust seadme omaniku või administraatoriga. Veakood: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Värskenduste otsimine</translation> @@ -4407,7 +4402,6 @@ <translation id="5206215183583316675">Kas kustutada „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Viga sertifikaadi importimisel</translation> <translation id="5206562235913517859">Jaekaupluse ID on vormingus ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Ohustatud parooli muutmine õnnestus. Teil on veel # ohustatud parool. Chrome soovitab seda parooli kohe kontrollida.}other{Ohustatud parooli muutmine õnnestus. Teil on veel # ohustatud parooli. Chrome soovitab neid paroole kohe kontrollida.}}</translation> <translation id="5207949376430453814">Tekstisisestusmärgi esiletõstmine</translation> <translation id="520840839826327499">Teenus <ph name="SERVICE_NAME" /> soovib kontrollida, kas kasutate sobilikku Chrome OS-i seadet.</translation> <translation id="5208548918290612795">Teenuse <ph name="WEB_DRIVE" /> autentimismärgi salvestamine</translation> @@ -6235,7 +6229,6 @@ <translation id="6970861306198150268">Veenduge, et salvestaksite selle saidi jaoks praeguse parooli</translation> <translation id="6972180789171089114">Heli/video</translation> <translation id="6972754398087986839">Alustamine</translation> -<translation id="6972887130317925583">Ohustatud parooli muutmine õnnestus. Paroole saate alati kontrollida menüüs <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Lubatud saata hüpikaknaid ja kasutada ümbersuunamisi</translation> <translation id="6973611239564315524">Uuendamine versioonile Debian 10 (Buster) on saadaval</translation> <translation id="69739764870135975">Kui Google on ka teie vaikeotsingumootor, näete paremaid, konteksti suhtes asjakohaseid soovitusi</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index be8dd6f..2083898 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Zure erakundeak kudeatzen ditu partekatzeko aukerak. Baliteke elementu batzuk ezkutatuta egotea.</translation> <translation id="1622054403950683339">Ahaztu wifi-sarea</translation> <translation id="1623723619460186680">Argi urdina murrizteko aukera</translation> -<translation id="1624012933569991823">Ezarpenak</translation> <translation id="1624599281783425761">Ez duzu ikusiko berriro <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Fitxategia handiegia da gailuan hura kudeatu ahal izateko. Saiatu beste gailu batean deskargatzen</translation> <translation id="1627276047960621195">Fitxategien azalpenak</translation> @@ -981,7 +980,6 @@ <translation id="1897120393475391208">Erabili pasahitz konplexu bat</translation> <translation id="1900305421498694955">Google Play-ko aplikazioek sistemako fitxategi guztiak atzitzeko baimena beharko dute agian kanpoko memoriako fitxategiak irakurri eta haietan idazteko. Kanpoko unitatea darabilen edonork ikusi ahalko ditu gailuan sortutako fitxategi eta karpetak. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Hautatu &guztiak</translation> -<translation id="1901396183631570154">Chrome-k ezin izan ditu gorde pasahitz horiek zure Google-ko kontuan. Gailu honetan gorde ditzakezu, bestela.</translation> <translation id="1903995858055162096">Ez al da zure gailua? Erabili <ph name="BEGIN_LINK" />gonbidatu modua<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Bisitatzen dituzun URLak Google-ko kontuan gordetzen dira</translation> <translation id="1905375423839394163">Chromebook gailuaren izena</translation> @@ -1616,7 +1614,6 @@ <translation id="2476974672882258506">Itxi Windows <ph name="PARALLELS_DESKTOP" /> desinstalatzeko.</translation> <translation id="2477065602824695373">Erabilerraztasun-etengailu bat baino gehiago konfiguratu dituzunez, desaktibatu egin da pantailan automatikoki mugitzeko aukera.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" luzapenaren baimenak multimedia-fitxategietarako</translation> -<translation id="248003956660572823">Pasahitzak ez daude gordeta</translation> <translation id="2480868415629598489">Aldatu kopiatzen eta itsasten dituzun datuak</translation> <translation id="2482878487686419369">Jakinarazpenak</translation> <translation id="2482895651873876648"><ph name="GROUP_NAME" /> taldera eraman da fitxa (<ph name="GROUP_CONTENTS" />)</translation> @@ -1978,7 +1975,6 @@ <translation id="2813094189969465044">Guraso-murriztapenak</translation> <translation id="281390819046738856">Ezin izan da sinatu eskaera.</translation> <translation id="2814489978934728345">Utzi orria kargatzeari</translation> -<translation id="281504910091592009">Ikusi eta kudeatu <ph name="BEGIN_LINK" />Google-ko kontuan<ph name="END_LINK" /> gordetako pasahitzak</translation> <translation id="2815693974042551705">Laster-marken karpeta</translation> <translation id="2816319641769218778">Pasahitzak Google-ko kontuan gordetzeko, aktibatu sinkronizazioa.</translation> <translation id="2816628817680324566">Segurtasun-giltza identifikatzeko baimena eman nahi diozu webguneari?</translation> @@ -4278,7 +4274,6 @@ <translation id="5078638979202084724">Egin fitxa guztien laster-marka</translation> <translation id="5078796286268621944">Okerra da PINa</translation> <translation id="5079010647467150187">Gehitu VPN integratua…</translation> -<translation id="5079950360618752063">Erabili iradokitako pasahitza</translation> <translation id="508059534790499809">Freskatu Kerberos-eko zerbitzu-eskaera bat</translation> <translation id="5084328598860513926">Horniketa-fluxua eten egin da. Saiatu berriro edo jarri harremanetan gailuaren jabearekin edo administratzailearekin. Errore-kodea: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Eguneratzeak bilatzen</translation> @@ -4404,7 +4399,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ezabatu nahi duzu?</translation> <translation id="520621735928254154">Ziurtagiria inportatzeko errorea</translation> <translation id="5206562235913517859">Saltokiaren IDak ABC-1234 formatua dauka</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Aldatu da arriskuan zegoen pasahitza. Arriskuan dauden # pasahitz gehiago daukazu. Pasahitz hori orain egiaztatzea gomendatzen dizu Chrome-k.}other{Aldatu da arriskuan zegoen pasahitza. Arriskuan dauden # pasahitz gehiago dauzkazu. Pasahitz horiek orain egiaztatzea gomendatzen dizu Chrome-k.}}</translation> <translation id="5207949376430453814">Nabarmendu testu-kurtsorea</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> zerbitzuak Chrome OS-ko gailu egoki bat erabiltzen ari zarela egiaztatu nahi du.</translation> <translation id="5208548918290612795">Gorde <ph name="WEB_DRIVE" /> zerbitzuaren autentifikazio-tokena</translation> @@ -6229,7 +6223,6 @@ <translation id="6970861306198150268">Ziurtatu webgune honen pasahitza gordetzen duzula</translation> <translation id="6972180789171089114">Audioa/Bideoa</translation> <translation id="6972754398087986839">Hasi erabiltzen</translation> -<translation id="6972887130317925583">Aldatu da arriskuan zegoen pasahitza. Egiaztatu pasahitzak <ph name="SETTINGS" /> atalean.</translation> <translation id="697312151395002334">Leiho gainerakorrak bidal ditzakete, eta birbideratzeak erabili</translation> <translation id="6973611239564315524">Debian 10 (Buster) berritzeko bertsio bat dago erabilgarri</translation> <translation id="69739764870135975">Google zure bilatzaile lehenetsia bada, hobeak diren eta testuinguruari egokituta dauden iradokizunak ikusiko dituzu</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index bb5e2ac..1934141 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">سازمانتان گزینههای همرسانی را مدیریت میکند. ممکن است برخیاز موارد پنهان شده باشند.</translation> <translation id="1622054403950683339">فراموش کردن شبکه Wi-Fi</translation> <translation id="1623723619460186680">کاهش نور آبی</translation> -<translation id="1624012933569991823">تنظیمات</translation> <translation id="1624599281783425761">دیگر <ph name="MERCHANT" /> را نخواهید دید</translation> <translation id="1624863973697515675">این فایل بسیار بزرگ است و دستگاه شما نمیتواند آن را مدیریت کند. آن را در دستگاه دیگری بارگیری کنید</translation> <translation id="1627276047960621195">توصیفگرهای فایل</translation> @@ -989,7 +988,6 @@ <translation id="1897120393475391208">از گذرواژه قوی استفاده کنید</translation> <translation id="1900305421498694955">ممکن است برنامههای Google Play برای خواندن فایلهای موجود در دستگاههای ذخیرهسازی خارجی و نوشتن در آنها، نیازمند دسترسی کامل به سیستم فایل باشند. فایلها و پوشههای ایجادشده در دستگاه برای هر فردی که از درایو خارجی استفاده میکند، نمایان است. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1901303067676059328">انتخاب &همه</translation> -<translation id="1901396183631570154">Chrome نتوانست این گذرواژهها را در «حساب Google» شما ذخیره کند. همچنان میتوانید آنها را در این دستگاه ذخیره کنید.</translation> <translation id="1903995858055162096">این دستگاه شما نیست؟ استفاده از <ph name="BEGIN_LINK" />حالت مهمان<ph name="END_LINK" /></translation> <translation id="1904580727789512086">نشانیهای وبی که بازدید میکنید در «حساب Google» شما ذخیره میشوند</translation> <translation id="1905375423839394163">نام دستگاه Chromebook</translation> @@ -1627,7 +1625,6 @@ <translation id="2476974672882258506">برای حذف نصب <ph name="PARALLELS_DESKTOP" />، Windows را خاموش کنید.</translation> <translation id="2477065602824695373">چون چند کلید راهاندازی کردهاید، اسکن خودکار خاموش شده است.</translation> <translation id="2478176599153288112">مجوزهای فایل رسانهای برای «<ph name="EXTENSION" />»</translation> -<translation id="248003956660572823">گذرواژهها ذخیره نشدهاند</translation> <translation id="2480868415629598489">اصلاح دادههایی که کپی و جایگذاری میکنید</translation> <translation id="2482878487686419369">اعلانها</translation> <translation id="2482895651873876648">برگه به گروه <ph name="GROUP_NAME" /> منتقل شد - <ph name="GROUP_CONTENTS" /></translation> @@ -1989,7 +1986,6 @@ <translation id="2813094189969465044">کنترلهای والدین</translation> <translation id="281390819046738856">درخواست امضا نشد.</translation> <translation id="2814489978934728345">توقف بارگیری این صفحه</translation> -<translation id="281504910091592009">در <ph name="BEGIN_LINK" />حساب Google<ph name="END_LINK" /> خود گذرواژههای ذخیرهشده را مشاهده و مدیریت کنید</translation> <translation id="2815693974042551705">پوشه نشانک</translation> <translation id="2816319641769218778">برای ذخیره گذرواژهها در «حساب Google»، همگامسازی را روشن کنید.</translation> <translation id="2816628817680324566">به این سایت اجازه میدهید کلید امنیتیتان را شناسایی کند؟</translation> @@ -4289,7 +4285,6 @@ <translation id="5078638979202084724">نشانک گذاری همه برگهها</translation> <translation id="5078796286268621944">پین اشتباه</translation> <translation id="5079010647467150187">افزودن VPN داخلی…</translation> -<translation id="5079950360618752063">استفاده از گذرواژه پیشنهادی</translation> <translation id="508059534790499809">بازخوانی بلیت Kerberos</translation> <translation id="5084328598860513926">روند آمادهسازی قطع شد. لطفاً دوباره امتحان کنید یا با سرپرست یا مالک دستگاه تماس بگیرید. کد خطا: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">در حال بررسی بهروزرسانیها</translation> @@ -4414,7 +4409,6 @@ <translation id="5206215183583316675">«<ph name="CERTIFICATE_NAME" />» حذف شود؟</translation> <translation id="520621735928254154">خطا در وارد کردن گواهی</translation> <translation id="5206562235913517859">قالب شناسه مغازه-فروشنده بهصورت ABC-1234 است</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{گذرواژه لورفته باموفقیت تغییر کرد. # گذرواژه لورفته دیگر دارید. Chrome توصیه میکند این گذرواژه را اکنون بررسی کنید.}one{گذرواژه لورفته باموفقیت تغییر کرد. # گذرواژه لورفته دیگر دارید. Chrome توصیه میکند این گذرواژه را اکنون بررسی کنید.}other{گذرواژه لورفته باموفقیت تغییر کرد. # گذرواژه لورفته دیگر دارید. Chrome توصیه میکند این گذرواژهها را اکنون بررسی کنید.}}</translation> <translation id="5207949376430453814">برجسته کردن هشتک نوشتار</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> میخواهد بررسی کند شما از دستگاه ChromeOS واجدشرایط استفاده میکنید یا نه.</translation> <translation id="5208548918290612795">ذخیره کد اصالتسنجی <ph name="WEB_DRIVE" /></translation> @@ -6244,7 +6238,6 @@ <translation id="6970861306198150268">حتماً گذرواژه فعلیتان برای این سایت را ذخیره کنید</translation> <translation id="6972180789171089114">صوتی/تصویری</translation> <translation id="6972754398087986839">شروع به کار</translation> -<translation id="6972887130317925583">گذرواژه لورفته باموفقیت تغییر کرد. هرزمان خواستید گذواژههایتان را در <ph name="SETTINGS" /> بررسی کنید.</translation> <translation id="697312151395002334">اجازه دارد بالاپر ارسال کند و از هدایتها استفاده کند</translation> <translation id="6973611239564315524">ارتقا به Debian 10 (Buster) در دسترس است</translation> <translation id="69739764870135975">اگر موتور جستجوی پیشفرضتان هم Google باشد، پیشنهادهای بهتر و مرتبطتری درباره موضوع خواهید دید</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 528a508..4060ca7a 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Organisaatiosi ylläpitää jakamisasetuksia. Osa kohteista on voitu piilottaa.</translation> <translation id="1622054403950683339">Unohda Wi-Fi-verkko</translation> <translation id="1623723619460186680">Sinisen valon vähennys</translation> -<translation id="1624012933569991823">asetuksista</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> ei jatkossa enää näy</translation> <translation id="1624863973697515675">Laite ei voi käsitellä tätä tiedostoa, koska se on liian iso. Kokeile ladata se toiselle laitteella</translation> <translation id="1627276047960621195">Tiedostokuvaajat</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">Käytä vahvaa salasanaa</translation> <translation id="1900305421498694955">Google Playn sovellukset voivat edellyttää täysiä tiedostojärjestelmän käyttöoikeuksia, jotta ne voivat kirjoittaa ja lukea ulkoisten tallennustilalaitteiden tiedostoja. Kaikki ulkoisen aseman käyttäjät voivat nähdä laitteella luodut tiedostot ja kansiot. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Valitse &kaikki</translation> -<translation id="1901396183631570154">Chrome ei voinut tallentaa näitä salasanoja Google-tilillesi. Voit kuitenkin tallentaa ne laitteellesi.</translation> <translation id="1903995858055162096">Eikö tämä ole laitteesi? Käytä <ph name="BEGIN_LINK" />vierastilaa<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Avaamasi URL-osoitteet tallennetaan Google-tilillesi</translation> <translation id="1905375423839394163">Chromebook-laitteen nimi</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506">Sammuta Windows, jotta <ph name="PARALLELS_DESKTOP" /> voidaan poistaa.</translation> <translation id="2477065602824695373">Koska olet ottanut käyttöön useita kytkimiä, automaattinen skannaus on laitettu pois päältä.</translation> <translation id="2478176599153288112">Mediatiedoston luvat laajennukselle <ph name="EXTENSION" /></translation> -<translation id="248003956660572823">Salasanoja ei tallennettu</translation> <translation id="2480868415629598489">muokata kopioituja ja liitettyjä tietoja</translation> <translation id="2482878487686419369">Ilmoitukset</translation> <translation id="2482895651873876648">Välilehti siirretty ryhmään nimeltä <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">Lapsilukko</translation> <translation id="281390819046738856">Pyynnön allekirjoittaminen epäonnistui.</translation> <translation id="2814489978934728345">Pysäytä tämän sivun lataus</translation> -<translation id="281504910091592009">Katso ja ylläpidä <ph name="BEGIN_LINK" />Google-tilille<ph name="END_LINK" /> tallennettuja salasanoja</translation> <translation id="2815693974042551705">Kirjanmerkkikansio</translation> <translation id="2816319641769218778">Jos haluat tallentaa salasanoja Google-tilillesi, ota synkronointi käyttöön.</translation> <translation id="2816628817680324566">Saako tämä sivusto tunnistaa suojausavaimesi?</translation> @@ -4288,7 +4284,6 @@ <translation id="5078638979202084724">Lisää kaikki välilehdet kirjanmerkkeihin</translation> <translation id="5078796286268621944">Väärä PIN-koodi</translation> <translation id="5079010647467150187">Lisää sisäänrakennettu VPN…</translation> -<translation id="5079950360618752063">Käytä salasanaehdotusta</translation> <translation id="508059534790499809">Päivitä Kerberos-tukipyyntö</translation> <translation id="5084328598860513926">Käyttäjien valinta keskeytyi. Yritä uudelleen tai ota yhteyttä laitteen omistajaan tai ylläpitäjään. Virhekoodi: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Haetaan päivityksiä</translation> @@ -4413,7 +4408,6 @@ <translation id="5206215183583316675">Poistetaanko <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Varmenteen tuontivirhe</translation> <translation id="5206562235913517859">Jälleenmyyjän kauppatunnus on muodossa ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Vaarantunut salasana vaihdettu onnistuneesti. Sinulla on vielä # vaarantunut salasana. Chrome suosittelee tarkistamaan tämän salasanan nyt.}other{Vaarantunut salasana vaihdettu onnistuneesti. Sinulla on vielä # vaarantunutta salasanaa. Chrome suosittelee tarkistamaan nämä salasanat nyt.}}</translation> <translation id="5207949376430453814">Korosta tekstikursori</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> haluaa tarkistaa, että käytät yhteensopivaa Chrome-käyttöjärjestelmää käyttävää laitetta.</translation> <translation id="5208548918290612795">Tallennetaan todennustunnus: <ph name="WEB_DRIVE" /></translation> @@ -6241,7 +6235,6 @@ <translation id="6970861306198150268">Varmista, että tallennat tämän sivuston nykyisen salasanasi</translation> <translation id="6972180789171089114">Ääni- ja videotiedostot</translation> <translation id="6972754398087986839">Aloitusopas</translation> -<translation id="6972887130317925583">Vaarantunut salasana vaihdettu onnistuneesti. Tarkista salasanasi koska tahansa <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Ponnahdusikkunat tai uudelleenohjaukset sallittu</translation> <translation id="6973611239564315524">Päivitys Debian 10:een (Buster) saatavilla</translation> <translation id="69739764870135975">Jos Google on lisäksi oletushakukone, näet parempia ja asiayhteyteen sopivampia ehdotuksia</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 15077131..35ac40be 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">Pinapamahalaan ng iyong organisasyon ang mga opsyon para sa pagbabahagi. Posibleng nakatago ang ilang item.</translation> <translation id="1622054403950683339">Kalimutan ang Wi-Fi network</translation> <translation id="1623723619460186680">Pag-dim sa blue light</translation> -<translation id="1624012933569991823">Mga Setting</translation> <translation id="1624599281783425761">Hindi mo na makikita ulit ang <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Masyadong malaki ang file na ito para pamahalaan ng iyong device. Subukan itong i-download sa ibang device</translation> <translation id="1627276047960621195">Mga Descriptor ng File</translation> @@ -993,7 +992,6 @@ <translation id="1897120393475391208">Gumamit ng malakas na password</translation> <translation id="1900305421498694955">Puwedeng mangailangan ang mga app mula sa Google Play ng kumpletong access sa system ng file para mag-read at mag-write ng mga file sa mga external na storage device. Nakikita ng sinumang gumagamit ng external na drive ang mga file at folder na ginawa sa device. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Piliin ang &lahat</translation> -<translation id="1901396183631570154">Hindi ma-save ng Chrome ang mga password na ito sa iyong Google Account. Mase-save mo pa rin ang mga ito sa device na ito.</translation> <translation id="1903995858055162096">Hindi iyo ang device? Gamitin ang <ph name="BEGIN_LINK" />Guest mode<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Naka-save sa iyong Google Account ang mga URL na iyong binibisita</translation> <translation id="1905375423839394163">Pangalan ng Chromebook device</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">I-shut down ang Windows para ma-uninstall ang <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Dahil nagtalaga ka ng maraming switch, na-off ang awtomatikong pag-scan.</translation> <translation id="2478176599153288112">Mga Pahintulot sa Media-File para sa "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Hindi na-save ang mga password</translation> <translation id="2480868415629598489">Baguhin ang data na kinokopya at pine-paste mo</translation> <translation id="2482878487686419369">Mga Abiso</translation> <translation id="2482895651873876648">Inilipat ang tab sa grupong <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Mga kontrol ng magulang</translation> <translation id="281390819046738856">Hindi malagdaan ang kahilingan.</translation> <translation id="2814489978934728345">Ihinto ang pagkarga sa pahinang ito</translation> -<translation id="281504910091592009">Tingnan at pamahalaan ang mga naka-save na password sa iyong <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Folder ng bookmark</translation> <translation id="2816319641769218778">Para mag-save ng mga password sa iyong Google Account, i-on ang pag-sync.</translation> <translation id="2816628817680324566">Payagan ang site na ito na makilala ang iyong security key?</translation> @@ -4293,7 +4289,6 @@ <translation id="5078638979202084724">I-bookmark ang lahat ng mga tab</translation> <translation id="5078796286268621944">Maling PIN</translation> <translation id="5079010647467150187">Magdagdag ng built-in na VPN...</translation> -<translation id="5079950360618752063">Gamitin ang iminumungkahing password</translation> <translation id="508059534790499809">I-refresh ang ticket ng Kerberos</translation> <translation id="5084328598860513926">Naantala ang daloy ng pag-provision. Pakisubukan ulit o makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Tumitingin ng mga update</translation> @@ -4418,7 +4413,6 @@ <translation id="5206215183583316675">I-delete ang "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Error sa Pag-import ng Certificate</translation> <translation id="5206562235913517859">Ang retailer-store ID ay nasa format na ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Napalitan ang nakompromisong password. May # ka pang nakompromisong password. Inirerekomenda ng Chrome na suriin ngayon ang password na ito.}one{Napalitan ang nakompromisong password. May # ka pang nakompromisong password. Inirerekomenda ng Chrome na suriin ngayon ang mga password na ito.}other{Napalitan ang nakompromisong password. May # ka pang nakompromisong password. Inirerekomenda ng Chrome na suriin ngayon ang mga password na ito.}}</translation> <translation id="5207949376430453814">I-highlight ang text caret</translation> <translation id="520840839826327499">Gustong suriin ng <ph name="SERVICE_NAME" /> kung gumagamit ka ng kwalipikadong ChromeOS device.</translation> <translation id="5208548918290612795">Token ng Pag-authenticate sa <ph name="WEB_DRIVE" /> sa Pag-store</translation> @@ -6248,7 +6242,6 @@ <translation id="6970861306198150268">Tiyaking sine-save mo ang iyong kasalukuyang password para sa site na ito</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Magsimula</translation> -<translation id="6972887130317925583">Napalitan ang nakompromisong password. Suriin ang iyong mga password anumang oras sa <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Pinapayagang magpadala ng mga pop-up at gumamit ng mga pag-redirect</translation> <translation id="6973611239564315524">May available na pag-upgrade sa Debian 10 (Buster)</translation> <translation id="69739764870135975">Kung Google din ang iyong default na search engine, makakakita ka ng mga suhestyong mas maganda at nauugnay sa konteksto</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 8d59c4cb..359667e 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">Les options de partage sont gérées par votre organisation. Certains éléments peuvent être masqués.</translation> <translation id="1622054403950683339">Oublier le réseau Wi-Fi</translation> <translation id="1623723619460186680">Réduction de la lumière bleue</translation> -<translation id="1624012933569991823">Paramètres</translation> <translation id="1624599281783425761">Vous ne verrez plus <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Ce fichier est trop volumineux pour être géré par votre appareil. Essayez de le télécharger sur un autre appareil</translation> <translation id="1627276047960621195">Descripteurs de fichier</translation> @@ -725,6 +724,7 @@ <translation id="1676902103953506022">Authentifiant pour <ph name="USERNAME" /> sur <ph name="DOMAIN" /></translation> <translation id="1677306805708094828">Impossible d'ajouter <ph name="EXTENSION_TYPE_PARAMETER" /></translation> <translation id="1677472565718498478"><ph name="TIME" /> d'autonomie restante</translation> +<translation id="1678794218766467608">Verrouiller en mode Veille ou lorsque le couvercle est fermé</translation> <translation id="1679068421605151609">Outils pour développeurs</translation> <translation id="1679810534535368772">Voulez-vous vraiment quitter cette fenêtre?</translation> <translation id="167983332380191032">Le service de gestion a envoyé une erreur HTTP.</translation> @@ -981,7 +981,6 @@ <translation id="1897120393475391208">Utilisez un mot de passe fort</translation> <translation id="1900305421498694955">Les applications de Google Play peuvent exiger un accès complet au système de fichiers pour lire et écrire des fichiers sur des périphériques de stockage externe. Les fichiers et les dossiers créés sur le périphérique sont visibles par tout utilisateur du disque externe. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Tout sélectionner</translation> -<translation id="1901396183631570154">Chrome n'a pas pu enregistrer ces mots de passe dans votre compte Google. Vous pouvez quand même les enregistrer sur cet appareil.</translation> <translation id="1903995858055162096">Ce n'est pas votre appareil? Utilisez le <ph name="BEGIN_LINK" />mode Invité<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Les adresses URL que vous visitez sont enregistrées dans votre compte Google</translation> <translation id="1905375423839394163">Nom du Chromebook</translation> @@ -1616,7 +1615,6 @@ <translation id="2476974672882258506">Éteignez Windows pour désinstaller <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Comme vous avez configuré plusieurs commutateurs, la recherche automatique a été désactivée.</translation> <translation id="2478176599153288112">Autorisations de fichier média pour « <ph name="EXTENSION" /> »</translation> -<translation id="248003956660572823">Mots de passe non enregistrés</translation> <translation id="2480868415629598489">Modifier les données que vous copiez et collez</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2482895651873876648">Onglet déplacé vers le groupe <ph name="GROUP_NAME" /> : <ph name="GROUP_CONTENTS" /></translation> @@ -1979,7 +1977,6 @@ <translation id="2813094189969465044">Contrôles parentaux</translation> <translation id="281390819046738856">La demande n'a pas pu être signée.</translation> <translation id="2814489978934728345">Arrêter le chargement de cette page</translation> -<translation id="281504910091592009">Affichez et gérez les mots de passe enregistrés dans votre <ph name="BEGIN_LINK" />compte google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Dossier de favoris</translation> <translation id="2816319641769218778">Pour enregistrer des mots de passe dans votre compte Google, activez la synchronisation.</translation> <translation id="2816628817680324566">Autoriser ce site à reconnaître votre clé de sécurité?</translation> @@ -3795,6 +3792,7 @@ <translation id="4586275095964870617">L'adresse <ph name="URL" /> n'a pas pu être ouverte dans un navigateur secondaire. Veuillez communiquer avec votre administrateur système.</translation> <translation id="4589713469967853491">Les journaux ont été écrits dans le répertoire Téléchargements.</translation> <translation id="4590324241397107707">Stockage de base de données</translation> +<translation id="459204634473266369">Aucun appareil enregistré dans <ph name="PRIMARY_EMAIL" /></translation> <translation id="4592891116925567110">Application de dessin avec stylet</translation> <translation id="4593021220803146968">&Accéder à <ph name="URL" /></translation> <translation id="4594577641390224176">Vous recherchez la page à propos du système? Consultez</translation> @@ -4278,7 +4276,6 @@ <translation id="5078638979202084724">Ajouter tous les onglets aux favoris</translation> <translation id="5078796286268621944">NIP incorrect</translation> <translation id="5079010647467150187">Ajouter un RPV intégré…</translation> -<translation id="5079950360618752063">Utiliser le mot de passe suggéré</translation> <translation id="508059534790499809">Actualiser un ticket Kerberos</translation> <translation id="5084328598860513926">Le flux d'approvisionnement a été interrompu. Veuillez réessayer ou communiquer avec l'administrateur ou le propriétaire de votre appareil. Code d'erreur : <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Recherche de mises à jour...</translation> @@ -4354,6 +4351,7 @@ <translation id="5155327081870541046">Dans la barre d'adresse, entrez le raccourci pour le site que vous voulez rechercher comme « @favoris ». Ensuite, appuyez sur votre raccourci-clavier favori et entrez votre terme de recherche.</translation> <translation id="5156638757840305347">Le curseur est mis en évidence lorsqu'il apparaît ou se déplace</translation> <translation id="5157635116769074044">Épingler cette page à l'écran de démarrage...</translation> +<translation id="5158206172605340248">Menu des accents fermé.</translation> <translation id="5159094275429367735">Configurer Crostini</translation> <translation id="5159419673777902220">Ton parent a désactivé les autorisations pour les extensions</translation> <translation id="5159643365935452998">Vérifier l'effacement automatique des données</translation> @@ -4403,7 +4401,6 @@ <translation id="5206215183583316675">Supprimer « <ph name="CERTIFICATE_NAME" /> »?</translation> <translation id="520621735928254154">Erreur d'importation du certificat</translation> <translation id="5206562235913517859">L'identifiant du magasin-détaillant est au format ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Le mot de passe compromis a été changé. Vous avez # autre mot de passe compromis. Chrome recommande de vérifier ce mot de passe maintenant.}one{Le mot de passe compromis a été changé. Vous avez # autre mot de passe compromis. Chrome recommande de vérifier ce mot de passe maintenant.}other{Le mot de passe compromis a été changé. Vous avez # autres mots de passe compromis. Chrome recommande de vérifier ces mots de passe maintenant.}}</translation> <translation id="5207949376430453814">Mettre le point d'insertion de texte en surbrillance</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> veut vérifier si vous utilisez un appareil Chrome OS admissible.</translation> <translation id="5208548918290612795">Stockage du jeton d'authentification <ph name="WEB_DRIVE" /></translation> @@ -6234,7 +6231,6 @@ <translation id="6970861306198150268">Assurez-vous que vous enregistrez votre mot de passe actuel pour ce site</translation> <translation id="6972180789171089114">Audio/Vidéo</translation> <translation id="6972754398087986839">Démarrer</translation> -<translation id="6972887130317925583">Le mot de passe compromis a été changé. Vous pouvez vérifier vos mots de passe en tout temps dans le menu <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Autorisés à afficher des fenêtres contextuelles et à utiliser des redirections</translation> <translation id="6973611239564315524">Une mise à jour de Debian 10 (Buster) est offerte</translation> <translation id="69739764870135975">Si Google est également votre moteur de recherche par défaut, vous verrez de meilleures suggestions pertinentes selon le contexte</translation> @@ -6486,6 +6482,7 @@ <translation id="7235716375204803342">Récupération des activités en cours…</translation> <translation id="7235737137505019098">Votre clé de sécurité n'a pas suffisamment d'espace libre pour qu'on y enregistre des comptes supplémentaires.</translation> <translation id="7235873936132740888">Les sites peuvent traiter des tâches particulières lorsque vous cliquez sur certains types de liens (ils peuvent, par exemple, créer un courriel à l'aide de votre client de messagerie ou ajouter des événements dans votre agenda en ligne)</translation> +<translation id="7238609589076576185">Accent inséré.</translation> <translation id="7239108166256782787"><ph name="DEVICE_NAME" /> a annulé le transfert</translation> <translation id="7240339475467890413">Connexion au nouveau point d'accès sans fil?</translation> <translation id="7241389281993241388">Veuillez vous connecter à <ph name="TOKEN_NAME" /> pour importer le certificat de client.</translation> @@ -7327,6 +7324,7 @@ <translation id="8030852056903932865">Approuver</translation> <translation id="8032244173881942855">Impossible de diffuser l'onglet.</translation> <translation id="8032569120109842252">Suivi</translation> +<translation id="8033023935541439900">Menu des accents ouvert. Appuyez sur la flèche vers la gauche ou vers la droite pour naviguer, et appuyez sur la touche Entrée pour en insérer un.</translation> <translation id="8033827949643255796">caractère sélectionné</translation> <translation id="8033958968890501070">Délai dépassé</translation> <translation id="8035059678007243127">Page de navigation privée de la mise en cache complète bidirectionnelle : <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index f149336..0ba2629 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">Les options de partage sont gérées par votre organisation. Certains éléments peuvent être masqués.</translation> <translation id="1622054403950683339">Supprimer le réseau Wi-Fi</translation> <translation id="1623723619460186680">Réduction de la lumière bleue</translation> -<translation id="1624012933569991823">Paramètres</translation> <translation id="1624599281783425761">Vous ne verrez plus <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Votre appareil ne peut pas gérer ce fichier, car il est trop volumineux. Essayez de le télécharger sur un autre appareil</translation> <translation id="1627276047960621195">Descripteurs de fichiers</translation> @@ -981,7 +980,6 @@ <translation id="1897120393475391208">Utilisez le mot de passe sécurisé</translation> <translation id="1900305421498694955">Les applications provenant de Google Play peuvent exiger un accès complet, en lecture et en écriture, aux fichiers situés sur des périphériques de stockage externe. Les fichiers stockés sur ces périphériques externes, et les dossiers où ils se trouvent, sont visibles par tous les utilisateurs. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Tout sélectionner</translation> -<translation id="1901396183631570154">Chrome n'a pas pu enregistrer ces mots de passe dans votre compte Google. Vous pouvez cependant les enregistrer sur cet appareil.</translation> <translation id="1903995858055162096">Ce n'est pas votre appareil ? Utilisez le <ph name="BEGIN_LINK" />mode Invité<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Les URL que vous consultez sont enregistrées dans votre compte Google</translation> <translation id="1905375423839394163">Nom du Chromebook</translation> @@ -1616,7 +1614,6 @@ <translation id="2476974672882258506">Arrêtez la VM Windows pour désinstaller <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">L'exploration automatique a été désactivée, car vous avez configuré plusieurs contacteurs.</translation> <translation id="2478176599153288112">Autorisations de fichier média pour "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Mots de passe non enregistrés</translation> <translation id="2480868415629598489">Modifier les données que vous copiez-collez</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2482895651873876648">Onglet déplacé vers le groupe <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1978,7 +1975,6 @@ <translation id="2813094189969465044">Contrôle parental</translation> <translation id="281390819046738856">Impossible de signer la demande.</translation> <translation id="2814489978934728345">Arrêter le chargement de cette page</translation> -<translation id="281504910091592009">Afficher et gérer les mots de passe enregistrés dans votre <ph name="BEGIN_LINK" />compte Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Dossier de favoris</translation> <translation id="2816319641769218778">Pour enregistrer vos mots de passe dans votre compte Google, activez la synchronisation.</translation> <translation id="2816628817680324566">Autoriser ce site à identifier votre clé de sécurité ?</translation> @@ -4277,7 +4273,6 @@ <translation id="5078638979202084724">Ajouter tous les onglets aux favoris</translation> <translation id="5078796286268621944">Code PIN incorrect</translation> <translation id="5079010647467150187">Ajouter le VPN intégré…</translation> -<translation id="5079950360618752063">Utiliser le mot de passe suggéré</translation> <translation id="508059534790499809">Actualiser un ticket Kerberos</translation> <translation id="5084328598860513926">La procédure de configuration a été interrompue. Veuillez réessayer, ou contactez le propriétaire ou l'administrateur de l'appareil. Code d'erreur : <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Recherche de mises à jour en cours…</translation> @@ -4402,7 +4397,6 @@ <translation id="5206215183583316675">Supprimer "<ph name="CERTIFICATE_NAME" />" ?</translation> <translation id="520621735928254154">Erreur d'importation du certificat</translation> <translation id="5206562235913517859">L'ID du marchand-magasin est au format ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Le mot de passe compromis a bien été changé. Vous avez # mot de passe compromis supplémentaire. Chrome vous recommande de vérifier ce mot de passe maintenant.}one{Le mot de passe compromis a bien été changé. Vous avez # mot de passe compromis supplémentaire. Chrome vous recommande de vérifier ce mot de passe maintenant.}other{Le mot de passe compromis a bien été changé. Vous avez # mots de passe compromis supplémentaires. Chrome vous recommande de vérifier ces mots de passe maintenant.}}</translation> <translation id="5207949376430453814">Mettre le curseur de texte en surbrillance</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> veut vérifier si vous utilisez un appareil Chrome OS éligible.</translation> <translation id="5208548918290612795">Stocker un jeton d'authentification <ph name="WEB_DRIVE" /></translation> @@ -6233,7 +6227,6 @@ <translation id="6970861306198150268">Veillez à enregistrer votre mot de passe actuel pour ce site</translation> <translation id="6972180789171089114">Audio/Vidéo</translation> <translation id="6972754398087986839">Démarrer</translation> -<translation id="6972887130317925583">Le mot de passe compromis a bien été changé. Sachez que vous pouvez vérifier vos mots de passe à tout moment dans <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Autorisé à afficher des pop-ups et à utiliser des redirections</translation> <translation id="6973611239564315524">Une mise à niveau vers Debian 10 (Buster) est disponible</translation> <translation id="69739764870135975">Si Google est aussi votre moteur de recherche par défaut, vous obtiendrez des suggestions plus pertinentes en fonction du contexte</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index eb5afad..ce87f6f 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -663,7 +663,6 @@ <translation id="1621984899599015181">A túa organización xestiona as opcións para compartir o contido. É posible que algúns elementos estean ocultos.</translation> <translation id="1622054403950683339">Esquecer rede wifi</translation> <translation id="1623723619460186680">Redución da luz azul</translation> -<translation id="1624012933569991823">Configuración</translation> <translation id="1624599281783425761">Deixarás de ver o carro de <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Este ficheiro é demasiado grande para que o xestione o dispositivo. Tenta descargalo noutro dispositivo</translation> <translation id="1627276047960621195">Descritores de ficheiro</translation> @@ -979,7 +978,6 @@ <translation id="1897120393475391208">Usa este contrasinal seguro</translation> <translation id="1900305421498694955">As aplicacións de Google Play poden necesitar acceso total ao sistema de ficheiros para ler e editar ficheiros no almacenamento externo. Os ficheiros e os cartafoles creados no dispositivo son visibles para todos os usuarios da unidade externa. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Seleccion&ar todo</translation> -<translation id="1901396183631570154">Chrome non puido gardar estes contrasinais na túa Conta de Google. Así e todo, podes gardalos neste dispositivo.</translation> <translation id="1903995858055162096">Non é o teu dispositivo? Utiliza o <ph name="BEGIN_LINK" />modo de convidado<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Os URL que visitas gárdanse na túa Conta de Google</translation> <translation id="1905375423839394163">Nome do dispositivo Chromebook</translation> @@ -1614,7 +1612,6 @@ <translation id="2476974672882258506">Para desinstalar <ph name="PARALLELS_DESKTOP" />, pecha Windows.</translation> <translation id="2477065602824695373">Como configuraches varios interruptores, desactivouse a función de exploración automática.</translation> <translation id="2478176599153288112">Permisos de ficheiros multimedia para "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Non se gardaron os contrasinais</translation> <translation id="2480868415629598489">Modificar os datos que copias e pegas</translation> <translation id="2482878487686419369">Notificacións</translation> <translation id="2482895651873876648">A pestana moveuse ao grupo <ph name="GROUP_NAME" /> (<ph name="GROUP_CONTENTS" />)</translation> @@ -1976,7 +1973,6 @@ <translation id="2813094189969465044">Controis parentais</translation> <translation id="281390819046738856">Non se puido asinar a solicitude.</translation> <translation id="2814489978934728345">Deixa de cargar esta páxina</translation> -<translation id="281504910091592009">Para consultar e xestionar os contrasinais gardados, accede á túa <ph name="BEGIN_LINK" />Conta de Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Cartafol de marcadores</translation> <translation id="2816319641769218778">Activa a sincronización para gardar contrasinais na túa Conta de Google.</translation> <translation id="2816628817680324566">Queres permitir que este sitio identifique a túa chave de seguranza?</translation> @@ -4275,7 +4271,6 @@ <translation id="5078638979202084724">Establecer todas as pestanas como marcadores</translation> <translation id="5078796286268621944">PIN incorrecto</translation> <translation id="5079010647467150187">Engadir VPN integrada…</translation> -<translation id="5079950360618752063">Utilizar contrasinal suxerido</translation> <translation id="508059534790499809">Actualizar un tícket de Kerberos</translation> <translation id="5084328598860513926">Interrompeuse o fluxo de abastecemento. Téntao de novo ou ponte en contacto co propietario ou co administrador do dispositivo. Código de erro: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Comprobando se hai actualizacións</translation> @@ -4400,7 +4395,6 @@ <translation id="5206215183583316675">Queres eliminar "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Produciuse un erro ao importar o certificado</translation> <translation id="5206562235913517859">O código de identificación da tenda retallista ten o formato ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Cambiouse correctamente o contrasinal vulnerado. Quédache # máis. Chrome recomenda comprobar este contrasinal agora.}other{Cambiouse correctamente o contrasinal vulnerado. Quédanche # máis. Chrome recomenda comprobar estes contrasinais agora.}}</translation> <translation id="5207949376430453814">Destacar o cursor de texto</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> quere comprobar se usas un dispositivo Chrome OS compatible.</translation> <translation id="5208548918290612795">Almacenamento dun token de autenticación de <ph name="WEB_DRIVE" /></translation> @@ -6225,7 +6219,6 @@ <translation id="6970861306198150268">Asegúrate de gardar o teu contrasinal actual deste sitio</translation> <translation id="6972180789171089114">Audio/Vídeo</translation> <translation id="6972754398087986839">Introdución</translation> -<translation id="6972887130317925583">Cambiouse correctamente o contrasinal vulnerado. Comproba os teus contrasinais cando queiras en <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Sitios que poden mostrar ventás emerxentes e usar redireccións</translation> <translation id="6973611239564315524">Está dispoñible unha actualización a Debian 10 (Buster)</translation> <translation id="69739764870135975">Se o teu motor de busca predeterminado tamén é Google, recibirás mellores suxestións que serán relevantes segundo o contexto</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 6154447..d2400d59 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -661,7 +661,6 @@ <translation id="1621984899599015181">શેરિંગ માટેના વિકલ્પો તમારી સંસ્થા દ્વારા મેનેજ કરવામાં આવે છે. કેટલીક આઇટમ છુપાવેલી હોઈ શકે છે.</translation> <translation id="1622054403950683339">વાઇ-ફાઇ નેટવર્ક સાથે જોડાણ તોડો</translation> <translation id="1623723619460186680">બ્લૂ લાઇટમાં ઘટાડો</translation> -<translation id="1624012933569991823">સેટિંગ</translation> <translation id="1624599281783425761">તમને <ph name="MERCHANT" /> ફરીથી દેખાશે નહીં</translation> <translation id="1624863973697515675">આ ફાઇલ ખૂબ મોટી હોવાથી તમારા ડિવાઇસ દ્વારા તે મેનેજ કરી શકાશે નહીં. તેને કોઈ અન્ય ડિવાઇસ પર ડાઉનલોડ કરવાનો પ્રયાસ કરો</translation> <translation id="1627276047960621195">ફાઇલ વર્ણનકર્તા</translation> @@ -978,7 +977,6 @@ <translation id="1897120393475391208">સશક્ત પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="1900305421498694955">Google Play પરની ઍપને બાહ્ય સ્ટોરેજ ડિવાઇસ પરની ફાઇલો તથા ફોલ્ડરો વાંચવા અને લખવા માટે ફાઇલ સિસ્ટમનો સંપૂર્ણ ઍક્સેસ હોવો જરૂરી હોઈ શકે છે. બાહ્ય ડ્રાઇવનો ઉપયોગ કરનાર કોઈપણ વ્યક્તિ ડિવાઇસ પર બનાવેલી ફાઇલો તથા ફોલ્ડરોને જોઈ શકે છે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&બધા પસંદ કરો</translation> -<translation id="1901396183631570154">Chrome આ પાસવર્ડને તમારા Google એકાઉન્ટમાં સાચવી શક્યું નથી. તમે હજુ પણ તેમને આ ડિવાઇસ પર સાચવી શકો છો.</translation> <translation id="1903995858055162096">શું આ તમારું ડિવાઇસ નથી? <ph name="BEGIN_LINK" />અતિથિ મોડ<ph name="END_LINK" />નો ઉપયોગ કરો.</translation> <translation id="1904580727789512086">તમે મુલાકાત લો છો તે URLsને તમારા Google એકાઉન્ટમાં સાચવવામાં આવે છે</translation> <translation id="1905375423839394163">Chromebook ઉપકરણનું નામ</translation> @@ -1614,7 +1612,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />ને અનઇન્સ્ટૉલ કરવા માટે Windows શટ ડાઉન કરો.</translation> <translation id="2477065602824695373">તમે એકથી વધુ સ્વિચનું સેટઅપ કર્યું હોવાને કારણે ઑટો-સ્કૅનની સુવિધા બંધ કરવામાં આવી છે.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" માટે મીડિયા-ફાઇલ પરવાનગીઓ</translation> -<translation id="248003956660572823">પાસવર્ડ સાચવ્યા નથી</translation> <translation id="2480868415629598489">તમે કૉપિ અને પેસ્ટ કરો છો તે ડેટાને સંશોધિત કરો</translation> <translation id="2482878487686419369">નોટિફિકેશનો</translation> <translation id="2482895651873876648">ગ્રૂપ <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" />માં ટૅબને ખસેડવામાં આવી</translation> @@ -1976,7 +1973,6 @@ <translation id="2813094189969465044">પેરેંટલ કન્ટ્રોલ</translation> <translation id="281390819046738856">વિનંતી પર સહી કરી શક્યાં નથી.</translation> <translation id="2814489978934728345">આ પેજ લોડ કરવાનું રોકો</translation> -<translation id="281504910091592009">સાચવેલા પાસવર્ડ તમારા <ph name="BEGIN_LINK" />Google એકાઉન્ટ<ph name="END_LINK" />માં જુઓ અને મેનેજ કરો</translation> <translation id="2815693974042551705">બુકમાર્ક ફોલ્ડર</translation> <translation id="2816319641769218778">તમારા Google એકાઉન્ટમાં પાસવર્ડ સાચવવા માટે, સિંક કરવાનું ચાલુ કરો.</translation> <translation id="2816628817680324566">આ સાઇટને તમારી સિક્યુરિટી કી ઓળખવાની મંજૂરી આપીએ?</translation> @@ -4276,7 +4272,6 @@ <translation id="5078638979202084724">બધા ટૅબ્સ બુકમાર્ક કરો</translation> <translation id="5078796286268621944">ખોટો PIN</translation> <translation id="5079010647467150187">બિલ્ટ-ઇન VPN ઉમેરો...</translation> -<translation id="5079950360618752063">સૂચવેલ પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="508059534790499809">Kerberosની ટિકિટ રિફ્રેશ કરો</translation> <translation id="5084328598860513926">સેટઅપનો ફ્લૉ અવરોધિત થયો હતો. કૃપા કરીને ફરીથી પ્રયાસ કરો અથવા તમારા ડિવાઇસના માલિક અથવા વ્યવસ્થાપકનો સંપર્ક કરો. ભૂલનો કોડ: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">અપડેટ્સ માટે તપાસી રહ્યું છે</translation> @@ -4402,7 +4397,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ને ડિલીટ કરી દઈએ?</translation> <translation id="520621735928254154">પ્રમાણપત્ર આયાત કરવામાં ભૂલ</translation> <translation id="5206562235913517859">છૂટક વેપારીના સ્ટોરનું ID ABC-1234 ફૉર્મેટમાં છે</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. તમે ચેડાં કરાયેલો વધુ # પાસવર્ડ ધરાવો છો. Chrome આ પાસવર્ડને અત્યારે ચેક કરવાની ભલામણ કરે છે.}one{ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. તમે ચેડાં કરાયેલા વધુ # પાસવર્ડ ધરાવો છો. Chrome આ પાસવર્ડને અત્યારે ચેક કરવાની ભલામણ કરે છે.}other{ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. તમે ચેડાં કરાયેલા વધુ # પાસવર્ડ ધરાવો છો. Chrome આ પાસવર્ડને અત્યારે ચેક કરવાની ભલામણ કરે છે.}}</translation> <translation id="5207949376430453814">ટેક્સ્ટ કૅરેટને હાઇલાઇટ કરો</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ખાતરી કરવા માગે છે કે તમે યોગ્ય ChromeOS ડિવાઇસનો ઉપયોગ કરી રહ્યાં છો કે નહીં.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> પ્રમાણીકરણ ટોકન સ્ટોર થઈ રહ્યું છે</translation> @@ -6235,7 +6229,6 @@ <translation id="6970861306198150268">તમે આ સાઇટ માટેનો તમારો વર્તમાન પાસવર્ડ સાચવો એ વાતની ખાતરી કરો</translation> <translation id="6972180789171089114">ઑડિયો/વીડિયો</translation> <translation id="6972754398087986839">પ્રારંભ કરો</translation> -<translation id="6972887130317925583">ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. કોઈપણ સમયે <ph name="SETTINGS" />માં તમારા પાસવર્ડ ચેક કરો.</translation> <translation id="697312151395002334">પૉપ-અપ મોકલવા અને રીડાયરેક્ટનો ઉપયોગ કરવાની મંજૂરી છે</translation> <translation id="6973611239564315524">Debian 10 માટેનું અપગ્રેડ (Buster) ઉપલબ્ધ છે</translation> <translation id="69739764870135975">જો Google તમારું ડિફૉલ્ટ શોધ એન્જિન પણ હોય, તો તમને બહેતર અને સંદર્ભ સાથે સંબંધિત સૂચનો જોવા મળશે</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index c951f4dd..ab5acdf0 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">आपका संगठन, शेयर करने के विकल्प मैनेज करता है. कुछ आइटम छिपे हो सकते हैं.</translation> <translation id="1622054403950683339">सेव किए गए वाई-फ़ाई नेटवर्क को भूल जाएं</translation> <translation id="1623723619460186680">नीली रोशनी का कम होना</translation> -<translation id="1624012933569991823">सेटिंग</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> को हमेशा के लिए हटा दिया गया है</translation> <translation id="1624863973697515675">यह फ़ाइल बहुत बड़ी है, इसलिए आपका डिवाइस इसे मैनेज नहीं कर सकता. इसे किसी दूसरे डिवाइस पर डाउनलोड करके देखें</translation> <translation id="1627276047960621195">फ़ाइल वर्णनकर्ता</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">मज़बूत पासवर्ड इस्तेमाल करें</translation> <translation id="1900305421498694955">Google Play के ऐप्लिकेशन को फ़ाइल सिस्टम के हर तरह के ऐक्सेस की ज़रूरत हो सकती है, ताकि वे बाहरी स्टोरेज वाले डिवाइस पर फ़ाइलों को पढ़ और सेव कर पाएं. डिवाइस पर बनाई गई फ़ाइलों और फ़ोल्डर को बाहरी डिस्क का इस्तेमाल करने वाला कोई भी व्यक्ति देख सकता है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&सभी को चुनें</translation> -<translation id="1901396183631570154">Chrome इन पासवर्ड को आपके Google खाते में सेव नहीं कर सका. आप अब भी उन्हें इस डिवाइस पर सेव कर सकते हैं.</translation> <translation id="1903995858055162096">क्या यह आपका डिवाइस नहीं है? <ph name="BEGIN_LINK" />मेहमान मोड<ph name="END_LINK" /> का इस्तेमाल करें.</translation> <translation id="1904580727789512086">आप जिन यूआरएल पर जाते हैं वे आपके Google खाते में सेव कर दिए जाते हैं</translation> <translation id="1905375423839394163">Chromebook डिवाइस का नाम</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> को अनइंस्टॉल करने के लिए Windows को पूरी तरह बंद करें.</translation> <translation id="2477065602824695373">आपने एक से ज़्यादा स्विच सेट अप किए हैं, इसलिए अपने-आप स्कैन होने की सुविधा बंद हो गई है.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" के लिए मीडिया-फ़ाइल अनुमतियां</translation> -<translation id="248003956660572823">पासवर्ड सेव नहीं किए गए</translation> <translation id="2480868415629598489">अपने कॉपी किए हुए और चिपकाए हुए डेटा में बदलाव करें</translation> <translation id="2482878487686419369">सूचनाएं</translation> <translation id="2482895651873876648">टैब को <ph name="GROUP_NAME" /> ग्रुप में ले जाया गया - <ph name="GROUP_CONTENTS" /></translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">माता-पिता के नियंत्रण में</translation> <translation id="281390819046738856">अनुरोध पर हस्ताक्षर नहीं किए जा सके.</translation> <translation id="2814489978934728345">इस पेज को लोड करना रोकें</translation> -<translation id="281504910091592009">अपने <ph name="BEGIN_LINK" />Google खाते<ph name="END_LINK" /> में सेव किए गए पासवर्ड देखें और उन्हें प्रबंधित करें</translation> <translation id="2815693974042551705">बुकमार्क फ़ोल्डर</translation> <translation id="2816319641769218778">अपने Google खाते में पासवर्ड सेव करने के लिए, सिंक करना चालू करें.</translation> <translation id="2816628817680324566">क्या आप इस साइट को अपनी सुरक्षा कुंजी की पहचान करने की अनुमति देना चाहते हैं?</translation> @@ -4288,7 +4284,6 @@ <translation id="5078638979202084724">सभी टैब बुकमार्क करें</translation> <translation id="5078796286268621944">गलत पिन</translation> <translation id="5079010647467150187">पहले से मौजूद वीपीएन जोड़ें...</translation> -<translation id="5079950360618752063">सुझाए गए पासवर्ड का इस्तेमाल करें</translation> <translation id="508059534790499809">Kerberos टिकट रीफ़्रेश करें</translation> <translation id="5084328598860513926">सेट अप करने के दौरान कोई गड़बड़ी हुई. कृपया फिर से कोशिश करें. इसके अलावा, डिवाइस के मालिक या एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">अपडेट जाँच रहा है</translation> @@ -4413,7 +4408,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" मिटाएं?</translation> <translation id="520621735928254154">प्रमाणपत्र आयात करने में गड़बड़ी</translation> <translation id="5206562235913517859">खुदरा दुकानदार के स्टोर के आईडी का फ़ॉर्मैट, ABC-1234 है</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{हैक किए गए या चोरी हुए पासवर्ड को बदल दिया गया है. आपका # और पासवर्ड या तो हैक हुआ है या चोरी हुआ है. Chrome अभी इस पासवर्ड की जांच करने का सुझाव देता है.}one{हैक किए गए या चोरी हुए पासवर्ड को बदल दिया गया है. आपका # और पासवर्ड या तो हैक हुआ है या चोरी हुआ है. Chrome अभी इस पासवर्ड की जांच करने का सुझाव देता है.}other{हैक किए गए या चोरी हुए पासवर्ड बदल दिए गए हैं. आपके # और पासवर्ड या तो हैक हुए हैं या चोरी हुए हैं. Chrome अभी इन पासवर्ड की जांच करने का सुझाव देता है.}}</translation> <translation id="5207949376430453814">लेख कैरेट हाइलाइट करें</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> यह देखना चाहता है कि क्या उपयोगकर्ता मंज़ूरी दिए गए किसी ChromeOS डिवाइस का इस्तेमाल कर रहे हैं.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> की पुष्टि करने वाले टोकन को सेव किया जा रहा है</translation> @@ -6239,7 +6233,6 @@ <translation id="6970861306198150268">पक्का करें कि आप इस साइट के लिए अपना मौजूदा पासवर्ड सेव कर रहे हैं</translation> <translation id="6972180789171089114">ऑडियो/वीडियो</translation> <translation id="6972754398087986839">शुरू करें</translation> -<translation id="6972887130317925583">हैक या चोरी हुआ पासवर्ड बदल दिया गया है. आप जब चाहें, <ph name="SETTINGS" /> में जाकर अपने पासवर्ड की जांच कर सकते हैं.</translation> <translation id="697312151395002334">पॉप-अप भेजने और दूसरे वेबलिंक पर भेजने वाले यूआरएल का इस्तेमाल करने की अनुमति है</translation> <translation id="6973611239564315524">Debian 10 (Buster) के लिए एक अपग्रेड उपलब्ध है</translation> <translation id="69739764870135975">अगर Google आपका डिफ़ॉल्ट सर्च इंजन भी है, तो आपको बेहतर और कॉन्टेक्स्ट के हिसाब से सुझाव मिलेंगे</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 2088343..dfb495d 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Opcijama za dijeljenje upravlja vaša organizacija. Neke su stavke možda skrivene.</translation> <translation id="1622054403950683339">Zaboravljanje Wi-Fi mreže</translation> <translation id="1623723619460186680">Redukcija plavog svjetla</translation> -<translation id="1624012933569991823">Postavke</translation> <translation id="1624599281783425761">Nećete više vidjeti trgovca <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Ova je datoteka prevelika da bi vaš uređaj njome mogao upravljati. Pokušajte je preuzeti na drugom uređaju</translation> <translation id="1627276047960621195">Deskriptori datoteke</translation> @@ -982,7 +981,6 @@ <translation id="1897120393475391208">Koristite snažnu zaporku</translation> <translation id="1900305421498694955">Aplikacije s Google Playa mogu zatražiti potpuni pristup sustavu datoteka radi čitanja i zapisivanja datoteka na vanjskim uređajima za pohranu. Datoteke i mape izrađene na uređaju vidljive su svima koji upotrebljavaju vanjski disk. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Odaberi &sve</translation> -<translation id="1901396183631570154">Chrome nije mogao spremiti ove zaporke na vaš Google račun. I dalje ih možete spremiti na ovaj uređaj.</translation> <translation id="1903995858055162096">Nije vaš uređaj? Upotrijebite <ph name="BEGIN_LINK" />način rada za goste<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-ovi koje posjećujete spremaju se na vaš Google račun</translation> <translation id="1905375423839394163">Naziv Chromebook uređaja</translation> @@ -1618,7 +1616,6 @@ <translation id="2476974672882258506">Isključite Windows da biste deinstalirali <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Budući da ste postavili više prekidača, automatsko skeniranje je isključeno.</translation> <translation id="2478176599153288112">Dozvole medijske datoteke za proširenje "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Zaporke nisu spremljene</translation> <translation id="2480868415629598489">izmjenjivati podatke koje kopirate i lijepite</translation> <translation id="2482878487686419369">Obavijesti</translation> <translation id="2482895651873876648">Kartica je premještena u grupu <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1980,7 +1977,6 @@ <translation id="2813094189969465044">Roditeljski nadzor</translation> <translation id="281390819046738856">Zahtjev nije bilo moguće potpisati.</translation> <translation id="2814489978934728345">Prekini učitavanje ove stranice</translation> -<translation id="281504910091592009">Spremljene zaporke možete pregledati i upravljati njima na svojem <ph name="BEGIN_LINK" />Google računu<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Mapa oznaka</translation> <translation id="2816319641769218778">Da biste spremili zaporke na Google račun, uključite sinkronizaciju.</translation> <translation id="2816628817680324566">Želite li dopustiti ovoj web-lokaciji identifikaciju vašeg sigurnosnog ključa?</translation> @@ -4279,7 +4275,6 @@ <translation id="5078638979202084724">Označi sve kartice</translation> <translation id="5078796286268621944">Netočan PIN</translation> <translation id="5079010647467150187">Dodavanje ugrađenog VPN-a...</translation> -<translation id="5079950360618752063">Upotrijebite predloženu zaporku</translation> <translation id="508059534790499809">Osvježite Kerberosov tiket</translation> <translation id="5084328598860513926">Prekinuo se tijek davanja pristupa. Pokušajte ponovo ili se obratite vlasniku ili administratoru uređaja. Kôd pogreške: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Provjera ažuriranja</translation> @@ -4404,7 +4399,6 @@ <translation id="5206215183583316675">Želite li izbrisati "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Pogreška pri uvozu certifikata</translation> <translation id="5206562235913517859">ID za maloprodaju je u formatu ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Uspješno ste promijenili ugroženu zaporku. Imate još # ugroženu zaporku. Chrome preporučuje da odmah provjerite tu zaporku.}one{Uspješno ste promijenili ugroženu zaporku. Imate još # ugroženu zaporku. Chrome preporučuje da odmah provjerite te zaporke.}few{Uspješno ste promijenili ugroženu zaporku. Imate još # ugrožene zaporke. Chrome preporučuje da odmah provjerite te zaporke.}other{Uspješno ste promijenili ugroženu zaporku. Imate još # ugroženih zaporki. Chrome preporučuje da odmah provjerite te zaporke.}}</translation> <translation id="5207949376430453814">Istakni znak za umetanje teksta</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> želi provjeriti upotrebljavate li uređaj s Chrome OS-om koji ispunjava kriterije.</translation> <translation id="5208548918290612795">Pohranjivanje oznake za autentifikaciju za <ph name="WEB_DRIVE" /></translation> @@ -6233,7 +6227,6 @@ <translation id="6970861306198150268">Pazite da spremate trenutačnu zaporku za ovu web-lokaciju</translation> <translation id="6972180789171089114">Audiozapisi/videozapisi</translation> <translation id="6972754398087986839">Početak upotrebe</translation> -<translation id="6972887130317925583">Uspješno ste promijenili ugroženu zaporku. Zaporke uvijek možete provjeriti u odjeljku <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Dopušteno je slanje skočnih prozora i upotreba preusmjeravanja</translation> <translation id="6973611239564315524">Dostupna je nadogradnja na Debian 10 (Buster)</translation> <translation id="69739764870135975">Ako vam je Google i zadana tražilica, prikazivat će vam se bolji, kontekstualno relevantni prijedlozi</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 590e06b..5f74c55 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">A megosztási beállításokat a szervezete kezeli. Előfordulhat, hogy bizonyos elemek el vannak rejtve.</translation> <translation id="1622054403950683339">Wi-Fi-hálózat elfelejtése</translation> <translation id="1623723619460186680">Kékfénycsökkentés</translation> -<translation id="1624012933569991823">Beállítások</translation> <translation id="1624599281783425761">A(z) <ph name="MERCHANT" /> a továbbiakban nem jelenik meg</translation> <translation id="1624863973697515675">Ez a fájl túl nagy ahhoz, hogy kezelni lehessen az eszközén. Próbálja másik eszközre letölteni.</translation> <translation id="1627276047960621195">Fájlleírók</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">Erős jelszót használjon</translation> <translation id="1900305421498694955">Előfordulhat, hogy a Google Playről származó alkalmazások hozzáférést kérnek a teljes fájlrendszerhez, hogy olvashassák és módosíthassák a külső tárolóeszközökön lévő fájlokat. Az eszközön létrehozott fájlok és mappák minden olyan személy számára láthatók, aki a külső meghajtót használja. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="1901303067676059328">Össz&es kiválasztása</translation> -<translation id="1901396183631570154">A Chrome nem tudta elmenteni ezeket a jelszavakat az Ön Google-fiókjába. Az eszközre továbbra is elmentheti őket.</translation> <translation id="1903995858055162096">Nem az Ön eszköze? Használja a <ph name="BEGIN_LINK" />Vendég módot<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">A felkeresett URL-eket a Google-fiókba menti a rendszer</translation> <translation id="1905375423839394163">A Chromebook eszköz neve</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506">Állítsa le a Windows VM-et a(z) <ph name="PARALLELS_DESKTOP" /> eltávolításához.</translation> <translation id="2477065602824695373">Mivel több kapcsolót is beállított, az automatikus keresést kikapcsolta a rendszer.</translation> <translation id="2478176599153288112">Médiafájl-engedélyek a következőnek: „<ph name="EXTENSION" />”</translation> -<translation id="248003956660572823">Nem sikerült a jelszavak mentése</translation> <translation id="2480868415629598489">Az Ön által másolt és beillesztett adatok módosítása</translation> <translation id="2482878487686419369">Értesítések</translation> <translation id="2482895651873876648">Lap áthelyezve a következő csoportba: <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">Szülői felügyelet</translation> <translation id="281390819046738856">A kérést nem lehetett aláírni.</translation> <translation id="2814489978934728345">Oldal betöltésének leállítása</translation> -<translation id="281504910091592009">Mentett jelszavait megtekintheti és kezelheti <ph name="BEGIN_LINK" />Google-fiókjában<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Könyvjelzőmappa</translation> <translation id="2816319641769218778">Ha szeretné jelszavait Google-fiókjába menteni, kapcsolja be a szinkronizálást.</translation> <translation id="2816628817680324566">Engedélyezi a webhelynek, hogy azonosíthassa a biztonsági kulcsát?</translation> @@ -4290,7 +4286,6 @@ <translation id="5078638979202084724">Összes lap hozzáadása a könyvjelzőkhöz</translation> <translation id="5078796286268621944">Helytelen PIN-kód</translation> <translation id="5079010647467150187">Beépített VPN hozzáadása…</translation> -<translation id="5079950360618752063">Javasolt jelszó használata</translation> <translation id="508059534790499809">Kerberos-jegy frissítése</translation> <translation id="5084328598860513926">Megszakadt az ellátási folyamat. Próbálja újra, illetve forduljon az eszköz tulajdonosához vagy rendszergazdájához. Hibakód: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Frissítések keresése</translation> @@ -4415,7 +4410,6 @@ <translation id="5206215183583316675">Törli a következőt: „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Tanúsítványimportálási hiba</translation> <translation id="5206562235913517859">A kiskereskedelmi üzlet azonosítója ABC-1234 formátumú</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Sikerült a nyilvánosságra került jelszó módosítása. # további jelszava került nyilvánosságra. A Chrome azt javasolja, hogy azonnal ellenőrizze ezt a jelszót.}other{Sikerült a nyilvánosságra került jelszó módosítása. # további jelszava került nyilvánosságra. A Chrome azt javasolja, hogy azonnal ellenőrizze ezeket a jelszavakat.}}</translation> <translation id="5207949376430453814">Szövegbeszúrási pont kiemelése</translation> <translation id="520840839826327499">A(z) <ph name="SERVICE_NAME" /> ellenőrizni szeretné, hogy Ön megfelelő ChromeOS-eszközt használ-e.</translation> <translation id="5208548918290612795">A következőhöz tartozó hitelesítési token tárolása: <ph name="WEB_DRIVE" /></translation> @@ -6245,7 +6239,6 @@ <translation id="6970861306198150268">Mindenképpen mentse a webhelyhez tartozó aktuális jelszavát</translation> <translation id="6972180789171089114">Hanganyag/videó</translation> <translation id="6972754398087986839">Első lépések</translation> -<translation id="6972887130317925583">Sikerült a nyilvánosságra került jelszó módosítása. Jelszavait bármikor ellenőrizheti itt: <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Megjeleníthetnek előugró ablakokat, és használhatnak átirányításokat</translation> <translation id="6973611239564315524">Frissíthet a következőre: Debian 10 (Buster)</translation> <translation id="69739764870135975">Ha a Google az alapértelmezett keresőmotorja is, jobb és a kontextusnak megfelelő javaslatokat láthat.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 0038264..c395c8f0 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Թույլտվությունների տրամադրման կարգավորումները կառավարվում են ձեր կազմակերպության կողմից։ Որոշ տարրեր կարող են թաքցված լինել։</translation> <translation id="1622054403950683339">Հեռացնել Wi-Fi ցանցը</translation> <translation id="1623723619460186680">Նվազեցնել կապույտ լույսը</translation> -<translation id="1624012933569991823">Կարգավորումներ</translation> <translation id="1624599281783425761">Ձեզ այլևս չի ցուցադրվի «<ph name="MERCHANT" />» զամբյուղը</translation> <translation id="1624863973697515675">Այս ֆայլը չափազանց մեծ է ձեր սարքի համար։ Փորձեք այն ներբեռնել մեկ այլ սարքում։</translation> <translation id="1627276047960621195">Ֆայլի նկարագրություն</translation> @@ -982,7 +981,6 @@ <translation id="1897120393475391208">Օգտագործեք հուսալի գաղտնաբառ</translation> <translation id="1900305421498694955">Google Play Խանութի հավելավածներին կարող է պահանջվել ֆայլային համակարգի լրիվ հասանելիություն՝ ֆայլերը կարդալու և արտաքին հիշասարքերում պահելու համար: Սարքում ստեղծված ֆայլերն ու պանակները տեսանելի կլինեն բոլորին, ով օգտագործում է արտաքին դրայվը: <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Ընտրել &բոլորը</translation> -<translation id="1901396183631570154">Chrome-ին չհաջողվեց պահել այս գաղտնաբառերը ձեր Google հաշվում։ Դրանք կարող եք պահել այս սարքում։</translation> <translation id="1903995858055162096">Սա ձեր սա՞րքը չէ։ Օգտագործեք <ph name="BEGIN_LINK" />հյուրի ռեժիմը<ph name="END_LINK" />։</translation> <translation id="1904580727789512086">Ձեր այցելած կայքերի հղումները պահվում են ձեր Google հաշվում</translation> <translation id="1905375423839394163">Chromebook սարքի անունը</translation> @@ -1617,7 +1615,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />-ն ապատեղադրելու համար ավարտեք Windows-ի հետ աշխատանքը։</translation> <translation id="2477065602824695373">Քանի որ դուք մի քանի փոխանջատիչ եք նշանակել, ավտոմատ սկանավորումն անջատվել է։</translation> <translation id="2478176599153288112">Մեդիա ֆայլերի օգտագործման թույլտվություններ «<ph name="EXTENSION" />»-ի համար</translation> -<translation id="248003956660572823">Գաղտնաբառերը չեն պահվել</translation> <translation id="2480868415629598489">Փոփոխել տվյալները, որոնք դուք պատճենում և տեղադրում եք</translation> <translation id="2482878487686419369">Ծանուցումներ</translation> <translation id="2482895651873876648">Ներդիրը տեղափոխվեց «<ph name="GROUP_NAME" />» խումբ – <ph name="GROUP_CONTENTS" /></translation> @@ -1979,7 +1976,6 @@ <translation id="2813094189969465044">Ծնողական վերահսկողություն</translation> <translation id="281390819046738856">Չհաջողվեց ստորագրել հարցումը։</translation> <translation id="2814489978934728345">Դադարեցնել այս էջի բեռնումը</translation> -<translation id="281504910091592009">Դիտեք և կառավարեք պահված գաղտնաբառերը ձեր <ph name="BEGIN_LINK" />Google հաշվում<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Էջանիշների պանակ</translation> <translation id="2816319641769218778">Գաղտնաբառերը ձեր Google հաշվում պահելու համար միացրեք համաժամացումը։</translation> <translation id="2816628817680324566">Թույլատրե՞լ, որ այս կայքը նույնականացնի անվտանգության բանալին</translation> @@ -2430,7 +2426,7 @@ <translation id="3275778913554317645">Բացել որպես պատուհան</translation> <translation id="3277214528693754078">Նավիգացիա տեքստային նշորդի միջոցով (ակտիվ նշորդի ռեժիմ)</translation> <translation id="3278001907972365362">Google հաշվի համար պահանջվում է գործողություն</translation> -<translation id="3279092821516760512">Նշված կոնտակտները կարող տվյալներով կիսվել ձեզ հետ, երբ մոտակայքում են։ Տվյալների փոխանցումը չի սկսվի, մինչև դուք չհաստատեք։</translation> +<translation id="3279092821516760512">Նշված կոնտակտները կարող են տվյալներով կիսվել ձեզ հետ, երբ մոտակայքում են։ Տվյալների փոխանցումը չի սկսվի, մինչև դուք չհաստատեք։</translation> <translation id="3279230909244266691">Այս գործընթացը կարող է տևել մի քանի րոպե: Վիրտուալ մեքենան գործարկվում է:</translation> <translation id="3280237271814976245">Պահել &որպես…</translation> <translation id="3280243678470289153">Շարունակել Chrome-ում</translation> @@ -4277,7 +4273,6 @@ <translation id="5078638979202084724">Էջանշել բոլոր ներդիրները</translation> <translation id="5078796286268621944">Սխալ PIN կոդ</translation> <translation id="5079010647467150187">Ավելացնել ներկառուցված VPN…</translation> -<translation id="5079950360618752063">Օգտագործել առաջարկված գաղտնաբառը</translation> <translation id="508059534790499809">Թարմացնել Kerberos տոմսը</translation> <translation id="5084328598860513926">Համաժամացումն ընդհատվել է։ Փորձեք նորից կամ կապվեք սարքի սեփականատիրոջ կամ ադմինիստրատորի հետ։ Սխալի կոդը՝ <ph name="ERROR_CODE" />։</translation> <translation id="5085162214018721575">Թարմացումների ստուգում</translation> @@ -4402,7 +4397,6 @@ <translation id="5206215183583316675">Ջնջե՞լ «<ph name="CERTIFICATE_NAME" />» հավաստագիրը։</translation> <translation id="520621735928254154">Վկայագիրը ներմուծելիս սխալ առաջացավ</translation> <translation id="5206562235913517859">Մանրածախ խանութի ID-ի ձևաչափը՝ ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Կոտրված գաղտնաբառը փոխվեց։ Դուք ունեք ևս # կոտրված գաղտնաբառ։ Chrome-ը խորհուրդ է տալիս անհապաղ ստուգել այս գաղտնաբառը։}one{Կոտրված գաղտնաբառը փոխվեց։ Դուք ունեք ևս # կոտրված գաղտնաբառ։ Chrome-ը խորհուրդ է տալիս անհապաղ ստուգել այս գաղտնաբառերը։}other{Կոտրված գաղտնաբառը փոխվեց։ Դուք ունեք ևս # կոտրված գաղտնաբառ։ Chrome-ը խորհուրդ է տալիս անհապաղ ստուգել այս գաղտնաբառերը։}}</translation> <translation id="5207949376430453814">Ընդգծել տեքստի նշորդը</translation> <translation id="520840839826327499">«<ph name="SERVICE_NAME" />» ծառայությունը ցանկանում է տեղեկություններ ստանալ ChromeOS սարքի մասին։</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> ծառայության նույնականացման թոքենի պահպանում</translation> @@ -6231,7 +6225,6 @@ <translation id="6970861306198150268">Համոզվեք, որ պահել եք այս կայքի ձեր ընթացիկ գաղտնաբառը</translation> <translation id="6972180789171089114">Աուդիո/տեսանյութեր</translation> <translation id="6972754398087986839">Սկսել աշխատանքը</translation> -<translation id="6972887130317925583">Կոտրված գաղտնաբառը փոխվեց։ Դուք ցանկացած ժամանակ կարող եք ստուգել ձեր գաղտնաբառերը՝ այցելելով <ph name="SETTINGS" />։</translation> <translation id="697312151395002334">Թույլատրվում է ցուցադրել ելնող պատուհաններ և օգտագործել վերահասցեավորումներ</translation> <translation id="6973611239564315524">Հասանելի է Debian 10-ի (Buster) նորացում</translation> <translation id="69739764870135975">Եթե Google-ը նաև ձեր կանխադրված որոնողական համակարգն է, դուք կտեսնեք ավելի լավ և համապատասխան առաջարկներ։</translation> @@ -6588,7 +6581,7 @@ <translation id="7348093485538360975">Էկրանի ստեղնաշար</translation> <translation id="7349010927677336670">Տեսանյութի հստակությունը</translation> <translation id="7352651011704765696">Ինչ-որ սխալ տեղի ունեցավ</translation> -<translation id="7353261921908507769">Ձեր կոնտակտները կարող տվյալներով կիսվել ձեզ հետ, երբ մոտակայքում են։ Տվյալների փոխանցումը չի սկսվի, մինչև դուք չհաստատեք։</translation> +<translation id="7353261921908507769">Ձեր կոնտակտները կարող են տվյալներով կիսվել ձեզ հետ, երբ մոտակայքում են։ Տվյալների փոխանցումը չի սկսվի, մինչև դուք չհաստատեք։</translation> <translation id="735361434055555355">Linux-ը տեղադրվում է...</translation> <translation id="7354341762311560488">Մատնահետքերի սկաները ստեղնաշարի ձախ կողմի ստեղնն է (ներքևում)։ Ցանկացած մատով թեթևակի հպեք այդ ստեղնին։</translation> <translation id="7356908624372060336">Ցանցային մատյաններ</translation> @@ -7634,7 +7627,7 @@ <translation id="8327386430364625757">Մաթեմատիկական տառատեսակ</translation> <translation id="8327676037044516220">Թույլտվություններ և բովանդակության կարգավորումներ</translation> <translation id="8330617762701840933">Կայքերի ցուցակը, որոնք վերաուղղորդում են դեպի այլընտրանքային դիտարկիչ։</translation> -<translation id="8330689128072902965">Մոտ գտնվող կոնտակտները կարող տվյալներով կիսվել ձեզ հետ։ Հպեք՝ կարգավորումները փոփոխելու համար։</translation> +<translation id="8330689128072902965">Մոտ գտնվող կոնտակտները կարող են տվյալներով կիսվել ձեզ հետ։ Հպեք՝ կարգավորումները փոփոխելու համար։</translation> <translation id="8331323939220256760">{FILE_TYPE_COUNT,plural, =1{Ֆայլի աջակցվող տեսակ՝ <ph name="FILE_TYPE1" />}=2{Ֆայլերի աջակցվող տեսակներ՝ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />}=3{Ֆայլերի աջակցվող տեսակներ՝ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />}=4{Ֆայլերի աջակցվող տեսակներ՝ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />, <ph name="FILE_TYPE4" />}one{Ֆայլերի աջակցվող տեսակներ՝ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />, <ph name="FILE_TYPE4" /> (<ph name="LINK" />ու ևս {OVERFLOW_COUNT}-ը<ph name="END_LINK" />)}other{Ֆայլերի աջակցվող տեսակներ՝ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />, <ph name="FILE_TYPE4" /> (<ph name="LINK" />ու ևս {OVERFLOW_COUNT}-ը<ph name="END_LINK" />)}}</translation> <translation id="8331822764922665615">Անվանեք ձեր խումբը, ընտրեք գույն և սեղմեք Esc ստեղնը</translation> <translation id="833256022891467078">Crostini-ի ընդհանուր պանակներ</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index a32257d..6e2ebabd 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Opsi untuk berbagi dikelola oleh organisasi Anda. Beberapa item mungkin tersembunyi.</translation> <translation id="1622054403950683339">Lupakan jaringan Wi-Fi</translation> <translation id="1623723619460186680">Pengurangan cahaya biru</translation> -<translation id="1624012933569991823">Setelan</translation> <translation id="1624599281783425761">Anda tidak akan melihat <ph name="MERCHANT" /> lagi</translation> <translation id="1624863973697515675">File ini terlalu besar untuk dikelola perangkat Anda. Coba download di perangkat lain</translation> <translation id="1627276047960621195">Deskriptor File</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">Gunakan sandi kuat</translation> <translation id="1900305421498694955">Aplikasi dari Google Play mungkin meminta akses sistem file penuh untuk membaca dan menulis file di perangkat penyimpanan eksternal. File dan folder yang dibuat di perangkat dapat dilihat oleh siapa saja yang menggunakan drive eksternal. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Pilih semu&a</translation> -<translation id="1901396183631570154">Chrome tidak dapat menyimpan sandi ini di Akun Google Anda. Anda masih dapat menyimpannya di perangkat ini.</translation> <translation id="1903995858055162096">Bukan perangkat Anda? Gunakan <ph name="BEGIN_LINK" />mode Tamu<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL yang Anda buka disimpan ke Akun Google Anda</translation> <translation id="1905375423839394163">Nama perangkat Chromebook</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506">Matikan Windows untuk menguninstal <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Karena Anda menyiapkan beberapa tombol akses, pemindaian otomatis telah dinonaktifkan.</translation> <translation id="2478176599153288112">Izin File-Media untuk "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Sandi tidak disimpan</translation> <translation id="2480868415629598489">Mengubah data yang Anda salin dan tempel</translation> <translation id="2482878487686419369">Notifikasi</translation> <translation id="2482895651873876648">Tab dipindahkan ke grup <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">Kontrol orang tua</translation> <translation id="281390819046738856">Permintaan tidak dapat ditandatangani.</translation> <translation id="2814489978934728345">Berhenti membuka halaman ini</translation> -<translation id="281504910091592009">Lihat dan kelola sandi tersimpan di <ph name="BEGIN_LINK" />Akun Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Folder bookmark</translation> <translation id="2816319641769218778">Untuk menyimpan sandi ke Akun Google Anda, aktifkan sinkronisasi.</translation> <translation id="2816628817680324566">Izinkan situs ini mengidentifikasi kunci keamanan Anda?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">Bookmark semua tab</translation> <translation id="5078796286268621944">PIN salah</translation> <translation id="5079010647467150187">Tambahkan VPN bawaan ...</translation> -<translation id="5079950360618752063">Gunakan sandi yang disarankan</translation> <translation id="508059534790499809">Perbarui tiket Kerberos</translation> <translation id="5084328598860513926">Alur penyediaan terganggu. Coba lagi atau hubungi pemilik atau administrator perangkat Anda. Kode error: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Memeriksa pembaruan</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">Hapus "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Kesalahan Impor Sertifikat</translation> <translation id="5206562235913517859">ID toko retailer berformat ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Berhasil mengubah sandi yang telah dibobol. Anda memiliki # sandi lainnya yang telah dibobol. Chrome merekomendasikan untuk memeriksa sandi ini sekarang.}other{Berhasil mengubah sandi yang telah dibobol. Anda memiliki # sandi lainnya yang telah dibobol. Chrome merekomendasikan untuk memeriksa sandi ini sekarang.}}</translation> <translation id="5207949376430453814">Sorot tempat penyisipan teks</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ingin memeriksa apakah Anda menggunakan perangkat ChromeOS yang memenuhi syarat.</translation> <translation id="5208548918290612795">Menyimpan Token Autentikasi <ph name="WEB_DRIVE" /></translation> @@ -6245,7 +6239,6 @@ <translation id="6970861306198150268">Pastikan Anda menyimpan sandi saat ini untuk situs ini</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Mulai</translation> -<translation id="6972887130317925583">Berhasil mengubah sandi yang telah dibobol. Periksa sandi Anda kapan saja di <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Diizinkan mengirim pop-up dan menggunakan pengalihan</translation> <translation id="6973611239564315524">Upgrade ke versi Debian 10 (Buster) sudah tersedia</translation> <translation id="69739764870135975">Jika Google juga merupakan mesin telusur default Anda, Anda akan melihat saran yang lebih baik dan relevan secara kontekstual</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 91cca32..25f24db 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">Fyrirtækið þitt stjórnar valkostum deilingar. Sum atriði kunna að vera falin.</translation> <translation id="1622054403950683339">Gleyma Wi-Fi neti</translation> <translation id="1623723619460186680">Dregið úr bláu ljósi</translation> -<translation id="1624012933569991823">Stillingar</translation> <translation id="1624599281783425761">Þú munt ekki sjá <ph name="MERCHANT" /> aftur</translation> <translation id="1624863973697515675">Þessi skrá er of stór fyrir tækið þitt. Prófaðu að sækja hana í öðru tæki</translation> <translation id="1627276047960621195">Skráarlýsendur</translation> @@ -993,7 +992,6 @@ <translation id="1897120393475391208">Nota traust aðgangsorð</translation> <translation id="1900305421498694955">Forrit frá Google Play kunna að gera kröfu um fullan aðgang að skráakerfinu til að geta lesið og skrifað skrár á lausum geymslumiðlum. Allir sem nota lausa drifið geta séð skrár og möppur sem búnar eru til í þessu tæki. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Velja &allt</translation> -<translation id="1901396183631570154">Chrome gat ekki vistað þessi aðgangsorð á Google reikningnum þínum. Þú getur samt sem áður vistað þau á þessu tæki.</translation> <translation id="1903995858055162096">Ekki tækið þitt? Notaðu <ph name="BEGIN_LINK" />gestastillingu<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Vefslóðirnar sem þú opnar eru vistaðar á Google reikningnum þínum</translation> <translation id="1905375423839394163">Heiti Chromebook tækis</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">Lokaðu Windows til að fjarlægja <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Slökkt var á sjálfvirkri skönnun vegna þess að þú hefur sett upp marga rofa.</translation> <translation id="2478176599153288112">Heimildir margmiðlunarskráa fyrir „<ph name="EXTENSION" />“</translation> -<translation id="248003956660572823">Aðgangsorð eru ekki vistuð</translation> <translation id="2480868415629598489">Breyta gögnum sem þú afritar og límir</translation> <translation id="2482878487686419369">Tilkynningar</translation> <translation id="2482895651873876648">Flipi færður inn í hópinn <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Barnalæsing</translation> <translation id="281390819046738856">Ekki var hægt að undirrita beiðni.</translation> <translation id="2814489978934728345">Stöðva hleðslu þessarar síðu</translation> -<translation id="281504910091592009">Þú getur skoðað og haft umsjón með vistuðum aðgangsorðum á <ph name="BEGIN_LINK" />Google reikningnum<ph name="END_LINK" /> þínum</translation> <translation id="2815693974042551705">Bókamerkjamappa</translation> <translation id="2816319641769218778">Kveiktu á samstillingu til að vista aðgangsorð á Google reikningnum þínum.</translation> <translation id="2816628817680324566">Viltu leyfa þessu vefsvæði að sjá öryggislykilinn þinn?</translation> @@ -4293,7 +4289,6 @@ <translation id="5078638979202084724">Bókamerkja alla flipa</translation> <translation id="5078796286268621944">Rangt PIN-númer</translation> <translation id="5079010647467150187">Bæta við innbyggðu VPN...</translation> -<translation id="5079950360618752063">Nota tillögu að aðgangsorði</translation> <translation id="508059534790499809">Endurnýja Kerberos-miða</translation> <translation id="5084328598860513926">Úthlutunaraðferð var trufluð. Reyndu aftur eða hafðu samband við eiganda tækisins þíns eða kerfisstjóra. Villukóði: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Leitar að uppfærslum</translation> @@ -4418,7 +4413,6 @@ <translation id="5206215183583316675">Eyða „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Villa við innflutning á vottorði</translation> <translation id="5206562235913517859">Verslunarauðkenni söluaðila er á sniðinu ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Aðgangsorði í hættu var breytt. # aðgangsorð í viðbót er í hættu. Chrome mælir með að þú athugir þetta aðgangsorð núna.}one{Aðgangsorði í hættu var breytt. # aðgangsorð í viðbót er í hættu. Chrome mælir með að þú athugir þessi aðgangsorð núna.}other{Aðgangsorði í hættu var breytt. # aðgangsorð í viðbót eru í hættu. Chrome mælir með að þú athugir þessi aðgangsorð núna.}}</translation> <translation id="5207949376430453814">Auðkenna textainnskotsmerki</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> vill kanna hvort þú sért að nota gjaldgengt ChromeOS tæki.</translation> <translation id="5208548918290612795">Geymir auðkenningarlykil <ph name="WEB_DRIVE" /></translation> @@ -6248,7 +6242,6 @@ <translation id="6970861306198150268">Gakktu úr skugga um að þú sért að vista núverandi aðgangsorð þitt fyrir þetta vefsvæði</translation> <translation id="6972180789171089114">Hljóð/myndskeið</translation> <translation id="6972754398087986839">Byrja</translation> -<translation id="6972887130317925583">Aðgangsorði í hættu var breytt. Athugaðu aðgangsorðin þín hvenær sem er í <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Mega senda sprettiglugga og nota framsendingu.</translation> <translation id="6973611239564315524">Uppfærsla í Debian 10 (Buster) er í boði</translation> <translation id="69739764870135975">Ef þú notar Google einnig sem sjálfgefna leitarvél færðu betri tillögur með viðeigandi samhengi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index da748d44e..50f0888 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Le opzioni per la condivisione sono gestite dalla tua organizzazione. Alcuni elementi potrebbero essere nascosti.</translation> <translation id="1622054403950683339">Elimina rete Wi-Fi</translation> <translation id="1623723619460186680">Riduzione della luce blu</translation> -<translation id="1624012933569991823">Impostazioni</translation> <translation id="1624599281783425761">Non vedrai più <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Questo file è troppo grande per poter essere gestito dal tuo dispositivo. Prova a scaricarlo da un altro dispositivo</translation> <translation id="1627276047960621195">Descrittori di file</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Usa password efficace</translation> <translation id="1900305421498694955">Le app di Google Play potrebbero richiedere accesso completo al file system per leggere e scrivere sui file memorizzati sui dispositivi di archiviazione esterni. I file e le cartelle creati sul dispositivo sono visibili a chiunque usi l'unità esterna. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Seleziona &tutto</translation> -<translation id="1901396183631570154">Chrome non ha potuto salvare queste password nel tuo Account Google, ma puoi comunque salvarle sul dispositivo.</translation> <translation id="1903995858055162096">Non stai usando il tuo dispositivo? Usa la <ph name="BEGIN_LINK" />modalità ospite<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Gli URL che visiti vengono salvati nel tuo Account Google</translation> <translation id="1905375423839394163">Nome del dispositivo Chromebook</translation> @@ -1615,7 +1613,6 @@ <translation id="2476974672882258506">Arresta la VM Windows per disinstallare <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Dato che hai configurato più sensori, la scansione automatica è stata disattivata.</translation> <translation id="2478176599153288112">Autorizzazioni file multimediali per "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Password non salvate</translation> <translation id="2480868415629598489">Modifica dei dati copiati e incollati</translation> <translation id="2482878487686419369">Notifiche</translation> <translation id="2482895651873876648">Scheda spostata nel gruppo <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1977,7 +1974,6 @@ <translation id="2813094189969465044">Controllo genitori</translation> <translation id="281390819046738856">Impossibile firmare la richiesta.</translation> <translation id="2814489978934728345">Interrompi il caricamento della pagina</translation> -<translation id="281504910091592009">Visualizza e gestisci le password salvate nel tuo <ph name="BEGIN_LINK" />Account Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Aggiungi la cartella ai segnalibri</translation> <translation id="2816319641769218778">Attiva la sincronizzazione per salvare le password nel tuo Account Google.</translation> <translation id="2816628817680324566">Vuoi consentire a questo sito di identificare il tuo token di sicurezza?</translation> @@ -4276,7 +4272,6 @@ <translation id="5078638979202084724">Aggiungi tutte le schede ai Preferiti</translation> <translation id="5078796286268621944">PIN errato</translation> <translation id="5079010647467150187">Aggiungi VPN integrata…</translation> -<translation id="5079950360618752063">Utilizza la password suggerita</translation> <translation id="508059534790499809">Aggiorna una richiesta di Kerberos</translation> <translation id="5084328598860513926">Il flusso di provisioning è stato interrotto. Riprova oppure contatta l'amministratore o il proprietario del dispositivo. Codice di errore: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Verifica disponibilità aggiornamenti</translation> @@ -4401,7 +4396,6 @@ <translation id="5206215183583316675">Eliminare "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Errore di importazione del certificato</translation> <translation id="5206562235913517859">Il formato dell'ID del negozio del rivenditore è ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Password compromessa cambiata. Hai # altra password compromessa. Chrome consiglia di controllarla subito.}other{Password compromessa cambiata. Hai altre # password compromesse. Chrome consiglia di controllarle subito.}}</translation> <translation id="5207949376430453814">Evidenzia il cursore di testo</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> chiede di controllare che tu stia utilizzando un dispositivo Chrome OS idoneo.</translation> <translation id="5208548918290612795">Archiviazione del token di autenticazione <ph name="WEB_DRIVE" /></translation> @@ -6226,7 +6220,6 @@ <translation id="6970861306198150268">Assicurati di salvare la tua password corrente per questo sito</translation> <translation id="6972180789171089114">Audio/video</translation> <translation id="6972754398087986839">Inizia</translation> -<translation id="6972887130317925583">Password compromessa cambiata. Controlla le password in qualsiasi momento in <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Possono inviare popup e utilizzare reindirizzamenti</translation> <translation id="6973611239564315524">È disponibile un upgrade a Debian 10 (Buster)</translation> <translation id="69739764870135975">Se Google è anche il tuo motore di ricerca predefinito, riceverai suggerimenti migliori e pertinenti al contesto</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 6876967..23f32be 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">האפשרויות לשיתוף מנוהלות על ידי הארגון שלך. יכול להיות שחלק מהפריטים יהיו מוסתרים.</translation> <translation id="1622054403950683339">מחיקת רשת ה-Wi-Fi</translation> <translation id="1623723619460186680">הפחתה של פליטת אור כחול</translation> -<translation id="1624012933569991823">הגדרות</translation> <translation id="1624599281783425761">המוכר <ph name="MERCHANT" /> לא יוצג לך שוב</translation> <translation id="1624863973697515675">המכשיר שלך לא מסוגל לטפל בקובץ הזה כי הוא גדול מדי. אפשר לנסות להוריד אותו במכשיר אחר</translation> <translation id="1627276047960621195">מתארי קבצים</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">שימוש בסיסמה חזקה</translation> <translation id="1900305421498694955">ייתכן שלאפליקציות מ-Google Play תידרש גישה מלאה למערכת הקבצים לצורך קריאה וכתיבה של קבצים בהתקני אחסון חיצוניים. הקבצים והתיקיות שנוצרים במכשיר גלויים לכל מי שמשתמש בכונן החיצוני. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="1901303067676059328">בחירת &הכול</translation> -<translation id="1901396183631570154">לא הייתה ל-Chrome אפשרות לשמור את הסיסמאות האלה בחשבון Google שלך. עדיין אפשר לשמור אותן במכשיר הזה.</translation> <translation id="1903995858055162096">המכשיר הזה לא שלך? אפשר להשתמש ב<ph name="BEGIN_LINK" />מצב אורח<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">כתובות ה-URL שנכנסת אליהן נשמרות בחשבון Google</translation> <translation id="1905375423839394163">שם מכשיר Chromebook</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506">יש לכבות את Windows כדי להסיר את <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">הסריקה האוטומטית מושבתת כי הגדרת כמה מתגים.</translation> <translation id="2478176599153288112">הרשאות של קובץ מדיה עבור "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">הסיסמאות לא נשמרו</translation> <translation id="2480868415629598489">שינוי נתונים שהעתקת והדבקת</translation> <translation id="2482878487686419369">התראות</translation> <translation id="2482895651873876648">הכרטיסייה הועברה לקבוצה <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">בקרת הורים</translation> <translation id="281390819046738856">לא ניתן לחתום על הבקשה.</translation> <translation id="2814489978934728345">הפסקת טעינת הדף</translation> -<translation id="281504910091592009">הצגה וניהול של סיסמאות שמורות ב<ph name="BEGIN_LINK" />חשבון Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">הוספת התיקייה לסימניות</translation> <translation id="2816319641769218778">כדי לשמור סיסמאות בחשבון Google, יש להפעיל את הסנכרון.</translation> <translation id="2816628817680324566">האם לאפשר לאתר הזה לזהות את מפתח האבטחה שלך?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">יצירת סימנייה לכל הכרטיסיות</translation> <translation id="5078796286268621944">PIN שגוי</translation> <translation id="5079010647467150187">הוספת רשת VPN מובנית…</translation> -<translation id="5079950360618752063">שימוש בסיסמה המוצעת</translation> <translation id="508059534790499809">רענון של כרטיס Kerberos</translation> <translation id="5084328598860513926">תהליך ההכנה לשימוש נקטע. יש לנסות שוב, או לפנות לבעלים או למנהל של המכשיר. קוד שגיאה: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">חיפוש עדכונים מתבצע</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">האם למחוק את "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">שגיאה בייבוא האישור</translation> <translation id="5206562235913517859">הפורמט של מזהה החנות הקמעונאית הוא ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{הסיסמה שנחשפה הוחלפה בהצלחה. נותרה עוד סיסמה אחת שנחשפה. ההמלצה של Chrome היא לבדוק את הסיסמה הזו עכשיו.}two{הסיסמה שנחשפה הוחלפה בהצלחה. נותרו עוד # סיסמאות שנחשפו. ההמלצה של Chrome היא לבדוק את הסיסמאות האלה עכשיו.}many{הסיסמה שנחשפה הוחלפה בהצלחה. נותרו עוד # סיסמאות שנחשפו. ההמלצה של Chrome היא לבדוק את הסיסמאות האלה עכשיו.}other{הסיסמה שנחשפה הוחלפה בהצלחה. נותרו עוד # סיסמאות שנחשפו. ההמלצה של Chrome היא לבדוק את הסיסמאות האלה עכשיו.}}</translation> <translation id="5207949376430453814">הדגשה של סמן הטקסט</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> רוצה לוודא שמכשיר ה-ChromeOS שלך כשיר.</translation> <translation id="5208548918290612795">אחסון אסימון אימות של <ph name="WEB_DRIVE" /></translation> @@ -6249,7 +6243,6 @@ <translation id="6970861306198150268">עליך להקפיד לשמור את הסיסמה המעודכנת לאתר הזה</translation> <translation id="6972180789171089114">אודיו/וידאו</translation> <translation id="6972754398087986839">תחילת העבודה</translation> -<translation id="6972887130317925583">הסיסמה שנחשפה הוחלפה בהצלחה. אפשר לבדוק את הסיסמאות שלך בכל שלב דרך ה<ph name="SETTINGS" />.</translation> <translation id="697312151395002334">מורשים להציג חלונות קופצים ולהשתמש בהפניות אוטומטיות</translation> <translation id="6973611239564315524">קיים עדכון זמין ל-Debian 10 (Buster)</translation> <translation id="69739764870135975">אם Google הוא גם מנוע החיפוש המוגדר אצלך כברירת מחדל, יוצגו לך הצעות משופרות ורלוונטיות מבחינת הקשר.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 04d4321..e6c9504 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">共有オプションは組織によって管理されています。一部のアイテムは表示されていない可能性があります。</translation> <translation id="1622054403950683339">Wi-Fi ネットワークの削除</translation> <translation id="1623723619460186680">ブルーライトの軽減</translation> -<translation id="1624012933569991823">設定</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> は今後表示されません</translation> <translation id="1624863973697515675">このファイルはデバイスで管理するには大きすぎます。別のデバイスでダウンロードしてみてください</translation> <translation id="1627276047960621195">ファイル記述子</translation> @@ -976,7 +975,6 @@ <translation id="1897120393475391208">安全なパスワードを使用</translation> <translation id="1900305421498694955">Google Play のアプリで外部ストレージ デバイスのファイルの読み取りと書き込みを行うには、ファイル システムへのフルアクセスが必要となる場合があります。デバイス上に作成されたファイルやフォルダは、外部ドライブを使用する全員に表示されます。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="1901303067676059328">すべて選択(&A)</translation> -<translation id="1901396183631570154">Chrome では、次のパスワードを Google アカウントに保存できませんでした。ただし、このデバイスに保存することは可能です。</translation> <translation id="1903995858055162096">自分のデバイスではない場合、<ph name="BEGIN_LINK" />ゲストモード<ph name="END_LINK" />を使用してください。</translation> <translation id="1904580727789512086">アクセスした URL は Google アカウントに保存されます</translation> <translation id="1905375423839394163">Chromebook デバイス名</translation> @@ -1609,7 +1607,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> をアンインストールするには Windows をシャットダウンしてください。</translation> <translation id="2477065602824695373">複数のスイッチを設定したため、自動スキャンがオフになっています。</translation> <translation id="2478176599153288112">「<ph name="EXTENSION" />」のメディアファイル権限</translation> -<translation id="248003956660572823">パスワードは保存されていません</translation> <translation id="2480868415629598489">コピーして貼り付けるデータの修正</translation> <translation id="2482878487686419369">通知</translation> <translation id="2482895651873876648">タブを <ph name="GROUP_NAME" /> グループに移動しました - <ph name="GROUP_CONTENTS" /></translation> @@ -1969,7 +1966,6 @@ <translation id="2813094189969465044">保護者による使用制限</translation> <translation id="281390819046738856">リクエストに署名できませんでした。</translation> <translation id="2814489978934728345">このページの読み込みを停止します</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google アカウント<ph name="END_LINK" />での保存パスワードの表示と管理</translation> <translation id="2815693974042551705">ブックマーク フォルダ</translation> <translation id="2816319641769218778">パスワードを Google アカウントに保存するには、同期を有効にします。</translation> <translation id="2816628817680324566">このサイトによるセキュリティ キーの読み取りを許可しますか?</translation> @@ -4260,7 +4256,6 @@ <translation id="5078638979202084724">すべてのタブをブックマークに追加する</translation> <translation id="5078796286268621944">PIN が正しくありません</translation> <translation id="5079010647467150187">組み込みの VPN を追加...</translation> -<translation id="5079950360618752063">提案されたパスワードを使用</translation> <translation id="508059534790499809">Kerberos チケットの更新</translation> <translation id="5084328598860513926">プロビジョニング フローが中断されました。もう一度お試しいただくか、デバイス所有者または管理者にお問い合わせください。エラーコード: <ph name="ERROR_CODE" />。</translation> <translation id="5085162214018721575">アップデートを確認しています</translation> @@ -4384,7 +4379,6 @@ <translation id="5206215183583316675">「<ph name="CERTIFICATE_NAME" />」を削除しますか?</translation> <translation id="520621735928254154">証明書のインポート エラー</translation> <translation id="5206562235913517859">販売店 ID は「ABC-1234」の形式です</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{不正使用されたパスワードを変更しました。不正使用されたパスワードは他にも # 件あります。このパスワードを今すぐ確認することをおすすめします。}other{不正使用されたパスワードを変更しました。不正使用されたパスワードは他にも # 件あります。これらのパスワードを今すぐ確認することをおすすめします。}}</translation> <translation id="5207949376430453814">テキスト カーソルをハイライト表示する</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> により、ご使用の Chrome OS デバイスが対象かどうかの確認が行われます。</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> 認証トークンの保存</translation> @@ -6202,7 +6196,6 @@ <translation id="6970861306198150268">このサイトの現在のパスワードを保存していることをご確認ください</translation> <translation id="6972180789171089114">音声または動画</translation> <translation id="6972754398087986839">開始する</translation> -<translation id="6972887130317925583">不正使用されたパスワードを変更しました。パスワードは <ph name="SETTINGS" /> でいつでも確認できます。</translation> <translation id="697312151395002334">ポップアップの送信やリダイレクトの使用を許可するサイト</translation> <translation id="6973611239564315524">Debian 10(Buster)にアップグレードできます</translation> <translation id="69739764870135975">既定の検索エンジンが Google の場合は、コンテンツとより関連性の高い候補が表示されます</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 4ea5ce9..0a13163 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">გაზიარების ვარიანტებს მართავს თქვენი ორგანიზაცია. ზოგიერთი ერთეული, შესაძლოა, დამალული იყოს.</translation> <translation id="1622054403950683339">Wi-Fi ქსელის დავიწყება</translation> <translation id="1623723619460186680">ლურჯი შუქის შემცირება</translation> -<translation id="1624012933569991823">პარამეტრები</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> თქვენთვის აღარ გამოჩნდება</translation> <translation id="1624863973697515675">ეს ფაილი ზედმეტად დიდია თქვენი მოწყობილობის მეშვეობით მართვისთვის. ცადეთ მისი ჩამოტვირთვა სხვა მოწყობილობაზე.</translation> <translation id="1627276047960621195">ფაილური დესკრიპტორები</translation> @@ -981,7 +980,6 @@ <translation id="1897120393475391208">ძლიერი პაროლის გამოყენება</translation> <translation id="1900305421498694955">Google Play-დან ჩამოტვირთულმა აპებმა შეიძლება მოითხოვოს სრული წვდომა ფაილების სისტემაზე, რათა წაიკითხოს და ჩაწეროს ფაილები მეხსიერების გარე მოწყობილობებზე. მოწყობილობაზე შექმნილი ფაილები და საქაღალდეები ხილულია გარე დისკის ნებისმიერი მომხმარებლისთვის. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&ყველას არჩევა</translation> -<translation id="1901396183631570154">Chrome-მა ვერ მოახერხა ამ პაროლების თქვენს Google ანგარიშში შენახვა. თქვენ მაინც შეგიძლიათ მათი შენახვა ამ მოწყობილობაზე.</translation> <translation id="1903995858055162096">არ არის თქვენი მოწყობილობა? ისარგებლეთ <ph name="BEGIN_LINK" />სტუმრის რეჟიმით<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">თქვენ მიერ მონახულებული URL-ები ინახება თქვენს Google ანგარიშში</translation> <translation id="1905375423839394163">Chromebook მოწყობილობის სახელი</translation> @@ -1616,7 +1614,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />-ის დეინსტალაციისთვის გამორთეთ Windows.</translation> <translation id="2477065602824695373">ვინაიდან რამდენიმე გადამრთველი დააყენეთ, ავტომატური სკანირება გამოირთო.</translation> <translation id="2478176599153288112">მედია ფაილის ნებართვები „<ph name="EXTENSION" />“-თვის</translation> -<translation id="248003956660572823">პაროლების შენახვა ვერ მოხერხდა</translation> <translation id="2480868415629598489">თქვენ მიერ კოპირებული და ჩასმული მონაცემების შეცვლა</translation> <translation id="2482878487686419369">შეტყობინებები</translation> <translation id="2482895651873876648">ჩანართი გადატანილია ჯგუფში <ph name="GROUP_NAME" /> — <ph name="GROUP_CONTENTS" /></translation> @@ -1978,7 +1975,6 @@ <translation id="2813094189969465044">მშობლის მიერ კონტროლი</translation> <translation id="281390819046738856">მოთხოვნის ხელმოწერა ვერ მოხერხდა.</translation> <translation id="2814489978934728345">ამ გვერდის ჩატვირთვის შეწყვეტა</translation> -<translation id="281504910091592009">ნახეთ და მართეთ შენახული პაროლები თქვენს <ph name="BEGIN_LINK" />Google ანგარიშში<ph name="END_LINK" /></translation> <translation id="2815693974042551705">მონიშნულების საქაღალდე</translation> <translation id="2816319641769218778">თქვენს Google ანგარიშში პაროლების შესანახად ჩართეთ სინქრონიზაცია.</translation> <translation id="2816628817680324566">გსურთ, ამ საიტმა თქვენი უსაფრთხოების გასაღების იდენტიფიცირება მოახდინოს?</translation> @@ -4278,7 +4274,6 @@ <translation id="5078638979202084724">ყველა ჩანართის სანიშნეებში ჩამატება</translation> <translation id="5078796286268621944">არასწორი პინი</translation> <translation id="5079010647467150187">ჩაშენებული VPN-ის დამატება...</translation> -<translation id="5079950360618752063">შემოთავაზებული პაროლის გამოყენება</translation> <translation id="508059534790499809">Kerberos ბილეთის განახლება</translation> <translation id="5084328598860513926">უზრუნველყოფის ნაკადი შეფერხდა. ცადეთ ხელახლა ან დაუკავშირდით მოწყობილობის მფლობელს/ადმინისტრატორს. შეცდომის კოდი: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">განახლებების შემოწმება</translation> @@ -4404,7 +4399,6 @@ <translation id="5206215183583316675">გსურთ, წაიშალოს „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">შეცდომა სერტიფიკატის იმპორტისას</translation> <translation id="5206562235913517859">საცალო მოვაჭრე მაღაზიის ID-ის ფორმატია ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{გატეხილი პაროლები წარმატებით შეიცვალა. დაგრჩათ # გატეხილი პაროლი. Chrome გირჩევთ, ახლავე შეამოწმოთ ეს პაროლი.}other{გატეხილი პაროლები წარმატებით შეიცვალა. დაგრჩათ # გატეხილი პაროლი. Chrome გირჩევთ, ახლავე შეამოწმოთ ეს პაროლები.}}</translation> <translation id="5207949376430453814">ტექსტის კურსორის გამოყოფა</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ითხოვს იმის შემოწმებას, აკმაყოფილებს თუ არა თქვენი ChromeOS მოწყობილობა შემოთავაზების მოთხოვნებს.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> ავტორიზაციის ჟეტონის შენახვა</translation> @@ -6233,7 +6227,6 @@ <translation id="6970861306198150268">დარწმუნდით, რომ ამ საიტისთვის თქვენს ამჟამინდელ პაროლს ინახავთ</translation> <translation id="6972180789171089114">აუდიო/ვიდეო</translation> <translation id="6972754398087986839">დაწყება</translation> -<translation id="6972887130317925583">გატეხილი პაროლები წარმატებით შეიცვალა. პაროლების ნებისმიერ დროს შესამოწმებლად მოინახულეთ <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">ამომხტარი ფანჯრების გამოგზავნა და გადამისამართებების გამოყენება დაშვებულია</translation> <translation id="6973611239564315524">ხელმისაწვდომია Debian 10-ზე (Buster) განახლება</translation> <translation id="69739764870135975">თუ Google თქვენი ნაგულისხმევი საძიებო სისტემაცაა, უკეთეს, კონტექსტური თვალსაზრისით შესაფერის, შემოთავაზებებს იხილავთ</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index de890457..bfe955ff 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -661,7 +661,6 @@ <translation id="1621984899599015181">Бөлісу опцияларын ұйымыңыз басқарады. Кейбір элементтер жасырылған болуы мүмкін.</translation> <translation id="1622054403950683339">Wi-Fi желісін жою</translation> <translation id="1623723619460186680">Көк жарықты азайту</translation> -<translation id="1624012933569991823">Параметрлер</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> енді қайта көрсетілмейтін болады.</translation> <translation id="1624863973697515675">Бұл файл тым үлкен. Құрылғы оны өңдей алмайды. Басқа құрылғыда жүктеп алыңыз.</translation> <translation id="1627276047960621195">Файл сипаттауыштары</translation> @@ -977,7 +976,6 @@ <translation id="1897120393475391208">Күрделі құпия сөз пайдалану керек пе?</translation> <translation id="1900305421498694955">Google Play қолданбалары сыртқы жад құрылғыларындағы файлдарды оқу және жазу үшін файл жүйесін толық пайдалану рұқсатын қажет етуі мүмкін. Бұл құрылғыда жасалған файлдар мен қалталарды сыртқы дискіні қолданатын кез келген адам көре алады. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Барлығын &таңдау</translation> -<translation id="1901396183631570154">Chrome браузері Google аккаунтын сақтай алмады. Оларды осы құрылғыға сақтай алады.</translation> <translation id="1903995858055162096">Сіздің құрылғыңыз емес пе? <ph name="BEGIN_LINK" />Қонақ режимін<ph name="END_LINK" /> пайдаланыңыз.</translation> <translation id="1904580727789512086">Кірген URL мекенжайларыңыз Google аккаунтыңызға сақталады.</translation> <translation id="1905375423839394163">Chromebook құрылғысының атауы</translation> @@ -1612,7 +1610,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> бағдарламасын жою үшін Windows жүйесін өшіріңіз.</translation> <translation id="2477065602824695373">Бірнеше ауыстырғыш тағайындалғандықтан, автосканерлеу функциясы өшірілді.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" үшін мультимедиа файлының рұқсаттары</translation> -<translation id="248003956660572823">Құпия сөздер сақталмаған</translation> <translation id="2480868415629598489">Көшіріліп қойылатын деректерді жаңарту</translation> <translation id="2482878487686419369">Хабарландырулар</translation> <translation id="2482895651873876648">Қойынды "<ph name="GROUP_NAME" />" тобына (<ph name="GROUP_CONTENTS" />) жылжытылды.</translation> @@ -1974,7 +1971,6 @@ <translation id="2813094189969465044">Ата-ана бақылауы</translation> <translation id="281390819046738856">Сұрауға қол қойылмады.</translation> <translation id="2814489978934728345">Бұл бетті жүктеуді тоқтату</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google аккаунтыңызда<ph name="END_LINK" /> сақталған құпия сөздерді көру және басқару</translation> <translation id="2815693974042551705">Бетбелгі қалтасы</translation> <translation id="2816319641769218778">Google аккаунтыңызға құпия сөздерді сақтау үшін синхрондауды қосыңыз.</translation> <translation id="2816628817680324566">Бұл сайтқа қауіпсіздік кілтін анықтауға рұқсат етілсін бе?</translation> @@ -4273,7 +4269,6 @@ <translation id="5078638979202084724">Барлық қойындыларды бетбелгілерге қосу</translation> <translation id="5078796286268621944">PIN коды дұрыс емес</translation> <translation id="5079010647467150187">Ендірілген VPN қосу…</translation> -<translation id="5079950360618752063">Ұсынылған құпия сөзді пайдалану</translation> <translation id="508059534790499809">Kerberos билетін жаңарту</translation> <translation id="5084328598860513926">Инициализация үзілді. Әрекетті қайталаңыз немесе құрылғының иесіне не әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Жаңартуларды тексеру</translation> @@ -4398,7 +4393,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" сертификатын жою керек пе?</translation> <translation id="520621735928254154">Сертификатты импорттау қатесі</translation> <translation id="5206562235913517859">Бөлшек сатушы дүкенінің идентификаторы (ABC-1234 форматында)</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Ұрланған құпия сөз өзгертілді. Тағы # құпия сөзіңіз ұрланған. Chrome осы құпия сөзді қазір тексеруге кеңес береді.}other{Ұрланған құпия сөз өзгертілді. Тағы # құпия сөзіңіз ұрланған. Chrome осы құпия сөздерді қазір тексеруге кеңес береді.}}</translation> <translation id="5207949376430453814">Мәтін курсорын ерекшелеу</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> жарамды ChromeOS құрылғысын пайдаланып жатқаныңызды тексергісі келеді.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> аутентификация токенін сақтау</translation> @@ -6223,7 +6217,6 @@ <translation id="6970861306198150268">Осы сайттың ағымдағы құпия сөзін сақтап жатқаныңызға көз жеткізіңіз.</translation> <translation id="6972180789171089114">Аудиомазмұн/Бейне</translation> <translation id="6972754398087986839">Іске кірісу</translation> -<translation id="6972887130317925583">Ұрланған құпия сөз өзгертілді. Құпия сөздеріңізді <ph name="SETTINGS" /> бөлімінен кез келген кезде тексере аласыз.</translation> <translation id="697312151395002334">Қалқымалы терезелерді жіберу мен бағытты ауыстыру функцияларын пайдалануға рұқсаты барлар</translation> <translation id="6973611239564315524">Debian 10 (Buster) нұсқасы қолжетімді</translation> <translation id="69739764870135975">Егер Google әдепкі іздеу жүйесі болса, сізге тиімді, контекске сай ұсыныстар беріледі.</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 8803310..868d53c 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">ជម្រើសនៃការចែករំលែកស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក។ ទំនិញមួយចំនួនអាចត្រូវបានលាក់។</translation> <translation id="1622054403950683339">បំភ្លេចបណ្តាញ Wi-Fi</translation> <translation id="1623723619460186680">ការកាត់បន្ថយពន្លឺពណ៌ខៀវ</translation> -<translation id="1624012933569991823">ការកំណត់</translation> <translation id="1624599281783425761">អ្នកនឹងមើលមិនឃើញ <ph name="MERCHANT" /> ទៀតទេ</translation> <translation id="1624863973697515675">ឯកសារនេះធំពេកសម្រាប់ឧបករណ៍របស់អ្នកក្នុងការគ្រប់គ្រង។ សូមព្យាយាមទាញយកវានៅលើឧបករណ៍ផ្សេងទៀត</translation> <translation id="1627276047960621195">អង្គពិពណ៌នាឯកសារ</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">ប្រើពាក្យសម្ងាត់ខ្លាំង</translation> <translation id="1900305421498694955">កម្មវិធីពី Google Play អាចតម្រូវឱ្យមានសិទ្ធិចូលប្រើប្រព័ន្ធឯកសារពេញលេញ ដើម្បីអាន និងសរសេរឯកសារនៅលើឧបករណ៍ផ្ទុកខាងក្រៅ។ អ្នកដែលប្រើថាសខាងក្រៅអាចមើលឃើញឯកសារ និងថតដែលបានបង្កើតនៅលើឧបករណ៍នេះ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="1901303067676059328">ជ្រើសរើសទាំងអស់</translation> -<translation id="1901396183631570154">Chrome មិនអាចរក្សាទុកពាក្យសម្ងាត់ទាំងនេះនៅក្នុងគណនី Google របស់អ្នកបានទេ។ អ្នកនៅតែអាចរក្សាទុកពាក្យសម្ងាត់ទាំងនេះនៅលើឧបករណ៍នេះបានដដែល។</translation> <translation id="1903995858055162096">មិនមែនឧបករណ៍របស់អ្នកទេឬ? សូមប្រើ<ph name="BEGIN_LINK" />មុខងារភ្ញៀវ<ph name="END_LINK" />។</translation> <translation id="1904580727789512086">URL ដែលអ្នកចូលមើលត្រូវបានរក្សាទុកក្នុងគណនី Google របស់អ្នក</translation> <translation id="1905375423839394163">ឈ្មោះឧបករណ៍ Chromebook</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506">បិទ Windows ដើម្បីលុប <ph name="PARALLELS_DESKTOP" />។</translation> <translation id="2477065602824695373">ដោយសារអ្នកបានរៀបចំឧបករណ៍ចុចច្រើន ការស្កេនដោយស្វ័យប្រវត្តិត្រូវបានបិទ។</translation> <translation id="2478176599153288112">ការអនុញ្ញាតឯកសារកំសាន្តសម្រាប់ "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">មិនបានរក្សាទុកពាក្យសម្ងាត់ទេ</translation> <translation id="2480868415629598489">កែតម្រូវទិន្នន័យដែលអ្នកចម្លង និងបិទភ្ជាប់</translation> <translation id="2482878487686419369">ការជូនដំណឹង</translation> <translation id="2482895651873876648">បានផ្លាស់ទីផ្ទាំងទៅក្នុងក្រុម <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">ការគ្រប់គ្រងដោយមាតាបិតា</translation> <translation id="281390819046738856">មិនអាចចុះហត្ថលេខាលើសំណើបានទេ។</translation> <translation id="2814489978934728345">បញ្ឈប់ដំណើរការទំព័រនេះ</translation> -<translation id="281504910091592009">មើល និងគ្រប់គ្រងពាក្យសម្ងាត់ដែលបានរក្សាទុកនៅក្នុង<ph name="BEGIN_LINK" />គណនី Google<ph name="END_LINK" /> របស់អ្នក</translation> <translation id="2815693974042551705">ថតឯកសារចំណាំ</translation> <translation id="2816319641769218778">ដើម្បីរក្សាពាក្យសម្ងាត់ទៅក្នុងគណនី Google របស់អ្នក សូមបើក "សមកាលកម្ម"។</translation> <translation id="2816628817680324566">អនុញ្ញាតឱ្យគេហទំព័រនេះកំណត់អត្តសញ្ញាណសោសុវត្ថិភាពរបស់អ្នកឬ?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">ចំណាំផ្ទាំងទាំងអស់</translation> <translation id="5078796286268621944">លេខសម្គាល់មិនត្រឹមត្រូវ</translation> <translation id="5079010647467150187">បញ្ចូល VPN ដែលភ្ជាប់មកជាមួយស្រាប់...</translation> -<translation id="5079950360618752063">ប្រើពាក្យសម្ងាត់ដែលបានណែនាំ</translation> <translation id="508059534790499809">ផ្ទុកសំបុត្រ Kerberos ឡើងវិញ</translation> <translation id="5084328598860513926">ដំណើរការរៀបចំត្រូវបានកាត់ផ្ដាច់។ សូមព្យាយាមម្ដងទៀត ឬទាក់ទងអ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍របស់អ្នក។ លេខកូដបញ្ហា៖ <ph name="ERROR_CODE" />។</translation> <translation id="5085162214018721575">កំពុងពិនិត្យរកការធ្វើបច្ចុប្បន្នភាព</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">លុប "<ph name="CERTIFICATE_NAME" />" ឬ?</translation> <translation id="520621735928254154">មានកំហុសក្នុងការនាំចូលវិញ្ញាបនបត្រ</translation> <translation id="5206562235913517859">កូដសម្គាល់ហាងលក់រាយមានទម្រង់ ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{បានប្ដូរពាក្យសម្ងាត់ដែលរងការលុកលុយដោយជោគជ័យហើយ។ អ្នកមានពាក្យសម្ងាត់ដែលរងការលុកលុយ # ទៀត។ Chrome ណែនាំឱ្យពិនិត្យមើលពាក្យសម្ងាត់នេះឥឡូវនេះ។}other{បានប្ដូរពាក្យសម្ងាត់ដែលរងការលុកលុយដោយជោគជ័យហើយ។ អ្នកមានពាក្យសម្ងាត់ដែលរងការលុកលុយ # ទៀត។ Chrome ណែនាំឱ្យពិនិត្យមើលពាក្យសម្ងាត់ទាំងនេះឥឡូវនេះ។}}</translation> <translation id="5207949376430453814">រំលេចសញ្ញាអត្ថបទ</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ចង់ពិនិត្យមើលថាអ្នកកំពុងប្រើឧបករណ៍ ChromeOS ដែលមានសិទ្ធិឬអត់។</translation> <translation id="5208548918290612795">ការរក្សាទុកថូខិននៃការផ្ទៀងផ្ទាត់ <ph name="WEB_DRIVE" /></translation> @@ -6246,7 +6240,6 @@ <translation id="6970861306198150268">សូមប្រាកដថា អ្នកកំពុងរក្សាទុកពាក្យសម្ងាត់បច្ចុប្បន្នរបស់អ្នកសម្រាប់គេហទំព័រនេះ</translation> <translation id="6972180789171089114">សំឡេង/វីដេអូ</translation> <translation id="6972754398087986839">ចាប់ផ្ដើម</translation> -<translation id="6972887130317925583">បានប្ដូរពាក្យសម្ងាត់ដែលរងការលុកលុយដោយជោគជ័យហើយ។ ពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានគ្រប់ពេលនៅក្នុង <ph name="SETTINGS" />។</translation> <translation id="697312151395002334">អនុញ្ញាតឱ្យផ្ញើផ្ទាំងលោតឡើង និងប្រើការបញ្ជូនបន្ត</translation> <translation id="6973611239564315524">មានកំណែថ្មីសម្រាប់ដំឡើងទៅ Debian 10 (Buster)</translation> <translation id="69739764870135975">ប្រសិនបើ Google ក៏ជាម៉ាស៊ីនស្វែងរកលំនាំដើមរបស់អ្នកដែរ អ្នកនឹងមើលឃើញការណែនាំដែលពាក់ព័ន្ធតាមបរិបទកាន់តែប្រសើរ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index a9a7044..2d30a748 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -669,7 +669,6 @@ <translation id="1621984899599015181">ಹಂಚಿಕೊಳ್ಳುವ ಆಯ್ಕೆಗಳನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಿಸುತ್ತದೆ. ಕೆಲವು ಐಟಂಗಳು ಮರೆಯಾಗಿರಬಹುದು.</translation> <translation id="1622054403950683339">ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ ಮರೆಯಿರಿ</translation> <translation id="1623723619460186680">ನೀಲಿ ಲೈಟ್ ಕಡಿಮೆಗೊಳಿಸುವಿಕೆ</translation> -<translation id="1624012933569991823">ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="1624599281783425761">ನಿಮಗೆ ಪುನಃ <ph name="MERCHANT" /> ಕಾಣಿಸುವುದಿಲ್ಲ</translation> <translation id="1624863973697515675">ನಿಮ್ಮ ಸಾಧನವು ನಿರ್ವಹಿಸಲು ಈ ಫೈಲ್ ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ. ಇದನ್ನು ಮತ್ತೊಂದು ಸಾಧನದಲ್ಲಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="1627276047960621195">ಫೈಲ್ ವಿವರಣೆಗಳು</translation> @@ -729,6 +728,7 @@ <translation id="1676902103953506022"><ph name="DOMAIN" /> ನಲ್ಲಿ <ph name="USERNAME" /> ನ ರುಜುವಾತುಗಳು</translation> <translation id="1677306805708094828"><ph name="EXTENSION_TYPE_PARAMETER" /> ಅನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="1677472565718498478"><ph name="TIME" /> ಬಾಕಿ ಉಳಿದಿದೆ</translation> +<translation id="1678794218766467608">ಸ್ಲೀಪ್ ಮೋಡ್ನಲ್ಲಿರುವಾಗ ಅಥವಾ ಕವರ್ ಮುಚ್ಚಿದಾಗ ಲಾಕ್ ಮಾಡಿ</translation> <translation id="1679068421605151609">ಡೆವಲಪರ್ ಟೂಲ್ಸ್</translation> <translation id="1679810534535368772">ನೀವು ಖಚಿತವಾಗಿಯೂ ನಿರ್ಗಮಿಸಲು ಬಯಸುವಿರಾ?</translation> <translation id="167983332380191032">ನಿರ್ವಹಣಾ ಸೇವೆಯು HTTP ದೋಷ ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದೆ.</translation> @@ -985,7 +985,6 @@ <translation id="1897120393475391208">ಸದೃಢ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ</translation> <translation id="1900305421498694955">Google Play ನಿಂದ ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಆ್ಯಪ್ಗಳು, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಸಾಧನಗಳಲ್ಲಿರುವ ಫೈಲ್ಗಳನ್ನು ರೀಡ್ ಮಾಡಲು ಮತ್ತು ರೈಟ್ ಮಾಡಲು ಪೂರ್ಣ ಫೈಲ್ ಸಿಸ್ಟಂ ಅನ್ನು ಪ್ರವೇಶಿಸಬೇಕಾಗಬಹುದು. ಸಾಧನದಲ್ಲಿ ರಚಿಸಲಾದ ಫೈಲ್ಗಳು ಮತ್ತು ಫೋಲ್ಡರ್ಗಳು ಬಾಹ್ಯ ಡ್ರೈವ್ ಬಳಸುವ ಯಾರಿಗಾದರೂ ಗೋಚರಿಸುತ್ತವೆ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&ಎಲ್ಲ ಆಯ್ಕೆ ಮಾಡಿ</translation> -<translation id="1901396183631570154">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲು Chrome ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಆದರೂ ಅವುಗಳನ್ನು ಈ ಸಾಧನದಲ್ಲಿ ನೀವು ಉಳಿಸಬಹುದು.</translation> <translation id="1903995858055162096">ನಿಮ್ಮ ಸಾಧನವಲ್ಲವೇ? <ph name="BEGIN_LINK" />ಅತಿಥಿ ಮೋಡ್<ph name="END_LINK" /> ಬಳಸಿ.</translation> <translation id="1904580727789512086">ನೀವು ಭೇಟಿ ನೀಡುವ URL ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲಾಗುತ್ತದೆ</translation> <translation id="1905375423839394163">Chromebook ಸಾಧನದ ಹೆಸರು</translation> @@ -1623,7 +1622,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು Windows ಶಟ್ ಡೌನ್ ಮಾಡಿ.</translation> <translation id="2477065602824695373">ನೀವು ಹಲವಾರು ಸ್ವಿಚ್ಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಿದ ನಂತರ, ಸ್ವಯಂ-ಸ್ಕ್ಯಾನ್ ಅನ್ನು ಆಫ್ ಆಗಿದೆ.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" ಗಾಗಿ ಮಾಧ್ಯಮ-ಫೈಲ್ ಒಪ್ಪಿಗೆಗಳು</translation> -<translation id="248003956660572823">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲಾಗಿಲ್ಲ</translation> <translation id="2480868415629598489">ನೀವು ನಕಲಿಸಿದ ಮತ್ತು ಅಂಟಿಸಿದ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> <translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation> <translation id="2482895651873876648"><ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> ಗುಂಪಿಗೆ ಟ್ಯಾಬ್ ಅನ್ನು ಸರಿಸಲಾಗಿದೆ</translation> @@ -1985,7 +1983,6 @@ <translation id="2813094189969465044">ಪೋಷಕ ನಿಯಂತ್ರಣಗಳು</translation> <translation id="281390819046738856">ವಿನಂತಿಗೆ ಸಹಿ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> <translation id="2814489978934728345">ಈ ಪುಟ ಲೋಡ್ ಆಗುತ್ತಿರುವುದನ್ನು ತಡೆಯಿರಿ</translation> -<translation id="281504910091592009">ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿಮ್ಮ <ph name="BEGIN_LINK" />Google ಖಾತೆಯಲ್ಲಿ<ph name="END_LINK" /> ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ</translation> <translation id="2815693974042551705">ಬುಕ್ಮಾರ್ಕ್ ಫೋಲ್ಡರ್</translation> <translation id="2816319641769218778">ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲು, ಸಿಂಕ್ ಆನ್ ಮಾಡಿ.</translation> <translation id="2816628817680324566">ನಿಮ್ಮ ಭದ್ರತೆ ಕೀ ಅನ್ನು ಗುರುತಿಸಲು ಈ ಸೈಟ್ಗೆ ಅನುಮತಿಸಬೇಕೆ?</translation> @@ -3802,6 +3799,7 @@ <translation id="4586275095964870617"><ph name="URL" /> ಅನ್ನು ಪರ್ಯಾಯ ಬ್ರೌಸರ್ನಲ್ಲಿ ತೆರೆಯಲಾಗುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="4589713469967853491">ಡೌನ್ಲೋಡ್ಗಳ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಲಾಗ್ಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬರೆಯಲಾಗಿದೆ.</translation> <translation id="4590324241397107707">ಡೇಟಾಬೇಸ್ ಸಂಗ್ರಹಣೆ</translation> +<translation id="459204634473266369"><ph name="PRIMARY_EMAIL" /> ಗೆ ಯಾವುದೇ ಸಾಧನಗಳನ್ನು ಉಳಿಸಿಲ್ಲ</translation> <translation id="4592891116925567110">ಸ್ಟೈಲಸ್ ರೇಖಾಚಿತ್ರದ ಆ್ಯಪ್</translation> <translation id="4593021220803146968"><ph name="URL" /> ಗೆ &ಹೋಗಿ</translation> <translation id="4594577641390224176">ಸಿಸ್ಟಂ ಕುರಿತ ಪುಟವನ್ನು ಹುಡುಕುತ್ತಿರುವಿರಾ? ಭೇಟಿ ನೀಡಿ</translation> @@ -4286,7 +4284,6 @@ <translation id="5078638979202084724">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ</translation> <translation id="5078796286268621944">ತಪ್ಪಾದ PIN</translation> <translation id="5079010647467150187">ಬಿಲ್ಟ್-ಇನ್ VPN ಸೇರಿಸಿ...</translation> -<translation id="5079950360618752063">ಸೂಚಿಸಿರುವ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ</translation> <translation id="508059534790499809">Kerberos ಟಿಕೆಟ್ ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> <translation id="5084328598860513926">ಒದಗಿಸುವಾಗ ಅಡಚಣೆ ಉಂಟಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದ ಮಾಲೀಕರು ಅಥವಾ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ. ದೋಷ ಕೋಡ್: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">ನವೀಕರಣಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> @@ -4362,6 +4359,7 @@ <translation id="5155327081870541046">ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ, "@bookmarks" ನಂತಹ ನೀವು ಹುಡುಕಲು ಬಯಸುವ ಸೈಟ್ನ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ನಮೂದಿಸಿ. ನಂತರ, ನಿಮ್ಮ ಆದ್ಯತೆಯ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಒತ್ತಿರಿ ಮತ್ತು ನಿಮ್ಮ ಹುಡುಕಾಟ ಪದವನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="5156638757840305347">ಕರ್ಸರ್ ಕಾಣಿಸಿಕೊಂಡಾಗ ಅಥವಾ ಚಲಿಸಿದಾಗ ಅದನ್ನು ಹೈಲೈಟ್ ಮಾಡಲಾಗುತ್ತದೆ</translation> <translation id="5157635116769074044">ಆರಂಭಿಕ ಪರದೆಗೆ ಈ ಪುಟವನ್ನು ಪಿನ್ ಮಾಡಿ...</translation> +<translation id="5158206172605340248">ಉಚ್ಚಾರಣಾ ಗುರುತುಗಳ ಮೆನುವನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="5159094275429367735">Crostini ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ</translation> <translation id="5159419673777902220">ನಿಮ್ಮ ಪೋಷಕರು ವಿಸ್ತರಣೆಯ ಅನುಮತಿಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation> <translation id="5159643365935452998">ಸ್ವಯಂಚಾಲಿತ ಡೇಟಾ ತೆರವುಗೊಳಿಸುವಿಕೆಯನ್ನು ಪರಿಶೀಲಿಸಿ</translation> @@ -4411,7 +4409,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ಅಳಿಸುವುದೇ?</translation> <translation id="520621735928254154">ಪ್ರಮಾಣಪತ್ರದ ಆಮದು ದೋಷ</translation> <translation id="5206562235913517859">ರಿಟೇಲರ್ ಸ್ಟೋರ್ನ ID ABC-1234 ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿದೆ</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನೀವು ಇನ್ನೂ # ಅಪಾಯಕ್ಕೀಡಾಗಿದ ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿರುವಿರಿ. ಈಗಲೇ ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.}one{ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನೀವು ಇನ್ನೂ # ಅಪಾಯಕ್ಕೀಡಾಗಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹೊಂದಿರುವಿರಿ. ಈಗಲೇ ಈ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.}other{ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನೀವು ಇನ್ನೂ # ಅಪಾಯಕ್ಕೀಡಾಗಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹೊಂದಿರುವಿರಿ. ಈಗಲೇ ಈ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.}}</translation> <translation id="5207949376430453814">ಪಠ್ಯದಲ್ಲಿ ಕೆರೆಟ್ ಅನ್ನು ಎದ್ದುಗಾಣಿಸಿ</translation> <translation id="520840839826327499">ನೀವು ಅರ್ಹವಾದ ChromeOS ಸಾಧನವನ್ನು ಬಳಸುತ್ತಿರುವಿರಾ ಎಂಬುದನ್ನು <ph name="SERVICE_NAME" /> ಪರಿಶೀಲಿಸಲು ಬಯಸುತ್ತದೆ.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> ದೃಢೀಕರಣದ ಟೋಕನ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಲಾಗುತ್ತಿದೆ</translation> @@ -6243,7 +6240,6 @@ <translation id="6970861306198150268">ಈ ಸೈಟ್ಗೆ ಸಂಬಂಧಿಸಿದ ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ಉಳಿಸುತ್ತಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ</translation> <translation id="6972180789171089114">ಆಡಿಯೋ/ವೀಡಿಯೊ</translation> <translation id="6972754398087986839">ಪ್ರಾರಂಭಗೊಂಡಿದೆ</translation> -<translation id="6972887130317925583">ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ <ph name="SETTINGS" /> ನಲ್ಲಿ ಪರಿಶೀಲಿಸಿ.</translation> <translation id="697312151395002334">ಪಾಪ್-ಅಪ್ಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ಮರುನಿರ್ದೇಶನಗಳನ್ನು ಬಳಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="6973611239564315524">Debian 10 (Buster) ಗೆ ಅಪ್ಗ್ರೇಡ್ ಲಭ್ಯವಿದೆ</translation> <translation id="69739764870135975">Google ಸಹ ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಆಗಿದ್ದರೆ, ನಿಮಗೆ ಉತ್ತಮವಾದ, ಸಾಂದರ್ಭಿಕವಾಗಿ ಸೂಕ್ತವಾದ ಸಲಹೆಗಳು ಕಾಣಿಸುತ್ತವೆ</translation> @@ -6496,6 +6492,7 @@ <translation id="7235716375204803342">ಚಟುವಟಿಕೆಗಳನ್ನು ಪಡೆಯಲಾಗುತ್ತಿದೆ...</translation> <translation id="7235737137505019098">ಇನ್ನು ಯಾವುದೇ ಖಾತೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಭದ್ರತೆಯ ಕೀ ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶವನ್ನು ಹೊಂದಿಲ್ಲ.</translation> <translation id="7235873936132740888">ನೀವು ಕೆಲವು ಪ್ರಕಾರದ ಲಿಂಕ್ಗಳನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಸೈಟ್ಗಳು ವಿಶೇಷ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಬಲ್ಲವು, ಉದಾಹರಣೆಗೆ, ನಿಮ್ಮ ಇಮೇಲ್ ಕ್ಲೈಂಟ್ನಲ್ಲಿ ಹೊಸ ಸಂದೇಶವನ್ನು ರಚಿಸುವುದು ಅಥವಾ ನಿಮ್ಮ ಆನ್ಲೈನ್ ಕ್ಯಾಲೆಂಡರ್ಗೆ ಹೊಸ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸುವುದು</translation> +<translation id="7238609589076576185">ಉಚ್ಚಾರಣಾ ಗುರುತು ಸೇರಿಸಲಾಗಿದೆ.</translation> <translation id="7239108166256782787"><ph name="DEVICE_NAME" /> ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿದೆ</translation> <translation id="7240339475467890413">ಹೊಸ ಹಾಟ್ಸ್ಪಾಟ್ಗೆ ಸಂಪರ್ಕಗೊಳಿಸುವುದೇ?</translation> <translation id="7241389281993241388">ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಲು <ph name="TOKEN_NAME" /> ಗೆ ದಯವಿಟ್ಟು ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> @@ -7334,6 +7331,7 @@ <translation id="8030852056903932865">ಅನುಮೋದಿಸಿ</translation> <translation id="8032244173881942855">ಟ್ಯಾಬ್ಗೆ ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="8032569120109842252">ಅನುಸರಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="8033023935541439900">ಉಚ್ಚಾರಣಾ ಗುರುತುಗಳ ಮೆನು ತೆರೆಯಲಾಗಿದೆ. ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಎಡಕ್ಕೆ ಅಥವಾ ಬಲಕ್ಕೆ ಬಾಣದ ಕೀ ಅನ್ನು ಒತ್ತಿ ಹಾಗೂ ಸೇರಿಸಲು Enter ಒತ್ತಿ.</translation> <translation id="8033827949643255796">ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ</translation> <translation id="8033958968890501070">ಅವಧಿ ಮೀರಿದೆ</translation> <translation id="8035059678007243127">ಅಜ್ಞಾತ ಬ್ಯಾಕ್-ಫಾರ್ವರ್ಡ್ ಕ್ಯಾಷ್ ಮಾಡಿದ ಪುಟ: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 70041d1..be77051 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">공유 옵션은 조직에서 관리합니다. 일부 항목이 표시되지 않을 수 있습니다.</translation> <translation id="1622054403950683339">Wi-Fi 네트워크 삭제</translation> <translation id="1623723619460186680">블루라이트 줄이기</translation> -<translation id="1624012933569991823">설정</translation> <translation id="1624599281783425761"><ph name="MERCHANT" />이(가) 다시 표시되지 않음</translation> <translation id="1624863973697515675">이 기기에서 관리하기에 너무 큰 파일입니다. 다른 기기에서 다운로드해 보세요</translation> <translation id="1627276047960621195">파일 설명자</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">안전한 비밀번호를 사용하세요.</translation> <translation id="1900305421498694955">Google Play의 앱이 외부 저장장치에 있는 파일을 읽고 쓰기 위해 전체 파일 시스템 액세스 권한을 요구할 수도 있습니다. 이 기기에서 생성된 파일 및 폴더는 외장 드라이브를 사용하는 모든 사람이 볼 수 있습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="1901303067676059328">전체 선택(&A)</translation> -<translation id="1901396183631570154">Chrome에서 이 비밀번호를 Google 계정에 저장할 수 없습니다. 이 기기에는 여전히 비밀번호를 저장할 수 있습니다.</translation> <translation id="1903995858055162096">본인의 기기가 아닌가요? <ph name="BEGIN_LINK" />게스트 모드<ph name="END_LINK" />를 사용하세요.</translation> <translation id="1904580727789512086">내가 방문한 URL이 Google 계정에 저장됩니다.</translation> <translation id="1905375423839394163">Chromebook 기기 이름</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />을 제거하려면 Windows를 종료하세요.</translation> <translation id="2477065602824695373">여러 스위치를 설정했으므로 자동 스캔이 사용 중지되었습니다.</translation> <translation id="2478176599153288112">'<ph name="EXTENSION" />'의 미디어 파일 권한</translation> -<translation id="248003956660572823">비밀번호가 저장되지 않음</translation> <translation id="2480868415629598489">복사하고 붙여넣는 데이터 수정</translation> <translation id="2482878487686419369">알림</translation> <translation id="2482895651873876648"><ph name="GROUP_NAME" /> 그룹으로 탭을 이동함 - <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">자녀 보호 기능</translation> <translation id="281390819046738856">요청을 서명할 수 없습니다.</translation> <translation id="2814489978934728345">해당 페이지 로드 중지</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google 계정<ph name="END_LINK" />에서 저장된 비밀번호 보기 및 관리</translation> <translation id="2815693974042551705">북마크 폴더</translation> <translation id="2816319641769218778">Google 계정에 비밀번호를 저장하려면 동기화를 사용 설정하세요.</translation> <translation id="2816628817680324566">이 사이트에서 보안 키를 식별하도록 허용할까요?</translation> @@ -4291,7 +4287,6 @@ <translation id="5078638979202084724">모든 탭 북마크</translation> <translation id="5078796286268621944">잘못된 PIN</translation> <translation id="5079010647467150187">기본 제공 VPN 추가...</translation> -<translation id="5079950360618752063">추천 비밀번호 사용</translation> <translation id="508059534790499809">Kerberos 티켓 새로고침</translation> <translation id="5084328598860513926">프로비저닝 흐름이 중단되었습니다. 다시 시도하거나 기기 소유자 또는 관리자에게 문의하세요. 오류 코드: <ph name="ERROR_CODE" /></translation> <translation id="5085162214018721575">업데이트를 확인하는 중</translation> @@ -4416,7 +4411,6 @@ <translation id="5206215183583316675">'<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation> <translation id="520621735928254154">인증서 가져오기 오류</translation> <translation id="5206562235913517859">소매업체 매장 ID 형식: ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{유출된 비밀번호를 변경했습니다. 유출된 비밀번호가 #개 더 있습니다. 지금 바로 이 비밀번호를 확인해 보시기 바랍니다.}other{유출된 비밀번호를 변경했습니다. 유출된 비밀번호가 #개 더 있습니다. 지금 바로 이 비밀번호를 확인해 보시기 바랍니다.}}</translation> <translation id="5207949376430453814">텍스트 캐럿 강조표시</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" />에서 내가 사용 중인 ChromeOS 기기가 적합한지 확인하려고 합니다.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> 인증 토큰을 저장하는 중</translation> @@ -6244,7 +6238,6 @@ <translation id="6970861306198150268">사이트의 현재 비밀번호를 저장해 두시기 바랍니다.</translation> <translation id="6972180789171089114">오디오/비디오</translation> <translation id="6972754398087986839">시작하기</translation> -<translation id="6972887130317925583">유출된 비밀번호를 변경했습니다. 비밀번호는 언제든지 <ph name="SETTINGS" />에서 확인할 수 있습니다.</translation> <translation id="697312151395002334">팝업 전송 및 리디렉션 사용이 허용됨</translation> <translation id="6973611239564315524">Debian 10(Buster)으로 업그레이드할 수 있습니다.</translation> <translation id="69739764870135975">Google이 기본 검색엔진이기도 하면 더 정확하고 관련성 높은 제안을 볼 수 있습니다.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index cef64ce..17ee1285 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Бөлүшүү параметрлерин уюмуңуз башкарат. Айрым нерселер жашырылышы мүмкүн.</translation> <translation id="1622054403950683339">Wi-Fi тармагы унутулсун</translation> <translation id="1623723619460186680">Көк түстү азайтуу</translation> -<translation id="1624012933569991823">Жөндөөлөр</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> кайра көрсөтүлбөйт</translation> <translation id="1624863973697515675">Бул файл түзмөгүңүздө башкаруу үчүн өтө чоң. Аны башка түзмөккө жүктөп алып көрүңүз</translation> <translation id="1627276047960621195">Файл сүрөттөгүчтөр</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">Татаал сырсөздү колдонуу</translation> <translation id="1900305421498694955">Google Play'деги колдонмолор файлдарды тышкы сактагыч түзмөктөрүндө окуп, жазуу үчүн файл тутумуна толук мүмкүнчүлүк берүүнү талап кылышы мүмкүн. Түзмөктө түзүлгөн файлдар жана папкалар тышкы драйверди колдонгон ар бир кишиге көрүнүктүү болот. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Баарын тандоо</translation> -<translation id="1901396183631570154">Chrome бул сырсөздөрдү Google аккаунтуңузда сактай алган жок. Аларды бул түзмөктө сактап койсоңуз болот.</translation> <translation id="1903995858055162096">Түзмөк сиздики эмеспи? <ph name="BEGIN_LINK" />Конок режимин<ph name="END_LINK" /> колдонуңуз.</translation> <translation id="1904580727789512086">Сиз кирген URL даректери Google аккаунтуңузга сакталат</translation> <translation id="1905375423839394163">Chromebook түзмөгүнүн аталышы</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> чыгарып салуу үчүн, Windows'ту жабыңыз.</translation> <translation id="2477065602824695373">Бир нече которгучту жөндөп жатканыңыздан, автоматтык түрдө скандоо өчүрүлдү.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" үчүн Медиа-Файл уруксаттары</translation> -<translation id="248003956660572823">Сырсөздөр сакталган жок</translation> <translation id="2480868415629598489">Көчүрүлүп, коюла турган дайындарды өзгөртүү</translation> <translation id="2482878487686419369">Билдирмелер</translation> <translation id="2482895651873876648">Өтмөк төмөнкү топко жылды: <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">Ата-эненин көзөмөлү</translation> <translation id="281390819046738856">Сурамга кол коюлбай калды.</translation> <translation id="2814489978934728345">Бул беттин жүктөлүшүн токтотуу</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google аккаунтуңузда<ph name="END_LINK" /> сакталган сырсөздөрдү көрүп, башкарыңыз</translation> <translation id="2815693974042551705">Кыстарма куржуну</translation> <translation id="2816319641769218778">Сырсөздөрдү Google аккаунтуңузга сактоо үчүн шайкештирүүнү күйгүзүңүз.</translation> <translation id="2816628817680324566">Бул сайтка коопсуздук ачкычтарыңызды аныктоого уруксат бересизби?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">Бардык өтмөктөрдү кыстарып коюу</translation> <translation id="5078796286268621944">Туура эмес PIN</translation> <translation id="5079010647467150187">Камтылган VPN'ди кошуу...</translation> -<translation id="5079950360618752063">Сунушталган сырсөздү колдонуу</translation> <translation id="508059534790499809">Kerberos билетин жаңыртуу</translation> <translation id="5084328598860513926">Шайкештирүү үзгүлтүккө учурады. Кайталап көрүңүз, болбосо, түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Жаңыртуулар изделүүдө</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" жок кылынсынбы?</translation> <translation id="520621735928254154">Тастыктаманы импорттоодогу ката</translation> <translation id="5206562235913517859">Чекене сатуучу дүкөндүн идентификатору ABC-1234 форматында</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Уурдалган сырсөз ийгиликтүү өзгөртүлдү. Дагы # уурдалган сырсөз бар. Chrome бул сырсөздү азыр текшерүүнү сунуштайт.}other{Уурдалган сырсөз ийгиликтүү өзгөртүлдү. Дагы # уурдалган сырсөз бар. Chrome бул сырсөздөрдү азыр текшерүүнү сунуштайт.}}</translation> <translation id="5207949376430453814">Текст киргизүү учурунда курсор баса белгиленсин</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> кызматы ылайыктуу ChromeOS түзмөгүн колдонуп жатканыңызды текшериши керек.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> аутентификация токенин сактоо</translation> @@ -6245,7 +6239,6 @@ <translation id="6970861306198150268">Бул сайт үчүн учурдагы сырсөзүңүздү сактап калышыңыз керек</translation> <translation id="6972180789171089114">Аудио/Видео</translation> <translation id="6972754398087986839">Баштоо</translation> -<translation id="6972887130317925583">Уурдалган сырсөз ийгиликтүү өзгөртүлдү. Сырсөздөрүңүздү <ph name="SETTINGS" /> бөлүмүнөн каалаган убакта текшерип туруңуз.</translation> <translation id="697312151395002334">Калкыма терезелерди жөнөтүп, багыттоолорду колдоно алат</translation> <translation id="6973611239564315524">Debian 10 (Buster) версиясы жеткиликтүү</translation> <translation id="69739764870135975">Эгер Google демейки издөө каражатыңыз да болсо, сизге жакшыраак жана ылайыктуу сунуштар көрсөтүлөт</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index eac296f..9ea7be9 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">ຕົວເລືອກສຳລັບການແບ່ງປັນແມ່ນຈັດການໂດຍອົງການຂອງທ່ານ. ບາງລາຍການອາດຖືກເຊື່ອງໄວ້.</translation> <translation id="1622054403950683339">ລືມເຄືອຂ່າຍ Wi-Fi</translation> <translation id="1623723619460186680">ການຫຼຸດແສງສີຟ້າ</translation> -<translation id="1624012933569991823">ການຕັ້ງຄ່າ</translation> <translation id="1624599281783425761">ທ່ານຈະບໍ່ເຫັນ <ph name="MERCHANT" /> ອີກ</translation> <translation id="1624863973697515675">ໄຟລ໌ນີ້ໃຫຍ່ເກີນກວ່າອຸປະກອນຂອງທ່ານຈະຈັດການໄດ້. ກະລຸນາລອງດາວໂຫຼດມັນຢູ່ອຸປະກອນອື່ນ</translation> <translation id="1627276047960621195">ຕົວອະທິບາຍໄຟລ໌</translation> @@ -989,7 +988,6 @@ <translation id="1897120393475391208">ໃຊ້ລະຫັດຜ່ານຍາກ</translation> <translation id="1900305421498694955">ແອັບຈາກ Google Play ອາດຈະຈຳເປັນຕ້ອງມີສິດເຂົ້າເຖິງລະບົບໄຟລ໌ເຕັມເພື່ອອ່ານ ແລະ ຂຽນໄຟລ໌ໃນອຸປະກອນຈັດເກັບຂໍ້ມູນພາຍນອກ. ໄຟລ໌ ແລະ ໂຟນເດີທີ່ສ້າງຂຶ້ນໃນອຸປະກອນສາມາດເບິ່ງເຫັນໄດ້ຕໍ່ກັບທຸກຄົນຜູ້ໃຊ້ໄດຣຟ໌ພາຍນອກ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="1901303067676059328">ເລືອກທັງຫມົດ</translation> -<translation id="1901396183631570154">Chrome ບໍ່ສາມາດບັນທຶກລະຫັດຜ່ານເຫຼົ່ານີ້ໄວ້ໃນບັນຊີ Google ຂອງທ່ານ. ທ່ານສາມາດບັນທຶກພວກມັນໄວ້ໃນອຸປະກອນນີ້ໄດ້.</translation> <translation id="1903995858055162096">ບໍ່ແມ່ນອຸປະກອນຂອງທ່ານບໍ? ໃຊ້ <ph name="BEGIN_LINK" />ໂໝດແຂກ<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL ທີ່ທ່ານເຂົ້ານັ້ນຖືກບັນທຶກໄປໃສ່ບັນຊີ Google ທ່ານແລ້ວ</translation> <translation id="1905375423839394163">ຊື່ອຸປະກອນ Chromebook</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506">ປິດ Windows ເພື່ອຖອນການຕິດຕັ້ງ <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">ເນື່ອງຈາກທ່ານຕັ້ງຄ່າສະວິດຫຼາຍອັນ, ການສະແກນອັດຕະໂນມັດຈຶ່ງຖືກປິດໄວ້.</translation> <translation id="2478176599153288112">ການອະນຸຍາດໄຟລ໌ມີເດຍສໍາລັບ "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">ບໍ່ໄດ້ບັນທຶກລະຫັດຜ່ານໄວ້</translation> <translation id="2480868415629598489">ແກ້ໄຂຂໍ້ມູນທີ່ທ່ານສຳເນົາ ແລະ ວາງໃສ່</translation> <translation id="2482878487686419369">ການແຈ້ງເຕືອນ</translation> <translation id="2482895651873876648">ຍ້າຍແຖບໄປໃສ່ກຸ່ມ <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> ແລ້ວ</translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">ການຄວບຄຸມສຳລັບພໍ່ແມ່</translation> <translation id="281390819046738856">ບໍ່ສາມາດເຊັນຄຳຂໍໄດ້.</translation> <translation id="2814489978934728345">ຢຸດໂຫຼດຫນ້ານີ້</translation> -<translation id="281504910091592009">ເບິ່ງ ແລະ ຈັດການລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ໃນ <ph name="BEGIN_LINK" />ບັນຊີ Google<ph name="END_LINK" /> ຂອງທ່ານ</translation> <translation id="2815693974042551705">ໂຟລເດີບຸກມາກຄ໌</translation> <translation id="2816319641769218778">ເພື່ອບັນທຶກລະຫັດຜ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານ, ກະລຸນາເປີດການຊິ້ງຂໍ້ມູນ.</translation> <translation id="2816628817680324566">ອະນຸຍາດໃຫ້ເວັບໄຊນີ້ລະບຸກະແຈຄວາມປອດໄພຂອງທ່ານບໍ?</translation> @@ -4291,7 +4287,6 @@ <translation id="5078638979202084724">ໃສ່ບຸກມາກຄ໌ທຸກແຖບ</translation> <translation id="5078796286268621944">PIN ບໍ່ຖືກຕ້ອງ</translation> <translation id="5079010647467150187">ເພີ່ມ VPN ໃນຕົວ...</translation> -<translation id="5079950360618752063">ໃຊ້ລະຫັດຜ່ານທີ່ແນະນຳ</translation> <translation id="508059534790499809">ໂຫຼດຂໍ້ມູນປີ້ Kerberos ໃໝ່</translation> <translation id="5084328598860513926">ຂັ້ນຕອນການກະກຽມນຳໃຊ້ຖືກຂັດຈັງຫວະ. ກະລຸນາລອງໃໝ່ ຫຼື ຕິດຕໍ່ເຈົ້າຂອງ ຫຼື ຜູ້ເບິ່ງແຍງລະບົບອຸປະກອນຂອງທ່ານ. ລະຫັດຂໍ້ຜິດພາດ: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">ກໍາລັງກວດຫາການອັບເດດ</translation> @@ -4416,7 +4411,6 @@ <translation id="5206215183583316675">ລຶບ "<ph name="CERTIFICATE_NAME" />" ບໍ?</translation> <translation id="520621735928254154">ການນຳເຂົ້າໃບຢັ້ງຢືນຜິດພາດ</translation> <translation id="5206562235913517859">ID ຮ້ານຄ້າ-ຜູ້ຂາຍຍ່ອຍແມ່ນຮູບແບບ ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{ປ່ຽນລະຫັດຜ່ານທີ່ຖືກລະເມີດສຳເລັດແລ້ວ. ທ່ານມີລະຫັດຜ່ານທີ່ຖືກລະເມີດອີກ # ລາຍການ. Chrome ແນະນຳໃຫ້ກວດເບິ່ງລະຫັດຜ່ານນີ້ໃນຕອນນີ້ເລີຍ.}other{ປ່ຽນລະຫັດຜ່ານທີ່ຖືກລະເມີດສຳເລັດແລ້ວ. ທ່ານມີລະຫັດຜ່ານທີ່ຖືກລະເມີດອີກ # ລາຍການ. Chrome ແນະນຳໃຫ້ກວດເບິ່ງລະຫັດຜ່ານເຫຼົ່ານີ້ໃນຕອນນີ້ເລີຍ.}}</translation> <translation id="5207949376430453814">ໝາຍເຄື່ອງໝາຍກຸບຂໍ້ຄວາມ</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ຕ້ອງການກວດເບິ່ງວ່າທ່ານກຳລັງໃຊ້ອຸປະກອນ ChromeOS ທີ່ມີສິດຫຼືບໍ່.</translation> <translation id="5208548918290612795">ກຳລັງບັນທຶກໂທເຄນການພິສູດຢືນຢັນ <ph name="WEB_DRIVE" /></translation> @@ -6243,7 +6237,6 @@ <translation id="6970861306198150268">ກະລຸນາກວດສອບວ່າທ່ານກຳລັງບັນທຶກລະຫັດຜ່ານປັດຈຸບັນຂອງທ່ານສຳລັບເວັບໄຊນີ້</translation> <translation id="6972180789171089114">ສຽງ/ວິດີໂອ</translation> <translation id="6972754398087986839">ເລີ່ມຕົ້ນ</translation> -<translation id="6972887130317925583">ປ່ຽນລະຫັດຜ່ານທີ່ຖືກລະເມີດສຳເລັດແລ້ວ. ກວດລະຫັດຜ່ານຂອງທ່ານໄດ້ທຸກເວລາໃນ <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">ໄດ້ຮັບອະນຸຍາດໃຫ້ສົ່ງປັອບອັບ ແລະ ໃຊ້ການປ່ຽນເສັ້ນທາງ</translation> <translation id="6973611239564315524">ມີການອັບເກຣດເປັນ Debian 10 (Buster)</translation> <translation id="69739764870135975">ຫາກ Google ເປັນໂປຣແກຣມຊອກຫາເລີ່ມຕົ້ນຂອງທ່ານນຳ, ທ່ານຈະເຫັນການແນະນຳທີ່ກ່ຽວຂ້ອງຕາມບໍລິບົດທີ່ດີຂຶ້ນ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 57aa4669..d9d3b7d 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -670,7 +670,6 @@ <translation id="1621984899599015181">Bendrinimo parinktis valdo jūsų organizacija. Kai kurie elementai gali būti paslėpti.</translation> <translation id="1622054403950683339">Pamiršti „Wi-Fi“ tinklą</translation> <translation id="1623723619460186680">Mėlynos šviesos slopinimas</translation> -<translation id="1624012933569991823">Nustatymai</translation> <translation id="1624599281783425761">Nebematysite „<ph name="MERCHANT" />“</translation> <translation id="1624863973697515675">Šis failas per didelis, kad jį būtų galima tvarkyti jūsų įrenginyje. Pabandykite atsisiųsti į kitą įrenginį</translation> <translation id="1627276047960621195">Failų deskriptoriai</translation> @@ -995,7 +994,6 @@ <translation id="1897120393475391208">Naudokite sudėtingą slaptažodį</translation> <translation id="1900305421498694955">Programose iš „Google Play“ gali būti prašoma leidimo pasiekti visas failų sistemos funkcijas, kad būtų galima nuskaityti ir įrašyti failus išoriniuose saugyklos įrenginiuose. Įrenginyje sukurtus failus ir aplankus gali matyti visi, naudojantys išorinį diską. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Pasirinkti &viską</translation> -<translation id="1901396183631570154">„Chrome“ nepavyko išsaugoti šių slaptažodžių „Google“ paskyroje. Vis tiek galite juos išsaugoti šiame įrenginyje.</translation> <translation id="1903995858055162096">Ne jūsų įrenginys? Naudokite <ph name="BEGIN_LINK" />svečio režimą<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL, kuriais lankotės, išsaugomi jūsų „Google“ paskyroje</translation> <translation id="1905375423839394163">„Chromebook“ įrenginio pavadinimas</translation> @@ -1633,7 +1631,6 @@ <translation id="2476974672882258506">Išjunkite „Windows“, kad pašalintumėte „<ph name="PARALLELS_DESKTOP" />“.</translation> <translation id="2477065602824695373">Kadangi nustatėte kelis jungiklius, automatinis nuskaitymas buvo išjungtas.</translation> <translation id="2478176599153288112">Medijos failo leidimai, susiję su plėtiniu „<ph name="EXTENSION" />“</translation> -<translation id="248003956660572823">Slaptažodžiai neišsaugoti</translation> <translation id="2480868415629598489">Keisti kopijuojamus ir įklijuojamus duomenis</translation> <translation id="2482878487686419369">Pranešimai</translation> <translation id="2482895651873876648">Skirtukas perkeltas į grupę „<ph name="GROUP_NAME" />“ – <ph name="GROUP_CONTENTS" /></translation> @@ -1995,7 +1992,6 @@ <translation id="2813094189969465044">Tėvų kontrolė</translation> <translation id="281390819046738856">Nepavyko pasirašyti užklausos.</translation> <translation id="2814489978934728345">Nutraukti šio puslapio įkėlimą</translation> -<translation id="281504910091592009">Peržiūrėkite ir tvarkykite išsaugotus slaptažodžius <ph name="BEGIN_LINK" />„Google“ paskyroje<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Žymių aplankas</translation> <translation id="2816319641769218778">Jei norite, kad slaptažodžiai būtų išsaugomi „Google“ paskyroje, įjunkite sinchronizavimą.</translation> <translation id="2816628817680324566">Leisti šiai svetainei identifikuoti jūsų saugos raktą?</translation> @@ -4295,7 +4291,6 @@ <translation id="5078638979202084724">Žymėti visus skirtukus</translation> <translation id="5078796286268621944">Neteisingas PIN kodas</translation> <translation id="5079010647467150187">Pridėti įtaisytąjį VPN...</translation> -<translation id="5079950360618752063">Naudoti siūlomą slaptažodį</translation> <translation id="508059534790499809">Atnaujinti „Kerberos“ bilietą</translation> <translation id="5084328598860513926">Pertraukta aprūpinimo eiga. Bandykite dar kartą arba susisiekite su įrenginio savininku ar administratoriumi. Klaidos kodas: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Ieškoma naujinių</translation> @@ -4420,7 +4415,6 @@ <translation id="5206215183583316675">Ištrinti „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Sertifikato importavimo klaida</translation> <translation id="5206562235913517859">Mažmenininko parduotuvės ID ABC-1234 formatu</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistą slaptažodį. „Chrome“ rekomenduoja patikrinti šį slaptažodį dabar.}one{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistą slaptažodį. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}few{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistus slaptažodžius. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}many{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeisto slaptažodžio. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}other{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistų slaptažodžių. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}}</translation> <translation id="5207949376430453814">Paryškinti teksto žymeklį</translation> <translation id="520840839826327499">„<ph name="SERVICE_NAME" />“ nori patikrinti, ar naudojate tinkamą „Chrome“ OS įrenginį.</translation> <translation id="5208548918290612795">Saugomas „<ph name="WEB_DRIVE" />“ autentifikavimo prieigos raktas</translation> @@ -6255,7 +6249,6 @@ <translation id="6970861306198150268">Įsitikinkite, kad išsaugojote dabartinį šios svetainės slaptažodį</translation> <translation id="6972180789171089114">Garso / vaizdo įrašai</translation> <translation id="6972754398087986839">Darbo pradžia</translation> -<translation id="6972887130317925583">Pažeistas slaptažodis sėkmingai pakeistas. Bet kuriuo metu patikrinkite slaptažodžius skiltyje „<ph name="SETTINGS" />“.</translation> <translation id="697312151395002334">Leidžiama siųsti iššokančiuosius langus ir naudoti peradresavimus</translation> <translation id="6973611239564315524">Galima naujovinti į „Debian 10 (Buster)“</translation> <translation id="69739764870135975">Jei „Google“ taip pat yra jūsų numatytasis paieškos variklis, matysite geresnius, kontekstą atitinkančius pasiūlymus</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 2c4bb20..a5d7f066 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Kopīgošanas opcijas pārvalda jūsu organizācija. Daži vienumi var būt paslēpti.</translation> <translation id="1622054403950683339">Wi-Fi tīkla aizmiršana</translation> <translation id="1623723619460186680">Zilās gaismas samazināšana</translation> -<translation id="1624012933569991823">Iestatījumi</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> informācija vairs netiks rādīta</translation> <translation id="1624863973697515675">Šis fails jūsu ierīcei ir par lielu. Mēģiniet to lejupielādēt citā ierīcē.</translation> <translation id="1627276047960621195">Failu deskriptori</translation> @@ -982,7 +981,6 @@ <translation id="1897120393475391208">Izmantojiet drošu paroli</translation> <translation id="1900305421498694955">Dažreiz veikalā Google Play iegādātajām lietotnēm ir nepieciešama pilnīga piekļuve failu sistēmai, lai varētu lasīt un rakstīt failus ārējās krātuves ierīcēs. Ierīcē izveidotie faili un mapes ir redzamas visiem, kas lieto ārējo disku. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="1901303067676059328">Izvēlēties visus</translation> -<translation id="1901396183631570154">Pārlūks Chrome nevarēja saglabāt šīs paroles jūsu Google kontā. Tās joprojām varat saglabāt šajā ierīcē.</translation> <translation id="1903995858055162096">Vai tā nav jūsu ierīce? Izmantojiet <ph name="BEGIN_LINK" />viesa režīmu<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Jūsu apmeklētie URL tiek saglabāti Google kontā</translation> <translation id="1905375423839394163">Chromebook ierīces nosaukums</translation> @@ -1617,7 +1615,6 @@ <translation id="2476974672882258506">Lai atinstalētu <ph name="PARALLELS_DESKTOP" />, izslēdziet Windows datoru.</translation> <translation id="2477065602824695373">Tā kā iestatījāt vairākus slēdžus, automātiskā pārlūkošana ir izslēgta.</translation> <translation id="2478176599153288112">Multivides faila atļaujas paplašinājumam “<ph name="EXTENSION" />”</translation> -<translation id="248003956660572823">Paroles netika saglabātas</translation> <translation id="2480868415629598489">Modificēt datus, kurus jūs kopējat un ielīmējat</translation> <translation id="2482878487686419369">Paziņojumi</translation> <translation id="2482895651873876648">Cilne tika pārvietota uz grupu “<ph name="GROUP_NAME" />” — <ph name="GROUP_CONTENTS" /></translation> @@ -1979,7 +1976,6 @@ <translation id="2813094189969465044">Vecāku kontrole</translation> <translation id="281390819046738856">Neizdevās parakstīt pieprasījumu.</translation> <translation id="2814489978934728345">Pārtraukt šīs lapas ielādi</translation> -<translation id="281504910091592009">Skatiet un pārvaldiet saglabātās paroles savā <ph name="BEGIN_LINK" />Google kontā<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Grāmatzīmju mape</translation> <translation id="2816319641769218778">Lai saglabātu paroles savā Google kontā, ieslēdziet sinhronizāciju.</translation> <translation id="2816628817680324566">Vai atļaut šai vietnei identificēt jūsu drošības atslēgu?</translation> @@ -2557,6 +2553,7 @@ <translation id="3406290648907941085">Drīkst izmantot virtuālās realitātes ierīces un datus</translation> <translation id="3406396172897554194">Meklēt pēc valodas vai ievades metodes nosaukuma</translation> <translation id="3406605057700382950">&Rādīt grāmatzīmju joslu</translation> +<translation id="3408849592677950451">{NUM_PASSWORDS,plural, =1{Viena parole tika importēta Google paroļu pārvaldniekā kontam <ph name="USER_EMAIL" />}zero{{NUM_PASSWORDS} paroles tika importētas Google paroļu pārvaldniekā kontam <ph name="USER_EMAIL" />}one{{NUM_PASSWORDS} parole tika importēta Google paroļu pārvaldniekā kontam <ph name="USER_EMAIL" />}other{{NUM_PASSWORDS} paroles tika importētas Google paroļu pārvaldniekā kontam <ph name="USER_EMAIL" />}}</translation> <translation id="3409785640040772790">Maps</translation> <translation id="3412265149091626468">Pāriet uz atlasi</translation> <translation id="3413122095806433232">CA izsniedzēji: <ph name="LOCATION" /></translation> @@ -3740,6 +3737,7 @@ <translation id="4541123282641193691">Nevarēja verificēt kontu. Mēģiniet vēlreiz vai restartējiet Chromebook datoru.</translation> <translation id="4541662893742891060">Nevar izveidot savienojumu ar šo profilu. Lai saņemtu tehnisko atbalstu, sazinieties ar mobilo sakaru operatoru.</translation> <translation id="4541706525461326392">Notiek profila noņemšana. Tas var ilgt dažas minūtes.</translation> +<translation id="4542332958571335077">{NUM_PASSWORDS,plural, =1{Viena parole tika importēta Google paroļu pārvaldniekā šajā ierīcē}zero{{NUM_PASSWORDS} paroles tika importētas Google paroļu pārvaldniekā šajā ierīcē}one{{NUM_PASSWORDS} parole tika importēta Google paroļu pārvaldniekā šajā ierīcē}other{{NUM_PASSWORDS} paroles tika importētas Google paroļu pārvaldniekā šajā ierīcē}}</translation> <translation id="4542520061254486227">Lasīt jūsu datus vietnēs <ph name="WEBSITE_1" /> un <ph name="WEBSITE_2" /></translation> <translation id="4543778593405494224">Sertifikātu pārvaldnieks</translation> <translation id="4544174279960331769">Noklusējuma iemiesojums zilā krāsā</translation> @@ -4278,7 +4276,6 @@ <translation id="5078638979202084724">Saglabāt visas cilnes kā grāmatzīmes</translation> <translation id="5078796286268621944">Nepareizs PIN</translation> <translation id="5079010647467150187">Pievienot iebūvēto VPN...</translation> -<translation id="5079950360618752063">Izmantojiet ieteikto paroli</translation> <translation id="508059534790499809">Kerberos biļetes atsvaidzināšana</translation> <translation id="5084328598860513926">Nodrošināšanas plūsma traucēta. Lūdzu, mēģiniet vēlreiz vai sazinieties ar ierīces īpašnieku vai administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Notiek pārbaude, vai ir pieejami atjauninājumi.</translation> @@ -4403,7 +4400,6 @@ <translation id="5206215183583316675">Vai dzēst “<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Sertifikāta importēšanas kļūda</translation> <translation id="5206562235913517859">Mazumtirdzniecības veikala ID ir šādā formātā: ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Uzlauztā parole tika sekmīgi nomainīta. Jums ir vēl # uzlauzta parole. Chrome ieteikums: nekavējoties pārbaudiet šo paroli.}zero{Uzlauztā parole tika sekmīgi nomainīta. Jums ir vēl # uzlauztu paroļu. Chrome ieteikums: nekavējoties pārbaudiet šīs paroles.}one{Uzlauztā parole tika sekmīgi nomainīta. Jums ir vēl # uzlauzta parole. Chrome ieteikums: nekavējoties pārbaudiet šīs paroles.}other{Uzlauztā parole tika sekmīgi nomainīta. Jums ir vēl # uzlauztas paroles. Chrome ieteikums: nekavējoties pārbaudiet šīs paroles.}}</translation> <translation id="5207949376430453814">Izcelt teksta ievietošanas punktu</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> vēlas pārbaudīt, vai izmantojat piemērotu Chrome OS ierīci.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> autentifikācijas marķiera glabāšana</translation> @@ -6228,11 +6224,11 @@ <translation id="6968288415730398122">Ievadiet savu paroli, lai konfigurētu ekrāna bloķēšanu.</translation> <translation id="6969047215179982698">Izslēgt funkciju Kopīgošana tuvumā</translation> <translation id="6970480684834282392">Startēšanas veids</translation> +<translation id="6970543303783413625">Nevar importēt paroles. Vienlaikus varat importēt ne vairāk par <ph name="COUNT" /> parolēm.</translation> <translation id="6970856801391541997">Drukāt konkrētas lapas</translation> <translation id="6970861306198150268">Saglabājiet šīs vietnes pašreizējo paroli</translation> <translation id="6972180789171089114">Audio/video</translation> <translation id="6972754398087986839">Sākt darbu</translation> -<translation id="6972887130317925583">Uzlauztā parole tika sekmīgi nomainīta. Paroles jebkurā laikā varat pārbaudīt sadaļā <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Drīkst rādīt uznirstošos elementus un veikt novirzīšanu</translation> <translation id="6973611239564315524">Ir pieejams jauninājums uz versiju Debian 10 (Buster)</translation> <translation id="69739764870135975">Ja Google ir arī jūsu noklusējuma meklētājprogramma, tiks rādīti labāki, kontekstuāli atbilstošāki ieteikumi.</translation> @@ -6460,6 +6456,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{Iziet no lapas}zero{Iziet no lapām}one{Iziet no lapām}other{Iziet no lapām}}</translation> <translation id="7207457272187520234">Lietojuma un diagnostikas datu sūtīšana. Pašlaik dati par šo ierīci un ierīces diagnostikas un lietotņu lietojuma dati tiek automātiski sūtīti uzņēmumam Google. Šī informācija palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Šo iestatījumu ir noteicis īpašnieks. Ja ir ieslēgts iestatījums “papildu darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti jūsu Google kontā.</translation> <translation id="7207631048330366454">Meklēt lietotnes</translation> +<translation id="7210471695184432500">Lai šajā ierīcē importētu paroles Google paroļu pārvaldniekā, atlasiet CSV failu</translation> <translation id="7210499381659830293">Paplašinājuma printeri</translation> <translation id="7211783048245131419">Vēl nav piešķirts neviens slēdzis</translation> <translation id="7212097698621322584">Ievadiet pašreizējo PIN, lai to mainītu. Ja nezināt savu PIN, būs jāatiestata drošības atslēga un pēc tam jāizveido jauns PIN.</translation> @@ -7515,6 +7512,7 @@ <translation id="8206859287963243715">Mobilais tālrunis</translation> <translation id="8208216423136871611">Nesaglabāt</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Jauns paziņojums}zero{# jaunu paziņojumu}one{# jauns paziņojums}other{# jauni paziņojumi}}</translation> +<translation id="821119981794423735">Lai importētu Google paroļu pārvaldniekā konta <ph name="USER_EMAIL" /> paroles, atlasiet CSV failu</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Notiek lejupielāde}zero{Notiek lejupielāde}one{Notiek lejupielāde}other{Notiek lejupielāde}}</translation> <translation id="8213449224684199188">Ievadīts foto režīms</translation> <translation id="8214489666383623925">Atvērt failu...</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index b7cf1e5..183b596 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">Вашата организација управува со опциите за споделување. Некои работи може да се сокриени.</translation> <translation id="1622054403950683339">Заборави ја Wi-Fi мрежата</translation> <translation id="1623723619460186680">Намалување на синото светло</translation> -<translation id="1624012933569991823">Поставки</translation> <translation id="1624599281783425761">Кошничката на <ph name="MERCHANT" /> веќе нема да се прикажува</translation> <translation id="1624863973697515675">Датотекава е преголема за да може уредот да се справи со неа. Пробајте да ја преземете на друг уред</translation> <translation id="1627276047960621195">Опишувачи на датотеки</translation> @@ -728,6 +727,7 @@ <translation id="1676902103953506022">Детали за акредитивите за <ph name="USERNAME" /> на <ph name="DOMAIN" /></translation> <translation id="1677306805708094828">Не може да се додаде <ph name="EXTENSION_TYPE_PARAMETER" /></translation> <translation id="1677472565718498478">Уште <ph name="TIME" /></translation> +<translation id="1678794218766467608">Заклучувај во режим во мирување или кога капакот е затворен</translation> <translation id="1679068421605151609">Програмерски алатки</translation> <translation id="1679810534535368772">Дали сте сигурни дека сакате да излезете?</translation> <translation id="167983332380191032">Услугата за управување испрати HTTP-грешка.</translation> @@ -993,7 +993,6 @@ <translation id="1897120393475391208">Користете силна лозинка</translation> <translation id="1900305421498694955">Апликациите од Google Play може да бараат целосен пристап до системот на датотеки за да читаат и да запишуваат датотеки на надворешни уреди за складирање. Датотеките и папките создадени на уредот се видливи за сите што го користат надворешниот диск. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Избери ги &сите</translation> -<translation id="1901396183631570154">Chrome не може да ги зачува лозинкиве во сметката на Google. Сѐ уште може да ги зачувате на уредов.</translation> <translation id="1903995858055162096">Ова не е вашиот уред? Користете <ph name="BEGIN_LINK" />режим на гостин<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-адресите што ги посетувате се зачувуваат во вашата сметка на Google</translation> <translation id="1905375423839394163">Име на уредот Chromebook</translation> @@ -1631,7 +1630,6 @@ <translation id="2476974672882258506">Исклучете го Windows за да се деинсталира <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Автоматското скенирање е исклучено бидејќи доделивте повеќе прекинувачи.</translation> <translation id="2478176599153288112">Дозволи на медиумски датотеки за „<ph name="EXTENSION" />“</translation> -<translation id="248003956660572823">Лозинките не се зачувани</translation> <translation id="2480868415629598489">Измена на податоците што ги копирате</translation> <translation id="2482878487686419369">Известувања</translation> <translation id="2482895651873876648">Картичката е преместена во групата <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1991,6 @@ <translation id="2813094189969465044">Родителски контроли</translation> <translation id="281390819046738856">Барањето не може да се потпише.</translation> <translation id="2814489978934728345">Запри со вчитување на страницава</translation> -<translation id="281504910091592009">Прегледајте ги и управувајте со зачуваните лозинки во вашата <ph name="BEGIN_LINK" />сметка на Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Папка за обележувачи</translation> <translation id="2816319641769218778">За да се зачувуваат лозинки во сметката на Google, вклучете синхронизација.</translation> <translation id="2816628817680324566">Дали дозволувате сајтов да го идентификува вашиот безбедносен клуч?</translation> @@ -3810,6 +3807,7 @@ <translation id="4586275095964870617"><ph name="URL" /> не може да се отвори во алтернативен прелистувач. Контактирајте со администраторот на системот.</translation> <translation id="4589713469967853491">Евиденцијата е успешно запишана во директориумот „Преземања“.</translation> <translation id="4590324241397107707">Склад на базата со податоци</translation> +<translation id="459204634473266369">Нема зачувани уреди во <ph name="PRIMARY_EMAIL" /></translation> <translation id="4592891116925567110">Апликација за цртање со пенкало</translation> <translation id="4593021220803146968">&Оди на <ph name="URL" /></translation> <translation id="4594577641390224176">Ја барате страницата „За“ на системот? Оди</translation> @@ -4293,7 +4291,6 @@ <translation id="5078638979202084724">Обележи ги сите картички</translation> <translation id="5078796286268621944">Неточен PIN</translation> <translation id="5079010647467150187">Додајте вградена VPN…</translation> -<translation id="5079950360618752063">Користете ја предложената лозинка</translation> <translation id="508059534790499809">Освежете го билетот на Kerberos</translation> <translation id="5084328598860513926">Текот за поставување е прекинат. Обидете се повторно или контактирајте со сопственикот или администраторот на уредот. Код за грешка: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Се проверуваат ажурирања</translation> @@ -4369,6 +4366,7 @@ <translation id="5155327081870541046">Во лентата за адреси, внесете ја кратенката за сајтот што сакате да го пребарате, на пример „@bookmarks“. Потоа притиснете ја претпочитаната кратенка од тастатурата и внесете го поимот за пребарување.</translation> <translation id="5156638757840305347">Курсорот е нагласен кога се појавува или движи</translation> <translation id="5157635116769074044">Прикачи ја оваа страница на Почетен екран...</translation> +<translation id="5158206172605340248">Менито за надредни знаци е отфрлено.</translation> <translation id="5159094275429367735">Поставете го Crostini</translation> <translation id="5159419673777902220">Родителот ги оневозможил дозволите за екстензиите</translation> <translation id="5159643365935452998">Прегледајте го автоматското бришење податоци</translation> @@ -4418,7 +4416,6 @@ <translation id="5206215183583316675">Да се избрише „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Грешка при увезување сертификат</translation> <translation id="5206562235913517859">ID на малопродажната продавница е во формат ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Успешно ја променивте компромитираната лозинка. Имате уште # компромитирана лозинка. Chrome препорачува веднаш да ја проверите лозинкава.}one{Успешно ја променивте компромитираната лозинка. Имате уште # компромитирана лозинка. Chrome препорачува веднаш да ги проверите лозинкиве.}other{Успешно ја променивте компромитираната лозинка. Имате уште # компромитирани лозинки. Chrome препорачува веднаш да ги проверите лозинкиве.}}</translation> <translation id="5207949376430453814">Нагласи го каретот за текст</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> сака да провери дали користите уред со Chrome OS што ги исполнува условите.</translation> <translation id="5208548918290612795">Се складира токенот за проверка на <ph name="WEB_DRIVE" /></translation> @@ -6249,7 +6246,6 @@ <translation id="6970861306198150268">Уверете се дека ја зачувувате тековната лозинка за сајтов</translation> <translation id="6972180789171089114">Аудио/видео</translation> <translation id="6972754398087986839">Започни</translation> -<translation id="6972887130317925583">Успешно ја променивте компромитираната лозинка. Проверувајте ги лозинките во секое време во <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Дозволено им е да испраќаат скокачки програми и да користат пренасочувања</translation> <translation id="6973611239564315524">Достапна е надградба на Debian 10 (Buster)</translation> <translation id="69739764870135975">Ако Google го користите и како стандарден пребарувач, тогаш ќе добивате подобри и контекстуално релевантни предлози</translation> @@ -6501,6 +6497,7 @@ <translation id="7235716375204803342">Се преземаат активностите…</translation> <translation id="7235737137505019098">Вашиот безбедносен клуч нема доволно простор за уште сметки.</translation> <translation id="7235873936132740888">Сајтовите може да извршуваат посебни задачи кога ќе кликнете на одредени типови линкови, како на пр., создавање нова порака во клиентот за е-пошта или додавање нови настани во онлајн календарот</translation> +<translation id="7238609589076576185">Вметнат е надреден знак.</translation> <translation id="7239108166256782787"><ph name="DEVICE_NAME" /> го откажа преносот</translation> <translation id="7240339475467890413">Да се поврзе со нова точка на пристап?</translation> <translation id="7241389281993241388">Најавете се на <ph name="TOKEN_NAME" /> за да го увезете клиентскиот сертификат.</translation> @@ -7342,6 +7339,7 @@ <translation id="8030852056903932865">Одобри</translation> <translation id="8032244173881942855">Не може да се емитува картичката.</translation> <translation id="8032569120109842252">Се следи</translation> +<translation id="8033023935541439900">Менито за надредни знаци е отворено. Притиснете налево или надесно за навигација, а потоа Enter за да вметнете.</translation> <translation id="8033827949643255796">избрано</translation> <translation id="8033958968890501070">Истекување</translation> <translation id="8035059678007243127">Инкогнито страница за кеш за движење наназад/нанапред: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 531b7bb..6e3e6f8 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -663,7 +663,6 @@ <translation id="1621984899599015181">പങ്കിടുന്നതിനുള്ള ഓപ്ഷനുകൾ മാനേജ് ചെയ്യുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്. ചില ഇനങ്ങൾ മറച്ചിട്ടുണ്ടാകാം.</translation> <translation id="1622054403950683339">വൈഫൈ നെറ്റ്വർക്ക് മറക്കുക</translation> <translation id="1623723619460186680">നീല വെളിച്ചം കുറയ്ക്കൽ</translation> -<translation id="1624012933569991823">ക്രമീകരണം</translation> <translation id="1624599281783425761">നിങ്ങൾ <ph name="MERCHANT" /> വീണ്ടും കാണില്ല</translation> <translation id="1624863973697515675">ഈ ഫയലിന് നിങ്ങളുടെ ഉപകരണത്തിന് മാനേജ് ചെയ്യാനാകുന്നതിനേക്കാൾ കൂടുതൽ വലുപ്പമുണ്ട്. മറ്റൊരു ഉപകരണത്തിൽ ഇത് ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിക്കുക</translation> <translation id="1627276047960621195">ഫയൽ ഡിസ്ക്രിപറ്ററുകൾ</translation> @@ -979,7 +978,6 @@ <translation id="1897120393475391208">ശക്തമായ പാസ്വേഡ് ഉപയോഗിക്കുക</translation> <translation id="1900305421498694955">ബാഹ്യ സ്റ്റോറേജ് ഉപകരണങ്ങളിലെ ഫയലുകൾ വായിക്കാനും എഴുതാനും Google Play-ൽ നിന്നുള്ള ആപ്പുകൾക്ക് പൂർണ്ണ ഫയൽ സിസ്റ്റം ആക്സസ് ആവശ്യമായേക്കാം. ഉപകരണത്തിൽ സൃഷ്ടിച്ച ഫയലുകളും ഫോൾഡറുകളും ബാഹ്യ ഡ്രൈവ് ഉപയോഗിക്കുന്ന ആർക്കും ദൃശ്യമാകും. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="1901303067676059328">എല്ലാം &തിരഞ്ഞെടുക്കൂ</translation> -<translation id="1901396183631570154">Chrome-ന് ഈ പാസ്വേഡുകൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കാനായില്ല. എങ്കിലും അവ നിങ്ങൾക്ക് ഈ ഉപകരണത്തിൽ തുടർന്നും സൂക്ഷിക്കാനാകും.</translation> <translation id="1903995858055162096">നിങ്ങളുടെ ഉപകരണമല്ലേ? <ph name="BEGIN_LINK" />അതിഥി മോഡ്<ph name="END_LINK" /> ഉപയോഗിക്കുക.</translation> <translation id="1904580727789512086">നിങ്ങൾ സന്ദർശിക്കുന്ന URL-കൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കുന്നു</translation> <translation id="1905375423839394163">Chromebook ഉപകരണ നാമം</translation> @@ -1614,7 +1612,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> അൺഇൻസ്റ്റാൾ ചെയ്യാൻ Windows ഷട്ട് ഡൗൺ ചെയ്യുക.</translation> <translation id="2477065602824695373">നിങ്ങൾ ഒന്നിലധികം സ്വിച്ചുകൾ സജ്ജീകരിച്ചതിനാൽ സ്വയമേവ-സ്കാൻ ചെയ്യൽ ഓഫാക്കി.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" എന്നതിനായുള്ള മീഡിയ-ഫയൽ അനുമതികൾ</translation> -<translation id="248003956660572823">പാസ്വേഡ് സംരക്ഷിച്ചില്ല</translation> <translation id="2480868415629598489">നിങ്ങൾ പകർത്തി ഒട്ടിക്കുന്ന വിവരത്തിൽ മാറ്റം വരുത്തുക</translation> <translation id="2482878487686419369">അറിയിപ്പുകൾ</translation> <translation id="2482895651873876648">ടാബ് <ph name="GROUP_NAME" /> ഗ്രൂപ്പിലേക്ക് നീക്കി - <ph name="GROUP_CONTENTS" /></translation> @@ -1976,7 +1973,6 @@ <translation id="2813094189969465044">രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ</translation> <translation id="281390819046738856">അഭ്യർത്ഥന സൈൻ ചെയ്യാനായില്ല.</translation> <translation id="2814489978934728345">ഈ പേജ് ലോഡ് ചെയ്യുന്നത് നിര്ത്തുക</translation> -<translation id="281504910091592009">നിങ്ങളുടെ <ph name="BEGIN_LINK" />Google അക്കൗണ്ടിൽ<ph name="END_LINK" /> സംരക്ഷിച്ച പാസ്വേഡുകൾ കാണുക, മാനേജ് ചെയ്യുക</translation> <translation id="2815693974042551705">ഫോൾഡർ ബുക്ക്മാർക്ക് ചെയ്യുക</translation> <translation id="2816319641769218778">നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് പാസ്വേഡുകൾ സംരക്ഷിക്കാൻ, സമന്വയിപ്പിക്കൽ ഓണാക്കുക.</translation> <translation id="2816628817680324566">നിങ്ങളുടെ സുരക്ഷാ കീ തിരിച്ചറിയാൻ ഈ സൈറ്റിനെ അനുവദിക്കണോ?</translation> @@ -4274,7 +4270,6 @@ <translation id="5078638979202084724">എല്ലാ ടാബുകളും ബുക്ക്മാര്ക്ക് ചെയ്യുക</translation> <translation id="5078796286268621944">തെറ്റായ PIN</translation> <translation id="5079010647467150187">ബിൽറ്റ് ഇൻ VPN ചേർക്കുക...</translation> -<translation id="5079950360618752063">നിർദ്ദേശിച്ച പാസ്വേഡ് ഉപയോഗിക്കുക</translation> <translation id="508059534790499809">Kerberos ടിക്കറ്റ് റീഫ്രഷ് ചെയ്യുക</translation> <translation id="5084328598860513926">സജ്ജീകരിക്കുന്ന പ്രക്രിയ തടസ്സപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു</translation> @@ -4399,7 +4394,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ഇല്ലാതാക്കണോ?</translation> <translation id="520621735928254154">സർട്ടിഫിക്കറ്റ് ഇമ്പോർട്ട് ചെയ്യുന്നതിൽ പിശക്</translation> <translation id="5206562235913517859">ചില്ലറവ്യാപാരിയുടെ സ്റ്റോർ ഐഡി ABC-1234 എന്ന ഫോർമാറ്റിലാണ്</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. അപഹരിക്കപ്പെട്ട # പാസ്വേഡ് കൂടി നിങ്ങൾക്കുണ്ട്. ഈ പാസ്വേഡ് ഇപ്പോൾ തന്നെ പരിശോധിക്കാൻ Chrome നിർദ്ദേശിക്കുന്നു.}other{അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. അപഹരിക്കപ്പെട്ട # പാസ്വേഡുകൾ കൂടി നിങ്ങൾക്കുണ്ട്. ഈ പാസ്വേഡുകൾ ഇപ്പോൾ തന്നെ പരിശോധിക്കാൻ Chrome നിർദ്ദേശിക്കുന്നു.}}</translation> <translation id="5207949376430453814">ടെക്സ്റ്റ് കാരറ്റ് ഹൈലൈറ്റ് ചെയ്യുക</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> എന്നതിന്, നിങ്ങൾ യോഗ്യമായ ChromeOS ഉപകരണമാണോ ഉപയോഗിക്കുന്നതെന്ന് പരിശോധിക്കേണ്ടതുണ്ട്.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> പരിശോധിച്ചുറപ്പിക്കൽ ടോക്കൺ സംഭരിക്കുന്നു</translation> @@ -6230,7 +6224,6 @@ <translation id="6970861306198150268">ഈ സൈറ്റിനുള്ള നിങ്ങളുടെ നിലവിലെ പാസ്വേഡ് സംരക്ഷിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക</translation> <translation id="6972180789171089114">ഓഡിയോ/വീഡിയോ</translation> <translation id="6972754398087986839">ആരംഭിക്കാം</translation> -<translation id="6972887130317925583">അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. ഏത് സമയത്തും <ph name="SETTINGS" /> എന്നതിൽ നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കുക.</translation> <translation id="697312151395002334">പോപ്പ് അപ്പ് അയയ്ക്കുന്നതും റീഡയറക്റ്റുകൾ ഉപയോഗിക്കുന്നതും അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="6973611239564315524">Debian 10 (Buster) -ലേക്കുള്ള അപ്ഗ്രേഡ് ലഭ്യമാണ്</translation> <translation id="69739764870135975">Google നിങ്ങളുടെ ഡിഫോൾട്ട് തിരയൽ യന്ത്രം കൂടിയാണെങ്കിൽ, മികച്ചതും സന്ദർഭോചിതവുമായ നിർദ്ദേശങ്ങൾ നിങ്ങൾ കാണും</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 1432b47..e2881a6 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -663,7 +663,6 @@ <translation id="1621984899599015181">Хуваалцах сонголтыг танай байгууллагаас удирддаг. Зарим зүйлийг нуусан байж болзошгүй.</translation> <translation id="1622054403950683339">Wi-Fi сүлжээг мартах</translation> <translation id="1623723619460186680">Цэнхэр гэрлийн бууралт</translation> -<translation id="1624012933569991823">Тохиргоо</translation> <translation id="1624599281783425761">Та <ph name="MERCHANT" />-г дахиж харахгүй</translation> <translation id="1624863973697515675">Энэ файл таны төхөөрөмжийн татаж чадахаас хэт том хэмжээтэй байна. Үүнийг өөр төхөөрөмж дээр татаж үзнэ үү</translation> <translation id="1627276047960621195">Файл тодорхойлогч</translation> @@ -988,7 +987,6 @@ <translation id="1897120393475391208">Сайн нууц үг ашиглана уу</translation> <translation id="1900305421498694955">Google Play-н аппууд нь гадаад хадгалалтын төхөөрөмж дээр файл уншиж, бичихийн тулд файлын системийн бүрэн хандалтыг шаардаж болзошгүй. Энэ төхөөрөмж дээр үүсгэсэн файл болон фолдерыг гадаад драйв ашигладаг хүн бүр харах боломжтой. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Бүгдийг сонго &</translation> -<translation id="1901396183631570154">Chrome эдгээр нууц үгийг таны Google Бүртгэлд хадгалж чадсангүй. Та тэдгээрийг энэ төхөөрөмжид хадгалах боломжтой хэвээр байна.</translation> <translation id="1903995858055162096">Таны төхөөрөмж биш үү? <ph name="BEGIN_LINK" />Зочны горим<ph name="END_LINK" />-ыг ашиглана уу.</translation> <translation id="1904580727789512086">Таны зочилсон URL-уудыг Google Бүртгэлд тань хадгалсан.</translation> <translation id="1905375423839394163">Chromebook төхөөрөмжийн нэр</translation> @@ -1626,7 +1624,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />-г устгахын тулд Windows-г унтраана уу.</translation> <translation id="2477065602824695373">Та олон сэлгүүр тохируулсан тул автоматаар скан хийхийг унтраасан байна.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />"-ийн Медиа-Файл зөвшөөрөл</translation> -<translation id="248003956660572823">Нууц үгнүүдийг хадгалаагүй</translation> <translation id="2480868415629598489">Хуулж, буулгах өгөгдлөө өөрчлөх</translation> <translation id="2482878487686419369">Мэдэгдэл</translation> <translation id="2482895651873876648">Табыг <ph name="GROUP_NAME" /> бүлэг рүү зөөсөн - <ph name="GROUP_CONTENTS" /></translation> @@ -1988,7 +1985,6 @@ <translation id="2813094189969465044">Эцэг эхийн хяналт</translation> <translation id="281390819046738856">Хүсэлтийг гүйцэтгэх боломжгүй байна.</translation> <translation id="2814489978934728345">Энэ хуудсыг ачааллахаа зогсоо</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google Бүртгэл<ph name="END_LINK" />-дээ хадгалсан нууц үгнүүдийг харах болон удирдах</translation> <translation id="2815693974042551705">Хадгалагдсан хуудсын хавтас</translation> <translation id="2816319641769218778">Google Бүртгэлдээ нууц үг хадгалахын тулд синк хийхийг асаана уу.</translation> <translation id="2816628817680324566">Энэ сайтад таны аюулгүй байдлын түлхүүрийг тодорхойлохыг зөвшөөрөх үү?</translation> @@ -4287,7 +4283,6 @@ <translation id="5078638979202084724">Бүх цонхнуудыг жагсааж хадгалах</translation> <translation id="5078796286268621944">ПИН код буруу байна</translation> <translation id="5079010647467150187">Бүрэлдэхүүн VPN нэмэх...</translation> -<translation id="5079950360618752063">Санал болгосон нууц үг ашиглах</translation> <translation id="508059534790499809">Kerberos тасалбарыг дахин шинэчлэх</translation> <translation id="5084328598860513926">Нийлүүлэлтийн урсгал тасалдлаа. Дахин оролдоно уу эсвэл төхөөрөмж өмчлөгч, администратортайгаа холбогдоно уу. Алдааны код: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Шинэчлэлтүүдийг шалгаж байна</translation> @@ -4412,7 +4407,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"-г устгах уу?</translation> <translation id="520621735928254154">Сертификатыг импортлоход алдаа гарлаа</translation> <translation id="5206562235913517859">Жижиглэн борлуулагч дэлгүүрийн ID нь ABC-1234 формат юм</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Алдагдсан нууц үгийг амжилттай өөрчиллөө. Танд бусад # алдагдсан нууц үг байна. Chrome энэ нууц үгийг одоо шалгахыг зөвлөж байна.}other{Алдагдсан нууц үгийг амжилттай өөрчиллөө. Танд бусад # алдагдсан нууц үг байна. Chrome эдгээр нууц үгийг одоо шалгахыг зөвлөж байна.}}</translation> <translation id="5207949376430453814">Текст оруулах тэмдгийг тодруулах</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> таныг эрх бүхий ChromeOS төхөөрөмж ашиглаж байгаа эсэхийг шалгах хүсэлтэй байна.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" />-н баталгаажуулалтын токеныг хадгалж байна</translation> @@ -6241,7 +6235,6 @@ <translation id="6970861306198150268">Та энэ сайтын одоогийн нууц үгийг хадгалж байгаа эсэхээ шалгана уу</translation> <translation id="6972180789171089114">Аудио/Видео</translation> <translation id="6972754398087986839">Эхлүүлэх</translation> -<translation id="6972887130317925583">Алдагдсан нууц үгийг амжилттай өөрчиллөө. Нууц үгнүүдээ <ph name="SETTINGS" />-с хүссэн үедээ шалгана уу.</translation> <translation id="697312151395002334">Попап илгээх болон дахин чиглүүлэлт ашиглахыг зөвшөөрсөн</translation> <translation id="6973611239564315524">Debian 10 (Buster) руу дэвшүүлэх боломжтой байна</translation> <translation id="69739764870135975">Хэрэв Google нь таны өгөгдмөл хайлтын систем бол та хам сэдэвтэй холбоотой илүү сайн зөвлөмжүүдийг харах болно</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 277eea9..2774ddc 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">शेअर करण्याचे पर्याय हे तुमच्या संस्थेद्वारे व्यवस्थापित केले जातात. काही आयटम लपवलेले असू शकतात.</translation> <translation id="1622054403950683339">वाय-फाय नेटवर्क विसरा</translation> <translation id="1623723619460186680">निळा लाइट कमी करणे</translation> -<translation id="1624012933569991823">सेटिंग्ज</translation> <translation id="1624599281783425761">तुम्हाला <ph name="MERCHANT" /> पुन्हा दिसणार नाही</translation> <translation id="1624863973697515675">ही फाइल तुमच्या डिव्हाइसला व्यवस्थापित करता येण्यासाठी खूप मोठी आहे. ती दुसऱ्या डिव्हाइसवर डाउनलोड करून पहा</translation> <translation id="1627276047960621195">फाईल वर्णनकर्ते</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">क्लिष्ट पासवर्ड वापरा</translation> <translation id="1900305421498694955">Google Play वरील ॲप्सना कदाचित बाह्य स्टोरेज डिव्हाइसवरील फाइल रीड आणि राइट करण्यासाठी संपूर्ण फाइल सिस्टम ॲक्सेसची आवश्यकता असू शकते. डिव्हाइसवर तयार केलेल्या फाइल आणि फोल्डर हे बाह्य ड्राइव्ह वापरणार्या कोणालाही दिसतील. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&सर्व निवडा</translation> -<translation id="1901396183631570154">Chrome ला हे पासवर्ड तुमच्या Google खाते मध्ये सेव्ह करता आले नाहीत. तुम्ही तरीही ते या डिव्हाइसवर सेव्ह करू शकता.</translation> <translation id="1903995858055162096">तुमचे डिव्हाइस नाही का? <ph name="BEGIN_LINK" />अतिथी मोड<ph name="END_LINK" /> वापरा.</translation> <translation id="1904580727789512086">तुम्ही भेट दिलेल्या URL तुमच्या Google खाते मध्ये सेव्ह केल्या जातात</translation> <translation id="1905375423839394163">Chromebook डिव्हाइसचे नाव</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> अनइंस्टॉल करण्यासाठी Windows बंद करा.</translation> <translation id="2477065602824695373">तुम्ही एकाहून अधिक स्विच सेट केल्यामुळे ऑटो-स्कॅन बंद करण्यात आले आहे.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" साठी मीडिया-फाईल परवानग्या</translation> -<translation id="248003956660572823">पासवर्ड सेव्ह केले गेले नाहीत</translation> <translation id="2480868415629598489">तुम्ही कॉपी आणि पेस्ट करता तो डेटा सुधारित करा</translation> <translation id="2482878487686419369">सूचना</translation> <translation id="2482895651873876648">टॅब गट <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> यामध्ये हलवला आहे</translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">पालक नियंत्रणे</translation> <translation id="281390819046738856">विनंतीवर साइन करता आले नाही.</translation> <translation id="2814489978934728345">हे पृष्ठ लोड करणे थांबवा</translation> -<translation id="281504910091592009">तुमच्या <ph name="BEGIN_LINK" />Google खात्यामध्ये<ph name="END_LINK" /> सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा</translation> <translation id="2815693974042551705">बुकमार्क फोल्डर</translation> <translation id="2816319641769218778">तुमच्या Google खाते मध्ये पासवर्ड सेव्ह करण्यासाठी सिंक सुरू करा.</translation> <translation id="2816628817680324566">या साइटला तुमची सिक्युरिटी की ओळखण्याची अनुमती द्यायची का?</translation> @@ -4289,7 +4285,6 @@ <translation id="5078638979202084724">सर्व टॅब बुकमार्क करा</translation> <translation id="5078796286268621944">चुकीचा पिन</translation> <translation id="5079010647467150187">बिल्ट-इन VPN जोडा...</translation> -<translation id="5079950360618752063">सुचवलेला पासवर्ड वापरा</translation> <translation id="508059534790499809">Kerberos तिकीट रिफ्रेश करा</translation> <translation id="5084328598860513926">तरतूद प्रवाहात व्यत्यय आला. कृपया पुन्हा प्रयत्न करा किंवा तुमच्या डिव्हाइसच्या मालकाशी अथवा अॅडमिनिस्ट्रेटरशी संपर्क साधा. एरर कोड: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">अद्यतनांसाठी तपासत आहे</translation> @@ -4414,7 +4409,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" हटवायचे?</translation> <translation id="520621735928254154">सर्टिफिकेट आयात एरर</translation> <translation id="5206562235913517859">रिटेलर-स्टोअर आयडी हा ABC-1234 फॉरमॅटमध्ये आहे</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{धोक्यात असलेला पासवर्ड यशस्वीरीत्या बदलला. तुमच्याकडे आणखी # धोक्यात असलेला पासवर्ड आहे. Chrome हा पासवर्ड आता तपासण्याची शिफारस करते.}other{धोक्यात असलेले पासवर्ड यशस्वीरीत्या बदलले. तुमच्याकडे आणखी # धोक्यात असलेले पासवर्ड आहेत. Chrome हे पासवर्ड आता तपासण्याची शिफारस करते.}}</translation> <translation id="5207949376430453814">मजकूर कॅरेट हायलाइट करा</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ला तुम्ही पात्र ChromeOS डिव्हाइस वापरत आहात की नाही हे तपासायचे आहे.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> चे ऑथेंटिकेशन टोकन स्टोअर करणे</translation> @@ -6244,7 +6238,6 @@ <translation id="6970861306198150268">या साइटसाठी तुम्ही तुमचा सध्याचा पासवर्ड सेव्ह करत असल्याची खात्री करा</translation> <translation id="6972180789171089114">ऑडिओ/व्हिडिओ</translation> <translation id="6972754398087986839">सुरू करा</translation> -<translation id="6972887130317925583">धोक्यात असलेला पासवर्ड यशस्वीरीत्या बदलला. तुमचे पासवर्ड <ph name="SETTINGS" /> मध्ये कधीही तपासा.</translation> <translation id="697312151395002334">पॉप-अप पाठवण्याची आणि रीडिरेक्ट वापरण्याची अनुमती आहे</translation> <translation id="6973611239564315524">Debian 10 (Buster) साठी अपग्रेड उपलब्ध आहे</translation> <translation id="69739764870135975">Google देखील तुमचे डीफॉल्ट शोध इंजीन असल्यास, तुम्हाला आणखी चांगल्या, संदर्भानुसार उपयुक्त सूचना दिसतील</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index e292510..e0b61a72 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Pilihan perkongsian diurus oleh organisasi anda. Sesetengah item mungkin disembunyikan.</translation> <translation id="1622054403950683339">Lupakan rangkaian Wi-Fi</translation> <translation id="1623723619460186680">Pengurangan cahaya biru</translation> -<translation id="1624012933569991823">Tetapan</translation> <translation id="1624599281783425761">Anda tidak akan melihat <ph name="MERCHANT" /> lagi</translation> <translation id="1624863973697515675">Fail ini terlalu besar untuk diurus oleh peranti anda. Cuba memuat turun pada peranti lain</translation> <translation id="1627276047960621195">Pemerihal Fail</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">Gunakan kata laluan yang kukuh</translation> <translation id="1900305421498694955">Apl daripada Google Play mungkin memerlukan akses sistem fail penuh untuk membaca dan menulis fail pada peranti storan luaran. Fail dan folder yang dibuat pada peranti ini dapat dilihat oleh sesiapa yang menggunakan pemacu luaran itu. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Pilih &semua</translation> -<translation id="1901396183631570154">Chrome tidak dapat menyimpan kata laluan ini dalam Akaun Google anda. Anda masih boleh menyimpan kata laluan ini pada peranti ini.</translation> <translation id="1903995858055162096">Bukan peranti anda? Gunakan <ph name="BEGIN_LINK" />mod Tetamu<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL yang anda lawati disimpan pada Google Account anda</translation> <translation id="1905375423839394163">Nama peranti Chromebook</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506">Matikan Windows untuk menyahpasang <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Sejak anda menyediakan berbilang suis, autoimbas telah dimatikan.</translation> <translation id="2478176599153288112">Kebenaran Fail Media untuk "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Kata laluan tidak disimpan</translation> <translation id="2480868415629598489">Ubah suai data yang anda salin dan tampal</translation> <translation id="2482878487686419369">Pemberitahuan</translation> <translation id="2482895651873876648">Tab dialihkan ke kumpulan <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">Kawalan ibu bapa</translation> <translation id="281390819046738856">Permintaan tidak dapat ditandatangani.</translation> <translation id="2814489978934728345">Berhenti memuatkan halaman ini</translation> -<translation id="281504910091592009">Lihat dan urus kata laluan yang disimpan dalam <ph name="BEGIN_LINK" />Akaun Google<ph name="END_LINK" /> anda</translation> <translation id="2815693974042551705">Folder penanda halaman</translation> <translation id="2816319641769218778">Untuk menyimpan kata laluan pada Akaun Google anda, hidupkan penyegerakan.</translation> <translation id="2816628817680324566">Benarkan laman ini mengenal pasti kunci keselamatan anda?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">Tanda halaman semua tab</translation> <translation id="5078796286268621944">PIN salah</translation> <translation id="5079010647467150187">Tambah VPN terbina dalam...</translation> -<translation id="5079950360618752063">Gunakan kata laluan yang disyorkan</translation> <translation id="508059534790499809">Muat semula tiket Kerberos</translation> <translation id="5084328598860513926">Aliran peruntukan terganggu. Sila cuba lagi atau hubungi pemilik atau pentadbir peranti anda. Kod ralat: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Menyemak kemas kini</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">Padam "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Ralat Pengimportan Sijil</translation> <translation id="5206562235913517859">Format ID gedung Peruncit ialah ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Berjaya menukar kata laluan yang terjejas. Anda mempunyai # lagi kata laluan yang terjejas. Chrome mengesyorkan agar anda menyemak kata laluan ini sekarang.}other{Berjaya menukar kata laluan yang terjejas. Anda mempunyai # lagi kata laluan yang terjejas. Chrome mengesyorkan agar anda menyemak kata laluan ini sekarang.}}</translation> <translation id="5207949376430453814">Serlahkan karet teks</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> mahu menyemak sama ada anda menggunakan peranti Chrome OS yang layak.</translation> <translation id="5208548918290612795">Menyimpan Token Pengesahan <ph name="WEB_DRIVE" /></translation> @@ -6246,7 +6240,6 @@ <translation id="6970861306198150268">Pastikan anda menyimpan kata laluan semasa anda untuk laman ini</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Bermula</translation> -<translation id="6972887130317925583">Berjaya menukar kata laluan yang terjejas. Semak kata laluan anda pada bila-bila masa dalam <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Dibenarkan untuk menghantar tetingkap timbul dan menggunakan ubah hala</translation> <translation id="6973611239564315524">Peningkatan kepada Debian 10 (Buster) tersedia</translation> <translation id="69739764870135975">Jika Google juga merupakan enjin carian lalai anda, anda akan melihat cadangan yang lebih baik dan berkaitan secara kontekstual</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index f970cad..b2908e7 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">မျှဝေရန်နည်းလမ်းများကို သင်၏အဖွဲ့အစည်းက စီမံခန့်ခွဲထားသည်။ အကြောင်းအရာအချို့ကို ဖျောက်ထားနိုင်သည်။</translation> <translation id="1622054403950683339">Wi-Fi ကွန်ရက်ကို မေ့ပစ်ရန်</translation> <translation id="1623723619460186680">အပြာရောင်အလင်း လျှော့ချခြင်း</translation> -<translation id="1624012933569991823">ဆက်တင်များ</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> ကို ထပ်မြင်ရမည်မဟုတ်ပါ</translation> <translation id="1624863973697515675">သင့်စက်က ဤဖိုင်ကို စီမံနိုင်ရန် ဖိုင်ကြီးလွန်းနေသည်။ အခြားစက်တွင် ဒေါင်းလုဒ်လုပ်ရန် စမ်းကြည့်ပါ</translation> <translation id="1627276047960621195">ဖိုင် ဖေါ်ပြချက်များ</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">လုံခြုံမှုမြင့်သည့် စကားဝှက် သုံးပါ</translation> <translation id="1900305421498694955">ပြင်ပသိုလှောင်ခန်း ကိရိယာများပေါ်တွင် ဖိုင်များကို ဖတ်ရန်၊ ရေးရန်အတွက် Google Play မှ အက်ပ်များက ဖိုင်စနစ် အသုံးပြုခွင့် အပြည့်အဝ လိုအပ်နိုင်သည်။ စက်ပေါ်တွင် ပြုလုပ်ထားသော ဖိုင်နှင့်ဖိုင်တွဲများကို ပြင်ပဒရိုက်ဗ် အသုံးပြုသူတိုင်း မြင်နိုင်ပါသည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="1901303067676059328">အားလုံးကို &ရွေးရန်</translation> -<translation id="1901396183631570154">Chrome က ဤစကားဝှက်များကို သင်၏ Google Account တွင် သိမ်း၍မရပါ။ ၎င်းတို့ကို ဤစက်တွင် သိမ်းနိုင်ပါသေးသည်။</translation> <translation id="1903995858055162096">သင့်စက်ပစ္စည်း မဟုတ်ဘူးလား။ <ph name="BEGIN_LINK" />ဧည့်သည်မုဒ်<ph name="END_LINK" /> အသုံးပြုပါ။</translation> <translation id="1904580727789512086">သင်ဝင်ကြည့်သည့် URL များကို သင့် Google Account တွင်သိမ်းထားသည်</translation> <translation id="1905375423839394163">Chromebook စက်ပစ္စည်းအမည်</translation> @@ -1629,7 +1627,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ကို ဖယ်ရှားရန် Windows ကို ပိတ်ပါ။</translation> <translation id="2477065602824695373">အသွင်တူ ခလုတ်အများအပြား သတ်မှတ်လိုက်သောကြောင့် အလိုအလျောက် ရှာဖွေခြင်းကို ပိတ်လိုက်ပါသည်။</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" အတွက် မီဒီယာ-ဖိုင် ခွင့်ပြုချက်များ</translation> -<translation id="248003956660572823">စကားဝှက်များကို သိမ်းမထားပါ</translation> <translation id="2480868415629598489">သင်မိတ္တူကူးပြီး ထည့်ထားသော အချက်အလက်တို့ကို ပြင်ဆင်ပါ</translation> <translation id="2482878487686419369">အကြောင်းကြားစာ</translation> <translation id="2482895651873876648"><ph name="GROUP_NAME" /> ထဲသို့ တဘ်ကိုရွှေ့လိုက်သည် - <ph name="GROUP_CONTENTS" /></translation> @@ -1991,7 +1988,6 @@ <translation id="2813094189969465044">မိဘ အထိန်းအချုပ်များ</translation> <translation id="281390819046738856">တောင်းဆိုမှုကို လက်မှတ်ထိုး၍မရပါ။</translation> <translation id="2814489978934728345">ဤစာမျက်နှာကို ဖွင့်ခြင်းမှ ရပ်</translation> -<translation id="281504910091592009">သိမ်းဆည်းထားသည့် စကားဝှက်များကို သင်၏ <ph name="BEGIN_LINK" />Google အကောင့်<ph name="END_LINK" /> တွင် ကြည့်ရှုစီမံပါ</translation> <translation id="2815693974042551705">စာညှပ် ဖိုလ်ဒါ</translation> <translation id="2816319641769218778">စကားဝှက်များကို သင်၏ Google အကောင့်တွင် သိမ်းရန် စင့်ခ်လုပ်ခြင်းကိုဖွင့်ပါ။</translation> <translation id="2816628817680324566">ဤဝဘ်ဆိုက်ကို သင့်လုံခြုံရေးကီး ခွဲခြားဖော်ထုတ်ရန် ခွင့်ပြုမလား။</translation> @@ -4291,7 +4287,6 @@ <translation id="5078638979202084724">တဲပ်များအားလုံး ဘွတ်မတ်လုပ်ရန်</translation> <translation id="5078796286268621944">မမှန်ကန်သည့် ပင်ကုဒ်</translation> <translation id="5079010647467150187">အသင့်ပါသော VPN ထည့်ခြင်း…</translation> -<translation id="5079950360618752063">အကြံပြုထားသည့် စကားဝှက်ကို သုံးပါ</translation> <translation id="508059534790499809">Kerberos လက်မှတ်ကို ပြန်လည်စတင်ခြင်း</translation> <translation id="5084328598860513926">Provisioning အဆင့်ဆင့် ရပ်သွားသည်။ ထပ်စမ်းကြည့်ပါ သို့မဟုတ် သင့်စက်ပိုင်ရှင် သို့မဟုတ် စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။ အမှားကုဒ် - <ph name="ERROR_CODE" />။</translation> <translation id="5085162214018721575">မွမ်းမံမှုများကို စစ်ကြည့်နေ</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ကို ဖျက်မလား။</translation> <translation id="520621735928254154">လက်မှတ် တင်သွင်းမှု အမှား</translation> <translation id="5206562235913517859">လက်လီရောင်းသူ စတိုး ID က ABC-1234 ဖော်မက်ဖြစ်သည်</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{ကျိုးပေါက်ထားသည့် စကားဝှက်ကို ပြောင်းပြီးပါပြီ။ သင့်တွင် ကျိုးပေါက်ထားသည့် စကားဝှက် နောက် # ခု ရှိပါသည်။ ဤစကားဝှက်ကို ယခု စစ်ဆေးရန် Chrome က အကြံပြုပါသည်။}other{ကျိုးပေါက်ထားသည့် စကားဝှက်ကို ပြောင်းပြီးပါပြီ။ သင့်တွင် ကျိုးပေါက်ထားသည့် စကားဝှက် နောက် # ခု ရှိပါသည်။ ဤစကားဝှက်များကို ယခု စစ်ဆေးရန် Chrome က အကြံပြုပါသည်။}}</translation> <translation id="5207949376430453814">စာရိုက်ထည့်ရန်အကွက်ကို မြင်သာထင်သာဖြစ်အောင်ပြုလုပ်ရန်</translation> <translation id="520840839826327499">သတ်မှတ်ချက်ပြည့်မီသည့် ChromeOS စက်ကို သင်အသုံးပြုနေကြောင်း <ph name="SERVICE_NAME" /> က စစ်ဆေးလိုသည်။</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> အထောက်အထားစိစစ်ခြင်း တိုကင် သိမ်းခြင်း</translation> @@ -5301,6 +5295,7 @@ <translation id="6065289257230303064">လက်မှတ် အကြောင်းအရာ ဒါရိုက်ထရီ အချင်းလက္ခဏာများ</translation> <translation id="6066794465984119824">ပုံဟက်ရှ်ကုဒ်ကို သတ်မှတ်မထားပါ</translation> <translation id="6069464830445383022">သင့် Google Account သည် သင်၏ Chromebook သို့ လက်မှတ်ထိုးဝင်ရမည့်အကောင့်ဖြစ်သည်</translation> +<translation id="6070311415473175157">ရှာဖွေလိုသည့် ပုံနေရာကို မှတ်ပါ</translation> <translation id="6071181508177083058">စကားဝှက် အတည်ပြုပါ</translation> <translation id="6071576563962215370">စနစ်သည် စက်ပစ္စည်းထည့်သွင်းမှုအချိန် ရည်ညွှန်းချက်လော့ခ်ကို သတ်မှတ်၍မရပါ။</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> ကို ဤစက်ပေါ်တွင် ခွင့်ပြုမထားပါ။ သင့်စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။ အမှားကုဒ်- <ph name="ERROR_CODE" />။</translation> @@ -6243,7 +6238,6 @@ <translation id="6970861306198150268">ဤဝဘ်ဆိုက်အတွက် လက်ရှိစကားဝှက်ကို သိမ်းနေကြောင်း သေချာပါစေ</translation> <translation id="6972180789171089114">အသံ/ဗီဒီယို</translation> <translation id="6972754398087986839">စကြရအောင်</translation> -<translation id="6972887130317925583">ကျိုးပေါက်ထားသည့် စကားဝှက်ကို ပြောင်းပြီးပါပြီ။ သင့်စကားဝှက်ကို <ph name="SETTINGS" /> များတွင် အချိန်မရွေး စစ်ဆေးပါ။</translation> <translation id="697312151395002334">ပေါ့ပ်အပ်များပို့ရန်နှင့် တစ်ဆင့်ပြန်ညွှန်ပြရန် ခွင့်ပြုထားသည်</translation> <translation id="6973611239564315524">Debian 10 (Buster) သို့ အဆင့်မြှင့်တင်နိုင်ပါပြီ</translation> <translation id="69739764870135975">Google သည် သင်၏မူရင်းရှာဖွေရေး အင်ဂျင်လည်းဖြစ်ပါက အကြောင်းအရာ အပေါ်မူတည်သည့် ပိုကောင်းမွန်သော သက်ဆိုင်ရာအကြံပြုချက်များကို မြင်ရပါမည်</translation> @@ -7132,6 +7126,7 @@ <translation id="7842692330619197998">အကောင့်အသစ်ဖွင့်လိုလျှင် g.co/ChromeEnterpriseAccount သို့ သွားပါ။</translation> <translation id="78427265591841839"><ph name="VISUAL_SEARCH_PROVIDER" /> ဖြင့် စာမျက်နှာ တစ်စိတ်တစ်ဒေသကို ရှာရန်</translation> <translation id="784273751836026224">Linux ဖယ်ရှားရန်</translation> +<translation id="7842851769217535639">စာမျက်နှာ၏ ကြိုက်ရာတစ်နေရာကို ရှာဖွေရန်မှတ်ပါ</translation> <translation id="7843786652787044762"><ph name="WEB_DRIVE" /> သို့ လက်မှတ်ထိုးဝင်ရန်</translation> <translation id="7844992432319478437">ခြားနားမှု ကို မွမ်းမံနေ</translation> <translation id="7846634333498149051">ကီးဘုတ်</translation> @@ -7188,6 +7183,7 @@ <translation id="7893008570150657497">ဓာတ်ပုံများ၊ ဂီတ၊ နှင့် အခြား မီဒီယာကို သင်၏ ကွန်ပျူတာမှ ရယူပါ</translation> <translation id="7893153962594818789">ဤ <ph name="DEVICE_TYPE" /> တွင် ဘလူးတုသ်ကို ပိတ်ထားသည်။ သင့်စကားဝှက်ကို ထည့်ပြီး ဘလူးတုသ်ကို ဖွင့်ပါ။</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (ပုံသေ)</translation> +<translation id="7896292361319775586"><ph name="FILE" /> ကို သိမ်းမလား။</translation> <translation id="789722939441020330">ဖိုင်အများအပြားကို အလိုအလျောက်ဒေါင်းလုဒ်လုပ်ရန် ဝဘ်ဆိုက်များကို ခွင့်မပြုပါနှင့်</translation> <translation id="7897900149154324287">အနာဂတ်မှာ၊ ထုတ်ယူနိုင်သည့် သင်၏ ကိရိယာကို ၎င်းကို ဖြုတ်မယူမီမှာ ဖိုင်များ အက်ပ် ထဲတွင် ထုတ်ပစ်လိုက်တာ သေချာပါစေ၊ သို့မဟုတ်လျှင် သင်သည် ဒေတာကို ဆုံးရှုံးရနိုင်သည်။</translation> <translation id="7898725031477653577">အမြဲတမ်း ဘာသာပြန်ရန်</translation> @@ -8325,6 +8321,7 @@ <translation id="899403249577094719">Netscape လက်မှတ် အခြေခံ URL</translation> <translation id="899657321862108550">သွားလေရာ အသုံးပြုနိုင်သည့် သင်၏ Chrome</translation> <translation id="899676909165543803">လက်ဗွေ အာရုံခံကိရိယာသည် သင့်ကီးဘုတ်၏ ညာဘက်အောက်ခြေရှိကီး ဖြစ်သည်။ လက်ချောင်းတစ်ချောင်းဖြင့် ၎င်းကို အသာထိပါ။</translation> +<translation id="8998078711690114234">ဤဖိုင်အမျိုးအစားက အန္တရာယ်ရှိနိုင်သည်။ <ph name="ORIGIN" /> ကို ယုံကြည်မှသာ ဤဖိုင်ကို သိမ်းပါ</translation> <translation id="8999560016882908256">အပိုင်း ဝါကျဖွဲ့စည်းပုံအမှား- <ph name="ERROR_LINE" /></translation> <translation id="9003185744423389627"><ph name="FAILURE_TIME" /> တွင် ‘စက်စီမံစနစ်ဆာဗာ’ သို့ ချိတ်ဆက်၍မရဘဲ အခြေအနေမှာ ‘<ph name="STATUS_TEXT" />’ ဖြစ်သည်</translation> <translation id="9003647077635673607">ဝဘ်ဆိုက် အားလုံးမှာ ခွင့်ပြုရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index cbe0046..ed83dd7 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -661,7 +661,6 @@ <translation id="1621984899599015181">तपाईंको सङ्गठनले सेयर गर्ने विकल्पहरू व्यवस्थापन गर्छ। केही वस्तुहरू लुकाइन सक्छन्।</translation> <translation id="1622054403950683339">Wi-Fi नेटवर्क हटाउनुहोस्</translation> <translation id="1623723619460186680">निलो प्रकाश घटाउने कार्य</translation> -<translation id="1624012933569991823">सेटिङ</translation> <translation id="1624599281783425761">तपाईं अब उप्रान्त <ph name="MERCHANT" /> देख्नु हुने छैन</translation> <translation id="1624863973697515675">यो फाइल धेरै ठुलो भएकाले तपाईंको डिभाइसले यो फाइल व्यवस्थापन गर्न सक्दैन। यो फाइल अर्को डिभाइसमा डाउनलोड गर्ने प्रयास गर्नुहोस्</translation> <translation id="1627276047960621195">फाइल डेस्क्रिप्टरहरू</translation> @@ -977,7 +976,6 @@ <translation id="1897120393475391208">भरपर्दो पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="1900305421498694955">डिभाइसहरूको बाह्य भण्डारणमा रहेका फाइलहरू रिड र राइट गर्न Google Play का एपहरूलाई फाइलको प्रणालीमा पूर्ण पहुँच चाहिन सक्छ। बाह्य ड्राइभ प्रयोग गर्ने सबैले यन्त्रमा सिर्जना गरिएका फाइल र फोल्डरहरू देख्न सक्छन्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&सबै चयन गर्नुहोस्</translation> -<translation id="1901396183631570154">Chrome ले यी पासवर्डहरू तपाईंको Google खातामा सुरक्षित गर्न सकेन। तर तपाईं ती पासवर्डहरू यो डिभाइसमा भने सुरक्षित गर्न सक्नुहुन्छ।</translation> <translation id="1903995858055162096">यो डिभाइस तपाईंको होइन? <ph name="BEGIN_LINK" />गेस्ट मोड<ph name="END_LINK" /> प्रयोग गर्नुहोस्।</translation> <translation id="1904580727789512086">तपाईंले खोल्ने URL हरू तपाईंको Google खातामा सेभ गरिन्छन्</translation> <translation id="1905375423839394163">Chromebook को डिभाइसको नाम</translation> @@ -1612,7 +1610,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> अनइन्स्टल गर्न Windows बन्द गर्नुहोस्।</translation> <translation id="2477065602824695373">तपाईंले एकभन्दा बढी स्विच सेटअप गर्नुभएकाले अटो-स्क्यान गर्ने सुविधा अफ गरिएको छ।</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" को लागि मिडिया</translation> -<translation id="248003956660572823">पासवर्डहरू सुरक्षित गर्न सकिएन</translation> <translation id="2480868415629598489">तपाईंले प्रतिलिपि गरी टाँस्नुभएको डेटालाई परिमार्जन गर्नुहोस्</translation> <translation id="2482878487686419369">सूचनाहरू</translation> <translation id="2482895651873876648">यो ट्याब <ph name="GROUP_NAME" /> समूहमा सारियो - <ph name="GROUP_CONTENTS" /></translation> @@ -1974,7 +1971,6 @@ <translation id="2813094189969465044">अभिभावकीय नियन्त्रणहरू</translation> <translation id="281390819046738856">अनुरोधमा हस्ताक्षर गर्न सकिएन।</translation> <translation id="2814489978934728345">यो पृष्ठ लोड गर्न रोक्नुहोस्</translation> -<translation id="281504910091592009">आफ्नो <ph name="BEGIN_LINK" />Google खाता<ph name="END_LINK" /> मा सुरक्षित गरिएका पासवर्डहरू हेर्नुहोस् र व्यवस्थापन गर्नुहोस्</translation> <translation id="2815693974042551705">बुकमार्क फोल्डर</translation> <translation id="2816319641769218778">आफ्नो Google खातामा पासवर्डहरू सुरक्षित गर्न सिंक गर्ने सुविधा अन गर्नुहोस्।</translation> <translation id="2816628817680324566">यो साइटलाई तपाईंको सुरक्षा साँचो पहिचान गर्न दिने हो?</translation> @@ -4273,7 +4269,6 @@ <translation id="5078638979202084724">सबै ट्याबहरू पृष्ठमञ्जूषा गर्नुहोस्</translation> <translation id="5078796286268621944">गलत PIN</translation> <translation id="5079010647467150187">अन्तर्निर्मित VPN हाल्नुहोस्...</translation> -<translation id="5079950360618752063">सिफारिस गरिएको पासवर्ड प्रयोग गर्नहोस्</translation> <translation id="508059534790499809">Kerberos को टिक पुन: ताजा गर्नुहोस्</translation> <translation id="5084328598860513926">सेटअप गर्ने क्रममा केही समस्या आयो। कृपया फेरि प्रयास गर्नुहोस् वा आफ्नो डिभाइसका मालिक वा एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation> <translation id="5085162214018721575">अद्यावधिकहरू खोज्दै</translation> @@ -4398,7 +4393,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" लाई मेटाउने हो?</translation> <translation id="520621735928254154">प्रमाणपत्र आयात त्रुटि</translation> <translation id="5206562235913517859">खुद्रा विक्रेताको स्टोर ID ABC-1234 फर्म्याटमा हुन्छ</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{अरूले देखेको पासवर्ड सफलतापूर्वक परिवर्तन गरियो। तपाईंको थप # वटा पासवर्ड अरूले देखेका छन्। Chrome ले अहिले नै यो पासवर्ड जाँच्न सिफारिस गर्छ।}other{अरूले देखेको पासवर्ड सफलतापूर्वक परिवर्तन गरियो। तपाईंका थप # वटा पासवर्ड अरूले देखेका छन्। Chrome ले अहिले नै यी पासवर्डहरू जाँच्न सिफारिस गर्छ।}}</translation> <translation id="5207949376430453814">पाठको क्योरटलाई हाइलाइट</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> तपाईं कुनै योग्य ChromeOS डिभाइस चलाइरहनुभएको छ कि छैन भन्ने कुरा जाँच गर्न चाहन्छ।</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> को प्रमाणीकरण टोकन भण्डारण गरिने तरिका</translation> @@ -5282,6 +5276,7 @@ <translation id="6065289257230303064">सर्टिफिकेट विषय निर्देशिका गुणहरू</translation> <translation id="6066794465984119824">इमेज ह्यास सेट गरिएको छैन</translation> <translation id="6069464830445383022">तपाईंको Chromebook मा साइन इन गर्ने विधि भनेको तपाईंको Google खाता नै हो</translation> +<translation id="6070311415473175157">Google लेन्समार्फत खोज्न फोटोको कुनै भाग चयन गर्नुहोस्</translation> <translation id="6071181508177083058">पासवर्ड पुष्टि गर्नुहोस्</translation> <translation id="6071576563962215370">प्रणालीले यन्त्रको स्थापना समयका विशेषतासम्बन्धी लक स्थापना गर्न सकेन।</translation> <translation id="6072442788591997866">यो डिभाइसमा <ph name="APP_NAME" /> चलाउन मिल्दैन। आफ्ना एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation> @@ -6225,7 +6220,6 @@ <translation id="6970861306198150268">तपाईंले हाल यो साइटका लागि तोक्नुभएको पासवर्ड सेभ गर्न नभुल्नुहोस्</translation> <translation id="6972180789171089114">अडियो/भिडियो</translation> <translation id="6972754398087986839">सुरु गर्नुहोस्</translation> -<translation id="6972887130317925583">अरूले देखेको पासवर्ड सफलतापूर्वक परिवर्तन गरियो। जुनसुकै बेला <ph name="SETTINGS" /> मा गई आफ्ना पासवर्डहरू जाँच्नुहोस्।</translation> <translation id="697312151395002334">पप-अपहरू पठाउन र रिडिरेक्टहरू प्रयोग गर्ने अनुमति दिइएका साइटहरू</translation> <translation id="6973611239564315524">Debian 10 (Buster) मा स्तरोन्नति गर्ने सुविधा उपलब्ध छ</translation> <translation id="69739764870135975">तपाईंको डिफल्ट सर्च इन्जिन Google नै हो भने तपाईं अझ उपयुक्त र सान्दर्भिक सुझावहरू देख्नु हुने छ</translation> @@ -7113,6 +7107,7 @@ <translation id="7842692330619197998">तपाईंले नयाँ खाता सिर्जना गर्नु परेका खण्डमा g.co/ChromeEnterpriseAccount मा जानुहोस्।</translation> <translation id="78427265591841839"><ph name="VISUAL_SEARCH_PROVIDER" /> मार्फत पेजको कुनै भाग खोज्नुहोस्</translation> <translation id="784273751836026224">Linux अनइन्स्टल गर्नुहोस्</translation> +<translation id="7842851769217535639">Google लेन्समार्फत खोज्न यो पेजको कुनै भाग चयन गर्नुहोस्</translation> <translation id="7843786652787044762"><ph name="WEB_DRIVE" /> मा साइन इन गर्नुहोस्</translation> <translation id="7844992432319478437">अपडेट भिन्नता</translation> <translation id="7846634333498149051">किबोर्ड</translation> @@ -7169,6 +7164,7 @@ <translation id="7893008570150657497">तपाइँको कम्प्युटरबाट तस्बिरहरू, सङ्गीत, र हन्य मिडिया पहुँच गर्नुहोस्</translation> <translation id="7893153962594818789">यस <ph name="DEVICE_TYPE" /> मा ब्लुटुथ निष्क्रिय छ। आफ्नो पासवर्ड प्रविष्टि गर्नुहोस् र ब्लुटुथ अन गर्नुहोस्।</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (डिफल्ट)</translation> +<translation id="7896292361319775586"><ph name="FILE" /> सेभ गर्ने हो?</translation> <translation id="789722939441020330">साइटहरूलाई एकभन्दा बढी फाइल स्वतः डाउनलोड गर्ने अनुमति नदिइयोस्</translation> <translation id="7897900149154324287">भविष्यमा, तपाईंको हटाउन सकिने यन्त्रलाई अनप्लग गर्नुभन्दा अगाडि यसलाई फाइलहरू एपमा निश्चित रूपमा निकाल्नुहोस्।</translation> <translation id="7898725031477653577">सधैं अनुवाद गर्नुहोस्</translation> @@ -8305,6 +8301,7 @@ <translation id="899403249577094719">नेटस्केप प्रमाणपत्र आधार URL</translation> <translation id="899657321862108550">तपाईंको Chrome, सबैतिर</translation> <translation id="899676909165543803">तपाईंको किबोर्डको दायाँतिर सबैभन्दा तल रहेको कुञ्जी फिंगरप्रिन्ट सेन्सर हो। यसलाई कुनै एक औँलाले हल्का छुनुहोस्।</translation> +<translation id="8998078711690114234">यस्तो खालको फाइल खतरनाक हुन सक्छ। तपाईंलाई <ph name="ORIGIN" /> माथि विश्वास छ भने मात्र यो फाइल सेभ गर्नुहोस्</translation> <translation id="8999560016882908256">खण्डको विन्याससम्बन्धी त्रुटि: <ph name="ERROR_LINE" /></translation> <translation id="9003185744423389627">डिभाइस म्यानेजमेन्ट सर्भरमा कनेक्ट गर्न सकिएन। कनेक्ट गर्न नसकिएको समय: "<ph name="FAILURE_TIME" />", स्थिति: "<ph name="STATUS_TEXT" />"</translation> <translation id="9003647077635673607">सबै वेबसाइटहरूमा अनुमति दिनुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 37a6064..93c23be 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Opties voor delen worden beheerd door je organisatie. Sommige items zijn misschien verborgen.</translation> <translation id="1622054403950683339">Wifi-netwerk vergeten</translation> <translation id="1623723619460186680">Blauw licht verminderen</translation> -<translation id="1624012933569991823">Instellingen</translation> <translation id="1624599281783425761">Je krijgt <ph name="MERCHANT" /> niet meer te zien</translation> <translation id="1624863973697515675">Dit bestand is te groot voor je apparaat om te beheren. Probeer het te downloaden op een ander apparaat.</translation> <translation id="1627276047960621195">Bestandsdescriptors</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Sterk wachtwoord gebruiken</translation> <translation id="1900305421498694955">Apps uit Google Play hebben mogelijk toegang nodig tot het volledige bestandssysteem om bestanden te lezen en schrijven op externe opslagapparaten. Bestanden en mappen die zijn gemaakt op het apparaat, zijn zichtbaar voor iedereen die de externe schijf gebruikt. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Alles selecteren</translation> -<translation id="1901396183631570154">Chrome kan deze wachtwoorden niet opslaan in je Google-account. Je kunt ze nog wel altijd op dit apparaat opslaan.</translation> <translation id="1903995858055162096">Niet jouw apparaat? Gebruik de <ph name="BEGIN_LINK" />gastmodus<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">De URL's die je bezoekt, worden opgeslagen in je Google-account</translation> <translation id="1905375423839394163">Naam Chromebook-apparaat</translation> @@ -1615,7 +1613,6 @@ <translation id="2476974672882258506">Sluit Windows af om <ph name="PARALLELS_DESKTOP" /> te verwijderen.</translation> <translation id="2477065602824695373">Automatische scan is uitgezet omdat je meerdere schakelaars hebt ingesteld.</translation> <translation id="2478176599153288112">Mediabestandsrechten voor '<ph name="EXTENSION" />'</translation> -<translation id="248003956660572823">Wachtwoorden niet opgeslagen</translation> <translation id="2480868415629598489">Gegevens aanpassen die je kopieert en plakt</translation> <translation id="2482878487686419369">Meldingen</translation> <translation id="2482895651873876648">Tabblad verplaatst naar groep <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1977,7 +1974,6 @@ <translation id="2813094189969465044">Ouderlijk toezicht</translation> <translation id="281390819046738856">Verzoek kan niet worden ondertekend.</translation> <translation id="2814489978934728345">Stoppen met het laden van deze pagina</translation> -<translation id="281504910091592009">Bekijk en beheer opgeslagen wachtwoorden in je <ph name="BEGIN_LINK" />Google-account<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Bookmark voor map toevoegen</translation> <translation id="2816319641769218778">Zet de synchronisatie aan om wachtwoorden op te slaan op je Google-account.</translation> <translation id="2816628817680324566">Deze site toestaan je beveiligingssleutel te identificeren?</translation> @@ -4274,7 +4270,6 @@ <translation id="5078638979202084724">Bookmark toevoegen aan alle tabbladen</translation> <translation id="5078796286268621944">Onjuiste pincode</translation> <translation id="5079010647467150187">Ingebouwde VPN toevoegen...</translation> -<translation id="5079950360618752063">Voorgesteld wachtwoord gebruiken</translation> <translation id="508059534790499809">Een Kerberos-ticket vernieuwen</translation> <translation id="5084328598860513926">Het instelproces is onderbroken. Probeer het opnieuw of neem contact op met de eigenaar of beheerder van het apparaat. Foutcode: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Controleren op updates</translation> @@ -4399,7 +4394,6 @@ <translation id="5206215183583316675"><ph name="CERTIFICATE_NAME" /> verwijderen?</translation> <translation id="520621735928254154">Fout bij importeren van certificaat</translation> <translation id="5206562235913517859">Winkel-ID van verkoper heeft de notatie ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Het gehackte wachtwoord is gewijzigd. Je hebt nog # gehackt wachtwoord. Chrome raadt je aan dit wachtwoord nu te checken.}other{Het gehackte wachtwoord is gewijzigd. Je hebt nog # gehackte wachtwoorden. Chrome raadt je aan deze wachtwoorden nu te checken.}}</translation> <translation id="5207949376430453814">Tekstcursor markeren</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> wil checken of je een geschikt Chrome OS-apparaat gebruikt.</translation> <translation id="5208548918290612795">Verificatietoken voor <ph name="WEB_DRIVE" /> opslaan</translation> @@ -6223,7 +6217,6 @@ <translation id="6970861306198150268">Zorg dat je je huidige wachtwoord voor deze site opslaat</translation> <translation id="6972180789171089114">Audio/video</translation> <translation id="6972754398087986839">Aan de slag</translation> -<translation id="6972887130317925583">Het gehackte wachtwoord is gewijzigd. Je kunt je wachtwoorden altijd checken in <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Toestemming om pop-ups te sturen en omleidingen te gebruiken</translation> <translation id="6973611239564315524">Er is een upgrade beschikbaar voor Debian 10 (Buster)</translation> <translation id="69739764870135975">Als Google ook je standaardzoekmachine is, krijg je betere, contextueel relevante suggesties te zien</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index f9928d95..ea9c6c11 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Alternativer for deling administreres av organisasjonen din. Noen elementer kan være skjult.</translation> <translation id="1622054403950683339">Glem Wi-Fi-nettverket</translation> <translation id="1623723619460186680">Reduksjon av blått lys</translation> -<translation id="1624012933569991823">Innstillinger</translation> <translation id="1624599281783425761">Du kommer ikke til å se <ph name="MERCHANT" /> mer</translation> <translation id="1624863973697515675">Denne filen er for stor til at enheten din kan håndtere den. Prøv å laste den ned på en annen enhet</translation> <translation id="1627276047960621195">Filbeskrivelser</translation> @@ -986,7 +985,6 @@ <translation id="1897120393475391208">Bruk dette sterke passordet</translation> <translation id="1900305421498694955">Apper fra Google Play trenger kanskje full tilgang til filsystemet for å kunne lese og skrive til filer på eksterne lagringsenheter. Filer og mapper som opprettes på enheten, er synlige for alle som bruker den eksterne stasjonen. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Marker &alt</translation> -<translation id="1901396183631570154">Chrome kunne ikke lagre disse passordene i Google-kontoen din. Du kan fremdeles lagre dem på denne enheten.</translation> <translation id="1903995858055162096">Er ikke dette enheten din? Bruk <ph name="BEGIN_LINK" />gjestemodus<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Nettadressene du besøker, lagres i Google-kontoen din</translation> <translation id="1905375423839394163">Navn på Chromebook-enhet</translation> @@ -1624,7 +1622,6 @@ <translation id="2476974672882258506">Slå av Windows for å avinstallere <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Siden du har konfigurert flere brytere, er automatisk skanning slått av.</translation> <translation id="2478176599153288112">Mediafilrettigheter for «<ph name="EXTENSION" />»</translation> -<translation id="248003956660572823">Passord er ikke lagret</translation> <translation id="2480868415629598489">endre data du kopierer og limer inn</translation> <translation id="2482878487686419369">Varsler</translation> <translation id="2482895651873876648">Fanen er flyttet til gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1986,7 +1983,6 @@ <translation id="2813094189969465044">Foreldrekontroll</translation> <translation id="281390819046738856">Forespørselen kunne ikke signeres.</translation> <translation id="2814489978934728345">Stopp innlasting av denne siden</translation> -<translation id="281504910091592009">Se og administrer lagrede passord i <ph name="BEGIN_LINK" />Google-kontoen<ph name="END_LINK" /> din</translation> <translation id="2815693974042551705">Bokmerke-mappen</translation> <translation id="2816319641769218778">For å lagre passord i Google-kontoen, slå på synkronisering.</translation> <translation id="2816628817680324566">Vil du la dette nettstedet identifisere sikkerhetsnøkkelen din?</translation> @@ -4283,7 +4279,6 @@ <translation id="5078638979202084724">Legg inn alle faner som bokmerke</translation> <translation id="5078796286268621944">Feil personlig kode</translation> <translation id="5079010647467150187">Legg til innebygd VPN…</translation> -<translation id="5079950360618752063">Bruk foreslått passord</translation> <translation id="508059534790499809">Oppdater en Kerberos-sak</translation> <translation id="5084328598860513926">Identitetshåndteringen ble avbrutt. Prøv på nytt, eller kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Ser etter oppdateringer</translation> @@ -4408,7 +4403,6 @@ <translation id="5206215183583316675">Vil du slette «<ph name="CERTIFICATE_NAME" />»?</translation> <translation id="520621735928254154">Feil ved sertifikatimport</translation> <translation id="5206562235913517859">Forhandlerbutikk-ID-en er i formatet ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Passordet som var utsatt for sikkerhetsbrudd, ble endret. Du har # passord til som er utsatt for sikkerhetsbrudd. Chrome anbefaler at du sjekker dette passordet nå.}other{Passordet som var utsatt for sikkerhetsbrudd, ble endret. Du har # passord til som er utsatt for sikkerhetsbrudd. Chrome anbefaler at du sjekker disse passordene nå.}}</translation> <translation id="5207949376430453814">Fremhev tekstinnsettingspunktet</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ønsker å bekrefte at du bruker en kvalifisert ChromeOS-enhet.</translation> <translation id="5208548918290612795">Lagring av autentiseringstoken for <ph name="WEB_DRIVE" /></translation> @@ -5292,6 +5286,7 @@ <translation id="6065289257230303064">Katalogattributter for sertifikatemne</translation> <translation id="6066794465984119824">Avbildningshashen er ikke angitt</translation> <translation id="6069464830445383022">Google-kontoen din er Chromebook-påloggingen din</translation> +<translation id="6070311415473175157">Velg bildeområde for å søke</translation> <translation id="6071181508177083058">bekreft passordet</translation> <translation id="6071576563962215370">Systemet kunne ikke opprette enhetens attributtlås under installasjonen.</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> er ikke tillatt på denne enheten. Kontakt administratoren din. Feilkode: <ph name="ERROR_CODE" />.</translation> @@ -6235,7 +6230,6 @@ <translation id="6970861306198150268">Sørg for at du lagrer det nåværende passordet ditt for dette nettstedet</translation> <translation id="6972180789171089114">Lyd og video</translation> <translation id="6972754398087986839">Kom i gang</translation> -<translation id="6972887130317925583">Passordet som var utsatt for sikkerhetsbrudd, ble endret. Du kan når som helst sjekke passordene dine i <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Nettsteder som har lov til å sende forgrunnsvinduer og bruke viderekoblinger</translation> <translation id="6973611239564315524">En oppgradering for Debian 10 (Buster) er tilgjengelig</translation> <translation id="69739764870135975">Hvis Google også er standardsøkemotoren din, ser du bedre og mer kontekstuelt relevante forslag</translation> @@ -7123,6 +7117,7 @@ <translation id="7842692330619197998">Gå til g.co/ChromeEnterpriseAccount hvis du må opprette en ny konto.</translation> <translation id="78427265591841839">Søk på en del av siden med <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="784273751836026224">Avinstaller Linux</translation> +<translation id="7842851769217535639">Velg hvilken som helst del av siden for å søke</translation> <translation id="7843786652787044762">Logg på <ph name="WEB_DRIVE" /></translation> <translation id="7844992432319478437">Oppdateringsproblem</translation> <translation id="7846634333498149051">Tastatur</translation> @@ -7178,6 +7173,7 @@ <translation id="7893008570150657497">Åpne bilder, musikk og andre mediefiler fra datamaskinen din</translation> <translation id="7893153962594818789">Bluetooth er slått av på denne <ph name="DEVICE_TYPE" />-enheten. Skriv inn passordet ditt, og slå på Bluetooth.</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (Standard)</translation> +<translation id="7896292361319775586">Vil du lagre <ph name="FILE" />?</translation> <translation id="789722939441020330">Ikke la nettsteder laste ned flere filer automatisk</translation> <translation id="7897900149154324287">I fremtiden må du sørge for å løse ut den flyttbare enheten i Filer-appen, før du kobler den fra. Ellers kan du miste data.</translation> <translation id="7898725031477653577">Oversett alltid</translation> @@ -8315,6 +8311,7 @@ <translation id="899403249577094719">Primære nettadresse for Netscape-sertifikat</translation> <translation id="899657321862108550">Din egen Chrome – uansett hvor du er</translation> <translation id="899676909165543803">Fingeravtrykkssensoren er knappen nederst til høyre på tastaturet. Trykk forsiktig på den med hvilken som helst finger.</translation> +<translation id="8998078711690114234">Denne filtypen kan være farlig. Du bør bare lagre denne filen hvis du stoler på <ph name="ORIGIN" /></translation> <translation id="8999560016882908256">Syntaksfeil i seksjon: <ph name="ERROR_LINE" /></translation> <translation id="9003185744423389627">Tilkoblingen til tjeneren for enhetsadministrasjon mislyktes med statusen «<ph name="STATUS_TEXT" />» <ph name="FAILURE_TIME" /></translation> <translation id="9003647077635673607">Tillat på alle nettsteder</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 1b9e94b7..4eebf33 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -663,7 +663,6 @@ <translation id="1621984899599015181">ସେୟାରିଂ ପାଇଁ ବିକଳ୍ପଗୁଡ଼ିକ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ ହୋଇଥାଏ। କିଛି ଆଇଟମ୍ ଲୁକ୍କାୟିତ ଥାଇପାରେ।</translation> <translation id="1622054403950683339">ୱାଇ-ଫାଇ ନେଟୱାର୍କ ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ</translation> <translation id="1623723619460186680">ନୀଳ ଲାଇଟ୍ ହ୍ରାସକରଣ</translation> -<translation id="1624012933569991823">ସେଟିଂସ୍</translation> <translation id="1624599281783425761">ଆପଣ <ph name="MERCHANT" />କୁ ପୁଣି ଦେଖିବେ ନାହିଁ</translation> <translation id="1624863973697515675">ଏହି ଫାଇଲଟି ଆପଣଙ୍କ ଡିଭାଇସ ଦ୍ୱାରା ପରିଚାଳିତ ହେବା ପାଇଁ ବହୁତ ବଡ଼ ଅଟେ। ଅନ୍ୟ ଏକ ଡିଭାଇସରେ ଏହାକୁ ଡାଉନଲୋଡ କରିବା ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ</translation> <translation id="1627276047960621195">ଫାଇଲ୍ ଡେସ୍କ୍ରିପ୍ଟର୍</translation> @@ -977,7 +976,6 @@ <translation id="1897120393475391208">ଜଟିଳ ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="1900305421498694955">ବାହ୍ୟ ଷ୍ଟୋରେଜ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକରେ ଥିବା ଫାଇଲ୍ଗୁଡ଼ିକୁ ପଢ଼ିବା ଏବଂ ଲେଖିବା ପାଇଁ Google Playରୁ ଆପ୍ଲିକେସନ୍ଗୁଡ଼ିକୁ ହୁଏତ ସମ୍ପୂର୍ଣ୍ଣ ଫାଇଲ୍ ସିଷ୍ଟମ୍ ଆକ୍ସେସ୍ର ଆବଶ୍ୟକତା ପଡ଼ିପାରେ। ଡିଭାଇସ୍ରେ ତିଆରି କରାଯାଇଥିବା ଫାଇଲ୍ ଓ ଫୋଲ୍ଡର୍ଗୁଡ଼ିକ ବାହ୍ୟ ଡ୍ରାଇଭ୍ ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କୁ ଦୃଶ୍ୟମାନ ହୁଏ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&ସମସ୍ତ ଚୟନ କରନ୍ତୁ</translation> -<translation id="1901396183631570154">Chrome ଏହି ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ସେଭ୍ କରିପାରିଲା ନାହିଁ। ଆପଣ ଏବେ ବି ସେଗୁଡ଼ିକୁ ଏହି ଡିଭାଇସରେ ସେଭ୍ କରିପାରିବେ।</translation> <translation id="1903995858055162096">ଆପଣଙ୍କ ଡିଭାଇସ୍ ନୁହେଁ କି? <ph name="BEGIN_LINK" />ଅତିଥି ମୋଡ୍<ph name="END_LINK" /> ବ୍ୟବହାର କରନ୍ତୁ।</translation> <translation id="1904580727789512086">ଆପଣ ଭିଜିଟ କରିଥିବା URLଗୁଡ଼ିକ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ସେଭ ହୋଇଥାଏ</translation> <translation id="1905375423839394163">Chromebook ଡିଭାଇସ୍ର ନାମ</translation> @@ -1613,7 +1611,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ଅନଇନଷ୍ଟଲ୍ କରିବାକୁ Windows ବନ୍ଦ କରନ୍ତୁ।</translation> <translation id="2477065602824695373">ଆପଣ ଏକାଧିକ ସ୍ୱିଚ ସେଟ ଅପ କରିଥିବା ଯୋଗୁଁ, ସ୍ୱଚାଳିତ-ସ୍କାନକୁ ବନ୍ଦ କରାଯାଇଛି।</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" ପାଇଁ ମିଡିଆ-ଫାଇଲ୍ର ଅନୁମତି</translation> -<translation id="248003956660572823">ପାସୱାର୍ଡଗୁଡ଼ିକ ସେଭ୍ କରାଯାଇନାହିଁ</translation> <translation id="2480868415629598489">ଆପଣ କପି ଏବଂ ପେଷ୍ଟ କରୁଥିବା ଡାଟା ସଂଶୋଧନ କରନ୍ତୁ</translation> <translation id="2482878487686419369">ବିଜ୍ଞପ୍ତି</translation> <translation id="2482895651873876648"><ph name="GROUP_NAME" /> ଗୋଷ୍ଠୀକୁ ଟାବ୍ ମୁଭ୍ କରାଯାଇଛି - <ph name="GROUP_CONTENTS" /></translation> @@ -1975,7 +1972,6 @@ <translation id="2813094189969465044">ମାତାପିତାଙ୍କ ଦ୍ଵାରା ନିୟନ୍ତ୍ରଣଗୁଡିକ</translation> <translation id="281390819046738856">ଅନୁରୋଧରେ ଦସ୍ତଖତ କରାଯାଇପାରିଲା ନାହିଁ</translation> <translation id="2814489978934728345">ଏହି ପୃଷ୍ଠାଟି ଲୋଡ୍ କରିବା ସ୍ଥଗିତ ରଖନ୍ତୁ</translation> -<translation id="281504910091592009">ଆପଣଙ୍କର <ph name="BEGIN_LINK" />Google ଆକାଉଣ୍ଟ<ph name="END_LINK" />ରେ ସେଭ୍ ହୋଇଥିବା ପାସ୍ୱର୍ଡଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ପରିଚାଳନା କରନ୍ତୁ।</translation> <translation id="2815693974042551705">ବୁକ୍ମାର୍କ ଫୋଲ୍ଡର୍</translation> <translation id="2816319641769218778">ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ପାସ୍ୱାର୍ଡଗୁଡ଼ିକୁ ସେଭ୍ କରିବାକୁ ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ।</translation> <translation id="2816628817680324566">ଆପଣଙ୍କ ସୁରକ୍ଷା କୀ'କୁ ଚିହ୍ନଟ କରିବା ପାଇଁ ଏହି ସାଇଟକୁ ଅନୁମତି ଦେବେ କି?</translation> @@ -4274,7 +4270,6 @@ <translation id="5078638979202084724">ସମସ୍ତ ଟାବ୍କୁ ବୁକ୍ମାର୍କ କରନ୍ତୁ</translation> <translation id="5078796286268621944">ଭୁଲ ପିନ୍</translation> <translation id="5079010647467150187">ବିଲ୍ଟ-ଇନ VPN ଯୋଗ କରନ୍ତୁ...</translation> -<translation id="5079950360618752063">ପ୍ରସ୍ତାବିତ ପାସ୍ୱର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="508059534790499809">ଏକ Kerberos ଟିକେଟ୍ ରିଫ୍ରେଶ୍ କରନ୍ତୁ</translation> <translation id="5084328598860513926">ପ୍ରୋଭିଜନିଂ ଫ୍ଲୋ ବାଧାପ୍ରାପ୍ତ ହୋଇଥିଲା। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସର ମାଲିକ କିମ୍ବା ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କୁ ଯୋଗାଯୋଗ କରନ୍ତୁ। ତ୍ରୁଟି କୋଡ୍: <ph name="ERROR_CODE" />।</translation> <translation id="5085162214018721575">ଅପ୍ଡେଟ୍ ପାଇଁ ଯାଞ୍ଚ କରୁଛି</translation> @@ -4399,7 +4394,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ଡିଲିଟ୍ କରିବେ କି?</translation> <translation id="520621735928254154">ସାର୍ଟିଫିକେଟ୍ ଇମ୍ପୋର୍ଟ ତ୍ରୁଟି</translation> <translation id="5206562235913517859">ରିଟେଲର-ଷ୍ଟୋର ID ABC-1234 ଫର୍ମାଟରେ ଅଛି</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ସଫଳତାର ସହ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। ଆପଣଙ୍କର #ଟି ଅଧିକ ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ଅଛି। Chrome ଏହି ପାସୱାର୍ଡକୁ ବର୍ତ୍ତମାନ ଯାଞ୍ଚ କରିବା ପାଇଁ ସୁପାରିଶ କରେ।}other{ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ସଫଳତାର ସହ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। ଆପଣଙ୍କର #ଟି ଅଧିକ ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ଅଛି। Chrome ଏହି ପାସୱାର୍ଡଗୁଡ଼ିକୁ ବର୍ତ୍ତମାନ ଯାଞ୍ଚ କରିବା ପାଇଁ ସୁପାରିଶ କରେ।}}</translation> <translation id="5207949376430453814">ଟେକ୍ସଟ୍ କ୍ୟାରେଟ୍ ହାଇଲାଇଟ୍ କରନ୍ତୁ</translation> <translation id="520840839826327499">ଆପଣ ଏକ ଯୋଗ୍ୟ ChromeOS ଡିଭାଇସ ବ୍ୟବହାର କରୁଛନ୍ତି କି ନାହିଁ, <ph name="SERVICE_NAME" /> ଯାଞ୍ଚ କରିବାକୁ ଚାହେଁ।</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> ପ୍ରମାଣୀକରଣ ଟୋକନ୍ ଷ୍ଟୋର୍ କରାଯାଉଛି</translation> @@ -6226,7 +6220,6 @@ <translation id="6970861306198150268">ଆପଣ ଏହି ସାଇଟ ପାଇଁ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ପାସୱାର୍ଡକୁ ସେଭ କରୁଛନ୍ତି ବୋଲି ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation> <translation id="6972180789171089114">ଅଡିଓ/ଭିଡିଓ</translation> <translation id="6972754398087986839">ଆରମ୍ଭ କରନ୍ତୁ</translation> -<translation id="6972887130317925583">ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ସଫଳତାର ସହ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। <ph name="SETTINGS" />ରେ ଯେ କୌଣସି ସମୟରେ ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ।</translation> <translation id="697312151395002334">ପପ୍-ଅପଗୁଡ଼ିକ ପଠାଇ ରିଡାଇରେକ୍ଟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଆଯାଇଛି</translation> <translation id="6973611239564315524">Debian 10 (Buster)ର ଏକ ଅପଗ୍ରେଡ୍ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="69739764870135975">ଯଦି Google ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ମଧ୍ୟ ହୋଇଥାଏ, ତେବେ ଆପଣ ଆହୁରି ଭଲ, ପ୍ରାସଙ୍ଗିକ ପରାମର୍ଶ ଦେଖିବେ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index f01cb4a6..b9640e41 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">ਸਾਂਝਾਕਰਨ ਦੇ ਵਿਕਲਪਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਸ਼ਾਇਦ ਕੁਝ ਆਈਟਮਾਂ ਲੁਕੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ।</translation> <translation id="1622054403950683339">ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਛੱਡੋ</translation> <translation id="1623723619460186680">ਨੀਲੀ ਲਾਈਟ ਘਟਾਉਣਾ</translation> -<translation id="1624012933569991823">ਸੈਟਿੰਗਾਂ</translation> <translation id="1624599281783425761">ਤੁਹਾਨੂੰ <ph name="MERCHANT" /> ਦੁਬਾਰਾ ਨਹੀਂ ਦਿਸੇਗਾ</translation> <translation id="1624863973697515675">ਇਹ ਫ਼ਾਈਲ ਬਹੁਤ ਵੱਡੀ ਹੈ, ਇਸ ਕਰਕੇ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਇਸ ਦਾ ਪ੍ਰਬੰਧਨ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਇਸ ਨੂੰ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="1627276047960621195">ਫ਼ਾਈਲ ਵਰਣਨਕਰਤਾ</translation> @@ -728,6 +727,7 @@ <translation id="1676902103953506022"><ph name="DOMAIN" /> 'ਤੇ <ph name="USERNAME" /> ਦੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਵੇਰਵੇ</translation> <translation id="1677306805708094828"><ph name="EXTENSION_TYPE_PARAMETER" /> ਨੂੰ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="1677472565718498478"><ph name="TIME" /> ਬਾਕੀ</translation> +<translation id="1678794218766467608">ਸਲੀਪ ਮੋਡ ਵਿੱਚ ਜਾਂ ਕਵਰ ਬੰਦ ਹੋਣ 'ਤੇ ਲਾਕ ਕਰੋ</translation> <translation id="1679068421605151609">ਵਿਕਾਸਕਾਰ ਟੂਲਾਂ</translation> <translation id="1679810534535368772">ਕੀ ਪੱਕਾ ਤੁਸੀਂ ਬਾਹਰ ਜਾਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="167983332380191032">ਪ੍ਰਬੰਧਨ ਸੇਵਾ ਨੇ HTTP ਗੜਬੜ ਕੋਡ ਭੇਜਿਆ।</translation> @@ -993,7 +993,6 @@ <translation id="1897120393475391208">ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="1900305421498694955">Google Play ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਸ਼ਾਇਦ ਬਾਹਰੀ ਸਟੋਰੇਜ ਡੀਵਾਈਸਾਂ ਦੀਆਂ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਲਈ ਪੂਰੇ ਫ਼ਾਈਲ ਸਿਸਟਮ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਲੋੜ ਪਵੇ। ਡੀਵਾਈਸ 'ਤੇ ਬਣਾਈਆਂ ਫ਼ਾਈਲਾਂ ਅਤੇ ਫੋਲਡਰ ਬਾਹਰੀ ਡਰਾਈਵ ਵਰਤਣ ਵਾਲੇ ਹਰ ਵਿਅਕਤੀ ਨੂੰ ਦਿਸਦੇ ਹਨ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&ਸਾਰੇ ਚੁਣੋ</translation> -<translation id="1901396183631570154">Chrome ਇਹਨਾਂ ਪਾਸਵਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਇਹਨਾਂ ਨੂੰ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="1903995858055162096">ਕੀ ਇਹ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਨਹੀਂ ਹੈ? <ph name="BEGIN_LINK" />ਮਹਿਮਾਨ ਮੋਡ<ph name="END_LINK" /> ਵਰਤੋ।</translation> <translation id="1904580727789512086">ਉਹ URL ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤੇ ਜਾਂਦੇ ਹਨ, ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ ਗਏ ਹੋ</translation> <translation id="1905375423839394163">Chromebook ਡੀਵਾਈਸ ਦਾ ਨਾਮ</translation> @@ -1631,7 +1630,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ਨੂੰ ਅਣਸਥਾਪਤ ਕਰਨ ਲਈ Windows ਨੂੰ ਬੰਦ ਕਰੋ।</translation> <translation id="2477065602824695373">ਕਿਉਂਕਿ ਤੁਸੀਂ ਕਈ ਸਵਿੱਚਾਂ ਦਾ ਸੈੱਟਅੱਪ ਕੀਤਾ ਹੈ, ਇਸ ਲਈ 'ਸਵੈ-ਸਕੈਨ' ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ।</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" ਲਈ ਮੀਡੀਆ-ਫਾਈਲ ਅਨੁਮਤੀਆਂ</translation> -<translation id="248003956660572823">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੇ ਗਏ</translation> <translation id="2480868415629598489">ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਅਤੇ ਪੇਸਟ ਕੀਤੇ ਗਏ ਡਾਟੇ ਨੂੰ ਸੋਧੋ</translation> <translation id="2482878487686419369">ਸੂਚਨਾਵਾਂ</translation> <translation id="2482895651873876648">ਟੈਬ ਨੂੰ <ph name="GROUP_NAME" /> ਵਿੱਚ ਲਿਜਾਇਆ ਗਿਆ - <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1991,6 @@ <translation id="2813094189969465044">ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ</translation> <translation id="281390819046738856">ਬੇਨਤੀ ਮਨਜ਼ੂਰ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।</translation> <translation id="2814489978934728345">ਇਹ ਸਫ਼ਾ ਲੋਡ ਕਰਨਾ ਬੰਦ ਕਰੋ</translation> -<translation id="281504910091592009">ਆਪਣੇ <ph name="BEGIN_LINK" />Google ਖਾਤੇ<ph name="END_LINK" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਦੇਖੋ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="2815693974042551705">ਬੁੱਕਮਾਰਕ ਫੋਲਡਰ</translation> <translation id="2816319641769218778">ਪਾਸਵਰਡਾਂ ਨੂੰ ਆਪਣੇ 'Google ਖਾਤੇ' ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਲਈ, ਸਿੰਕ ਚਾਲੂ ਕਰੋ।</translation> <translation id="2816628817680324566">ਕੀ ਇਸ ਸਾਈਟ ਨੂੰ ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਦੀ ਪਛਾਣ ਕਰਨ ਦੇਣੀ ਹੈ?</translation> @@ -3809,6 +3806,7 @@ <translation id="4586275095964870617"><ph name="URL" /> ਕਿਸੇ ਵਿਕਲਪਿਕ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਨਹੀਂ ਖੁੱਲ੍ਹ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਸਿਸਟਮ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।</translation> <translation id="4589713469967853491">ਲੌਗਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਸਫਲਤਾਪੂਰਕ ਲਿਖਿਆ ਗਿਆ।</translation> <translation id="4590324241397107707">ਡਾਟਾਬੇਸ ਸਟੋਰੇਜ</translation> +<translation id="459204634473266369"><ph name="PRIMARY_EMAIL" /> ਵਿੱਚ ਕਿਸੇ ਵੀ ਡੀਵਾਈਸ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ</translation> <translation id="4592891116925567110">ਸਟਾਈਲਸ ਚਿੱਤਰਕਾਰੀ ਸੰਬੰਧੀ ਐਪ</translation> <translation id="4593021220803146968">&<ph name="URL" /> ਤੇ ਜਾਓ</translation> <translation id="4594577641390224176">ਕੀ ਪੰਨੇ ਸੰਬੰਧੀ ਸਿਸਟਮ ਨੂੰ ਲੱਭ ਰਹੇ ਹੋ? ਇੱਥੇ ਜਾਓ</translation> @@ -4292,7 +4290,6 @@ <translation id="5078638979202084724">ਸਾਰੀਆਂ ਟੈਬਾਂ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ</translation> <translation id="5078796286268621944">ਗ਼ਲਤ PIN</translation> <translation id="5079010647467150187">ਅੰਦਰ-ਮੌਜੂਦ VPN ਸ਼ਾਮਲ ਕਰੋ...</translation> -<translation id="5079950360618752063">ਸੁਝਾਏ ਗਏ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="508059534790499809">Kerberos ਟਿਕਟ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="5084328598860513926">ਪ੍ਰੋਵੀਜ਼ਨਿੰਗ ਦੇ ਵਹਾਅ ਵਿੱਚ ਵਿਘਨ ਪੈ ਗਿਆ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਦੇ ਮਾਲਕ ਜਾਂ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਗੜਬੜ ਕੋਡ: <ph name="ERROR_CODE" />।</translation> <translation id="5085162214018721575">ਅਪਡੇਟਾਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ</translation> @@ -4368,6 +4365,7 @@ <translation id="5155327081870541046">ਪਤਾ ਬਾਰ ਵਿੱਚ, ਉਸ ਸਾਈਟ ਦਾ ਸ਼ਾਰਟਕੱਟ ਦਾਖਲ ਕਰੋ ਜਿਸਨੂੰ ਤੁਸੀਂ ਖੋਜਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਜਿਵੇਂ ਕਿ "@bookmarks"। ਫਿਰ, ਆਪਣਾ ਤਰਜੀਹੀ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਦਬਾਓ ਅਤੇ ਆਪਣਾ ਖੋਜ ਸ਼ਬਦ ਦਾਖਲ ਕਰੋ।</translation> <translation id="5156638757840305347">ਕਰਸਰ ਦਿਸਣ ਜਾਂ ਹਿਲਜੁਲ ਹੋਣ 'ਤੇ ਉਜਾਗਰ ਹੁੰਦਾ ਹੈ</translation> <translation id="5157635116769074044">ਸਟਾਰਟ ਸਕ੍ਰੀਨ ਲਈ ਇਹ ਸਫ਼ਾ ਪਿਨ ਕਰੋ...</translation> +<translation id="5158206172605340248">ਐਕਸੈਂਟ ਚਿੰਨ੍ਹ ਮੀਨੂ ਖਾਰਜ ਕੀਤਾ ਗਿਆ।</translation> <translation id="5159094275429367735">Crostini ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ</translation> <translation id="5159419673777902220">ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਨੇ ਐਕਸਟੈਂਸ਼ਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ</translation> <translation id="5159643365935452998">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨ ਦੀ ਸਮੀਖਿਆ ਕਰੋ</translation> @@ -4417,7 +4415,6 @@ <translation id="5206215183583316675">ਕੀ "<ph name="CERTIFICATE_NAME" />" ਮਿਟਾਉਣਾ ਹੈ?</translation> <translation id="520621735928254154">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਆਯਾਤ ਗੜਬੜ</translation> <translation id="5206562235913517859">ਵਿਕਰੇਤਾ-ਸਟੋਰ ਆਈਡੀ ABC-1234 ਫਾਰਮੈਟ ਵਿੱਚ ਹੈ</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਸਫਲਤਾਪੂਰਕ ਬਦਲਿਆ ਗਿਆ। ਤੁਹਾਡੇ ਕੋਲ # ਹੋਰ ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਹੈ। Chrome ਹੁਣੇ ਇਸ ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕਰਦਾ ਹੈ।}one{ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਸਫਲਤਾਪੂਰਕ ਬਦਲਿਆ ਗਿਆ। ਤੁਹਾਡੇ ਕੋਲ # ਹੋਰ ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਹੈ। Chrome ਹੁਣੇ ਇਸ ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕਰਦਾ ਹੈ।}other{ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਸਫਲਤਾਪੂਰਕ ਬਦਲਿਆ ਗਿਆ। ਤੁਹਾਡੇ ਕੋਲ # ਹੋਰ ਛੇੜਛਾੜ ਵਾਲੇ ਪਾਸਵਰਡ ਹਨ। Chrome ਹੁਣੇ ਇਹਨਾਂ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕਰਦਾ ਹੈ।}}</translation> <translation id="5207949376430453814">ਲਿਖਤ ਕੈਰੇਟ ਨੂੰ ਉਜਾਗਰ ਕਰੋ</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ਸੇਵਾ ਇਹ ਜਾਂਚ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ ਕਿ ਕੀ ਤੁਸੀਂ ਯੋਗ ChromeOS ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੇ ਹੋ।</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> ਪ੍ਰਮਾਣੀਕਰਨ ਟੋਕਨ ਨੂੰ ਸਟੋਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> @@ -6249,7 +6246,6 @@ <translation id="6970861306198150268">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਇਸ ਸਾਈਟ ਲਈ ਆਪਣਾ ਮੌਜੂਦਾ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰ ਰਹੇ ਹੋ</translation> <translation id="6972180789171089114">ਆਡੀਓ /ਵੀਡੀਓ</translation> <translation id="6972754398087986839">ਸ਼ੁਰੂ ਕੀਤਾ</translation> -<translation id="6972887130317925583">ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਸਫਲਤਾਪੂਰਕ ਬਦਲਿਆ ਗਿਆ। ਕਿਸੇ ਵੀ ਵੇਲੇ <ph name="SETTINGS" /> ਵਿੱਚ ਜਾ ਕੇ ਆਪਣੇ ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰੋ।</translation> <translation id="697312151395002334">ਪੌਪ-ਅੱਪ ਭੇਜਣ ਅਤੇ ਰੀਡਾਇਰੈਕਟ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> <translation id="6973611239564315524">Debian 10 (Buster) ਦਾ ਅੱਪਡੇਟ ਉਪਲਬਧ ਹੈ</translation> <translation id="69739764870135975">ਜੇ Google ਹੀ ਤੁਹਾਡਾ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਖੋਜ ਇੰਜਣ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਬਿਹਤਰ ਅਤੇ ਸੰਦਰਭੀ ਤੌਰ 'ਤੇ ਢੁਕਵੇਂ ਸੁਝਾਅ ਦੇਖੋਗੇ</translation> @@ -6501,6 +6497,7 @@ <translation id="7235716375204803342">ਸਰਗਰਮੀਆਂ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ...</translation> <translation id="7235737137505019098">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਵਿੱਚ ਕਿਸੇ ਵੀ ਹੋਰ ਖਾਤੇ ਲਈ ਲੋੜੀਂਦੀ ਜਗ੍ਹਾ ਨਹੀਂ ਹੈ।</translation> <translation id="7235873936132740888">ਜਦੋਂ ਤੁਸੀਂ ਵਿਸ਼ੇਸ਼ ਕਿਸਮਾਂ ਦੇ ਲਿੰਕਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰਦੇ ਹੋ, ਤਾਂ ਸਾਈਟਾਂ ਵਿਸ਼ੇਸ਼ ਕਾਰਜਾਂ ਨੂੰ ਸੰਭਾਲ ਸਕਦੀਆਂ ਹਨ , ਜਿਵੇਂ ਕਿ ਤੁਹਾਡੇ ਈਮੇਲ ਕਲਾਇੰਟ ਵਿੱਚ ਨਵਾਂ ਸੰਦੇਸ਼ ਬਣਾਉਣਾ ਜਾਂ ਤੁਹਾਡੇ ਆਨਲਾਈਨ ਕੈਲੰਡਰ ਵਿੱਚ ਨਵੇਂ ਇਵੈਂਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ</translation> +<translation id="7238609589076576185">ਐਕਸੈਂਟ ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।</translation> <translation id="7239108166256782787"><ph name="DEVICE_NAME" /> ਨੇ ਟ੍ਰਾਂਸਫ਼ਰ ਰੱਦ ਕਰ ਦਿੱਤਾ</translation> <translation id="7240339475467890413">ਨਵੇਂ ਹੌਟਸਪੌਟ ਨਾਲ ਕਨੈਕਟ ਕਰੀਏ?</translation> <translation id="7241389281993241388">ਕਿਰਪਾ ਕਰਕੇ ਕਲਾਈਂਟ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਆਯਾਤ ਕਰਨ ਲਈ <ph name="TOKEN_NAME" /> 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> @@ -7341,6 +7338,7 @@ <translation id="8030852056903932865">ਮਨਜ਼ੂਰ ਕਰੋ</translation> <translation id="8032244173881942855">ਟੈਬ ਕਾਸਟ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ।</translation> <translation id="8032569120109842252">ਅਨੁਸਰਣ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="8033023935541439900">ਐਕਸੈਂਟ ਚਿੰਨ੍ਹ ਮੀਨੂ ਖੁੱਲ੍ਹਾ ਹੈ। ਨੈਵੀਗੇਟ ਕਰਨ ਲਈ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਦਬਾਓ ਅਤੇ ਦਾਖਲ ਕਰਨ ਲਈ Enter ਦਬਾਓ।</translation> <translation id="8033827949643255796">ਚੁਣਿਆ</translation> <translation id="8033958968890501070">ਸਮਾਂ-ਸਮਾਪਤੀ</translation> <translation id="8035059678007243127">ਪੂਰੇ ਪੰਨੇ ਦੇ ਕੈਸ਼ੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਇਨਕੋਗਨਿਟੋ ਪੰਨਾ: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index ab1c48b7..82a5094 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Opcjami udostępniania zarządza Twoja organizacja. Niektóre elementy mogą być ukryte.</translation> <translation id="1622054403950683339">Zapomnij sieć Wi-Fi</translation> <translation id="1623723619460186680">Redukcja niebieskiego światła</translation> -<translation id="1624012933569991823">Ustawienia</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> nie pojawi się ponownie</translation> <translation id="1624863973697515675">Plik jest za duży, dlatego to urządzenie nie może nim zarządzać. Spróbuj go pobrać na inne urządzenie</translation> <translation id="1627276047960621195">Deskryptory plików</translation> @@ -979,7 +978,6 @@ <translation id="1897120393475391208">Użyj silnego hasła</translation> <translation id="1900305421498694955">Aplikacje z Google Play mogą wymagać pełnego dostępu do systemu plików, by odczytywać i zapisywać pliki na zewnętrznych urządzeniach pamięci masowej. Pliki i foldery utworzone na urządzeniu są widoczne dla każdej osoby używającej dysku zewnętrznego. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Zaznacz &wszystko</translation> -<translation id="1901396183631570154">Chrome nie może zapisać tych haseł na Twoim koncie Google. Możesz je jednak zapisać na tym urządzeniu.</translation> <translation id="1903995858055162096">To nie Twoje urządzenie? Użyj <ph name="BEGIN_LINK" />trybu gościa<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Odwiedzane adresy URL są zapisywane na Twoim koncie Google</translation> <translation id="1905375423839394163">Nazwa Chromebooka</translation> @@ -1603,7 +1601,6 @@ <translation id="2476974672882258506">Aby odinstalować <ph name="PARALLELS_DESKTOP" />, zamknij system Windows.</translation> <translation id="2477065602824695373">Automatyczne skanowanie zostało wyłączone, bo masz skonfigurowanych kilka przełączników.</translation> <translation id="2478176599153288112">Uprawnienia pliku multimedialnego dla rozszerzenia „<ph name="EXTENSION" />”</translation> -<translation id="248003956660572823">Hasła nie zostały zapisane</translation> <translation id="2480868415629598489">Modyfikowanie danych, które kopiujesz i wklejasz</translation> <translation id="2482878487686419369">Powiadomienia</translation> <translation id="2482895651873876648">Karta została przeniesiona do grupy <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1965,7 +1962,6 @@ <translation id="2813094189969465044">Kontrola rodzicielska</translation> <translation id="281390819046738856">Nie udało się podpisać żądania.</translation> <translation id="2814489978934728345">Zatrzymaj ładowanie strony</translation> -<translation id="281504910091592009">Zapisane hasła znajdziesz na swoim <ph name="BEGIN_LINK" />koncie Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Folder zakładek</translation> <translation id="2816319641769218778">Aby zapisywać hasła na swoim koncie Google, włącz synchronizację.</translation> <translation id="2816628817680324566">Zezwolić tej stronie na zidentyfikowanie klucza bezpieczeństwa?</translation> @@ -4265,7 +4261,6 @@ <translation id="5078638979202084724">Dodaj wszystkie karty do zakładek</translation> <translation id="5078796286268621944">Błędny kod PIN</translation> <translation id="5079010647467150187">Dodaj wbudowaną sieć VPN…</translation> -<translation id="5079950360618752063">Użyj sugerowanego hasła</translation> <translation id="508059534790499809">Odświeżanie zgłoszenia Kerberos</translation> <translation id="5084328598860513926">Proces obsługi administracyjnej został przerwany. Spróbuj jeszcze raz albo skontaktuj się z właścicielem lub administratorem urządzenia. Kod błędu: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Sprawdzanie dostępności aktualizacji</translation> @@ -4391,7 +4386,6 @@ <translation id="5206215183583316675">Usunąć „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Błąd importowania certyfikatu</translation> <translation id="5206562235913517859">Identyfikator sklepu sprzedawcy ma format ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Zmieniono przejęte hasło. Masz jeszcze # przejęte hasło. Chrome zaleca, by jak najszybciej je sprawdzić.}few{Zmieniono przejęte hasło. Masz jeszcze # przejęte hasła. Chrome zaleca, by jak najszybciej je sprawdzić.}many{Zmieniono przejęte hasło. Masz jeszcze # przejętych haseł. Chrome zaleca, by jak najszybciej je sprawdzić.}other{Zmieniono przejęte hasło. Masz jeszcze # przejętego hasła. Chrome zaleca, by jak najszybciej je sprawdzić.}}</translation> <translation id="5207949376430453814">Podświetlaj kursor tekstu</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> chce sprawdzić, czy używasz odpowiedniego urządzenia z Chrome OS.</translation> <translation id="5208548918290612795">Przechowywanie tokena uwierzytelniającego usługi <ph name="WEB_DRIVE" /></translation> @@ -6220,7 +6214,6 @@ <translation id="6970861306198150268">Upewnij się, że zapisujesz bieżące hasło do witryny</translation> <translation id="6972180789171089114">Audio/wideo</translation> <translation id="6972754398087986839">Rozpocznij</translation> -<translation id="6972887130317925583">Zmieniono przejęte hasło. Hasło możesz sprawdzić w dowolnym momencie, wybierając <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Zezwolono na wysyłanie wyskakujących okienek i używanie przekierowań</translation> <translation id="6973611239564315524">Dostępne jest uaktualnienie do Debiana 10 (Buster)</translation> <translation id="69739764870135975">Jeśli Google jest Twoją domyślną wyszukiwarką, zobaczysz lepiej dopasowane sugestie</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index f4f8ee17..9fa4112 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -668,7 +668,6 @@ <translation id="1621984899599015181">As opções de compartilhamento são gerenciadas pela sua organização. Alguns itens podem estar ocultos.</translation> <translation id="1622054403950683339">Esquecer rede Wi-Fi</translation> <translation id="1623723619460186680">Redução de luz azul</translation> -<translation id="1624012933569991823">Configurações</translation> <translation id="1624599281783425761">Você não verá <ph name="MERCHANT" /> novamente</translation> <translation id="1624863973697515675">Esse arquivo é grande demais para o dispositivo gerenciar. Tente fazer o download em outro dispositivo</translation> <translation id="1627276047960621195">Descritores de arquivos</translation> @@ -728,6 +727,7 @@ <translation id="1676902103953506022">Detalhes de credenciais de <ph name="USERNAME" /> em <ph name="DOMAIN" /></translation> <translation id="1677306805708094828">Não é possível adicionar <ph name="EXTENSION_TYPE_PARAMETER" /></translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> +<translation id="1678794218766467608">Bloquear no modo de espera ou quando a tampa estiver fechada</translation> <translation id="1679068421605151609">Ferramentas para desenvolvedores</translation> <translation id="1679810534535368772">Quer mesmo sair?</translation> <translation id="167983332380191032">O serviço de gerenciamento enviou um erro de HTTP.</translation> @@ -993,7 +993,6 @@ <translation id="1897120393475391208">Use uma senha forte</translation> <translation id="1900305421498694955">Os apps do Google Play podem exigir acesso total ao sistema de arquivos para a leitura e a gravação de arquivos em dispositivos de armazenamento externo. Os arquivos e pastas criados no dispositivo ficam visíveis para qualquer pessoa que use o drive externo. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Selecionar &tudo</translation> -<translation id="1901396183631570154">Não foi possível salvar estas senhas na sua Conta do Google. Você ainda pode salvá-las no dispositivo.</translation> <translation id="1903995858055162096">O dispositivo não é seu? Use o <ph name="BEGIN_LINK" />modo visitante<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Os URLs que você acessa ficam armazenados na sua Conta do Google</translation> <translation id="1905375423839394163">Nome do dispositivo Chromebook</translation> @@ -1631,7 +1630,6 @@ <translation id="2476974672882258506">Desligue o Windows para desinstalar o <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">A leitura automática foi desativada porque você configurou vários interruptores.</translation> <translation id="2478176599153288112">Permissões de arquivos de mídia para "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">As senhas não foram salvas</translation> <translation id="2480868415629598489">Modificar os dados que você copia e cola</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2482895651873876648">A guia foi movida para o grupo <ph name="GROUP_NAME" />: <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1991,6 @@ <translation id="2813094189969465044">Controle da família</translation> <translation id="281390819046738856">Não foi possível assinar a solicitação.</translation> <translation id="2814489978934728345">Parar de carregar esta página</translation> -<translation id="281504910091592009">Ver e gerenciar as senhas salvas na sua <ph name="BEGIN_LINK" />Conta do Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Pasta de favoritos</translation> <translation id="2816319641769218778">Para salvar senhas na Conta do Google, ative a sincronização.</translation> <translation id="2816628817680324566">Permitir que este site identifique sua chave de segurança?</translation> @@ -3811,6 +3808,7 @@ <translation id="4586275095964870617">Não foi possível abrir <ph name="URL" /> em um navegador alternativo. Fale com o administrador do sistema.</translation> <translation id="4589713469967853491">Os registros foram gravados no diretório Downloads.</translation> <translation id="4590324241397107707">Armazenamento de banco de dados</translation> +<translation id="459204634473266369">Nenhum dispositivo salvo na conta <ph name="PRIMARY_EMAIL" /></translation> <translation id="4592891116925567110">App de desenho com a stylus</translation> <translation id="4593021220803146968">&Ir até <ph name="URL" /></translation> <translation id="4594577641390224176">Procurando a página de detalhes do sistema? Acesse</translation> @@ -4294,7 +4292,6 @@ <translation id="5078638979202084724">Adicionar todas as guias aos favoritos</translation> <translation id="5078796286268621944">PIN incorreto</translation> <translation id="5079010647467150187">Adicionar VPN integrada…</translation> -<translation id="5079950360618752063">Usar senha sugerida</translation> <translation id="508059534790499809">Atualizar um tíquete do Kerberos</translation> <translation id="5084328598860513926">O fluxo de provisionamento foi interrompido. Tente novamente ou entre em contato com o proprietário ou administrador do dispositivo. Código do erro: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Verificando atualizações</translation> @@ -4370,6 +4367,7 @@ <translation id="5155327081870541046">Na barra de endereço, digite o atalho do site em que você quer pesquisar, como "@favoritos". Depois, pressione o atalho de teclado que preferir e digite o termo de pesquisa.</translation> <translation id="5156638757840305347">O cursor é destacado quando aparece ou se move.</translation> <translation id="5157635116769074044">Fixar guia dessa página na tela inicial.</translation> +<translation id="5158206172605340248">Menu de acentos dispensado.</translation> <translation id="5159094275429367735">Configurar o Crostini</translation> <translation id="5159419673777902220">Seu pai/mãe desativou as permissões da extensão</translation> <translation id="5159643365935452998">Revisar a limpeza de dados automática</translation> @@ -4419,7 +4417,6 @@ <translation id="5206215183583316675">Quer excluir "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Erro ao importar certificado</translation> <translation id="5206562235913517859">O formato do ID da loja do varejista é ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{A senha comprometida foi modificada. Você tem # outra senha comprometida. O Chrome recomenda verificá-la imediatamente.}one{A senha comprometida foi modificada. Você tem # outra senha comprometida. O Chrome recomenda verificá-la imediatamente.}other{A senha comprometida foi modificada. Você tem # outras senhas comprometidas. O Chrome recomenda verificá-las imediatamente.}}</translation> <translation id="5207949376430453814">Destacar cursor de texto</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> quer verificar se você está usando um dispositivo ChromeOS qualificado.</translation> <translation id="5208548918290612795">Armazenando token de autenticação do <ph name="WEB_DRIVE" /></translation> @@ -6251,7 +6248,6 @@ <translation id="6970861306198150268">Salve a senha atual para este site</translation> <translation id="6972180789171089114">Áudio/vídeo</translation> <translation id="6972754398087986839">Vamos começar</translation> -<translation id="6972887130317925583">A senha comprometida foi modificada. Verifique suas senhas a qualquer momento nas <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Permitir o envio de pop-ups e o uso de redirecionamentos</translation> <translation id="6973611239564315524">O upgrade para o Debian 10 (Buster) está disponível</translation> <translation id="69739764870135975">Se o Google também for seu mecanismo de pesquisa padrão, você vai receber sugestões melhores e relevantes para o contexto</translation> @@ -6503,6 +6499,7 @@ <translation id="7235716375204803342">Buscando atividades…</translation> <translation id="7235737137505019098">Sua chave de segurança não tem espaço suficiente para mais contas.</translation> <translation id="7235873936132740888">Quando você clica em tipos específicos de links, os sites podem realizar tarefas especiais, como criar uma nova mensagem no seu cliente de e-mail ou adicionar novos eventos à sua agenda on-line</translation> +<translation id="7238609589076576185">Acento inserido.</translation> <translation id="7239108166256782787"><ph name="DEVICE_NAME" /> cancelou a transferência</translation> <translation id="7240339475467890413">Conectar a um novo ponto de acesso?</translation> <translation id="7241389281993241388">Faça login no <ph name="TOKEN_NAME" /> para importar o certificado do cliente.</translation> @@ -7345,6 +7342,7 @@ <translation id="8030852056903932865">Aprovar</translation> <translation id="8032244173881942855">Não é possível transmitir a guia.</translation> <translation id="8032569120109842252">Seguindo</translation> +<translation id="8033023935541439900">Menu de acentos aberto. Pressione a seta para a esquerda ou direita para navegar e "Enter" para inserir.</translation> <translation id="8033827949643255796">selecionado</translation> <translation id="8033958968890501070">Expirada</translation> <translation id="8035059678007243127">Página de navegação anônima salva em cache de avanço e retorno: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index c387ed11..f964bab 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">As opções para partilhar são geridas pela sua entidade. Alguns itens podem estar ocultos.</translation> <translation id="1622054403950683339">Esquecer rede Wi-Fi</translation> <translation id="1623723619460186680">Redução da luz azul</translation> -<translation id="1624012933569991823">Definições</translation> <translation id="1624599281783425761">Não irá ver <ph name="MERCHANT" /> novamente.</translation> <translation id="1624863973697515675">Este ficheiro é demasiado grande para o seu dispositivo gerir. Tente transferi-lo noutro dispositivo</translation> <translation id="1627276047960621195">Descritores de ficheiros</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Usar palavra-passe forte</translation> <translation id="1900305421498694955">As aplicações do Google Play podem necessitar de acesso completo ao sistema de ficheiros para ler e gravar ficheiros em dispositivos de armazenamento externos. Os ficheiros e as pastas criados no dispositivo são visíveis para qualquer pessoa que utilize a unidade externa. <ph name="LINK_BEGIN" />Saber mais<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Seleccion&ar tudo</translation> -<translation id="1901396183631570154">O Chrome não conseguiu guardar estas palavras-passe na sua Conta Google. Ainda pode guardá-las neste dispositivo.</translation> <translation id="1903995858055162096">Este não é o seu dispositivo? Utilize o <ph name="BEGIN_LINK" />modo convidado<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Os URLs que visita são guardados na sua Conta Google</translation> <translation id="1905375423839394163">Nome do dispositivo do Chromebook</translation> @@ -1615,7 +1613,6 @@ <translation id="2476974672882258506">Encerre o Windows para desinstalar o <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Uma vez que configurou vários interruptores, a análise automática foi desativada.</translation> <translation id="2478176599153288112">Autorizações de ficheiros multimédia para "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Palavras-passe não guardadas</translation> <translation id="2480868415629598489">Modificar os dados que copia e cola</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2482895651873876648">Separador movido para o grupo <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1977,7 +1974,6 @@ <translation id="2813094189969465044">Controlo parental</translation> <translation id="281390819046738856">Não foi possível assinar o pedido.</translation> <translation id="2814489978934728345">Parar de carregar esta página</translation> -<translation id="281504910091592009">Veja e faça a gestão das palavras-passe guardadas na sua <ph name="BEGIN_LINK" />Conta Google<ph name="END_LINK" />.</translation> <translation id="2815693974042551705">Pasta de marcadores</translation> <translation id="2816319641769218778">Para guardar palavras-passe na sua Conta Google, ative a sincronização.</translation> <translation id="2816628817680324566">Permitir que este site veja a sua chave de segurança?</translation> @@ -4277,7 +4273,6 @@ <translation id="5078638979202084724">Adicionar todos os separadores aos marcadores</translation> <translation id="5078796286268621944">PIN incorreto</translation> <translation id="5079010647467150187">Adicionar VPN incorporada…</translation> -<translation id="5079950360618752063">Utilizar palavra-passe sugerida</translation> <translation id="508059534790499809">Atualize uma permissão Kerberos</translation> <translation id="5084328598860513926">O fluxo de Administração de contas foi interrompido. Tente novamente ou contacte o proprietário ou o gestor do dispositivo. Código de erro: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">A verificar existência de atualizações</translation> @@ -4402,7 +4397,6 @@ <translation id="5206215183583316675">Eliminar "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Erro de importação do certificado</translation> <translation id="5206562235913517859">O ID da loja do retalhista deve estar no formato ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Alterou com êxito a palavra-passe comprometida. Tem mais # palavra-passe comprometida. O Chrome recomenda que verifique agora esta palavra-passe.}other{Alterou com êxito a palavra-passe comprometida. Tem mais # palavras-passe comprometidas. O Chrome recomenda que verifique agora estas palavras-passe.}}</translation> <translation id="5207949376430453814">Realçar cursor do texto</translation> <translation id="520840839826327499">O <ph name="SERVICE_NAME" /> quer verificar se está a usar um dispositivo com ChromeOS elegível.</translation> <translation id="5208548918290612795">Armazenamento do símbolo de autenticação do <ph name="WEB_DRIVE" /></translation> @@ -6232,7 +6226,6 @@ <translation id="6970861306198150268">Certifique-se de que está a guardar a sua palavra-passe atual para este site</translation> <translation id="6972180789171089114">Áudio/Vídeo</translation> <translation id="6972754398087986839">Começar</translation> -<translation id="6972887130317925583">Alterou com êxito a palavra-passe comprometida. Verifique as suas palavras-passe em qualquer altura em <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Com autorização para enviar pop-ups e utilizar redirecionamentos</translation> <translation id="6973611239564315524">Está disponível uma atualização para a versão Debian 10 (Buster).</translation> <translation id="69739764870135975">Se o Google também for o seu motor de pesquisa predefinido, verá melhores sugestões contextualmente relevantes</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 1e7cda7d..321cad5 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -665,7 +665,6 @@ <translation id="1621984899599015181">Opțiunile de distribuire sunt gestionate de organizația ta. Este posibil ca unele elemente să fie ascunse.</translation> <translation id="1622054403950683339">Elimină rețeaua Wi-Fi</translation> <translation id="1623723619460186680">Reducerea luminii albastre</translation> -<translation id="1624012933569991823">Setări</translation> <translation id="1624599281783425761">Nu vei mai vedea <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Acest fișier este prea mare pentru a fi gestionat de dispozitiv. Încearcă să-l descarci pe alt dispozitiv</translation> <translation id="1627276047960621195">Descriptorii fișierelor</translation> @@ -981,7 +980,6 @@ <translation id="1897120393475391208">Folosește o parolă puternică</translation> <translation id="1900305421498694955">Aplicațiile din Google Play pot necesita acces deplin la sistemul de fișiere pentru a citi și a scrie fișiere pe dispozitive de stocare externe. Fișierele și dosarele create pe dispozitiv sunt vizibile oricărei persoane care folosește unitatea externă. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Select&ează tot</translation> -<translation id="1901396183631570154">Chrome nu a putut salva parolele în Contul Google. Însă le poți salva pe acest dispozitiv.</translation> <translation id="1903995858055162096">Nu este dispozitivul tău? Folosește <ph name="BEGIN_LINK" />modul pentru invitați<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Adresele URL pe care le accesezi sunt salvate în Contul Google</translation> <translation id="1905375423839394163">Numele dispozitivului Chromebook</translation> @@ -1616,7 +1614,6 @@ <translation id="2476974672882258506">Închide Windows pentru a dezinstala <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Întrucât ai configurat mai multe comutatoare, scanarea automată a fost dezactivată.</translation> <translation id="2478176599153288112">Permisiuni privind fișierele media pentru „<ph name="EXTENSION" />”</translation> -<translation id="248003956660572823">Parolele nu au fost salvate</translation> <translation id="2480868415629598489">Modifică datele pe care le copiezi și le inserezi</translation> <translation id="2482878487686419369">Notificări</translation> <translation id="2482895651873876648">Fila a fost mutată în grupul <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1978,7 +1975,6 @@ <translation id="2813094189969465044">Control parental</translation> <translation id="281390819046738856">Solicitarea nu a putut fi semnată.</translation> <translation id="2814489978934728345">Oprește încărcarea acestei pagini</translation> -<translation id="281504910091592009">Vezi și gestionează parolele salvate în <ph name="BEGIN_LINK" />Contul Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Dosar de marcaje</translation> <translation id="2816319641769218778">Activează sincronizarea ca să salvezi parolele în Contul tău Google.</translation> <translation id="2816628817680324566">Permiți site-ului să identifice cheia de securitate?</translation> @@ -4277,7 +4273,6 @@ <translation id="5078638979202084724">Marchează toate filele</translation> <translation id="5078796286268621944">Cod PIN incorect</translation> <translation id="5079010647467150187">Adaugă un VPN încorporat…</translation> -<translation id="5079950360618752063">Folosește parola sugerată</translation> <translation id="508059534790499809">Actualizează un tichet Kerberos</translation> <translation id="5084328598860513926">Fluxul de provizionare a fost întrerupt. Încearcă din nou sau contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Se caută actualizări</translation> @@ -4402,7 +4397,6 @@ <translation id="5206215183583316675">Ștergi „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Eroare la importul certificatului</translation> <translation id="5206562235913517859">Codul magazinului comerciantului este în format ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Parola compromisă a fost schimbată. Mai ai # parolă compromisă. Chrome recomandă să verifici acum parola.}few{Parola compromisă a fost schimbată. Mai ai # parole compromise. Chrome recomandă să verifici acum parolele.}other{Parola compromisă a fost schimbată. Mai ai # de parole compromise. Chrome recomandă să verifici acum parolele.}}</translation> <translation id="5207949376430453814">Evidențiază cursorul pentru text</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> dorește să verifice dacă folosești un dispozitiv cu sistemul de operare Chrome eligibil.</translation> <translation id="5208548918290612795">Stocarea indicativului de autentificare <ph name="WEB_DRIVE" /></translation> @@ -6233,7 +6227,6 @@ <translation id="6970861306198150268">Salvează parola actuală pentru acest site</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Începe</translation> -<translation id="6972887130317925583">Parola compromisă a fost schimbată. Verifică parolele oricând în <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Au permisiunea de a afișa ferestre pop-up și de a folosi redirecționări</translation> <translation id="6973611239564315524">Este disponibil un upgrade la Debian 10 (Buster)</translation> <translation id="69739764870135975">Dacă Google este și motorul tău de căutare prestabilit, vei vedea sugestii mai bune și mai relevante din punct de vedere contextual</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 0ac29a9..890ae16c 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Настройками доступа управляет ваша организация. Некоторые объекты могут быть скрыты.</translation> <translation id="1622054403950683339">Удалить сеть Wi-Fi</translation> <translation id="1623723619460186680">Уменьшение синего света</translation> -<translation id="1624012933569991823">Настройки</translation> <translation id="1624599281783425761">Корзина "<ph name="MERCHANT" />" больше не будет показываться.</translation> <translation id="1624863973697515675">Файл слишком большой для этого устройства. Попробуйте скачать его на другое устройство.</translation> <translation id="1627276047960621195">Дескрипторы файлов</translation> @@ -982,7 +981,6 @@ <translation id="1897120393475391208">Используйте надежный пароль.</translation> <translation id="1900305421498694955">Приложения из Google Play могут запрашивать разрешение на полный доступ к чтению и записи файлов на внешних запоминающих устройствах. При этом созданные на устройстве файлы и папки будут видны всем пользователям внешнего запоминающего устройства. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Выделить &все</translation> -<translation id="1901396183631570154">Chrome не удалось сохранить эти пароли в вашем аккаунте Google, но вы можете сохранить их на текущем устройстве.</translation> <translation id="1903995858055162096">Это не ваше устройство? Используйте <ph name="BEGIN_LINK" />гостевой режим<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL посещаемых сайтов сохраняются в аккаунте Google.</translation> <translation id="1905375423839394163">Название устройства Chromebook</translation> @@ -1617,7 +1615,6 @@ <translation id="2476974672882258506">Чтобы удалить <ph name="PARALLELS_DESKTOP" />, завершите работу Windows.</translation> <translation id="2477065602824695373">Автосканирование отключено, поскольку настроено несколько переключателей.</translation> <translation id="2478176599153288112"><ph name="EXTENSION" />: доступ к медиафайлам</translation> -<translation id="248003956660572823">Пароли не сохранены</translation> <translation id="2480868415629598489">Изменение копируемых и вставляемых данных</translation> <translation id="2482878487686419369">Уведомления</translation> <translation id="2482895651873876648">Вкладка перемещена в группу "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /></translation> @@ -1979,7 +1976,6 @@ <translation id="2813094189969465044">Родительский контроль</translation> <translation id="281390819046738856">Не удалось подписать запрос.</translation> <translation id="2814489978934728345">Остановить загрузку этой страницы</translation> -<translation id="281504910091592009">Просматривать сохраненные пароли и управлять ими можно на странице <ph name="BEGIN_LINK" />Аккаунт Google<ph name="END_LINK" />.</translation> <translation id="2815693974042551705">Папка с закладками</translation> <translation id="2816319641769218778">Чтобы сохранять пароли в аккаунте Google, включите синхронизацию.</translation> <translation id="2816628817680324566">Разрешить этому сайту определять ваш электронный ключ?</translation> @@ -4278,7 +4274,6 @@ <translation id="5078638979202084724">Добавить все вкладки в закладки</translation> <translation id="5078796286268621944">Неверный PIN-код</translation> <translation id="5079010647467150187">Добавить встроенную VPN</translation> -<translation id="5079950360618752063">Использовать предложенный пароль</translation> <translation id="508059534790499809">Обновить билет Kerberos</translation> <translation id="5084328598860513926">Подготовка к использованию была прервана. Повторите попытку или обратитесь к владельцу или администратору устройства. Код ошибки: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Проверка наличия обновлений</translation> @@ -4403,7 +4398,6 @@ <translation id="5206215183583316675">Удалить "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Ошибка при импорте сертификата</translation> <translation id="5206562235913517859">Идентификатор розничного магазина в формате ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Раскрытый пароль изменен. Остался # раскрытый пароль. Советуем проверить его.}one{Раскрытый пароль изменен. Остался # раскрытый пароль. Советуем проверить их.}few{Раскрытый пароль изменен. Осталось # раскрытых пароля. Советуем проверить их.}many{Раскрытый пароль изменен. Осталось # раскрытых паролей. Советуем проверить их.}other{Раскрытый пароль изменен. Осталось # раскрытого пароля. Советуем проверить их.}}</translation> <translation id="5207949376430453814">Выделять курсор при вводе текста</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> запрашивает информацию об устройстве Chrome OS.</translation> <translation id="5208548918290612795">Сохранение токена аутентификации из сервиса "<ph name="WEB_DRIVE" />"</translation> @@ -6237,7 +6231,6 @@ <translation id="6970861306198150268">Не забудьте сохранить текущий пароль для этого сайта.</translation> <translation id="6972180789171089114">Аудио/видео</translation> <translation id="6972754398087986839">Начать</translation> -<translation id="6972887130317925583">Раскрытый пароль изменен. При необходимости вы можете проверить его в разделе "<ph name="SETTINGS" />".</translation> <translation id="697312151395002334">Разрешить сайтам показывать всплывающие окна или использовать переадресацию</translation> <translation id="6973611239564315524">Доступна версия Debian 10 (Buster).</translation> <translation id="69739764870135975">Если установить Google как поисковую систему по умолчанию, подсказки будут более подходящими по контексту.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 628d5ed3..3dfe267 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">බෙදා ගැනීම සඳහා වූ විකල්ප ඔබගේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ. සමහර අයිතම සඟවා තිබිය හැකිය.</translation> <translation id="1622054403950683339">Wi-Fi ජාලය අමතක කරන්න</translation> <translation id="1623723619460186680">නිල් ආලෝකය අඩු කිරීම</translation> -<translation id="1624012933569991823">සැකසීම්</translation> <translation id="1624599281783425761">ඔබ නැවත <ph name="MERCHANT" /> නොදකිනු ඇත</translation> <translation id="1624863973697515675">මෙම ගොනුව ඔබගේ උපාංගයට කළමනාකරණය කිරීමට විශාල වැඩිය. එය වෙනත් උපාංගයක බාගැනීමට උත්සාහ කරන්න</translation> <translation id="1627276047960621195">ගොනු සූචක</translation> @@ -981,7 +980,6 @@ <translation id="1897120393475391208">ප්රබල මුරපදයක් භාවිත කරන්න</translation> <translation id="1900305421498694955">Google Play වෙතින් ලැබෙන යෙදුම්වලට බාහිර ආචයන උපාංග මත ගොනු කියවීමටත් ලිවීමටත් පූර්ණ ගොනු පද්ධති ප්රවේශය අවශ්ය විය හැක. උපාංගය මත සාදනු ලබන ගොනු සහ ෆෝල්ඩර බාහිර ධාවකය භාවිත කරන ඕනෑම කෙනෙකුට දෘශ්යමාන වෙති. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> <translation id="1901303067676059328">සියල්ල තෝරන්න</translation> -<translation id="1901396183631570154">Chrome හට මෙම මුරපද ඔබේ Google ගිණුමට සුරැකීමට නොහැකි විය. ඔබට තවමත් ඒවා මෙම උපාංගයේ සුරැකිය හැකිය.</translation> <translation id="1903995858055162096">ඔබගේ උපාංගය නොවේද? <ph name="BEGIN_LINK" />ආගන්තුක ප්රකාරය<ph name="END_LINK" /> භාවිත කරන්න.</translation> <translation id="1904580727789512086">ඔබ පිවිසෙන URL ඔබගේ Google ගිණුමට සුරැකේ</translation> <translation id="1905375423839394163">Chromebook උපාංග නාමය</translation> @@ -1619,7 +1617,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> අස්ථාපනය කිරීමට Windows වසන්න.</translation> <translation id="2477065602824695373">ඔබ ස්විච කිහිපයක් පිහිටවූ බැවින්, ස්වයංක්රිය ස්කෑන් කිරීම ක්රියාවිරහිත කර ඇත.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" සඳහා මාධ්යය-ගොනු බලතල</translation> -<translation id="248003956660572823">මුරපද සුරැකී නැත</translation> <translation id="2480868415629598489">ඔබ පිටපත් කරන සහ අලවන දත්ත වෙනස් කරන්න</translation> <translation id="2482878487686419369">දැනුම්දීම්</translation> <translation id="2482895651873876648">ටැබය <ph name="GROUP_NAME" /> සමූහය වෙත ගෙන යන ලදි - <ph name="GROUP_CONTENTS" /></translation> @@ -1981,7 +1978,6 @@ <translation id="2813094189969465044">මාපිය පාලන</translation> <translation id="281390819046738856">ඉල්ලීමට අත්සන් කළ නොහැකි විය.</translation> <translation id="2814489978934728345">මෙම පිටුව ලබාගැනීම නවත්වන්න</translation> -<translation id="281504910091592009">ඔබේ <ph name="BEGIN_LINK" />Google ගිණුම<ph name="END_LINK" /> තුළ සුරකින ලද මුරපද බලන්න සහ කළමනාකරණය කරන්න</translation> <translation id="2815693974042551705">පිටු සලකුණු ෆෝල්ඩරය</translation> <translation id="2816319641769218778">ඔබේ Google ගිණුමට මුරපද සුරැකීමට, සමමුහූර්තය සක්රීය කරන්න.</translation> <translation id="2816628817680324566">මෙම අඩවියට ඔබේ ආරක්ෂක යතුර හඳුනා ගැනීමට ඉඩ දෙන්නද?</translation> @@ -4281,7 +4277,6 @@ <translation id="5078638979202084724">සියලු ටැබ පිටුසලකුණු කරන්න</translation> <translation id="5078796286268621944">වැරදි PIN</translation> <translation id="5079010647467150187">තිළැලි VPN එක් කරන්න...</translation> -<translation id="5079950360618752063">යෝජනා කළ මුරපදය භාවිතා කරන්න</translation> <translation id="508059534790499809">Kerberos ප්රවේශපත්රයක් නැවුම් කරන්න</translation> <translation id="5084328598860513926">ප්රතිපාදන ප්රවාහයට බාධා විය. කරුණාකර නැවත උත්සාහ කරන්න, නැති නම් ඔබේ උපාංග හිමිකරු හෝ පරිපාලක සම්බන්ධ කර ගන්න. දෝෂ කේතය: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">යාවත්කාලීන සඳහා පරීක්ෂා කරමින්</translation> @@ -4406,7 +4401,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" මකන්නද?</translation> <translation id="520621735928254154">සහතිකය ආයාත කිරීමේ දෝෂයකි</translation> <translation id="5206562235913517859">සිල්ලර වෙළෙන්දා-වෙළඳසැල් ID ABC-1234 ආකෘතිය වේ</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{අවදානමට පත් වූ මුරපදය සාර්ථකව වෙනස් කරන ලදි. ඔබට අවදානමට පත් වූ මුරපද තව #ක් ඇත. Chrome දැන් මෙම මුරපදය පරික්ෂා කිරීමට නිර්දේශ කරයි.}one{අවදානමට පත් වූ මුරපදය සාර්ථකව වෙනස් කරන ලදි. ඔබට අවදානමට පත් වූ මුරපද තව #ක් ඇත. Chrome දැන් මෙම මුරපද පරික්ෂා කිරීමට නිර්දේශ කරයි.}other{අවදානමට පත් වූ මුරපදය සාර්ථකව වෙනස් කරන ලදි. ඔබට අවදානමට පත් වූ මුරපද තව #ක් ඇත. Chrome දැන් මෙම මුරපද පරික්ෂා කිරීමට නිර්දේශ කරයි.}}</translation> <translation id="5207949376430453814">පෙළ කාකපාදය උද්දීපනය කරන්න</translation> <translation id="520840839826327499">ඔබ යෝග්ය ChromeOS උපාංගයක් භාවිත කරන්නේදැයි පරීක්ෂා කිරීමට <ph name="SERVICE_NAME" /> හට අවශ්යයි.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> සත්යාපන ටෝකනය ගබඩා කරමින්</translation> @@ -6235,7 +6229,6 @@ <translation id="6970861306198150268">මෙම වෙබ් අඩවිය සඳහා ඔබ ඔබේ වර්තමාන මුරපදය සුරකින බව සහතික කර ගන්න</translation> <translation id="6972180789171089114">ශ්රව්ය/වීඩියෝ</translation> <translation id="6972754398087986839">අරඹන්න</translation> -<translation id="6972887130317925583">අවදානමට පත් වූ මුරපදය සාර්ථකව වෙනස් කරන ලදි. <ph name="SETTINGS" /> තුළ ඕනෑම අවස්ථාවක ඔබගේ මුරපද පරීක්ෂා කරන්න.</translation> <translation id="697312151395002334">උත්පතන එවීමට සහ ප්රතියොමු කිරීම් භාවිත කිරීමට ඉඩ දේ</translation> <translation id="6973611239564315524">Debian 10 (Buster) වෙත උත්ශ්රේණි කිරීමක් ලැබේ</translation> <translation id="69739764870135975">Google ඔබගේ පෙරනිමි සෙවීම් යන්ත්රය ද වන්නේ නම්, ඔබ වඩා හොඳ, සන්දර්භානුකූලව අදාළ යෝජනා දකිනු ඇත</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index f52e643..268c9553 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Možnosti zdieľania spravuje vaša organizácia. Niektoré položky môžu byť skryté.</translation> <translation id="1622054403950683339">Zabudnúť sieť Wi‑Fi</translation> <translation id="1623723619460186680">Zníženie intenzity modrého svetla</translation> -<translation id="1624012933569991823">Nastavenia</translation> <translation id="1624599281783425761">Predajcu <ph name="MERCHANT" /> už neuvidíte</translation> <translation id="1624863973697515675">Tento súbor je na spravovanie vo vašom zariadení príliš veľký. Skúste ho stiahnuť v inom zariadení.</translation> <translation id="1627276047960621195">Deskriptory súborov</translation> @@ -982,7 +981,6 @@ <translation id="1897120393475391208">Použite silné heslo</translation> <translation id="1900305421498694955">Aplikácie na Google Play môžu vyžadovať úplný prístup k systému súborov a povolenie zapisovať súbory v externých úložiskách. Súbory a priečinky vytvorené v zariadení sú viditeľné pre všetkých používateľov príslušného externého disku. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Vybrať &všetko</translation> -<translation id="1901396183631570154">Chromu sa nepodarilo uložiť tieto heslá vo vašom účte Google. Môžete si ich stále uložiť v tomto zariadení.</translation> <translation id="1903995858055162096">Zariadenie nie je vaše? Použite <ph name="BEGIN_LINK" />hosťovský režim<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Webové adresy, ktoré navštívite, sa uložia do vášho účtu Google</translation> <translation id="1905375423839394163">Názov zariadenia Chromebook</translation> @@ -1617,7 +1615,6 @@ <translation id="2476974672882258506">Ak chcete odinštalovať aplikáciu <ph name="PARALLELS_DESKTOP" />, vypnite Windows.</translation> <translation id="2477065602824695373">Nastavili ste viacero prepínačov, takže automatické prehľadávanie bolo vypnuté.</translation> <translation id="2478176599153288112">Povolenia súborov médií pre rozšírenie <ph name="EXTENSION" /></translation> -<translation id="248003956660572823">Heslá neboli uložené</translation> <translation id="2480868415629598489">Upravovať dáta, ktoré kopírujete a prilepujete</translation> <translation id="2482878487686419369">Upozornenia</translation> <translation id="2482895651873876648">Karta bola presunutá do skupiny <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1979,7 +1976,6 @@ <translation id="2813094189969465044">Rodičovská kontrola</translation> <translation id="281390819046738856">Požiadavku sa nepodarilo podpísať.</translation> <translation id="2814489978934728345">Zastaviť otváranie tejto stránky</translation> -<translation id="281504910091592009">Zobrazenie a správa uložených hesiel v <ph name="BEGIN_LINK" />účte Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Priečinok so záložkami</translation> <translation id="2816319641769218778">Ak chcete ukladať heslá do svojho účtu Google, zapnite synchronizáciu.</translation> <translation id="2816628817680324566">Chcete tomuto webu povoliť identifikáciu vášho bezpečnostného kľúča?</translation> @@ -4278,7 +4274,6 @@ <translation id="5078638979202084724">Uložiť všetky karty ako záložky</translation> <translation id="5078796286268621944">Nesprávny kód PIN</translation> <translation id="5079010647467150187">Pridať vstavanú sieť VPN…</translation> -<translation id="5079950360618752063">Použiť navrhované heslo</translation> <translation id="508059534790499809">Obnovenie tiketu Kerberos</translation> <translation id="5084328598860513926">Nastavovanie bolo prerušené. Skúste to znova alebo kontaktujte vlastníka či správcu zariadenia. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Prebieha kontrola aktualizácií</translation> @@ -4403,7 +4398,6 @@ <translation id="5206215183583316675">Odstrániť certifikát <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Chyba importovania certifikátu</translation> <translation id="5206562235913517859">Identifikátor maloobchodného predajcu je vo formáte ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Prelomené heslo ste úspešne zmenili. Máte ešte # ďalšie. Chrome odporúča toto heslo ihneď skontrolovať.}few{Prelomené heslo ste úspešne zmenili. Máte ešte # ďalšie. Chrome odporúča tieto heslá ihneď skontrolovať.}many{Prelomené heslo ste úspešne zmenili. You have # more compromised passwords. Chrome odporúča tieto heslá ihneď skontrolovať.}other{Prelomené heslo ste úspešne zmenili. Máte ešte # ďalších. Chrome odporúča tieto heslá ihneď skontrolovať.}}</translation> <translation id="5207949376430453814">Zvýrazniť textový kurzor</translation> <translation id="520840839826327499">Služba <ph name="SERVICE_NAME" /> chce overiť, či používate vhodné zariadenie so systémom Chrome OS.</translation> <translation id="5208548918290612795">Ukladanie overovacieho tokenu <ph name="WEB_DRIVE" /></translation> @@ -6236,7 +6230,6 @@ <translation id="6970861306198150268">Nezabudnite si aktuálne heslo tohto webu uložiť</translation> <translation id="6972180789171089114">Zvuk / video</translation> <translation id="6972754398087986839">Začať</translation> -<translation id="6972887130317925583">Prelomené heslo ste úspešne zmenili. Heslá si môžete kedykoľvek skontrolovať v sekcii <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Môže odosielať vyskakovacie okná a používať presmerovania</translation> <translation id="6973611239564315524">K dispozícii je inovácia na verziu Debian 10 (Buster)</translation> <translation id="69739764870135975">Ak je Google aj váš predvolený vyhľadávač, budú sa vám zobrazovať lepšie a kontextovo relevantnejšie návrhy</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index c25a4842..74808bd61 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -670,7 +670,6 @@ <translation id="1621984899599015181">Možnosti za deljenje z drugimi upravlja vaša organizacija. Nekateri elementi so morda skriti.</translation> <translation id="1622054403950683339">Pozaba omrežja Wi-Fi</translation> <translation id="1623723619460186680">Zmanjšanje modre svetlobe</translation> -<translation id="1624012933569991823">Nastavitve</translation> <translation id="1624599281783425761">Ponudnik <ph name="MERCHANT" /> ne bo več prikazan.</translation> <translation id="1624863973697515675">Ta datoteka je prevelika, da bi jo lahko naprava upravljala. Poskusite jo prenesti v drugi napravi.</translation> <translation id="1627276047960621195">Deskriptorji datotek</translation> @@ -995,7 +994,6 @@ <translation id="1897120393475391208">Uporabite zapleteno geslo</translation> <translation id="1900305421498694955">Aplikacije v Googlu Play za branje in pisanje datotek v zunanjih napravah za shranjevanje morda zahtevajo popoln dostop do datotečnega sistema. Datoteke in mape, ustvarjene v tej napravi, so vidne vsem, ki uporabljajo zunanji pogon. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Izberi &vse</translation> -<translation id="1901396183631570154">Chromu ni uspelo shraniti teh gesel v računu Google. Še vedno jih lahko shranite v tej napravi.</translation> <translation id="1903995858055162096">Ni vaša naprava? Uporabite <ph name="BEGIN_LINK" />način za goste<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-ji, ki jih obiščete, se shranijo v račun Google.</translation> <translation id="1905375423839394163">Ime Chromebooka</translation> @@ -1633,7 +1631,6 @@ <translation id="2476974672882258506">Zaustavite sistem Windows, če želite odmestiti program <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Ker ste nastavili več stikal, je samodejno iskanje izklopljeno.</translation> <translation id="2478176599153288112">Dovoljenja za predstavnostne datoteke za razširitev »<ph name="EXTENSION" />«</translation> -<translation id="248003956660572823">Gesla niso bila shranjena</translation> <translation id="2480868415629598489">Spreminjanje podatkov, ki jih kopirate in prilepite</translation> <translation id="2482878487686419369">Obvestila</translation> <translation id="2482895651873876648">Zavihek je premaknjen v skupino <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" />.</translation> @@ -1995,7 +1992,6 @@ <translation id="2813094189969465044">Starševski nadzor</translation> <translation id="281390819046738856">Zahteve ni bilo mogoče podpisati.</translation> <translation id="2814489978934728345">Ustavite nalaganje te strani</translation> -<translation id="281504910091592009">Shranjena gesla si lahko ogledate in jih upravljate v <ph name="BEGIN_LINK" />Google Računu<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Mapa z zaznamki</translation> <translation id="2816319641769218778">Če želite shraniti gesla v račun Google, vklopite sinhronizacijo.</translation> <translation id="2816628817680324566">Dovolite, da to spletno mesto prepozna vaš varnostni ključ?</translation> @@ -4295,7 +4291,6 @@ <translation id="5078638979202084724">Dodaj vse zavihke med zaznamke</translation> <translation id="5078796286268621944">Napačen PIN</translation> <translation id="5079010647467150187">Dodaj vgrajeno omrežje VPN …</translation> -<translation id="5079950360618752063">Uporabi predlagano geslo</translation> <translation id="508059534790499809">Osvežitev kartončka za Kerberos</translation> <translation id="5084328598860513926">Potek omogočanja uporabe je bil prekinjen. Poskusite znova ali se obrnite na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Preverjanje, ali so na voljo posodobitve</translation> @@ -4420,7 +4415,6 @@ <translation id="5206215183583316675">Želite izbrisati »<ph name="CERTIFICATE_NAME" />«?</translation> <translation id="520621735928254154">Napaka pri uvozu potrdila</translation> <translation id="5206562235913517859">ID trgovine prodajalca je v obliki ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Ogroženo geslo je bilo uspešno spremenjeno. Imate še # ogroženo geslo. Chrome priporoča, da preverite to geslo.}one{Ogroženo geslo je bilo uspešno spremenjeno. Imate še # ogroženo geslo. Chrome priporoča, da preverite ta gesla.}two{Ogroženo geslo je bilo uspešno spremenjeno. Imate še # ogroženi gesli. Chrome priporoča, da preverite ta gesla.}few{Ogroženo geslo je bilo uspešno spremenjeno. Imate še # ogrožena gesla. Chrome priporoča, da preverite ta gesla.}other{Ogroženo geslo je bilo uspešno spremenjeno. Imate še # ogroženih gesel. Chrome priporoča, da preverite ta gesla.}}</translation> <translation id="5207949376430453814">Označitev kazalke v besedilu</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> želi preveriti, ali uporabljate primerno napravo s sistemom Chrome OS.</translation> <translation id="5208548918290612795">Shranjevanje žetona za preverjanje za <ph name="WEB_DRIVE" /></translation> @@ -6257,7 +6251,6 @@ <translation id="6970861306198150268">Poskrbite, da boste shranili trenutno geslo za to spletno mesto.</translation> <translation id="6972180789171089114">Zvok/video</translation> <translation id="6972754398087986839">Začnite</translation> -<translation id="6972887130317925583">Ogroženo geslo je bilo uspešno spremenjeno. Svoja gesla lahko kadar koli preverite v aplikaciji <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Dovoljeno je pošiljanje pojavnih oken in uporaba preusmeritev</translation> <translation id="6973611239564315524">Na voljo je nadgradnja na Debian 10 (Buster)</translation> <translation id="69739764870135975">Če je Google tudi vaš privzeti iskalnik, vam bomo prikazovali boljše predloge, ki so primernejši kontekstu.</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index c7a018e..d3b7705 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -661,7 +661,6 @@ <translation id="1621984899599015181">Opsionet për shpërndarjen menaxhohen nga organizata jote. Disa artikuj mund të jenë të fshehur.</translation> <translation id="1622054403950683339">Harroje rrjetin Wi-Fi</translation> <translation id="1623723619460186680">Reduktimi i dritës blu</translation> -<translation id="1624012933569991823">Cilësimet</translation> <translation id="1624599281783425761">Nuk do ta shohësh më <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Ky skedar është shumë i madh për t'u menaxhuar nga pajisja jote. Provo ta shkarkosh atë në një pajisje tjetër</translation> <translation id="1627276047960621195">Përshkruesit e skedarëve</translation> @@ -977,7 +976,6 @@ <translation id="1897120393475391208">Përdor një fjalëkalim i fortë</translation> <translation id="1900305421498694955">Aplikacionet nga Google Play mund të kërkojnë qasje të plotë të sistemit të skedarëve për të lexuar dhe për të shkruar te skedarët në pajisjet e jashtme të hapësirës ruajtëse. Skedarët dhe dosjet e krijuara në pajisje janë të dukshme për këdo që përdor diskun e jashtëm. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Zgjidhi &të gjitha</translation> -<translation id="1901396183631570154">Chrome nuk mund t'i ruante këto fjalëkalime në "Llogarinë tënde të Google". Mund t'i ruash ato ende në këtë pajisje.</translation> <translation id="1903995858055162096">Nuk është pajisja jote? Përdor <ph name="BEGIN_LINK" />Modalitetin "vizitor"<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-të që viziton ruhen në "Llogarinë tënde të Google"</translation> <translation id="1905375423839394163">Emri i pajisjes Chromebook</translation> @@ -1613,7 +1611,6 @@ <translation id="2476974672882258506">Fike sistemin Windows për ta çinstaluar <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Duke qenë se ke konfiguruar shumë çelësa, skanimi automatik është çaktivizuar.</translation> <translation id="2478176599153288112">Lejet e skedarëve të medias për "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Fjalëkalimet nuk u ruajtën</translation> <translation id="2480868415629598489">Modifiko të dhënat që kopjon dhe ngjit</translation> <translation id="2482878487686419369">Njoftimet</translation> <translation id="2482895651873876648">Tasti u zhvendos në grupin <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1975,7 +1972,6 @@ <translation id="2813094189969465044">Kontrollet prindërore</translation> <translation id="281390819046738856">Kërkesa nuk mund të nënshkruhej.</translation> <translation id="2814489978934728345">Ndalo ngarkimin e kësaj faqeje</translation> -<translation id="281504910091592009">Shfaq dhe menaxho fjalëkalimet e ruajtura në <ph name="BEGIN_LINK" />llogarinë tënde të Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Dosja e faqeshënuesve</translation> <translation id="2816319641769218778">Për të ruajtur fjalëkalimet në "Llogarinë tënde të Google", aktivizo sinkronizimin.</translation> <translation id="2816628817680324566">Dëshiron që ky sajt të identifikojë çelësin tënd të sigurisë?</translation> @@ -4274,7 +4270,6 @@ <translation id="5078638979202084724">Regjistroji të gjitha skedat në faqeshënues</translation> <translation id="5078796286268621944">Kod i pasaktë PIN</translation> <translation id="5079010647467150187">Shto VPN-në e integruar...</translation> -<translation id="5079950360618752063">Përdor fjalëkalimin e sugjeruar</translation> <translation id="508059534790499809">Rifresko një biletë Kerberos</translation> <translation id="5084328598860513926">Fluksi i përgatitjes u ndërpre. Provo përsëri ose kontakto me zotëruesin e pajisjes ose administratorin. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Po kontrollon për përditësime</translation> @@ -4399,7 +4394,6 @@ <translation id="5206215183583316675">Të fshihet "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Gabim në importimin e certifikatës</translation> <translation id="5206562235913517859">ID-ja e dyqanit të shitjes me pakicë është në formatin ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Fjalëkalimi i komprometuar u ndryshua me sukses. Ke edhe # fjalëkalim tjetër të komprometuar. Chrome rekomandon që ta kontrollosh këtë fjalëkalim tani.}other{Fjalëkalimi i komprometuar u ndryshua me sukses. Ke edhe # fjalëkalime të tjera të komprometuara. Chrome rekomandon që t'i kontrollosh këto fjalëkalime tani.}}</translation> <translation id="5207949376430453814">Thekso kursorin e tekstit</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> dëshiron të kontrollojë nëse po përdor një pajisje të përshtatshme me ChromeOS.</translation> <translation id="5208548918290612795">Ruajtja e kodit të vërtetimit të <ph name="WEB_DRIVE" /></translation> @@ -6227,7 +6221,6 @@ <translation id="6970861306198150268">Sigurohu që po ruan fjalëkalimin aktual për këtë sajt</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Fillo</translation> -<translation id="6972887130317925583">Fjalëkalimi i komprometuar u ndryshua me sukses. Kontrolloji fjalëkalimet e tua në çdo kohë te <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Lejohen të dërgojnë dritare kërcyese dhe të përdorin ridrejtimet</translation> <translation id="6973611239564315524">Ofrohet një përmirësim në Debian 10 (Buster)</translation> <translation id="69739764870135975">Nëse Google është gjithashtu motori yt i parazgjedhur i kërkimit, do të shohësh sugjerime më të mira dhe të përshtatshme me kontekstin</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 84df21d..54a9578 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -663,7 +663,6 @@ <translation id="1621984899599015181">Opcijama za deljenje upravlja organizacija. Neke stavke će možda biti skrivene.</translation> <translation id="1622054403950683339">Zaboravi WiFi mrežu</translation> <translation id="1623723619460186680">Smanjivanje plavog svetla</translation> -<translation id="1624012933569991823">Podešavanja</translation> <translation id="1624599281783425761">Neće vam se više prikazivati korpa prodavca <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Ovaj fajl je prevelik da bi uređaj upravljao njim. Probajte da ga preuzmete na drugom uređaju</translation> <translation id="1627276047960621195">Deskriptori datoteka</translation> @@ -979,7 +978,6 @@ <translation id="1897120393475391208">Koristite jaku lozinku</translation> <translation id="1900305421498694955">Aplikacijama sa Google Play-a će možda trebati potpuni pristup sistemu datoteka da bi čitale i upisivale datoteke na spoljnim memorijskim uređajima. Datoteke i direktorijumi napravljeni na uređaju su vidljivi svima koji koriste spoljni disk. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Izaberi &sve</translation> -<translation id="1901396183631570154">Chrome nije uspeo da sačuva lozinke na Google nalogu. Još uvek možete da ih sačuvate na ovom uređaju.</translation> <translation id="1903995858055162096">Ovo nije vaš uređaj? Koristite <ph name="BEGIN_LINK" />režim gosta<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-ovi koje posećujete se čuvaju na Google nalogu</translation> <translation id="1905375423839394163">Naziv Chromebook uređaja</translation> @@ -1614,7 +1612,6 @@ <translation id="2476974672882258506">Isključite Windows da biste deinstalirali <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Pošto ste podesili više prekidača, automatsko skeniranje je isključeno.</translation> <translation id="2478176599153288112">Dozvole za medijske datoteke za „<ph name="EXTENSION" />“</translation> -<translation id="248003956660572823">Lozinke nisu sačuvane</translation> <translation id="2480868415629598489">Menjanje podataka koje prekopirate</translation> <translation id="2482878487686419369">Obaveštenja</translation> <translation id="2482895651873876648">Kartica je premeštena u grupu <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1976,7 +1973,6 @@ <translation id="2813094189969465044">Roditeljski nadzor</translation> <translation id="281390819046738856">Potpisivanje zahteva nije uspelo.</translation> <translation id="2814489978934728345">Prekinite učitavanje ove stranice</translation> -<translation id="281504910091592009">Pregledajte sačuvane lozinke i upravljajte njima na <ph name="BEGIN_LINK" />Google nalogu<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Folder za obeleživače</translation> <translation id="2816319641769218778">Da biste sačuvali lozinke na Google nalogu, uključite sinhronizaciju.</translation> <translation id="2816628817680324566">Želite da dozvolite ovom sajtu da identifikuje bezbednosni ključ?</translation> @@ -4275,7 +4271,6 @@ <translation id="5078638979202084724">Obeležavanje svih kartica</translation> <translation id="5078796286268621944">Netačan PIN</translation> <translation id="5079010647467150187">Dodaj ugrađeni VPN…</translation> -<translation id="5079950360618752063">Koristite predloženu lozinku</translation> <translation id="508059534790499809">Osveži Kerberos tiket</translation> <translation id="5084328598860513926">Tok dodele je prekinut. Probajte ponovo ili se obratite vlasniku uređaja ili administratoru. Kôd greške: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Traženje ažuriranja</translation> @@ -4400,7 +4395,6 @@ <translation id="5206215183583316675">Želite li da izbrišete „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Greška pri uvozu sertifikata</translation> <translation id="5206562235913517859">ID prodavca-prodavnice je u formatu ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Promenili ste ugroženu lozinku. Imate još # ugroženu lozinku. Chrome vam preporučuje da odmah proverite ovu lozinku.}one{Promenili ste ugroženu lozinku. Imate još # ugroženu lozinku. Chrome vam preporučuje da odmah proverite ove lozinke.}few{Promenili ste ugroženu lozinku. Imate još # ugrožene lozinke. Chrome vam preporučuje da odmah proverite ove lozinke.}other{Promenili ste ugroženu lozinku. Imate još # ugroženih lozinki. Chrome vam preporučuje da odmah proverite ove lozinke.}}</translation> <translation id="5207949376430453814">Istakni kursor za tekst</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> želi da proveri da li koristite Chrome OS uređaj koji ispunjava uslove.</translation> <translation id="5208548918290612795">Čuvanje <ph name="WEB_DRIVE" /> tokena za potvrdu identiteta</translation> @@ -6233,7 +6227,6 @@ <translation id="6970861306198150268">Uverite se da čuvate aktuelnu lozinku za ovaj sajt</translation> <translation id="6972180789171089114">Audio/video</translation> <translation id="6972754398087986839">Započnimo</translation> -<translation id="6972887130317925583">Promenili ste ugroženu lozinku. Proverite lozinke u bilo kom trenutku u odeljku <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Dozvoljeno im je da šalju iskačuće prozore i da koriste preusmeravanja</translation> <translation id="6973611239564315524">Dostupna je nadogradnja na Debian 10 (Buster)</translation> <translation id="69739764870135975">Ako vam je Google i podrazumevani pretraživač, videćete bolje, kontekstualno relevantne predloge</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index f98ba907..6f2b0011 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -663,7 +663,6 @@ <translation id="1621984899599015181">Опцијама за дељење управља организација. Неке ставке ће можда бити скривене.</translation> <translation id="1622054403950683339">Заборави WiFi мрежу</translation> <translation id="1623723619460186680">Смањивање плавог светла</translation> -<translation id="1624012933569991823">Подешавања</translation> <translation id="1624599281783425761">Неће вам се више приказивати корпа продавца <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Овај фајл је превелик да би уређај управљао њим. Пробајте да га преузмете на другом уређају</translation> <translation id="1627276047960621195">Дескриптори датотека</translation> @@ -979,7 +978,6 @@ <translation id="1897120393475391208">Користите јаку лозинку</translation> <translation id="1900305421498694955">Апликацијама са Google Play-а ће можда требати потпуни приступ систему датотека да би читале и уписивале датотеке на спољним меморијским уређајима. Датотеке и директоријуми направљени на уређају су видљиви свима који користе спољни диск. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Изабери &све</translation> -<translation id="1901396183631570154">Chrome није успео да сачува лозинке на Google налогу. Још увек можете да их сачувате на овом уређају.</translation> <translation id="1903995858055162096">Ово није ваш уређај? Користите <ph name="BEGIN_LINK" />режим госта<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-ови које посећујете се чувају на Google налогу</translation> <translation id="1905375423839394163">Назив Chromebook уређаја</translation> @@ -1614,7 +1612,6 @@ <translation id="2476974672882258506">Искључите Windows да бисте деинсталирали <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Пошто сте подесили више прекидача, аутоматско скенирање је искључено.</translation> <translation id="2478176599153288112">Дозволе за медијске датотеке за „<ph name="EXTENSION" />“</translation> -<translation id="248003956660572823">Лозинке нису сачуване</translation> <translation id="2480868415629598489">Мењање података које прекопирате</translation> <translation id="2482878487686419369">Обавештења</translation> <translation id="2482895651873876648">Картица је премештена у групу <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1976,7 +1973,6 @@ <translation id="2813094189969465044">Родитељски надзор</translation> <translation id="281390819046738856">Потписивање захтева није успело.</translation> <translation id="2814489978934728345">Прекините учитавање ове странице</translation> -<translation id="281504910091592009">Прегледајте сачуване лозинке и управљајте њима на <ph name="BEGIN_LINK" />Google налогу<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Фолдер за обележиваче</translation> <translation id="2816319641769218778">Да бисте сачували лозинке на Google налогу, укључите синхронизацију.</translation> <translation id="2816628817680324566">Желите да дозволите овом сајту да идентификује безбедносни кључ?</translation> @@ -4275,7 +4271,6 @@ <translation id="5078638979202084724">Обележавање свих картица</translation> <translation id="5078796286268621944">Нетачан PIN</translation> <translation id="5079010647467150187">Додај уграђени VPN…</translation> -<translation id="5079950360618752063">Користите предложену лозинку</translation> <translation id="508059534790499809">Освежи Kerberos тикет</translation> <translation id="5084328598860513926">Ток доделе је прекинут. Пробајте поново или се обратите власнику уређаја или администратору. Кôд грешке: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Тражење ажурирања</translation> @@ -4400,7 +4395,6 @@ <translation id="5206215183583316675">Желите ли да избришете „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Грешка при увозу сертификата</translation> <translation id="5206562235913517859">ИД продавца-продавнице је у формату ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Променили сте угрожену лозинку. Имате још # угрожену лозинку. Chrome вам препоручује да одмах проверите ову лозинку.}one{Променили сте угрожену лозинку. Имате још # угрожену лозинку. Chrome вам препоручује да одмах проверите ове лозинке.}few{Променили сте угрожену лозинку. Имате још # угрожене лозинке. Chrome вам препоручује да одмах проверите ове лозинке.}other{Променили сте угрожену лозинку. Имате још # угрожених лозинки. Chrome вам препоручује да одмах проверите ове лозинке.}}</translation> <translation id="5207949376430453814">Истакни курсор за текст</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> жели да провери да ли користите Chrome ОС уређај који испуњава услове.</translation> <translation id="5208548918290612795">Чување <ph name="WEB_DRIVE" /> токена за потврду идентитета</translation> @@ -6233,7 +6227,6 @@ <translation id="6970861306198150268">Уверите се да чувате актуелну лозинку за овај сајт</translation> <translation id="6972180789171089114">Аудио/видео</translation> <translation id="6972754398087986839">Започнимо</translation> -<translation id="6972887130317925583">Променили сте угрожену лозинку. Проверите лозинке у било ком тренутку у одељку <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Дозвољено им је да шаљу искачуће прозоре и да користе преусмеравања</translation> <translation id="6973611239564315524">Доступна је надоградња на Debian 10 (Buster)</translation> <translation id="69739764870135975">Ако вам је Google и подразумевани претраживач, видећете боље, контекстуално релевантне предлоге</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 7057bac..5a4dc015 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Delningsalternativ hanteras av organisationen. Vissa objekt kan vara dolda.</translation> <translation id="1622054403950683339">Glöm det här wifi-nätverket</translation> <translation id="1623723619460186680">Reducering av blått ljust</translation> -<translation id="1624012933569991823">Inställningar</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> visas inte igen</translation> <translation id="1624863973697515675">Den här filen är för stor för enheten att hantera. Försök att ladda ned den på en annan enhet</translation> <translation id="1627276047960621195">Filbeskrivningar</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">Använd ett starkt lösenord</translation> <translation id="1900305421498694955">Appar från Google Play kan behöva fullständig åtkomst till filsystemet för att kunna läsa och skriva filer på externa lagringsenheter. Alla som använder den externa enheten kan se filer och mappar som skapats på den. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Välj &alla</translation> -<translation id="1901396183631570154">Chrome kunde inte spara lösenorden i Google-kontot. Du kan fortfarande spara dem på den här enheten.</translation> <translation id="1903995858055162096">Är det inte din enhet? Använd <ph name="BEGIN_LINK" />gästläget<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Webbadresserna du besöker sparas i Google-kontot</translation> <translation id="1905375423839394163">Chromebook-enhetens namn</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506">Avsluta Windows för att avinstallera <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Eftersom du har konfigurerat flera brytare har automatisk genomsökning inaktiverats.</translation> <translation id="2478176599153288112">Mediefilsbehörigheter för <ph name="EXTENSION" /></translation> -<translation id="248003956660572823">Lösenorden har inte sparats</translation> <translation id="2480868415629598489">Ändra data som du kopierar och klistrar in</translation> <translation id="2482878487686419369">Aviseringar</translation> <translation id="2482895651873876648">Fliken flyttades till gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">Föräldrakontroller</translation> <translation id="281390819046738856">Begäran kunde inte signeras.</translation> <translation id="2814489978934728345">Sluta ladda den här sidan</translation> -<translation id="281504910091592009">Visa och hantera sparade lösenord i <ph name="BEGIN_LINK" />Google-kontot<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Bokmärkesmapp</translation> <translation id="2816319641769218778">Aktivera synkronisering om du vill spara lösenord i Google-kontot.</translation> <translation id="2816628817680324566">Vill du tillåta webbplatsen att identifiera din säkerhetsnyckel?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">Skapa bokmärken för alla flikar</translation> <translation id="5078796286268621944">Fel pinkod</translation> <translation id="5079010647467150187">Lägg till inbyggt VPN …</translation> -<translation id="5079950360618752063">Använd det föreslagna lösenordet</translation> <translation id="508059534790499809">Uppdatera en Kerberos-biljett</translation> <translation id="5084328598860513926">Administrationsflödet avbröts. Försök igen eller kontakta enhetens ägare eller administratör. Felkod: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Söker efter uppdateringar</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">Vill du radera <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Fel vid import av certifikat</translation> <translation id="5206562235913517859">Id:n för återförsäljarbutiker har formatet ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Det utsatta lösenordet har ändrats. Det finns # utsatt lösenord till. Du rekommenderas att kontrollera detta lösenord nu.}other{Det utsatta lösenordet har ändrats. Det finns # utsatta lösenord till. Du rekommenderas att kontrollera dessa lösenord nu.}}</translation> <translation id="5207949376430453814">Markera textmarkören</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> vill kontrollera om du använder en Chrome OS-enhet som uppfyller villkoren.</translation> <translation id="5208548918290612795">Autentiseringstoken sparas för <ph name="WEB_DRIVE" /></translation> @@ -6245,7 +6239,6 @@ <translation id="6970861306198150268">Se till att spara ditt nuvarande lösenord för den här webbplatsen</translation> <translation id="6972180789171089114">Ljud/video</translation> <translation id="6972754398087986839">Komma igång</translation> -<translation id="6972887130317925583">Det utsatta lösenordet har ändrats. Du kan kontrollera dina lösenord när du vill i <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Får öppna popup-fönster och använda omdirigering</translation> <translation id="6973611239564315524">En uppgradering till Debian 10 (Buster) är tillgänglig</translation> <translation id="69739764870135975">Om du även använder Google som standardsökmotor får du bättre förslag som är relevanta i sammanhanget</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 206c224e..bddce0d 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Chaguo za kushiriki zinadhibitiwa na shirika lako. Huenda baadhi ya vipengee vimefichwa.</translation> <translation id="1622054403950683339">Sahau mtandao wa Wi-Fi</translation> <translation id="1623723619460186680">Upunguzaji wa mwanga wa buluu</translation> -<translation id="1624012933569991823">Mipangilio</translation> <translation id="1624599281783425761">Hutaona <ph name="MERCHANT" /> tena</translation> <translation id="1624863973697515675">Faili hii ni kubwa mno kudhibitiwa na kifaa chako. Jaribu kuipakua kwa kutumia kifaa kingine</translation> <translation id="1627276047960621195">Vifafanuzi Faili</translation> @@ -988,7 +987,6 @@ <translation id="1897120393475391208">Tumia nenosiri thabiti</translation> <translation id="1900305421498694955">Huenda programu kwenye Google Play zikahitaji ufikiaji kamili wa mfumo wa faili ili kusoma na kuandika faili kwenye vifaa vya hifadhi ya nje. Faili na folda mpya zinazoongezwa kwenye kifaa huonekana kwa mtu yeyote anayetumia hifadhi ya nje. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Chagua &yote</translation> -<translation id="1901396183631570154">Chrome imeshindwa kuhifadhi manenosiri haya kwenye Akaunti yako ya Google. Bado unaweza kuyahifadhi kwenye kifaa hiki.</translation> <translation id="1903995858055162096">Je, hiki si kifaa chako? Tumia <ph name="BEGIN_LINK" />hali ya Wageni<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL unazotembelea huhifadhiwa kwenye Akaunti yako ya Google</translation> <translation id="1905375423839394163">Jina la kifaa cha Chromebook</translation> @@ -1627,7 +1625,6 @@ <translation id="2476974672882258506">Zima Windows ili uondoe <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Kwa vile umeweka mipangilio ya swichi nyingi, kipengele cha kuchanganua kiotomatiki kimezimwa.</translation> <translation id="2478176599153288112">Ruhusa za Faili ya Maudhui kwa "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Manenosiri hayajahifadhiwa</translation> <translation id="2480868415629598489">Badilisha data unayonakili na kubandika</translation> <translation id="2482878487686419369">Arifa</translation> <translation id="2482895651873876648">Kichupo kimewekwa kwenye kikundi kiitwacho <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1989,7 +1986,6 @@ <translation id="2813094189969465044">Vidhibiti vya wazazi</translation> <translation id="281390819046738856">Imeshindwa kutia sahihi ombi.</translation> <translation id="2814489978934728345">Simamisha upakiaji wa ukurasa huu</translation> -<translation id="281504910091592009">Angalia na udhibiti manenosiri yaliyohifadhiwa kwenye <ph name="BEGIN_LINK" />Akaunti yako ya Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Folda ya alamisho</translation> <translation id="2816319641769218778">Ili uhifadhi manenosiri kwenye Akaunti ya Google, washa usawazishaji.</translation> <translation id="2816628817680324566">Ungependa kuruhusu tovuti hii itambue ufunguo wako wa usalama?</translation> @@ -4287,7 +4283,6 @@ <translation id="5078638979202084724">Alamisha vichupo vyote</translation> <translation id="5078796286268621944">PIN isiyo sahihi</translation> <translation id="5079010647467150187">Ongeza VPN iliyojumuishwa ndani...</translation> -<translation id="5079950360618752063">Tumia nenosiri linalopendekezwa</translation> <translation id="508059534790499809">Onyesha upya tiketi ya Kerberos</translation> <translation id="5084328598860513926">Utaratibu wa kuweka mipangilio umekatizwa. Tafadhali jaribu tena au uwasiliane na mmiliki au msimamizi wa kifaa chako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Inatafuta visasishi</translation> @@ -4412,7 +4407,6 @@ <translation id="5206215183583316675">Ungependa kufuta "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Hitilafu ya Kuleta Cheti</translation> <translation id="5206562235913517859">Kitambulisho cha duka la muuzaji wa rejareja kina muundo wa ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Imebadilisha nenosiri lililoathiriwa. Una nenosiri # zaidi lililoathiriwa. Chrome inapendekeza ukague nenosiri hili sasa.}other{Imebadilisha nenosiri lililoathiriwa. Una manenosiri # zaidi yaliyoathiriwa. Chrome inapendekeza ukague manenosiri haya sasa.}}</translation> <translation id="5207949376430453814">Angazia kareti ya maandishi</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> inataka kuthibitisha kama unatumia kifaa kinachostahiki cha Mfumo wa Uendeshaji wa Chrome.</translation> <translation id="5208548918290612795">Kuhifadhi Tokeni ya Uthibitishaji ya <ph name="WEB_DRIVE" /></translation> @@ -6240,7 +6234,6 @@ <translation id="6970861306198150268">Hakikisha kwamba unahifadhi nenosiri la sasa unalotumia kwenye tovuti hii</translation> <translation id="6972180789171089114">Sauti/Video</translation> <translation id="6972754398087986839">Anza</translation> -<translation id="6972887130317925583">Umebadilisha nenosiri lililoathiriwa. Kagua manenosiri yako wakati wowote katika <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Zinazoruhusiwa kutuma madirisha ibukizi na kukuelekeza kwingine</translation> <translation id="6973611239564315524">Sasisho la Debian 10 (Buster) linapatikana</translation> <translation id="69739764870135975">Ikiwa Google pia ni mtambo wako chaguomsingi wa kutafuta, utaona mapendekezo bora, yanayofaa kulingana na muktadha</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index d82ed15..d871cc5 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">பகிர்வதற்கான விருப்பங்களை உங்கள் நிறுவனம் நிர்வகிக்கிறது. சில விருப்பங்கள் மறைக்கப்பட்டிருக்கலாம்.</translation> <translation id="1622054403950683339">வைஃபை நெட்வொர்க்கை மறந்துவிடு</translation> <translation id="1623723619460186680">நீலநிற வெளிச்சத்தைக் குறைத்தல்</translation> -<translation id="1624012933569991823">அமைப்புகள்</translation> <translation id="1624599281783425761">இனி <ph name="MERCHANT" /> குறித்த எந்தத் தகவலும் காட்டப்படாது</translation> <translation id="1624863973697515675">உங்கள் சாதனத்தால் நிர்வகிக்க முடியாத அளவிற்கு இந்த ஃபைல் மிகவும் பெரிதாக உள்ளது. வேறொரு சாதனத்தில் பதிவிறக்க முயலவும்</translation> <translation id="1627276047960621195">ஃபைல் விளக்கிகள்</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">வலிமையான கடவுச்சொல்லைப் பயன்படுத்துங்கள்</translation> <translation id="1900305421498694955">Google Playயிலிருந்து பதிவிறக்கப்படும் ஆப்ஸுக்கு வெளிப்புறச் சேமிப்பக சாதனங்களில் உள்ள ஃபைல்களைப் படிப்பதற்கும் திருத்துவதற்கும் ஃபைல் சிஸ்டத்திற்கான முழு அணுகல் தேவைப்படக்கூடும். வெளிப்புற இயக்ககத்தைப் பயன்படுத்தும் அனைவராலும் சாதனத்தில் உருவாக்கப்பட்ட ஃபைல்களையும் ஃபோல்டர்களையும் பார்க்க முடியும். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="1901303067676059328">அ&னைத்தையும் தேர்ந்தெடு</translation> -<translation id="1901396183631570154">இந்தக் கடவுச்சொற்களை Chromeமால் உங்கள் Google கணக்கில் சேமிக்க முடியவில்லை. இருப்பினும் அவற்றை இந்தச் சாதனத்தில் சேமிக்கலாம்.</translation> <translation id="1903995858055162096">உங்கள் சாதனம் இல்லையா? <ph name="BEGIN_LINK" />கெஸ்ட் பயன்முறையைப்<ph name="END_LINK" /> பயன்படுத்துங்கள்.</translation> <translation id="1904580727789512086">நீங்கள் பார்வையிடும் URLகள் உங்கள் Google கணக்கில் சேமிக்கப்படும்</translation> <translation id="1905375423839394163">Chromebookகின் சாதனப் பெயர்</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ஐ நிறுவல் நீக்க, Windowsஸை ஷட் டவுன் செய்யவும்.</translation> <translation id="2477065602824695373">ஒன்றுக்கும் மேற்பட்ட ஸ்விட்ச்சுகளை நீங்கள் ஒதுக்கியுள்ளதால் தானியங்கு ஸ்கேன் முடக்கப்பட்டது.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" க்கான மீடியா-ஃபைல் அனுமதிகள்</translation> -<translation id="248003956660572823">கடவுச்சொற்கள் சேமிக்கப்படவில்லை</translation> <translation id="2480868415629598489">நீங்கள் நகலெடுத்து ஒட்டும் தரவைத் திருத்தலாம்</translation> <translation id="2482878487686419369">அறிவிப்புகள்</translation> <translation id="2482895651873876648">தாவல் <ph name="GROUP_NAME" /> குழுவிற்கு நகர்த்தப்பட்டது - <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">பெற்றோர் கட்டுப்பாடுகள்</translation> <translation id="281390819046738856">கோரிக்கையில் கையொப்பமிட முடியவில்லை.</translation> <translation id="2814489978934728345">இந்த பக்கத்தை நினைவேற்றுவதை நிறுத்து</translation> -<translation id="281504910091592009">உங்கள் <ph name="BEGIN_LINK" />Google கணக்கில்<ph name="END_LINK" /> சேமிக்கப்பட்ட கடவுச்சொற்களைப் பார்த்து, நிர்வகிக்கவும்</translation> <translation id="2815693974042551705">புத்தகக்குறி ஃபோல்டர்</translation> <translation id="2816319641769218778">உங்கள் Google கணக்கில் கடவுச்சொற்களைச் சேமிக்க ஒத்திசைவை இயக்கவும்.</translation> <translation id="2816628817680324566">உங்கள் பாதுகாப்பு விசையை அறிந்துகொள்ள இந்தத் தளத்தை அனுமதிக்கவா?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">அனைத்து தாவல்களையும் புக்மார்க்கிடுக</translation> <translation id="5078796286268621944">தவறான PIN</translation> <translation id="5079010647467150187">உள்ளமைந்த VPNனைச் சேர்...</translation> -<translation id="5079950360618752063">பரிந்துரைக்கப்படும் கடவுச்சொல்லைப் பயன்படுத்து</translation> <translation id="508059534790499809">Kerberos டிக்கெட்டை ரெஃப்ரெஷ் செய்தல்</translation> <translation id="5084328598860513926">அமைப்பதில் தடங்கல் ஏற்பட்டது. மீண்டும் முயலவும் அல்லது உங்கள் சாதன உரிமையாளரையோ நிர்வாகியையோ தொடர்புகொள்ளவும். பிழைக் குறியீடு: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">புதுப்பிப்புகளைத் தேடுகிறது</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ஐ நீக்கவா?</translation> <translation id="520621735928254154">சான்றிதழ் இறக்குமதியாவதில் பிழை</translation> <translation id="5206562235913517859">சில்லறை விற்பனையாளர் கடை ஐடி ABC-1234 வடிவத்தில் இருக்க வேண்டும்</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{களவாடப்பட்ட கடவுச்சொல் மாற்றப்பட்டது. இன்னும் # களவாடப்பட்ட கடவுச்சொல் உள்ளது. இப்போதே இந்தக் கடவுச்சொச்லைச் சரிபார்க்கும்படி Chrome பரிந்துரைக்கிறது.}other{களவாடப்பட்ட கடவுச்சொல் மாற்றப்பட்டது. இன்னும் # களவாடப்பட்ட கடவுச்சொற்கள் உள்ளன. இப்போதே இந்தக் கடவுச்சொற்களைச் சரிபார்க்கும்படி Chrome பரிந்துரைக்கிறது.}}</translation> <translation id="5207949376430453814">உரைச் சுட்டியைத் தனிப்படுத்து</translation> <translation id="520840839826327499">தகுதியான ChromeOS சாதனத்தைப் பயன்படுத்துகிறீர்களா என்பதை <ph name="SERVICE_NAME" /> சரிபார்க்க விரும்புகிறது.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> அங்கீகரிப்பு டோக்கனைச் சேமித்தல்</translation> @@ -6246,7 +6240,6 @@ <translation id="6970861306198150268">இந்தத் தளத்திற்கான புதிய கடவுச்சொல்லை மறக்காமல் சேமிக்கவும்</translation> <translation id="6972180789171089114">ஆடியோ/வீடியோ</translation> <translation id="6972754398087986839">தொடங்குக</translation> -<translation id="6972887130317925583">களவாடப்பட்ட கடவுச்சொல் மாற்றப்பட்டது. உங்கள் கடவுச்சொற்களை எப்போது வேண்டுமானாலும் <ph name="SETTINGS" /> இல் சரிபார்க்கலாம்.</translation> <translation id="697312151395002334">பாப்-அப்களை அனுப்புவதற்கும் திசைதிருப்புதல்களைப் பயன்படுத்துவதற்கும் அனுமதிக்கப்பட்டுள்ள தளங்கள்</translation> <translation id="6973611239564315524">Debian 10 (Buster) தொடர்பான புதுப்பிப்பு உள்ளது</translation> <translation id="69739764870135975">உங்களின் இயல்புத் தேடல் இன்ஜினாகவும் Google இருந்தால் சூழலுக்குத் தொடர்புடைய சிறப்பான பரிந்துரைகள் காட்டப்படும்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 6ae645a..54b6b36 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">షేరింగ్కు సంబంధించిన ఆప్షన్లను మీ సంస్థ మేనేజ్ చేస్తుంది. కొన్ని ఐటెమ్లు దాచబడి ఉండవచ్చు.</translation> <translation id="1622054403950683339">Wi-Fi నెట్వర్క్ను విస్మరించు</translation> <translation id="1623723619460186680">నీలి రంగును తగ్గించడం</translation> -<translation id="1624012933569991823">సెట్టింగ్లు</translation> <translation id="1624599281783425761">మీరు <ph name="MERCHANT" />ను మళ్లీ చూడరు</translation> <translation id="1624863973697515675">ఈ ఫైల్ మీ పరికరం మేనేజ్ చేయలేనంత పెద్దగా ఉంది. దీనిని మరొక పరికరంలో డౌన్లోడ్ చేయడానికి ట్రై చేయండి</translation> <translation id="1627276047960621195">ఫైల్ వివరణలు</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">శక్తివంతమైన పాస్వర్డ్ను ఉపయోగించండి</translation> <translation id="1900305421498694955">బాహ్య నిల్వ పరికరాలలో ఫైళ్లను చదవడానికి, రాయడానికి, Google Play యాప్లకు పూర్తి ఫైల్ సిస్టమ్ యాక్సెస్ అవసరం పడొచ్చు. బాహ్య డిస్క్ను ఉపయోగించే ఎవరికైనా పరికరంలో క్రియేట్ చేసిన ఫైళ్లు, ఫోల్డర్లు కనిపిస్తాయి. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&అన్నీ ఎంచుకోండి</translation> -<translation id="1901396183631570154">Chrome ఈ పాస్వర్డ్లను మీ Google ఖాతాలో సేవ్ చేయలేకపోయింది. మీరు వాటిని ఇప్పటికీ మీ పరికరంలో సేవ్ చేయవచ్చు.</translation> <translation id="1903995858055162096">మీ పరికరం కాదా? <ph name="BEGIN_LINK" />గెస్ట్ మోడ్<ph name="END_LINK" />ను ఉపయోగించండి.</translation> <translation id="1904580727789512086">మీరు వెళ్లే URLలు మీ Google ఖాతాకు సేవ్ చేయబడతాయి</translation> <translation id="1905375423839394163">Chromebook పరికరం పేరు</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />ను అన్ఇన్స్టాల్ చేయడానికి Windowsను షట్ డౌన్ చేయండి.</translation> <translation id="2477065602824695373">మీరు అనేక స్విచ్లను సెటప్ చేసినందున, ఆటో-స్కాన్ ఆఫ్ చేయబడింది.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" కోసం మీడియా-ఫైల్ అనుమతులు</translation> -<translation id="248003956660572823">పాస్వర్డ్లు సేవ్ చేయబడలేదు</translation> <translation id="2480868415629598489">మీరు కాపీ చేసి, అతికించే డేటాను ఎడిట్ చేయడం</translation> <translation id="2482878487686419369">నోటిఫికేషన్లు</translation> <translation id="2482895651873876648">ట్యాబ్, గ్రూప్నకు తరలించబడింది <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">తల్లిదండ్రుల నియంత్రణలు</translation> <translation id="281390819046738856">రిక్వెస్ట్కు సంతకం అందించడం సాధ్యపడలేదు.</translation> <translation id="2814489978934728345">ఈ పేజిని లోడ్ చేయడం ఆపు</translation> -<translation id="281504910091592009">మీ <ph name="BEGIN_LINK" />Google ఖాతా<ph name="END_LINK" />లో సేవ్ చేసిన పాస్వర్డ్లను చూడండి, మేనేజ్ చేయండి</translation> <translation id="2815693974042551705">బుక్మార్క్ ఫోల్డర్</translation> <translation id="2816319641769218778">పాస్వర్డ్లను మీ Google ఖాతాలో సేవ్ చేయడానికి, సింక్ను ఆన్ చేయండి.</translation> <translation id="2816628817680324566">మీ సెక్యూరిటీ కీని గుర్తించడానికి ఈ సైట్ను అనుమతించాలా?</translation> @@ -4293,7 +4289,6 @@ <translation id="5078638979202084724">అన్ని ట్యాబ్లను బుక్మార్క్ చేయండి</translation> <translation id="5078796286268621944"> సరి కానటువంటి PIN</translation> <translation id="5079010647467150187">బిల్ట్-ఇన్ VPNని జోడించండి...</translation> -<translation id="5079950360618752063">సూచించిన పాస్వర్డ్ని ఉపయోగించండి</translation> <translation id="508059534790499809">Kerberos టిక్కెట్ను రిఫ్రెష్ చేయండి</translation> <translation id="5084328598860513926">కేటాయింపు విధానానికి అంతరాయం ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి లేదా మీ పరికర ఓనర్ను లేదా అడ్మినిస్ట్రేటర్ను సంప్రదించండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">అప్డేట్ల కోసం చెక్ చేస్తోంది</translation> @@ -4419,7 +4414,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ని తొలగించాలా?</translation> <translation id="520621735928254154">ప్రమాణపత్ర దిగుమతి ఎర్రర్</translation> <translation id="5206562235913517859">రిటైలర్-స్టోర్ ID ABC-1234 ఫార్మాట్లో ఉండాలి</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{చోరీకి గురైన పాస్వర్డ్ విజయవంతంగా మార్చబడింది. మీ వద్ద మరో # చోరీకి గురైన పాస్వర్డ్ ఉంది. ఇప్పుడే, ఈ పాస్వర్డ్ను తనిఖీ చేయమని Chrome సిఫార్సు చేస్తోంది.}other{చోరీకి గురైన పాస్వర్డ్ విజయవంతంగా మార్చబడింది. మీ వద్ద మరో # చోరీకి గురైన పాస్వర్డ్లు ఉన్నాయి. ఇప్పుడే, ఈ పాస్వర్డ్లను తనిఖీ చేయమని Chrome సిఫార్సు చేస్తోంది.}}</translation> <translation id="5207949376430453814">వచన కర్సర్ గుర్తును హైలైట్ చేయి</translation> <translation id="520840839826327499">మీరు అర్హత ఉన్న ChromeOS పరికరాన్ని ఉపయోగిస్తున్నట్లు <ph name="SERVICE_NAME" /> చెక్ చేయాలనుకుంటోంది.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> ప్రామాణీకరణ టోకెన్ను స్టోర్ చేస్తోంది</translation> @@ -6248,7 +6242,6 @@ <translation id="6970861306198150268">మీరు ఈ సైట్లో మీ ప్రస్తుత పాస్వర్డ్ను సేవ్ చేస్తున్నారని నిర్ధారించుకోండి</translation> <translation id="6972180789171089114">ఆడియో/వీడియో</translation> <translation id="6972754398087986839">ప్రారంభించండి</translation> -<translation id="6972887130317925583">చోరీకి గురైన పాస్వర్డ్ విజయవంతంగా మార్చబడింది. <ph name="SETTINGS" />లలో మీ పాస్వర్డ్లను ఎప్పుడైనా చెక్ చేయండి.</translation> <translation id="697312151395002334">పాప్-అప్లను పంపడానికి, అలాగే మళ్లింపులను ఉపయోగించడానికి అనుమతించబడింది</translation> <translation id="6973611239564315524">Debian 10 (Buster)కు అప్గ్రేడ్ అందుబాటులో ఉంది</translation> <translation id="69739764870135975">అలాగే Google మీ ఆటోమేటిక్ సెర్చ్ ఇంజిన్ అయితే, మీకు మరింత సందర్భోచితమైన సూచనలు కనిపిస్తాయి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 5d9c591..12315c73 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">องค์กรของคุณเป็นผู้จัดการตัวเลือกการแชร์ บางรายการอาจถูกซ่อน</translation> <translation id="1622054403950683339">เลิกจำเครือข่าย Wi-Fi</translation> <translation id="1623723619460186680">การลดแสงสีฟ้า</translation> -<translation id="1624012933569991823">การตั้งค่า</translation> <translation id="1624599281783425761">คุณจะไม่เห็น <ph name="MERCHANT" /> อีก</translation> <translation id="1624863973697515675">ไฟล์นี้ใหญ่เกินกว่าที่อุปกรณ์จะจัดการได้ ลองดาวน์โหลดในอุปกรณ์อื่น</translation> <translation id="1627276047960621195">ตัวอธิบายไฟล์</translation> @@ -981,7 +980,6 @@ <translation id="1897120393475391208">ใช้รหัสผ่านที่รัดกุม</translation> <translation id="1900305421498694955">แอปจาก Google Play อาจต้องมีสิทธิ์เข้าถึงระบบไฟล์โดยสมบูรณ์เพื่ออ่านและเขียนไฟล์ในอุปกรณ์เก็บข้อมูลภายนอก ไฟล์และโฟลเดอร์ที่สร้างขึ้นในอุปกรณ์จะแสดงแก่ทุกคนที่ใช้ไดรฟ์ภายนอก <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="1901303067676059328">เลือก&ทั้งหมด</translation> -<translation id="1901396183631570154">Chrome บันทึกรหัสผ่านเหล่านี้ในบัญชี Google ไม่ได้ แต่คุณยังบันทึกไว้ในอุปกรณ์นี้ได้อยู่</translation> <translation id="1903995858055162096">หากไม่ใช่อุปกรณ์ของคุณ ใช้<ph name="BEGIN_LINK" />โหมดผู้มาเยือน<ph name="END_LINK" /></translation> <translation id="1904580727789512086">ระบบจะบันทึก URL ที่เข้าชมไว้ในบัญชี Google ของคุณ</translation> <translation id="1905375423839394163">ชื่ออุปกรณ์ Chromebook</translation> @@ -1616,7 +1614,6 @@ <translation id="2476974672882258506">ปิด Windows เพื่อถอนการติดตั้ง <ph name="PARALLELS_DESKTOP" /></translation> <translation id="2477065602824695373">ระบบได้ปิดการสแกนอัตโนมัติไว้เนื่องจากคุณตั้งค่าสวิตช์หลายอัน</translation> <translation id="2478176599153288112">สิทธิ์ไฟล์สื่อสำหรับ "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">ไม่ได้บันทึกรหัสผ่าน</translation> <translation id="2480868415629598489">แก้ไขข้อมูลที่คุณคัดลอกและวาง</translation> <translation id="2482878487686419369">การแจ้งเตือน</translation> <translation id="2482895651873876648">แท็บถูกย้ายไปอยู่ในกลุ่ม <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1978,7 +1975,6 @@ <translation id="2813094189969465044">การควบคุมโดยผู้ปกครอง</translation> <translation id="281390819046738856">ลงนามคำขอไม่ได้</translation> <translation id="2814489978934728345">หยุดโหลดหน้านี้</translation> -<translation id="281504910091592009">ดูและจัดการรหัสผ่านที่บันทึกไว้ใน<ph name="BEGIN_LINK" />บัญชี Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">โฟลเดอร์บุ๊กมาร์ก</translation> <translation id="2816319641769218778">หากต้องการบันทึกรหัสผ่านลงในบัญชี Google ให้เปิดการซิงค์</translation> <translation id="2816628817680324566">อนุญาตให้เว็บไซต์นี้ระบุคีย์ความปลอดภัยของคุณไหม</translation> @@ -4278,7 +4274,6 @@ <translation id="5078638979202084724">บุ๊กมาร์กแท็บทั้งหมด</translation> <translation id="5078796286268621944">PIN ไม่ถูกต้อง</translation> <translation id="5079010647467150187">เพิ่ม VPN ในตัว…</translation> -<translation id="5079950360618752063">ใช้รหัสผ่านที่แนะนำ</translation> <translation id="508059534790499809">รีเฟรชตั๋ว Kerberos</translation> <translation id="5084328598860513926">ขั้นตอนการตั้งค่าถูกขัดจังหวะ โปรดลองอีกครั้งหรือติดต่อเจ้าของอุปกรณ์หรือผู้ดูแลระบบ รหัสข้อผิดพลาด: <ph name="ERROR_CODE" /></translation> <translation id="5085162214018721575">กำลังตรวจสอบการอัปเดต</translation> @@ -4404,7 +4399,6 @@ <translation id="5206215183583316675">ลบ " <ph name="CERTIFICATE_NAME" /> " ไหม</translation> <translation id="520621735928254154">เกิดข้อผิดพลาดในการนำเข้าใบรับรอง</translation> <translation id="5206562235913517859">รหัสร้านค้าปลีกมีรูปแบบเป็น ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{เปลี่ยนรหัสผ่านที่ไม่รัดกุมเรียบร้อยแล้ว คุณมีรหัสผ่านที่ไม่รัดกุมอีก # รายการ Chrome ขอแนะนำให้ตรวจสอบรหัสผ่านนี้ทันที}other{เปลี่ยนรหัสผ่านที่ไม่รัดกุมเรียบร้อยแล้ว คุณมีรหัสผ่านที่ไม่รัดกุมอีก # รายการ Chrome ขอแนะนำให้ตรวจสอบรหัสผ่านเหล่านี้ทันที}}</translation> <translation id="5207949376430453814">ไฮไลต์เครื่องหมาย Caret ของข้อความ</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> ต้องการตรวจสอบว่าคุณกำลังใช้อุปกรณ์ Chrome OS ที่มีสิทธิ์อยู่หรือไม่</translation> <translation id="5208548918290612795">กำลังจัดเก็บโทเค็นการตรวจสอบสิทธิ์ของ <ph name="WEB_DRIVE" /></translation> @@ -6230,7 +6224,6 @@ <translation id="6970861306198150268">ตรวจสอบว่าคุณกำลังบันทึกรหัสผ่านปัจจุบันสำหรับเว็บไซต์นี้</translation> <translation id="6972180789171089114">เสียง/วิดีโอ</translation> <translation id="6972754398087986839">เริ่มต้นใช้งาน</translation> -<translation id="6972887130317925583">เปลี่ยนรหัสผ่านที่ถูกละเมิดเรียบร้อยแล้ว ตรวจสอบรหัสผ่านได้ทุกเมื่อใน<ph name="SETTINGS" /></translation> <translation id="697312151395002334">ได้รับอนุญาตให้ส่งป๊อปอัปและใช้การเปลี่ยนเส้นทาง</translation> <translation id="6973611239564315524">มีการอัปเกรดเป็น Debian 10 (Buster) พร้อมใช้งาน</translation> <translation id="69739764870135975">หาก Google เป็นเครื่องมือค้นหาเริ่มต้นของคุณด้วย คุณจะเห็นคำแนะนำที่มีประสิทธิภาพและเกี่ยวข้องกับบริบทมากยิ่งขึ้น</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 427c103..fbfd826 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">Paylaşım seçeneklerini kuruluşunuz yönetir. Bazı ürünler gizlenmiş olabilir.</translation> <translation id="1622054403950683339">Kablosuz ağı unut</translation> <translation id="1623723619460186680">Mavi ışık azaltma</translation> -<translation id="1624012933569991823">Ayarlar</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> adlı satıcıyı bir daha görmeyeceksiniz</translation> <translation id="1624863973697515675">Bu dosya, cihazınız tarafından yönetilemeyecek kadar büyük. Başka bir cihazda indirmeyi deneyin.</translation> <translation id="1627276047960621195">Dosya Açıklayıcıları</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Güçlü şifre kullan</translation> <translation id="1900305421498694955">Google Play uygulamaları, harici depolama cihazlarında bulunan dosyaları ve klasörleri okuyup yazmak için tam dosya sistemi erişim izni gerektirebilir. Cihazda oluşturulan dosyalar ve klasörler, harici sürücüyü kullanan herkes tarafından görülebilir. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Tümünü &seç</translation> -<translation id="1901396183631570154">Chrome bu şifreleri Google Hesabınıza kaydedemedi. Yine de bu cihaza kaydedebilirsiniz.</translation> <translation id="1903995858055162096">Sizin cihazınız değil mi? <ph name="BEGIN_LINK" />Misafir modunu<ph name="END_LINK" /> kullanın.</translation> <translation id="1904580727789512086">Ziyaret ettiğiniz URL'ler Google Hesabınıza kaydedilir</translation> <translation id="1905375423839394163">Chromebook cihaz adı</translation> @@ -1613,7 +1611,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> yüklemesini kaldırmak için Windows'u kapatın.</translation> <translation id="2477065602824695373">Birden fazla anahtar ayarladığınız için otomatik tarama özelliği kapatıldı.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" için Medya Dosya İzinleri</translation> -<translation id="248003956660572823">Şifreler kaydedilmedi</translation> <translation id="2480868415629598489">Kopyaladığınız ve yapıştırdığınız verileri değiştirme</translation> <translation id="2482878487686419369">Bildirimler</translation> <translation id="2482895651873876648">Sekme, <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> grubuna taşındı</translation> @@ -1975,7 +1972,6 @@ <translation id="2813094189969465044">Ebeveyn denetimleri</translation> <translation id="281390819046738856">İstek imzalanamadı.</translation> <translation id="2814489978934728345">Bu sayfayı yüklemeyi durdur</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google Hesabınızdaki<ph name="END_LINK" /> kayıtlı şifrelerinizi görüntüleyin ve yönetin.</translation> <translation id="2815693974042551705">Yer işareti klasörü</translation> <translation id="2816319641769218778">Şifreleri Google Hesabınıza kaydetmek için senkronizasyonu açın.</translation> <translation id="2816628817680324566">Bu sitenin güvenlik anahtarınızı tanımlamasına izin verilsin mi?</translation> @@ -4274,7 +4270,6 @@ <translation id="5078638979202084724">Tüm sekmelere yer işareti koy</translation> <translation id="5078796286268621944">Yanlış PIN</translation> <translation id="5079010647467150187">Yerleşik VPN ekleyin...</translation> -<translation id="5079950360618752063">Önerilen şifreyi kullan</translation> <translation id="508059534790499809">Kerberos biletini yenile</translation> <translation id="5084328598860513926">Yükleme akışı kesintiye uğradı. Lütfen tekrar deneyin veya cihaz sahibi ya da yöneticisiyle iletişime geçin. Hata kodu: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Güncellemeler denetleniyor</translation> @@ -4399,7 +4394,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" adlı sertifika silinsin mi?</translation> <translation id="520621735928254154">Sertifika İçe Aktarma Hatası</translation> <translation id="5206562235913517859">Perakendeci mağaza kimliği, ABC-1234 biçimindedir</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Güvenliği ihlal edilmiş şifre değiştirildi. Güvenliği ihlal edilmiş # şifreniz daha var. Chrome, bu şifreyi hemen kontrol etmenizi öneriyor.}other{Güvenliği ihlal edilmiş şifre değiştirildi. Güvenliği ihlal edilmiş # şifreniz daha var. Chrome, bu şifreleri hemen kontrol etmenizi öneriyor.}}</translation> <translation id="5207949376430453814">Metin imlecini vurgula</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> uygun bir ChromeOS cihazı kullanıp kullanmadığınızı kontrol etmek istiyor.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> Kimlik Doğrulama Jetonunu Saklama</translation> @@ -6228,7 +6222,6 @@ <translation id="6970861306198150268">Bu sitede kullandığınız şifreyi kaydettiğinizden emin olun</translation> <translation id="6972180789171089114">Ses/Video</translation> <translation id="6972754398087986839">Başlarken</translation> -<translation id="6972887130317925583">Güvenliği ihlal edilmiş şifre değiştirildi. Şifrelerinizi <ph name="SETTINGS" /> üzerinden her zaman kontrol edebilirsiniz.</translation> <translation id="697312151395002334">Pop-up'lar gönderip yönlendirmeler kullanmasına izin verilen siteler</translation> <translation id="6973611239564315524">Debian 10 (Buster) sürümüne geçiş yapılabilir</translation> <translation id="69739764870135975">Google'ı varsayılan arama motorunuz olarak da kullanıyorsanız bağlamla daha alakalı, daha iyi öneriler görürsünüz</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 958053a..f5711a4 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -670,7 +670,6 @@ <translation id="1621984899599015181">Параметрами спільного доступу керує адміністратор вашої організації. Деякі елементи може бути приховано.</translation> <translation id="1622054403950683339">Забути мережу Wi-Fi</translation> <translation id="1623723619460186680">Зменшення блакитного світла</translation> -<translation id="1624012933569991823">налаштуваннях</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> більше не відображатиметься</translation> <translation id="1624863973697515675">Цей файл завеликий для роботи на вашому пристрої. Спробуйте завантажити його на інший пристрій.</translation> <translation id="1627276047960621195">Опис файлу</translation> @@ -995,7 +994,6 @@ <translation id="1897120393475391208">Використати надійний пароль</translation> <translation id="1900305421498694955">Додатки з Google Play можуть просити повний системний доступ до файлів, щоб переглядати й змінювати їх на зовнішніх пристроях пам'яті. Усі користувачі, які мають доступ до зовнішнього диска, можуть переглядати файли й папки, створені на пристрої. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Вибрати &всі</translation> -<translation id="1901396183631570154">Веб-переглядачу Chrome не вдалося зберегти ці паролі у вашому обліковому записі Google. Але ви можете зберегти їх на цьому пристрої.</translation> <translation id="1903995858055162096">Це не ваш пристрій? Перейдіть у <ph name="BEGIN_LINK" />режим гостя<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">URL-адреси, на які ви переходите, зберігаються в обліковому записі Google</translation> <translation id="1905375423839394163">Назва пристрою Chromebook</translation> @@ -1633,7 +1631,6 @@ <translation id="2476974672882258506">Щоб видалити <ph name="PARALLELS_DESKTOP" />, завершіть роботу Windows.</translation> <translation id="2477065602824695373">Оскільки ви налаштували кілька перемикачів, автосканування вимкнено.</translation> <translation id="2478176599153288112">Дозволи медіа-файлу для розширення "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Паролі не збережено</translation> <translation id="2480868415629598489">Змінювати дані, які копіюються</translation> <translation id="2482878487686419369">Сповіщення</translation> <translation id="2482895651873876648">Вкладку переміщено в групу "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /></translation> @@ -1995,7 +1992,6 @@ <translation id="2813094189969465044">Батьківський контроль</translation> <translation id="281390819046738856">Не вдалося підписати запит.</translation> <translation id="2814489978934728345">Припинити завантаження цієї сторінки</translation> -<translation id="281504910091592009">Переглядайте збережені паролі й керуйте ними в <ph name="BEGIN_LINK" />обліковому записі Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Папка із закладками</translation> <translation id="2816319641769218778">Щоб зберігати паролі в обліковому записі Google, увімкніть синхронізацію.</translation> <translation id="2816628817680324566">Дозволити цьому сайту ідентифікувати ваш ключ безпеки?</translation> @@ -4295,7 +4291,6 @@ <translation id="5078638979202084724">Додати всі вкладки в закладки</translation> <translation id="5078796286268621944">Неправильний PIN-код</translation> <translation id="5079010647467150187">Додати вбудовану мережу VPN…</translation> -<translation id="5079950360618752063">Використати запропонований пароль</translation> <translation id="508059534790499809">Оновити квиток Kerberos</translation> <translation id="5084328598860513926">Налаштування перервано. Повторіть спробу або зв'яжіться з адміністратором чи власником пристрою. Код помилки: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Перевірка наявності оновлень</translation> @@ -4420,7 +4415,6 @@ <translation id="5206215183583316675">Видалити сертифікат "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Не вдалось імпортувати сертифікат</translation> <translation id="5206562235913517859">Введіть ідентифікатор роздрібного магазину у форматі ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Зламаний пароль змінено. У вас є ще # зламаний пароль. Chrome радить негайно перевірити його.}one{Зламаний пароль змінено. У вас є ще # зламаний пароль. Chrome радить негайно перевірити їх.}few{Зламаний пароль змінено. У вас є ще # зламані паролі. Chrome радить негайно перевірити їх.}many{Зламаний пароль змінено. У вас є ще # зламаних паролів. Chrome радить негайно перевірити їх.}other{Зламаний пароль змінено. У вас є ще # зламаного пароля. Chrome радить негайно перевірити їх.}}</translation> <translation id="5207949376430453814">Підсвічувати місце введення тексту</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> хоче перевірити, чи користуєтеся ви придатним пристроєм з ОС Chrome.</translation> <translation id="5208548918290612795">Зберігання маркера автентифікації сервісу <ph name="WEB_DRIVE" /></translation> @@ -6251,7 +6245,6 @@ <translation id="6970861306198150268">Переконайтеся, що зберігаєте для цього сайту поточний пароль</translation> <translation id="6972180789171089114">Звук і відео</translation> <translation id="6972754398087986839">Почати</translation> -<translation id="6972887130317925583">Зламаний пароль змінено. Ви можете будь-коли перевірити свої паролі в <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Дозволено показувати спливаючі вікна та використовувати переспрямування</translation> <translation id="6973611239564315524">Доступне оновлення Debian 10 (Buster)</translation> <translation id="69739764870135975">Якщо Google є вашою пошуковою системою за умовчанням, ви бачитимете кращі та доречніші за контекстом підказки</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index f5f64b60..8252eaa4 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">اشتراک کے اختیارات آپ کی تنظیم کے زیر انتظام ہیں۔ کچھ آئٹمز چھپ سکتے ہیں۔</translation> <translation id="1622054403950683339">Wi-Fi نیٹ ورک کو بھول جائیں</translation> <translation id="1623723619460186680">نیلی روشنی میں تخفیف</translation> -<translation id="1624012933569991823">ترتیبات</translation> <translation id="1624599281783425761">آپ کو <ph name="MERCHANT" /> دوبارہ دکھائی نہیں دے گا</translation> <translation id="1624863973697515675">نظم کرنے کیلئے یہ فائل آپ کے آلہ کے لیے بہت بڑی ہے۔ اسے کسی اور آلہ پر ڈاؤن لوڈ کرنے کی کوشش کریں</translation> <translation id="1627276047960621195">فائل ڈسکرپٹرز</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">مضبوط پاس ورڈ استعمال کریں</translation> <translation id="1900305421498694955">خارجی اسٹوریج آلات پر فائلیں پڑھنے اور لکھنے کیلئے، Google Play کی ایپس کو فائل سسٹم تک مکمل رسائی کی ضرورت پڑ سکتی ہے۔ اس آلے پر تخلیق کردہ فائلیں اور فولڈرز خارجی ڈرائیو استعمال کرنے والے ہر شخص کو دکھائی دیتے ہیں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&سبھی کو منتخب کریں</translation> -<translation id="1901396183631570154">Chrome ان پاس ورڈز کو آپ کے Google اکاؤنٹ میں محفوظ نہیں کر سکا۔ آپ ابھی بھی انہیں اس آلے پر محفوظ کر سکتے ہیں۔</translation> <translation id="1903995858055162096">آپ کا آلہ نہیں ہے؟ <ph name="BEGIN_LINK" />مہمان وضع<ph name="END_LINK" /> استعمال کریں۔</translation> <translation id="1904580727789512086">آپ کے ملاحظہ کردہ URLs آپ کے Google اکاؤنٹ میں محفوظ ہوتے ہیں</translation> <translation id="1905375423839394163">Chromebook آلہ کا نام</translation> @@ -1617,7 +1615,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> کو اَن انسٹال کرنے کیلئے ونڈوز شٹ ڈاؤن کریں۔</translation> <translation id="2477065602824695373">چونکہ آپ نے ایک سے زیادہ سوئچز مرتب کیے ہیں، لہذا خودکار اسکین کو آف کر دیا گیا ہے۔</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" کیلئے میڈیا فائل کی اجازتیں</translation> -<translation id="248003956660572823">پاسورڈز محفوظ نہیں ہیں</translation> <translation id="2480868415629598489">آپ جو ڈیٹا کاپی اور پیسٹ کرتے ہیں اس میں ترمیم کریں</translation> <translation id="2482878487686419369">اطلاعات</translation> <translation id="2482895651873876648">ٹیب کو گروپ میں منتقل کر دیا گیا <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1979,7 +1976,6 @@ <translation id="2813094189969465044">پیرنٹل کنٹرولز</translation> <translation id="281390819046738856">درخواست پر دستخط نہیں کیا جا سکا۔</translation> <translation id="2814489978934728345">یہ صفحہ لوڈ کرنا بند کریں</translation> -<translation id="281504910091592009">اپنے <ph name="BEGIN_LINK" />Google اکاؤنٹ<ph name="END_LINK" /> میں محفوظ کردہ پاس ورڈز دیکھیں اور ان کا نظم کریں</translation> <translation id="2815693974042551705">بُک مارک فولڈر</translation> <translation id="2816319641769218778">اپنے Google اکاؤنٹ میں پاس ورڈز محفوظ کرنے کیلئے، مطابقت پذیری آن کریں۔</translation> <translation id="2816628817680324566">اس سائٹ کو آپ کی سیکیورٹی کلید شناخت کرنے کی اجازت دیں؟</translation> @@ -4278,7 +4274,6 @@ <translation id="5078638979202084724">سبھی ٹیبز کو بُک مارک کریں</translation> <translation id="5078796286268621944">غلط PIN</translation> <translation id="5079010647467150187">پہلے سے موجود VPN کو شامل کریں...</translation> -<translation id="5079950360618752063">تجویز کردہ پاس ورڈ استعمال کریں</translation> <translation id="508059534790499809">Kerberos ٹکٹ ریفریش کریں</translation> <translation id="5084328598860513926">فراہمی کے بہاؤ میں مداخلت ہو گئی۔ براہ کرم دوبارہ کوشش کریں یا اپنے آلہ کے مالک یا منتظم سے رابطہ کریں۔ خرابی کا کوڈ: <ph name="ERROR_CODE" />۔</translation> <translation id="5085162214018721575">اپ ڈیٹس چیک کرنا</translation> @@ -4403,7 +4398,6 @@ <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" کو حذف کریں؟</translation> <translation id="520621735928254154">سرٹیفکیٹ درآمد کرنے میں خرابی</translation> <translation id="5206562235913517859">ریٹیلر اسٹوریج ID ABC-1234 فارمیٹ میں ہے</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{متاثرہ پاس ورڈ کو کامیابی کے ساتھ تبدیل کر دیا گیا۔ آپ کے پاس # متاثرہ پاس ورڈ ہے۔ Chrome اس پاس ورڈ کو ابھی چیک کرنے کی تجویز کرتا ہے۔}other{متاثرہ پاس ورڈ کو کامیابی کے ساتھ تبدیل کر دیا گیا۔ آپ کے پاس # متاثرہ پاس ورڈز ہیں۔ Chrome ان پاس ورڈز کو ابھی چیک کرنے کی تجویز کرتا ہے۔}}</translation> <translation id="5207949376430453814">متن کیرٹ کو نمایاں کریں</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> چیک کرنا چاہتا ہے کہ آیا آپ اہل ChromeOS آلہ استعمال کررہے ہیں۔</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> کے تصدیقی ٹوکن کو اسٹور کیا جا رہا ہے</translation> @@ -5287,6 +5281,7 @@ <translation id="6065289257230303064">سرٹیفیکیٹ موضوع ڈائریکٹری انتسابات</translation> <translation id="6066794465984119824">تصویری ہیش سیٹ نہیں ہے</translation> <translation id="6069464830445383022">آپ کا Google اکاؤنٹ آپ کا Chromebook سائن ان ہے</translation> +<translation id="6070311415473175157">تلاش کرنے کے لیے تصویر کا علاقہ منتخب کریں</translation> <translation id="6071181508177083058">پاس ورڈ کی توثیق کریں</translation> <translation id="6071576563962215370">سسٹم آلہ کے انسٹالیشن کے وقت کے انتسابات کا لاک تشکیل دینے میں ناکام ہوگیا۔</translation> <translation id="6072442788591997866">اس آلہ پر <ph name="APP_NAME" /> کی اجازت نہیں ہے۔ اپنے منتظم سے رابطہ کریں۔ خرابی کا کوڈ: <ph name="ERROR_CODE" />۔</translation> @@ -6230,7 +6225,6 @@ <translation id="6970861306198150268">اس بات کو یقینی بنائیں کہ آپ اس سائٹ کے لیے اپنا موجودہ پاس ورڈ محفوظ کر رہے ہیں</translation> <translation id="6972180789171089114">آڈیو/ویڈیو</translation> <translation id="6972754398087986839">شروع کریں</translation> -<translation id="6972887130317925583">متاثرہ پاس ورڈ کو کامیابی کے ساتھ تبدیل کر دیا گیا۔ <ph name="SETTINGS" /> میں اپنے پاس ورڈز کو کسی بھی وقت چیک کریں۔</translation> <translation id="697312151395002334">ری ڈائریکٹس استعمال کرنے اور پاپ اپس بھیجنے کی اجازت ہے</translation> <translation id="6973611239564315524">Debian 10 (بسٹر) کے لیے ایک اپ گریڈ دستیاب ہے</translation> <translation id="69739764870135975">اگر Google بھی آپ کا ڈیفالٹ سرچ انجن ہے تو آپ کو بہتر، سیاق و سباق کے لحاظ سے متعلقہ تجاویز دکھائی دیں گی</translation> @@ -7118,6 +7112,7 @@ <translation id="7842692330619197998">اگر آپ ایک نیا اکاؤنٹ بنانا چاہتے ہیں تو g.co/ChromeEnterpriseAccount ملاحظہ کریں۔</translation> <translation id="78427265591841839"><ph name="VISUAL_SEARCH_PROVIDER" /> کی مدد سے صفحہ کا کوئی بھی حصہ تلاش کریں</translation> <translation id="784273751836026224">Linux اَن انسٹال کریں</translation> +<translation id="7842851769217535639">تلاش کرنے کے لیے صفحہ کا کوئی بھی حصہ منتخب کریں</translation> <translation id="7843786652787044762"><ph name="WEB_DRIVE" /> میں سائن ان کریں</translation> <translation id="7844992432319478437">مختلف کو اپ ڈیٹ کیا جا رہا ہے</translation> <translation id="7846634333498149051">کی بورڈ</translation> @@ -7173,6 +7168,7 @@ <translation id="7893008570150657497">اپنے کمپیوٹر سے تصاویر، موسیقی اور دیگر میڈیا تک رسائی حاصل کریں</translation> <translation id="7893153962594818789">اس <ph name="DEVICE_TYPE" /> پر بلوٹوتھ آف ہے۔ اپنا پاس ورڈ درج کریں اور بلوٹوتھ آن کریں۔</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (ڈیفالٹ)</translation> +<translation id="7896292361319775586"><ph name="FILE" /> محفوظ کریں؟</translation> <translation id="789722939441020330">سائٹس کو خودکار طور پر متعدد فائلیں ڈاؤن لوڈ کرنے کی اجازت نہ دیں</translation> <translation id="7897900149154324287">آئندہ، فائلز ایپ میں اپنے قابل منتقلی آلے کو ان پلگ کرنے سے پہلے اسے یقینی طور پر نکال لیں۔ بصورت دیگر، آپ ڈیٹا سے محروم ہو سکتے ہیں۔</translation> <translation id="7898725031477653577">ہمیشہ ترجمہ کریں</translation> @@ -8309,6 +8305,7 @@ <translation id="899403249577094719">Netscape سرٹیفکیٹ بیس URL</translation> <translation id="899657321862108550">آپ کا Chrome، ہر جگہ ہے</translation> <translation id="899676909165543803">فنگر پرنٹ سینسر آپ کے کی بورڈ پر سب سے نیچے دائیں ہاتھ کی کلید ہے۔ اسے کسی بھی انگلی سے ہلکے سے ٹچ کریں۔</translation> +<translation id="8998078711690114234">اس قسم کی فائل خطرناک ہو سکتی ہے۔ اگر آپ کو <ph name="ORIGIN" /> پر اعتماد ہے تو صرف اس فائل کو محفوظ کریں</translation> <translation id="8999560016882908256">سیکشن کے سِنٹیکس کی خرابی: <ph name="ERROR_LINE" /></translation> <translation id="9003185744423389627">آلے کے مینیجمنٹ کے سرور سے کنکشن <ph name="FAILURE_TIME" /> پر '<ph name="STATUS_TEXT" />' اسٹیٹس کے ساتھ ناکام ہو گیا</translation> <translation id="9003647077635673607">سبھی ویب سائٹس پر اجازت دیں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index c2c70fd..f90fe2d1 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -662,7 +662,6 @@ <translation id="1621984899599015181">Tashkilot boshqaruvidagi ulashuv parametrlari Ayrim elementlar yashirilishi mumkin.</translation> <translation id="1622054403950683339">Wi-Fi tarmoqni faolsizlantirish</translation> <translation id="1623723619460186680">Koʻk rangni kamaytirish</translation> -<translation id="1624012933569991823">Sozlamalar</translation> <translation id="1624599281783425761"><ph name="MERCHANT" /> endi boshqa chiqmaydi</translation> <translation id="1624863973697515675">Qurilmangizda boshqarish uchun bu fayl juda katta. Uni boshqa qurilmada yuklab olib, urinib koʻring</translation> <translation id="1627276047960621195">Fayl deskriptorlari</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">Kuchli parol ishlatish</translation> <translation id="1900305421498694955">Google Play ilovalari fayllar bilan ishlash maqsadida tashqi xotira qurilmalariga oʻqish va yozish uchun toʻliq ruxsatni talab qilishi mumkin. Shuningdek, tashqi xotira qurilmasini ishlatuvchi barcha foydalanuvchilarda qurilmada yaratilgan fayllar va jildlarga ruxsat boʻladi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Hammasini belgilash</translation> -<translation id="1901396183631570154">Chrome bu parollarni Google hisobingizga saqlay olmadi. Lekin ularni shu qurilmaga saqlash mumkin.</translation> <translation id="1903995858055162096">Bu sizning qurilmangiz emasmi? <ph name="BEGIN_LINK" />Mehmon rejimidan<ph name="END_LINK" /> foydalanish.</translation> <translation id="1904580727789512086">Tashrif qilingan URL manzillar Google hisobingizda saqlanadi</translation> <translation id="1905375423839394163">Chromebook qurilmasi nomi</translation> @@ -1618,7 +1616,6 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> oʻchirib tashlanishi uchun Windows ishini yakunlang.</translation> <translation id="2477065602824695373">Bir nechta kalit tugma sozlangani sababli avto-skanerlash faolsizlantirildi.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" uchun media fayli ruxsatlari</translation> -<translation id="248003956660572823">Parollar saqlanmadi</translation> <translation id="2480868415629598489">Nusxalab joylanadigan ma’lumotlarni tahrirlash</translation> <translation id="2482878487686419369">Bildirishnomalar</translation> <translation id="2482895651873876648">Varaq <ph name="GROUP_NAME" /> guruhiga olindi – <ph name="GROUP_CONTENTS" /></translation> @@ -1980,7 +1977,6 @@ <translation id="2813094189969465044">Ota-ona nazorati</translation> <translation id="281390819046738856">Soʻrov imzolanmadi.</translation> <translation id="2814489978934728345">Ushbu sahifa yuklanishini to‘xtatish</translation> -<translation id="281504910091592009"><ph name="BEGIN_LINK" />Google hisobingizga<ph name="END_LINK" /> saqlangan parollarni ko‘rish va boshqarish</translation> <translation id="2815693974042551705">Xatcho‘plar jildi</translation> <translation id="2816319641769218778">Parollar Google hisobida saqlanishi uchun sinxronizatsiyani yoqing.</translation> <translation id="2816628817680324566">Bu sayt uchun elektron kalit axborotlarini koʻrishga ruxsat berilsinmi?</translation> @@ -4281,7 +4277,6 @@ <translation id="5078638979202084724">Barcha ichki oynalarni xatcho‘plarga qo‘shish</translation> <translation id="5078796286268621944">Noto‘g‘ri PIN-kod</translation> <translation id="5079010647467150187">Ichki oʻrnatilgan VPN kiritish...</translation> -<translation id="5079950360618752063">Taklif qilingan parolni ishlatish</translation> <translation id="508059534790499809">Kerberos chiptasini yangilash</translation> <translation id="5084328598860513926">Tekshiruv vaqtida xatolik yuz berdi. Qayta urining. Foydasi tegmasa, qurilma egasi yoki administratorga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Yangilanishlar mavjudligi tekshirilmoqda</translation> @@ -4407,7 +4402,6 @@ <translation id="5206215183583316675">“<ph name="CERTIFICATE_NAME" />” o‘chirilsinmi?</translation> <translation id="520621735928254154">Sertifikatini import qilishda xatolik yuz berdi</translation> <translation id="5206562235913517859">Savdo doʻkoni identifikatori (ID): ABC-1234 formatida</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Oshkor qilingan parol almashtirildi. Yana # ta oshkor qilingan parolingiz bor. Chrome hoziroq bu parolni tekshirishni tavsiya qiladi.}other{Oshkor qilingan parol almashtirildi. Yana # ta oshkor qilingan parollaringiz bor. Chrome hoziroq bu parollarni tekshirishni tavsiya qiladi}}</translation> <translation id="5207949376430453814">Matn kiritish joyi ajratib ko‘rsatilsin</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> mos ChromeOS qurilmadan foydalanayotganingizni tekshirmoqchi.</translation> <translation id="5208548918290612795"><ph name="WEB_DRIVE" /> omborida saqlash autentifikatsiya tokeni</translation> @@ -6235,7 +6229,6 @@ <translation id="6970861306198150268">Bu sayt uchun parolni saqlab qoʻying</translation> <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972754398087986839">Boshlash</translation> -<translation id="6972887130317925583">Oshkor qilingan parol almashtirildi. Parollarni istalgan vaqtda <ph name="SETTINGS" /> orqali tekshirish mumkin.</translation> <translation id="697312151395002334">Oynalarni qalqib chiqishi va sahifalarni yoʻnaltirishga ruxsat berilgan</translation> <translation id="6973611239564315524">Debian 10 (Buster) versiyasi chiqdi</translation> <translation id="69739764870135975">Agar Google birlamchi qidiruv tizmingiz boʻlsa, qidiruvda yanada yaxshi va yanada mos takliflar olasiz</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 63639d6..24293ed 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">Các lựa chọn chia sẻ do tổ chức của bạn quản lý. Một số mục có thể bị ẩn.</translation> <translation id="1622054403950683339">Xoá mạng Wi-Fi</translation> <translation id="1623723619460186680">Giảm ánh sáng xanh</translation> -<translation id="1624012933569991823">Cài đặt</translation> <translation id="1624599281783425761">Bạn sẽ không thấy <ph name="MERCHANT" /> nữa</translation> <translation id="1624863973697515675">Tệp này quá lớn nên thiết bị của bạn không quản lý được. Hãy thử tải xuống trên một thiết bị khác</translation> <translation id="1627276047960621195">Phần mô tả tệp</translation> @@ -993,7 +992,6 @@ <translation id="1897120393475391208">Dùng mật khẩu mạnh</translation> <translation id="1900305421498694955">Các ứng dụng trên Google Play có thể yêu cầu quyền truy cập vào toàn bộ hệ thống tệp để đọc và ghi tệp trên các thiết bị lưu trữ bên ngoài. Bất cứ ai dùng ổ đĩa bên ngoài đều sẽ nhìn thấy các tệp và thư mục tạo trên thiết bị này. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Chọn &tất cả</translation> -<translation id="1901396183631570154">Chrome không thể lưu các mật khẩu này vào Tài khoản Google của bạn. Bạn vẫn có thể lưu mật khẩu trên thiết bị này.</translation> <translation id="1903995858055162096">Đây không phải thiết bị của bạn? Hãy sử dụng <ph name="BEGIN_LINK" />Chế độ khách<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Các URL bạn truy cập sẽ được lưu vào Tài khoản Google của bạn</translation> <translation id="1905375423839394163">Tên thiết bị Chromebook</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">Hãy tắt Windows để gỡ cài đặt <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Vì bạn thiết lập nhiều công tắc, hệ thống đã tắt tính năng tự động quét.</translation> <translation id="2478176599153288112">Quyền của tệp phương tiện cho "<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Chưa lưu mật khẩu</translation> <translation id="2480868415629598489">Sửa đổi dữ liệu bạn sao chép và dán</translation> <translation id="2482878487686419369">Thông báo</translation> <translation id="2482895651873876648">Đã di chuyển thẻ vào nhóm <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Quyền kiểm soát của cha mẹ</translation> <translation id="281390819046738856">Không thể ký yêu cầu.</translation> <translation id="2814489978934728345">Dừng tải trang này</translation> -<translation id="281504910091592009">Xem và quản lý các mật khẩu đã lưu trong <ph name="BEGIN_LINK" />Tài khoản Google<ph name="END_LINK" /> của bạn</translation> <translation id="2815693974042551705">Thư mục dấu trang</translation> <translation id="2816319641769218778">Để lưu mật khẩu vào Tài khoản Google của bạn, hãy bật tính năng đồng bộ hóa.</translation> <translation id="2816628817680324566">Bạn muốn cho phép trang web này xác định khóa bảo mật của bạn?</translation> @@ -4294,7 +4290,6 @@ <translation id="5078638979202084724">Đánh dấu trang tất cả các thẻ</translation> <translation id="5078796286268621944">Mã PIN không chính xác</translation> <translation id="5079010647467150187">Thêm VPN tích hợp sẵn...</translation> -<translation id="5079950360618752063">Sử dụng mật khẩu đề xuất</translation> <translation id="508059534790499809">Làm mới vé Kerberos</translation> <translation id="5084328598860513926">Quy trình cấp phép bị gián đoạn. Vui lòng thử lại hoặc liên hệ với quản trị viên hay chủ sở hữu thiết bị. Mã lỗi: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Đang kiểm tra bản cập nhật</translation> @@ -4420,7 +4415,6 @@ <translation id="5206215183583316675">Xoá "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Lỗi nhập chứng chỉ</translation> <translation id="5206562235913517859">Mã nhận dạng cửa hàng của nhà bán lẻ có định dạng ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Đã đổi thành công mật khẩu bị lộ. Bạn còn # mật khẩu bị lộ nữa. Chrome khuyên bạn nên kiểm tra ngay mật khẩu này.}other{Đã đổi thành công mật khẩu bị lộ. Bạn còn # mật khẩu bị lộ nữa. Chrome khuyên bạn nên kiểm tra ngay những mật khẩu này.}}</translation> <translation id="5207949376430453814">Đánh dấu điểm chèn văn bản</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" /> muốn kiểm tra xem thiết bị ChromeOS bạn đang sử dụng có đủ điều kiện hay không.</translation> <translation id="5208548918290612795">Lưu trữ Mã xác thực của <ph name="WEB_DRIVE" /></translation> @@ -6249,7 +6243,6 @@ <translation id="6970861306198150268">Đảm bảo rằng bạn đang lưu mật khẩu hiện tại cho trang web này</translation> <translation id="6972180789171089114">Âm thanh/video</translation> <translation id="6972754398087986839">Bắt đầu</translation> -<translation id="6972887130317925583">Đã đổi thành công mật khẩu bị lộ. Bạn có thể kiểm tra mật khẩu bất cứ lúc nào trong phần <ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Được phép gửi cửa sổ bật lên và dùng lệnh chuyển hướng</translation> <translation id="6973611239564315524">Đã có bản nâng cấp lên Debian 10 (Buster)</translation> <translation id="69739764870135975">Nếu cũng đặt Google là công cụ tìm kiếm mặc định, thì bạn sẽ nhận được nội dung đề xuất phù hợp và có liên quan đến ngữ cảnh hơn</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 81c6cb7..89aa5b2 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -659,7 +659,6 @@ <translation id="1621984899599015181">用于进行分享的选项由贵组织管理。某些内容可能已隐藏。</translation> <translation id="1622054403950683339">移除 WLAN 网络</translation> <translation id="1623723619460186680">减少蓝光</translation> -<translation id="1624012933569991823">设置</translation> <translation id="1624599281783425761">您将不会再看到<ph name="MERCHANT" /></translation> <translation id="1624863973697515675">此文件太大,无法由您的设备管理。请尝试从另一部设备上下载</translation> <translation id="1627276047960621195">文件描述符</translation> @@ -973,7 +972,6 @@ <translation id="1897120393475391208">使用安全系数高的密码</translation> <translation id="1900305421498694955">Google Play 中的应用可能需要获得完整的文件系统访问权限,才能在外部存储设备上读取和写入文件。任何使用外部驱动器的人员都能看到在此设备上创建的文件和文件夹。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="1901303067676059328">全选(&A)</translation> -<translation id="1901396183631570154">Chrome 无法将这些密码保存到您的 Google 帐号中,但您依然可以将它们保存在此设备上。</translation> <translation id="1903995858055162096">不是您的设备?请使用<ph name="BEGIN_LINK" />访客模式<ph name="END_LINK" />。</translation> <translation id="1904580727789512086">系统会将您访问的网址保存到您的 Google 帐号中</translation> <translation id="1905375423839394163">Chromebook 设备名称</translation> @@ -1608,7 +1606,6 @@ <translation id="2476974672882258506">请关闭 Windows 以卸载 <ph name="PARALLELS_DESKTOP" />。</translation> <translation id="2477065602824695373">由于您设置了多个开关,“自动扫描”功能已关闭。</translation> <translation id="2478176599153288112">“<ph name="EXTENSION" />”的媒体文件权限</translation> -<translation id="248003956660572823">未能保存密码</translation> <translation id="2480868415629598489">修改您复制和粘贴的数据</translation> <translation id="2482878487686419369">通知</translation> <translation id="2482895651873876648">此标签页已移至“<ph name="GROUP_NAME" />”组中 - 该组包含<ph name="GROUP_CONTENTS" /></translation> @@ -1969,7 +1966,6 @@ <translation id="2813094189969465044">家长控制</translation> <translation id="281390819046738856">无法签署该请求。</translation> <translation id="2814489978934728345">停止加载此页</translation> -<translation id="281504910091592009">查看和管理您的 <ph name="BEGIN_LINK" />Google 帐号<ph name="END_LINK" />中保存的密码</translation> <translation id="2815693974042551705">“书签”文件夹</translation> <translation id="2816319641769218778">若想将密码保存到您的 Google 帐号中,请开启同步功能。</translation> <translation id="2816628817680324566">允许此网站识别您的安全密钥?</translation> @@ -4265,7 +4261,6 @@ <translation id="5078638979202084724">为所有标签页添加书签</translation> <translation id="5078796286268621944">PIN 不正确</translation> <translation id="5079010647467150187">添加内置 VPN…</translation> -<translation id="5079950360618752063">使用建议的密码</translation> <translation id="508059534790499809">刷新 Kerberos 票据</translation> <translation id="5084328598860513926">配置流程已中断。请重试,或与设备所有者/管理员联系。错误代码:<ph name="ERROR_CODE" />。</translation> <translation id="5085162214018721575">正在检查更新</translation> @@ -4390,7 +4385,6 @@ <translation id="5206215183583316675">要删除“<ph name="CERTIFICATE_NAME" />”吗?</translation> <translation id="520621735928254154">导入证书时出现错误</translation> <translation id="5206562235913517859">零售商店 ID 的格式为 ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{已成功更改这个已泄露的密码。您还有 # 个已泄露的密码。Chrome 建议您立即检查这个密码。}other{已成功更改这个已泄露的密码。您还有 # 个已泄露的密码。Chrome 建议您立即检查这些密码。}}</translation> <translation id="5207949376430453814">突出显示文本插入符号</translation> <translation id="520840839826327499"><ph name="SERVICE_NAME" />需要检查您使用的是否为符合条件的 Chrome 操作系统设备。</translation> <translation id="5208548918290612795">存储“<ph name="WEB_DRIVE" />”身份验证令牌</translation> @@ -6215,7 +6209,6 @@ <translation id="6970861306198150268">请务必保存您在此网站上使用的当前密码</translation> <translation id="6972180789171089114">音频/视频</translation> <translation id="6972754398087986839">开始使用</translation> -<translation id="6972887130317925583">已成功更改这个已泄露的密码。您随时可在“<ph name="SETTINGS" />”中检查您的密码。</translation> <translation id="697312151395002334">允许发送弹出式窗口并使用重定向</translation> <translation id="6973611239564315524">可以升级至 Debian 10 (Buster)</translation> <translation id="69739764870135975">如果 Google 也是您的默认搜索引擎,您将会看到更实用、与上下文更相关的建议</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index ad81eab..8e5e1699 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -667,7 +667,6 @@ <translation id="1621984899599015181">共用選項由您的機構管理。系統可能會隱藏部分項目。</translation> <translation id="1622054403950683339">移除 Wi-Fi 網絡</translation> <translation id="1623723619460186680">減少藍光</translation> -<translation id="1624012933569991823">設定</translation> <translation id="1624599281783425761">您將不會再看到 <ph name="MERCHANT" /></translation> <translation id="1624863973697515675">此檔案太大,您的裝置無法管理。請嘗試下載至其他裝置</translation> <translation id="1627276047960621195">檔案描述符</translation> @@ -992,7 +991,6 @@ <translation id="1897120393475391208">使用安全性強的密碼</translation> <translation id="1900305421498694955">Google Play 應用程式可能會要求取得檔案系統的完整存取權,以讀取和寫入外部儲存裝置上的檔案。外置磁碟的任何使用者都能見到在此裝置上建立的檔案和資料夾。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1901303067676059328">全部選取(&A)</translation> -<translation id="1901396183631570154">Chrome 無法將以下這些密碼儲存在您的 Google 帳戶中,不過您仍可將密碼儲存在此裝置上。</translation> <translation id="1903995858055162096">這不是您的裝置嗎?使用<ph name="BEGIN_LINK" />訪客模式<ph name="END_LINK" />。</translation> <translation id="1904580727789512086">系統會將您瀏覽的網址儲存至 Google 帳戶</translation> <translation id="1905375423839394163">Chromebook 裝置名稱</translation> @@ -1630,7 +1628,6 @@ <translation id="2476974672882258506">關閉 Windows 即可解除安裝 <ph name="PARALLELS_DESKTOP" />。</translation> <translation id="2477065602824695373">由於您已設定多個按鈕裝置,因此自動掃瞄已關閉。</translation> <translation id="2478176599153288112">「<ph name="EXTENSION" />」的媒體檔案權限</translation> -<translation id="248003956660572823">密碼未儲存</translation> <translation id="2480868415629598489">修改您複製並貼上的資料</translation> <translation id="2482878487686419369">通知</translation> <translation id="2482895651873876648">分頁移咗去包含「<ph name="GROUP_CONTENTS" />」嘅「<ph name="GROUP_NAME" />」群組</translation> @@ -1992,7 +1989,6 @@ <translation id="2813094189969465044">家長監控設定</translation> <translation id="281390819046738856">無法簽署要求。</translation> <translation id="2814489978934728345">停止載入這個網頁</translation> -<translation id="281504910091592009">查看和管理儲存在 <ph name="BEGIN_LINK" />Google 帳戶<ph name="END_LINK" />中的密碼</translation> <translation id="2815693974042551705">書籤資料夾</translation> <translation id="2816319641769218778">如要將密碼儲存至 Google 帳戶,請開啟同步功能。</translation> <translation id="2816628817680324566">要允許此網站辨識您的安全密鑰嗎?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">將所有分頁加入書籤</translation> <translation id="5078796286268621944">PIN 不正確</translation> <translation id="5079010647467150187">新增內置 VPN…</translation> -<translation id="5079950360618752063">使用建議的密碼</translation> <translation id="508059534790499809">更新 Kerberos 票證</translation> <translation id="5084328598860513926">佈建流程已中斷。請再試一次,或聯絡您的裝置擁有者或管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation> <translation id="5085162214018721575">檢查更新</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">要刪除「<ph name="CERTIFICATE_NAME" />」嗎?</translation> <translation id="520621735928254154">憑證匯入錯誤</translation> <translation id="5206562235913517859">零售商商店 ID 為 ABC-1234 格式</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{已成功變更被盜用的密碼。您還有 # 個被盜用的密碼。Chrome 建議您立即檢查此密碼。}other{已成功變更被盜用的密碼。您還有 # 個被盜用的密碼。Chrome 建議您立即檢查這些密碼。}}</translation> <translation id="5207949376430453814">突顯文字插入符號</translation> <translation id="520840839826327499">「<ph name="SERVICE_NAME" />」想檢查您是否使用符合資格的 Chrome OS 裝置。</translation> <translation id="5208548918290612795">儲存「<ph name="WEB_DRIVE" />」驗證憑證</translation> @@ -6244,7 +6238,6 @@ <translation id="6970861306198150268">請確保要儲存此網站目前的密碼</translation> <translation id="6972180789171089114">音訊/影片</translation> <translation id="6972754398087986839">開始使用</translation> -<translation id="6972887130317925583">已成功變更被盜用的密碼。您可隨時在「<ph name="SETTINGS" />」中檢查密碼。</translation> <translation id="697312151395002334">已允許傳送彈出式視窗和使用重新導向</translation> <translation id="6973611239564315524">可以升級至 Debian 10 (Buster)</translation> <translation id="69739764870135975">如果 Google 亦是預設的搜尋引擎,您將能取得更實用、更符合需要的建議</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index ec79fa5..d674ebb 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -664,7 +664,6 @@ <translation id="1621984899599015181">共用選項是由貴機構所管理。系統可能會隱藏部分項目。</translation> <translation id="1622054403950683339">清除 Wi-Fi 網路</translation> <translation id="1623723619460186680">降低藍光</translation> -<translation id="1624012933569991823">設定</translation> <translation id="1624599281783425761">日後不會再顯示「<ph name="MERCHANT" />」</translation> <translation id="1624863973697515675">這個檔案過大,你的裝置無法管理。請嘗試下載至其他裝置</translation> <translation id="1627276047960621195">檔案描述元</translation> @@ -980,7 +979,6 @@ <translation id="1897120393475391208">使用高強度密碼</translation> <translation id="1900305421498694955">透過 Google Play 下載的應用程式可能會要求取得檔案系統的完整存取權,以讀取和寫入外部儲存裝置上的檔案。外接式磁碟的任何使用者都能看見在此裝置上建立的檔案和資料夾。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1901303067676059328">選取全部(&A)</translation> -<translation id="1901396183631570154">Chrome 無法將這些密碼儲存在你的 Google 帳戶中。你仍然可以將這些密碼儲存在這部裝置上。</translation> <translation id="1903995858055162096">這不是你的裝置嗎?請使用<ph name="BEGIN_LINK" />訪客模式<ph name="END_LINK" />。</translation> <translation id="1904580727789512086">系統會將你造訪的網址儲存到 Google 帳戶</translation> <translation id="1905375423839394163">Chromebook 裝置名稱</translation> @@ -1615,7 +1613,6 @@ <translation id="2476974672882258506">請關閉 Windows 以解除安裝 <ph name="PARALLELS_DESKTOP" />。</translation> <translation id="2477065602824695373">你已設定多個外接切換裝置,因此自動掃描功能已關閉。</translation> <translation id="2478176599153288112">「<ph name="EXTENSION" />」的媒體檔案權限</translation> -<translation id="248003956660572823">未儲存密碼</translation> <translation id="2480868415629598489">修改你複製和貼上的資料</translation> <translation id="2482878487686419369">通知</translation> <translation id="2482895651873876648">分頁已移至包含「<ph name="GROUP_CONTENTS" />」的「<ph name="GROUP_NAME" />」群組</translation> @@ -1977,7 +1974,6 @@ <translation id="2813094189969465044">家長監護</translation> <translation id="281390819046738856">無法簽署要求。</translation> <translation id="2814489978934728345">停止載入此網頁</translation> -<translation id="281504910091592009">你可以查看及管理 <ph name="BEGIN_LINK" />Google 帳戶<ph name="END_LINK" />中儲存的密碼</translation> <translation id="2815693974042551705">書籤資料夾</translation> <translation id="2816319641769218778">如要將密碼儲存到你的 Google 帳戶,請開啟同步功能。</translation> <translation id="2816628817680324566">要允許這個網站辨識你的安全金鑰嗎?</translation> @@ -4275,7 +4271,6 @@ <translation id="5078638979202084724">將所有分頁加入書籤</translation> <translation id="5078796286268621944">PIN 不正確</translation> <translation id="5079010647467150187">新增內建的 VPN...</translation> -<translation id="5079950360618752063">使用建議的密碼</translation> <translation id="508059534790499809">更新 Kerberos 票證</translation> <translation id="5084328598860513926">佈建流程已中斷。請再試一次,或與裝置擁有者或系統管理員聯絡。錯誤代碼:<ph name="ERROR_CODE" />。</translation> <translation id="5085162214018721575">正在檢查有無更新</translation> @@ -4400,7 +4395,6 @@ <translation id="5206215183583316675">要刪除「<ph name="CERTIFICATE_NAME" />」嗎?</translation> <translation id="520621735928254154">憑證匯入錯誤</translation> <translation id="5206562235913517859">零售商店 ID 的格式為 ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{已成功變更遭外洩的密碼。你還有 # 組遭外洩的密碼。Chrome 建議你立即檢查這組密碼。}other{已成功變更遭外洩的密碼。你還有 # 組遭外洩的密碼。Chrome 建議你立即檢查這些密碼。}}</translation> <translation id="5207949376430453814">醒目顯示文字插入點</translation> <translation id="520840839826327499">「<ph name="SERVICE_NAME" />」想要確認你是否使用合格的 Chrome OS 裝置。</translation> <translation id="5208548918290612795">儲存「<ph name="WEB_DRIVE" />」驗證權杖</translation> @@ -6226,7 +6220,6 @@ <translation id="6970861306198150268">請確認要為這個網站儲存目前的密碼</translation> <translation id="6972180789171089114">音效/影片</translation> <translation id="6972754398087986839">開始使用</translation> -<translation id="6972887130317925583">已成功變更遭外洩的密碼。你可以隨時在「<ph name="SETTINGS" />」中檢查密碼。</translation> <translation id="697312151395002334">可以傳送彈出式視窗及使用重新導向</translation> <translation id="6973611239564315524">現在可以升級至 Debian 10 (Buster)</translation> <translation id="69739764870135975">如果 Google 同時也是你的預設搜尋引擎,你將能取得更實用、更符合需求的建議</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 5bf132a..071823f 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -666,7 +666,6 @@ <translation id="1621984899599015181">Izinketho zokwabelana ziphathwa inhlangano yakho. Kungenzeka ezinye izinto zifihliwe.</translation> <translation id="1622054403950683339">Khohlwa inethiwekhi ye-Wi-Fi</translation> <translation id="1623723619460186680">Ukuncipha kokukhanya okuluhlaza okwesibhakabhaka</translation> -<translation id="1624012933569991823">Amasethingi</translation> <translation id="1624599281783425761">Ngeke usabona futhi i-<ph name="MERCHANT" /></translation> <translation id="1624863973697515675">Leli fayela likhulu kakhulu ukuthi lingaphathwa idivayisi yakho. Zama ukuyidawuniloda kwenye idivayisi</translation> <translation id="1627276047960621195">Izichazi zefayela</translation> @@ -991,7 +990,6 @@ <translation id="1897120393475391208">Sebenzisa iphasiwedi eqinile</translation> <translation id="1900305421498694955">Izinhlelo zokusebenza kusuka ku-Google Play zingadinga ukufinyelela kwesistimu yefayela ephelele ukufunda nokubhala amafayela kumadivayisi esitoreji sangaphandle. Amafayela namafolda adalwe kudivayisi ayabonakala kunoma ubani osebenzisa idrayivu yangaphandle. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Khetha &konke</translation> -<translation id="1901396183631570154">I-Chrome ayikwazanga ukulondoloza lamaphasiwedi ku-akhawunti yakho ye-Google. Usengawalondoloza kule divayisi.</translation> <translation id="1903995858055162096">Akuyona idivayisi yakho? Sebenzisa <ph name="BEGIN_LINK" />Imodi yesivakashi<ph name="END_LINK" />.</translation> <translation id="1904580727789512086">Ama-URL owavakashelayo alondolozwe ku-akhawunti yakho ye-Google</translation> <translation id="1905375423839394163">Igama ledivayisi ye-Chromebook</translation> @@ -1631,7 +1629,6 @@ <translation id="2476974672882258506">Vala i-Windows ukuze ukhiphe i-<ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Njengoba usetha amaswishi amaningi, ukuskena okuzenzakalelayo kuvaliwe.</translation> <translation id="2478176599153288112">Izimvume zefayela lemidiya le-"<ph name="EXTENSION" />"</translation> -<translation id="248003956660572823">Amaphasiwedi awalondolozwanga</translation> <translation id="2480868415629598489">Shintsha idatha oyikopishayo futhi uyinamathisele</translation> <translation id="2482878487686419369">Izaziso</translation> <translation id="2482895651873876648">Ithebhu ihanjswe eqenjini le-<ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -1993,7 +1990,6 @@ <translation id="2813094189969465044">Izilawuli zomzali</translation> <translation id="281390819046738856">Isicelo asikwazanga ukusayindwa</translation> <translation id="2814489978934728345">Misa ukulayisha leli khasi</translation> -<translation id="281504910091592009">Buka futhi uphathe amaphasiwedi alondolozwe ku-<ph name="BEGIN_LINK" />akhawunti yakho ye-Google<ph name="END_LINK" /></translation> <translation id="2815693974042551705">Ifolda yebhukhimaki</translation> <translation id="2816319641769218778">Ukuze ulondoloze amaphasiwedi ku-akhawunti yakho ye-Google, vula ukuvumelanisa.</translation> <translation id="2816628817680324566">Vumela leli sayithi ukuthi likhombe ukhiye wakho wokuqinisekisa ubunikazi?</translation> @@ -4292,7 +4288,6 @@ <translation id="5078638979202084724">Beka uphawu lokubekisa kuwo wonke amathebhu</translation> <translation id="5078796286268621944">Iphinikhodi engalungile</translation> <translation id="5079010647467150187">Faka i-VPN eyakhelwe ngaphakathi...</translation> -<translation id="5079950360618752063">Sebenzisa iphasiwedi ephakanyisiwe</translation> <translation id="508059534790499809">Vuselela ithikithi le-Kerberos</translation> <translation id="5084328598860513926">Ukugeleza kwelungiselelo kuphazamisekile. Sicela uzame futhi noma uxhumane nomnikazi noma umlawuli wedivayisi yakho. Ikhodi yephutha: <ph name="ERROR_CODE" />.</translation> <translation id="5085162214018721575">Ihlolela izibuyekezo</translation> @@ -4417,7 +4412,6 @@ <translation id="5206215183583316675">Susa i-"<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Iphutha Lokungenisa Isitifiketi</translation> <translation id="5206562235913517859">I-ID yesitolo somthengisi iyifomethi ye-ABC-1234</translation> -<translation id="5206787458656075734">{COUNT,plural, =1{Iphumelele ukushintsha iphasiwedi eyonakalisiwe. Unephasiwedi eyonakalisiwe e-# ngokwengeziwe. I-Chrome incoma ukuhlola le phasiwedi manje.}one{Iphumelele ukushintsha iphasiwedi eyonakalisiwe. Unamaphasiwedi onakalisiwe angu-# ngokwengeziwe. I-Chrome incoma ukuhlola la maphasiwedi manje.}other{Iphumelele ukushintsha iphasiwedi eyonakalisiwe. Unamaphasiwedi onakalisiwe angu-# ngokwengeziwe. I-Chrome incoma ukuhlola la maphasiwedi manje.}}</translation> <translation id="5207949376430453814">Gqamisa ikharethi yombhalo</translation> <translation id="520840839826327499">I-<ph name="SERVICE_NAME" /> ifuna ukuhlola ukuthi ingabe usebenzisa idivayisi ye-ChromeOS efanele.</translation> <translation id="5208548918290612795">Ukugcina Ukufakazela ubuqiniso be-<ph name="WEB_DRIVE" /></translation> @@ -5305,6 +5299,7 @@ <translation id="6065289257230303064">Umkhombandlela wezichasiso zesihloko sesitifiketi</translation> <translation id="6066794465984119824">I-hash yomfanekiso ayisethiwe</translation> <translation id="6069464830445383022">I-akhawunti yakho ye-Google ingukungena kwakho ngemvume ku-Chromebook</translation> +<translation id="6070311415473175157">Khetha indawo yomfanekiso ozoyisesha</translation> <translation id="6071181508177083058">qinisekisa iphasiwedi</translation> <translation id="6071576563962215370">Isistimu ihlulekile ukusungula ukukhiya kwesichasiso kwesikhathi sokufaka sedivayisi.</translation> <translation id="6072442788591997866">I-<ph name="APP_NAME" /> ayivunyelwe kule divayisi. Xhumana nomlawuli wakho. Ikhodi yephutha: <ph name="ERROR_CODE" />.</translation> @@ -6250,7 +6245,6 @@ <translation id="6970861306198150268">Qiniseka ukuthi ulondoloza iphasiwedi yakho yamanje yaleli sayithi</translation> <translation id="6972180789171089114">Umsindo/Ividiyo</translation> <translation id="6972754398087986839">Qala</translation> -<translation id="6972887130317925583">Iphumelele ukushintsha iphasiwedi eyonakalisiwe. Hlola amaphasiwedi wakho noma kunini ku-<ph name="SETTINGS" />.</translation> <translation id="697312151395002334">Ivumelekile ukuthumela okwesikhashana nokusebenzisa ukuqondisa kabusha</translation> <translation id="6973611239564315524">Ukuthuthuka ku-Debian 10 (Buster) kuyatholakala</translation> <translation id="69739764870135975">Uma i-Google iphinda ibe yinjini yakho yokusesha ezenzakalelayo, uzobona iziphakamiso ezingcono, ezihambisana nomongo</translation> @@ -7137,6 +7131,7 @@ <translation id="7842692330619197998">Vakashela kokuthi g.co/ChromeEnterpriseAccount uma udinga ukudala i-akhawunti entsha.</translation> <translation id="78427265591841839">Sesha noma iyiphi ingxenye yekhasi nge-<ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="784273751836026224">Khipha i-Linux</translation> +<translation id="7842851769217535639">Khetha noma iyiphi ingxenye yekhasi ozoyicinga</translation> <translation id="7843786652787044762">Ngena ngemvume ku-<ph name="WEB_DRIVE" /></translation> <translation id="7844992432319478437">Ibuyekeza i-diff</translation> <translation id="7846634333498149051">Ikhibhodi</translation> @@ -7193,6 +7188,7 @@ <translation id="7893008570150657497">Finyelela kuzithombe, umculo, nenye imidiya kusuka kukhompyutha yakho</translation> <translation id="7893153962594818789">I-Bluetooth ivalekile kule <ph name="DEVICE_TYPE" />. Faka iphasiwedi yakho, bese uvule i-Bluetooth.</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (Okuzenzakalelayo)</translation> +<translation id="7896292361319775586">Londoloza i-<ph name="FILE" />?</translation> <translation id="789722939441020330">Ungavumeli amasayithi adawunilode amafayela amaningi ngokuzenzakalelayo</translation> <translation id="7897900149154324287">Ngokuzayo, qiniseka ukukhipha idivayisi yakho ekhiphekayo kuhlelo lokusebenza lwamafayela ngaphambi kokuyikhipha. Uma kungenjalo, ungalahlekelwa yidatha.</translation> <translation id="7898725031477653577">Humusha njalo</translation> @@ -8330,6 +8326,7 @@ <translation id="899403249577094719">I-URL yesisekelo sesitifiketi se-Netscape</translation> <translation id="899657321862108550">I-Chrome yakho, yonke indawo</translation> <translation id="899676909165543803">Inzwa yezigxivizo zeminwe ingukhiye osesandleni sokudla esingaphansi kukhibhodi yakho. Ithinte kancane nganoma imuphi umunwe.</translation> +<translation id="8998078711690114234">Lolu hlobo lwefayela lungaba yingozi. Londoloza leli fayela kuphela uma wethemba i-<ph name="ORIGIN" /></translation> <translation id="8999560016882908256">Iphutha lesigaba sesinthekisi: <ph name="ERROR_LINE" /></translation> <translation id="9003185744423389627">Ukuxhuma Kwiseva Yokuphathwa Kwedivayisi kwehlulekile ngesimo esithi '<ph name="STATUS_TEXT" />' ngo-<ph name="FAILURE_TIME" /></translation> <translation id="9003647077635673607">Vumela kuwo wonke amawebhusayithi</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 1c190435..f582230d 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -958,6 +958,8 @@ "optimization_guide/model_validator_keyed_service.h", "optimization_guide/model_validator_keyed_service_factory.cc", "optimization_guide/model_validator_keyed_service_factory.h", + "optimization_guide/optimization_guide_internals_ui.cc", + "optimization_guide/optimization_guide_internals_ui.h", "optimization_guide/optimization_guide_keyed_service.cc", "optimization_guide/optimization_guide_keyed_service.h", "optimization_guide/optimization_guide_keyed_service_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 17cf8d0..74453e9 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -8424,6 +8424,10 @@ {"u2f-security-key-api", flag_descriptions::kU2FSecurityKeyAPIName, flag_descriptions::kU2FSecurityKeyAPIDescription, kOsAll, FEATURE_VALUE_TYPE(extensions_features::kU2FSecurityKeyAPI)}, + {"load-cryptotoken-extension", + flag_descriptions::kLoadCryptoTokenExtensionName, + flag_descriptions ::kLoadCryptoTokenExtensionDescription, kOsAll, + FEATURE_VALUE_TYPE(extensions_features::kLoadCryptoTokenExtension)}, #endif // ENABLE_EXTENSIONS {"force-major-version-to-minor", flag_descriptions::kForceMajorVersionInMinorPositionInUserAgentName,
diff --git a/chrome/browser/accessibility/page_colors.cc b/chrome/browser/accessibility/page_colors.cc index 02461f6a..b32f8a15 100644 --- a/chrome/browser/accessibility/page_colors.cc +++ b/chrome/browser/accessibility/page_colors.cc
@@ -13,7 +13,9 @@ #include "ui/native_theme/native_theme.h" PageColors::PageColors(PrefService* profile_prefs) - : profile_prefs_(profile_prefs) {} + : profile_prefs_(profile_prefs) { + theme_observation_.Observe(ui::NativeTheme::GetInstanceForNativeUi()); +} PageColors::~PageColors() = default; // static @@ -22,6 +24,14 @@ registry->RegisterIntegerPref( prefs::kPageColors, ui::NativeTheme::PageColors::kOff, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref( + prefs::kApplyPageColorsOnlyOnIncreasedContrast, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); +#if BUILDFLAG(IS_WIN) + registry->RegisterBooleanPref( + prefs::kIsDefaultPageColorsOnHighContrast, true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); +#endif // BUILDFLAG(IS_WIN) } void PageColors::Init() { @@ -29,9 +39,42 @@ pref_change_registrar_.Add( prefs::kPageColors, base::BindRepeating(&PageColors::OnPageColorsChanged, weak_factory_.GetWeakPtr())); + pref_change_registrar_.Add( + prefs::kApplyPageColorsOnlyOnIncreasedContrast, + base::BindRepeating(&PageColors::OnPageColorsChanged, + weak_factory_.GetWeakPtr())); +#if BUILDFLAG(IS_WIN) + profile_prefs_->SetBoolean(prefs::kApplyPageColorsOnlyOnIncreasedContrast, + true); +#endif // BUILDFLAG(IS_WIN) + OnPageColorsChanged(); } void PageColors::OnPageColorsChanged() { + auto* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); + ui::NativeTheme::PageColors previous_page_colors = + native_theme->GetPageColors(); + ui::NativeTheme::PageColors current_page_colors = CalculatePageColors(); + + if (previous_page_colors == current_page_colors) + return; + +#if BUILDFLAG(IS_WIN) + if (native_theme->UserHasContrastPreference()) { + // When a user turns page colors 'Off' while high contrast is enabled at the + // OS level, the default of Page Colors changes from 'HighContrast' to + // 'Off'. + profile_prefs_->SetBoolean( + prefs::kIsDefaultPageColorsOnHighContrast, + current_page_colors != ui::NativeTheme::PageColors::kOff); + } +#endif // BUILDFLAG(IS_WIN) + native_theme->set_page_colors(current_page_colors); +} + +ui::NativeTheme::PageColors PageColors::CalculatePageColors() { + auto* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); + ui::NativeTheme::PageColors page_colors = static_cast<ui::NativeTheme::PageColors>( profile_prefs_->GetInteger(prefs::kPageColors)); @@ -39,6 +82,51 @@ DCHECK_GE(page_colors, ui::NativeTheme::PageColors::kOff); DCHECK_LE(page_colors, ui::NativeTheme::PageColors::kMaxValue); + bool only_on_increased_contrast = profile_prefs_->GetBoolean( + prefs::kApplyPageColorsOnlyOnIncreasedContrast); + + ui::NativeTheme::PageColors used_page_colors = page_colors; + // The used value of Page Colors should be 'Off' if + // kApplyPageColorsOnlyOnIncreasedContrast is true and the OS is not in an + // increased contrast mode. + if (only_on_increased_contrast && + !native_theme->UserHasContrastPreference()) { + used_page_colors = ui::NativeTheme::PageColors::kOff; + } + + return used_page_colors; +} + +void PageColors::OnPreferredContrastChanged() { +#if BUILDFLAG(IS_WIN) + ui::NativeTheme::PageColors page_colors = + static_cast<ui::NativeTheme::PageColors>( + profile_prefs_->GetInteger(prefs::kPageColors)); + + // Validating the page colors variable. + DCHECK_GE(page_colors, ui::NativeTheme::PageColors::kOff); + DCHECK_LE(page_colors, ui::NativeTheme::PageColors::kMaxValue); + auto* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); - native_theme->set_page_colors(page_colors); -} \ No newline at end of file + if (native_theme->UserHasContrastPreference()) { + // If increased contrast just got turned on and page colors is 'Off', the + // used value of Page Colors should be set to the default value which is + // either 'Off' or 'High Contrast'. + if (page_colors == ui::NativeTheme::PageColors::kOff) { + ui::NativeTheme::PageColors default_page_colors_on_high_contrast = + profile_prefs_->GetBoolean(prefs::kIsDefaultPageColorsOnHighContrast) + ? ui::NativeTheme::PageColors::kHighContrast + : ui::NativeTheme::PageColors::kOff; + profile_prefs_->SetInteger(prefs::kPageColors, + default_page_colors_on_high_contrast); + } + } else { + // If increased contrast just got turned off and page colors was 'High + // Contrast', the used value of Page Colors should be 'Off'. + if (page_colors == ui::NativeTheme::PageColors::kHighContrast) + profile_prefs_->SetInteger(prefs::kPageColors, + ui::NativeTheme::PageColors::kOff); + } +#endif // BUILDFLAG(IS_WIN) + OnPageColorsChanged(); +}
diff --git a/chrome/browser/accessibility/page_colors.h b/chrome/browser/accessibility/page_colors.h index 5be4ab4..4fa85b40 100644 --- a/chrome/browser/accessibility/page_colors.h +++ b/chrome/browser/accessibility/page_colors.h
@@ -7,18 +7,21 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/scoped_observation.h" #include "build/build_config.h" #include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_change_registrar.h" +#include "ui/native_theme/native_theme.h" namespace user_prefs { class PrefRegistrySyncable; } -// Manages the page colors feature, which simulates forced colors mode -// at the browser level. This tracks the per-profile preference and -// updates WebContents when the state of Page Colors changes. -class PageColors : public KeyedService { +// Manages the page colors feature, which simulates forced colors mode at the +// browser level. This tracks the per-profile preference and OS preferred +// contrast state from NativeTheme to update the WebContents Page Colors state +// based on any changes. +class PageColors : public KeyedService, public ui::NativeThemeObserver { public: explicit PageColors(PrefService* profile_prefs); PageColors(const PageColors&) = delete; @@ -36,6 +39,17 @@ // Handles when page colors preferences change. void OnPageColorsChanged(); + // This function makes use of different states such as the kPageColors, + // kApplyPageColorsOnlyOnIncreasedContrast and OS increased contrast state to + // calculate the used page colors. + ui::NativeTheme::PageColors CalculatePageColors(); + + // ui::NativeThemeObserver + void OnPreferredContrastChanged() override; + + base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver> + theme_observation_{this}; + PrefChangeRegistrar pref_change_registrar_; raw_ptr<PrefService> profile_prefs_;
diff --git a/chrome/browser/accessibility/page_colors_browsertest.cc b/chrome/browser/accessibility/page_colors_browsertest.cc index 5545d6ba..59b322c4 100644 --- a/chrome/browser/accessibility/page_colors_browsertest.cc +++ b/chrome/browser/accessibility/page_colors_browsertest.cc
@@ -30,6 +30,135 @@ browser()->profile()->GetPrefs()->SetInteger( prefs::kPageColors, ui::NativeTheme::PageColors::kDusk); +// Turning on increased contrast for Windows because the initial state of +// kApplyPageColorsOnlyOnIncreasedContrast on Windows is true. +#if BUILDFLAG(IS_WIN) + native_theme->SetPreferredContrast(ui::NativeTheme::PreferredContrast::kMore); +#endif page_colors_state = native_theme->GetPageColors(); EXPECT_EQ(page_colors_state, ui::NativeTheme::PageColors::kDusk); } + +// TODO(crbug.com/1231644): This test is failing on ChromeOS - appears to be a +// result of MultiDeviceSetupClientHolder leading to multiple Prefs getting +// created. May need to look into TestingProfile. +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_PageColorsCalculationWithIncreasedContrastToggle \ + DISABLED_PageColorsCalculationWithIncreasedContrastToggle +#else +#define MAYBE_PageColorsCalculationWithIncreasedContrastToggle \ + PageColorsCalculationWithIncreasedContrastToggle +#endif // BUILDFLAG(IS_CHROMEOS) +// When kApplyPageColorsOnlyOnIncreasedContrast is true but the OS is not in +// increased contrast, the page colors pref shouldn't be honored. +IN_PROC_BROWSER_TEST_F(PageColorsBrowserTest, + MAYBE_PageColorsCalculationWithIncreasedContrastToggle) { + auto* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); + ui::NativeTheme::PageColors page_colors_pref = + static_cast<ui::NativeTheme::PageColors>( + browser()->profile()->GetPrefs()->GetInteger(prefs::kPageColors)); + + // Should not honor the page colors pref if + // kApplyPageColorsOnlyOnIncreasedContrast is true and we're not in increased + // contrast. + EXPECT_FALSE(native_theme->UserHasContrastPreference()); + browser()->profile()->GetPrefs()->SetBoolean( + prefs::kApplyPageColorsOnlyOnIncreasedContrast, true); + browser()->profile()->GetPrefs()->SetInteger( + prefs::kPageColors, ui::NativeTheme::PageColors::kDusk); + page_colors_pref = static_cast<ui::NativeTheme::PageColors>( + browser()->profile()->GetPrefs()->GetInteger(prefs::kPageColors)); + ui::NativeTheme::PageColors page_colors_state = native_theme->GetPageColors(); + EXPECT_EQ(page_colors_pref, ui::NativeTheme::PageColors::kDusk); + EXPECT_EQ(page_colors_state, ui::NativeTheme::PageColors::kOff); + + // Page colors should be honored when kApplyPageColorsOnlyOnIncreasedContrast + // is true and we're in an increased contrast. + native_theme->SetPreferredContrast(ui::NativeTheme::PreferredContrast::kMore); + native_theme->NotifyOnNativeThemeUpdated(); + page_colors_state = native_theme->GetPageColors(); + EXPECT_EQ(page_colors_pref, page_colors_state); + + // Switching increased contrast back off should lead to us not honoring page + // colors since kApplyPageColorsOnlyOnIncreasedContrast is still true. + native_theme->SetPreferredContrast( + ui::NativeTheme::PreferredContrast::kNoPreference); + native_theme->NotifyOnNativeThemeUpdated(); + page_colors_state = native_theme->GetPageColors(); + EXPECT_EQ(page_colors_pref, ui::NativeTheme::PageColors::kDusk); + EXPECT_EQ(page_colors_state, ui::NativeTheme::PageColors::kOff); + + // Setting kApplyPageColorsOnlyOnIncreasedContrast to false should lead to us + // honoring page colors. + browser()->profile()->GetPrefs()->SetBoolean( + prefs::kApplyPageColorsOnlyOnIncreasedContrast, false); + page_colors_state = native_theme->GetPageColors(); + EXPECT_EQ(page_colors_pref, page_colors_state); +} + +#if BUILDFLAG(IS_WIN) +// Test default behaviour only for Windows when High Contrast gets switched +// on and page colors 'Off'. Default should be High contrast initially, unless +// the user changes it to 'Off' while in a HC state. +IN_PROC_BROWSER_TEST_F(PageColorsBrowserTest, PageColorsWithHighContrast) { + // Initially, expect kIsDefaultPageColorsOnHighContrast to be true. + ui::NativeTheme::PageColors page_colors_pref = + static_cast<ui::NativeTheme::PageColors>( + browser()->profile()->GetPrefs()->GetInteger(prefs::kPageColors)); + auto* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); + ui::NativeTheme::PageColors page_colors_state = native_theme->GetPageColors(); + bool is_default_page_colors_on_high_contrast = + browser()->profile()->GetPrefs()->GetBoolean( + prefs::kIsDefaultPageColorsOnHighContrast); + EXPECT_EQ(page_colors_state, page_colors_pref); + EXPECT_TRUE(is_default_page_colors_on_high_contrast); + + // When the OS High Contrast is turned on and Page Colors is 'Off', the used + // Page Colors should be 'High Contrast'. + native_theme->SetPreferredContrast(ui::NativeTheme::PreferredContrast::kMore); + page_colors_pref = static_cast<ui::NativeTheme::PageColors>( + browser()->profile()->GetPrefs()->GetInteger(prefs::kPageColors)); + page_colors_state = native_theme->GetPageColors(); + is_default_page_colors_on_high_contrast = + browser()->profile()->GetPrefs()->GetBoolean( + prefs::kIsDefaultPageColorsOnHighContrast); + EXPECT_TRUE(is_default_page_colors_on_high_contrast); + EXPECT_EQ(page_colors_pref, ui::NativeTheme::PageColors::kHighContrast); + EXPECT_EQ(page_colors_state, page_colors_pref); + + // When the OS High Contrast is turned off and Page Colors is 'High Contrast', + // the used Page Colors should be 'Off'. + native_theme->SetPreferredContrast( + ui::NativeTheme::PreferredContrast::kNoPreference); + page_colors_pref = static_cast<ui::NativeTheme::PageColors>( + browser()->profile()->GetPrefs()->GetInteger(prefs::kPageColors)); + page_colors_state = native_theme->GetPageColors(); + is_default_page_colors_on_high_contrast = + browser()->profile()->GetPrefs()->GetBoolean( + prefs::kIsDefaultPageColorsOnHighContrast); + EXPECT_TRUE(is_default_page_colors_on_high_contrast); + EXPECT_EQ(page_colors_pref, ui::NativeTheme::PageColors::kOff); + EXPECT_EQ(page_colors_state, page_colors_pref); + + // When kPageColors is 'Off' while High Contrast is on, + // kIsDefaultPageColorsOnHighContrast should be false. + native_theme->SetPreferredContrast(ui::NativeTheme::PreferredContrast::kMore); + browser()->profile()->GetPrefs()->SetInteger( + prefs::kPageColors, ui::NativeTheme::PageColors::kOff); + is_default_page_colors_on_high_contrast = + browser()->profile()->GetPrefs()->GetBoolean( + prefs::kIsDefaultPageColorsOnHighContrast); + EXPECT_FALSE(is_default_page_colors_on_high_contrast); + native_theme->SetPreferredContrast( + ui::NativeTheme::PreferredContrast::kNoPreference); + + // When the OS High Contrast is turned on next, and Page Colors is 'Off', the + // used Page Colors should be 'Off'. + native_theme->SetPreferredContrast(ui::NativeTheme::PreferredContrast::kMore); + page_colors_pref = static_cast<ui::NativeTheme::PageColors>( + browser()->profile()->GetPrefs()->GetInteger(prefs::kPageColors)); + page_colors_state = native_theme->GetPageColors(); + EXPECT_EQ(page_colors_pref, ui::NativeTheme::PageColors::kOff); + EXPECT_EQ(page_colors_state, page_colors_pref); +} +#endif // BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc index e6e5d547..0ed21efa 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
@@ -54,6 +54,7 @@ constexpr char kInstallReasonSyncHistogram[] = "Sync"; constexpr char kInstallReasonUserHistogram[] = "User"; constexpr char kInstallReasonSubAppHistogram[] = "SubApp"; +constexpr char kInstallReasonKioskHistogram[] = "Kiosk"; constexpr base::TimeDelta kMaxDuration = base::Days(1); @@ -98,6 +99,8 @@ return kInstallReasonUserHistogram; case apps::InstallReason::kSubApp: return kInstallReasonSubAppHistogram; + case apps::InstallReason::kKiosk: + return kInstallReasonKioskHistogram; } }
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 7fd024f..a15b943 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/media/media_engagement_score_details.mojom.h" #include "chrome/browser/navigation_predictor/anchor_element_preloader.h" #include "chrome/browser/navigation_predictor/navigation_predictor.h" +#include "chrome/browser/optimization_guide/optimization_guide_internals_ui.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/predictors/network_hints_handler_impl.h" #include "chrome/browser/preloading/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h" @@ -63,7 +64,6 @@ #include "components/live_caption/pref_names.h" #include "components/no_state_prefetch/browser/no_state_prefetch_contents.h" #include "components/no_state_prefetch/browser/no_state_prefetch_processor_impl.h" -#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h" #include "components/payments/content/payment_credential_factory.h" #include "components/performance_manager/embedder/binders.h" #include "components/performance_manager/public/performance_manager.h"
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc index c6653c7..ac8934f 100644 --- a/chrome/browser/chrome_content_browser_client_browsertest.cc +++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -419,7 +419,7 @@ }; IN_PROC_BROWSER_TEST_P(PrefersContrastTest, PrefersContrast) { - test_theme_.set_preferred_contrast(GetParam()); + test_theme_.SetPreferredContrast(GetParam()); browser() ->tab_strip_model() ->GetActiveWebContents()
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 51e8ba0..1671f56 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -414,6 +414,8 @@ return api::autotest_private::AppInstallSource::APP_INSTALL_SOURCE_USER; case apps::InstallReason::kSubApp: return api::autotest_private::AppInstallSource::APP_INSTALL_SOURCE_SUBAPP; + case apps::InstallReason::kKiosk: + return api::autotest_private::AppInstallSource::APP_INSTALL_SOURCE_KIOSK; } NOTREACHED(); return api::autotest_private::AppInstallSource::APP_INSTALL_SOURCE_NONE;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 975ded25..75c5655 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -4189,6 +4189,11 @@ "expiry_milestone": -1 }, { + "name": "load-cryptotoken-extension", + "owners": [ "martinkr", "chrome-webauthn" ], + "expiry_milestone": 108 + }, + { "name": "location-bar-model-optimizations", "owners": [ "pnoland@google.com"], "expiry_milestone": 105
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index e4c3c7e3..07cd904 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -235,6 +235,14 @@ "information, refer to the deprecation announcement at " "https://groups.google.com/a/chromium.org/g/blink-dev/c/xHC3AtU_65A"; +const char kLoadCryptoTokenExtensionName[] = + "Load the CryptoToken component extension "; +const char kLoadCryptoTokenExtensionDescription[] = + "Enable this flag to temporarily work around issues with `chrome.runtime` " + "being undefined as a side effect of U2F API removal. This workaround " + "will go away with Chrome 107. Websites should not depend on " + "`chrome.runtime` or `chrome.app` being defined unconditionally."; + const char kUpcomingSharingFeaturesName[] = "Enable upcoming sharing features."; const char kUpcomingSharingFeaturesDescription[] = "This flag enables all upcoming sharing features, in the experiment "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 2130dc7..9c8377a 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -156,6 +156,9 @@ extern const char kU2FSecurityKeyAPIName[]; extern const char kU2FSecurityKeyAPIDescription[]; +extern const char kLoadCryptoTokenExtensionName[]; +extern const char kLoadCryptoTokenExtensionDescription[]; + extern const char kUpcomingSharingFeaturesName[]; extern const char kUpcomingSharingFeaturesDescription[];
diff --git a/chrome/browser/media/webrtc/desktop_media_picker.h b/chrome/browser/media/webrtc/desktop_media_picker.h index 040ef8f..908a35e 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker.h +++ b/chrome/browser/media/webrtc/desktop_media_picker.h
@@ -76,6 +76,10 @@ // policies that may restrict the available choices, and a suitable warning // should be shown to the user. bool restricted_by_policy = false; + // Indicate which display surface should be most prominently offered in the + // picker. + blink::mojom::PreferredDisplaySurface preferred_display_surface = + blink::mojom::PreferredDisplaySurface::NO_PREFERENCE; }; // Creates a picker dialog/confirmation box depending on the value of
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc index df63803..313da4e 100644 --- a/chrome/browser/media/webrtc/display_media_access_handler.cc +++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -354,6 +354,8 @@ pending_request.request.exclude_system_audio; picker_params.restricted_by_policy = (capture_level != AllowedScreenCaptureLevel::kUnrestricted); + picker_params.preferred_display_surface = + pending_request.request.preferred_display_surface; pending_request.picker->Show(picker_params, std::move(source_lists), std::move(done_callback)); }
diff --git a/chrome/browser/optimization_guide/optimization_guide_internals_page_browsertest.cc b/chrome/browser/optimization_guide/optimization_guide_internals_page_browsertest.cc index 97a26db..9d65c02a 100644 --- a/chrome/browser/optimization_guide/optimization_guide_internals_page_browsertest.cc +++ b/chrome/browser/optimization_guide/optimization_guide_internals_page_browsertest.cc
@@ -3,23 +3,29 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "base/run_loop.h" +#include "base/strings/strcat.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/optimization_guide/browser_test_util.h" +#include "chrome/browser/optimization_guide/optimization_guide_internals_ui.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/webui/webui_util.h" +#include "chrome/common/chrome_paths.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/mojo_web_ui_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/optimization_guide/core/model_util.h" #include "components/optimization_guide/core/optimization_guide_features.h" #include "components/optimization_guide/core/optimization_guide_logger.h" #include "components/optimization_guide/core/optimization_guide_switches.h" -#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h" #include "components/optimization_guide/optimization_guide_internals/webui/url_constants.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_controller_factory.h" @@ -53,14 +59,10 @@ const GURL& url) override { if (url.host_piece() == optimization_guide_internals::kChromeUIOptimizationGuideInternalsHost) { - Profile* profile = Profile::FromWebUI(web_ui); return std::make_unique<OptimizationGuideInternalsUI>( - web_ui, - OptimizationGuideKeyedServiceFactory::GetForProfile(profile) - ->GetOptimizationGuideLogger(), - base::BindOnce(&SetUpWebUIDataSource, web_ui, - optimization_guide_internals:: - kChromeUIOptimizationGuideInternalsHost)); + web_ui, base::BindOnce(&SetUpWebUIDataSource, web_ui, + optimization_guide_internals:: + kChromeUIOptimizationGuideInternalsHost)); } return nullptr; @@ -82,6 +84,31 @@ } }; +class ModelFileObserver + : public optimization_guide::OptimizationTargetModelObserver { + public: + using ModelFileReceivedCallback = + base::OnceCallback<void(optimization_guide::proto::OptimizationTarget, + const optimization_guide::ModelInfo&)>; + + ModelFileObserver() = default; + ~ModelFileObserver() override = default; + + void set_model_file_received_callback(ModelFileReceivedCallback callback) { + file_received_callback_ = std::move(callback); + } + + void OnModelUpdated( + optimization_guide::proto::OptimizationTarget optimization_target, + const optimization_guide::ModelInfo& model_info) override { + if (file_received_callback_) + std::move(file_received_callback_).Run(optimization_target, model_info); + } + + private: + ModelFileReceivedCallback file_received_callback_; +}; + } // namespace class OptimizationGuideInternalsPageBrowserTest : public MojoWebUIBrowserTest { @@ -101,7 +128,49 @@ kChromeUIOptimizationGuideInternalsHost)))); } + void NavigateToInternalsModelsPage() { + EXPECT_TRUE(ui_test_utils::NavigateToURL( + browser(), GURL(content::GetWebUIURLString( + optimization_guide_internals:: + kChromeUIOptimizationGuideInternalsHost) + + "/#models"))); + } + protected: + void TriggerModelDownloadForOptimizationTarget( + optimization_guide::proto::OptimizationTarget optimization_target) { + base::RunLoop run_loop; + ModelFileObserver model_file_observer; + + model_file_observer.set_model_file_received_callback( + base::BindLambdaForTesting( + [&run_loop](optimization_guide::proto::OptimizationTarget + optimization_target, + const optimization_guide::ModelInfo& model_info) { + base::ScopedAllowBlockingForTesting scoped_allow_blocking; + + EXPECT_EQ(123, model_info.GetVersion()); + EXPECT_TRUE(model_info.GetModelFilePath().IsAbsolute()); + EXPECT_TRUE(base::PathExists(model_info.GetModelFilePath())); + + EXPECT_EQ(1U, model_info.GetAdditionalFiles().size()); + for (const base::FilePath& add_file : + model_info.GetAdditionalFiles()) { + EXPECT_TRUE(add_file.IsAbsolute()); + EXPECT_TRUE(base::PathExists(add_file)); + } + + run_loop.Quit(); + })); + + OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile()) + ->AddObserverForOptimizationTargetModel( + optimization_target, + /*model_metadata=*/absl::nullopt, &model_file_observer); + + run_loop.Run(); + } + std::unique_ptr<TestWebUIControllerFactory> factory_; base::test::ScopedFeatureList feature_list_; }; @@ -167,3 +236,58 @@ }, 500); });)")); } + +// Verifies downloaded models are added when #models page is open. +IN_PROC_BROWSER_TEST_F(OptimizationGuideInternalsPageBrowserTest, + InternalsModelsPageOpen) { + auto* logger = + OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile()) + ->GetOptimizationGuideLogger(); + EXPECT_FALSE(logger->ShouldEnableDebugLogs()); + + base::CommandLine::ForCurrentProcess()->AppendSwitch( + optimization_guide::switches::kDebugLoggingEnabled); + + EXPECT_TRUE(logger->ShouldEnableDebugLogs()); + + base::FilePath src_dir; + base::PathService::Get(chrome::DIR_TEST_DATA, &src_dir); + + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + optimization_guide::switches::kModelOverride, + base::StrCat({ + "OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD", + optimization_guide::ModelOverrideSeparator(), + optimization_guide::FilePathToString( + src_dir.AppendASCII("optimization_guide") + .AppendASCII("additional_file_exists.crx3")), + })); + + NavigateToInternalsPage(); + TriggerModelDownloadForOptimizationTarget( + optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD); + + NavigateToInternalsModelsPage(); + content::WebContents* internals_models_page_web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + // Verify that the downloaded model is added to the UI. + EXPECT_EQ(true, EvalJs(internals_models_page_web_contents, R"( + new Promise(resolve => { + setTimeout(() => { + const container = + document.getElementById('downloaded-models-container'); + if (container.children[0].childElementCount > 0) + resolve(true); + }, 500); + });)")); + EXPECT_EQ(true, EvalJs(internals_models_page_web_contents, R"( + new Promise(resolve => { + setTimeout(() => { + const tableRow = + document.getElementById('OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD'); + if (tableRow) + resolve(true); + }, 500); + });)")); +}
diff --git a/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc b/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc new file mode 100644 index 0000000..c4ef992f --- /dev/null +++ b/chrome/browser/optimization_guide/optimization_guide_internals_ui.cc
@@ -0,0 +1,78 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/optimization_guide/optimization_guide_internals_ui.h" + +#include <memory> +#include <vector> + +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "components/grit/optimization_guide_internals_resources.h" +#include "components/grit/optimization_guide_internals_resources_map.h" +#include "components/optimization_guide/core/prediction_manager.h" +#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom.h" +#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_page_handler_impl.h" + +// static +OptimizationGuideInternalsUI* +OptimizationGuideInternalsUI::MaybeCreateOptimizationGuideInternalsUI( + content::WebUI* web_ui, + SetupWebUIDataSourceCallback set_up_data_source_callback) { + Profile* profile = Profile::FromWebUI(web_ui); + auto* service = OptimizationGuideKeyedServiceFactory::GetForProfile(profile); + if (!service) + return nullptr; + return new OptimizationGuideInternalsUI( + web_ui, std::move(set_up_data_source_callback)); +} + +OptimizationGuideInternalsUI::OptimizationGuideInternalsUI( + content::WebUI* web_ui, + SetupWebUIDataSourceCallback set_up_data_source_callback) + : MojoWebUIController(web_ui, /*enable_chrome_send=*/true) { + std::move(set_up_data_source_callback) + .Run(base::make_span(kOptimizationGuideInternalsResources, + kOptimizationGuideInternalsResourcesSize), + IDR_OPTIMIZATION_GUIDE_INTERNALS_OPTIMIZATION_GUIDE_INTERNALS_HTML); +} + +OptimizationGuideInternalsUI::~OptimizationGuideInternalsUI() = default; + +void OptimizationGuideInternalsUI::BindInterface( + mojo::PendingReceiver< + optimization_guide_internals::mojom::PageHandlerFactory> receiver) { + // TODO(https://crbug.com/1297362): Remove the reset which is needed now since + // |this| is reused on internals page reloads. + optimization_guide_internals_page_factory_receiver_.reset(); + optimization_guide_internals_page_factory_receiver_.Bind(std::move(receiver)); +} + +void OptimizationGuideInternalsUI::CreatePageHandler( + mojo::PendingRemote<optimization_guide_internals::mojom::Page> page) { + Profile* profile = Profile::FromWebUI(web_ui()); + auto* service = OptimizationGuideKeyedServiceFactory::GetForProfile(profile); + DCHECK(service); + OptimizationGuideLogger* optimization_guide_logger = + service->GetOptimizationGuideLogger(); + optimization_guide_internals_page_handler_ = + std::make_unique<OptimizationGuideInternalsPageHandlerImpl>( + std::move(page), optimization_guide_logger); +} + +void OptimizationGuideInternalsUI::RequestDownloadedModelsInfo( + RequestDownloadedModelsInfoCallback callback) { + Profile* profile = Profile::FromWebUI(web_ui()); + auto* service = OptimizationGuideKeyedServiceFactory::GetForProfile(profile); + DCHECK(service); + optimization_guide::PredictionManager* prediction_manager = + service->GetPredictionManager(); + std::vector<optimization_guide_internals::mojom::DownloadedModelInfoPtr> + downloaded_models_info = + prediction_manager->GetDownloadedModelsInfoForWebUI(); + std::move(callback).Run(std::move(downloaded_models_info)); +} + +WEB_UI_CONTROLLER_TYPE_IMPL(OptimizationGuideInternalsUI)
diff --git a/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h b/chrome/browser/optimization_guide/optimization_guide_internals_ui.h similarity index 71% rename from components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h rename to chrome/browser/optimization_guide/optimization_guide_internals_ui.h index 4421de7..9c2ef7c 100644 --- a/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h +++ b/chrome/browser/optimization_guide/optimization_guide_internals_ui.h
@@ -2,16 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_INTERNALS_WEBUI_OPTIMIZATION_GUIDE_INTERNALS_UI_H_ -#define COMPONENTS_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_INTERNALS_WEBUI_OPTIMIZATION_GUIDE_INTERNALS_UI_H_ +#ifndef CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_INTERNALS_UI_H_ +#define CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_INTERNALS_UI_H_ +#include "base/callback.h" #include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "ui/base/webui/resource_path.h" #include "ui/webui/mojo_web_ui_controller.h" -class OptimizationGuideLogger; class OptimizationGuideInternalsPageHandlerImpl; +namespace content { +class WebUI; +} // namespace content // The WebUI controller for chrome://optimization-guide-internals. class OptimizationGuideInternalsUI @@ -22,9 +25,14 @@ base::OnceCallback<void(base::span<const webui::ResourcePath> resources, int default_resource)>; + // Constructs and returns an instance of this class if + // OptimizationGuideKeyedService is valid, else returns nullptr. + static OptimizationGuideInternalsUI* MaybeCreateOptimizationGuideInternalsUI( + content::WebUI* web_ui, + SetupWebUIDataSourceCallback set_up_data_source_callback); + explicit OptimizationGuideInternalsUI( content::WebUI* web_ui, - OptimizationGuideLogger* optimization_guide_logger, SetupWebUIDataSourceCallback set_up_data_source_callback); ~OptimizationGuideInternalsUI() override; @@ -41,19 +49,15 @@ void CreatePageHandler( mojo::PendingRemote<optimization_guide_internals::mojom::Page> page) override; + void RequestDownloadedModelsInfo( + RequestDownloadedModelsInfoCallback callback) override; std::unique_ptr<OptimizationGuideInternalsPageHandlerImpl> optimization_guide_internals_page_handler_; mojo::Receiver<optimization_guide_internals::mojom::PageHandlerFactory> optimization_guide_internals_page_factory_receiver_{this}; - // Logger to receive the debug logs from the optimization guide service. Not - // owned. Guaranteed to outlive |this|, since the logger is owned by the - // optimization guide keyed service, while |this| is part of - // RenderFrameHostImpl::WebUIImpl. - raw_ptr<OptimizationGuideLogger> optimization_guide_logger_; - WEB_UI_CONTROLLER_TYPE_DECL(); }; -#endif // COMPONENTS_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_INTERNALS_WEBUI_OPTIMIZATION_GUIDE_INTERNALS_UI_H_ +#endif // CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_INTERNALS_UI_H_
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h index dc7525c..e2099b3 100644 --- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h +++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
@@ -143,6 +143,7 @@ friend class optimization_guide::PredictionModelDownloadClient; friend class optimization_guide::PredictionManagerBrowserTestBase; friend class optimization_guide::android::OptimizationGuideBridge; + friend class OptimizationGuideInternalsUI; // Initializes |this|. void Initialize();
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc index 9e8cdee6..00f68b6 100644 --- a/chrome/browser/themes/theme_service_unittest.cc +++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -245,7 +245,7 @@ color_scheme = ui::NativeTheme::ColorScheme::kPlatformHighContrast; native_theme_->set_forced_colors(high_contrast); #endif // BUILDFLAG(IS_WIN) - native_theme_->set_preferred_contrast( + native_theme_->SetPreferredContrast( high_contrast ? ui::NativeTheme::PreferredContrast::kMore : ui::NativeTheme::PreferredContrast::kNoPreference); native_theme_->set_use_dark_colors(color_scheme == @@ -274,7 +274,7 @@ void TearDown() override { // Restore the original NativeTheme parameters. native_theme_->set_forced_colors(original_forced_colors_); - native_theme_->set_preferred_contrast(original_preferred_contrast_); + native_theme_->SetPreferredContrast(original_preferred_contrast_); native_theme_->set_use_dark_colors(original_should_use_dark_colors_); native_theme_->NotifyOnNativeThemeUpdated(); ThemeServiceTest::TearDown();
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index c111d066..e1b1491 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -4920,6 +4920,8 @@ "views/side_search/side_search_browser_controller.h", "views/side_search/side_search_icon_view.cc", "views/side_search/side_search_icon_view.h", + "views/side_search/side_search_views_utils.cc", + "views/side_search/side_search_views_utils.h", "views/side_search/unified_side_search_controller.cc", "views/side_search/unified_side_search_controller.h", "views/side_search/unified_side_search_helper.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 98f55f8..14e4b619 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
@@ -557,6 +557,7 @@ <translation id="4062305924942672200">Regsinligting</translation> <translation id="4084682180776658562">Boekmerk</translation> <translation id="4084712963632273211">Vanaf <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />afgelewer deur Google<ph name="END_DEEMPHASIZED" /></translation> +<translation id="409109920254068737">Jy kan hierdie tablet gebruik om op die toestel aan te meld wat hierdie QR-kode wys.</translation> <translation id="4095146165863963773">Vee programdata uit?</translation> <translation id="4096227151372679484">Boekmerkstoorvloei is teen halwe hoogte oopgemaak</translation> <translation id="4099578267706723511">Help om Chrome te verbeter deur gebruikstatistiek en omvalverslae na Google te stuur.</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Watter data gebruik word:<ph name="END_BOLD" /> Jou blaaigeskiedenis, 'n rekord van werwe wat jy besoek het deur Chrome op hierdie toestel te gebruik.</translation> <translation id="4263656433980196874">Assistent-stemsoektog se instemming-UI is teen volle hoogte oopgemaak</translation> <translation id="4269820728363426813">Kopieer skakeladres</translation> +<translation id="4283102315569707115">Versoek rekenaarwerwe by verstek?</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Skakel skermslot in Android-instellings aan<ph name="END_LINK" /></translation> <translation id="4293476595220860475">Deur Chrome te gebruik, stem jy in tot <ph name="BEGIN_TOS_LINK" />Google se diensbepalings<ph name="END_TOS_LINK" /> en <ph name="BEGIN_ATOS_LINK" />Google Chrome en Chrome-bedryfstelsel se bykomende diensbepalings<ph name="END_ATOS_LINK" />. Die <ph name="BEGIN_PRIVACY_LINK" />privaatheidsbeleid<ph name="END_PRIVACY_LINK" /> geld ook.</translation> <translation id="4296252229500326964">Nuwe Incognito-oortjie</translation> @@ -970,6 +972,7 @@ <translation id="6342069812937806050">Nou net</translation> <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" /> \u2026 en nog <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" />}other{<ph name="SHIPPING_ADDRESS_PREVIEW" /> \u2026 en nog <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" />}}</translation> <translation id="6345878117466430440">Merk as gelees</translation> +<translation id="6357653805084533597">Jy kan hierdie foon gebruik om op die toestel aan te meld wat hierdie QR-kode wys.</translation> <translation id="6363990818884053551">Verifieer dis jy om sinkronisering te begin</translation> <translation id="6364438453358674297">Verwyder voorstel uit geskiedenis?</translation> <translation id="6380100320871303656">Laai meer gereeld bladsye vooraf wat Chrome dink jy waarskynlik gaan besoek. Hierdie instelling kan groter datagebruik tot gevolg hê.</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 95923c7d7..5f364d13 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
@@ -433,6 +433,7 @@ <translation id="3290249595466894471">Also sends a small sample of pages, downloads, extension activity and system information to help discover new threats</translation> <translation id="3297344142967351106">Voice assistance</translation> <translation id="3303414029551471755">Proceed to download the content?</translation> +<translation id="3305795716056605962">Translate pages from the More Options button</translation> <translation id="3334729583274622784">Change file extension?</translation> <translation id="3341262203274374114">Can’t unfollow. Something went wrong.</translation> <translation id="3359667936385849800">Use your current service provider</translation> @@ -1265,6 +1266,7 @@ <translation id="7853202427316060426">Activity</translation> <translation id="7857691613771368249">Ask when to save files</translation> <translation id="7859988229622350291">Never translate</translation> +<translation id="7866213166286285359">Translate pages here</translation> <translation id="78707286264420418"><ph name="PRODUCT_NAME" /> needs Nearby devices permission in order to connect to your device</translation> <translation id="7875915731392087153">Create email</translation> <translation id="7876243839304621966">Remove all</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 6cbacc8..2f29c34a 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
@@ -986,6 +986,7 @@ <translation id="6397616442223433927">De nouveau en ligne</translation> <translation id="6401458660421980302">Pour envoyer cet onglet vers un autre appareil, connectez-vous à Chrome sur ce dernier</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> sur <ph name="VIOLATED_URL" /></translation> +<translation id="6403371459378431832">Synchronisez vos données sur tous les appareils</translation> <translation id="6404511346730675251">Modifier le favori</translation> <translation id="6406506848690869874">Synchronisation</translation> <translation id="6407224748847589805">Impossible d'établir la connexion avec votre ordinateur. Essayez avec une autre option de vérification.</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 648bc94e..ed4c47a 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
@@ -983,6 +983,7 @@ <translation id="6397616442223433927">Ismét online</translation> <translation id="6401458660421980302">Ha szeretné elküldeni ezt a lapot másik eszközre, jelentkezzen be a Chrome-ba az adott eszközön</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" />, <ph name="VIOLATED_URL" /></translation> +<translation id="6403371459378431832">Az összes eszközén szinkronizálhatja adatait</translation> <translation id="6404511346730675251">Könyvjelző szerkesztése</translation> <translation id="6406506848690869874">Szinkronizálás</translation> <translation id="6407224748847589805">Nem lehet csatlakozni a számítógépéhez. Próbálkozzon másik ellenőrzési módszerrel.</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 f05c11f..390831c9 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
@@ -985,6 +985,7 @@ <translation id="6397616442223433927">ಆನ್ಲೈನ್ಗೆ ಮರಳಿದ್ದೀರಿ</translation> <translation id="6401458660421980302">ಈ ಟ್ಯಾಬ್ ಅನ್ನು ಬೇರೊಂದು ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲು, ಅಲ್ಲಿ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="6402652558933147609"><ph name="VIOLATED_URL" /> ನಲ್ಲಿ <ph name="ERROR_CODE" /></translation> +<translation id="6403371459378431832">ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="6404511346730675251">ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="6406506848690869874">ಸಿಂಕ್</translation> <translation id="6407224748847589805">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬೇರೊಂದು ಪರಿಶೀಲನೆ ಆಯ್ಕೆಯನ್ನು ಪ್ರಯತ್ನಿಸಿ.</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 e385096..1a4e2d8 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
@@ -433,6 +433,7 @@ <translation id="3290249595466894471">Lai palīdzētu atklāt jaunus draudus, tiek nosūtīti arī nelieli datu paraugi, kas ietver lapas, lejupielādes, paplašinājumu aktivitāti un sistēmas informāciju.</translation> <translation id="3297344142967351106">Balss palīgs</translation> <translation id="3303414029551471755">Vai turpināt ar satura lejupielādi?</translation> +<translation id="3305795716056605962">Lai tulkotu lapas, izmantojiet pogu Citas opcijas</translation> <translation id="3334729583274622784">Vai mainīt faila paplašinājumu?</translation> <translation id="3341262203274374114">Nevar pārtraukt sekošanu. Radās kļūda.</translation> <translation id="3359667936385849800">Izmantot pašreizējo pakalpojumu sniedzēju</translation> @@ -1264,6 +1265,7 @@ <translation id="7853202427316060426">Aktivitāte</translation> <translation id="7857691613771368249">Vaicāt, kad saglabāt failus</translation> <translation id="7859988229622350291">Nekad netulkot</translation> +<translation id="7866213166286285359">Šeit varat tulkot lapas</translation> <translation id="78707286264420418">Pārlūkam <ph name="PRODUCT_NAME" /> ir nepieciešama atļauja “Tuvumā esošās ierīces”, lai varētu izveidot savienojumu ar jūsu ierīci.</translation> <translation id="7875915731392087153">Izveidojiet e-pasta ziņojumu.</translation> <translation id="7876243839304621966">Noņemt visu</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 8836cfdd..902e9678 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
@@ -557,6 +557,7 @@ <translation id="4062305924942672200">တရားဝင် သိသင့်စရာများ</translation> <translation id="4084682180776658562">စာညှပ်</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> မှ – <ph name="BEGIN_DEEMPHASIZED" />Google က ဖြန့်ချိပေးခြင်းဖြစ်သည်<ph name="END_DEEMPHASIZED" /></translation> +<translation id="409109920254068737">ဤ QR ကုဒ် ပြထားသောစက်တွင် လက်မှတ်ထိုးဝင်ရန် ဤတက်ဘလက်ကို သုံးနိုင်သည်။</translation> <translation id="4095146165863963773">အက်ပ်ဒေတာကို ဖျက်မလား။</translation> <translation id="4096227151372679484">လိပ်စာသိမ်းရန် လုပ်ငန်းစဉ်ကို မြင်ကွင်းတစ်ဝက်ဖွင့်ထားသည်</translation> <translation id="4099578267706723511">အသုံးပြုမှု စာရင်းအင်းများ နှင့် ပျက်စီးမှု အစီရင်ခံစာများကို Google သို့ အလိုအလျောက် ပို့ပေးခြင်းဖြင့် Chrome ကို ပိုကောင်းမွန်အောင် ကူညီပေးပါ။</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />အသုံးပြုသည့် ဒေတာ-<ph name="END_BOLD" /> ဤစက်တွင် Chrome အသုံးပြု၍ သင်ဝင်ကြည့်ထားသော ဝဘ်ဆိုက်မှတ်တမ်းတစ်ခုဖြစ်သည့် သင်၏ ကြည့်ရှုခြင်းမှတ်တမ်း။</translation> <translation id="4263656433980196874">Assistant အသံဖြင့်ရှာဖွေခြင်း သဘောတူညီချက် ui ကို မြင်ကွင်းအပြည့်ဖွင့်ထားသည်</translation> <translation id="4269820728363426813">လင့် လိပ်စာ ကူးယူရန်</translation> +<translation id="4283102315569707115">ဒက်စ်တော့ဝဘ်ဆိုက်များကို မူရင်းသတ်မှတ်ချက်အနေဖြင့် တောင်းဆိုမလား။</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android ဆက်တင်များတွင် ဖန်သားပြင်လော့ခ်ဖွင့်ရန်<ph name="END_LINK" /></translation> <translation id="4293476595220860475">Chrome အသုံးပြုခြင်းဖြင့် သင်သည် <ph name="BEGIN_TOS_LINK" />Google ဝန်ဆောင်မှုစည်းမျဉ်းများ<ph name="END_TOS_LINK" /> နှင့် <ph name="BEGIN_ATOS_LINK" />Google Chrome နှင့် ChromeOS ထပ်တိုး ဝန်ဆောင်မှုစည်းမျဉ်းများ<ph name="END_ATOS_LINK" /> ကို သဘောတူရာရောက်သည်။ <ph name="BEGIN_PRIVACY_LINK" />ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒ<ph name="END_PRIVACY_LINK" /> အတွက်လည်း အကျုံးဝင်သည်။</translation> <translation id="4296252229500326964">ရုပ်ဖျက်တဘ် အသစ်</translation> @@ -969,6 +971,7 @@ <translation id="6342069812937806050">ယခုပင်</translation> <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 နှင့် နောက်ထပ် <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ခု}other{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 နှင့် နောက်ထပ် <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ခု}}</translation> <translation id="6345878117466430440">ဖတ်ပြီးဟု မှတ်သားရန်</translation> +<translation id="6357653805084533597">ဤ QR ကုဒ် ပြထားသောစက်တွင် လက်မှတ်ထိုးဝင်ရန် ဤဖုန်းကို သုံးနိုင်သည်။</translation> <translation id="6363990818884053551">စင့်ခ်စတင်ရန် သင်ဖြစ်ကြောင်းအတည်ပြုပါ</translation> <translation id="6364438453358674297">အကြံပေးချက်ကို မှတ်တမ်း ထဲမှ ဖယ်ရှားမလား?</translation> <translation id="6380100320871303656">Chrome က သင်ဝင်ကြည့်လိုသည်ဟု ထင်သည့် စာမျက်နှာများကို မကြာခဏ ကြိုဖွင့်ပေးသည်။ ဤဆက်တင်သည် ဒေတာအသုံးပြုမှု များသွားစေနိုင်ပါသည်။</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 5403e9c4..e55c73a 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
@@ -557,6 +557,7 @@ <translation id="4062305924942672200">कानूनी जानकारी</translation> <translation id="4084682180776658562">बुकमार्क</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> द्वारा – <ph name="BEGIN_DEEMPHASIZED" />Google ले डेलिभर गरेको<ph name="END_DEEMPHASIZED" /></translation> +<translation id="409109920254068737">तपाईं यो QR कोड देखिइरहेको डिभाइसमा साइन इन गर्न यो ट्याब्लेट प्रयोग गर्न सक्नुहुन्छ।</translation> <translation id="4095146165863963773">एपको डेटा मेट्ने हो?</translation> <translation id="4096227151372679484">बुकमार्क सेभ गर्ने फ्लो स्क्रिनको आधा भाग ओगट्ने गरी खोलिएको छ</translation> <translation id="4099578267706723511">Google मा प्रयोग तथ्याङ्क र क्रयास रिपोर्टहरू पठाएर Chrome लाई राम्रो बनाउन सहयोग गर्नुहोस्!</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />कस्ता खालका डेटा प्रयोग गरिन्छ:<ph name="END_BOLD" /> तपाईंको ब्राउजिङ इतिहास अर्थात् तपाईंले यो डिभाइसमा Chrome प्रयोग गरी खोलेका साइटहरूको रेकर्ड।</translation> <translation id="4263656433980196874">सहायकको प्रयोग गरी भ्वाइस सर्च गर्ने कुराको सहमति लिने UI पूर्ण उचाइमा खोलिएको छ</translation> <translation id="4269820728363426813">लिङ्क ठेगाना कपी गर्नुहोस्</translation> +<translation id="4283102315569707115">स्वतः डेस्कटप साइट खोलिदिन अनुरोध गर्ने हो?</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android का सेटिङमा गई स्क्रिन लक अन गर्नुहोस्<ph name="END_LINK" /></translation> <translation id="4293476595220860475">तपाईंले Chrome चलाउनुभयो भने तपाईं <ph name="BEGIN_TOS_LINK" />Google का सेवाका सर्त<ph name="END_TOS_LINK" /> र <ph name="BEGIN_ATOS_LINK" />Google Chrome तथा ChromeOS का सेवाका अतिरिक्त सर्तहरू<ph name="END_ATOS_LINK" />मा सहमति जनाउनुहुन्छ भन्ने अर्थ लाग्छ। यसका साथै, <ph name="BEGIN_PRIVACY_LINK" />गोपनीयता नीति<ph name="END_PRIVACY_LINK" /> पनि लागू हुन्छ।</translation> <translation id="4296252229500326964">नयाँ इन्कोग्निटो ट्याब</translation> @@ -969,6 +971,7 @@ <translation id="6342069812937806050">अहिले भर्खर</translation> <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 र <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> थप}other{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 र <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> थप}}</translation> <translation id="6345878117466430440">पढिसकिएको सामग्रीका रूपमा चिन्ह लगाउनुहोस्</translation> +<translation id="6357653805084533597">तपाईं यो QR कोड देखिइरहेको डिभाइसमा साइन इन गर्न यो फोन प्रयोग गर्न सक्नुहुन्छ।</translation> <translation id="6363990818884053551">सिंक गर्ने कार्य सुरु गर्न यो काम गर्न खोज्ने व्यक्ति तपाईं नै हो भन्ने कुरा पुष्टि गर्नुहोस्</translation> <translation id="6364438453358674297">इतिहासबाट सुझाव हटाउने?</translation> <translation id="6380100320871303656">यो मोड अन हुँदा Chrome लाई तपाईं जुन जुन पेज खोल्न सक्नुहुन्छ भन्ने लाग्छ ती पेज अझ छिटो अन्तरालमा प्रिलोड गरेर राखिन्छ। यो सेटिङ अन हुँदा बढी डेटा प्रयोग हुन सक्छ।</translation> @@ -982,6 +985,7 @@ <translation id="6397616442223433927">यन्त्र फेरि अनलाइन भयो</translation> <translation id="6401458660421980302">तपाईं यो ट्याब अर्को डिभाइसमा पठाउन चाहनुहुन्छ भने उक्त डिभाइसमा Chrome मा साइन इन गर्नुहोस्</translation> <translation id="6402652558933147609"><ph name="VIOLATED_URL" /> मा <ph name="ERROR_CODE" /></translation> +<translation id="6403371459378431832">सबै डिभाइसहरूमा आफ्नो डेटा सिंक गर्नुहोस्</translation> <translation id="6404511346730675251">बुकमार्क सम्पादन गर्नुहोस्</translation> <translation id="6406506848690869874">समक्रमण</translation> <translation id="6407224748847589805">तपाईंको कम्प्युटरमा कनेक्ट गर्न सकिएन। पुष्टि गर्ने अर्को विकल्प प्रयोग गरी हेर्नुहोस्।</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 25d3a0f..3dbc578 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
@@ -557,6 +557,7 @@ <translation id="4062305924942672200">Juridisk informasjon</translation> <translation id="4084682180776658562">Legg til bokmerke</translation> <translation id="4084712963632273211">Fra <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />levert av Google<ph name="END_DEEMPHASIZED" /></translation> +<translation id="409109920254068737">Du kan bruke dette nettbrettet til å logge på enheten som viser denne QR-koden.</translation> <translation id="4095146165863963773">Slette appdataene?</translation> <translation id="4096227151372679484">Flyt for lagring av bokmerke er åpnet i halv høyde</translation> <translation id="4099578267706723511">Gjør Chrome bedre ved å sende bruksstatistikk og programstopprapporter til Google.</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Disse dataene brukes:<ph name="END_BOLD" /> nettleserloggen din, som er en logg over nettsteder du har besøkt med Chrome på denne enheten.</translation> <translation id="4263656433980196874">UI for samtykke til talesøk med assistenten er åpnet i full høyde</translation> <translation id="4269820728363426813">Kopiér linkadressen</translation> +<translation id="4283102315569707115">Vil du be om nettsteder for datamaskiner som standard?</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Slå på skjermlås i Android-innstillingene<ph name="END_LINK" /></translation> <translation id="4293476595220860475">Ved å bruke Chrome samtykker du i <ph name="BEGIN_TOS_LINK" />Googles vilkår for bruk<ph name="END_TOS_LINK" /> og <ph name="BEGIN_ATOS_LINK" />tilleggsvilkårene for bruk av Google Chrome og ChromeOS<ph name="END_ATOS_LINK" />. <ph name="BEGIN_PRIVACY_LINK" />Personvernreglene<ph name="END_PRIVACY_LINK" /> gjelder også.</translation> <translation id="4296252229500326964">Ny inkognitofane</translation> @@ -970,6 +972,7 @@ <translation id="6342069812937806050">Akkurat nå</translation> <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" /> og <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> til}other{<ph name="SHIPPING_ADDRESS_PREVIEW" /> og <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> til}}</translation> <translation id="6345878117466430440">Merk som lest</translation> +<translation id="6357653805084533597">Du kan bruke denne telefonen til å logge på enheten som viser denne QR-koden.</translation> <translation id="6363990818884053551">For å starte synkroniseringen, bekreft at det er deg</translation> <translation id="6364438453358674297">Vil du fjerne forslaget fra loggen?</translation> <translation id="6380100320871303656">Forhåndslaster oftere sider som Chrome tror du sannsynligvis kommer til å besøke. Denne innstillingen kan medføre høyere databruk.</translation> @@ -983,6 +986,7 @@ <translation id="6397616442223433927">På nettet igjen</translation> <translation id="6401458660421980302">For å sende denne fanen til en annen enhet, logg på Chrome der</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> på <ph name="VIOLATED_URL" /></translation> +<translation id="6403371459378431832">Synkroniser dataene dine på alle enheter</translation> <translation id="6404511346730675251">Rediger bokmerket</translation> <translation id="6406506848690869874">Synkroniser</translation> <translation id="6407224748847589805">Kan ikke koble til datamaskinen din. Prøv et annet bekreftelsesalternativ.</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 6911060..49ca91a 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
@@ -557,6 +557,7 @@ <translation id="4062305924942672200">قانونی معلومات</translation> <translation id="4084682180776658562">بُک مارک</translation> <translation id="4084712963632273211">بذریعہ <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Google کے ذریعے ڈیلیور کردہ<ph name="END_DEEMPHASIZED" /></translation> +<translation id="409109920254068737">آپ اس ٹیبلیٹ کو اس آلہ پر جو یہ QR کوڈ ڈسپلے کر رہا ہے سائن ان کرنے کے لیے استعمال کر سکتے ہیں۔</translation> <translation id="4095146165863963773">ایپ کا ڈیٹا حذف کریں؟</translation> <translation id="4096227151372679484">بُک مارک محفوظ کرنے کا فلو نصف اونچائی پر کھلا ہوا ہے</translation> <translation id="4099578267706723511">Google کو استعمال کے اعداد و شمار اور کریش رپورٹس بھیج کر Chrome کو بہتر بنانے میں مدد کریں۔</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />کون سا ڈیٹا استعمال کیا جاتا ہے:<ph name="END_BOLD" /> آپ کی براؤزنگ کی سرگزشت، ان سائٹس کا ریکارڈ جو آپ اس آلے پر Chrome کا استعمال کر کے ملاحظہ کر چکے ہیں۔</translation> <translation id="4263656433980196874">اسسٹنٹ صوتی تلاش رضامندی ui پوری اونچائی پر کھلی ہوئی ہے</translation> <translation id="4269820728363426813">لنک کا پتہ کاپی کریں</translation> +<translation id="4283102315569707115">بطور ڈیفالٹ ڈیسک ٹاپ سائٹس کی درخواست کریں؟</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android کی ترتیبات میں اسکرین لاک کو آن کریں<ph name="END_LINK" /></translation> <translation id="4293476595220860475">Chrome کا استعمال کر کے، آپ <ph name="BEGIN_TOS_LINK" />Google کی سروس کی شرائط<ph name="END_TOS_LINK" /> اور <ph name="BEGIN_ATOS_LINK" />Google Chrome اور ChromeOS کی اضافی سروس کی شرائط<ph name="END_ATOS_LINK" /> سے اتفاق کرتے ہیں۔ <ph name="BEGIN_PRIVACY_LINK" />رازداری کی پالیسی<ph name="END_PRIVACY_LINK" /> بھی لاگو ہوتی ہے۔</translation> <translation id="4296252229500326964">نیا پوشیدگی ٹیب</translation> @@ -970,6 +972,7 @@ <translation id="6342069812937806050">ابھی ابھی</translation> <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 اور <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> مزید}other{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 اور <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> مزید}}</translation> <translation id="6345878117466430440">بطور پڑھا ہوا مارک کریں</translation> +<translation id="6357653805084533597">آپ اس فون کو اس آلہ پر جو یہ QR کوڈ ڈسپلے کر رہا ہے سائن ان کرنے کے لیے استعمال کر سکتے ہیں۔</translation> <translation id="6363990818884053551">مطابقت پذیری شروع کرنے کے لیے، توثیق کریں کہ یہ آپ ہیں</translation> <translation id="6364438453358674297">سرگزشت سے تجویز ہٹائیں؟</translation> <translation id="6380100320871303656">جن صفحات کو Chrome کے خیال میں آپ ملاحظہ کر سکتے ہیں وہ زیادہ کثرت سے پیشگی لوڈ ہوتے ہیں۔ اس ترتیب کے نیتجے میں ڈیٹا کے استعمال میں اضافہ ہو سکتا ہے۔</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 01bbf45f..0f20db9 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
@@ -557,6 +557,7 @@ <translation id="4062305924942672200">Ulwazi lezomthetho</translation> <translation id="4084682180776658562">Ibhukhimakhi</translation> <translation id="4084712963632273211">Kusukela ku-<ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />okulethwe i-Google<ph name="END_DEEMPHASIZED" /></translation> +<translation id="409109920254068737">Ungasebenzisa le thebulethi ukuze ungene ngemvume kudivayisi ebonisa le khodi ye-QR.</translation> <translation id="4095146165863963773">Susa idatha yohlelo lokusebenza?</translation> <translation id="4096227151372679484">Ukugeleza kokonga ibhukhimakhi kuvulwe ekuphakameni kwesigamu</translation> <translation id="4099578267706723511">Siza ukwenza i-Google Chrome ukuthi ibe ngcono ngokuthumela ngokuzenzakalelayo izibalo zokusebenzisa nemibiko yokusaphazeka ku-Google.</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Iyiphi idatha esetshenziswayo:<ph name="END_BOLD" /> Umlando wakho wokubhrawuza, irekhodi lamasayithi owavakashele usebenzisa i-Chrome kule divayisi.</translation> <translation id="4263656433980196874">Imvume ye-ui yomsizi wokusesha ngezwi ivulwe ngokuphakama okuphelele</translation> <translation id="4269820728363426813">Kopisha ikheli lesixhumanisi</translation> +<translation id="4283102315569707115">Cela amasayithi edeskithophu ngokuzenzakalela?</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Vula ukukhiya isikrini kumasethingi we-Android<ph name="END_LINK" /></translation> <translation id="4293476595220860475">Ngokusebenzisa i-Chrome, uvumelana <ph name="BEGIN_TOS_LINK" />Nemigomo Yesevisi ye-Google<ph name="END_TOS_LINK" />, kanye <ph name="BEGIN_ATOS_LINK" />ne-Google Chrome Nemigomo Yesevisi ye-ChromeOS Engeziwe<ph name="END_ATOS_LINK" />. <ph name="BEGIN_PRIVACY_LINK" />Inqubomgomo Yobumfihlo<ph name="END_PRIVACY_LINK" /> nayo iyasebenza.</translation> <translation id="4296252229500326964">Ithebhu entsha ye-incognito</translation> @@ -970,6 +972,7 @@ <translation id="6342069812937806050">Khona manje</translation> <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 nokungu-<ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ngaphezulu}one{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 nokungu-<ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ngaphezulu}other{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 nokungu-<ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ngaphezulu}}</translation> <translation id="6345878117466430440">Maka njengokufundiwe</translation> +<translation id="6357653805084533597">Ungasebenzisa le foni ukuze ungene ngemvume kudivayisi ebonisa le khodi ye-QR.</translation> <translation id="6363990818884053551">Ukuze uqale ukuvumelanisa, qinisekisa ukuthi nguwe</translation> <translation id="6364438453358674297">Susa isiphakamiso kusukela kumlando?</translation> <translation id="6380100320871303656">Iwalayisha kakhulu kusengaphambili amakhasi i-Chrome ecabanga ukuthi ungawavakashela. Leli sethingi lingase liphumele ekwenyukeni kokusetshenziswa kwedatha.</translation>
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc index 41b975c..2d56a0c6 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc
@@ -6,17 +6,13 @@ #include <set> -#include "ash/constants/ash_features.h" #include "ash/public/cpp/holding_space/holding_space_controller.h" #include "ash/public/cpp/holding_space/holding_space_item.h" #include "ash/public/cpp/holding_space/holding_space_metrics.h" #include "ash/public/cpp/holding_space/holding_space_prefs.h" #include "base/callback_helpers.h" -#include "base/containers/cxx20_erase.h" #include "base/files/file_path.h" #include "chrome/browser/ash/drive/drive_integration_service.h" -#include "chrome/browser/ash/file_manager/app_id.h" -#include "chrome/browser/ash/file_manager/fileapi_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h" @@ -25,8 +21,6 @@ #include "chrome/browser/ui/ash/holding_space/holding_space_persistence_delegate.h" #include "chrome/browser/ui/ash/holding_space/holding_space_util.h" #include "components/account_id/account_id.h" -#include "components/prefs/scoped_user_pref_update.h" -#include "storage/browser/file_system/file_system_context.h" #include "storage/browser/file_system/file_system_url.h" #include "storage/common/file_system/file_system_types.h" @@ -248,6 +242,13 @@ AddItemOfType(HoldingSpaceItem::Type::kNearbyShare, nearby_share_path); } +const std::string& HoldingSpaceKeyedService::AddPhoneHubCameraRollItem( + const base::FilePath& item_path, + const HoldingSpaceProgress& progress) { + return AddItemOfType(HoldingSpaceItem::Type::kPhoneHubCameraRoll, item_path, + progress); +} + void HoldingSpaceKeyedService::AddScan(const base::FilePath& file_path) { AddItemOfType(HoldingSpaceItem::Type::kScan, file_path); } @@ -263,11 +264,11 @@ AddItemOfType(HoldingSpaceItem::Type::kScreenshot, screenshot_file); } -const std::string& HoldingSpaceKeyedService::AddPhoneHubCameraRollItem( - const base::FilePath& item_path, - const HoldingSpaceProgress& progress) { - return AddItemOfType(HoldingSpaceItem::Type::kPhoneHubCameraRoll, item_path, - progress); +void HoldingSpaceKeyedService::AddSuggestion( + HoldingSpaceItem::Type type, + const base::FilePath& suggestion_path) { + DCHECK(HoldingSpaceItem::IsSuggestion(type)); + AddItemOfType(type, suggestion_path); } const std::string& HoldingSpaceKeyedService::AddItem(
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h index 4e6b07e8..5f47807f 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h
@@ -105,6 +105,13 @@ // Adds a nearby share item backed by the provided absolute file path. void AddNearbyShare(const base::FilePath& nearby_share_path); + // Adds a photo or video downloaded from a connected Android phone via + // PhoneHub. Returns the id of the added holding space item or an empty string + // if the item was not added due to de-duplication checks. + const std::string& AddPhoneHubCameraRollItem( + const base::FilePath& item_path, + const HoldingSpaceProgress& progress); + // Adds a scanned item backed by the provided absolute file path. void AddScan(const base::FilePath& file_path); @@ -114,12 +121,10 @@ // Adds a screenshot item backed by the provided absolute file path. void AddScreenshot(const base::FilePath& screenshot_path); - // Adds a photo or video downloaded from a connected Android phone via - // PhoneHub. Returns the id of the added holding space item or an empty string - // if the item was not added due to de-duplication checks. - const std::string& AddPhoneHubCameraRollItem( - const base::FilePath& item_path, - const HoldingSpaceProgress& progress); + // Adds a suggested item of the specified `type` backed by the provided + // absolute file path. NOTE: `type` must refer to a suggestion type. + void AddSuggestion(HoldingSpaceItem::Type type, + const base::FilePath& suggestion_path); // Adds the specified `item` to the holding space model. Returns the id of the // added holding space item or an empty string if the item was not added due
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc index a78b67b4..5ec83c5 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -7,7 +7,6 @@ #include <vector> #include "ash/components/arc/session/arc_service_manager.h" -#include "ash/constants/ash_features.h" #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_controller.h" #include "ash/public/cpp/holding_space/holding_space_controller_observer.h" @@ -19,14 +18,9 @@ #include "ash/public/cpp/image_util.h" #include "base/files/file_path.h" #include "base/files/file_util.h" -#include "base/guid.h" #include "base/scoped_observation.h" -#include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/simple_test_clock.h" #include "base/time/time_override.h" -#include "chrome/browser/ash/file_manager/app_id.h" #include "chrome/browser/ash/file_manager/fake_disk_mount_manager.h" #include "chrome/browser/ash/file_manager/fileapi_util.h" #include "chrome/browser/ash/file_manager/path_util.h" @@ -35,7 +29,6 @@ #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/nearby_sharing/common/nearby_share_features.h" #include "chrome/browser/prefs/browser_prefs.h" -#include "chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h" #include "chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.h" #include "chrome/browser/ui/ash/holding_space/holding_space_persistence_delegate.h" #include "chrome/browser/ui/ash/holding_space/holding_space_util.h" @@ -52,10 +45,8 @@ #include "components/sync_preferences/pref_service_syncable.h" #include "components/user_manager/scoped_user_manager.h" #include "components/vector_icons/vector_icons.h" -#include "content/public/browser/download_item_utils.h" #include "content/public/test/fake_download_item.h" #include "content/public/test/mock_download_manager.h" -#include "storage/browser/file_system/external_mount_points.h" #include "storage/browser/file_system/file_system_context.h" #include "storage/browser/file_system/file_system_url.h" #include "storage/browser/test/async_file_test_helper.h" @@ -2234,6 +2225,10 @@ case HoldingSpaceItem::Type::kDiagnosticsLog: holding_space_service->AddDiagnosticsLog(file_path); break; + case HoldingSpaceItem::Type::kDriveSuggestion: + case HoldingSpaceItem::Type::kLocalSuggestion: + holding_space_service->AddSuggestion(type, file_path); + break; case HoldingSpaceItem::Type::kNearbyShare: holding_space_service->AddNearbyShare(file_path); break; @@ -2244,6 +2239,13 @@ holding_space_util::ResolveFileSystemUrl(profile, file_path))}); break; + case HoldingSpaceItem::Type::kPhoneHubCameraRoll: + EXPECT_EQ( + holding_space_model->ContainsItem(type, file_path), + holding_space_service + ->AddPhoneHubCameraRollItem(file_path, HoldingSpaceProgress()) + .empty()); + break; case HoldingSpaceItem::Type::kPrintedPdf: holding_space_service->AddPrintedPdf(file_path, /*from_incognito_profile=*/false); @@ -2257,13 +2259,6 @@ case HoldingSpaceItem::Type::kScreenshot: holding_space_service->AddScreenshot(file_path); break; - case HoldingSpaceItem::Type::kPhoneHubCameraRoll: - EXPECT_EQ( - holding_space_model->ContainsItem(type, file_path), - holding_space_service - ->AddPhoneHubCameraRollItem(file_path, HoldingSpaceProgress()) - .empty()); - break; } const auto* item = holding_space_model->GetItem(type, file_path);
diff --git a/chrome/browser/ui/side_search/side_search_tab_contents_helper.cc b/chrome/browser/ui/side_search/side_search_tab_contents_helper.cc index 58e0171..45898ab 100644 --- a/chrome/browser/ui/side_search/side_search_tab_contents_helper.cc +++ b/chrome/browser/ui/side_search/side_search_tab_contents_helper.cc
@@ -97,8 +97,15 @@ auto* config = GetConfig(); if (config->ShouldNavigateInSidePanel(url)) { - returned_to_previous_srp_ = navigation_handle->GetPageTransition() & - ui::PAGE_TRANSITION_FORWARD_BACK; + // Keep track of how many times a user returned to the `last_search_url_` + // via back-navigation. Reset the count if navigating to a new SRP or + // forward through history to an existing SRP. + if (navigation_handle->GetNavigationEntryOffset() < 0 && + url == last_search_url_) { + ++returned_to_previous_srp_count_; + } else { + returned_to_previous_srp_count_ = 0; + } // Capture the URL here in case the side contents is closed before the // navigation completes. @@ -260,7 +267,7 @@ toggled_open_ = false; simple_loader_.reset(); last_search_url_.reset(); - returned_to_previous_srp_ = false; + returned_to_previous_srp_count_ = 0; toggled_open_ = false; // Notify the side panel after resetting the above state but before clearing
diff --git a/chrome/browser/ui/side_search/side_search_tab_contents_helper.h b/chrome/browser/ui/side_search/side_search_tab_contents_helper.h index b4f4616..0b3c13d 100644 --- a/chrome/browser/ui/side_search/side_search_tab_contents_helper.h +++ b/chrome/browser/ui/side_search/side_search_tab_contents_helper.h
@@ -109,7 +109,9 @@ return side_panel_initiated_redirect_info_; } - bool returned_to_previous_srp() const { return returned_to_previous_srp_; } + int returned_to_previous_srp_count() const { + return returned_to_previous_srp_count_; + } bool toggled_open() const { return toggled_open_; } void set_toggled_open(bool toggled_open) { toggled_open_ = toggled_open; } @@ -164,11 +166,11 @@ // The last Google search URL encountered by this tab contents. absl::optional<GURL> last_search_url_; - // Whether the last search url was the result of the user navigating back - // to the previously visisted search url. Used to detect cases where the - // side search panel would be of use to the user and thus could benefit - // of IPH promo. - bool returned_to_previous_srp_ = false; + // Counts the number of times the user has returned to the `last_search_url_` + // via back navigation. This is used to detect cases where the side search + // panel would be of use to the user and is used to show an IPH promo and + // automatically trigger the side panel. + int returned_to_previous_srp_count_ = 0; // A flag to track whether the current tab has its side panel toggled open. // Only used with the kSideSearchStatePerTab flag.
diff --git a/chrome/browser/ui/tabs/pinned_tab_codec.cc b/chrome/browser/ui/tabs/pinned_tab_codec.cc index ebcdefb..859c9985 100644 --- a/chrome/browser/ui/tabs/pinned_tab_codec.cc +++ b/chrome/browser/ui/tabs/pinned_tab_codec.cc
@@ -99,17 +99,10 @@ PrefService* prefs = profile->GetPrefs(); if (!prefs) return {}; - return ReadPinnedTabs(prefs->GetList(prefs::kPinnedTabs)); -} -// static -StartupTabs PinnedTabCodec::ReadPinnedTabs(const base::Value* value) { StartupTabs results; - if (!value->is_list()) - return results; - - for (const auto& serialized_tab : value->GetListDeprecated()) { + for (const auto& serialized_tab : prefs->GetValueList(prefs::kPinnedTabs)) { if (!serialized_tab.is_dict()) continue; absl::optional<StartupTab> tab = DecodeTab(serialized_tab);
diff --git a/chrome/browser/ui/tabs/pinned_tab_codec.h b/chrome/browser/ui/tabs/pinned_tab_codec.h index eb7193b..46d69e8 100644 --- a/chrome/browser/ui/tabs/pinned_tab_codec.h +++ b/chrome/browser/ui/tabs/pinned_tab_codec.h
@@ -10,10 +10,6 @@ class Profile; -namespace base { -class Value; -} - namespace user_prefs { class PrefRegistrySyncable; } @@ -41,7 +37,6 @@ // Reads and returns the set of pinned tabs to restore from preferences. static StartupTabs ReadPinnedTabs(Profile* profile); - static StartupTabs ReadPinnedTabs(const base::Value* value); private: PinnedTabCodec();
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index 18763ff5..25f1214 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -144,6 +144,17 @@ const base::Feature kClobberAllSideSearchSidePanels{ "ClobberAllSideSearchSidePanels", base::FEATURE_ENABLED_BY_DEFAULT}; +// Feature that controls whether or not feature engagement configurations can be +// used to control automatic triggering for side search. +const base::Feature kSideSearchAutoTriggering{"SideSearchAutoTriggering", + base::FEATURE_ENABLED_BY_DEFAULT}; + +// Feature param that determines how many times a user has to return to a given +// SRP before we automatically trigger the side search side panel for that SRP +// on a subsequent navigation. +const base::FeatureParam<int> kSideSearchAutoTriggeringReturnCount{ + &kSideSearchAutoTriggering, "SideSearchAutoTriggeringReturnCount", 2}; + // Adds improved support for handling multiple contextual and global RHS browser // side panels. Designed specifically to handle the interim state before the v2 // side panel project launches.
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 3d7ec60..2ee0385 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -73,6 +73,9 @@ extern const base::Feature kSideSearchDSESupport; extern const base::Feature kClobberAllSideSearchSidePanels; +extern const base::Feature kSideSearchAutoTriggering; +extern const base::FeatureParam<int> kSideSearchAutoTriggeringReturnCount; + extern const base::Feature kSideSearchPageActionLabelAnimation; enum class kSideSearchLabelAnimationTypeOption {
diff --git a/chrome/browser/ui/views/bubble/bubble_frame_view_browsertest.cc b/chrome/browser/ui/views/bubble/bubble_frame_view_browsertest.cc new file mode 100644 index 0000000..4bb4387 --- /dev/null +++ b/chrome/browser/ui/views/bubble/bubble_frame_view_browsertest.cc
@@ -0,0 +1,46 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/bubble/bubble_frame_view.h" + +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/test/test_browser_dialog.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/top_container_view.h" +#include "content/public/test/browser_test.h" +#include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/bubble/bubble_dialog_model_host.h" + +class BubbleFrameViewBrowserTest : public DialogBrowserTest { + public: + BubbleFrameViewBrowserTest() = default; + + BubbleFrameViewBrowserTest(const BubbleFrameViewBrowserTest&) = delete; + BubbleFrameViewBrowserTest& operator=(const BubbleFrameViewBrowserTest&) = + delete; + + // DialogBrowserTest: + void ShowUi(const std::string& name) override { + const std::u16string subtitle = + u"Subtitle that is long enough to wrap-around a bubble once"; + auto dialog_model = ui::DialogModel::Builder() + .SetTitle(u"Title") + .SetSubtitle(subtitle) + .Build(); + + views::View* anchor_view = + BrowserView::GetBrowserViewForBrowser(browser())->top_container(); + + auto bubble = std::make_unique<views::BubbleDialogModelHost>( + std::move(dialog_model), anchor_view, views::BubbleBorder::TOP_RIGHT); + + views::Widget* const widget = + views::BubbleDialogDelegate::CreateBubble(std::move(bubble)); + widget->Show(); + } +}; + +IN_PROC_BROWSER_TEST_F(BubbleFrameViewBrowserTest, InvokeUi_Subtitle) { + ShowAndVerifyUi(); +}
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc index bbb2e07..8314108a 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -236,6 +236,23 @@ return policy_view; } +bool ShouldSelectTab(DesktopMediaList::Type type, + blink::mojom::PreferredDisplaySurface display_surface) { + switch (type) { + case DesktopMediaList::Type::kNone: + break; + case DesktopMediaList::Type::kScreen: + return display_surface == blink::mojom::PreferredDisplaySurface::MONITOR; + case DesktopMediaList::Type::kWindow: + return display_surface == blink::mojom::PreferredDisplaySurface::WINDOW; + case DesktopMediaList::Type::kWebContents: + case DesktopMediaList::Type::kCurrentTab: + return display_surface == blink::mojom::PreferredDisplaySurface::BROWSER; + } + NOTREACHED(); + return false; +} + } // namespace bool DesktopMediaPickerDialogView::AudioSupported(DesktopMediaList::Type type) { @@ -454,8 +471,16 @@ if (panes.size() > 1) { auto tabbed_pane = std::make_unique<views::TabbedPane>(); - for (auto& pane : panes) + for (auto& pane : panes) { tabbed_pane->AddTab(pane.first, std::move(pane.second)); + } + for (size_t i = 0; i < categories_.size(); i++) { + if (ShouldSelectTab(categories_[i].type, + params.preferred_display_surface)) { + tabbed_pane->SelectTabAt(i, /*animate=*/false); + break; + } + } tabbed_pane->set_listener(this); tabbed_pane->SetFocusBehavior(views::View::FocusBehavior::NEVER); tabbed_pane_ = AddChildView(std::move(tabbed_pane));
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc index 15129d5..dd65caf7 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc
@@ -105,6 +105,11 @@ } } +DesktopMediaList::Type +DesktopMediaPickerViewsTestApi::GetSelectedSourceListType() const { + return picker_->dialog_->GetSelectedSourceListType(); +} + absl::optional<int> DesktopMediaPickerViewsTestApi::GetSelectedSourceId() const { DesktopMediaListController* controller =
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.h b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.h index 86e99ec..4f6c121 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.h +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.h
@@ -44,6 +44,7 @@ bool HasSourceAtIndex(size_t index) const; void FocusSourceAtIndex(size_t index, bool select = true); void DoubleTapSourceAtIndex(size_t index); + DesktopMediaList::Type GetSelectedSourceListType() const; absl::optional<int> GetSelectedSourceId() const; views::View* GetSelectedListView();
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc index db1db9e..e75aa69 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc
@@ -58,13 +58,13 @@ std::vector<DesktopMediaList::Type> GetSourceTypes( bool should_prefer_current_tab) { - std::vector<DesktopMediaList::Type> result{ - DesktopMediaList::Type::kScreen, DesktopMediaList::Type::kWindow, - DesktopMediaList::Type::kWebContents}; if (should_prefer_current_tab) { - result.push_back(DesktopMediaList::Type::kCurrentTab); + return {DesktopMediaList::Type::kCurrentTab, + DesktopMediaList::Type::kWebContents, + DesktopMediaList::Type::kWindow, DesktopMediaList::Type::kScreen}; } - return result; + return {DesktopMediaList::Type::kScreen, DesktopMediaList::Type::kWindow, + DesktopMediaList::Type::kWebContents}; } DesktopMediaID::Type GetSourceIdType(DesktopMediaList::Type type) { @@ -99,6 +99,10 @@ switches::kDisableModalAnimations); #endif DesktopMediaPickerManager::Get()->AddObserver(&observer_); + MaybeCreatePickerViews(); + } + + virtual void MaybeCreatePickerViews() { CreatePickerViews(/*request_audio=*/true, /*exclude_system_audio=*/false); } @@ -109,7 +113,11 @@ DesktopMediaPickerManager::Get()->RemoveObserver(&observer_); } - void CreatePickerViews(bool request_audio, bool exclude_system_audio) { + void CreatePickerViews( + bool request_audio, + bool exclude_system_audio, + blink::mojom::PreferredDisplaySurface preferred_display_surface = + blink::mojom::PreferredDisplaySurface::NO_PREFERENCE) { widget_destroyed_waiter_.reset(); picker_views_.reset(); @@ -126,6 +134,7 @@ picker_params.target_name = kAppName; picker_params.request_audio = request_audio; picker_params.exclude_system_audio = exclude_system_audio; + picker_params.preferred_display_surface = preferred_display_surface; std::vector<std::unique_ptr<DesktopMediaList>> source_lists; for (auto type : source_types_) { @@ -492,16 +501,20 @@ } TEST_P(DesktopMediaPickerViewsTest, OkButtonEnabledDuringAcceptSpecific) { - constexpr DesktopMediaID kFakeId(DesktopMediaID::TYPE_SCREEN, 222); + DesktopMediaID fake_id(DesktopMediaID::TYPE_SCREEN, 222); media_lists_[DesktopMediaList::Type::kWindow]->AddSourceByFullMediaID( - kFakeId); + fake_id); + if (PreferCurrentTab()) { + fake_id.web_contents_id.disable_local_echo = true; + fake_id.audio_share = true; + } EXPECT_FALSE( GetPickerDialogView()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); - GetPickerDialogView()->AcceptSpecificSource(kFakeId); - EXPECT_EQ(kFakeId, WaitForPickerDone()); + GetPickerDialogView()->AcceptSpecificSource(fake_id); + EXPECT_EQ(fake_id, WaitForPickerDone()); } class DesktopMediaPickerViewsSystemAudioTest @@ -512,14 +525,7 @@ GetSourceTypes(/*should_prefer_current_tab=*/false)) {} ~DesktopMediaPickerViewsSystemAudioTest() override = default; - void SetUp() override { -#if BUILDFLAG(IS_MAC) - // These tests create actual child Widgets, which normally have a closure - // animation on Mac; inhibit it here to avoid the tests flakily hanging. - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kDisableModalAnimations); -#endif - DesktopMediaPickerManager::Get()->AddObserver(&observer_); + void MaybeCreatePickerViews() override { // CreatePickerViews() called directly from tests. } }; @@ -638,4 +644,60 @@ 0, ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0)); } +using PreferredDisplaySurfaceTestData = + std::tuple<bool, blink::mojom::PreferredDisplaySurface>; + +class DesktopMediaPickerPreferredDisplaySurfaceTest + : public DesktopMediaPickerViewsTestBase, + public testing::WithParamInterface<PreferredDisplaySurfaceTestData> { + public: + DesktopMediaPickerPreferredDisplaySurfaceTest() + : DesktopMediaPickerViewsTestBase(GetSourceTypes(PreferCurrentTab())) {} + + void MaybeCreatePickerViews() override { + CreatePickerViews(/*request_audio=*/true, /*exclude_system_audio=*/false, + PreferredDisplaySurface()); + } + + bool PreferCurrentTab() const { return std::get<0>(GetParam()); } + + blink::mojom::PreferredDisplaySurface PreferredDisplaySurface() const { + return std::get<1>(GetParam()); + } +}; + +TEST_P(DesktopMediaPickerPreferredDisplaySurfaceTest, + SelectedTabMatchesPreferredDisplaySurface) { + switch (PreferredDisplaySurface()) { + case blink::mojom::PreferredDisplaySurface::NO_PREFERENCE: + EXPECT_EQ(test_api_.GetSelectedSourceListType(), + PreferCurrentTab() ? DesktopMediaList::Type::kCurrentTab + : DesktopMediaList::Type::kScreen); + break; + case blink::mojom::PreferredDisplaySurface::MONITOR: + EXPECT_EQ(test_api_.GetSelectedSourceListType(), + DesktopMediaList::Type::kScreen); + break; + case blink::mojom::PreferredDisplaySurface::WINDOW: + EXPECT_EQ(test_api_.GetSelectedSourceListType(), + DesktopMediaList::Type::kWindow); + break; + case blink::mojom::PreferredDisplaySurface::BROWSER: + EXPECT_EQ(test_api_.GetSelectedSourceListType(), + PreferCurrentTab() ? DesktopMediaList::Type::kCurrentTab + : DesktopMediaList::Type::kWebContents); + break; + } +} + +INSTANTIATE_TEST_SUITE_P( + All, + DesktopMediaPickerPreferredDisplaySurfaceTest, + testing::Combine( + testing::Bool(), + testing::Values(blink::mojom::PreferredDisplaySurface::NO_PREFERENCE, + blink::mojom::PreferredDisplaySurface::MONITOR, + blink::mojom::PreferredDisplaySurface::WINDOW, + blink::mojom::PreferredDisplaySurface::BROWSER))); + } // namespace views
diff --git a/chrome/browser/ui/views/side_panel/side_panel_util.h b/chrome/browser/ui/views/side_panel/side_panel_util.h index 09781d0..ccb9cd1 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_util.h +++ b/chrome/browser/ui/views/side_panel/side_panel_util.h
@@ -29,7 +29,8 @@ kComboboxSelected = 4, kTabChanged = 5, kSidePanelEntryDeregistered = 6, - kMaxValue = kSidePanelEntryDeregistered, + kIPHSideSearchAutoTrigger = 7, + kMaxValue = kIPHSideSearchAutoTrigger, }; static void PopulateGlobalEntries(Browser* browser,
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller.cc b/chrome/browser/ui/views/side_search/side_search_browser_controller.cc index 3973ea3..fc1ec4000 100644 --- a/chrome/browser/ui/views/side_search/side_search_browser_controller.cc +++ b/chrome/browser/ui/views/side_search/side_search_browser_controller.cc
@@ -642,7 +642,7 @@ // Once the anchor element is visible, maybe show promo for the toolbar // button. if (toolbar_button_ && can_show_side_panel_for_page && - tab_contents_helper->returned_to_previous_srp()) { + tab_contents_helper->returned_to_previous_srp_count() > 0) { browser_view_->MaybeShowFeaturePromo( feature_engagement::kIPHSideSearchFeature); }
diff --git a/chrome/browser/ui/views/side_search/side_search_browsertest.cc b/chrome/browser/ui/views/side_search/side_search_browsertest.cc index 317ce889..5be2fd15 100644 --- a/chrome/browser/ui/views/side_search/side_search_browsertest.cc +++ b/chrome/browser/ui/views/side_search/side_search_browsertest.cc
@@ -81,8 +81,21 @@ } void SideSearchBrowserTest::NavigateActiveTab(Browser* browser, - const GURL& url) { - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser, url)); + const GURL& url, + bool is_renderer_initiated) { + if (is_renderer_initiated) { + // Navigate from a link and wait for loading to finish. + content::TestNavigationObserver observer( + browser->tab_strip_model()->GetActiveWebContents()); + NavigateParams params(browser, url, + ui::PageTransition::PAGE_TRANSITION_LINK); + params.initiator_origin = url::Origin(); + params.is_renderer_initiated = true; + ui_test_utils::NavigateToURL(¶ms); + observer.WaitForNavigationFinished(); + } else { + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser, url)); + } } content::WebContents* SideSearchBrowserTest::GetActiveSidePanelWebContents(
diff --git a/chrome/browser/ui/views/side_search/side_search_browsertest.h b/chrome/browser/ui/views/side_search/side_search_browsertest.h index 3910c24f..08a46150 100644 --- a/chrome/browser/ui/views/side_search/side_search_browsertest.h +++ b/chrome/browser/ui/views/side_search/side_search_browsertest.h
@@ -38,7 +38,9 @@ void AppendTab(Browser* browser, const GURL& url); // Navigates the browser's currently active tab to `url`. - void NavigateActiveTab(Browser* browser, const GURL& url); + void NavigateActiveTab(Browser* browser, + const GURL& url, + bool is_renderer_initiated = false); // Gets the browser's currently active tab contents. content::WebContents* GetActiveSidePanelWebContents(Browser* browser);
diff --git a/chrome/browser/ui/views/side_search/side_search_icon_view.cc b/chrome/browser/ui/views/side_search/side_search_icon_view.cc index d82f0976..0811766 100644 --- a/chrome/browser/ui/views/side_search/side_search_icon_view.cc +++ b/chrome/browser/ui/views/side_search/side_search_icon_view.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_search/default_search_icon_source.h" #include "chrome/browser/ui/views/side_search/side_search_browser_controller.h" +#include "chrome/browser/ui/views/side_search/side_search_views_utils.h" #include "chrome/browser/ui/views/side_search/unified_side_search_controller.h" #include "chrome/grit/generated_resources.h" #include "components/feature_engagement/public/event_constants.h" @@ -26,19 +27,6 @@ #include "ui/gfx/paint_vector_icon.h" #include "ui/views/view_class_properties.h" -namespace { - -bool IsSideSearchToggleOpen(BrowserView* browser_view) { - if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) { - auto* coordinator = browser_view->side_panel_coordinator(); - return coordinator->IsSidePanelShowing() && - coordinator->GetCurrentEntryId() == SidePanelEntry::Id::kSideSearch; - } - return browser_view->side_search_controller()->GetSidePanelToggledOpen(); -} - -} // namespace - SideSearchIconView::SideSearchIconView( CommandUpdater* command_updater, IconLabelBubbleView::Delegate* icon_label_bubble_delegate, @@ -107,7 +95,7 @@ const bool was_visible = GetVisible(); const bool should_show = tab_contents_helper->CanShowSidePanelForCommittedNavigation() && - !IsSideSearchToggleOpen(browser_view); + !side_search::IsSideSearchToggleOpen(browser_view); SetVisible(should_show); if (should_show && !was_visible) { @@ -115,7 +103,7 @@ SetPageActionLabelShown(); should_extend_label_shown_duration_ = true; AnimateIn(absl::nullopt); - } else if (tab_contents_helper->returned_to_previous_srp()) { + } else if (tab_contents_helper->returned_to_previous_srp_count() > 0) { // If we are not animating-in the label text make a request to show the // IPH if we detect the user may be engaging in a pogo-sticking journey. browser_view->MaybeShowFeaturePromo(
diff --git a/chrome/browser/ui/views/side_search/side_search_views_utils.cc b/chrome/browser/ui/views/side_search/side_search_views_utils.cc new file mode 100644 index 0000000..1fc593c3 --- /dev/null +++ b/chrome/browser/ui/views/side_search/side_search_views_utils.cc
@@ -0,0 +1,24 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/side_search/side_search_views_utils.h" + +#include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" +#include "chrome/browser/ui/views/side_panel/side_panel_entry.h" +#include "chrome/browser/ui/views/side_search/side_search_browser_controller.h" + +namespace side_search { + +bool IsSideSearchToggleOpen(BrowserView* browser_view) { + if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) { + auto* coordinator = browser_view->side_panel_coordinator(); + return coordinator->IsSidePanelShowing() && + coordinator->GetCurrentEntryId() == SidePanelEntry::Id::kSideSearch; + } + return browser_view->side_search_controller()->GetSidePanelToggledOpen(); +} + +} // namespace side_search
diff --git a/chrome/browser/ui/views/side_search/side_search_views_utils.h b/chrome/browser/ui/views/side_search/side_search_views_utils.h new file mode 100644 index 0000000..9059cc3 --- /dev/null +++ b/chrome/browser/ui/views/side_search/side_search_views_utils.h
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_SIDE_SEARCH_SIDE_SEARCH_VIEWS_UTILS_H_ +#define CHROME_BROWSER_UI_VIEWS_SIDE_SEARCH_SIDE_SEARCH_VIEWS_UTILS_H_ + +class BrowserView; + +namespace side_search { + +// Returns true if the side panel is open to the side search feature. This is +// used by both the independent and unified side panel implementations. +bool IsSideSearchToggleOpen(BrowserView* browser_view); + +} // namespace side_search + +#endif // CHROME_BROWSER_UI_VIEWS_SIDE_SEARCH_SIDE_SEARCH_VIEWS_UTILS_H_
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc index cb275be0..35ea17ec 100644 --- a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc +++ b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc
@@ -6,6 +6,8 @@ #include "base/bind.h" #include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/side_search/side_search_utils.h" @@ -13,6 +15,10 @@ #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/side_panel.h" +#include "chrome/browser/ui/views/side_search/side_search_views_utils.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/public/tracker.h" #include "components/url_formatter/elide_url.h" #include "components/vector_icons/vector_icons.h" #include "content/public/browser/navigation_handle.h" @@ -105,6 +111,28 @@ } UpdateSidePanel(); + + if (ShouldAutomaticallyTriggerAfterNavigation(navigation_handle)) { + auto* tracker = + feature_engagement::TrackerFactory::GetForBrowserContext(GetProfile()); + auto* browser_view = GetBrowserView(); + + if (!browser_view || !tracker || + !tracker->ShouldTriggerHelpUI( + feature_engagement::kIPHSideSearchAutoTriggeringFeature)) { + return; + } + + browser_view->side_panel_coordinator()->Show( + SidePanelEntry::Id::kSideSearch, + SidePanelUtil::SidePanelOpenTrigger::kIPHSideSearchAutoTrigger); + + // Note that `Dismiss()` in this case does not dismiss the UI. It's telling + // the FE backend that the promo is done so that other promos can run. The + // side panel showing should not block other promos from displaying. + tracker->Dismissed(feature_engagement::kIPHSideSearchAutoTriggeringFeature); + tracker->NotifyEvent(feature_engagement::events::kSideSearchAutoTriggered); + } } void UnifiedSideSearchController::OnEntryShown(SidePanelEntry* entry) { @@ -194,6 +222,10 @@ return browser ? BrowserView::GetBrowserViewForBrowser(browser) : nullptr; } +Profile* UnifiedSideSearchController::GetProfile() { + return Profile::FromBrowserContext(web_contents()->GetBrowserContext()); +} + void UnifiedSideSearchController::UpdateSidePanel() { auto* tab_contents_helper = SideSearchTabContentsHelper::FromWebContents(web_contents()); @@ -241,4 +273,40 @@ } } +bool UnifiedSideSearchController::ShouldAutomaticallyTriggerAfterNavigation( + content::NavigationHandle* navigation_handle) { + // Only trigger the panel automatically if the current tab is the browser's + // active tab (it may not necessarily be the active tab if navigation commit + // happens after the user switches tabs). + auto* browser_view = GetBrowserView(); + if (!browser_view || browser_view->GetActiveWebContents() != web_contents()) + return false; + + // If the side search side panel is already open we do not need to + // automatically retrigger the panel. + if (side_search::IsSideSearchToggleOpen(browser_view)) + return false; + + auto* tab_contents_helper = + SideSearchTabContentsHelper::FromWebContents(web_contents()); + if (!tab_contents_helper) + return false; + + const GURL& previously_committed_url = + navigation_handle->GetPreviousPrimaryMainFrameURL(); + const bool is_renderer_initiated = navigation_handle->IsRendererInitiated(); + const int auto_triggering_return_count = + features::kSideSearchAutoTriggeringReturnCount.Get(); + + // Trigger the side panel only if we've returned to the same SRP n times and + // this is the first navigation after navigating away from the Google SRP. We + // also check to ensure the navigation is renderer initiated to avoid showing + // the side panel if the user navigates the tab via the omnibox / bookmarks + // etc. + return is_renderer_initiated && + tab_contents_helper->returned_to_previous_srp_count() == + auto_triggering_return_count && + previously_committed_url == tab_contents_helper->last_search_url(); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(UnifiedSideSearchController);
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller.h b/chrome/browser/ui/views/side_search/unified_side_search_controller.h index 91e7310..160b41b 100644 --- a/chrome/browser/ui/views/side_search/unified_side_search_controller.h +++ b/chrome/browser/ui/views/side_search/unified_side_search_controller.h
@@ -22,6 +22,7 @@ #include "ui/views/view.h" class BrowserView; +class Profile; // Responsible for managing the WebContents hosted in the browser's side panel // for Side Search. Created immediately following the creation of the tab's @@ -64,6 +65,7 @@ private: BrowserView* GetBrowserView() const; + Profile* GetProfile(); // Create a WebView to host the side search WebContents. std::unique_ptr<views::View> GetSideSearchView(); @@ -79,6 +81,11 @@ void UpdateSidePanelRegistry(bool is_available); + // True if the side panel should be automatically triggered after a navigation + // defined by `navigation_handle`. + bool ShouldAutomaticallyTriggerAfterNavigation( + content::NavigationHandle* navigation_handle); + // A handler to handle unhandled keyboard messages coming back from the // renderer process. views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc b/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc index 6ae7ec6..4799e80 100644 --- a/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/ui/views/side_search/unified_side_search_controller.h" +#include "base/callback_list.h" #include "base/feature_list.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/side_search/side_search_utils.h" #include "chrome/browser/ui/ui_features.h" @@ -14,8 +16,13 @@ #include "chrome/browser/ui/views/side_panel/side_panel.h" #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" #include "chrome/browser/ui/views/side_search/side_search_browsertest.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/test/test_tracker.h" #include "content/public/common/result_codes.h" #include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/test_navigation_observer.h" #include "ui/views/interaction/element_tracker_views.h" // Fixture for testing side panel v2 only. Only instantiate tests for DSE @@ -527,3 +534,115 @@ // destroyed. Otherwise a UAF will occur. EXPECT_NE(nullptr, tab_contents_helper->side_panel_contents_for_testing()); } + +class SideSearchV2TestAutoTriggeringBrowserTest : public SideSearchBrowserTest { + public: + SideSearchV2TestAutoTriggeringBrowserTest() { + constexpr char kParam[] = "SideSearchAutoTriggeringReturnCount"; + constexpr char kTriggerCount[] = "2"; + base::FieldTrialParams params = {{kParam, kTriggerCount}}; + + feature_list_.InitWithFeaturesAndParameters( + { + {features::kSideSearch, {}}, + {features::kSideSearchDSESupport, {}}, + {features::kUnifiedSidePanel, {}}, + {features::kSideSearchAutoTriggering, params}, + {feature_engagement::kIPHSideSearchAutoTriggeringFeature, + GetFeatureEngagementParams()}, + }, + {}); + + subscription_ = + BrowserContextDependencyManager::GetInstance() + ->RegisterCreateServicesCallbackForTesting( + base::BindRepeating(&SideSearchV2TestAutoTriggeringBrowserTest:: + RegisterTestTracker)); + } + + SidePanel* GetSidePanelFor(Browser* browser) override { + return BrowserViewFor(browser)->right_aligned_side_panel(); + } + + // Navigates one page backwards in navigation history and waits for the + // navigation to complete. + void GoBackInActiveTabFor(Browser* browser) { + auto* tab_contents = browser->tab_strip_model()->GetActiveWebContents(); + content::TestNavigationObserver tab_observer(tab_contents); + tab_contents->GetController().GoBack(); + tab_observer.Wait(); + } + + void NavigateActiveTabRendererInitiated(Browser* browser, const GURL& url) { + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser, url)); + } + + private: + static void RegisterTestTracker(content::BrowserContext* context) { + feature_engagement::TrackerFactory::GetInstance()->SetTestingFactory( + context, base::BindRepeating(&CreateTestTracker)); + } + + static std::unique_ptr<KeyedService> CreateTestTracker( + content::BrowserContext*) { + return feature_engagement::CreateTestTracker(); + } + + std::map<std::string, std::string> GetFeatureEngagementParams() { + constexpr char kEventUsedKey[] = "event_used"; + constexpr char kEventUsedValue[] = + "name:used;comparator:any;window:360;storage:360"; + constexpr char kEventTriggerKey[] = "event_trigger"; + constexpr char kEventTriggerValue[] = + "name:trigger;comparator:any;window:360;storage:360"; + return {{kEventUsedKey, kEventUsedValue}, + {kEventTriggerKey, kEventTriggerValue}}; + } + + base::test::ScopedFeatureList feature_list_; + base::CallbackListSubscription subscription_; +}; + +#if BUILDFLAG(IS_MAC) +// Test is flaky on Mac. +#define MAYBE_SidePanelAutoTriggersAfterReturningToAPreviousSRP \ + DISABLED_SidePanelAutoTriggersAfterReturningToAPreviousSRP +#else +#define MAYBE_SidePanelAutoTriggersAfterReturningToAPreviousSRP \ + SidePanelAutoTriggersAfterReturningToAPreviousSRP +#endif +IN_PROC_BROWSER_TEST_F( + SideSearchV2TestAutoTriggeringBrowserTest, + MAYBE_SidePanelAutoTriggersAfterReturningToAPreviousSRP) { + const auto srp_url = GetMatchingSearchUrl(); + const auto non_srp_url_1 = GetNonMatchingUrl(); + const auto non_srp_url_2 = GetNonMatchingUrl(); + const auto non_srp_url_3 = GetNonMatchingUrl(); + auto* coordinator = BrowserViewFor(browser())->side_panel_coordinator(); + + // Navigate once to a non-SRP URL. + NavigateActiveTab(browser(), srp_url); + NavigateActiveTab(browser(), non_srp_url_1); + EXPECT_TRUE(GetSidePanelButtonFor(browser())->GetVisible()); + EXPECT_FALSE(GetSidePanelFor(browser())->GetVisible()); + + // Going back will increase the returned-to-SRP count to 1. + GoBackInActiveTabFor(browser()); + + // The side panel should not automatically open when navigating to a non-SRP + // URL. + NavigateActiveTab(browser(), non_srp_url_2); + EXPECT_TRUE(GetSidePanelButtonFor(browser())->GetVisible()); + EXPECT_FALSE(GetSidePanelFor(browser())->GetVisible()); + + // Going back will increase the returned-to-SRP count to 2. + GoBackInActiveTabFor(browser()); + + // Navigating to a non-SRP URL should now automatically trigger the side + // search side panel. + NavigateActiveTab(browser(), non_srp_url_3, /*is_renderer_initiated=*/true); + EXPECT_FALSE(GetSidePanelButtonFor(browser())->GetVisible()); + EXPECT_TRUE(GetSidePanelFor(browser())->GetVisible()); + EXPECT_EQ(SidePanelEntry::Id::kSideSearch, + coordinator->GetCurrentSidePanelEntryForTesting()->id()); +}
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index d97241a..379c5c2 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -644,6 +644,7 @@ } void WebAppIntegrationTestDriver::TearDownOnMainThread() { + in_tear_down_ = true; LOG(INFO) << "TearDownOnMainThread: Start."; observation_.Reset(); if (delegate_->IsSyncTest()) @@ -713,7 +714,8 @@ } void WebAppIntegrationTestDriver::AcceptAppIdUpdateDialog() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; views::Widget* widget = app_id_update_dialog_waiter_->WaitIfNeededAndGet(); ASSERT_TRUE(widget != nullptr); @@ -723,7 +725,8 @@ } void WebAppIntegrationTestDriver::CloseCustomToolbar() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()); BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); content::WebContents* web_contents = app_view->GetActiveWebContents(); @@ -738,7 +741,8 @@ } void WebAppIntegrationTestDriver::ClosePwa() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()) << "No current app browser"; app_browser()->window()->Close(); ui_test_utils::WaitForBrowserToClose(app_browser()); @@ -746,20 +750,23 @@ } void WebAppIntegrationTestDriver::DisableRunOnOsLogin(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; SetRunOnOsLoginMode(site, apps::RunOnOsLoginMode::kNotRun); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::EnableRunOnOsLogin(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; SetRunOnOsLoginMode(site, apps::RunOnOsLoginMode::kWindowed); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::CreateShortcut(Site site, WindowOptions options) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; MaybeNavigateTabbedBrowserInScope(site); bool open_in_window = options == WindowOptions::kWindowed; chrome::SetAutoAcceptWebAppDialogForTesting( @@ -780,7 +787,8 @@ } void WebAppIntegrationTestDriver::InstallMenuOption(InstallableSite site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; MaybeNavigateTabbedBrowserInScope(InstallableSiteToSite(site)); chrome::SetAutoAcceptPWAInstallConfirmationForTesting(/*auto_accept=*/true); BrowserAddedWaiter browser_added_waiter; @@ -797,7 +805,8 @@ #if !BUILDFLAG(IS_CHROMEOS) void WebAppIntegrationTestDriver::InstallLocally(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -820,7 +829,8 @@ #endif void WebAppIntegrationTestDriver::InstallOmniboxIcon(InstallableSite site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; MaybeNavigateTabbedBrowserInScope(InstallableSiteToSite(site)); chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true); @@ -852,7 +862,8 @@ void WebAppIntegrationTestDriver::InstallPolicyApp(Site site, ShortcutOptions shortcut, WindowOptions window) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; base::Value container = base::Value(window == WindowOptions::kWindowed ? kDefaultLaunchContainerWindowValue : kDefaultLaunchContainerTabValue); @@ -863,7 +874,8 @@ } void WebAppIntegrationTestDriver::EnableWindowControlsOverlay(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()); BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); @@ -878,7 +890,8 @@ } void WebAppIntegrationTestDriver::DisableWindowControlsOverlay(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()); BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); @@ -893,26 +906,30 @@ } void WebAppIntegrationTestDriver::ApplyRunOnOsLoginPolicyAllowed(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ApplyRunOnOsLoginPolicy(site, kAllowed); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::ApplyRunOnOsLoginPolicyBlocked(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ApplyRunOnOsLoginPolicy(site, kBlocked); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::ApplyRunOnOsLoginPolicyRunWindowed( Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ApplyRunOnOsLoginPolicy(site, kRunWindowed); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::RemoveRunOnOsLoginPolicy(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; GURL url = GetAppStartURL(site); { ListPrefUpdate updateList(profile()->GetPrefs(), prefs::kWebAppSettings); @@ -924,7 +941,8 @@ } void WebAppIntegrationTestDriver::LaunchFromChromeApps(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -950,7 +968,8 @@ } void WebAppIntegrationTestDriver::LaunchFromLaunchIcon(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -982,7 +1001,8 @@ } void WebAppIntegrationTestDriver::LaunchFromMenuOption(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1003,7 +1023,8 @@ void WebAppIntegrationTestDriver::LaunchFromPlatformShortcut(Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1035,7 +1056,8 @@ void WebAppIntegrationTestDriver::OpenAppSettingsFromAppMenu(Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; Browser* app_browser = GetAppBrowserForSite(site); ASSERT_TRUE(app_browser); @@ -1067,7 +1089,8 @@ void WebAppIntegrationTestDriver::OpenAppSettingsFromChromeApps(Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1094,7 +1117,8 @@ void WebAppIntegrationTestDriver::CreateShortcutsFromList(Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1129,7 +1153,8 @@ void WebAppIntegrationTestDriver::DeletePlatformShortcut(Site site) { if (!before_state_change_action_state_ && !after_state_change_action_state_) return; - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; base::ScopedAllowBlockingForTesting allow_blocking; AppId app_id = GetAppIdBySiteMode(site); std::string app_name = provider()->registrar().GetAppShortName(app_id); @@ -1186,20 +1211,23 @@ } void WebAppIntegrationTestDriver::NavigateBrowser(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; NavigateTabbedBrowserToSite(GetInScopeURL(site), NavigationMode::kCurrentTab); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::NavigatePwa(Site pwa, Site to) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; app_browser_ = GetAppBrowserForSite(pwa); NavigateToURLAndWait(app_browser(), GetAppStartURL(to), false); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::NavigateNotfoundUrl() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; NavigateTabbedBrowserToSite( delegate_->EmbeddedTestServer()->GetURL("/non-existant/index.html"), NavigationMode::kCurrentTab); @@ -1207,7 +1235,8 @@ } void WebAppIntegrationTestDriver::ManifestUpdateIcon(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_EQ(Site::kStandalone, site) << "Only site mode of 'Standalone' is supported"; @@ -1231,7 +1260,8 @@ } void WebAppIntegrationTestDriver::ManifestUpdateTitle(Site site, Title title) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_EQ(Site::kStandalone, site) << "Only site mode of 'Standalone' is supported"; ASSERT_EQ(Title::kStandaloneUpdated, title) @@ -1251,7 +1281,8 @@ void WebAppIntegrationTestDriver::ManifestUpdateDisplay(Site site, Display display) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; std::string start_url_path = GetSiteConfiguration(site).relative_start_url; std::string manifest_url_param = @@ -1264,7 +1295,8 @@ } void WebAppIntegrationTestDriver::ManifestUpdateScopeTo(Site app, Site scope) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; // The `scope_mode` would be changing the scope set in the manifest file. For // simplicity, right now only Standalone is supported, so that is just // hardcoded in manifest_scope_Standalone.json, which is specified in the URL. @@ -1276,7 +1308,8 @@ } void WebAppIntegrationTestDriver::OpenInChrome() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_TRUE(IsBrowserOpen(app_browser())) << "No current app browser."; AppId app_id = app_browser()->app_controller()->app_id(); GURL app_url = GetCurrentTab(app_browser())->GetURL(); @@ -1290,7 +1323,8 @@ } void WebAppIntegrationTestDriver::SetOpenInTab(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1307,7 +1341,8 @@ } void WebAppIntegrationTestDriver::SetOpenInWindow(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1324,7 +1359,8 @@ } void WebAppIntegrationTestDriver::SwitchProfileClients(ProfileClient client) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; std::vector<Profile*> profiles = delegate_->GetAllProfiles(); ASSERT_EQ(2U, profiles.size()) << "Cannot switch profile clients if delegate only supports one profile"; @@ -1344,19 +1380,22 @@ } void WebAppIntegrationTestDriver::SyncTurnOff() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; delegate_->SyncTurnOff(); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::SyncTurnOn() { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; delegate_->SyncTurnOn(); AfterStateChangeAction(); } void WebAppIntegrationTestDriver::UninstallFromList(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1404,7 +1443,8 @@ void WebAppIntegrationTestDriver::UninstallFromAppSettings(Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1438,7 +1478,8 @@ } void WebAppIntegrationTestDriver::UninstallFromMenu(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1471,7 +1512,8 @@ } void WebAppIntegrationTestDriver::UninstallPolicyApp(Site site) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; GURL url = GetAppStartURL(site); auto policy_app = GetAppBySiteMode(before_state_change_action_state_.get(), profile(), site); @@ -1507,7 +1549,8 @@ void WebAppIntegrationTestDriver::UninstallFromOs(Site site) { #if BUILDFLAG(IS_WIN) - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1532,7 +1575,8 @@ } void WebAppIntegrationTestDriver::CheckAppListEmpty() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<ProfileState> state = GetStateForProfile(after_state_change_action_state_.get(), profile()); ASSERT_TRUE(state.has_value()); @@ -1541,7 +1585,8 @@ } void WebAppIntegrationTestDriver::CheckAppInListNotLocallyInstalled(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; // Note: This is a partially supported action. absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); @@ -1551,7 +1596,8 @@ } void WebAppIntegrationTestDriver::CheckAppInListTabbed(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; // Note: This is a partially supported action. absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); @@ -1561,7 +1607,8 @@ } void WebAppIntegrationTestDriver::CheckAppInListWindowed(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; // Note: This is a partially supported action. absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); @@ -1571,7 +1618,8 @@ } void WebAppIntegrationTestDriver::CheckAppNavigationIsStartUrl() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; ASSERT_FALSE(active_app_id_.empty()); ASSERT_TRUE(app_browser()); GURL url = @@ -1583,7 +1631,8 @@ void WebAppIntegrationTestDriver::CheckBrowserNavigationIsAppSettings( Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; AppId app_id = GetAppIdBySiteMode(site); ASSERT_TRUE(provider()->registrar().GetAppById(app_id)) << "No app installed for site: " << static_cast<int>(site); @@ -1599,7 +1648,8 @@ } void WebAppIntegrationTestDriver::CheckAppNotInList(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); EXPECT_FALSE(app_state.has_value()); @@ -1607,7 +1657,8 @@ } void WebAppIntegrationTestDriver::CheckPlatformShortcutAndIcon(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); ASSERT_TRUE(app_state); @@ -1620,7 +1671,8 @@ // when no web app is installed (or any other action has happened yet). if (!before_state_change_action_state_ && !after_state_change_action_state_) return; - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); if (!app_state) { @@ -1642,7 +1694,8 @@ } void WebAppIntegrationTestDriver::CheckAppIcon(Site site, Color color) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); ASSERT_TRUE(app_state); @@ -1699,7 +1752,8 @@ } void WebAppIntegrationTestDriver::CheckAppTitle(Site site, Title title) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); ASSERT_TRUE(app_state); @@ -1719,7 +1773,8 @@ void WebAppIntegrationTestDriver::CheckWindowModeIsNotVisibleInAppSettings( Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); @@ -1749,7 +1804,8 @@ } void WebAppIntegrationTestDriver::CheckInstallable() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<BrowserState> browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); ASSERT_TRUE(browser_state.has_value()); @@ -1761,7 +1817,8 @@ } void WebAppIntegrationTestDriver::CheckInstallIconShown() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<BrowserState> browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); ASSERT_TRUE(browser_state.has_value()); @@ -1771,7 +1828,8 @@ } void WebAppIntegrationTestDriver::CheckInstallIconNotShown() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<BrowserState> browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); ASSERT_TRUE(browser_state.has_value()); @@ -1781,7 +1839,8 @@ } void WebAppIntegrationTestDriver::CheckLaunchIconShown() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<BrowserState> browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); ASSERT_TRUE(browser_state.has_value()); @@ -1790,7 +1849,8 @@ } void WebAppIntegrationTestDriver::CheckLaunchIconNotShown() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<BrowserState> browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); ASSERT_TRUE(browser_state.has_value()); @@ -1799,7 +1859,8 @@ } void WebAppIntegrationTestDriver::CheckTabCreated() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; DCHECK(before_state_change_action_state_); absl::optional<BrowserState> most_recent_browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); @@ -1817,7 +1878,8 @@ } void WebAppIntegrationTestDriver::CheckTabNotCreated() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; DCHECK(before_state_change_action_state_); absl::optional<BrowserState> most_recent_browser_state = GetStateForBrowser( after_state_change_action_state_.get(), profile(), browser()); @@ -1831,7 +1893,8 @@ } void WebAppIntegrationTestDriver::CheckCustomToolbar() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()); EXPECT_TRUE(app_browser()->app_controller()->ShouldShowCustomTabBar()); BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); @@ -1843,7 +1906,8 @@ } void WebAppIntegrationTestDriver::CheckNoToolbar() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()); EXPECT_FALSE(app_browser()->app_controller()->ShouldShowCustomTabBar()); BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); @@ -1852,7 +1916,8 @@ } void WebAppIntegrationTestDriver::CheckRunOnOsLoginEnabled(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); ASSERT_TRUE(app_state); @@ -1881,7 +1946,8 @@ } void WebAppIntegrationTestDriver::CheckRunOnOsLoginDisabled(Site site) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); ASSERT_TRUE(app_state); @@ -1909,7 +1975,8 @@ Site site, std::string file_extension) { #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; ASSERT_TRUE(IsFileHandledBySite(site, file_extension)); AfterStateCheckAction(); #endif @@ -1919,7 +1986,8 @@ Site site, std::string file_extension) { #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; ASSERT_FALSE(IsFileHandledBySite(site, file_extension)); AfterStateCheckAction(); #endif @@ -1927,7 +1995,8 @@ void WebAppIntegrationTestDriver::CheckUserCannotSetRunOnOsLogin(Site site) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetAppBySiteMode(after_state_change_action_state_.get(), profile(), site); ASSERT_TRUE(app_state); @@ -1957,7 +2026,8 @@ void WebAppIntegrationTestDriver::CheckUserDisplayModeInternal( UserDisplayMode user_display_mode) { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; absl::optional<AppState> app_state = GetStateForAppId( after_state_change_action_state_.get(), profile(), active_app_id_); ASSERT_TRUE(app_state.has_value()); @@ -1966,7 +2036,8 @@ } void WebAppIntegrationTestDriver::CheckWindowClosed() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; DCHECK(before_state_change_action_state_); absl::optional<ProfileState> after_action_profile = GetStateForProfile(after_state_change_action_state_.get(), profile()); @@ -1980,7 +2051,8 @@ } void WebAppIntegrationTestDriver::CheckWindowCreated() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; DCHECK(before_state_change_action_state_); absl::optional<ProfileState> after_action_profile = GetStateForProfile(after_state_change_action_state_.get(), profile()); @@ -1999,7 +2071,8 @@ void WebAppIntegrationTestDriver::CheckWindowControlsOverlayToggle( Site site, IsShown is_shown) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; if (!app_browser()) app_browser_ = GetAppBrowserForSite(site); ASSERT_TRUE(app_browser()); @@ -2010,7 +2083,8 @@ void WebAppIntegrationTestDriver::CheckWindowControlsOverlay(Site site, IsOn is_on) { - BeforeStateChangeAction(__FUNCTION__); + if (!BeforeStateChangeAction(__FUNCTION__)) + return; ASSERT_TRUE(app_browser()); BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); EXPECT_EQ(app_view->IsWindowControlsOverlayEnabled(), is_on == IsOn::kOn); @@ -2018,7 +2092,8 @@ } void WebAppIntegrationTestDriver::CheckWindowDisplayMinimal() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; DCHECK(app_browser()); DCHECK(app_browser()->app_controller()->AsWebAppBrowserController()); absl::optional<AppState> app_state = GetStateForAppId( @@ -2039,7 +2114,8 @@ } void WebAppIntegrationTestDriver::CheckWindowDisplayStandalone() { - BeforeStateCheckAction(__FUNCTION__); + if (!BeforeStateCheckAction(__FUNCTION__)) + return; DCHECK(app_browser()); DCHECK(app_browser()->app_controller()->AsWebAppBrowserController()); absl::optional<AppState> app_state = GetStateForAppId( @@ -2087,8 +2163,10 @@ } } -void WebAppIntegrationTestDriver::BeforeStateChangeAction( +bool WebAppIntegrationTestDriver::BeforeStateChangeAction( const char* function) { + if (testing::Test::HasFatalFailure() && !in_tear_down_) + return false; LOG(INFO) << "BeforeStateChangeAction: " << std::string(executing_action_level_, ' ') << function; ++executing_action_level_; @@ -2101,6 +2179,7 @@ } else { before_state_change_action_state_ = std::move(current_state); } + return true; } void WebAppIntegrationTestDriver::AfterStateChangeAction() { @@ -2128,12 +2207,15 @@ after_state_change_action_state_ = ConstructStateSnapshot(); } -void WebAppIntegrationTestDriver::BeforeStateCheckAction(const char* function) { +bool WebAppIntegrationTestDriver::BeforeStateCheckAction(const char* function) { + if (testing::Test::HasFatalFailure() && !in_tear_down_) + return false; ++executing_action_level_; provider()->command_manager().AwaitAllCommandsCompleteForTesting(); LOG(INFO) << "BeforeStateCheckAction: " << std::string(executing_action_level_, ' ') << function; DCHECK(after_state_change_action_state_); + return true; } void WebAppIntegrationTestDriver::AfterStateCheckAction() {
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h index 5780e90..162ff90d 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -284,11 +284,13 @@ private: // Must be called at the beginning of every state change action function. - void BeforeStateChangeAction(const char* function); + // Returns if the test should continue. + bool BeforeStateChangeAction(const char* function); // Must be called at the end of every state change action function. void AfterStateChangeAction(); // Must be called at the beginning of every state check action function. - void BeforeStateCheckAction(const char* function); + // Returns if the test should continue. + bool BeforeStateCheckAction(const char* function); // Must be called at the end of every state check action function. void AfterStateCheckAction(); @@ -391,6 +393,8 @@ // enabled. Triage. raw_ptr<Browser, DegradeToNoOpWhenMTE> app_browser_ = nullptr; + bool in_tear_down_ = false; + std::unique_ptr<views::NamedWidgetShownWaiter> app_id_update_dialog_waiter_; base::ScopedObservation<web_app::WebAppInstallManager, web_app::WebAppInstallManagerObserver>
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 0804f64..3aaaa9bf 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/history_clusters/history_clusters_service_factory.h" #include "chrome/browser/media/history/media_history_keyed_service.h" #include "chrome/browser/media/media_engagement_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_internals_ui.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -80,7 +81,6 @@ #include "components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.h" #include "components/history_clusters/history_clusters_internals/webui/url_constants.h" #include "components/nacl/common/buildflags.h" -#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h" #include "components/optimization_guide/optimization_guide_internals/webui/url_constants.h" #include "components/prefs/pref_service.h" #include "components/reading_list/features/reading_list_switches.h" @@ -445,15 +445,10 @@ template <> WebUIController* NewWebUI<OptimizationGuideInternalsUI>(WebUI* web_ui, const GURL& url) { - Profile* profile = Profile::FromWebUI(web_ui); - auto* service = OptimizationGuideKeyedServiceFactory::GetForProfile(profile); - if (!service) - return nullptr; - return new OptimizationGuideInternalsUI( - web_ui, service->GetOptimizationGuideLogger(), - base::BindOnce(&SetUpWebUIDataSource, web_ui, - optimization_guide_internals:: - kChromeUIOptimizationGuideInternalsHost)); + return OptimizationGuideInternalsUI::MaybeCreateOptimizationGuideInternalsUI( + web_ui, base::BindOnce(&SetUpWebUIDataSource, web_ui, + optimization_guide_internals:: + kChromeUIOptimizationGuideInternalsHost)); } template <>
diff --git a/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc b/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc index 65ec371..5df15b3d 100644 --- a/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc +++ b/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc
@@ -42,6 +42,7 @@ {"historyClustersTabLabel", IDS_HISTORY_CLUSTERS_JOURNEYS_TAB_LABEL}, {"historyListTabLabel", IDS_HISTORY_CLUSTERS_LIST_TAB_LABEL}, {"loadMoreButtonLabel", IDS_HISTORY_CLUSTERS_LOAD_MORE_BUTTON_LABEL}, + {"noResults", IDS_HISTORY_CLUSTERS_NO_RESULTS}, {"noSearchResults", IDS_HISTORY_CLUSTERS_NO_SEARCH_RESULTS}, {"openAllInTabGroup", IDS_HISTORY_CLUSTERS_OPEN_ALL_IN_TABGROUP}, {"relatedSearchesHeader", IDS_HISTORY_CLUSTERS_RELATED_SEARCHES_HEADER},
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc index e740242..5b1c019d 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -200,6 +200,8 @@ switch (web_app->GetHighestPrioritySource()) { case WebAppManagement::kSystem: return apps::mojom::InstallReason::kSystem; + case WebAppManagement::kKiosk: + return apps::mojom::InstallReason::kKiosk; case WebAppManagement::kPolicy: return apps::mojom::InstallReason::kPolicy; case WebAppManagement::kSubApp: @@ -235,6 +237,7 @@ case webapps::WebappInstallSource::MENU_CREATE_SHORTCUT: case webapps::WebappInstallSource::SUB_APP: case webapps::WebappInstallSource::CHROME_SERVICE: + case webapps::WebappInstallSource::KIOSK: return apps::mojom::InstallSource::kBrowser; case webapps::WebappInstallSource::ARC: return apps::mojom::InstallSource::kPlayStore;
diff --git a/chrome/browser/web_applications/proto/web_app.proto b/chrome/browser/web_applications/proto/web_app.proto index 31894f1..a8e0edb 100644 --- a/chrome/browser/web_applications/proto/web_app.proto +++ b/chrome/browser/web_applications/proto/web_app.proto
@@ -62,6 +62,7 @@ required bool sync = 4; required bool default = 5; optional bool sub_app = 6; + optional bool kiosk = 7; } // Properties for integrating with Chrome OS UI surfaces. @@ -112,6 +113,7 @@ WEBAPPSTORE = 4; SYNC = 5; DEFAULT = 6; + KIOSK = 7; } message ManagementToExternalConfigInfo {
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc index 5151fb2f..1fe13b9 100644 --- a/chrome/browser/web_applications/test/web_app_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -369,6 +369,10 @@ app->AddSource(WebAppManagement::kSubApp); management_types.push_back(WebAppManagement::kSubApp); } + if (random.next_bool()) { + app->AddSource(WebAppManagement::kKiosk); + management_types.push_back(WebAppManagement::kKiosk); + } // Must always be at least one source. if (!app->HasAnySources()) {
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc index f852685..a3f441f 100644 --- a/chrome/browser/web_applications/web_app.cc +++ b/chrome/browser/web_applications/web_app.cc
@@ -127,6 +127,10 @@ return sources_[WebAppManagement::kSubApp]; } +bool WebApp::IsKioskInstalledApp() const { + return sources_[WebAppManagement::kKiosk]; +} + bool WebApp::CanUserUninstallWebApp() const { return web_app::CanUserUninstallWebApp(sources_); } @@ -689,6 +693,8 @@ switch (source) { case WebAppManagement::Type::kSystem: return "System"; + case WebAppManagement::Type::kKiosk: + return "Kiosk"; case WebAppManagement::Type::kPolicy: return "Policy"; case WebAppManagement::Type::kSubApp:
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h index 65169a8..f6a3b20 100644 --- a/chrome/browser/web_applications/web_app.h +++ b/chrome/browser/web_applications/web_app.h
@@ -363,6 +363,7 @@ bool IsSystemApp() const; bool IsWebAppStoreInstalledApp() const; bool IsSubAppInstalledApp() const; + bool IsKioskInstalledApp() const; bool CanUserUninstallWebApp() const; bool WasInstalledByUser() const; // Returns the highest priority source. AppService assumes that every app has
diff --git a/chrome/browser/web_applications/web_app_constants.cc b/chrome/browser/web_applications/web_app_constants.cc index 9906bcfb..9a658e8 100644 --- a/chrome/browser/web_applications/web_app_constants.cc +++ b/chrome/browser/web_applications/web_app_constants.cc
@@ -17,6 +17,8 @@ switch (type) { case WebAppManagement::Type::kSystem: return os << "System"; + case WebAppManagement::Type::kKiosk: + return os << "Kiosk"; case WebAppManagement::Type::kPolicy: return os << "Policy"; case WebAppManagement::Type::kSubApp:
diff --git a/chrome/browser/web_applications/web_app_constants.h b/chrome/browser/web_applications/web_app_constants.h index 39d9832f..a1f283e9 100644 --- a/chrome/browser/web_applications/web_app_constants.h +++ b/chrome/browser/web_applications/web_app_constants.h
@@ -31,6 +31,8 @@ enum Type { kMinValue = 0, kSystem = kMinValue, + // Installed by Kiosk on Chrome OS. + kKiosk, kPolicy, kSubApp, kWebAppStore, @@ -134,6 +136,11 @@ // are not installed via ExternallyManagedAppManager. This is used in // ExternallyInstalledWebAppPrefs to track navigation url to app_id entries. kArc = 4, + + // Installed by Kiosk. There is no call to SynchronizeInstalledApps for this + // type because Kiosk apps are bound to their profiles. They will never be + // uninstalled in Kiosk sessions. + kKiosk = 5, }; // Icon size in pixels.
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index 47aa810..8513c4c 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc
@@ -236,6 +236,8 @@ [[fallthrough]]; case WebAppManagementProto::SYSTEM: return WebAppManagement::Type::kSystem; + case WebAppManagementProto::KIOSK: + return WebAppManagement::Type::kKiosk; case WebAppManagementProto::POLICY: return WebAppManagement::Type::kPolicy; case WebAppManagementProto::SUBAPP: @@ -253,6 +255,8 @@ switch (type) { case WebAppManagement::Type::kSystem: return WebAppManagementProto::SYSTEM; + case WebAppManagement::Type::kKiosk: + return WebAppManagementProto::KIOSK; case WebAppManagement::Type::kPolicy: return WebAppManagementProto::POLICY; case WebAppManagement::Type::kSubApp: @@ -374,6 +378,8 @@ web_app.sources_[WebAppManagement::kDefault]); local_data->mutable_sources()->set_sub_app( web_app.sources_[WebAppManagement::kSubApp]); + local_data->mutable_sources()->set_kiosk( + web_app.sources_[WebAppManagement::kKiosk]); local_data->set_is_locally_installed(web_app.is_locally_installed()); @@ -792,6 +798,9 @@ if (local_data.sources().has_sub_app()) { sources[WebAppManagement::kSubApp] = local_data.sources().sub_app(); } + if (local_data.sources().has_kiosk()) { + sources[WebAppManagement::kKiosk] = local_data.sources().kiosk(); + } if (!sources.any() && !local_data.is_uninstalling()) { DLOG(ERROR) << "WebApp proto parse error: no any source in sources field, " "and is_uninstalling isn't true.";
diff --git a/chrome/browser/web_applications/web_app_install_utils.cc b/chrome/browser/web_applications/web_app_install_utils.cc index 59671be..f87788a 100644 --- a/chrome/browser/web_applications/web_app_install_utils.cc +++ b/chrome/browser/web_applications/web_app_install_utils.cc
@@ -41,6 +41,7 @@ #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_chromeos_data.h" +#include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_icon_generator.h" #include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_sources.h" @@ -819,6 +820,8 @@ return webapps::WebappInstallSource::SYSTEM_DEFAULT; case ExternalInstallSource::kArc: return webapps::WebappInstallSource::ARC; + case ExternalInstallSource::kKiosk: + return webapps::WebappInstallSource::KIOSK; default: NOTREACHED(); return webapps::WebappInstallSource::SYNC; @@ -844,6 +847,9 @@ case ExternalInstallSource::kArc: uninstall_source = webapps::WebappUninstallSource::kArc; break; + case ExternalInstallSource::kKiosk: + NOTREACHED() << "Kiosk apps should not be uninstalled"; + uninstall_source = webapps::WebappUninstallSource::kUnknown; } return uninstall_source; @@ -876,6 +882,9 @@ case webapps::WebappInstallSource::EXTERNAL_POLICY: return WebAppManagement::kPolicy; + case webapps::WebappInstallSource::KIOSK: + return WebAppManagement::kKiosk; + case webapps::WebappInstallSource::SYSTEM_DEFAULT: return WebAppManagement::kSystem;
diff --git a/chrome/browser/web_applications/web_app_unittest.cc b/chrome/browser/web_applications/web_app_unittest.cc index 4f15e92c5..b9c9caa 100644 --- a/chrome/browser/web_applications/web_app_unittest.cc +++ b/chrome/browser/web_applications/web_app_unittest.cc
@@ -193,6 +193,9 @@ app.AddSource(WebAppManagement::kSystem); EXPECT_FALSE(app.WasInstalledByUser()); + app.AddSource(WebAppManagement::kKiosk); + EXPECT_FALSE(app.WasInstalledByUser()); + app.AddSource(WebAppManagement::kPolicy); EXPECT_FALSE(app.WasInstalledByUser()); @@ -205,6 +208,9 @@ app.RemoveSource(WebAppManagement::kSystem); EXPECT_FALSE(app.WasInstalledByUser()); + app.RemoveSource(WebAppManagement::kKiosk); + EXPECT_FALSE(app.WasInstalledByUser()); + app.RemoveSource(WebAppManagement::kPolicy); EXPECT_FALSE(app.WasInstalledByUser()); @@ -229,6 +235,8 @@ app.AddSource(WebAppManagement::kPolicy); EXPECT_FALSE(app.CanUserUninstallWebApp()); + app.AddSource(WebAppManagement::kKiosk); + EXPECT_FALSE(app.CanUserUninstallWebApp()); app.AddSource(WebAppManagement::kSystem); EXPECT_FALSE(app.CanUserUninstallWebApp()); @@ -242,6 +250,9 @@ app.RemoveSource(WebAppManagement::kSystem); EXPECT_FALSE(app.CanUserUninstallWebApp()); + app.RemoveSource(WebAppManagement::kKiosk); + EXPECT_FALSE(app.CanUserUninstallWebApp()); + app.RemoveSource(WebAppManagement::kPolicy); EXPECT_TRUE(app.CanUserUninstallWebApp());
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index f500e22..133c8a3a 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1660931915-e3d237b7ef4f5e5f5b092bf2ee5dbef7471660b5.profdata +chrome-linux-main-1660995807-4bbc9b61e7948760260d866f8ac4021f5e60fecb.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 7bbe3785..fcb5198 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1660931915-434ee39902a2a49541bf1e885174b731ed5873e1.profdata +chrome-mac-arm-main-1660995807-950a99a1f2d946f145b681be49da2bcb2eafeb78.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index fd8c346..a61c974 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1660931915-01748db33f1d1293e8643b2d0242151ac08d534c.profdata +chrome-mac-main-1660995807-13a4017a57bfade5f665ff755d76e0e8ae5f6ec4.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 06ebaeb6..75829334 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1660931915-829fed840eefe53900738c1b6b18a780456e26b4.profdata +chrome-win32-main-1660995807-b97690f864b4a7be6844eb1dcbd47d62349710de.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 8aa54861..6d455e9b 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1660931915-c3a2098161c9e48dacfae89eda246a32068f0f1e.profdata +chrome-win64-main-1660995807-beb177a92493776afd52633c6f842cc9b24a13ed.profdata
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl index 2b8adf7..d59be2a 100644 --- a/chrome/common/extensions/api/autotest_private.idl +++ b/chrome/common/extensions/api/autotest_private.idl
@@ -52,7 +52,8 @@ Default, Sync, User, - SubApp + SubApp, + Kiosk }; // A mapping of apps::mojom::Readiness
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 26773b3..c2b2756f 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -1338,6 +1338,20 @@ // accessibility feature that simulates forced colors mode at the browser level. const char kPageColors[] = "settings.a11y.page_colors"; +// Boolean Pref that indicates whether the user wants to enable page colors only +// when the OS is in an Increased Contrast mode such as High Contrast on Windows +// or Increased Contrast on Mac. +const char kApplyPageColorsOnlyOnIncreasedContrast[] = + "settings.a11y.apply_page_colors_only_on_increased_contrast"; + +#if BUILDFLAG(IS_WIN) +// Boolean that indicates what the default page colors state should be. When +// true, page colors will be 'High Contrast' when OS High Contrast is turned on, +// otherwise page colors will remain 'Off'. +const char kIsDefaultPageColorsOnHighContrast[] = + "settings.a11y.is_default_page_colors_on_high_contrast"; +#endif // BUILDFLAG(IS_WIN) + #if BUILDFLAG(IS_MAC) // Boolean that indicates whether the application should show the info bar // asking the user to set up automatic updates when Keystone promotion is
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 9186d5cb..7ac6d57 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -196,6 +196,10 @@ extern const char kLiveCaptionLanguageCode[]; #endif extern const char kPageColors[]; +extern const char kApplyPageColorsOnlyOnIncreasedContrast[]; +#if BUILDFLAG(IS_WIN) +extern const char kIsDefaultPageColorsOnHighContrast[]; +#endif #if BUILDFLAG(IS_MAC) extern const char kConfirmToQuitEnabled[]; extern const char kShowFullscreenToolbar[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index f0997bf1..6922bf9 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3298,6 +3298,7 @@ "../browser/ui/views/autofill/payments/webauthn_dialog_browsertest.cc", "../browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc", "../browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc", + "../browser/ui/views/bubble/bubble_frame_view_browsertest.cc", "../browser/ui/views/bubble/webui_bubble_manager_browsertest.cc", "../browser/ui/views/certificate_selector_dialog_browsertest.cc", "../browser/ui/views/collected_cookies_views_browsertest.cc",
diff --git a/chrome/test/data/web_apps/sample_web_app.json b/chrome/test/data/web_apps/sample_web_app.json index 5140440e..ce51432c 100644 --- a/chrome/test/data/web_apps/sample_web_app.json +++ b/chrome/test/data/web_apps/sample_web_app.json
@@ -1,28 +1,27 @@ { "!app_id": "eajjdjobhihlgobdfaehiiheinneagde", "!name": "Name1234", - "additional_search_terms": [ "Foo_1234_0" ], + "additional_search_terms": [ ], "allowed_launch_protocols": [ "web+test_1234_0", "web+test_1234_1" ], "always_show_toolbar_in_fullscreen": false, "app_service_icon_url": "chrome://app-icon/eajjdjobhihlgobdfaehiiheinneagde/32", - "app_size_in_bytes": "4226285750", + "app_size_in_bytes": "2353265476", "background_color": "rgba(77,188,194,0.9686274509803922)", "capture_links": "kNone", "chromeos_data": null, "client_data": { "system_web_app_data": null }, - "current_os_integration_states": null, "dark_mode_background_color": "none", "dark_mode_theme_color": "none", - "data_size_in_bytes": "3687618762", + "data_size_in_bytes": "3216637306", "description": "Description1234", - "disallowed_launch_protocols": [ "web+disallowed_1234_0", "web+disallowed_1234_1", "web+disallowed_1234_2", "web+disallowed_1234_3" ], - "display_mode": "standalone", - "display_override": [ "standalone" ], + "disallowed_launch_protocols": [ "web+disallowed_1234_0" ], + "display_mode": "minimal-ui", + "display_override": [ "minimal-ui", "standalone" ], "downloaded_icon_sizes": { "ANY": [ 256 ], - "MASKABLE": [ ], + "MASKABLE": [ 256 ], "MONOCHROME": [ 256 ] }, "downloaded_shortcuts_menu_icons_sizes": [ { @@ -31,27 +30,27 @@ "MONOCHROME": [ ], "index": 0 }, { - "ANY": [ 118 ], - "MASKABLE": [ 38 ], - "MONOCHROME": [ 228 ], + "ANY": [ 22 ], + "MASKABLE": [ 36 ], + "MONOCHROME": [ 184 ], "index": 1 }, { - "ANY": [ 80, 47 ], - "MASKABLE": [ 240, 164 ], - "MONOCHROME": [ 138, 107 ], + "ANY": [ 60, 109 ], + "MASKABLE": [ 136, 6 ], + "MONOCHROME": [ 98, 254 ], "index": 2 } ], "file_handler_approval_state": "kRequiresPrompt", "file_handler_os_integration_state": "kDisabled", "file_handlers": [ { "accept": [ { - "file_extensions": [ ".2591174840a", ".2591174840b" ], - "mime_type": "application/2591174840+foo" + "file_extensions": [ ".12899398600a", ".12899398600b" ], + "mime_type": "application/12899398600+foo" }, { - "file_extensions": [ ".2591174840a", ".2591174840b" ], - "mime_type": "application/2591174840+bar" + "file_extensions": [ ".12899398600a", ".12899398600b" ], + "mime_type": "application/12899398600+bar" } ], - "action": "https://example.com/open-2591174840", + "action": "https://example.com/open-12899398600", "downloaded_icons": [ { "purpose": "kAny", "square_size_px": 16, @@ -62,16 +61,16 @@ "url": "https://example.com/image2.png" } ], "launch_type": "kSingleClient", - "name": "2591174840 file" + "name": "12899398600 file" }, { "accept": [ { - "file_extensions": [ ".2591174841a", ".2591174841b" ], - "mime_type": "application/2591174841+foo" + "file_extensions": [ ".12899398601a", ".12899398601b" ], + "mime_type": "application/12899398601+foo" }, { - "file_extensions": [ ".2591174841a", ".2591174841b" ], - "mime_type": "application/2591174841+bar" + "file_extensions": [ ".12899398601a", ".12899398601b" ], + "mime_type": "application/12899398601+bar" } ], - "action": "https://example.com/open-2591174841", + "action": "https://example.com/open-12899398601", "downloaded_icons": [ { "purpose": "kAny", "square_size_px": 16, @@ -82,16 +81,16 @@ "url": "https://example.com/image2.png" } ], "launch_type": "kSingleClient", - "name": "2591174841 file" + "name": "12899398601 file" }, { "accept": [ { - "file_extensions": [ ".2591174842a", ".2591174842b" ], - "mime_type": "application/2591174842+foo" + "file_extensions": [ ".12899398602a", ".12899398602b" ], + "mime_type": "application/12899398602+foo" }, { - "file_extensions": [ ".2591174842a", ".2591174842b" ], - "mime_type": "application/2591174842+bar" + "file_extensions": [ ".12899398602a", ".12899398602b" ], + "mime_type": "application/12899398602+bar" } ], - "action": "https://example.com/open-2591174842", + "action": "https://example.com/open-12899398602", "downloaded_icons": [ { "purpose": "kAny", "square_size_px": 16, @@ -102,16 +101,16 @@ "url": "https://example.com/image2.png" } ], "launch_type": "kSingleClient", - "name": "2591174842 file" + "name": "12899398602 file" }, { "accept": [ { - "file_extensions": [ ".2591174843a", ".2591174843b" ], - "mime_type": "application/2591174843+foo" + "file_extensions": [ ".12899398603a", ".12899398603b" ], + "mime_type": "application/12899398603+foo" }, { - "file_extensions": [ ".2591174843a", ".2591174843b" ], - "mime_type": "application/2591174843+bar" + "file_extensions": [ ".12899398603a", ".12899398603b" ], + "mime_type": "application/12899398603+bar" } ], - "action": "https://example.com/open-2591174843", + "action": "https://example.com/open-12899398603", "downloaded_icons": [ { "purpose": "kAny", "square_size_px": 16, @@ -122,16 +121,16 @@ "url": "https://example.com/image2.png" } ], "launch_type": "kSingleClient", - "name": "2591174843 file" + "name": "12899398603 file" }, { "accept": [ { - "file_extensions": [ ".2591174844a", ".2591174844b" ], - "mime_type": "application/2591174844+foo" + "file_extensions": [ ".12899398604a", ".12899398604b" ], + "mime_type": "application/12899398604+foo" }, { - "file_extensions": [ ".2591174844a", ".2591174844b" ], - "mime_type": "application/2591174844+bar" + "file_extensions": [ ".12899398604a", ".12899398604b" ], + "mime_type": "application/12899398604+bar" } ], - "action": "https://example.com/open-2591174844", + "action": "https://example.com/open-12899398604", "downloaded_icons": [ { "purpose": "kAny", "square_size_px": 16, @@ -142,145 +141,167 @@ "url": "https://example.com/image2.png" } ], "launch_type": "kSingleClient", - "name": "2591174844 file" + "name": "12899398604 file" } ], - "install_source_for_metrics": 17, - "install_time": "1970-01-10 21:57:36.131 UTC", - "is_from_sync_and_pending_installation": false, + "install_source_for_metrics": 7, + "install_time": "1970-02-07 14:20:22.070 UTC", + "is_from_sync_and_pending_installation": true, "is_generated_icon": true, "is_locally_installed": false, - "is_storage_isolated": true, + "is_storage_isolated": false, "is_uninstalling": false, "isolation_data": { "content": { - "dev_mode_bundle": { - "path": "1234" + "dev_mode_proxy": { + "proxy_url": "1234" } } }, - "last_badging_time": "1970-01-13 20:12:59.451 UTC", - "last_launch_time": "1970-01-04 17:38:34.900 UTC", + "last_badging_time": "1970-01-04 17:38:34.900 UTC", + "last_launch_time": "1970-01-10 21:57:36.131 UTC", "launch_handler": { "client_mode": "kNavigateExisting" }, - "launch_query_params": "986688382", - "lock_screen_start_url": "https://example.com/scope1234/lock_screen_start_url3206632378", + "launch_query_params": "3011162902", + "lock_screen_start_url": "", "management_type_to_external_configuration_map": { "Default": { - "install_urls": [ "https://example.com/installer1_1234/", "https://example.com/installer2_1234/" ], - "is_placeholder": false + "install_urls": [ ], + "is_placeholder": true }, "SubApp": { - "install_urls": [ "https://example.com/installer1_1234/" ], + "install_urls": [ "https://example.com/installer2_1234/" ], "is_placeholder": true }, "WebAppStore": { "install_urls": [ "https://example.com/installer1_1234/", "https://example.com/installer2_1234/" ], - "is_placeholder": false + "is_placeholder": true } }, "manifest_icons": [ { "purpose": "kAny", - "square_size_px": 256, - "url": "https://example.com/icon2077353522" + "square_size_px": null, + "url": "https://example.com/icon4113628103" }, { "purpose": "kAny", "square_size_px": 256, - "url": "https://example.com/icon944292860" + "url": "https://example.com/icon3384912140" + }, { + "purpose": "kAny", + "square_size_px": 256, + "url": "https://example.com/icon24430731" + }, { + "purpose": "kAny", + "square_size_px": 256, + "url": "https://example.com/icon1545909404" + }, { + "purpose": "kAny", + "square_size_px": null, + "url": "https://example.com/icon820459685" } ], "manifest_id": null, - "manifest_update_time": "1970-01-21 01:09:01.170 UTC", + "manifest_update_time": "1970-02-12 16:20:18.762 UTC", "manifest_url": "https://example.com/manifest1234.json", - "note_taking_new_note_url": "", - "parent_app_id": "1112833914", - "permissions_policy": [ { - "allowed_origins": [ "https://app-1994259750.com", "https://app-1994259751.com", "https://app-1994259752.com", "https://app-1994259753.com", "https://app-1994259754.com" ], - "feature": "accelerometer", - "matches_all_origins": false, - "matches_opaque_src": false - }, { - "allowed_origins": [ "https://app-1994259750.com", "https://app-1994259751.com", "https://app-1994259752.com", "https://app-1994259753.com", "https://app-1994259754.com" ], - "feature": "accelerometer", - "matches_all_origins": false, - "matches_opaque_src": false - } ], + "note_taking_new_note_url": "https://example.com/scope1234/new_note163671199", + "parent_app_id": "", "protocol_handlers": [ { - "protocol": "web+test24741963850", - "url": "https://example.com/24741963850" + "protocol": "web+test2745665510", + "url": "https://example.com/2745665510" }, { - "protocol": "web+test24741963851", - "url": "https://example.com/24741963851" + "protocol": "web+test2745665511", + "url": "https://example.com/2745665511" }, { - "protocol": "web+test24741963852", - "url": "https://example.com/24741963852" + "protocol": "web+test2745665512", + "url": "https://example.com/2745665512" }, { - "protocol": "web+test24741963853", - "url": "https://example.com/24741963853" + "protocol": "web+test2745665513", + "url": "https://example.com/2745665513" }, { - "protocol": "web+test24741963854", - "url": "https://example.com/24741963854" + "protocol": "web+test2745665514", + "url": "https://example.com/2745665514" } ], - "run_on_os_login_mode": "windowed", + "run_on_os_login_mode": "not run", "run_on_os_login_os_integration_state": "not run", "scope": "https://example.com/scope1234/", "share_target": null, "shortcuts_menu_item_infos": [ { "icons": { - "ANY": [ ], - "MASKABLE": [ { - "square_size_px": 9, - "url": "https://example.com/shortcuts/icon302299027120" - } ], - "MONOCHROME": [ { - "square_size_px": 18, - "url": "https://example.com/shortcuts/icon302299027121" - } ] - }, - "name": "shortcut30229902712", - "url": "https://example.com/scope1234/shortcut30229902712" - }, { - "icons": { "ANY": [ { - "square_size_px": 14, - "url": "https://example.com/shortcuts/icon302299027111" - } ], - "MASKABLE": [ { - "square_size_px": 29, - "url": "https://example.com/shortcuts/icon302299027112" - }, { - "square_size_px": 7, - "url": "https://example.com/shortcuts/icon302299027110" - } ], - "MONOCHROME": [ ] - }, - "name": "shortcut30229902711", - "url": "https://example.com/scope1234/shortcut30229902711" - }, { - "icons": { - "ANY": [ { - "square_size_px": 0, - "url": "https://example.com/shortcuts/icon302299027100" + "square_size_px": 15, + "url": "https://example.com/shortcuts/icon257890465221" } ], "MASKABLE": [ ], "MONOCHROME": [ { - "square_size_px": 16, - "url": "https://example.com/shortcuts/icon302299027101" + "square_size_px": 26, + "url": "https://example.com/shortcuts/icon257890465222" + }, { + "square_size_px": 1, + "url": "https://example.com/shortcuts/icon257890465220" } ] }, - "name": "shortcut30229902710", - "url": "https://example.com/scope1234/shortcut30229902710" + "name": "shortcut25789046522", + "url": "https://example.com/scope1234/shortcut25789046522" + }, { + "icons": { + "ANY": [ { + "square_size_px": 13, + "url": "https://example.com/shortcuts/icon257890465211" + } ], + "MASKABLE": [ { + "square_size_px": 27, + "url": "https://example.com/shortcuts/icon257890465212" + }, { + "square_size_px": 0, + "url": "https://example.com/shortcuts/icon257890465210" + } ], + "MONOCHROME": [ ] + }, + "name": "shortcut25789046521", + "url": "https://example.com/scope1234/shortcut25789046521" + }, { + "icons": { + "ANY": [ { + "square_size_px": 21, + "url": "https://example.com/shortcuts/icon257890465202" + }, { + "square_size_px": 15, + "url": "https://example.com/shortcuts/icon257890465201" + }, { + "square_size_px": 7, + "url": "https://example.com/shortcuts/icon257890465200" + } ], + "MASKABLE": [ { + "square_size_px": 38, + "url": "https://example.com/shortcuts/icon257890465203" + } ], + "MONOCHROME": [ ] + }, + "name": "shortcut25789046520", + "url": "https://example.com/scope1234/shortcut25789046520" } ], "sources": [ "SubApp", "WebAppStore", "Sync", "Default" ], "start_url": "https://example.com/scope1234/start1234", "sync_fallback_data": { "manifest_icons": [ { "purpose": "kAny", - "square_size_px": 256, - "url": "https://example.com/icon2077353522" + "square_size_px": null, + "url": "https://example.com/icon4113628103" }, { "purpose": "kAny", "square_size_px": 256, - "url": "https://example.com/icon944292860" + "url": "https://example.com/icon3384912140" + }, { + "purpose": "kAny", + "square_size_px": 256, + "url": "https://example.com/icon24430731" + }, { + "purpose": "kAny", + "square_size_px": 256, + "url": "https://example.com/icon1545909404" + }, { + "purpose": "kAny", + "square_size_px": null, + "url": "https://example.com/icon820459685" } ], "name": "SyncName1234", "scope": "https://example.com/scope1234/", @@ -292,20 +313,20 @@ "url_handlers": [ { "exclude_paths": [ ], "has_origin_wildcard": true, - "origin": "https://app-29001084320.com", + "origin": "https://app-2894015890.com", "paths": [ ] }, { "exclude_paths": [ ], "has_origin_wildcard": true, - "origin": "https://app-29001084321.com", + "origin": "https://app-2894015891.com", "paths": [ ] }, { "exclude_paths": [ ], "has_origin_wildcard": true, - "origin": "https://app-29001084322.com", + "origin": "https://app-2894015892.com", "paths": [ ] } ], - "user_display_mode": "standalone", + "user_display_mode": "browser", "user_launch_ordinal": "INVALID[]", "user_page_ordinal": "INVALID[]", "window_controls_overlay_enabled": false
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js index b2fa775..c0212e4 100644 --- a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js +++ b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
@@ -6,7 +6,7 @@ import {FakeFeedbackServiceProvider} from 'chrome://os-feedback/fake_feedback_service_provider.js'; import {FakeHelpContentProvider} from 'chrome://os-feedback/fake_help_content_provider.js'; import {AdditionalContextQueryParam, FeedbackFlowElement, FeedbackFlowState} from 'chrome://os-feedback/feedback_flow.js'; -import {FeedbackAppExitPath, FeedbackContext, SendReportStatus} from 'chrome://os-feedback/feedback_types.js'; +import {FeedbackAppExitPath, FeedbackAppPreSubmitAction, FeedbackContext, SendReportStatus} from 'chrome://os-feedback/feedback_types.js'; import {OS_FEEDBACK_TRUSTED_ORIGIN} from 'chrome://os-feedback/help_content.js'; import {setFeedbackServiceProviderForTesting, setHelpContentProviderForTesting} from 'chrome://os-feedback/mojo_interface_provider.js'; import {SearchPageElement} from 'chrome://os-feedback/search_page.js'; @@ -435,6 +435,11 @@ let helpContentClicked = false; await initializePage(); + assertEquals( + 0, + feedbackServiceProvider.getRecordPreSubmitActionCallCount( + FeedbackAppPreSubmitAction.kViewedHelpContent)); + // Get Search Page. const SearchPage = getSearchPage(); const iframe = /** @type {!HTMLIFrameElement} */ ( @@ -448,6 +453,8 @@ if ('help-content-clicked-for-testing' === event.data.id && OS_FEEDBACK_TRUSTED_ORIGIN === event.origin) { helpContentClicked = true; + feedbackServiceProvider.recordPreSubmitAction( + FeedbackAppPreSubmitAction.kViewedHelpContent); } }); @@ -461,6 +468,11 @@ await eventToPromise('message', window); // Verify that help content have been clicked. assertTrue(helpContentClicked); + // Verify that viewedHelpContent metrics is emitted. + assertEquals( + 1, + feedbackServiceProvider.getRecordPreSubmitActionCallCount( + FeedbackAppPreSubmitAction.kViewedHelpContent)); }); // Test that correct exitPathMetrics is emitted when user clicks help content
diff --git a/chrome/updater/app/server/win/server.cc b/chrome/updater/app/server/win/server.cc index 85ca2ae8..6f8e8d9 100644 --- a/chrome/updater/app/server/win/server.cc +++ b/chrome/updater/app/server/win/server.cc
@@ -301,7 +301,13 @@ AddComServerWorkItems(updater_path, false, list.get()); } - return list->Do(); + if (list->Do()) { + CheckComInterfaceTypeLib(updater_scope(), true); + CheckComInterfaceTypeLib(updater_scope(), false); + return true; + } + + return false; } bool ComServerApp::MigrateLegacyUpdaters(
diff --git a/chrome/updater/win/setup/setup.cc b/chrome/updater/win/setup/setup.cc index 4e0ee30..151b03a 100644 --- a/chrome/updater/win/setup/setup.cc +++ b/chrome/updater/win/setup/setup.cc
@@ -165,6 +165,9 @@ } VLOG(1) << "Setup succeeded."; + + CheckComInterfaceTypeLib(scope, true); + return 0; }
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc index 2ff77780..9b08f14 100644 --- a/chrome/updater/win/setup/setup_util.cc +++ b/chrome/updater/win/setup/setup_util.cc
@@ -7,21 +7,25 @@ #include <regstr.h> #include <shlobj.h> #include <windows.h> +#include <wrl/client.h> #include <string> #include <unordered_map> #include <vector> #include "base/check.h" +#include "base/check_op.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/logging.h" #include "base/no_destructor.h" +#include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" +#include "base/win/registry.h" #include "base/win/win_util.h" #include "chrome/installer/util/install_service_work_item.h" #include "chrome/installer/util/registry_util.h" @@ -379,4 +383,48 @@ run_value_name); } +void CheckComInterfaceTypeLib(UpdaterScope scope, bool is_internal) { + for (const auto& iid : GetInterfaces(is_internal)) { + base::FilePath typelib_path; + CHECK(base::PathService::Get(base::DIR_EXE, &typelib_path)); + typelib_path = typelib_path.Append(GetExecutableRelativePath()) + .Append(GetComTypeLibResourceIndex(iid)); + + Microsoft::WRL::ComPtr<ITypeLib> type_lib; + if (HRESULT hr = ::LoadTypeLib(typelib_path.value().c_str(), &type_lib); + FAILED(hr)) { + LOG(ERROR) << __func__ << " ::LoadTypeLib failed: " << typelib_path + << ": " << std::hex << hr; + return; + } + + Microsoft::WRL::ComPtr<ITypeInfo> type_info; + if (HRESULT hr = type_lib->GetTypeInfoOfGuid(iid, &type_info); FAILED(hr)) { + LOG(ERROR) << __func__ << " ::GetTypeInfoOfGuid failed" + << ": " << std::hex << hr + << ": IID: " << base::win::WStringFromGUID(iid); + return; + } + + const HKEY root = UpdaterScopeToHKeyRoot(scope); + const std::wstring typelib_reg_path = GetComTypeLibRegistryPath(iid); + + std::wstring val; + const std::wstring typelib_reg_path_win32 = + typelib_reg_path + L"\\1.0\\0\\win32"; + const std::wstring typelib_reg_path_win64 = + typelib_reg_path + L"\\1.0\\0\\win64"; + + for (const auto& path : {typelib_reg_path_win32, typelib_reg_path_win64}) { + CHECK_EQ( + base::win::RegKey(root, path.c_str(), KEY_READ).ReadValue(L"", &val), + ERROR_SUCCESS) + << ": " << root << ": " << path << ": " + << base::win::WStringFromGUID(iid); + VLOG(1) << __func__ << ": " << path << ": " << val << ": " + << base::win::WStringFromGUID(iid); + } + } +} + } // namespace updater
diff --git a/chrome/updater/win/setup/setup_util.h b/chrome/updater/win/setup/setup_util.h index b8a2877..24cce22 100644 --- a/chrome/updater/win/setup/setup_util.h +++ b/chrome/updater/win/setup/setup_util.h
@@ -99,6 +99,13 @@ // `run_value_name`. bool UnregisterUserRunAtStartup(const std::wstring& run_value_name); +// Loads the typelib and typeinfo for all interfaces from updater.exe. Logs on +// failure. +// If the typelib loads successfully, logs the registry entries for the typelib. +// TODO(crbug.com/1341471) - revert the CL that introduced the check after the +// bug is resolved. +void CheckComInterfaceTypeLib(UpdaterScope scope, bool is_internal); + } // namespace updater #endif // CHROME_UPDATER_WIN_SETUP_SETUP_UTIL_H_
diff --git a/chrome/updater/win/update_service_internal_proxy.cc b/chrome/updater/win/update_service_internal_proxy.cc index 9a17891..f072f24 100644 --- a/chrome/updater/win/update_service_internal_proxy.cc +++ b/chrome/updater/win/update_service_internal_proxy.cc
@@ -11,9 +11,8 @@ #include "base/callback.h" #include "base/check.h" #include "base/check_op.h" -#include "base/files/file_path.h" #include "base/logging.h" -#include "base/path_service.h" +#include "base/synchronization/waitable_event.h" #include "base/task/bind_post_task.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_traits.h" @@ -21,14 +20,11 @@ #include "base/threading/platform_thread.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/win/registry.h" -#include "base/win/win_util.h" +#include "base/time/time.h" #include "chrome/updater/app/server/win/updater_internal_idl.h" #include "chrome/updater/updater_scope.h" -#include "chrome/updater/util.h" #include "chrome/updater/win/setup/setup_util.h" #include "chrome/updater/win/win_constants.h" -#include "chrome/updater/win/win_util.h" #include "chrome/updater/win/wrl_module_initializer.h" namespace updater { @@ -193,52 +189,6 @@ base::BindPostTask(main_task_runner_, std::move(callback)))); } -namespace { - -// TODO(crbug.com/1341471) - revert the CL that introduced the check after the -// bug is resolved. Loads the typelib and typeinfo for `iid` from updater.exe. -// Logs on failure. If the typelib loads successfully, logs the registry entries -// for the typelib for `iid`. -void LogComInterfaceTypeLib(UpdaterScope scope, REFIID iid) { - base::FilePath typelib_path; - CHECK(base::PathService::Get(base::DIR_EXE, &typelib_path)); - typelib_path = typelib_path.Append(GetExecutableRelativePath()) - .Append(GetComTypeLibResourceIndex(iid)); - - Microsoft::WRL::ComPtr<ITypeLib> type_lib; - if (HRESULT hr = ::LoadTypeLib(typelib_path.value().c_str(), &type_lib); - FAILED(hr)) { - LOG(ERROR) << __func__ << " ::LoadTypeLib failed: " << typelib_path << ": " - << std::hex << hr; - return; - } - - Microsoft::WRL::ComPtr<ITypeInfo> type_info; - if (HRESULT hr = type_lib->GetTypeInfoOfGuid(iid, &type_info); FAILED(hr)) { - LOG(ERROR) << __func__ << " ::GetTypeInfoOfGuid failed" - << ": " << std::hex << hr - << ": IID: " << base::win::WStringFromGUID(iid); - return; - } - - const HKEY root = UpdaterScopeToHKeyRoot(scope); - const std::wstring typelib_reg_path = GetComTypeLibRegistryPath(iid); - - std::wstring val; - const std::wstring typelib_reg_path_win32 = - typelib_reg_path + L"\\1.0\\0\\win32"; - const std::wstring typelib_reg_path_win64 = - typelib_reg_path + L"\\1.0\\0\\win64"; - - for (const auto& path : {typelib_reg_path_win32, typelib_reg_path_win64}) { - CHECK(base::win::RegKey(root, path.c_str(), KEY_READ).ReadValue(L"", &val)); - VLOG(1) << __func__ << ": " << path << ": " << val << ": " - << base::win::WStringFromGUID(iid); - } -} - -} // namespace - void UpdateServiceInternalProxy::InitializeUpdateServiceOnSTA( base::OnceClosure callback) { DCHECK(com_task_runner_->BelongsToCurrentThread()); @@ -259,7 +209,19 @@ if (FAILED(hr)) { VLOG(2) << "Failed to query the updater_internal interface. " << std::hex << hr; - LogComInterfaceTypeLib(scope_, __uuidof(IUpdaterInternal)); + + // TODO(crbug.com/1341471) - revert the CL that introduced this check after + // the bug is resolved. + for (int i = 0; i < 10; ++i) { + base::WaitableEvent().TimedWait(base::Seconds(1)); + CHECK(FAILED(server.As(&updater_internal))) + << "Unexpectedly succeeded in querying the updater_internal " + "interface after retrying: " + << i; + } + + CheckComInterfaceTypeLib(scope_, true); + CheckComInterfaceTypeLib(scope_, false); std::move(callback).Run(); return; }
diff --git a/chromeos/ash/components/network/hidden_network_handler.cc b/chromeos/ash/components/network/hidden_network_handler.cc index 9348967..117c8fa5 100644 --- a/chromeos/ash/components/network/hidden_network_handler.cc +++ b/chromeos/ash/components/network/hidden_network_handler.cc
@@ -5,10 +5,29 @@ #include "chromeos/ash/components/network/hidden_network_handler.h" #include "ash/constants/ash_features.h" +#include "base/timer/timer.h" #include "chromeos/ash/components/network/network_configuration_handler.h" +#include "chromeos/ash/components/network/network_handler.h" +#include "chromeos/ash/components/network/network_metadata_store.h" #include "chromeos/ash/components/network/network_state_handler.h" +#include "components/device_event_log/device_event_log.h" namespace ash { +namespace { + +constexpr base::TimeDelta kOneDay = base::Days(1); + +void OnRemoveConfigurationSuccess(const std::string guid) { + NET_LOG(EVENT) << "Successfully removed wrongly hidden network: " << guid; +} + +void OnRemoveConfigurationFailure(const std::string guid, + const std::string& error_name) { + NET_LOG(EVENT) << "Failed to remove wrongly hidden network: " << guid + << ", error: " << error_name; +} + +} // namespace HiddenNetworkHandler::HiddenNetworkHandler() { DCHECK(base::FeatureList::IsEnabled(features::kHiddenNetworkMigration)); @@ -17,8 +36,60 @@ void HiddenNetworkHandler::Init( NetworkStateHandler* network_state_handler, NetworkConfigurationHandler* network_configuration_handler) { + DCHECK(NetworkHandler::IsInitialized()); network_state_handler_ = network_state_handler; network_configuration_handler_ = network_configuration_handler; } +void HiddenNetworkHandler::SetNetworkMetadataStore( + NetworkMetadataStore* network_metadata_store) { + if (network_metadata_store_) + daily_event_timer_.Stop(); + + network_metadata_store_ = network_metadata_store; + if (!network_metadata_store_) + return; + + CleanHiddenNetworks(); + daily_event_timer_.Start( + FROM_HERE, kOneDay, + base::BindRepeating(&HiddenNetworkHandler::CleanHiddenNetworks, + base::Unretained(this))); +} + +void HiddenNetworkHandler::CleanHiddenNetworks() { + NetworkStateHandler::NetworkStateList state_list; + network_state_handler_->GetNetworkListByType(NetworkTypePattern::WiFi(), + /*configured_only=*/true, + /*visible_only=*/false, + /*limit=*/0, &state_list); + + for (const NetworkState* state : state_list) { + if (!state->hidden_ssid() || state->IsManagedByPolicy()) + continue; + + // The last connected timestamp for a network will be zero if the network + // has never been connected to. + if (!network_metadata_store_->GetLastConnectedTimestamp(state->guid()) + .is_zero()) { + continue; + } + + // The WiFi timestamp will return UnixEpoch() if the network has + // existed for more than two weeks. + if (network_metadata_store_->UpdateAndRetrieveWiFiTimestamp( + state->guid()) != base::Time::UnixEpoch()) { + continue; + } + + NET_LOG(EVENT) << "Attempting to remove network configuration with GUID: " + << state->guid(); + + network_configuration_handler_->RemoveConfiguration( + state->path(), /*remove_confirmer=*/absl::nullopt, + base::BindOnce(&OnRemoveConfigurationSuccess, state->guid()), + base::BindOnce(&OnRemoveConfigurationFailure, state->guid())); + } +} + } // namespace ash
diff --git a/chromeos/ash/components/network/hidden_network_handler.h b/chromeos/ash/components/network/hidden_network_handler.h index 7643e309..548c955 100644 --- a/chromeos/ash/components/network/hidden_network_handler.h +++ b/chromeos/ash/components/network/hidden_network_handler.h
@@ -6,11 +6,13 @@ #define CHROMEOS_ASH_COMPONENTS_NETWORK_HIDDEN_NETWORK_HANDLER_H_ #include "base/component_export.h" +#include "base/timer/timer.h" namespace ash { class NetworkStateHandler; class NetworkConfigurationHandler; +class NetworkMetadataStore; // This class is responsible for removing wrongly hidden networks by // performing network updates daily using a timer. Networks are @@ -27,10 +29,20 @@ void Init(NetworkStateHandler* network_state_handler, NetworkConfigurationHandler* network_configuration_handler); + // This method will update the NetworkMetadataStore used when querying for + // metadata about the network, and will result in immediately checking + // for any hidden and wrongly configured networks. + void SetNetworkMetadataStore(NetworkMetadataStore* network_metadata_store); private: - NetworkStateHandler* network_state_handler_; - NetworkConfigurationHandler* network_configuration_handler_; + void CleanHiddenNetworks(); + + // Timer ensures that wrongly configured networks are searched for on + // a daily basis. + base::RepeatingTimer daily_event_timer_; + NetworkStateHandler* network_state_handler_ = nullptr; + NetworkConfigurationHandler* network_configuration_handler_ = nullptr; + NetworkMetadataStore* network_metadata_store_ = nullptr; }; } // namespace ash
diff --git a/chromeos/ash/components/network/hidden_network_handler_unittest.cc b/chromeos/ash/components/network/hidden_network_handler_unittest.cc index e50e984d..60a55746 100644 --- a/chromeos/ash/components/network/hidden_network_handler_unittest.cc +++ b/chromeos/ash/components/network/hidden_network_handler_unittest.cc
@@ -5,39 +5,279 @@ #include "chromeos/ash/components/network/hidden_network_handler.h" #include "ash/constants/ash_features.h" +#include "base/callback.h" +#include "base/strings/stringprintf.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "base/time/time.h" #include "chromeos/ash/components/network/network_configuration_handler.h" +#include "chromeos/ash/components/network/network_connection_handler.h" #include "chromeos/ash/components/network/network_handler.h" +#include "chromeos/ash/components/network/network_handler_test_helper.h" +#include "chromeos/ash/components/network/network_profile_handler.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/ash/components/network/network_state_test_helper.h" +#include "chromeos/ash/components/network/network_ui_data.h" +#include "components/prefs/testing_pref_service.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/cros_system_api/dbus/shill/dbus-constants.h" namespace ash { +namespace { + +// kTwoWeeks set to 15 days due to edge case where creating network while +// internal timer is running results in network creation timestamp not being +// initialized until the next time the timer fires, eg. the next day. +constexpr base::TimeDelta kTwoWeeks = base::Days(15); +constexpr base::TimeDelta kArbitraryTime = base::Days(11686); +const char* kWiFiGuid1 = "wifi_guid1"; +const char* kWiFiGuid2 = "wifi_guid2"; +const char* kWiFiGuid3 = "wifi_guid3"; +constexpr char kServicePattern[] = + R"({"GUID": "%s", "Type": "wifi", "State": "idle", "SSID": "wifi", + "Strength": 100, "WiFi.HiddenSSID": %s})"; + +class FakeNetworkConfigurationObserver : public NetworkConfigurationObserver { + public: + void OnBeforeConfigurationRemoved(const std::string& service_path, + const std::string& guid) override { + total_removed_count_++; + service_path_ = service_path; + guid_ = guid; + } + + size_t total_removed_count() const { return total_removed_count_; } + const std::string& service_path() { return service_path_; } + const std::string& guid() { return guid_; } + + private: + size_t total_removed_count_ = 0; + std::string service_path_; + std::string guid_; +}; + +} // namespace class HiddenNetworkHandlerTest : public ::testing::Test { public: void SetUp() override { feature_list_.InitAndEnableFeature(features::kHiddenNetworkMigration); + network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>(); + hidden_network_handler_ = NetworkHandler::Get()->hidden_network_handler(); network_configuration_handler_ = - NetworkConfigurationHandler::InitializeForTest( - helper_.network_state_handler(), - nullptr /* network_device_handler */); - hidden_network_handler_ = std::make_unique<HiddenNetworkHandler>(); - hidden_network_handler_->Init(helper_.network_state_handler(), - network_configuration_handler_.get()); + NetworkHandler::Get()->network_configuration_handler(); + // Explicitly need to advance time for tests because the default + // time is UnixEpoch, which would signal for a network to be + // removed when created with default configurations. + task_environment_.AdvanceClock(kArbitraryTime); + + base::RunLoop().RunUntilIdle(); + network_handler_test_helper_->ClearServices(); + base::RunLoop().RunUntilIdle(); + + network_configuration_observer_ = + std::make_unique<FakeNetworkConfigurationObserver>(); + network_configuration_handler_->AddObserver( + network_configuration_observer_.get()); } + void TearDown() override { + network_configuration_handler_->RemoveObserver( + network_configuration_observer_.get()); + network_handler_test_helper_.reset(); + } + + void MaybeRegisterAndInitializePrefs(bool should_register = true) { + if (should_register) { + network_handler_test_helper_->RegisterPrefs(profile_prefs_.registry(), + local_state_.registry()); + } + network_handler_test_helper_->InitializePrefs(&profile_prefs_, + &local_state_); + } + + std::string CreateDefaultHiddenWiFiNetwork() { + return CreateWiFiNetwork(/*hidden=*/true, /*add_to_profile=*/true, + kWiFiGuid1); + } + + std::string CreateWiFiNetwork(bool hidden, + bool add_to_profile, + const char* guid) { + std::string wifi_path; + if (hidden) { + wifi_path = network_handler_test_helper_->ConfigureService( + base::StringPrintf(kServicePattern, guid, "true")); + } else { + wifi_path = network_handler_test_helper_->ConfigureService( + base::StringPrintf(kServicePattern, guid, "false")); + } + + if (add_to_profile) { + network_handler_test_helper_->profile_test()->AddService( + NetworkProfileHandler::GetSharedProfilePath(), wifi_path); + } + + base::RunLoop().RunUntilIdle(); + return wifi_path; + } + + void ConnectToNetwork(const std::string& wifi_path) { + NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork( + wifi_path, base::DoNothing(), base::DoNothing(), + /*check_error_state=*/false, ConnectCallbackMode::ON_COMPLETED); + base::RunLoop().RunUntilIdle(); + } + + void MakeNetworkManaged(const std::string& wifi_path) { + network_handler_test_helper_->SetServiceProperty( + wifi_path, shill::kONCSourceProperty, + base::Value(shill::kONCSourceDevicePolicy)); + + std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC( + ::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY); + network_handler_test_helper_->SetServiceProperty( + wifi_path, shill::kUIDataProperty, base::Value(ui_data->GetAsJson())); + + base::RunLoop().RunUntilIdle(); + } + + void ExpectNetworksRemoved(const std::string service_path, + size_t total_removed_count) { + EXPECT_EQ(service_path, + network_configuration_observer_.get()->service_path()); + EXPECT_EQ(total_removed_count, + network_configuration_observer_.get()->total_removed_count()); + } + + void ErrorCallback(const std::string& error_name) { + ADD_FAILURE() << "Unexpected error: " << error_name; + } + + base::test::TaskEnvironment* task_environment() { return &task_environment_; } + private: - base::test::TaskEnvironment task_environment_; + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::test::ScopedFeatureList feature_list_; - NetworkStateTestHelper helper_{false /* use_default_devices_and_services */}; - std::unique_ptr<HiddenNetworkHandler> hidden_network_handler_; - std::unique_ptr<NetworkConfigurationHandler> network_configuration_handler_; + HiddenNetworkHandler* hidden_network_handler_; + NetworkConfigurationHandler* network_configuration_handler_; + std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_; + std::unique_ptr<FakeNetworkConfigurationObserver> + network_configuration_observer_; + TestingPrefServiceSimple profile_prefs_; + TestingPrefServiceSimple local_state_; }; -TEST_F(HiddenNetworkHandlerTest, CanConstruct) { - EXPECT_TRUE(true); +TEST_F(HiddenNetworkHandlerTest, MeetsAllCriteriaToRemove) { + MaybeRegisterAndInitializePrefs(); + + const std::string path = CreateDefaultHiddenWiFiNetwork(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + task_environment()->FastForwardBy(kTwoWeeks); + base::RunLoop().RunUntilIdle(); + ExpectNetworksRemoved(/*service_path=*/path, + /*total_removed_count=*/1); +} + +TEST_F(HiddenNetworkHandlerTest, ChecksForNetworksToRemoveDaily) { + MaybeRegisterAndInitializePrefs(); + + // Networks created one day apart, as otherwise they would all be removed on + // the same day 2 weeks later. + const std::string path1 = CreateWiFiNetwork( + /*hidden=*/true, /*add_to_profile=*/true, /*guid=*/kWiFiGuid1); + task_environment()->FastForwardBy(base::Days(1)); + + const std::string path2 = CreateWiFiNetwork( + /*hidden=*/true, /*add_to_profile=*/true, /*guid=*/kWiFiGuid2); + task_environment()->FastForwardBy(base::Days(1)); + + const std::string path3 = CreateWiFiNetwork( + /*hidden=*/true, /*add_to_profile=*/true, /*guid=*/kWiFiGuid3); + + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + + const base::TimeDelta kTimeSinceFirstNetworkWasCreated = + kTwoWeeks - base::Days(2); + + task_environment()->FastForwardBy(kTimeSinceFirstNetworkWasCreated); + ExpectNetworksRemoved(/*service_path=*/path1, /*total_removed_count=*/1); + + task_environment()->FastForwardBy(base::Days(1)); + ExpectNetworksRemoved(/*service_path=*/path2, /*total_removed_count=*/2); + + task_environment()->FastForwardBy(base::Days(1)); + ExpectNetworksRemoved(/*service_path=*/path3, /*total_removed_count=*/3); +} + +TEST_F(HiddenNetworkHandlerTest, NetworksAreCheckedWhenPrefsAreInitialized) { + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + + const std::string path = CreateDefaultHiddenWiFiNetwork(); + MaybeRegisterAndInitializePrefs(); + base::RunLoop().RunUntilIdle(); + + // We explicitly shut down and re-initialize the pref services to test that + // whenever they are initialized the HiddenNetworkHandler class will + // immediately check for wrongly configured networks. + NetworkHandler::Get()->ShutdownPrefServices(); + base::RunLoop().RunUntilIdle(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + + task_environment()->FastForwardBy(kTwoWeeks); + MaybeRegisterAndInitializePrefs(/*should_register=*/false); + base::RunLoop().RunUntilIdle(); + ExpectNetworksRemoved(/*service_path=*/path, + /*total_removed_count=*/1); +} + +TEST_F(HiddenNetworkHandlerTest, LessThanTwoWeeks) { + MaybeRegisterAndInitializePrefs(); + + CreateDefaultHiddenWiFiNetwork(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + task_environment()->FastForwardBy(kTwoWeeks - base::Hours(5)); + base::RunLoop().RunUntilIdle(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); +} + +TEST_F(HiddenNetworkHandlerTest, OnlyRemovesNetworksInCurrentProfile) { + MaybeRegisterAndInitializePrefs(); + + CreateWiFiNetwork(true, false, kWiFiGuid1); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + task_environment()->FastForwardBy(kTwoWeeks); + base::RunLoop().RunUntilIdle(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); +} + +TEST_F(HiddenNetworkHandlerTest, ConnectedNetworkNotRemoved) { + MaybeRegisterAndInitializePrefs(); + + const std::string path = CreateDefaultHiddenWiFiNetwork(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + ConnectToNetwork(path); + task_environment()->FastForwardBy(kTwoWeeks); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); +} + +TEST_F(HiddenNetworkHandlerTest, ManagedNetworkNotRemoved) { + MaybeRegisterAndInitializePrefs(); + const std::string path = CreateDefaultHiddenWiFiNetwork(); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + MakeNetworkManaged(path); + task_environment()->FastForwardBy(kTwoWeeks); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); +} + +TEST_F(HiddenNetworkHandlerTest, UnhiddenNetworkNotRemoved) { + MaybeRegisterAndInitializePrefs(); + + CreateWiFiNetwork(false, true, kWiFiGuid1); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); + task_environment()->FastForwardBy(kTwoWeeks); + ExpectNetworksRemoved(/*service_path=*/"", /*total_removed_count=*/0u); } } // namespace ash
diff --git a/chromeos/ash/components/network/network_handler.cc b/chromeos/ash/components/network/network_handler.cc index 4e20bf7..d970cdd0 100644 --- a/chromeos/ash/components/network/network_handler.cc +++ b/chromeos/ash/components/network/network_handler.cc
@@ -203,12 +203,18 @@ network_configuration_handler_.get(), network_connection_handler_.get(), network_state_handler_.get(), logged_in_profile_prefs, device_prefs, is_enterprise_managed_)); + if (base::FeatureList::IsEnabled(ash::features::kHiddenNetworkMigration)) { + hidden_network_handler_->SetNetworkMetadataStore( + network_metadata_store_.get()); + } } void NetworkHandler::ShutdownPrefServices() { cellular_esim_profile_handler_->SetDevicePrefs(nullptr); managed_cellular_pref_handler_->SetDevicePrefs(nullptr); ui_proxy_config_service_.reset(); + if (base::FeatureList::IsEnabled(ash::features::kHiddenNetworkMigration)) + hidden_network_handler_->SetNetworkMetadataStore(nullptr); network_metadata_store_.reset(); }
diff --git a/chromeos/ash/components/network/network_metadata_store.cc b/chromeos/ash/components/network/network_metadata_store.cc index 864462b..5bd60c5 100644 --- a/chromeos/ash/components/network/network_metadata_store.cc +++ b/chromeos/ash/components/network/network_metadata_store.cc
@@ -404,7 +404,7 @@ if (!network || network->GetNetworkTechnologyType() != NetworkState::NetworkTechnologyType::kWiFi) { - return base::Time::UnixEpoch(); + return base::Time::Now().UTCMidnight(); } const base::Value* creation_timestamp =
diff --git a/chromeos/ash/components/network/network_metadata_store_unittest.cc b/chromeos/ash/components/network/network_metadata_store_unittest.cc index 6b7f0be8..cf98002 100644 --- a/chromeos/ash/components/network/network_metadata_store_unittest.cc +++ b/chromeos/ash/components/network/network_metadata_store_unittest.cc
@@ -487,19 +487,19 @@ scoped_feature_list.InitAndEnableFeature(features::kHiddenNetworkMigration); ConfigureService(kConfigEthernet); EXPECT_EQ(metadata_store()->UpdateAndRetrieveWiFiTimestamp(kGuid3), - base::Time::UnixEpoch()); + base::Time::Now().UTCMidnight()); } TEST_F(NetworkMetadataStoreTest, NetworkCreationTimestampNonExistentNetwork) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kHiddenNetworkMigration); EXPECT_EQ(metadata_store()->UpdateAndRetrieveWiFiTimestamp(kGuid), - base::Time::UnixEpoch()); + base::Time::Now().UTCMidnight()); // Fast forward 2 weeks to check that creation timestamp is always // base::Time::UnixEpoch() for non-existent networks. task_environment()->FastForwardBy(base::Days(14)); EXPECT_EQ(metadata_store()->UpdateAndRetrieveWiFiTimestamp(kGuid), - base::Time::UnixEpoch()); + base::Time::Now().UTCMidnight()); } TEST_F(NetworkMetadataStoreTest, FixSyncedHiddenNetworks) {
diff --git a/chromeos/crosapi/mojom/app_service_types.mojom b/chromeos/crosapi/mojom/app_service_types.mojom index 32595f2..3799634 100644 --- a/chromeos/crosapi/mojom/app_service_types.mojom +++ b/chromeos/crosapi/mojom/app_service_types.mojom
@@ -148,6 +148,7 @@ kSync, // Installed by sync. kUser, // Installed by user action. [MinVersion=7] kSubApp, // Installed by the SubApp API call. + [MinVersion=8] kKiosk, // Installed by Kiosk on Chrome OS. }; // Augments a bool to include an 'unknown' value.
diff --git a/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc b/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc index 8e153405..385ca89 100644 --- a/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc +++ b/chromeos/crosapi/mojom/app_service_types_mojom_traits.cc
@@ -430,6 +430,8 @@ return crosapi::mojom::InstallReason::kSync; case apps::InstallReason::kUser: return crosapi::mojom::InstallReason::kUser; + case apps::InstallReason::kKiosk: + return crosapi::mojom::InstallReason::kKiosk; } NOTREACHED(); @@ -463,6 +465,9 @@ case crosapi::mojom::InstallReason::kSubApp: *output = apps::InstallReason::kSubApp; return true; + case crosapi::mojom::InstallReason::kKiosk: + *output = apps::InstallReason::kKiosk; + return true; } NOTREACHED();
diff --git a/chromeos/crosapi/mojom/app_service_types_mojom_traits_unittest.cc b/chromeos/crosapi/mojom/app_service_types_mojom_traits_unittest.cc index 09f619d..e295002a 100644 --- a/chromeos/crosapi/mojom/app_service_types_mojom_traits_unittest.cc +++ b/chromeos/crosapi/mojom/app_service_types_mojom_traits_unittest.cc
@@ -354,6 +354,13 @@ input, output)); EXPECT_EQ(output->install_reason, apps::InstallReason::kUser); } + { + input->install_reason = apps::InstallReason::kKiosk; + apps::AppPtr output; + ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>( + input, output)); + EXPECT_EQ(output->install_reason, apps::InstallReason::kKiosk); + } } // Test that serialization and deserialization works with updating
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index e08c73bd..fcd0ba8 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-106-5226.0-1660558034-benchmark-106.0.5249.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-106-5226.0-1660558034-benchmark-106.0.5249.4-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index 4a89b59..c7507b5 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-106-5195.24-1660556265-benchmark-106.0.5249.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-106-5195.24-1660556265-benchmark-106.0.5249.4-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index c722e11..240f91a8 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -67,6 +67,7 @@ <translation id="152892567002884378">Augmenter le volume</translation> <translation id="1555130319947370107">Bleu</translation> <translation id="155865706765934889">Pavé tactile</translation> +<translation id="1561927818299383735">couleur rétroéclairée</translation> <translation id="1565038567006703504">Impossible de mettre à jour <ph name="DEVICE_NAME" /></translation> <translation id="1567064801249837505">Albums</translation> <translation id="1572585716423026576">Définir comme fond d'écran</translation> @@ -437,6 +438,7 @@ <translation id="5267975978099728568"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="ERROR_STATUS" /></translation> <translation id="5275828089655680674">Relancer les routines</translation> <translation id="5286252187236914003">L2TP/IPsec</translation> +<translation id="5286263799730375393">couleur de rétroéclairage</translation> <translation id="5294769550414936029">version <ph name="MILESTONE_VERSION" /></translation> <translation id="5300814202279832142">Déplacer la fenêtre vers le bureau</translation> <translation id="5304899856529773394">EVDO</translation> @@ -497,6 +499,7 @@ <translation id="5895138241574237353">Redémarrer</translation> <translation id="5901630391730855834">Jaune</translation> <translation id="5903200662178656908">L'appareil est un ensemble clavier et souris.</translation> +<translation id="5907649332524363701">couleur de touche</translation> <translation id="5916084858004523819">Interdit</translation> <translation id="5916664084637901428">Activé</translation> <translation id="5921506667911082617">{COUNT,plural, =1{Votre fichier a été numérisé et enregistré dans le dossier <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}one{Votre fichier a été numérisé et enregistré dans le dossier <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}other{Vos fichiers ont été numérisés et enregistrés dans le dossier <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}}</translation> @@ -598,6 +601,7 @@ <translation id="6760706756348334449">Diminuer le volume</translation> <translation id="6766275201586212568">Échec de résolutions DNS</translation> <translation id="6768237774506518020">Taux d'échec élevé des résolutions DNS</translation> +<translation id="6791471867139427246">couleur de l'éclairage du clavier</translation> <translation id="680983167891198932">Clé</translation> <translation id="6816797338148849397">Des renseignements concernant votre sélection sont accessibles. Servez-vous de la touche de flèche vers le haut pour y accéder.</translation> <translation id="6853312040151791195">Vitesse de décharge</translation> @@ -643,6 +647,7 @@ <translation id="7302860742311162920">ICCID</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7308203371573257315">Posez vos questions aux experts par le biais du forum d'aide dédié au Chromebook</translation> +<translation id="7311368985037279727">couleur du clavier</translation> <translation id="7319430975418800333">A3</translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Appuyez simultanément sur le bouton de recherche et la barre d'espacement pour afficher les résultats dans la recherche Google.</translation> <translation id="7343649194310845056">Appareils réseau</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index c3b6ab9..bd75b14 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -67,6 +67,7 @@ <translation id="152892567002884378">ವಾಲ್ಯೂಮ್ ಹೆಚ್ಚು ಮಾಡಿ</translation> <translation id="1555130319947370107">ನೀಲಿ</translation> <translation id="155865706765934889">ಟಚ್ಪ್ಯಾಡ್</translation> +<translation id="1561927818299383735">ಬ್ಯಾಕ್ಲಿಟ್ ಬಣ್ಣ</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="1567064801249837505">ಆಲ್ಬಮ್ಗಳು</translation> <translation id="1572585716423026576">ವಾಲ್ಪೇಪರ್ ಆಗಿ ಹೊಂದಿಸಿ</translation> @@ -436,6 +437,7 @@ <translation id="5267975978099728568"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="ERROR_STATUS" /></translation> <translation id="5275828089655680674">ದಿನಚರಿಗಳನ್ನು ಪುನಃ ರನ್ ಮಾಡಿ</translation> <translation id="5286252187236914003">L2TP/IPsec</translation> +<translation id="5286263799730375393">ಬ್ಯಾಕ್ಲೈಟ್ ಬಣ್ಣ</translation> <translation id="5294769550414936029">ಆವೃತ್ತಿ <ph name="MILESTONE_VERSION" /></translation> <translation id="5300814202279832142">ವಿಂಡೋವನ್ನು ಡೆಸ್ಕ್ಗೆ ಸರಿಸಿ</translation> <translation id="5304899856529773394">EVDO</translation> @@ -496,6 +498,7 @@ <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="5901630391730855834">ಹಳದಿ</translation> <translation id="5903200662178656908">ಸಾಧನವು ಕೀಬೋರ್ಡ್ ಮತ್ತು ಮೌಸ್ನ ಕಾಂಬೋ ಆಗಿದೆ.</translation> +<translation id="5907649332524363701">ಕೀ ಬಣ್ಣ</translation> <translation id="5916084858004523819">ನಿಷೇಧಿಸಲಾಗಿದೆ</translation> <translation id="5916664084637901428">ಆನ್</translation> <translation id="5921506667911082617">{COUNT,plural, =1{ನಿಮ್ಮ ಫೈಲ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> ಗೆ ಉಳಿಸಲಾಗಿದೆ.}one{ನಿಮ್ಮ ಫೈಲ್ಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> ಗೆ ಉಳಿಸಲಾಗಿದೆ.}other{ನಿಮ್ಮ ಫೈಲ್ಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> ಗೆ ಉಳಿಸಲಾಗಿದೆ.}}</translation> @@ -597,6 +600,7 @@ <translation id="6760706756348334449">ವಾಲ್ಯೂಮ್ ಕಡಿಮೆ ಮಾಡಿ</translation> <translation id="6766275201586212568">DNS ರೆಸಲ್ಯೂಷನ್ಗಳು ವಿಫಲವಾಗಿವೆ</translation> <translation id="6768237774506518020">ಅಧಿಕ DNS ರೆಸಲ್ಯೂಷನ್ ವೈಫಲ್ಯ ದರ</translation> +<translation id="6791471867139427246">ಕೀಬೋರ್ಡ್ ಲೈಟ್ ಬಣ್ಣ</translation> <translation id="680983167891198932">ಕೀ</translation> <translation id="6816797338148849397">ನಿಮ್ಮ ಆಯ್ಕೆಗೆ ಸಂಬಂಧಿಸಿದ ಮಾಹಿತಿ ಲಭ್ಯವಿದೆ. ಇದಕ್ಕೆ ಪ್ರವೇಶ ಪಡೆಯಲು, ಅಪ್ ಆ್ಯರೋ ಬಳಸಿ.</translation> <translation id="6853312040151791195">ಡಿಸ್ಚಾರ್ಜಿಂಗ್ ರೇಟ್</translation> @@ -642,6 +646,7 @@ <translation id="7302860742311162920">ICCID</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7308203371573257315">Chromebook ಸಹಾಯ ಫೋರಮ್ನಲ್ಲಿನ ತಜ್ಞರನ್ನು ಕೇಳಿ</translation> +<translation id="7311368985037279727">ಕೀಬೋರ್ಡ್ ಬಣ್ಣ</translation> <translation id="7319430975418800333">A3</translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Search ನಲ್ಲಿ ಫಲಿತಾಂಶವನ್ನು ನೋಡಲು, Search ಜೊತೆಗೆ Space ಅನ್ನು ಒತ್ತಿರಿ.</translation> <translation id="7343649194310845056">ನೆಟ್ವರ್ಕ್ ಸಾಧನಗಳು</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index 9f7e02e4..c1d1b626 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -67,6 +67,7 @@ <translation id="152892567002884378">Зголемете ја јачината на звукот</translation> <translation id="1555130319947370107">Сина</translation> <translation id="155865706765934889">Подлога за допир</translation> +<translation id="1561927818299383735">боја на заднинско осветлување</translation> <translation id="1565038567006703504">Не може да се ажурира <ph name="DEVICE_NAME" /></translation> <translation id="1567064801249837505">Албуми</translation> <translation id="1572585716423026576">Постави како тапет</translation> @@ -437,6 +438,7 @@ <translation id="5267975978099728568"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="ERROR_STATUS" /></translation> <translation id="5275828089655680674">Изврши ги рутините повторно</translation> <translation id="5286252187236914003">L2TP/IPsec</translation> +<translation id="5286263799730375393">боја на заднинско осветлување</translation> <translation id="5294769550414936029">верзија <ph name="MILESTONE_VERSION" /></translation> <translation id="5300814202279832142">Премести прозорец на работна површина</translation> <translation id="5304899856529773394">EVDO</translation> @@ -497,6 +499,7 @@ <translation id="5895138241574237353">Рестартирај</translation> <translation id="5901630391730855834">Жолта боја</translation> <translation id="5903200662178656908">Уредот е комбинација од тастатура и глувче.</translation> +<translation id="5907649332524363701">боја на копчиња</translation> <translation id="5916084858004523819">Забранета</translation> <translation id="5916664084637901428">Вклучено</translation> <translation id="5921506667911082617">{COUNT,plural, =1{Датотеката е успешно скенирана и зачувана во <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}one{Датотеките се успешно скенирани и зачувани во <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}other{Датотеките се успешно скенирани и зачувани во <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}}</translation> @@ -598,6 +601,7 @@ <translation id="6760706756348334449">Намалете ја јачината на звукот</translation> <translation id="6766275201586212568">Неуспешни одредувања со DNS</translation> <translation id="6768237774506518020">Висока стапка на неуспех на одредување со DNS</translation> +<translation id="6791471867139427246">боја на светло на тастатурата</translation> <translation id="680983167891198932">Клуч</translation> <translation id="6816797338148849397">Достапни се информации поврзани со вашиот избор. Користете го копчето со стрелка нагоре за да пристапите.</translation> <translation id="6853312040151791195">Брзина на празнење</translation> @@ -643,6 +647,7 @@ <translation id="7302860742311162920">ICCID</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7308203371573257315">Прашајте ги експертите во „Форумот за помош“ на Chromebook</translation> +<translation id="7311368985037279727">боја на тастатура</translation> <translation id="7319430975418800333">A3</translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; притиснете „Пребарување“ и Space за да видите резултат во „Пребарување на Google“.</translation> <translation id="7343649194310845056">Мрежни уреди</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index cd9b77d..e87047e4 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -67,6 +67,7 @@ <translation id="152892567002884378">ਅਵਾਜ਼ ਵਧਾਓ</translation> <translation id="1555130319947370107">ਨੀਲਾ</translation> <translation id="155865706765934889">ਟਚਪੈਡ</translation> +<translation id="1561927818299383735">ਬੈਕਲਿਟ ਰੰਗ</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> ਨੂੰ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="1567064801249837505">ਐਲਬਮਾਂ</translation> <translation id="1572585716423026576">ਵਾਲਪੇਪਰ ਵਜੋਂ ਸੈੱਟ ਕਰੋ</translation> @@ -436,6 +437,7 @@ <translation id="5267975978099728568"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="ERROR_STATUS" /></translation> <translation id="5275828089655680674">ਨਿਯਮਬੱਧ ਕੰਮਾਂ ਨੂੰ ਮੁੜ-ਚਲਾਓ</translation> <translation id="5286252187236914003">L2TP/IPsec</translation> +<translation id="5286263799730375393">ਬੈਕਲਾਈਟ ਦਾ ਰੰਗ</translation> <translation id="5294769550414936029">ਵਰਜਨ <ph name="MILESTONE_VERSION" /></translation> <translation id="5300814202279832142">ਵਿੰਡੋ ਨੂੰ ਡੈਸਕ 'ਤੇ ਲਿਜਾਓ</translation> <translation id="5304899856529773394">EVDO</translation> @@ -496,6 +498,7 @@ <translation id="5895138241574237353">ਰੀਸਟਾਰਟ ਕਰੋ</translation> <translation id="5901630391730855834">ਪੀਲਾ</translation> <translation id="5903200662178656908">ਡੀਵਾਈਸ ਕੀ-ਬੋਰਡ ਅਤੇ ਮਾਊਸ ਦਾ ਸੁਮੇਲ ਹੈ।</translation> +<translation id="5907649332524363701">ਕੁੰਜੀ ਦਾ ਰੰਗ</translation> <translation id="5916084858004523819">ਪਾਬੰਦੀ ਲਗਾਈ ਗਈ</translation> <translation id="5916664084637901428">ਚਾਲੂ</translation> <translation id="5921506667911082617">{COUNT,plural, =1{ਤੁਹਾਡੀ ਫ਼ਾਈਲ ਸਫਲਤਾਪੂਰਕ ਸਕੈਨ ਕੀਤੀ ਗਈ ਅਤੇ <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੀ ਗਈ।}one{ਤੁਹਾਡੀ ਫ਼ਾਈਲ ਸਫਲਤਾਪੂਰਕ ਸਕੈਨ ਕੀਤੀ ਗਈ ਅਤੇ <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੀ ਗਈ।}other{ਤੁਹਾਡੀਆਂ ਫ਼ਾਈਲਾਂ ਸਫਲਤਾਪੂਰਕ ਸਕੈਨ ਕੀਤੀਆਂ ਗਈਆਂ ਅਤੇ <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੀਆਂ ਗਈਆਂ।}}</translation> @@ -597,6 +600,7 @@ <translation id="6760706756348334449">ਅਵਾਜ਼ ਘਟਾਓ</translation> <translation id="6766275201586212568">ਅਸਫਲ DNS ਰੈਜ਼ੋਲਿਊਸ਼ਨ</translation> <translation id="6768237774506518020">DNS ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਦੀ ਉੱਚ ਅਸਫਲ ਦਰ</translation> +<translation id="6791471867139427246">ਕੀ-ਬੋਰਡ ਦੀ ਰੌਸ਼ਨੀ ਦਾ ਰੰਗ</translation> <translation id="680983167891198932">ਕੁੰਜੀ</translation> <translation id="6816797338148849397">ਤੁਹਾਡੀ ਚੋਣ ਨਾਲ ਸੰਬੰਧਿਤ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਹੈ। ਪਹੁੰਚ ਕਰਨ ਲਈ 'ਉੱਪਰ ਤੀਰ' ਕੁੰਜੀ ਵਰਤੋ।</translation> <translation id="6853312040151791195">ਡਿਸਚਾਰਜ ਹੋਣ ਦੀ ਦਰ</translation> @@ -642,6 +646,7 @@ <translation id="7302860742311162920">ICCID</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7308203371573257315">Chromebook ਮਦਦ ਫ਼ੋਰਮ ਵਿੱਚ ਮਾਹਰਾਂ ਤੋਂ ਸਵਾਲ ਪੁੱਛੋ</translation> +<translation id="7311368985037279727">ਕੀ-ਬੋਰਡ ਦਾ ਰੰਗ</translation> <translation id="7319430975418800333">A3</translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Search ਵਿੱਚ ਨਤੀਜਾ ਦੇਖਣ ਲਈ Search ਦੇ ਨਾਲ Space ਨੂੰ ਦਬਾਓ।</translation> <translation id="7343649194310845056">ਨੈੱਟਵਰਕ ਡੀਵਾਈਸ</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 49464a2..8f3a233 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -67,6 +67,7 @@ <translation id="152892567002884378">Aumentar volume</translation> <translation id="1555130319947370107">Azul</translation> <translation id="155865706765934889">Touchpad</translation> +<translation id="1561927818299383735">cor da retroiluminação</translation> <translation id="1565038567006703504">Não é possível atualizar <ph name="DEVICE_NAME" /></translation> <translation id="1567064801249837505">Álbuns</translation> <translation id="1572585716423026576">Definir como plano de fundo</translation> @@ -437,6 +438,7 @@ <translation id="5267975978099728568"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="ERROR_STATUS" /></translation> <translation id="5275828089655680674">Repetir rotinas</translation> <translation id="5286252187236914003">L2TP/IPsec</translation> +<translation id="5286263799730375393">cor da iluminação</translation> <translation id="5294769550414936029">versão <ph name="MILESTONE_VERSION" /></translation> <translation id="5300814202279832142">Mover janela para o espaço de trabalho</translation> <translation id="5304899856529773394">EvDO</translation> @@ -497,6 +499,7 @@ <translation id="5895138241574237353">Reiniciar</translation> <translation id="5901630391730855834">Amarelo</translation> <translation id="5903200662178656908">O dispositivo é uma combinação de teclado e mouse.</translation> +<translation id="5907649332524363701">cor da tecla</translation> <translation id="5916084858004523819">Proibido</translation> <translation id="5916664084637901428">Ativado</translation> <translation id="5921506667911082617">{COUNT,plural, =1{O arquivo foi digitalizado e salvo em <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}one{O arquivo foi digitalizado e salvo em <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}other{Os arquivos foram digitalizados e salvos em <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}}</translation> @@ -598,6 +601,7 @@ <translation id="6760706756348334449">Diminuir volume</translation> <translation id="6766275201586212568">Falha em resoluções de DNS</translation> <translation id="6768237774506518020">Taxa elevada de erro de resolução de DNS</translation> +<translation id="6791471867139427246">cor da luz do teclado</translation> <translation id="680983167891198932">Chave</translation> <translation id="6816797338148849397">Informações relacionadas à sua seleção disponíveis. Use a tecla de seta para cima para acessar.</translation> <translation id="6853312040151791195">Taxa de descarregamento</translation> @@ -643,6 +647,7 @@ <translation id="7302860742311162920">ICCID</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7308203371573257315">Pergunte aos especialistas no Fórum de Ajuda do Chromebook</translation> +<translation id="7311368985037279727">cor do teclado</translation> <translation id="7319430975418800333">A3</translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Pressione Pesquisar + barra de espaço para ver o resultado na Pesquisa Google.</translation> <translation id="7343649194310845056">Dispositivos de rede</translation>
diff --git a/components/cast_streaming/renderer/BUILD.gn b/components/cast_streaming/renderer/BUILD.gn index 6e5a2d60..56869b8 100644 --- a/components/cast_streaming/renderer/BUILD.gn +++ b/components/cast_streaming/renderer/BUILD.gn
@@ -48,9 +48,15 @@ deps = [ ":resource_provider_impl" ] } +source_set("decoder_buffer_provider") { + public = [ "public/decoder_buffer_provider.h" ] + public_deps = [ "//base" ] +} + source_set("resource_provider_impl") { public_deps = [ ":resource_provider" ] deps = [ + ":buffer_requester", ":decoder_buffer_reader", "//base", "//components/cast_streaming/public", @@ -106,14 +112,13 @@ visibility = [ ":*" ] } -source_set("web_codecs") { +source_set("buffer_requester") { sources = [ - "public/web_codecs/decoder_buffer_provider.h", - "web_codecs/buffer_requester.h", - "web_codecs/decoder_buffer_provider_impl.h", - "web_codecs/delegating_decoder_buffer_provider.h", + "buffer_requester.h", + "decoder_buffer_provider_impl.h", ] public_deps = [ + ":decoder_buffer_provider", ":decoder_buffer_reader", "//base", "//components/cast_streaming/public:demuxer_stream_traits", @@ -122,21 +127,33 @@ "//media/mojo/common", "//media/mojo/mojom", ] + visibility = [ ":*" ] +} + +source_set("web_codecs") { + sources = [ "web_codecs/delegating_decoder_buffer_provider.h" ] + public_deps = [ + ":decoder_buffer_provider", + "//base", + ] + visibility = [ ":*" ] } source_set("unit_tests") { testonly = true sources = [ + "buffer_requester_unittest.cc", + "decoder_buffer_provider_impl_unittest.cc", "decoder_buffer_reader_unittest.cc", "playback_command_forwarding_renderer_factory_unittest.cc", "playback_command_forwarding_renderer_unittest.cc", - "web_codecs/buffer_requester_unittest.cc", - "web_codecs/decoder_buffer_provider_impl_unittest.cc", "web_codecs/delegating_decoder_buffer_provider_unittest.cc", ] deps = [ + ":buffer_requester", + ":decoder_buffer_provider", ":decoder_buffer_reader", ":playback_command_forwarding_renderer", ":renderer",
diff --git a/components/cast_streaming/renderer/web_codecs/buffer_requester.h b/components/cast_streaming/renderer/buffer_requester.h similarity index 82% rename from components/cast_streaming/renderer/web_codecs/buffer_requester.h rename to components/cast_streaming/renderer/buffer_requester.h index c4fa583..741bc1c 100644 --- a/components/cast_streaming/renderer/web_codecs/buffer_requester.h +++ b/components/cast_streaming/renderer/buffer_requester.h
@@ -2,26 +2,27 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_CAST_STREAMING_RENDERER_WEB_CODECS_BUFFER_REQUESTER_H_ -#define COMPONENTS_CAST_STREAMING_RENDERER_WEB_CODECS_BUFFER_REQUESTER_H_ +#ifndef COMPONENTS_CAST_STREAMING_RENDERER_BUFFER_REQUESTER_H_ +#define COMPONENTS_CAST_STREAMING_RENDERER_BUFFER_REQUESTER_H_ #include <memory> #include "base/bind.h" +#include "base/callback.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" #include "components/cast_streaming/public/demuxer_stream_traits.h" #include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h" -#include "components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h" -#include "components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl.h" +#include "components/cast_streaming/renderer/decoder_buffer_provider_impl.h" +#include "components/cast_streaming/renderer/public/decoder_buffer_provider.h" #include "media/mojo/mojom/media_types.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/data_pipe.h" -namespace cast_streaming::webcodecs { +namespace cast_streaming { template <typename TMojoRemoteType> class BufferRequester; @@ -49,6 +50,7 @@ virtual void OnNewBufferProvider( base::WeakPtr<DecoderBufferProvider<ConfigType>> ptr) = 0; + virtual void OnMojoDisconnect() = 0; }; BufferRequester(Client* client, @@ -62,6 +64,11 @@ weak_factory_(this) { DCHECK(client_); DCHECK(task_runner_); + + // Unretained is safe here because |client| is expected to outlive this + // instance. + remote_.set_disconnect_handler( + base::BindOnce(&Client::OnMojoDisconnect, base::Unretained(client))); task_runner_->PostTask( FROM_HERE, base::BindOnce(&BufferRequester<TMojoRemoteType>::OnNewConfig, @@ -82,6 +89,12 @@ weak_factory_.GetWeakPtr())); } + // |callback| is called upon completion of the async call, with result true + // if the call succeeded and false in all other cases. + void EnableBitstreamConverterAsync(base::OnceCallback<void(bool)> callback) { + remote_->EnableBitstreamConverter(std::move(callback)); + } + private: // Processes a new buffer as received over mojo. void OnGetBufferDone( @@ -124,6 +137,6 @@ base::WeakPtrFactory<BufferRequester<TMojoRemoteType>> weak_factory_; }; -} // namespace cast_streaming::webcodecs +} // namespace cast_streaming -#endif // COMPONENTS_CAST_STREAMING_RENDERER_WEB_CODECS_BUFFER_REQUESTER_H_ +#endif // COMPONENTS_CAST_STREAMING_RENDERER_BUFFER_REQUESTER_H_
diff --git a/components/cast_streaming/renderer/web_codecs/buffer_requester_unittest.cc b/components/cast_streaming/renderer/buffer_requester_unittest.cc similarity index 97% rename from components/cast_streaming/renderer/web_codecs/buffer_requester_unittest.cc rename to components/cast_streaming/renderer/buffer_requester_unittest.cc index 1065bec..0db01bd 100644 --- a/components/cast_streaming/renderer/web_codecs/buffer_requester_unittest.cc +++ b/components/cast_streaming/renderer/buffer_requester_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/cast_streaming/renderer/web_codecs/buffer_requester.h" +#include "components/cast_streaming/renderer/buffer_requester.h" #include <utility> @@ -21,7 +21,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace cast_streaming::webcodecs { +namespace cast_streaming { namespace { class MockAudioBufferRequestReceiver : public mojom::AudioBufferRequester { @@ -45,6 +45,7 @@ MOCK_METHOD1( OnNewBufferProvider, void(base::WeakPtr<DecoderBufferProvider<media::AudioDecoderConfig>>)); + MOCK_METHOD0(OnMojoDisconnect, void()); MOCK_METHOD1(OnBufferReceivedOverMojo, void(media::mojom::DecoderBufferPtr)); }; @@ -155,4 +156,4 @@ task_environment_.RunUntilIdle(); } -} // namespace cast_streaming::webcodecs +} // namespace cast_streaming
diff --git a/components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl.h b/components/cast_streaming/renderer/decoder_buffer_provider_impl.h similarity index 91% rename from components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl.h rename to components/cast_streaming/renderer/decoder_buffer_provider_impl.h index aeafeb10..7f21d22 100644 --- a/components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl.h +++ b/components/cast_streaming/renderer/decoder_buffer_provider_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_CAST_STREAMING_RENDERER_WEB_CODECS_DECODER_BUFFER_PROVIDER_IMPL_H_ -#define COMPONENTS_CAST_STREAMING_RENDERER_WEB_CODECS_DECODER_BUFFER_PROVIDER_IMPL_H_ +#ifndef COMPONENTS_CAST_STREAMING_RENDERER_DECODER_BUFFER_PROVIDER_IMPL_H_ +#define COMPONENTS_CAST_STREAMING_RENDERER_DECODER_BUFFER_PROVIDER_IMPL_H_ #include <memory> @@ -13,12 +13,12 @@ #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "components/cast_streaming/renderer/decoder_buffer_reader.h" -#include "components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h" +#include "components/cast_streaming/renderer/public/decoder_buffer_provider.h" #include "media/base/decoder_buffer.h" #include "media/mojo/mojom/media_types.mojom-forward.h" #include "mojo/public/cpp/system/data_pipe.h" -namespace cast_streaming::webcodecs { +namespace cast_streaming { // This class provides a synchronous implementation of DecoderBufferProvider, // to be used for processing decoder buffers with respect to a single config. @@ -134,6 +134,6 @@ base::WeakPtrFactory<DecoderBufferProviderImpl> weak_factory_; }; -} // namespace cast_streaming::webcodecs +} // namespace cast_streaming -#endif // COMPONENTS_CAST_STREAMING_RENDERER_WEB_CODECS_DECODER_BUFFER_PROVIDER_IMPL_H_ +#endif // COMPONENTS_CAST_STREAMING_RENDERER_DECODER_BUFFER_PROVIDER_IMPL_H_
diff --git a/components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl_unittest.cc b/components/cast_streaming/renderer/decoder_buffer_provider_impl_unittest.cc similarity index 95% rename from components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl_unittest.cc rename to components/cast_streaming/renderer/decoder_buffer_provider_impl_unittest.cc index 66c05dd..cefec8f7 100644 --- a/components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl_unittest.cc +++ b/components/cast_streaming/renderer/decoder_buffer_provider_impl_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/cast_streaming/renderer/web_codecs/decoder_buffer_provider_impl.h" +#include "components/cast_streaming/renderer/decoder_buffer_provider_impl.h" #include <memory> @@ -17,7 +17,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace cast_streaming::webcodecs { +namespace cast_streaming { namespace { constexpr uint32_t kDefaultDataPipeCapacityBytes = 512; @@ -114,4 +114,4 @@ task_environment_.RunUntilIdle(); } -} // namespace cast_streaming::webcodecs +} // namespace cast_streaming
diff --git a/components/cast_streaming/renderer/frame_injecting_demuxer.cc b/components/cast_streaming/renderer/frame_injecting_demuxer.cc index 565508a4..3a5f12c7 100644 --- a/components/cast_streaming/renderer/frame_injecting_demuxer.cc +++ b/components/cast_streaming/renderer/frame_injecting_demuxer.cc
@@ -11,7 +11,7 @@ #include "base/sequence_checker.h" #include "base/task/single_thread_task_runner.h" #include "components/cast_streaming/public/demuxer_stream_traits.h" -#include "components/cast_streaming/renderer/decoder_buffer_reader.h" +#include "components/cast_streaming/renderer/buffer_requester.h" #include "components/cast_streaming/renderer/demuxer_connector.h" #include "media/base/audio_decoder_config.h" #include "media/base/decoder_buffer.h" @@ -31,31 +31,30 @@ // |TMojoRemoteType| is the interface used for requesting data buffers. // Currently expected to be either AudioBufferRequester or VideoBufferRequester. template <typename TMojoRemoteType> -class FrameInjectingDemuxerStream : public DemuxerStreamTraits<TMojoRemoteType>, - public media::DemuxerStream { +class FrameInjectingDemuxerStream + : public DemuxerStreamTraits<TMojoRemoteType>, + public BufferRequester<TMojoRemoteType>::Client, + public media::DemuxerStream { public: // See DemuxerStreamTraits for further details on these types. using Traits = DemuxerStreamTraits<TMojoRemoteType>; - using StreamInfoType = typename Traits::StreamInfoType; using ConfigType = typename Traits::ConfigType; FrameInjectingDemuxerStream( mojo::PendingRemote<TMojoRemoteType> pending_remote, - StreamInfoType stream_initialization_info) - : remote_(std::move(pending_remote)), weak_factory_(this) { - // Mojo service disconnection means the Cast Streaming Session ended and no - // further buffer will be requested. kAborted will be returned to the media - // pipeline for every subsequent DemuxerStream::Read() attempt. - remote_.set_disconnect_handler( - base::BindOnce(&FrameInjectingDemuxerStream::OnMojoDisconnect, - weak_factory_.GetWeakPtr())); - - // Set the new config, but then un-set |pending_config_change_| as the - // initial config is already applied prior to the first Read() call. - OnNewConfig(std::move(stream_initialization_info)); - DCHECK(pending_config_change_); - pending_config_change_ = false; - } + typename Traits::StreamInfoType stream_initialization_info, + scoped_refptr<base::SequencedTaskRunner> task_runner, + base::OnceClosure on_initialization_complete_cb) + : on_initialization_complete_cb_( + std::move(on_initialization_complete_cb)), + decoder_config_(stream_initialization_info->decoder_config), + buffer_requester_(std::make_unique<BufferRequester<TMojoRemoteType>>( + this, + stream_initialization_info->decoder_config, + std::move(stream_initialization_info->data_pipe), + std::move(pending_remote), + task_runner)), + weak_factory_(this) {} ~FrameInjectingDemuxerStream() override { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -64,116 +63,15 @@ void AbortPendingRead() { DVLOG(3) << __func__; DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + was_read_aborted_ = true; if (pending_read_cb_) std::move(pending_read_cb_).Run(Status::kAborted, nullptr); } protected: - const ConfigType& config() { - DCHECK(decoder_config_); - return decoder_config_.value(); - } + const ConfigType& config() { return decoder_config_; } private: - void OnMojoDisconnect() { - DLOG(ERROR) << __func__ << ": Mojo Pipe Disconnected"; - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - remote_.reset(); - buffer_reader_.reset(); - if (pending_read_cb_) { - std::move(pending_read_cb_) - .Run(Status::kAborted, scoped_refptr<media::DecoderBuffer>(nullptr)); - } - } - - void OnBufferReady(scoped_refptr<media::DecoderBuffer> buffer) { - DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(buffer); - - // Stop processing the pending buffer. OnMojoDisconnect() will trigger - // sending kAborted on subsequent Read() calls. This can happen if this - // object was in the process of reading a buffer off the data pipe when the - // Mojo connection ended. - if (!remote_.is_bound()) { - DVLOG(1) << "Read has been cancelled due to mojo disconnection."; - return; - } - - // Can only occur when a read has been aborted. - if (!pending_read_cb_) { - DVLOG(1) << "Read has been cancelled via Abort() call."; - return; - } - - if (buffer->end_of_stream()) { - std::move(pending_read_cb_).Run(Status::kError, nullptr); - } else { - std::move(pending_read_cb_).Run(Status::kOk, std::move(buffer)); - } - } - - // Asynchronously requests a new buffer be sent from the browser process. The - // result will be processed in OnGetBufferDone(). - void RequestNextBuffer() { - DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(remote_); - - remote_->GetBuffer( - base::BindOnce(&FrameInjectingDemuxerStream::OnGetBufferDone, - weak_factory_.GetWeakPtr())); - } - - // Processes a new buffer as received over mojo. - void OnGetBufferDone( - typename Traits::GetBufferResponseType get_buffer_response) { - DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(buffer_reader_); - - if (get_buffer_response->is_stream_info()) { - OnNewConfig(std::move(get_buffer_response->get_stream_info())); - } else { - // Eventually calls OnBufferReady(). - buffer_reader_->ProvideBuffer( - std::move(get_buffer_response->get_buffer())); - } - } - - // Called when a new config is received over mojo. Sets for the next call to - // DemuxerStream::Read() to signal for a new config, and replaces the data - // pipe which is used to read buffers in future. - void OnNewConfig(StreamInfoType data_stream_info) { - DCHECK(data_stream_info); - DVLOG(1) << __func__ << ": config info: " - << data_stream_info->decoder_config.AsHumanReadableString(); - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - decoder_config_ = std::move(data_stream_info->decoder_config); - if (!buffer_reader_) { - buffer_reader_ = std::make_unique<DecoderBufferReader>( - base::BindRepeating(&FrameInjectingDemuxerStream::OnBufferReady, - weak_factory_.GetWeakPtr()), - std::move(data_stream_info->data_pipe)); - } else { - buffer_reader_ = std::make_unique<DecoderBufferReader>( - std::move(*buffer_reader_), std::move(data_stream_info->data_pipe)); - } - - if (pending_read_cb_) { - // Return early if there is already an ongoing Read() call. The prior - // |buffer_reader_| instance will no longer exist, so the associated - // OnBufferReady() call with which this Read() is associated will never - // arrive - so the Read() call must be responded to now or the - // DemuxerStream will deadlock. - std::move(pending_read_cb_).Run(Status::kConfigChanged, nullptr); - } else { - pending_config_change_ = true; - } - } - void OnBitstreamConverterEnabled(bool success) { if (!success) { LOG(ERROR) << "Failed to enable Bitstream Converter"; @@ -187,27 +85,91 @@ } } + // Called by |current_buffer_provider_->ReadBufferAsync()|. + void OnNewBuffer(scoped_refptr<media::DecoderBuffer> buffer) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!!pending_read_cb_ != was_read_aborted_); + + was_read_aborted_ = false; + if (!pending_read_cb_) { + return; + } + + if (buffer->end_of_stream()) { + std::move(pending_read_cb_).Run(Status::kError, nullptr); + } else { + std::move(pending_read_cb_).Run(Status::kOk, std::move(buffer)); + } + } + + // Called by |current_buffer_provider_->GetConfigAsync()|. + void OnNewConfig(ConfigType config) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!!pending_read_cb_ != was_read_aborted_); + + decoder_config_ = std::move(config); + was_read_aborted_ = false; + pending_config_change_ = true; + + if (pending_read_cb_) { + Read(std::move(pending_read_cb_)); + } + } + + // BufferRequester::Client implementation. + void OnNewBufferProvider( + base::WeakPtr<DecoderBufferProvider<ConfigType>> ptr) override { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + current_buffer_provider_ = std::move(ptr); + + // During initialization, the config is set from the instance provided to + // the ctor. + if (on_initialization_complete_cb_) { + std::move(on_initialization_complete_cb_).Run(); + return; + } + + current_buffer_provider_->GetConfigAsync(base::BindOnce( + &FrameInjectingDemuxerStream::OnNewConfig, weak_factory_.GetWeakPtr())); + } + + void OnMojoDisconnect() override { + DLOG(ERROR) << __func__ << ": Mojo Pipe Disconnected"; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + buffer_requester_.reset(); + if (pending_read_cb_) { + std::move(pending_read_cb_) + .Run(Status::kAborted, scoped_refptr<media::DecoderBuffer>(nullptr)); + } + } + // DemuxerStream partial implementation. void Read(ReadCB read_cb) final { DVLOG(3) << __func__; DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!pending_read_cb_); + DCHECK(!buffer_requester_ || current_buffer_provider_); - DCHECK(pending_read_cb_.is_null()); pending_read_cb_ = std::move(read_cb); // Check whether OnMojoDisconnect() has been called and abort if so. - if (!remote_) { + if (!buffer_requester_) { std::move(pending_read_cb_) .Run(Status::kAborted, scoped_refptr<media::DecoderBuffer>(nullptr)); return; } + // In this case, a callback to get a Read() result is already running, so + // just replace the |pending_read_cb_| and let the ongoing call continue. + if (was_read_aborted_) { + was_read_aborted_ = false; + return; + } + // Handle the special case of a config change. if (pending_config_change_) { - // By design, the Read() method should never be called until after the - // |decoder_config_| has been set. - DCHECK(decoder_config_); - pending_config_change_ = false; std::move(pending_read_cb_).Run(Status::kConfigChanged, nullptr); return; @@ -219,16 +181,14 @@ return; } - // Request a new buffer from the browser process. - RequestNextBuffer(); - - // Eventually this will call OnBufferReady(). - buffer_reader_->ReadBufferAsync(); + current_buffer_provider_->ReadBufferAsync(base::BindOnce( + &FrameInjectingDemuxerStream::OnNewBuffer, weak_factory_.GetWeakPtr())); } void EnableBitstreamConverter() final { + DCHECK(buffer_requester_); is_bitstream_enable_in_progress_ = true; - remote_->EnableBitstreamConverter(base::BindOnce( + buffer_requester_->EnableBitstreamConverterAsync(base::BindOnce( &FrameInjectingDemuxerStream::OnBitstreamConverterEnabled, weak_factory_.GetWeakPtr())); } @@ -239,16 +199,11 @@ bool SupportsConfigChanges() final { return true; } - mojo::Remote<TMojoRemoteType> remote_; - // Called once the response to the first GetBuffer() call has been received. - base::OnceClosure on_initialization_complete_; + base::OnceClosure on_initialization_complete_cb_; - // Responsible for reading buffers from a data pipe. - std::unique_ptr<DecoderBufferReader> buffer_reader_; - - // The current decoder config, empty until first received. - absl::optional<ConfigType> decoder_config_; + // Current config, as last provided by |current_buffer_provider_|. + ConfigType decoder_config_; // Currently processing DemuxerStream::Read call's callback, if one is in // process. @@ -259,8 +214,13 @@ bool is_bitstream_enable_in_progress_ = false; + bool was_read_aborted_ = false; + SEQUENCE_CHECKER(sequence_checker_); + base::WeakPtr<DecoderBufferProvider<ConfigType>> current_buffer_provider_; + std::unique_ptr<BufferRequester<TMojoRemoteType>> buffer_requester_; + base::WeakPtrFactory<FrameInjectingDemuxerStream> weak_factory_; }; @@ -348,15 +308,32 @@ return; } + auto initialization_complete_cb_ = base::BindRepeating( + &FrameInjectingDemuxer::OnStreamInitializationComplete, + weak_factory_.GetWeakPtr()); if (audio_stream_info) { + pending_stream_initialization_callbacks_++; audio_stream_ = std::make_unique<FrameInjectingAudioDemuxerStream>( std::move(audio_stream_info->buffer_requester), - std::move(audio_stream_info->stream_initialization_info)); + std::move(audio_stream_info->stream_initialization_info), + media_task_runner_, initialization_complete_cb_); } if (video_stream_info) { + pending_stream_initialization_callbacks_++; video_stream_ = std::make_unique<FrameInjectingVideoDemuxerStream>( std::move(video_stream_info->buffer_requester), - std::move(video_stream_info->stream_initialization_info)); + std::move(video_stream_info->stream_initialization_info), + media_task_runner_, std::move(initialization_complete_cb_)); + } +} + +void FrameInjectingDemuxer::OnStreamInitializationComplete() { + DCHECK_GE(pending_stream_initialization_callbacks_, 1); + DCHECK(initialized_cb_); + + pending_stream_initialization_callbacks_--; + if (pending_stream_initialization_callbacks_ != 0) { + return; } was_initialization_successful_ = true;
diff --git a/components/cast_streaming/renderer/frame_injecting_demuxer.h b/components/cast_streaming/renderer/frame_injecting_demuxer.h index e8485cc..f52bf38 100644 --- a/components/cast_streaming/renderer/frame_injecting_demuxer.h +++ b/components/cast_streaming/renderer/frame_injecting_demuxer.h
@@ -46,6 +46,7 @@ void OnStreamsInitializedOnMediaThread( mojom::AudioStreamInitializationInfoPtr audio_stream_info, mojom::VideoStreamInitializationInfoPtr video_stream_info); + void OnStreamInitializationComplete(); // media::Demuxer implementation. std::vector<media::DemuxerStream*> GetAllStreams() override; @@ -72,6 +73,10 @@ base::TimeDelta curr_time, TrackChangeCB change_completed_cb) override; + // The number of initialized streams that have yet to call + // OnStreamInitializationComplete(). + int pending_stream_initialization_callbacks_ = 0; + scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; scoped_refptr<base::SequencedTaskRunner> original_task_runner_; media::DemuxerHost* host_ = nullptr;
diff --git a/components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h b/components/cast_streaming/renderer/public/decoder_buffer_provider.h similarity index 81% rename from components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h rename to components/cast_streaming/renderer/public/decoder_buffer_provider.h index 7ab6f16..a2fa8f7 100644 --- a/components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h +++ b/components/cast_streaming/renderer/public/decoder_buffer_provider.h
@@ -2,15 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_CAST_STREAMING_RENDERER_PUBLIC_WEB_CODECS_DECODER_BUFFER_PROVIDER_H_ -#define COMPONENTS_CAST_STREAMING_RENDERER_PUBLIC_WEB_CODECS_DECODER_BUFFER_PROVIDER_H_ +#ifndef COMPONENTS_CAST_STREAMING_RENDERER_PUBLIC_DECODER_BUFFER_PROVIDER_H_ +#define COMPONENTS_CAST_STREAMING_RENDERER_PUBLIC_DECODER_BUFFER_PROVIDER_H_ #include "base/callback.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" -#include "media/base/decoder_buffer.h" -namespace cast_streaming::webcodecs { +namespace media { +class DecoderBuffer; +} + +namespace cast_streaming { // This class provides a way for a caller to asynchronously request a new // buffer, as well as provide information associated with the buffers which it @@ -45,6 +48,6 @@ virtual void SetInvalidationCallback(DeletionCb callback) = 0; }; -} // namespace cast_streaming::webcodecs +} // namespace cast_streaming -#endif // COMPONENTS_CAST_STREAMING_RENDERER_PUBLIC_WEB_CODECS_DECODER_BUFFER_PROVIDER_H_ +#endif // COMPONENTS_CAST_STREAMING_RENDERER_PUBLIC_DECODER_BUFFER_PROVIDER_H_
diff --git a/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider.h b/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider.h index 4f95fb7..17388f4c 100644 --- a/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider.h +++ b/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider.h
@@ -11,7 +11,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" -#include "components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h" +#include "components/cast_streaming/renderer/public/decoder_buffer_provider.h" namespace cast_streaming::webcodecs {
diff --git a/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider_unittest.cc b/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider_unittest.cc index 42ce5d71..5c8d469 100644 --- a/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider_unittest.cc +++ b/components/cast_streaming/renderer/web_codecs/delegating_decoder_buffer_provider_unittest.cc
@@ -10,7 +10,7 @@ #include "base/memory/weak_ptr.h" #include "base/test/bind.h" #include "base/test/task_environment.h" -#include "components/cast_streaming/renderer/public/web_codecs/decoder_buffer_provider.h" +#include "components/cast_streaming/renderer/public/decoder_buffer_provider.h" #include "media/base/audio_decoder_config.h" #include "media/base/decoder_buffer.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 0407946..5131fab 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "10.78", - "log_list_timestamp": "2022-08-19T12:56:29Z", + "version": "10.79", + "log_list_timestamp": "2022-08-20T12:55:27Z", "operators": [ { "name": "Google",
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc index a138abe..71df0e90 100644 --- a/components/exo/shell_surface.cc +++ b/components/exo/shell_surface.cc
@@ -242,6 +242,9 @@ // state doesn't change. ScopedConfigure scoped_configure(this, true); widget_->SetFullscreen(fullscreen); + + if (root_surface()) + root_surface()->OnFullscreenStateChanged(fullscreen); } void ShellSurface::SetPopup() {
diff --git a/components/exo/surface.cc b/components/exo/surface.cc index e9484dc..863110b7 100644 --- a/components/exo/surface.cc +++ b/components/exo/surface.cc
@@ -1647,4 +1647,9 @@ return nullptr; } +void Surface::OnFullscreenStateChanged(bool fullscreen) { + for (SurfaceObserver& observer : observers_) + observer.OnFullscreenStateChanged(fullscreen); +} + } // namespace exo
diff --git a/components/exo/surface.h b/components/exo/surface.h index 97103dc..b38af788 100644 --- a/components/exo/surface.h +++ b/components/exo/surface.h
@@ -426,6 +426,8 @@ // if one can not be determined. See go/secure-exo-ids for more details. SecurityDelegate* GetSecurityDelegate(); + void OnFullscreenStateChanged(bool fullscreen); + private: struct State { State();
diff --git a/components/exo/surface_observer.h b/components/exo/surface_observer.h index 8ec8b9f4..19aa577d 100644 --- a/components/exo/surface_observer.h +++ b/components/exo/surface_observer.h
@@ -45,6 +45,8 @@ // Starts or ends throttling. virtual void ThrottleFrameRate(bool on) {} + virtual void OnFullscreenStateChanged(bool fullscreen) {} + protected: virtual ~SurfaceObserver() {} };
diff --git a/components/exo/wayland/BUILD.gn b/components/exo/wayland/BUILD.gn index 0c104b8..e38f1bd 100644 --- a/components/exo/wayland/BUILD.gn +++ b/components/exo/wayland/BUILD.gn
@@ -30,6 +30,8 @@ "wayland_display_output.h", "wayland_display_util.cc", "wayland_display_util.h", + "wayland_dmabuf_feedback_manager.cc", + "wayland_dmabuf_feedback_manager.h", "wayland_input_delegate.cc", "wayland_input_delegate.h", "wayland_pointer_delegate.cc", @@ -63,6 +65,8 @@ "zcr_stylus.h", "zcr_vsync_feedback.cc", "zcr_vsync_feedback.h", + "zwp_linux_dmabuf.cc", + "zwp_linux_dmabuf.h", "zwp_linux_explicit_synchronization.cc", "zwp_linux_explicit_synchronization.h", ] @@ -72,6 +76,7 @@ deps = [ "//base", "//build:chromeos_buildflags", + "//build/config/linux/libdrm", "//components/exo", "//components/exo:buildflags", "//components/exo/wayland/protocol:aura_shell_protocol", @@ -92,6 +97,7 @@ "//third_party/wayland-protocols:keyboard_configuration_protocol", "//third_party/wayland-protocols:keyboard_extension_protocol", "//third_party/wayland-protocols:keyboard_shortcuts_inhibit_protocol", + "//third_party/wayland-protocols:linux_dmabuf_protocol", "//third_party/wayland-protocols:linux_explicit_synchronization_protocol", "//third_party/wayland-protocols:notification_shell_protocol", "//third_party/wayland-protocols:pointer_constraints_protocol", @@ -117,30 +123,19 @@ "//ui/events:dom_keycode_converter", "//ui/events:events_base", "//ui/events/devices:devices", + "//ui/gfx/linux:drm", + "//ui/ozone", "//ui/views", "//ui/wm:wm", "//ui/wm/public", ] - if (use_ozone) { - sources += [ - "zwp_linux_dmabuf.cc", - "zwp_linux_dmabuf.h", - ] - + if (is_chromeos_ash) { deps += [ - "//build/config/linux/libdrm", - "//third_party/wayland-protocols:linux_dmabuf_protocol", - "//ui/ozone", + "//ash", + "//ash/public/cpp", + "//chromeos/ui/base", ] - - if (is_chromeos_ash) { - deps += [ - "//ash", - "//ash/public/cpp", - "//chromeos/ui/base", - ] - } } if (use_xkbcommon) {
diff --git a/components/exo/wayland/clients/client_base.cc b/components/exo/wayland/clients/client_base.cc index ba2e3eb..2b0c8c8 100644 --- a/components/exo/wayland/clients/client_base.cc +++ b/components/exo/wayland/clients/client_base.cc
@@ -136,7 +136,10 @@ uint32_t id, const char* interface, uint32_t version) { - ClientBase::Globals* globals = static_cast<ClientBase::Globals*>(data); + auto* data_tuple = static_cast< + std::tuple<ClientBase::Globals*, const ClientBase::InitParams&>*>(data); + ClientBase::Globals* globals = std::get<0>(*data_tuple); + const ClientBase::InitParams& params = std::get<1>(*data_tuple); if (strcmp(interface, "wl_compositor") == 0) { globals->compositor.reset(static_cast<wl_compositor*>( @@ -158,7 +161,8 @@ wl_registry_bind(registry, id, &zaura_shell_interface, 34))); } else if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0) { globals->linux_dmabuf.reset(static_cast<zwp_linux_dmabuf_v1*>( - wl_registry_bind(registry, id, &zwp_linux_dmabuf_v1_interface, 2))); + wl_registry_bind(registry, id, &zwp_linux_dmabuf_v1_interface, + params.linux_dmabuf_version))); } else if (strcmp(interface, "wl_subcompositor") == 0) { globals->subcompositor.reset(static_cast<wl_subcompositor*>( wl_registry_bind(registry, id, &wl_subcompositor_interface, 1))); @@ -470,7 +474,9 @@ return false; } registry_.reset(wl_display_get_registry(display_.get())); - wl_registry_add_listener(registry_.get(), &g_registry_listener, &globals_); + + std::tuple<Globals*, const InitParams&> data(&globals_, params); + wl_registry_add_listener(registry_.get(), &g_registry_listener, &data); wl_display_roundtrip(display_.get()); @@ -939,7 +945,7 @@ std::unique_ptr<Buffer> buffer; #if defined(USE_GBM) if (device_) { - buffer = CreateDrmBuffer(size, drm_format, bo_usage, y_invert_); + buffer = CreateDrmBuffer(size, drm_format, nullptr, 0, bo_usage, y_invert_); CHECK(buffer) << "Can't create drm buffer"; } #endif @@ -1044,6 +1050,8 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateDrmBuffer( const gfx::Size& size, int32_t drm_format, + const uint64_t* drm_modifiers, + const unsigned int drm_modifiers_count, int32_t bo_usage, bool y_invert) { std::unique_ptr<Buffer> buffer; @@ -1055,8 +1063,14 @@ } buffer = std::make_unique<Buffer>(); - buffer->bo.reset(gbm_bo_create(device_.get(), size.width(), size.height(), - drm_format, bo_usage)); + if (drm_modifiers_count == 0) { + buffer->bo.reset(gbm_bo_create(device_.get(), size.width(), size.height(), + drm_format, bo_usage)); + } else { + buffer->bo.reset(gbm_bo_create_with_modifiers( + device_.get(), size.width(), size.height(), drm_format, drm_modifiers, + drm_modifiers_count)); + } if (!buffer->bo) { LOG(ERROR) << "Can't create gbm buffer"; return nullptr;
diff --git a/components/exo/wayland/clients/client_base.h b/components/exo/wayland/clients/client_base.h index 8b5fb7d..8dc4c21 100644 --- a/components/exo/wayland/clients/client_base.h +++ b/components/exo/wayland/clients/client_base.h
@@ -70,6 +70,7 @@ bool use_release_fences = false; bool use_stylus = false; absl::optional<std::string> wayland_socket = {}; + uint32_t linux_dmabuf_version = ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION; }; struct Globals { @@ -136,6 +137,8 @@ bool add_buffer_listener = true); std::unique_ptr<Buffer> CreateDrmBuffer(const gfx::Size& size, int32_t drm_format, + const uint64_t* modifiers, + const unsigned int modifiers_count, int32_t bo_usage, bool y_invert); ClientBase::Buffer* DequeueBuffer();
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc index 20c3d46..b1d75a9 100644 --- a/components/exo/wayland/server.cc +++ b/components/exo/wayland/server.cc
@@ -59,6 +59,7 @@ #include "components/exo/wayland/server_util.h" #include "components/exo/wayland/surface_augmenter.h" #include "components/exo/wayland/wayland_display_output.h" +#include "components/exo/wayland/wayland_dmabuf_feedback_manager.h" #include "components/exo/wayland/wayland_watcher.h" #include "components/exo/wayland/wl_compositor.h" #include "components/exo/wayland/wl_data_device_manager.h" @@ -287,8 +288,11 @@ wl_global_create(wl_display_.get(), &wl_compositor_interface, kWlCompositorVersion, this, bind_compositor); wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm); + wayland_feedback_manager_ = + std::make_unique<WaylandDmabufFeedbackManager>(display_); wl_global_create(wl_display_.get(), &zwp_linux_dmabuf_v1_interface, - kZwpLinuxDmabufVersion, display_, bind_linux_dmabuf); + wayland_feedback_manager_->GetVersionSupportedByPlatform(), + wayland_feedback_manager_.get(), bind_linux_dmabuf); wl_global_create(wl_display_.get(), &wl_subcompositor_interface, 1, display_, bind_subcompositor); for (const auto& display : display::Screen::GetScreen()->GetAllDisplays())
diff --git a/components/exo/wayland/server.h b/components/exo/wayland/server.h index 2b401ef1..d5f8921 100644 --- a/components/exo/wayland/server.h +++ b/components/exo/wayland/server.h
@@ -37,6 +37,7 @@ struct WaylandXdgShell; struct WaylandZxdgShell; struct WaylandRemoteShellData; +class WaylandDmabufFeedbackManager; class WestonTest; class WaylandWatcher; @@ -129,6 +130,7 @@ display::ScopedDisplayObserver display_observer_{this}; std::unique_ptr<wayland::WaylandWatcher> wayland_watcher_; base::FilePath socket_path_; + std::unique_ptr<WaylandDmabufFeedbackManager> wayland_feedback_manager_; #if BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<WaylandKeyboardExtension> zcr_keyboard_extension_data_;
diff --git a/components/exo/wayland/server_util.cc b/components/exo/wayland/server_util.cc index 960998e..a57730a3 100644 --- a/components/exo/wayland/server_util.cc +++ b/components/exo/wayland/server_util.cc
@@ -36,6 +36,10 @@ } // namespace +void SetImplementation(wl_resource* resource, const void* implementation) { + wl_resource_set_implementation(resource, implementation, nullptr, nullptr); +} + uint32_t TimeTicksToMilliseconds(base::TimeTicks ticks) { return (ticks - base::TimeTicks()).InMilliseconds(); }
diff --git a/components/exo/wayland/server_util.h b/components/exo/wayland/server_util.h index 8b20ebd..8e2ec7fc7 100644 --- a/components/exo/wayland/server_util.h +++ b/components/exo/wayland/server_util.h
@@ -48,6 +48,8 @@ DestroyUserData<T>); } +void SetImplementation(wl_resource* resource, const void* implementation); + // Convert a timestamp to a time value that can be used when interfacing // with wayland. Note that we cast a int64_t value to uint32_t which can // potentially overflow.
diff --git a/components/exo/wayland/test/integration/buffer_checker_test.cc b/components/exo/wayland/test/integration/buffer_checker_test.cc index 78d2d56..f2530566 100644 --- a/components/exo/wayland/test/integration/buffer_checker_test.cc +++ b/components/exo/wayland/test/integration/buffer_checker_test.cc
@@ -2,11 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <drm_fourcc.h> #include <gbm.h> +#include <sys/mman.h> #include <cstdint> #include <iterator> #include <vector> +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/containers/queue.h" #include "base/logging.h" @@ -23,18 +26,25 @@ namespace { -std::string DrmCodeToString(uint64_t drm_format) { +std::string DrmCodeToString(uint32_t drm_format) { return std::string{static_cast<char>(drm_format), static_cast<char>(drm_format >> 8), static_cast<char>(drm_format >> 16), static_cast<char>(drm_format >> 24), 0}; } -std::string DrmCodeToBufferFormatString(uint64_t drm_format) { +std::string DrmCodeToBufferFormatString(int32_t drm_format) { return gfx::BufferFormatToString( ui::GetBufferFormatFromFourCCFormat(drm_format)); } +std::string DrmModifiersToString(std::vector<uint64_t> drm_modifiers) { + std::stringstream ss; + for (uint64_t drm_modifier : drm_modifiers) + ss << "0x" << std::hex << drm_modifier << " "; + return ss.str(); +} + } // namespace namespace exo { @@ -43,6 +53,11 @@ namespace { +#define WL_ARRAY_FOR_EACH(pos, array, type) \ + for (pos = (type)(array)->data; \ + (const char*)pos < ((const char*)(array)->data + (array)->size); \ + (pos)++) + class BufferCheckerTestClient : public ::exo::wayland::clients::ClientBase { public: explicit BufferCheckerTestClient() = default; @@ -98,7 +113,8 @@ current_buffer = CreateDrmBuffer( gfx::Size(surface_size_.width(), surface_size_.height()), format, - ui::BufferUsageToGbmFlags(current_usage), /*y_invert=*/false); + nullptr, 0, ui::BufferUsageToGbmFlags(current_usage), + /*y_invert=*/false); if (!current_buffer) { LOG(ERROR) << "Unable to create buffer for drm: " << DrmCodeToString(format) << " gfx::BufferFormat: " @@ -113,7 +129,80 @@ << " gfx::BufferFormat: " << DrmCodeToBufferFormatString(format) << " gfx::BufferUsage " << gfx::BufferUsageToString(current_usage); - ; + + wl_surface_damage(surface_.get(), 0, 0, surface_size_.width(), + surface_size_.height()); + wl_surface_attach(surface_.get(), current_buffer->buffer.get(), 0, 0); + + frame_callback.reset(wl_surface_frame(surface_.get())); + wl_callback_add_listener(frame_callback.get(), &frame_listener, + &callback_pending); + callback_pending = true; + wl_surface_commit(surface_.get()); + + wl_display_flush(display_.get()); + } while (wl_display_dispatch(display_.get()) != -1); + + LOG(ERROR) + << "Expected to return from inside the loop. Wayland disconnected?"; + return false; + } + + bool FormatAndModifierSupported(uint32_t format, + std::vector<uint64_t> modifiers) { + std::vector<gfx::BufferUsage> supported_usages; + bool callback_pending = false; + std::unique_ptr<wl_callback> frame_callback; + wl_callback_listener frame_listener = { + [](void* data, struct wl_callback*, uint32_t) { + *(static_cast<bool*>(data)) = false; + }}; + + std::unique_ptr<Buffer> current_buffer; + do { + if (callback_pending) + continue; + + if (current_buffer) { + LOG(INFO) << "Successfully used buffer with drm format: " + << DrmCodeToString(format) + << " drm modifiers: " << DrmModifiersToString(modifiers) + << " gfx::BufferFormat: " + << DrmCodeToBufferFormatString(format); + return true; + } + + if (wl_display_get_error(display_.get())) { + LOG(ERROR) << "Wayland error encountered"; + return false; + } + + if (modifiers.size() == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) { + current_buffer = CreateDrmBuffer( + gfx::Size(surface_size_.width(), surface_size_.height()), format, + nullptr, 0, ui::BufferUsageToGbmFlags(gfx::BufferUsage::GPU_READ), + /*y_invert=*/false); + } else { + current_buffer = CreateDrmBuffer( + gfx::Size(surface_size_.width(), surface_size_.height()), format, + modifiers.data(), modifiers.size(), + ui::BufferUsageToGbmFlags(gfx::BufferUsage::GPU_READ), + /*y_invert=*/false); + } + if (!current_buffer) { + LOG(ERROR) << "Unable to create buffer for drm format: " + << DrmCodeToString(format) + << " drm modifiers: " << DrmModifiersToString(modifiers) + << " gfx::BufferFormat: " + << DrmCodeToBufferFormatString(format); + return false; + } + + LOG(INFO) << "Attempting to use buffer with format drm format: " + << DrmCodeToString(format) + << " drm modifiers: " << DrmModifiersToString(modifiers) + << " gfx::BufferFormat: " + << DrmCodeToBufferFormatString(format); wl_surface_damage(surface_.get(), 0, 0, surface_size_.width(), surface_size_.height()); @@ -134,7 +223,188 @@ } std::vector<uint32_t> reported_formats; - base::flat_map<uint32_t, std::vector<uint64_t>> reported_format_modifer_map; + base::flat_map<uint32_t, std::vector<uint64_t>> reported_format_modifier_map; + + struct WaylandDmabufFeedbackFormat { + uint32_t format; + uint32_t padding; + uint64_t modifier; + }; + + struct DmabufFeedbackTranche { + dev_t target_device; + uint32_t flags; + base::flat_map<uint32_t, std::vector<uint64_t>> format_modifier_map; + }; + + struct DmabufFeedback { + dev_t main_device; + std::vector<WaylandDmabufFeedbackFormat> format_table; + std::vector<DmabufFeedbackTranche> tranches; + DmabufFeedbackTranche pending_tranche; + }; + + DmabufFeedback current_feedback_; + DmabufFeedback pending_feedback_; + + void HandleFeedbackDone(zwp_linux_dmabuf_feedback_v1* dmabuf_feedback) { + current_feedback_ = pending_feedback_; + pending_feedback_ = {}; + + reported_formats.clear(); + reported_format_modifier_map.clear(); + for (DmabufFeedbackTranche tranche : current_feedback_.tranches) { + for (const auto& [format, modifiers] : tranche.format_modifier_map) { + if (!base::Contains(reported_formats, format)) { + reported_formats.push_back(format); + } + if (!reported_format_modifier_map.contains(format)) { + reported_format_modifier_map[format] = std::vector<uint64_t>(); + } + + for (uint64_t modifier : modifiers) { + if (!base::Contains(reported_format_modifier_map[format], modifier)) { + reported_format_modifier_map[format].push_back(modifier); + } + } + } + } + } + + void HandleFeedbackFormatTable( + zwp_linux_dmabuf_feedback_v1* zwp_linux_dmabuf_feedback_v1, + int32_t fd, + uint32_t size) { + ASSERT_TRUE(pending_feedback_.format_table.empty()); + + WaylandDmabufFeedbackFormat* format_table = + static_cast<WaylandDmabufFeedbackFormat*>( + mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0)); + uint32_t table_size = size / sizeof(WaylandDmabufFeedbackFormat); + for (uint32_t i = 0; i < table_size; i++) { + pending_feedback_.format_table.push_back(format_table[i]); + } + munmap(format_table, size); + close(fd); + } + + void HandleFeedbackMainDevice(zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + wl_array* dev) { + memcpy(&pending_feedback_.main_device, dev->data, sizeof(dev)); + } + + void HandleFeedbackTrancheDone( + zwp_linux_dmabuf_feedback_v1* dmabuf_feedback) { + pending_feedback_.tranches.push_back(pending_feedback_.pending_tranche); + pending_feedback_.pending_tranche = {}; + } + + void HandleFeedbackTrancheTargetDevice( + zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + wl_array* dev) { + memcpy(&pending_feedback_.pending_tranche.target_device, dev->data, + sizeof(dev)); + } + + void HandleFeedbackTrancheFormats( + zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + wl_array* indices) { + std::vector<WaylandDmabufFeedbackFormat>* format_table = + &pending_feedback_.format_table; + if (format_table == nullptr) + format_table = ¤t_feedback_.format_table; + ASSERT_TRUE(format_table != nullptr); + + uint16_t* index; + WL_ARRAY_FOR_EACH(index, indices, uint16_t*) { + uint32_t format = format_table->at(*index).format; + uint64_t modifier = format_table->at(*index).modifier; + + if (!pending_feedback_.pending_tranche.format_modifier_map.contains( + format)) + pending_feedback_.pending_tranche.format_modifier_map[format] = + std::vector<uint64_t>(); + + pending_feedback_.pending_tranche.format_modifier_map[format].push_back( + modifier); + } + } + + void HandleFeedbackTrancheFlags(zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + uint32_t flags) { + pending_feedback_.pending_tranche.flags = flags; + } + + void AddFeedbackListener(zwp_linux_dmabuf_feedback_v1* dmabuf_feedback_obj) { + static struct zwp_linux_dmabuf_feedback_v1_listener kLinuxFeedbackListener = + { + .done = + [](void* data, + struct zwp_linux_dmabuf_feedback_v1* dmabuf_feedback) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackDone(dmabuf_feedback); + }, + .format_table = + [](void* data, zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + int32_t fd, uint32_t size) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackFormatTable(dmabuf_feedback, fd, size); + }, + .main_device = + [](void* data, + struct zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + struct wl_array* dev) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackMainDevice(dmabuf_feedback, dev); + }, + .tranche_done = + [](void* data, + struct zwp_linux_dmabuf_feedback_v1* dmabuf_feedback) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackTrancheDone(dmabuf_feedback); + }, + .tranche_target_device = + [](void* data, + struct zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + struct wl_array* dev) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackTrancheTargetDevice(dmabuf_feedback, dev); + }, + .tranche_formats = + [](void* data, + struct zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + struct wl_array* indices) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackTrancheFormats(dmabuf_feedback, indices); + }, + .tranche_flags = + [](void* data, + struct zwp_linux_dmabuf_feedback_v1* dmabuf_feedback, + uint32_t flags) { + static_cast<BufferCheckerTestClient*>(data) + ->HandleFeedbackTrancheFlags(dmabuf_feedback, flags); + }, + }; + + zwp_linux_dmabuf_feedback_v1_add_listener(dmabuf_feedback_obj, + &kLinuxFeedbackListener, this); + wl_display_roundtrip(display_.get()); + } + + void GetDefaultFeedback() { + zwp_linux_dmabuf_feedback_v1* dmabuf_feedback_obj = + zwp_linux_dmabuf_v1_get_default_feedback(globals_.linux_dmabuf.get()); + + AddFeedbackListener(dmabuf_feedback_obj); + } + + void GetSurfaceFeedback() { + zwp_linux_dmabuf_feedback_v1* dmabuf_feedback_obj = + zwp_linux_dmabuf_v1_get_surface_feedback(globals_.linux_dmabuf.get(), + surface_.get()); + + AddFeedbackListener(dmabuf_feedback_obj); + } protected: void HandleDmabufFormat(void* data, @@ -148,12 +418,12 @@ uint32_t format, uint32_t modifier_hi, uint32_t modifier_lo) override { - if (!reported_format_modifer_map.contains(format)) { - reported_format_modifer_map[format] = std::vector<uint64_t>(); + if (!reported_format_modifier_map.contains(format)) { + reported_format_modifier_map[format] = std::vector<uint64_t>(); } uint64_t modifier = static_cast<uint64_t>(modifier_hi) << 32 | modifier_lo; - reported_format_modifer_map[format].push_back(modifier); + reported_format_modifier_map[format].push_back(modifier); } }; @@ -190,13 +460,184 @@ << base::JoinString(buffer_names, ", "); } -TEST_F(BufferCheckerClientTest, CanUseAllReportedBuffers) { +TEST_F(BufferCheckerClientTest, CanUseAllReportedBufferFormatsLegacy) { exo::wayland::test::BufferCheckerTestClient client; auto params = base_params_; // Initialize no buffers when we start, wait until we've gotten the list params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_BUFFER_PARAMS_V1_CREATE_IMMED_SINCE_VERSION; ASSERT_TRUE(client.Init(params)); + EXPECT_TRUE(!client.reported_formats.empty()); + PrintReportedFormats(client.reported_formats); for (auto format : client.reported_formats) EXPECT_TRUE(client.HasAnySupportedUsages(format)); } + +TEST_F(BufferCheckerClientTest, CanUseAnyReportedBufferModifiersLegacy) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + for (const auto& [format, modifiers] : client.reported_format_modifier_map) { + std::vector<uint64_t> valid_modifiers; + for (uint64_t modifier : modifiers) { + if (modifier != DRM_FORMAT_MOD_INVALID) + valid_modifiers.push_back(modifier); + } + if (valid_modifiers.empty()) + valid_modifiers.push_back(DRM_FORMAT_MOD_INVALID); + EXPECT_TRUE(client.FormatAndModifierSupported(format, valid_modifiers)); + } +} + +TEST_F(BufferCheckerClientTest, CanUseAllReportedBufferModifiersLegacy) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + for (const auto& [format, modifiers] : client.reported_format_modifier_map) { + for (auto modifier : modifiers) { + EXPECT_TRUE(client.FormatAndModifierSupported(format, {modifier})); + } + } +} + +TEST_F(BufferCheckerClientTest, CanUseAllReportedBufferFormatsDefaultFeedback) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + + EXPECT_TRUE(client.reported_format_modifier_map.empty()); + client.GetDefaultFeedback(); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + PrintReportedFormats(client.reported_formats); + for (auto format : client.reported_formats) + EXPECT_TRUE(client.HasAnySupportedUsages(format)); +} + +TEST_F(BufferCheckerClientTest, + CanUseAnyReportedBufferModifiersDefaultFeedback) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + + EXPECT_TRUE(client.reported_format_modifier_map.empty()); + client.GetDefaultFeedback(); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + for (const auto& [format, modifiers] : client.reported_format_modifier_map) { + std::vector<uint64_t> valid_modifiers; + for (uint64_t modifier : modifiers) { + if (modifier != DRM_FORMAT_MOD_INVALID) + valid_modifiers.push_back(modifier); + } + if (valid_modifiers.empty()) + valid_modifiers.push_back(DRM_FORMAT_MOD_INVALID); + EXPECT_TRUE(client.FormatAndModifierSupported(format, valid_modifiers)); + } +} + +TEST_F(BufferCheckerClientTest, + CanUseAllReportedBufferModifiersDefaultFeedback) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + + EXPECT_TRUE(client.reported_format_modifier_map.empty()); + client.GetDefaultFeedback(); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + for (const auto& [format, modifiers] : client.reported_format_modifier_map) { + for (auto modifier : modifiers) { + EXPECT_TRUE(client.FormatAndModifierSupported(format, {modifier})); + } + } +} + +TEST_F(BufferCheckerClientTest, CanUseAllReportedBufferFormatsSurfaceFeedback) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_DMABUF_V1_GET_SURFACE_FEEDBACK_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + + EXPECT_TRUE(client.reported_format_modifier_map.empty()); + client.GetSurfaceFeedback(); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + PrintReportedFormats(client.reported_formats); + for (auto format : client.reported_formats) + EXPECT_TRUE(client.HasAnySupportedUsages(format)); +} + +TEST_F(BufferCheckerClientTest, + CanUseAnyReportedBufferModifiersSurfaceFeedback) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_DMABUF_V1_GET_SURFACE_FEEDBACK_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + + EXPECT_TRUE(client.reported_format_modifier_map.empty()); + client.GetSurfaceFeedback(); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + for (const auto& [format, modifiers] : client.reported_format_modifier_map) { + std::vector<uint64_t> valid_modifiers; + for (uint64_t modifier : modifiers) { + if (modifier != DRM_FORMAT_MOD_INVALID) + valid_modifiers.push_back(modifier); + } + if (valid_modifiers.empty()) + valid_modifiers.push_back(DRM_FORMAT_MOD_INVALID); + EXPECT_TRUE(client.FormatAndModifierSupported(format, valid_modifiers)); + } +} + +TEST_F(BufferCheckerClientTest, + CanUseAllReportedBufferModifiersSurfaceFeedback) { + exo::wayland::test::BufferCheckerTestClient client; + auto params = base_params_; + // Initialize no buffers when we start, wait until we've gotten the list + params.num_buffers = 0; + params.linux_dmabuf_version = + ZWP_LINUX_DMABUF_V1_GET_SURFACE_FEEDBACK_SINCE_VERSION; + ASSERT_TRUE(client.Init(params)); + + EXPECT_TRUE(client.reported_format_modifier_map.empty()); + client.GetSurfaceFeedback(); + EXPECT_TRUE(!client.reported_format_modifier_map.empty()); + + for (const auto& [format, modifiers] : client.reported_format_modifier_map) { + for (auto modifier : modifiers) { + EXPECT_TRUE(client.FormatAndModifierSupported(format, {modifier})); + } + } +}
diff --git a/components/exo/wayland/wayland_dmabuf_feedback_manager.cc b/components/exo/wayland/wayland_dmabuf_feedback_manager.cc new file mode 100644 index 0000000..557b66d --- /dev/null +++ b/components/exo/wayland/wayland_dmabuf_feedback_manager.cc
@@ -0,0 +1,550 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/exo/wayland/wayland_dmabuf_feedback_manager.h" + +#include <bits/types.h> +#include <drm_fourcc.h> +#include <linux-dmabuf-unstable-v1-server-protocol.h> +#include <sys/stat.h> + +#include "base/bind.h" +#include "base/containers/contains.h" +#include "components/exo/buffer.h" +#include "components/exo/display.h" +#include "components/exo/wayland/server_util.h" +#include "components/viz/common/gpu/context_provider.h" +#include "ui/aura/env.h" +#include "ui/compositor/compositor.h" +#include "ui/gfx/linux/drm_util_linux.h" + +namespace exo { +namespace wayland { +namespace { + +enum TrancheFlags : uint32_t { kNone = 0, kScanout = 1 }; + +// Detecting optimal values for scanout tranches is not yet implemented and +// quite complex. On certain hardware this can be problematic if drivers choose +// scanout incompatible modifiers or memory regions if no scanout tranche is +// supplied. For these cases we can make an educated guess and hardcode values +// that are likely supported. They will only be advertised if they are also +// supported by the compositor. +#if 0 // AMD Radeon RX 6700 XT (usually uses 0x020000001896bb03 by default) +const base::flat_map<uint32_t, std::vector<uint64_t>> + kWaylandDmabufKnownScanoutModifierMap = { + {DRM_FORMAT_RGB565, {0x0, 0x200000018801b03, 0x200000000000901}}, + {DRM_FORMAT_XBGR8888, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_ABGR8888, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_XRGB8888, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_ARGB8888, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_XBGR2101010, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_ABGR2101010, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_XRGB2101010, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_ARGB2101010, + {0x0, 0x200000018967b03, 0x200000018937b03, 0x200000018801b03, + 0x200000000000901}}, + {DRM_FORMAT_XBGR16161616F, + {0x0, 0x200000018801b03, 0x200000000000a01, 0x200000000000901}}, + {DRM_FORMAT_ABGR16161616F, + {0x0, 0x200000018801b03, 0x200000000000a01, 0x200000000000901}}}; +#else +const base::flat_map<uint32_t, std::vector<uint64_t>> + kWaylandDmabufKnownScanoutModifierMap = {}; +#endif + +struct WaylandDmabufFeedbackFormat { + uint32_t format; + uint32_t padding; + uint64_t modifier; +}; + +void feedbackDestroy(wl_client* client, wl_resource* resource) { + wl_resource_destroy(resource); +} + +const struct zwp_linux_dmabuf_feedback_v1_interface feedback_implementation = { + feedbackDestroy, +}; + +// A tranche links to a subset of formats and modifiers which are supported on a +// specific device for a specific task. The most common use cases are the +// "default" tranche (targeting the main device, advertising all formats and +// modifiers supported by the compositor, for non-scanout cases) and "scanout" +// tranches (advertising the formats and modifiers on a specific device that, if +// used by the client, allows the compositor to offload some work to the +// hardware). "scanout" tranches should usually only get advertised by the +// compositor if there's a reasonable chance that composition can be skipped - +// e.g. when a surface is in fullscreen mode. +class WaylandDmabufFeedbackTranche { + public: + explicit WaylandDmabufFeedbackTranche( + dev_t target_device_id, + TrancheFlags flags, + DrmFormatsAndModifiers drm_formats_and_modifiers) + : target_device_id_(target_device_id), + flags_(flags), + drm_formats_and_modifiers_(drm_formats_and_modifiers) {} + explicit WaylandDmabufFeedbackTranche( + const std::unique_ptr<WaylandDmabufFeedbackTranche>& other) + : target_device_id_(other->target_device_id_), + flags_(other->flags_), + drm_formats_and_modifiers_(other->drm_formats_and_modifiers_) {} + + WaylandDmabufFeedbackTranche(const WaylandDmabufFeedbackTranche&) = delete; + WaylandDmabufFeedbackTranche& operator=(const WaylandDmabufFeedbackTranche&) = + delete; + + ~WaylandDmabufFeedbackTranche() = default; + + dev_t GetTargetDeviceId() const { return target_device_id_; } + TrancheFlags GetFlags() const { return flags_; } + + const DrmFormatsAndModifiers GetFormatsAndModifiers() const { + return drm_formats_and_modifiers_; + } + + private: + const dev_t target_device_id_; + const TrancheFlags flags_; + const DrmFormatsAndModifiers drm_formats_and_modifiers_; +}; + +// A feedback is a set of information that is send to the client. It consists of +// a main device (the device the compositor uses for rendering), a format table +// (containing all formats and modifiers that may be advertised in one of the +// tranches, including those not supported by the main device) and one or more +// tranches (there must always be at least one for the main device). The +// compositor may choose to update a feedback at any time if necessary. The +// provided information should allow the client to pick the optimal combination +// of device, format and modifier for any given situation. +// A feedback object may be reused for several clients/requests in order to +// minimize resource usage. +// TODO: Updating a feedback is not yet implemented. +class WaylandDmabufFeedback { + public: + explicit WaylandDmabufFeedback( + dev_t device_id, + std::unique_ptr<WaylandDmabufFeedbackTranche> default_tranche) + : main_device_id_(device_id), + default_tranche_(std::move(default_tranche)) {} + explicit WaylandDmabufFeedback( + const std::unique_ptr<WaylandDmabufFeedback>& other) + : main_device_id_(other->main_device_id_), + default_tranche_(std::make_unique<WaylandDmabufFeedbackTranche>( + other->default_tranche_)) { + if (other->scanout_tranche_) + scanout_tranche_ = std::make_unique<WaylandDmabufFeedbackTranche>( + other->scanout_tranche_); + } + + WaylandDmabufFeedback(const WaylandDmabufFeedback&) = delete; + WaylandDmabufFeedback& operator=(const WaylandDmabufFeedback&) = delete; + + ~WaylandDmabufFeedback() = default; + + dev_t GetMainDeviceId() const { return main_device_id_; } + const WaylandDmabufFeedbackTranche* GetDefaultTranche() const { + return default_tranche_.get(); + } + const WaylandDmabufFeedbackTranche* GetScanoutTranche() const { + return scanout_tranche_.get(); + } + + void MaybeAddScanoutTranche() { + DCHECK(!scanout_tranche_); + + DrmFormatsAndModifiers scanout_formats_and_modifiers; + for (const auto& [format, modifier_entries] : + default_tranche_->GetFormatsAndModifiers()) { + if (base::Contains(kWaylandDmabufKnownScanoutModifierMap, format)) { + base::flat_map<size_t, uint64_t> scanout_modifier_entries; + + for (const auto& [table_index, modifier] : modifier_entries) { + if (base::Contains(kWaylandDmabufKnownScanoutModifierMap.at(format), + modifier)) { + scanout_modifier_entries.emplace(table_index, modifier); + } + } + + if (!scanout_modifier_entries.empty()) + scanout_formats_and_modifiers.emplace(format, + scanout_modifier_entries); + } + } + if (scanout_formats_and_modifiers.empty()) + return; + + scanout_tranche_ = std::make_unique<WaylandDmabufFeedbackTranche>( + main_device_id_, TrancheFlags::kScanout, scanout_formats_and_modifiers); + }; + + void ClearScanoutTranche() { + DCHECK(scanout_tranche_); + scanout_tranche_ = nullptr; + }; + + private: + const dev_t main_device_id_; + const std::unique_ptr<WaylandDmabufFeedbackTranche> default_tranche_; + std::unique_ptr<WaylandDmabufFeedbackTranche> scanout_tranche_; +}; + +class WaylandDmabufSurfaceFeedbackResourceWrapper; + +// A surface feedback can be requested by a client to get an optimized feedback +// for a specific surface - most importantly if the client wants to receive +// "scanout" tranches when possible. A client may request the surface feedback +// multiple times for the same surface (e.g. implicitly via Mesa and explicitly +// in the application). Thus a surface feedback can have multiple resource +// objects. +class WaylandDmabufSurfaceFeedback : public SurfaceObserver { + public: + explicit WaylandDmabufSurfaceFeedback( + WaylandDmabufFeedbackManager* feedback_manager, + Surface* surface, + std::unique_ptr<WaylandDmabufFeedback> feedback) + : feedback_manager_(feedback_manager), + surface_(surface), + feedback_(std::move(feedback)) { + surface_->AddSurfaceObserver(this); + } + + WaylandDmabufSurfaceFeedback(const WaylandDmabufSurfaceFeedback&) = delete; + WaylandDmabufSurfaceFeedback& operator=(const WaylandDmabufSurfaceFeedback&) = + delete; + + ~WaylandDmabufSurfaceFeedback() override; + + void OnSurfaceDestroying(Surface* surface) override { + feedback_manager_->RemoveSurfaceFeedback(surface_); + } + + void OnFullscreenStateChanged(bool fullscreen) override { + if (fullscreen) + feedback_manager_->AddSurfaceToScanoutCandidates(surface_); + else + feedback_manager_->RemoveSurfaceFromScanoutCandidates(surface_); + } + + void AddSurfaceFeedbackRef( + WaylandDmabufSurfaceFeedbackResourceWrapper* surface_feedback_ref) { + surface_feedback_refs_.insert(surface_feedback_ref); + } + void OnSurfaceFeedbackRefDestroyed( + WaylandDmabufSurfaceFeedbackResourceWrapper* surface_feedback_ref) { + DCHECK(base::Contains(surface_feedback_refs_, surface_feedback_ref)); + surface_feedback_refs_.erase(surface_feedback_ref); + if (surface_feedback_refs_.empty()) + feedback_manager_->RemoveSurfaceFeedback(surface_); + } + + Surface* GetSurface() { return surface_; } + WaylandDmabufFeedback* GetFeedback() { return feedback_.get(); } + std::set<WaylandDmabufSurfaceFeedbackResourceWrapper*> GetFeedbackRefs() { + return surface_feedback_refs_; + } + + private: + WaylandDmabufFeedbackManager* const feedback_manager_; + Surface* const surface_; + std::unique_ptr<WaylandDmabufFeedback> const feedback_; + std::set<WaylandDmabufSurfaceFeedbackResourceWrapper*> surface_feedback_refs_; +}; + +// Simple helper class to use a surface feedback with multiple resource objects +// when using SetImplementation() +class WaylandDmabufSurfaceFeedbackResourceWrapper { + public: + explicit WaylandDmabufSurfaceFeedbackResourceWrapper( + WaylandDmabufSurfaceFeedback* surface_feedback, + wl_resource* resource) + : surface_feedback_(surface_feedback), resource_(resource) { + surface_feedback->AddSurfaceFeedbackRef(this); + } + + WaylandDmabufSurfaceFeedbackResourceWrapper( + const WaylandDmabufSurfaceFeedbackResourceWrapper&) = delete; + WaylandDmabufSurfaceFeedbackResourceWrapper& operator=( + const WaylandDmabufSurfaceFeedbackResourceWrapper&) = delete; + + ~WaylandDmabufSurfaceFeedbackResourceWrapper() { + if (surface_feedback_) + surface_feedback_->OnSurfaceFeedbackRefDestroyed(this); + } + + wl_resource* GetFeedbackResource() { return resource_; } + void SetInert() { surface_feedback_ = nullptr; } + + private: + WaylandDmabufSurfaceFeedback* surface_feedback_; + wl_resource* resource_; +}; + +WaylandDmabufSurfaceFeedback::~WaylandDmabufSurfaceFeedback() { + for (WaylandDmabufSurfaceFeedbackResourceWrapper* surface_feedback_ref : + surface_feedback_refs_) { + surface_feedback_ref->SetInert(); + } + surface_->RemoveSurfaceObserver(this); +} + +} // namespace + +WaylandDmabufFeedbackManager::WaylandDmabufFeedbackManager(Display* display) + : display_(display) { + scoped_refptr<viz::ContextProvider> context_provider = + aura::Env::GetInstance() + ->context_factory() + ->SharedMainThreadContextProvider(); + gpu::Capabilities caps = context_provider->ContextCapabilities(); + + size_t table_index = 0; + if (caps.drm_formats_and_modifiers.empty()) { + // Fallback path with implicit modifiers + gpu::GpuMemoryBufferFormatSet format_set = caps.gpu_memory_buffer_formats; + + for (int i = 0; i <= static_cast<int>(gfx::BufferFormat::LAST); i++) { + gfx::BufferFormat buffer_format = static_cast<gfx::BufferFormat>(i); + if (format_set.Has(buffer_format)) { + int drm_format = ui::GetFourCCFormatFromBufferFormat(buffer_format); + if (ui::IsValidBufferFormat(drm_format)) { + base::flat_map<size_t, uint64_t> modifier_entries; + modifier_entries.emplace(table_index++, DRM_FORMAT_MOD_INVALID); + drm_formats_and_modifiers_.emplace(drm_format, modifier_entries); + } + } + } + } else { + for (const auto& [drm_format, modifiers] : caps.drm_formats_and_modifiers) { + base::flat_map<size_t, uint64_t> modifier_entries; + for (uint64_t modifier : modifiers) { + modifier_entries.emplace(table_index++, modifier); + } + drm_formats_and_modifiers_.emplace(drm_format, modifier_entries); + } + } + DCHECK(!drm_formats_and_modifiers_.empty() && table_index > 0); + + struct stat device_stat; + if (caps.drm_render_node.empty() || + stat(caps.drm_render_node.c_str(), &device_stat) != 0) { + version_ = ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION; + return; + } + + auto tranche = std::make_unique<WaylandDmabufFeedbackTranche>( + device_stat.st_rdev, TrancheFlags::kNone, drm_formats_and_modifiers_); + default_feedback_ = std::make_unique<WaylandDmabufFeedback>( + device_stat.st_rdev, std::move(tranche)); + + size_t size = sizeof(WaylandDmabufFeedbackFormat) * table_index; + base::MappedReadOnlyRegion mapped_region = + base::ReadOnlySharedMemoryRegion::Create(size); + DCHECK(mapped_region.IsValid()); + + shared_memory_region_ = std::make_unique<base::ReadOnlySharedMemoryRegion>( + std::move(mapped_region.region)); + + WaylandDmabufFeedbackFormat* format_table = + static_cast<WaylandDmabufFeedbackFormat*>(mapped_region.mapping.memory()); + + for (const auto& [format, modifier_entries] : drm_formats_and_modifiers_) { + for (const auto& [table_index, modifier] : modifier_entries) { + format_table[table_index].format = format; + format_table[table_index].modifier = modifier; + } + } + + version_ = ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION; +} + +WaylandDmabufFeedbackManager::~WaylandDmabufFeedbackManager() = default; + +bool WaylandDmabufFeedbackManager::IsFormatSupported(uint32_t format) const { + return base::Contains(drm_formats_and_modifiers_, format); +} + +void WaylandDmabufFeedbackManager::SendFormatsAndModifiers( + wl_resource* resource) const { + for (const auto& [format, modifier_entries] : drm_formats_and_modifiers_) { + zwp_linux_dmabuf_v1_send_format(resource, format); + if (wl_resource_get_version(resource) >= + ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION) { + for (const auto& [table_index, modifier] : modifier_entries) { + zwp_linux_dmabuf_v1_send_modifier(resource, format, modifier >> 32, + modifier & 0xffffffff); + } + } + } +} + +void WaylandDmabufFeedbackManager::GetDefaultFeedback( + wl_client* client, + wl_resource* dma_buf_resource, + uint32_t feedback_id) { + wl_resource* feedback_resource = wl_resource_create( + client, &zwp_linux_dmabuf_feedback_v1_interface, + wl_resource_get_version(dma_buf_resource), feedback_id); + + SetImplementation(feedback_resource, &feedback_implementation); + + SendFeedback(default_feedback_.get(), feedback_resource); +} + +void WaylandDmabufFeedbackManager::GetSurfaceFeedback( + wl_client* client, + wl_resource* dma_buf_resource, + uint32_t feedback_id, + wl_resource* surface_resource) { + Surface* surface = GetUserDataAs<Surface>(surface_resource); + + auto it = surface_feedbacks_.find(surface); + if (it == surface_feedbacks_.end()) { + auto defaut_feedback_copy = + std::make_unique<WaylandDmabufFeedback>(default_feedback_); + auto new_surface_feedback = std::make_unique<WaylandDmabufSurfaceFeedback>( + this, surface, std::move(defaut_feedback_copy)); + it = surface_feedbacks_.emplace_hint(it, surface, + std::move(new_surface_feedback)); + } + WaylandDmabufSurfaceFeedback* surface_feedback = it->second.get(); + DCHECK(surface_feedback); + + wl_resource* feedback_resource = wl_resource_create( + client, &zwp_linux_dmabuf_feedback_v1_interface, + wl_resource_get_version(dma_buf_resource), feedback_id); + + auto surface_feedback_ref = + std::make_unique<WaylandDmabufSurfaceFeedbackResourceWrapper>( + surface_feedback, feedback_resource); + SetImplementation(feedback_resource, &feedback_implementation, + std::move(surface_feedback_ref)); + + auto* feedback = surface_feedback->GetFeedback(); + if (base::Contains(scanout_candidates_, surface)) + feedback->MaybeAddScanoutTranche(); + + SendFeedback(feedback, feedback_resource); +} + +void WaylandDmabufFeedbackManager::RemoveSurfaceFeedback(Surface* surface) { + DCHECK(base::Contains(surface_feedbacks_, surface)); + surface_feedbacks_.erase(surface); +} + +void WaylandDmabufFeedbackManager::AddSurfaceToScanoutCandidates( + Surface* surface) { + if (base::Contains(scanout_candidates_, surface)) + return; + + scanout_candidates_.emplace(surface); + + if (!base::Contains(surface_feedbacks_, surface)) + return; + + const auto& surface_feedback = surface_feedbacks_[surface]; + auto* feedback = surface_feedback->GetFeedback(); + if (feedback->GetScanoutTranche()) + return; + + feedback->MaybeAddScanoutTranche(); + if (!feedback->GetScanoutTranche()) + return; + + for (auto* feedback_ref : surface_feedback->GetFeedbackRefs()) { + SendFeedback(feedback, feedback_ref->GetFeedbackResource()); + } +} + +void WaylandDmabufFeedbackManager::RemoveSurfaceFromScanoutCandidates( + Surface* surface) { + if (!base::Contains(scanout_candidates_, surface)) + return; + + scanout_candidates_.erase(surface); + + if (!base::Contains(surface_feedbacks_, surface)) + return; + + const auto& surface_feedback = surface_feedbacks_[surface]; + auto* feedback = surface_feedback->GetFeedback(); + if (!feedback->GetScanoutTranche()) + return; + + feedback->ClearScanoutTranche(); + for (auto* feedback_ref : surface_feedback->GetFeedbackRefs()) { + SendFeedback(feedback, feedback_ref->GetFeedbackResource()); + } +} + +void WaylandDmabufFeedbackManager::SendFeedback(WaylandDmabufFeedback* feedback, + wl_resource* resource) { + wl_array main_device_buf; + wl_array_init(&main_device_buf); + dev_t* device_id_ptr = + static_cast<dev_t*>(wl_array_add(&main_device_buf, sizeof(dev_t))); + *device_id_ptr = feedback->GetMainDeviceId(); + zwp_linux_dmabuf_feedback_v1_send_main_device(resource, &main_device_buf); + wl_array_release(&main_device_buf); + + base::subtle::FDPair fd_pair = shared_memory_region_->GetPlatformHandle(); + zwp_linux_dmabuf_feedback_v1_send_format_table( + resource, fd_pair.fd, shared_memory_region_->GetSize()); + + if (feedback->GetScanoutTranche()) + SendTranche(feedback->GetScanoutTranche(), resource); + + SendTranche(feedback->GetDefaultTranche(), resource); + + zwp_linux_dmabuf_feedback_v1_send_done(resource); +} + +void WaylandDmabufFeedbackManager::SendTranche( + const WaylandDmabufFeedbackTranche* tranche, + wl_resource* resource) { + wl_array target_device_buf; + wl_array_init(&target_device_buf); + dev_t* device_id_ptr = + static_cast<dev_t*>(wl_array_add(&target_device_buf, sizeof(dev_t))); + *device_id_ptr = tranche->GetTargetDeviceId(); + zwp_linux_dmabuf_feedback_v1_send_tranche_target_device(resource, + &target_device_buf); + wl_array_release(&target_device_buf); + + zwp_linux_dmabuf_feedback_v1_send_tranche_flags(resource, + tranche->GetFlags()); + + wl_array formats_array; + wl_array_init(&formats_array); + for (const auto& [format, modifier_entries] : + tranche->GetFormatsAndModifiers()) { + for (const auto& [table_index, modifier] : modifier_entries) { + uint16_t* format_index_ptr = static_cast<uint16_t*>( + wl_array_add(&formats_array, sizeof(uint16_t))); + *format_index_ptr = table_index; + } + } + zwp_linux_dmabuf_feedback_v1_send_tranche_formats(resource, &formats_array); + wl_array_release(&formats_array); + + zwp_linux_dmabuf_feedback_v1_send_tranche_done(resource); +} + +} // namespace wayland +} // namespace exo
diff --git a/components/exo/wayland/wayland_dmabuf_feedback_manager.h b/components/exo/wayland/wayland_dmabuf_feedback_manager.h new file mode 100644 index 0000000..2f6ced26 --- /dev/null +++ b/components/exo/wayland/wayland_dmabuf_feedback_manager.h
@@ -0,0 +1,80 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_EXO_WAYLAND_WAYLAND_DMABUF_FEEDBACK_MANAGER_H_ +#define COMPONENTS_EXO_WAYLAND_WAYLAND_DMABUF_FEEDBACK_MANAGER_H_ + +#include <stdint.h> +#include <sys/types.h> +#include <memory> +#include <set> + +#include "base/containers/flat_map.h" +#include "base/memory/read_only_shared_memory_region.h" +#include "components/exo/surface_observer.h" + +struct wl_client; +struct wl_resource; + +namespace exo { + +class Display; + +namespace wayland { + +namespace { +class WaylandDmabufFeedback; +class WaylandDmabufFeedbackTranche; +class WaylandDmabufSurfaceFeedback; +} // namespace + +using DrmFormatsAndModifiers = + base::flat_map<uint32_t, base::flat_map<size_t, uint64_t>>; + +class WaylandDmabufFeedbackManager { + public: + explicit WaylandDmabufFeedbackManager(Display* display); + + WaylandDmabufFeedbackManager(const WaylandDmabufFeedbackManager&) = delete; + WaylandDmabufFeedbackManager& operator=(const WaylandDmabufFeedbackManager&) = + delete; + + ~WaylandDmabufFeedbackManager(); + + Display* GetDisplay() { return display_; } + uint32_t GetVersionSupportedByPlatform() const { return version_; } + + bool IsFormatSupported(uint32_t format) const; + void SendFormatsAndModifiers(wl_resource* resource) const; + void GetDefaultFeedback(wl_client* client, + wl_resource* dma_buf_resource, + uint32_t feedback_id); + void GetSurfaceFeedback(wl_client* client, + wl_resource* dma_buf_resource, + uint32_t feedback_id, + wl_resource* surface_resource); + void RemoveSurfaceFeedback(Surface* surface); + + void AddSurfaceToScanoutCandidates(Surface* surface); + void RemoveSurfaceFromScanoutCandidates(Surface* surface); + + private: + void SendFeedback(WaylandDmabufFeedback* feedback, wl_resource* resource); + void SendTranche(const WaylandDmabufFeedbackTranche* tranche, + wl_resource* resource); + + Display* const display_; + uint32_t version_; + DrmFormatsAndModifiers drm_formats_and_modifiers_; + std::unique_ptr<base::ReadOnlySharedMemoryRegion> shared_memory_region_; + std::unique_ptr<WaylandDmabufFeedback> default_feedback_; + base::flat_map<Surface*, std::unique_ptr<WaylandDmabufSurfaceFeedback>> + surface_feedbacks_; + std::set<Surface*> scanout_candidates_; +}; + +} // namespace wayland +} // namespace exo + +#endif // COMPONENTS_EXO_WAYLAND_WAYLAND_DMABUF_FEEDBACK_MANAGER_H_
diff --git a/components/exo/wayland/zcr_color_manager.cc b/components/exo/wayland/zcr_color_manager.cc index dd49e17..35aeb67e0 100644 --- a/components/exo/wayland/zcr_color_manager.cc +++ b/components/exo/wayland/zcr_color_manager.cc
@@ -60,7 +60,6 @@ virtual ~ColorManagerColorSpace() = default; - wl_resource* output_resource; const gfx::ColorSpace color_space; const zcr_color_manager_v1_eotf_names eotf; const SkColorSpacePrimaries primaries; @@ -78,8 +77,6 @@ static_cast<int>(FLOAT_TO_PARAM(primaries.fWX)), static_cast<int>(FLOAT_TO_PARAM(primaries.fWY))); zcr_color_space_v1_send_done(color_space_resource); - if (output_resource) - wl_output_send_done(output_resource); } virtual void SendCustomColorSpaceInfo(wl_resource* color_space_resource) {} @@ -249,8 +246,6 @@ // create new zcr color space for the current color space of the output auto color_space = std::make_unique<ColorManagerColorSpace>( color_management_output_observer->GetColorSpace()); - color_space->output_resource = - color_management_output_observer->GetOutputResource(); wl_resource* color_space_resource = wl_resource_create(client, &zcr_color_space_v1_interface, 1, id);
diff --git a/components/exo/wayland/zwp_linux_dmabuf.cc b/components/exo/wayland/zwp_linux_dmabuf.cc index aa3973fe..49f48da 100644 --- a/components/exo/wayland/zwp_linux_dmabuf.cc +++ b/components/exo/wayland/zwp_linux_dmabuf.cc
@@ -12,7 +12,9 @@ #include "components/exo/buffer.h" #include "components/exo/display.h" #include "components/exo/wayland/server_util.h" +#include "components/exo/wayland/wayland_dmabuf_feedback_manager.h" #include "ui/gfx/buffer_format_util.h" +#include "ui/gfx/linux/drm_util_linux.h" namespace exo { namespace wayland { @@ -35,20 +37,6 @@ //////////////////////////////////////////////////////////////////////////////// // linux_buffer_params_interface: -const struct dmabuf_supported_format { - uint32_t dmabuf_format; - gfx::BufferFormat buffer_format; -} kSupportedDmaBufFormats[] = { - {DRM_FORMAT_RGB565, gfx::BufferFormat::BGR_565}, - {DRM_FORMAT_XBGR8888, gfx::BufferFormat::RGBX_8888}, - {DRM_FORMAT_ABGR8888, gfx::BufferFormat::RGBA_8888}, - {DRM_FORMAT_XRGB8888, gfx::BufferFormat::BGRX_8888}, - {DRM_FORMAT_ARGB8888, gfx::BufferFormat::BGRA_8888}, - {DRM_FORMAT_NV12, gfx::BufferFormat::YUV_420_BIPLANAR}, - {DRM_FORMAT_YVU420, gfx::BufferFormat::YVU_420}, - {DRM_FORMAT_ABGR2101010, gfx::BufferFormat::RGBA_1010102}, - {DRM_FORMAT_ARGB2101010, gfx::BufferFormat::BGRA_1010102}}; - struct LinuxBufferParams { struct Plane { base::ScopedFD fd; @@ -57,9 +45,10 @@ uint64_t modifier; }; - explicit LinuxBufferParams(Display* display) : display(display) {} + explicit LinuxBufferParams(WaylandDmabufFeedbackManager* feedback_manager) + : feedback_manager(feedback_manager) {} - Display* const display; + WaylandDmabufFeedbackManager* const feedback_manager; std::map<uint32_t, Plane> planes; }; @@ -151,26 +140,22 @@ int32_t height, uint32_t format, uint32_t flags) { - const auto* supported_format = std::find_if( - std::begin(kSupportedDmaBufFormats), std::end(kSupportedDmaBufFormats), - [format](const dmabuf_supported_format& supported_format) { - return supported_format.dmabuf_format == format; - }); - if (supported_format == std::end(kSupportedDmaBufFormats)) { + LinuxBufferParams* linux_buffer_params = + GetUserDataAs<LinuxBufferParams>(resource); + + if (!linux_buffer_params->feedback_manager->IsFormatSupported(format)) { wl_resource_post_error(resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_FORMAT, "format not supported"); return nullptr; } - if (!ValidateLinuxBufferParams(resource, width, height, - supported_format->buffer_format, flags)) { + gfx::BufferFormat buffer_format = ui::GetBufferFormatFromFourCCFormat(format); + if (!ValidateLinuxBufferParams(resource, width, height, buffer_format, + flags)) { return nullptr; } - LinuxBufferParams* linux_buffer_params = - GetUserDataAs<LinuxBufferParams>(resource); - gfx::NativePixmapHandle handle; // A lot of clients (arc++, arcvm, sommelier etc) pass 0 @@ -197,9 +182,9 @@ bool y_invert = (flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT) != 0; std::unique_ptr<Buffer> buffer = - linux_buffer_params->display->CreateLinuxDMABufBuffer( - gfx::Size(width, height), supported_format->buffer_format, - std::move(handle), y_invert); + linux_buffer_params->feedback_manager->GetDisplay() + ->CreateLinuxDMABufBuffer(gfx::Size(width, height), buffer_format, + std::move(handle), y_invert); if (!buffer) { zwp_linux_buffer_params_v1_send_failed(resource); return nullptr; @@ -254,8 +239,11 @@ void linux_dmabuf_create_params(wl_client* client, wl_resource* resource, uint32_t id) { + WaylandDmabufFeedbackManager* feedback_manager = + GetUserDataAs<WaylandDmabufFeedbackManager>(resource); + std::unique_ptr<LinuxBufferParams> linux_buffer_params = - std::make_unique<LinuxBufferParams>(GetUserDataAs<Display>(resource)); + std::make_unique<LinuxBufferParams>(feedback_manager); wl_resource* linux_buffer_params_resource = wl_resource_create(client, &zwp_linux_buffer_params_v1_interface, @@ -266,8 +254,34 @@ std::move(linux_buffer_params)); } +void linux_dmabuf_get_default_feedback(wl_client* client, + wl_resource* dma_buf_resource, + uint32_t feedback_id) { + WaylandDmabufFeedbackManager* feedback_manager = + static_cast<WaylandDmabufFeedbackManager*>( + wl_resource_get_user_data(dma_buf_resource)); + + feedback_manager->GetDefaultFeedback(client, dma_buf_resource, feedback_id); +} + +void linux_dmabuf_get_surface_feedback(wl_client* client, + wl_resource* dma_buf_resource, + uint32_t feedback_id, + wl_resource* surface_resource) { + WaylandDmabufFeedbackManager* feedback_manager = + static_cast<WaylandDmabufFeedbackManager*>( + wl_resource_get_user_data(dma_buf_resource)); + + feedback_manager->GetSurfaceFeedback(client, dma_buf_resource, feedback_id, + surface_resource); +} + const struct zwp_linux_dmabuf_v1_interface linux_dmabuf_implementation = { - linux_dmabuf_destroy, linux_dmabuf_create_params}; + linux_dmabuf_destroy, + linux_dmabuf_create_params, + linux_dmabuf_get_default_feedback, + linux_dmabuf_get_surface_feedback, +}; } // namespace @@ -275,15 +289,20 @@ void* data, uint32_t version, uint32_t id) { - wl_resource* resource = - wl_resource_create(client, &zwp_linux_dmabuf_v1_interface, - std::min(version, kZwpLinuxDmabufVersion), id); + WaylandDmabufFeedbackManager* feedback_manager = + static_cast<WaylandDmabufFeedbackManager*>(data); - wl_resource_set_implementation(resource, &linux_dmabuf_implementation, data, - nullptr); + wl_resource* resource = wl_resource_create( + client, &zwp_linux_dmabuf_v1_interface, + std::min(version, feedback_manager->GetVersionSupportedByPlatform()), id); - for (const auto& supported_format : kSupportedDmaBufFormats) - zwp_linux_dmabuf_v1_send_format(resource, supported_format.dmabuf_format); + wl_resource_set_implementation(resource, &linux_dmabuf_implementation, + feedback_manager, nullptr); + + if (wl_resource_get_version(resource) < + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) { + feedback_manager->SendFormatsAndModifiers(resource); + } } } // namespace wayland
diff --git a/components/exo/wayland/zwp_linux_dmabuf.h b/components/exo/wayland/zwp_linux_dmabuf.h index ab1160f..cd8d3b14 100644 --- a/components/exo/wayland/zwp_linux_dmabuf.h +++ b/components/exo/wayland/zwp_linux_dmabuf.h
@@ -12,8 +12,6 @@ namespace exo { namespace wayland { -constexpr uint32_t kZwpLinuxDmabufVersion = 2; - void bind_linux_dmabuf(wl_client* client, void* data, uint32_t version,
diff --git a/components/history_clusters_strings.grdp b/components/history_clusters_strings.grdp index 2906d7c..da908f4a 100644 --- a/components/history_clusters_strings.grdp +++ b/components/history_clusters_strings.grdp
@@ -30,6 +30,9 @@ <message name="IDS_HISTORY_CLUSTERS_LOAD_MORE_BUTTON_LABEL" desc="A label for the button that loads more history clusters at the bottom of the history clusters list."> Load more </message> + <message name="IDS_HISTORY_CLUSTERS_NO_RESULTS" desc="Text shown when no history cluster entries are found."> + No results + </message> <message name="IDS_HISTORY_CLUSTERS_NO_SEARCH_RESULTS" desc="Text used to denote that there are no search results for a search term in history clusters."> No search results </message>
diff --git a/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_NO_RESULTS.png.sha1 b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_NO_RESULTS.png.sha1 new file mode 100644 index 0000000..cfcc2fb --- /dev/null +++ b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_NO_RESULTS.png.sha1
@@ -0,0 +1 @@ +bc0c891bf4bc24af8c3be5d9a65b125ac8e04d3f \ No newline at end of file
diff --git a/components/live_caption/live_caption_controller.h b/components/live_caption/live_caption_controller.h index a596011..49439b7 100644 --- a/components/live_caption/live_caption_controller.h +++ b/components/live_caption/live_caption_controller.h
@@ -23,10 +23,6 @@ class BrowserContext; } -namespace ui { -class NativeTheme; -} - namespace user_prefs { class PrefRegistrySyncable; } @@ -99,7 +95,6 @@ speech::SodaInstaller::ErrorCode error_code) override; // ui::NativeThemeObserver: - void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override {} void OnCaptionStyleUpdated() override; void OnLiveCaptionEnabledChanged();
diff --git a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc index a19652f..d424bc9 100644 --- a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc +++ b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
@@ -18,6 +18,7 @@ #include "base/memory/raw_ptr.h" #include "base/observer_list.h" #include "base/strings/string_util.h" +#include "base/values.h" #include "build/build_config.h" #include "components/media_router/browser/media_router.h" #include "components/media_router/browser/media_router_dialog_controller.h" @@ -714,11 +715,10 @@ #if !BUILDFLAG(IS_ANDROID) bool PresentationServiceDelegateImpl::ShouldCancelAutoJoinForOrigin( const url::Origin& origin) { - const base::Value* origins = + const base::Value::List& origins = user_prefs::UserPrefs::Get(GetWebContents().GetBrowserContext()) - ->GetList(prefs::kMediaRouterTabMirroringSources); - return origins && base::Contains(origins->GetListDeprecated(), - base::Value(origin.Serialize())); + ->GetValueList(prefs::kMediaRouterTabMirroringSources); + return base::Contains(origins, base::Value(origin.Serialize())); } #endif // !BUILDFLAG(IS_ANDROID)
diff --git a/components/omnibox/browser/actions/history_clusters_action.cc b/components/omnibox/browser/actions/history_clusters_action.cc index e29827b2..7edfd7e 100644 --- a/components/omnibox/browser/actions/history_clusters_action.cc +++ b/components/omnibox/browser/actions/history_clusters_action.cc
@@ -17,6 +17,7 @@ #include "components/history_clusters/core/history_clusters_util.h" #include "components/omnibox/browser/actions/omnibox_action.h" #include "components/omnibox/browser/actions/omnibox_action_concepts.h" +#include "components/omnibox/browser/autocomplete_match.h" #include "components/omnibox/browser/autocomplete_result.h" #include "components/optimization_guide/core/entity_metadata.h" #include "components/prefs/pref_service.h" @@ -37,20 +38,6 @@ namespace { -// Find the top relevance of either search or navigation matches. Returns 0 if -// there are no search or navigation matches. -int TopRelevance(const AutocompleteResult& result, bool search) { - DCHECK(!result.empty()); - return base::ranges::max_element( - result, {}, - [&](const auto& match) { - return AutocompleteMatch::IsSearchType(match.type) == search - ? match.relevance - : 0; - }) - ->relevance; -} - // A template function for recording enum metrics for shown and used journey // chips as well as their CTR metrics. template <class EnumT> @@ -79,6 +66,30 @@ } // namespace +int TopRelevance(std::vector<AutocompleteMatch>::const_iterator matches_begin, + std::vector<AutocompleteMatch>::const_iterator matches_end, + TopRelevanceFilter filter) { + if (matches_begin == matches_end) + return 0; + std::vector<int> relevances(matches_end - matches_begin); + base::ranges::transform( + matches_begin, matches_end, relevances.begin(), [&](const auto& match) { + return AutocompleteMatch::IsSearchType(match.type) == + (filter == TopRelevanceFilter::FILTER_FOR_SEARCH_MATCHES) + ? match.relevance + : 0; + }); + return base::ranges::max(relevances); +} + +bool IsNavigationIntent(int top_search_relevance, + int top_navigation_relevance) { + DCHECK(!GetConfig().omnibox_action_on_navigation_intents); + return top_navigation_relevance > top_search_relevance && + top_navigation_relevance > + GetConfig().omnibox_action_navigation_intent_score_threshold; +} + HistoryClustersAction::HistoryClustersAction( const std::string& query, const history::ClusterKeywordData& matched_keyword_data) @@ -205,14 +216,13 @@ // If there's a reasonably clear navigation intent, don't distract the user // with the actions chip. - if (!GetConfig().omnibox_action_on_navigation_intents) { - int top_search_relevance = TopRelevance(result, true); - int top_navigation_relevance = TopRelevance(result, false); - if (top_navigation_relevance > top_search_relevance && - top_navigation_relevance > - GetConfig().omnibox_action_navigation_intent_score_threshold) { - return; - } + if (!GetConfig().omnibox_action_on_navigation_intents && + IsNavigationIntent( + TopRelevance(result.begin(), result.end(), + TopRelevanceFilter::FILTER_FOR_SEARCH_MATCHES), + TopRelevance(result.begin(), result.end(), + TopRelevanceFilter::FILTER_FOR_NON_SEARCH_MATCHES))) { + return; } for (auto& match : result) {
diff --git a/components/omnibox/browser/actions/history_clusters_action.h b/components/omnibox/browser/actions/history_clusters_action.h index 7689c945..bcc2133 100644 --- a/components/omnibox/browser/actions/history_clusters_action.h +++ b/components/omnibox/browser/actions/history_clusters_action.h
@@ -9,6 +9,7 @@ #include "components/history/core/browser/history_types.h" #include "components/omnibox/browser/actions/omnibox_action.h" +struct AutocompleteMatch; class AutocompleteResult; class PrefService; @@ -20,6 +21,23 @@ class HistoryClustersService; +// Helper for `TopRelevance()` to look at a subset of matches. +enum class TopRelevanceFilter : int { + FILTER_FOR_SEARCH_MATCHES, + FILTER_FOR_NON_SEARCH_MATCHES +}; + +// Find the top relevance of either search or navigation matches. Returns 0 if +// there are no search or navigation matches. +int TopRelevance(std::vector<AutocompleteMatch>::const_iterator matches_begin, + std::vector<AutocompleteMatch>::const_iterator matches_end, + TopRelevanceFilter filter); + +// Return if the history cluster action or suggestion should be excluded due to +// matches indicating a nav-intent input. Should only be called if +// `omnibox_action_on_navigation_intents` is false to avoid extra computations. +bool IsNavigationIntent(int top_search_relevance, int top_navigation_relevance); + // Made public for testing. class HistoryClustersAction : public OmniboxAction { public:
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index cfedc49..4f2b56c 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -480,9 +480,11 @@ if (provider_types & AutocompleteProvider::TYPE_HISTORY_CLUSTER_PROVIDER && history_clusters::IsApplicationLocaleSupportedByJourneys( provider_client_->GetApplicationLocale()) && - search_provider_ != nullptr) { - providers_.push_back(new HistoryClusterProvider(provider_client_.get(), - this, search_provider_)); + search_provider_ != nullptr && history_url_provider_ != nullptr && + history_quick_provider_ != nullptr) { + providers_.push_back(new HistoryClusterProvider( + provider_client_.get(), this, search_provider_, history_url_provider_, + history_quick_provider_)); } #endif
diff --git a/components/omnibox/browser/fake_autocomplete_provider.h b/components/omnibox/browser/fake_autocomplete_provider.h index d1679a4a..134e077e 100644 --- a/components/omnibox/browser/fake_autocomplete_provider.h +++ b/components/omnibox/browser/fake_autocomplete_provider.h
@@ -20,6 +20,7 @@ void SetType(Type type) { type_ = type; } using AutocompleteProvider::done_; + using AutocompleteProvider::matches_; private: ~FakeAutocompleteProvider() override = default;
diff --git a/components/omnibox/browser/history_cluster_provider.cc b/components/omnibox/browser/history_cluster_provider.cc index 8b79f85..bf64a940 100644 --- a/components/omnibox/browser/history_cluster_provider.cc +++ b/components/omnibox/browser/history_cluster_provider.cc
@@ -8,25 +8,34 @@ #include "base/strings/utf_string_conversions.h" #include "components/history_clusters/core/config.h" #include "components/history_clusters/core/history_clusters_service.h" +#include "components/omnibox/browser/actions/history_clusters_action.h" #include "components/omnibox/browser/autocomplete_controller.h" #include "components/omnibox/browser/autocomplete_match.h" #include "components/omnibox/browser/autocomplete_match_classification.h" #include "components/omnibox/browser/autocomplete_match_type.h" +#include "components/omnibox/browser/autocomplete_provider.h" #include "components/omnibox/browser/autocomplete_provider_client.h" #include "components/omnibox/browser/autocomplete_provider_listener.h" -#include "components/omnibox/browser/search_provider.h" #include "components/omnibox/browser/suggestion_group.h" HistoryClusterProvider::HistoryClusterProvider( AutocompleteProviderClient* client, AutocompleteProviderListener* listener, - SearchProvider* search_provider) + AutocompleteProvider* search_provider, + AutocompleteProvider* history_url_provider, + AutocompleteProvider* history_quick_provider) : AutocompleteProvider(AutocompleteProvider::TYPE_HISTORY_CLUSTER_PROVIDER), client_(client), - search_provider_(search_provider) { + search_provider_(search_provider), + history_url_provider_(history_url_provider), + history_quick_provider_(history_quick_provider) { DCHECK(search_provider_); + DCHECK(history_url_provider_); + DCHECK(history_quick_provider_); AddListener(listener); search_provider_->AddListener(this); + history_url_provider_->AddListener(this); + history_quick_provider_->AddListener(this); } void HistoryClusterProvider::Start(const AutocompleteInput& input, @@ -47,21 +56,52 @@ done_ = false; input_ = input; - if (search_provider_->done()) + if (AllProvidersDone()) CreateMatches(); } void HistoryClusterProvider::OnProviderUpdate( bool updated_matches, const AutocompleteProvider* provider) { - if (done_ || !search_provider_->done()) + if (done_ || !AllProvidersDone()) return; NotifyListeners(CreateMatches()); } +bool HistoryClusterProvider::AllProvidersDone() { + return search_provider_->done() && history_url_provider_->done() && + history_quick_provider_->done(); +} + bool HistoryClusterProvider::CreateMatches() { done_ = true; + // If there's a reasonably clear navigation intent, don't distract the user + // with a history cluster suggestion. + if (!history_clusters::GetConfig().omnibox_action_on_navigation_intents) { + // Helper to get the top relevance score looking at both providers. + const auto top_relevance = + [&](history_clusters::TopRelevanceFilter filter) { + return std::max( + {history_clusters::TopRelevance( + search_provider_->matches().begin(), + search_provider_->matches().end(), filter), + history_clusters::TopRelevance( + history_url_provider_->matches().begin(), + history_url_provider_->matches().end(), filter), + history_clusters::TopRelevance( + history_quick_provider_->matches().begin(), + history_quick_provider_->matches().end(), filter)}); + }; + if (history_clusters::IsNavigationIntent( + top_relevance(history_clusters::TopRelevanceFilter:: + FILTER_FOR_SEARCH_MATCHES), + top_relevance(history_clusters::TopRelevanceFilter:: + FILTER_FOR_NON_SEARCH_MATCHES))) { + return false; + } + } + // Iterate search matches in their current order. This is usually highest to // lowest relevance with an exception for search-what-you-typed search // suggestions being ordered before others.
diff --git a/components/omnibox/browser/history_cluster_provider.h b/components/omnibox/browser/history_cluster_provider.h index 0d318aa..a8de42ab 100644 --- a/components/omnibox/browser/history_cluster_provider.h +++ b/components/omnibox/browser/history_cluster_provider.h
@@ -9,8 +9,8 @@ #include "components/omnibox/browser/autocomplete_provider.h" #include "components/omnibox/browser/autocomplete_provider_listener.h" +class AutocompleteProvider; class AutocompleteProviderClient; -class SearchProvider; // `HistoryClusterProvider` adds suggestions to the history journey page if // any `SearchProvider` suggestions matched a cluster keyword. Inherits @@ -24,7 +24,9 @@ public: HistoryClusterProvider(AutocompleteProviderClient* client, AutocompleteProviderListener* listener, - SearchProvider* search_provider); + AutocompleteProvider* search_provider, + AutocompleteProvider* history_url_provider, + AutocompleteProvider* history_quick_provider); // AutocompleteProvider: void Start(const AutocompleteInput& input, bool minimal_changes) override; @@ -37,6 +39,10 @@ private: ~HistoryClusterProvider() override = default; + // Check if `search_provider_`, `history_url_provider_`, and + // `history_quick_provider_` are all done. + bool AllProvidersDone(); + // Iterates `search_provider_->matches()` and check if any can be used to // create a history cluster match. Returns whether any matches were created. bool CreateMatches(); @@ -47,9 +53,14 @@ // The `AutocompleteInput` passed to `Start()`. AutocompleteInput input_; - // These are never null. + // These are never null. The providers are used to detect nav intent for which + // no matches will be provided. Other providers can also provide search and + // navigations suggestion, but these are the dominant sources, both in volume + // and high scores (which is what nav intent considers). const raw_ptr<AutocompleteProviderClient> client_; - const raw_ptr<SearchProvider> search_provider_; + const raw_ptr<AutocompleteProvider> search_provider_; + const raw_ptr<AutocompleteProvider> history_url_provider_; + const raw_ptr<AutocompleteProvider> history_quick_provider_; }; #endif // COMPONENTS_OMNIBOX_BROWSER_HISTORY_CLUSTER_PROVIDER_H_
diff --git a/components/omnibox/browser/history_cluster_provider_unittest.cc b/components/omnibox/browser/history_cluster_provider_unittest.cc index 6226320..8e3bfc92b 100644 --- a/components/omnibox/browser/history_cluster_provider_unittest.cc +++ b/components/omnibox/browser/history_cluster_provider_unittest.cc
@@ -17,6 +17,7 @@ #include "components/omnibox/browser/autocomplete_match.h" #include "components/omnibox/browser/autocomplete_provider.h" #include "components/omnibox/browser/autocomplete_provider_listener.h" +#include "components/omnibox/browser/fake_autocomplete_provider.h" #include "components/omnibox/browser/fake_autocomplete_provider_client.h" #include "components/omnibox/browser/search_provider.h" #include "components/prefs/pref_registry_simple.h" @@ -24,22 +25,14 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -class FakeSearchProvider : public SearchProvider { - public: - explicit FakeSearchProvider(AutocompleteProviderClient* client, - AutocompleteProviderListener* listener) - : SearchProvider(client, listener) {} - - using SearchProvider::done_; - using SearchProvider::matches_; - - private: - ~FakeSearchProvider() override = default; -}; - -AutocompleteMatch CreateMatch(std::u16string contents) { +AutocompleteMatch CreateMatch(std::u16string contents, + bool is_search = true, + int relevance = 100) { AutocompleteMatch match; match.contents = contents; + match.type = is_search ? AutocompleteMatchType::SEARCH_SUGGEST + : AutocompleteMatchType::HISTORY_URL; + match.relevance = relevance; return match; } @@ -79,9 +72,14 @@ ->RegisterBooleanPref(history_clusters::prefs::kVisible, true); search_provider_ = - new FakeSearchProvider(autocomplete_provider_client_.get(), this); - provider_ = new HistoryClusterProvider(autocomplete_provider_client_.get(), - this, search_provider_.get()); + new FakeAutocompleteProvider(AutocompleteProvider::Type::TYPE_SEARCH); + history_url_provider_ = new FakeAutocompleteProvider( + AutocompleteProvider::Type::TYPE_HISTORY_URL); + history_quick_provider_ = new FakeAutocompleteProvider( + AutocompleteProvider::Type::TYPE_HISTORY_QUICK); + provider_ = new HistoryClusterProvider( + autocomplete_provider_client_.get(), this, search_provider_.get(), + history_url_provider_.get(), history_quick_provider_.get()); }; ~HistoryClustersProviderTest() override { @@ -109,7 +107,9 @@ std::unique_ptr<FakeAutocompleteProviderClient> autocomplete_provider_client_; - scoped_refptr<FakeSearchProvider> search_provider_; + scoped_refptr<FakeAutocompleteProvider> search_provider_; + scoped_refptr<FakeAutocompleteProvider> history_url_provider_; + scoped_refptr<FakeAutocompleteProvider> history_quick_provider_; scoped_refptr<HistoryClusterProvider> provider_; std::unique_ptr<history_clusters::HistoryClustersServiceTestApi> @@ -169,7 +169,7 @@ provider_->Start(input, false); EXPECT_FALSE(provider_->done()); - // Calling `Start()` or `OnProviderUpdate()` should process search matches + // Calling `Start()` or `OnProviderUpdate()` should not process search matches // if the search provider is not done when called. search_provider_->matches_ = {CreateMatch(u"keyword")}; provider_->Start(input, false); @@ -311,3 +311,83 @@ // completes syncly, even if it has matches. EXPECT_TRUE(on_provider_update_calls_.empty()); } + +TEST_F(HistoryClustersProviderTest, NavIntent_TopAndHighScoringNav) { + // When there is a nav suggest that is both high scoring (>1300) and top + // scoring, don't provide history cluster suggestions. + AutocompleteInput input; + input.set_omit_asynchronous_matches(false); + + search_provider_->done_ = false; + history_url_provider_->done_ = false; + provider_->Start(input, false); + + // Simulate history URL provider completing. + history_url_provider_->matches_ = {CreateMatch(u"history", false, 1500)}; + history_url_provider_->done_ = true; + provider_->OnProviderUpdate(true, nullptr); + EXPECT_FALSE(provider_->done()); + + // Simulate search provider completing. + search_provider_->matches_ = {CreateMatch(u"keyword", true, 1499)}; + search_provider_->done_ = true; + provider_->OnProviderUpdate(true, nullptr); + + EXPECT_TRUE(provider_->done()); + EXPECT_TRUE(provider_->matches().empty()); + EXPECT_THAT(on_provider_update_calls_, testing::ElementsAre(false)); +} + +TEST_F(HistoryClustersProviderTest, SearchIntent_TopScoringNav) { + // When there is a nav suggest that is top scoring but not high scoring + // (>1300), provide history cluster suggestions. + + AutocompleteInput input; + input.set_omit_asynchronous_matches(false); + + search_provider_->done_ = false; + history_url_provider_->done_ = false; + provider_->Start(input, false); + + // Simulate history URL provider completing. + history_url_provider_->matches_ = {CreateMatch(u"history", false, 1200)}; + history_url_provider_->done_ = true; + provider_->OnProviderUpdate(true, nullptr); + EXPECT_FALSE(provider_->done()); + + // Simulate search provider completing. + search_provider_->matches_ = {CreateMatch(u"keyword", true, 100)}; + search_provider_->done_ = true; + provider_->OnProviderUpdate(true, nullptr); + + EXPECT_TRUE(provider_->done()); + ASSERT_EQ(provider_->matches().size(), 1u); + EXPECT_THAT(on_provider_update_calls_, testing::ElementsAre(true)); +} + +TEST_F(HistoryClustersProviderTest, SearchIntent_HighScoringNav) { + // When there is a nav suggest that is high scoring (>1300) but not top + // scoring, provide history cluster suggestions. + + AutocompleteInput input; + input.set_omit_asynchronous_matches(false); + + search_provider_->done_ = false; + history_quick_provider_->done_ = false; + provider_->Start(input, false); + + // Simulate history URL provider completing. + history_quick_provider_->matches_ = {CreateMatch(u"history", false, 1500)}; + history_quick_provider_->done_ = true; + provider_->OnProviderUpdate(true, nullptr); + EXPECT_FALSE(provider_->done()); + + // Simulate search provider completing. + search_provider_->matches_ = {CreateMatch(u"keyword", true, 1501)}; + search_provider_->done_ = true; + provider_->OnProviderUpdate(true, nullptr); + + EXPECT_TRUE(provider_->done()); + ASSERT_EQ(provider_->matches().size(), 1u); + EXPECT_THAT(on_provider_update_calls_, testing::ElementsAre(true)); +}
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn index cc0d2c8..a5c563ed 100644 --- a/components/optimization_guide/core/BUILD.gn +++ b/components/optimization_guide/core/BUILD.gn
@@ -272,6 +272,7 @@ "//components/crx_file", "//components/download/public/background_service:public", "//components/optimization_guide/core", + "//components/optimization_guide/optimization_guide_internals/webui:mojo_bindings", "//components/optimization_guide/proto:optimization_guide_proto", "//components/prefs", "//components/services/unzip/public/cpp",
diff --git a/components/optimization_guide/core/prediction_manager.cc b/components/optimization_guide/core/prediction_manager.cc index 507a6da..80b7be9 100644 --- a/components/optimization_guide/core/prediction_manager.cc +++ b/components/optimization_guide/core/prediction_manager.cc
@@ -6,6 +6,7 @@ #include <memory> #include <utility> +#include <vector> #include "base/callback.h" #include "base/containers/flat_map.h" @@ -39,6 +40,7 @@ #include "components/optimization_guide/core/prediction_model_fetcher_impl.h" #include "components/optimization_guide/core/prediction_model_override.h" #include "components/optimization_guide/core/store_update_data.h" +#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom.h" #include "components/optimization_guide/proto/models.pb.h" #include "components/prefs/pref_service.h" #include "mojo/public/cpp/bindings/remote.h" @@ -594,6 +596,24 @@ ModelDeliveryEvent::kModelDownloadFailure); } +std::vector<optimization_guide_internals::mojom::DownloadedModelInfoPtr> +PredictionManager::GetDownloadedModelsInfoForWebUI() const { + std::vector<optimization_guide_internals::mojom::DownloadedModelInfoPtr> + downloaded_models_info; + downloaded_models_info.reserve(optimization_target_model_info_map_.size()); + for (const auto& it : optimization_target_model_info_map_) { + const std::string& optimization_target_name = + optimization_guide::proto::OptimizationTarget_Name(it.first); + const optimization_guide::ModelInfo* const model_info = it.second.get(); + auto downloaded_model_info_ptr = + optimization_guide_internals::mojom::DownloadedModelInfo::New( + optimization_target_name, model_info->GetVersion(), + model_info->GetModelFilePath().AsUTF8Unsafe()); + downloaded_models_info.push_back(std::move(downloaded_model_info_ptr)); + } + return downloaded_models_info; +} + void PredictionManager::NotifyObserversOfNewModel( proto::OptimizationTarget optimization_target, const ModelInfo& model_info) {
diff --git a/components/optimization_guide/core/prediction_manager.h b/components/optimization_guide/core/prediction_manager.h index ea909f36..f2dded8 100644 --- a/components/optimization_guide/core/prediction_manager.h +++ b/components/optimization_guide/core/prediction_manager.h
@@ -23,6 +23,7 @@ #include "components/optimization_guide/core/model_enums.h" #include "components/optimization_guide/core/optimization_guide_enums.h" #include "components/optimization_guide/core/prediction_model_download_observer.h" +#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom.h" #include "components/optimization_guide/proto/models.pb.h" #include "url/origin.h" @@ -136,6 +137,9 @@ void OnModelDownloadFailed( proto::OptimizationTarget optimization_target) override; + std::vector<optimization_guide_internals::mojom::DownloadedModelInfoPtr> + GetDownloadedModelsInfoForWebUI() const; + protected: // Process |prediction_models| to be stored in the in memory optimization // target prediction model map for immediate use and asynchronously write the
diff --git a/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn b/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn index 4dda81d..5f8e7a1 100644 --- a/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn +++ b/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
@@ -73,6 +73,9 @@ deps = [ ":build_ts" ] manifest_files = filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ]) - input_files = [ "optimization_guide_internals.html" ] + input_files = [ + "optimization_guide_internals.html", + "optimization_guide_internals.css", + ] input_files_base_dir = rebase_path(".", "//") }
diff --git a/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.css b/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.css new file mode 100644 index 0000000..2000ef4 --- /dev/null +++ b/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.css
@@ -0,0 +1,89 @@ +/* Copyright 2022 The Chromium Authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +body { + color: #333; +} + +h2 { + font-size: 110%; +} + +table { + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} + +th, +td { + border-color: #666; + border-style: solid; + border-width: 1px; + padding: 1px 4px; +} + +div[slot='panel'] { + padding-bottom: 10px; +} + +div[slot='panel']>div { + display: flex; +} + +div[slot='panel']>div>div { + flex: 1; +} + +.dump { + font-family: monospace; + white-space: pre-wrap; +} + +.event-logs-time { + width: 15%; +} + +.event-logs-log-source { + width: 15%; +} + +.event-logs-source-location { + text-overflow: ellipsis; + white-space: nowrap; + width: 20%; +} + +td.event-logs-source-location { + word-wrap: break-word; +} + +.event-logs-message { + width: 50%; +} + +td.event-logs-message { + word-wrap: break-word; +} + +.downloaded-models-optimization-target { + width: 25%; +} + +td.downloaded-models-optimization-target { + word-wrap: break-word; +} + +.downloaded-models-version { + width: 20%; +} + +.downloaded-models-file-path { + width: 55%; +} + +td.downloaded-models-file-path { + word-wrap: break-word; +} \ No newline at end of file
diff --git a/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.html b/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.html index ae0d4673..d6c70859 100644 --- a/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.html +++ b/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.html
@@ -1,33 +1,69 @@ <!doctype html> <html lang="en" dir="ltr"> +<!-- +Copyright 2022 The Chromium Authors. +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + <head> - <style> - .segment { - border: 1px outset black; - margin: 2px 2px 2px 2px; - } - </style> <meta charset="utf-8"> <title>Optimization Guide Internals</title> <meta name="viewport" content="width=device-width"> + <link rel="stylesheet" href="optimization_guide_internals.css"> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> </head> + <body> + <h1>Optimization Guide Internals - Debug Logs</h1> <div> Enable the <a href="chrome://flags/#optimization-guide-debug-logs">optimization guide debug flags</a> to record debug messages from the browser startup. </div> - <button id="log-messages-dump">Dump</button> - <table id="log-message-container"> - <thead> - <tr> - <th>Time</th> - <th>Logs source</th> - <th>Source Location</th> - <th>Log Message</th> - </tr> - </thead> - </table> - <script type="module" src="optimization_guide_internals.js"></script> + + <cr-tab-box hidden> + <div slot="tab">Event Logs</div> + <div slot="tab">Models</div> + + <div slot="panel" id="tabpanel-event-logs"> + <div> + <div> + <h2>Event Logs <button id="log-messages-dump">Dump</button></h2> + <table id="log-message-container"> + <thead> + <tr> + <th class="event-logs-time">Time</th> + <th class="event-logs-log-source">Log source</th> + <th class="event-logs-source-location">Source Location</th> + <th class="event-logs-message">Log Message</th> + </tr> + </thead> + <tbody></tbody> + </table> + </div> + </div> + </div> + + <div slot="panel" id="tabpanel-models"> + <div> + <div> + <h2>Models</h2> + Downloaded models: + <table id="downloaded-models-container"> + <thead> + <tr> + <th class="downloaded-models-optimization-target">Optimization target</th> + <th class="downloaded-models-version">Version</th> + <th class="downloaded-models-file-path">File path</th> + </tr> + </thead> + </table> + </div> + </div> + </div> + </cr-tab-box> + </body> + <script type="module" src="optimization_guide_internals.js"></script> + </html> \ No newline at end of file
diff --git a/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.ts b/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.ts index c6ee2fa..4d7ed892 100644 --- a/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.ts +++ b/components/optimization_guide/optimization_guide_internals/resources/optimization_guide_internals.ts
@@ -2,9 +2,12 @@ // 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_tab_box/cr_tab_box.js'; + import {$} from 'chrome://resources/js/util.m.js'; import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js'; +import {DownloadedModelInfo, PageHandlerFactory} from './optimization_guide_internals.mojom-webui.js'; import {OptimizationGuideInternalsBrowserProxy} from './optimization_guide_internals_browser_proxy.js'; // Contains all the log events received when the internals page is open. @@ -101,12 +104,63 @@ a.dispatchEvent(event); } +async function onModelsPageOpen() { + const downloadedModelsContainer = + $('downloaded-models-container') as HTMLTableElement; + try { + const response: {downloadedModelsInfo: DownloadedModelInfo[]} = + await PageHandlerFactory.getRemote().requestDownloadedModelsInfo(); + const downloadedModelsInfo = response.downloadedModelsInfo; + for (const {optimizationTarget, version, filePath} of + downloadedModelsInfo) { + const versionStr = version.toString(); + const existingModel = $(optimizationTarget) as HTMLTableRowElement; + if (existingModel) { + existingModel.querySelector('.downloaded-models-version')!.innerHTML = + versionStr; + existingModel.querySelector('.downloaded-models-file-path')!.innerHTML = + filePath; + } else { + const downloadedModel = downloadedModelsContainer.insertRow(); + downloadedModel.id = optimizationTarget; + appendTD( + downloadedModel, optimizationTarget, + 'downloaded-models-optimization-target'); + appendTD(downloadedModel, versionStr, 'downloaded-models-version'); + appendTD(downloadedModel, filePath, 'downloaded-models-file-path'); + } + } + } catch (err) { + throw new Error( + `Error resolving promise from requestDownloadedModelsInfo, ${err}`); + } +} + +/** + * Appends a new TD element to the specified |parent| element. + * + * @param {HTMLTableRowElement} parent The element to which a new TD element is + * appended. + * @param {string} innerHTML The inner HTML of the element. + * @param {string} className The class name of the element. + */ +function appendTD( + parent: HTMLTableRowElement, innerHTML: string, className: string) { + const td = parent.insertCell(); + td.innerHTML = innerHTML; + td.className = className; + parent.appendChild(td); +} + function getProxy(): OptimizationGuideInternalsBrowserProxy { return OptimizationGuideInternalsBrowserProxy.getInstance(); } function initialize() { + const tabbox = document.querySelector('cr-tab-box') as HTMLElement; + tabbox.hidden = false; + const logMessageContainer = $('log-message-container') as HTMLTableElement; $('log-messages-dump').addEventListener('click', onLogMessagesDump); @@ -123,14 +177,45 @@ sourceLocation, message, }); - if (logMessageContainer) { - const logmessage = logMessageContainer.insertRow(); - logmessage.insertCell().innerHTML = eventTimeStr; - logmessage.insertCell().innerHTML = logSourceStr; - logmessage.insertCell().innerHTML = sourceLocation; - logmessage.insertCell().innerHTML = message; - } + const logMessage = logMessageContainer.insertRow(); + appendTD(logMessage, eventTimeStr, 'event-logs-time'); + appendTD(logMessage, logSourceStr, 'event-logs-log-source'); + appendTD(logMessage, sourceLocation, 'event-logs-source-location'); + appendTD(logMessage, message, 'event-logs-message'); }); + + const tabpanelNodeList = document.querySelectorAll('div[slot=\'panel\']'); + const tabpanels = Array.prototype.slice.call(tabpanelNodeList, 0); + const tabpanelIds = tabpanels.map(function(tab) { + return tab.id; + }); + + tabbox.addEventListener('selected-index-change', e => { + const tabpanel = tabpanels[(e as CustomEvent).detail]; + const hash = tabpanel.id.match(/(?:^tabpanel-)(.+)/)[1]; + window.location.hash = hash; + }); + + const activateTabByHash = function() { + let hash = window.location.hash; + + // Remove the first character '#'. + hash = hash.substring(1); + + const id = 'tabpanel-' + hash; + const index = tabpanelIds.indexOf(id); + if (index === -1) { + return; + } + tabbox.setAttribute('selected-index', `${index}`); + + if (hash === 'models') { + onModelsPageOpen(); + } + }; + + window.onhashchange = activateTabByHash; + activateTabByHash(); } document.addEventListener('DOMContentLoaded', initialize); \ No newline at end of file
diff --git a/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn b/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn index 6b57726..ff64752 100644 --- a/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn +++ b/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn
@@ -2,29 +2,32 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/buildflag_header.gni") import("//mojo/public/tools/bindings/mojom.gni") static_library("webui") { sources = [ "optimization_guide_internals_page_handler_impl.cc", "optimization_guide_internals_page_handler_impl.h", - "optimization_guide_internals_ui.cc", - "optimization_guide_internals_ui.h", "url_constants.cc", "url_constants.h", ] deps = [ "//base", "//components/optimization_guide/core", - "//components/optimization_guide/core:core", "//components/optimization_guide/core:interfaces", - "//components/optimization_guide/optimization_guide_internals/resources:resources", - "//components/optimization_guide/optimization_guide_internals/webui:mojo_bindings", "//third_party/abseil-cpp:absl", "//ui/base", - "//ui/webui", + ] + if (!is_ios) { + deps += [ "//ui/webui" ] + } + public_deps = [ + ":mojo_bindings", + "//components/optimization_guide/optimization_guide_internals/resources:resources", ] } + mojom("mojo_bindings") { sources = [ "optimization_guide_internals.mojom" ] webui_module_path = "/"
diff --git a/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom b/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom index 55d89e9..dded94ae 100644 --- a/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom +++ b/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals.mojom
@@ -2,19 +2,36 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - module optimization_guide_internals.mojom; import "components/optimization_guide/core/optimization_guide_common.mojom"; import "mojo/public/mojom/base/time.mojom"; +// Information on downloaded models to be displayed on WebUI page, for debugging +// purposes. +struct DownloadedModelInfo { + // Serialization of OPTIMIZATION_TARGET enum in + // //components/optimization_guide/proto/models.proto, e.g., + // "OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD". + string optimization_target; + // Version of the OPTIMIZATION_TARGET model, reflection of ModelInfo's version + // field in //components/optimization_guide/proto/models.proo. + int64 version; + // TODO(crbug.com/1354861): Convert to mojo_base.mojo.FilePath type. + string file_path; +}; + // Used by the WebUI page to bootstrap bidirectional communication. interface PageHandlerFactory { // The WebUI calls this method when the page is first initialized. CreatePageHandler(pending_remote<Page> page); + // The WebUI calls this method when the models page is open, to retrieve + // information of downloaded models for debugging purposes. + RequestDownloadedModelsInfo() => + (array<DownloadedModelInfo> downloaded_models_info); }; -// Renderer-side handler for internal page to process the updates from +// Renderer-side handler for internals WebUI page to process the updates from // the OptimizationGuide service. interface Page { // Notifies the page of a log event from the OptimizationGuide service.
diff --git a/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.cc b/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.cc deleted file mode 100644 index 772216a..0000000 --- a/components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_ui.h" - -#include "components/grit/optimization_guide_internals_resources.h" -#include "components/grit/optimization_guide_internals_resources_map.h" -#include "components/optimization_guide/optimization_guide_internals/webui/optimization_guide_internals_page_handler_impl.h" - -OptimizationGuideInternalsUI::OptimizationGuideInternalsUI( - content::WebUI* web_ui, - OptimizationGuideLogger* optimization_guide_logger, - SetupWebUIDataSourceCallback set_up_data_source_callback) - : MojoWebUIController(web_ui, /*enable_chrome_send=*/true), - optimization_guide_logger_(optimization_guide_logger) { - std::move(set_up_data_source_callback) - .Run(base::make_span(kOptimizationGuideInternalsResources, - kOptimizationGuideInternalsResourcesSize), - IDR_OPTIMIZATION_GUIDE_INTERNALS_OPTIMIZATION_GUIDE_INTERNALS_HTML); -} - -OptimizationGuideInternalsUI::~OptimizationGuideInternalsUI() = default; - -void OptimizationGuideInternalsUI::BindInterface( - mojo::PendingReceiver< - optimization_guide_internals::mojom::PageHandlerFactory> receiver) { - // TODO(https://crbug.com/1297362): Remove the reset which is needed now since - // |this| is reused on internals page reloads. - optimization_guide_internals_page_factory_receiver_.reset(); - optimization_guide_internals_page_factory_receiver_.Bind(std::move(receiver)); -} - -void OptimizationGuideInternalsUI::CreatePageHandler( - mojo::PendingRemote<optimization_guide_internals::mojom::Page> page) { - optimization_guide_internals_page_handler_ = - std::make_unique<OptimizationGuideInternalsPageHandlerImpl>( - std::move(page), optimization_guide_logger_); -} - -WEB_UI_CONTROLLER_TYPE_IMPL(OptimizationGuideInternalsUI)
diff --git a/components/password_manager/core/browser/import/csv_password.cc b/components/password_manager/core/browser/import/csv_password.cc index f4bf05c1..30c21e6f 100644 --- a/components/password_manager/core/browser/import/csv_password.cc +++ b/components/password_manager/core/browser/import/csv_password.cc
@@ -32,12 +32,21 @@ } // namespace CSVPassword::CSVPassword() : status_(Status::kSemanticError) {} + CSVPassword::CSVPassword(GURL url, std::string username, std::string password) : url_(std::move(url)), username_(std::move(username)), password_(std::move(password)), status_(Status::kOK) {} +CSVPassword::CSVPassword(std::string invalid_url, + std::string username, + std::string password) + : url_(base::unexpected(std::move(invalid_url))), + username_(std::move(username)), + password_(std::move(password)), + status_(Status::kOK) {} + CSVPassword::CSVPassword(const ColumnMap& map, base::StringPiece row) { if (row.empty() || map.size() != kLabelCount) { status_ = Status::kSemanticError; @@ -58,9 +67,15 @@ if (meaning_it == map.end()) continue; switch (meaning_it->second) { - case Label::kOrigin: - url_ = GURL(field); + case Label::kOrigin: { + GURL gurl = GURL(field); + if (!gurl.is_valid() || !base::IsStringASCII(field)) { + url_ = base::unexpected(ConvertUTF8(field)); + } else { + url_ = gurl; + } break; + } case Label::kUsername: username_ = ConvertUTF8(field); break; @@ -75,6 +90,7 @@ CSVPassword::CSVPassword(CSVPassword&&) = default; CSVPassword& CSVPassword::operator=(const CSVPassword&) = default; CSVPassword& CSVPassword::operator=(CSVPassword&&) = default; +CSVPassword::~CSVPassword() = default; bool operator==(const CSVPassword& lhs, const CSVPassword& rhs) { return lhs.GetParseStatus() == rhs.GetParseStatus() && @@ -94,7 +110,7 @@ return username_; } -const GURL& CSVPassword::GetURL() const { +const base::expected<GURL, std::string>& CSVPassword::GetURL() const { return url_; }
diff --git a/components/password_manager/core/browser/import/csv_password.h b/components/password_manager/core/browser/import/csv_password.h index 0d42433..4c535e9b 100644 --- a/components/password_manager/core/browser/import/csv_password.h +++ b/components/password_manager/core/browser/import/csv_password.h
@@ -9,6 +9,8 @@ #include "base/containers/flat_map.h" #include "base/strings/string_piece.h" +#include "base/types/expected.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -17,6 +19,9 @@ // CSVPassword is a wrapper around one CSV line representing a credential. // For more details, see // https://docs.google.com/document/d/1wsZBl93S_WGaXZqrqq5SP08LVZ0zDKf6e9nlptyl9AY/edit?usp=sharing. +// CSVPassword contains a triple (url, password, username). +// In case of a valid URL, a GURL is provided, otherwise the original raw URL. +// Partial parsing i.e. missing fields will also yield a valid CSVPassword. class CSVPassword { public: enum class Label { kOrigin, kUsername, kPassword }; @@ -31,10 +36,16 @@ explicit CSVPassword(); explicit CSVPassword(const ColumnMap& map, base::StringPiece csv_row); explicit CSVPassword(GURL url, std::string username, std::string password); + // This constructor creates a valid CSVPassword but with an invalid_url, i.e. + // the url is not a valid GURL. + explicit CSVPassword(std::string invalid_url, + std::string username, + std::string password); CSVPassword(const CSVPassword&); CSVPassword(CSVPassword&&); CSVPassword& operator=(const CSVPassword&); CSVPassword& operator=(CSVPassword&&); + ~CSVPassword(); // Returns the status of the parse. Status GetParseStatus() const; @@ -45,11 +56,13 @@ // Returns the username. const std::string& GetUsername() const; - // Returns the URL. - const GURL& GetURL() const; + // Returns the URL or the original raw url in case of an invalid GURL. + const base::expected<GURL, std::string>& GetURL() const; private: - GURL url_; + // Contains a valid GURL or the original raw url in case of an invalid GURL. + // Unparsed URL fields should also yield an emty URL. + base::expected<GURL, std::string> url_ = base::unexpected(""); std::string username_; std::string password_;
diff --git a/components/password_manager/core/browser/import/csv_password_unittest.cc b/components/password_manager/core/browser/import/csv_password_unittest.cc index 1562d6d..d91d104 100644 --- a/components/password_manager/core/browser/import/csv_password_unittest.cc +++ b/components/password_manager/core/browser/import/csv_password_unittest.cc
@@ -28,8 +28,7 @@ }; // Use const to check that ParseValid does not mutate the CSVPassword. const CSVPassword csv_pwd(kColMap, "http://example.com,user,password"); - const GURL expected_origin("http://example.com"); - EXPECT_EQ(expected_origin, csv_pwd.GetURL()); + EXPECT_EQ(GURL("http://example.com"), csv_pwd.GetURL()); EXPECT_EQ("user", csv_pwd.GetUsername()); EXPECT_EQ("password", csv_pwd.GetPassword()); } @@ -108,9 +107,7 @@ const CSVPassword csv_pwd(test_case.map, test_case.csv); EXPECT_EQ(Status::kOK, csv_pwd.GetParseStatus()); - const GURL expected_origin(test_case.origin); - - EXPECT_EQ(expected_origin, csv_pwd.GetURL()); + EXPECT_EQ(GURL(test_case.origin), csv_pwd.GetURL()); EXPECT_EQ(test_case.username, csv_pwd.GetUsername()); EXPECT_EQ(test_case.password, csv_pwd.GetPassword()); }
diff --git a/components/password_manager/core/browser/import/password_importer.cc b/components/password_manager/core/browser/import/password_importer.cc index 6e66e00..c4d7e74d 100644 --- a/components/password_manager/core/browser/import/password_importer.cc +++ b/components/password_manager/core/browser/import/password_importer.cc
@@ -19,6 +19,7 @@ #include "components/sync/base/bind_to_task_runner.h" #include "third_party/abseil-cpp/absl/types/optional.h" +using password_manager::ImportEntry; namespace password_manager { namespace { @@ -50,18 +51,111 @@ return std::move(contents); } +ImportEntry::Status ToImportEntryStatus( + SavedPasswordsPresenter::AddResult add_result) { + switch (add_result) { + case SavedPasswordsPresenter::AddResult::kExistsInProfileStore: + return ImportEntry::Status::CONFLICT_PROFILE; + + case SavedPasswordsPresenter::AddResult::kExistsInAccountStore: + // We report a double collision for now as a collision in account store. + case SavedPasswordsPresenter::AddResult::kExistsInProfileAndAccountStore: + return ImportEntry::Status::CONFLICT_ACCOUNT; + + case SavedPasswordsPresenter::AddResult::kInvalid: + return ImportEntry::Status::UNKNOWN_ERROR; + + default: + NOTREACHED(); + } + + return ImportEntry::Status::UNKNOWN_ERROR; +} + +ImportEntry CreateFailedImportEntry( + SavedPasswordsPresenter::AddResult add_result, + const CredentialUIEntry& credential) { + DCHECK_NE(add_result, SavedPasswordsPresenter::AddResult::kSuccess); + ImportEntry result; + result.url = credential.url.possibly_invalid_spec(); + result.username = base::UTF16ToUTF8(credential.username); + result.status = ToImportEntryStatus(add_result); + return result; +} + +base::expected<password_manager::CredentialUIEntry, ImportEntry> +CSVPasswordToCredentialUIEntry(const CSVPassword& csv_password, + password_manager::PasswordForm::Store store) { + auto MakeError = [&](ImportEntry::Status status) { + ImportEntry entry; + entry.status = status; + if (csv_password.GetURL().has_value()) { + entry.url = csv_password.GetURL().value().spec(); + } else { + entry.url = csv_password.GetURL().error(); + } + + entry.username = csv_password.GetUsername(); + return base::unexpected(entry); + }; + + base::expected<GURL, std::string> url = csv_password.GetURL(); + + if (csv_password.GetPassword().empty()) + return MakeError(ImportEntry::Status::MISSING_PASSWORD); + + if (!url.has_value() && url.error().empty()) + return MakeError(ImportEntry::Status::MISSING_URL); + + if (url.has_value() && url.value().spec().length() > 2048) + return MakeError(ImportEntry::Status::LONG_URL); + + if (!url.has_value() && !base::IsStringASCII(url.error())) + return MakeError(ImportEntry::Status::NON_ASCII_URL); + + if (!url.has_value()) + return MakeError(ImportEntry::Status::INVALID_URL); + + if (csv_password.GetPassword().length() > 1000) + return MakeError(ImportEntry::Status::LONG_PASSWORD); + + if (csv_password.GetUsername().length() > 1000) + return MakeError(ImportEntry::Status::LONG_USERNAME); + + if (csv_password.GetParseStatus() != CSVPassword::Status::kOK) + return MakeError(ImportEntry::Status::UNKNOWN_ERROR); + + DCHECK(url.has_value()); + return password_manager::CredentialUIEntry(csv_password, store); +} + +// `credentials` is a copy of what was passed to the AddCredentials() method. +// It is hence a 1 to 1 correspondence between `credentials` and `add_results`. void AddCredentialsCallback( const base::Time& start_time, - const std::vector<SavedPasswordsPresenter::AddResult>& results) { - size_t success_count = base::ranges::count_if( - results, [](SavedPasswordsPresenter::AddResult result) { - return result == SavedPasswordsPresenter::AddResult::kSuccess; - }); + password_manager::ImportResults import_results, + const std::vector<CredentialUIEntry>& credentials, + password_manager::PasswordImporter::ImportResultsCallback + import_results_callback, + const std::vector<SavedPasswordsPresenter::AddResult>& add_results) { + import_results.number_imported = 0; + for (size_t i = 0; i < add_results.size(); i++) { + if (add_results[i] == SavedPasswordsPresenter::AddResult::kSuccess) + import_results.number_imported++; + else { + import_results.failed_imports.emplace_back( + CreateFailedImportEntry(add_results[i], credentials[i])); + } + } + UMA_HISTOGRAM_COUNTS_1M("PasswordManager.ImportedPasswordsPerUserInCSV", - success_count); + import_results.number_imported); base::UmaHistogramLongTimes("PasswordManager.ImportDuration", base::Time::Now() - start_time); + + import_results.status = password_manager::ImportResults::Status::SUCCESS; + std::move(import_results_callback).Run(std::move(import_results)); } } // namespace @@ -100,8 +194,6 @@ password_manager::PasswordForm::Store to_store, ImportResultsCallback results_callback) { results_callback_ = std::move(results_callback); - to_store_ = to_store; - selected_file_name_ = path.BaseName().AsUTF8Unsafe(); // Posting with USER_VISIBLE priority, because the result of the import is // visible to the user in the password settings page. @@ -111,18 +203,19 @@ base::BindOnce(&PasswordImporter::ParseCSVPasswordsInSandbox, weak_ptr_factory_.GetWeakPtr(), base::BindOnce(&PasswordImporter::ConsumePasswords, - weak_ptr_factory_.GetWeakPtr()))); + weak_ptr_factory_.GetWeakPtr(), + path.BaseName().AsUTF8Unsafe(), to_store))); } void PasswordImporter::ConsumePasswords( + std::string file_name, + password_manager::PasswordForm::Store store, password_manager::mojom::CSVPasswordSequencePtr seq) { password_manager::ImportResults results; - results.file_name = std::move(selected_file_name_); - + results.file_name = std::move(file_name); if (!seq) { - // TODO(crbug/1325290): Compute correct status. - results.status = password_manager::ImportResults::Status::IO_ERROR; - std::move(results_callback_).Run(results); + results.status = password_manager::ImportResults::Status::BAD_FORMAT; + std::move(results_callback_).Run(std::move(results)); return; } if (seq->csv_passwords.size() > MAX_PASSWORDS_PER_IMPORT) { @@ -133,28 +226,32 @@ return; } + // TODO(crbug/1325290): Either move to earlier point or update histogram. base::Time start_time = base::Time::Now(); - std::vector<password_manager::CredentialUIEntry> credentials; credentials.reserve(seq->csv_passwords.size()); - base::ranges::transform( - seq->csv_passwords, std::back_inserter(credentials), - [this](const password_manager::CSVPassword& csv_password) { - return password_manager::CredentialUIEntry(csv_password, to_store_); - }); + // Go over all canonically parsed passwords: + // 1) aggregate all valid ones in `credentials` to be passed over to the + // presenter. 2) aggregate all parsing errors in the results. + for (const password_manager::CSVPassword& csv_password : seq->csv_passwords) { + base::expected<password_manager::CredentialUIEntry, ImportEntry> + credential = CSVPasswordToCredentialUIEntry(csv_password, store); + if (credential.has_value()) + credentials.emplace_back(std::move(credential.value())); + else + results.failed_imports.emplace_back(std::move(credential.error())); + } + + // Pass `credentials` along with import results `results` to the callback + // too since they are necessary to report which imports did actually fail. + // (e.g. which url, username ...etc). Pass the import results (`results`) + // to the callback to aggregate other errors. presenter_->AddCredentials( credentials, password_manager::PasswordForm::Type::kImported, - base::BindOnce(&AddCredentialsCallback, start_time)); - - // TODO(crbug/1325290): - // - Check for conflicts. - // - Compute and fill statuses for failed imports. - // - Count actual number of successful imports. - results.number_imported = seq->csv_passwords.size(); - results.status = password_manager::ImportResults::Status::SUCCESS; - std::move(results_callback_).Run(results); + base::BindOnce(&AddCredentialsCallback, start_time, std::move(results), + credentials, std::move(results_callback_))); } void PasswordImporter::SetServiceForTesting(
diff --git a/components/password_manager/core/browser/import/password_importer.h b/components/password_manager/core/browser/import/password_importer.h index 976e890..98530db 100644 --- a/components/password_manager/core/browser/import/password_importer.h +++ b/components/password_manager/core/browser/import/password_importer.h
@@ -75,7 +75,9 @@ CompletionCallback completion, base::expected<std::string, PasswordImporter::Status> result); - void ConsumePasswords(password_manager::mojom::CSVPasswordSequencePtr seq); + void ConsumePasswords(std::string file_name, + password_manager::PasswordForm::Store store, + password_manager::mojom::CSVPasswordSequencePtr seq); const mojo::Remote<mojom::CSVPasswordParser>& GetParser(); @@ -84,8 +86,6 @@ Status status_{Status::NONE}; ImportResultsCallback results_callback_; - password_manager::PasswordForm::Store to_store_; - std::string selected_file_name_; const raw_ptr<SavedPasswordsPresenter> presenter_;
diff --git a/components/password_manager/core/browser/import/password_importer_unittest.cc b/components/password_manager/core/browser/import/password_importer_unittest.cc index 4123fc20..684f901 100644 --- a/components/password_manager/core/browser/import/password_importer_unittest.cc +++ b/components/password_manager/core/browser/import/password_importer_unittest.cc
@@ -58,31 +58,55 @@ mojo::PendingRemote<mojom::CSVPasswordParser> pending_remote{ receiver_.BindNewPipeAndPassRemote()}; importer_.SetServiceForTesting(std::move(pending_remote)); - store_->Init(/*prefs=*/nullptr, /*affiliated_match_helper=*/nullptr); + profile_store_->Init(/*prefs=*/nullptr, + /*affiliated_match_helper=*/nullptr); + account_store_->Init(/*prefs=*/nullptr, + /*affiliated_match_helper=*/nullptr); } PasswordImporterTest(const PasswordImporterTest&) = delete; PasswordImporterTest& operator=(const PasswordImporterTest&) = delete; ~PasswordImporterTest() override { - store_->ShutdownOnUIThread(); + account_store_->ShutdownOnUIThread(); + profile_store_->ShutdownOnUIThread(); task_environment_.RunUntilIdle(); } protected: - void StartImportAndWaitForCompletion(const base::FilePath& input_file) { - importer_.Import(input_file, - password_manager::PasswordForm::Store::kProfileStore, + void StartImportAndWaitForCompletion( + const base::FilePath& input_file, + PasswordForm::Store to_store = + password_manager::PasswordForm::Store::kProfileStore) { + importer_.Import(input_file, to_store, base::BindOnce(&PasswordImporterTest::OnPasswordsConsumed, base::Unretained(this))); task_environment_.RunUntilIdle(); ASSERT_TRUE(results_callback_called_); } - std::vector<CredentialUIEntry> imported_passwords() { + std::vector<CredentialUIEntry> stored_passwords() { return presenter_.GetSavedCredentials(); } + // Adding via the store interface directly, since adding to both stores using + // the presenter is not possible (a check for collision prevents that). + void AddToProfileAndAccountStores(PasswordForm form) { + form.in_store = password_manager::PasswordForm::Store::kProfileStore; + profile_store_->AddLogin(form); + task_environment_.RunUntilIdle(); + form.in_store = password_manager::PasswordForm::Store::kAccountStore; + account_store_->AddLogin(form); + task_environment_.RunUntilIdle(); + } + + bool AddPasswordForm(const PasswordForm& form) { + bool result = presenter_.AddCredential(CredentialUIEntry(form)); + + task_environment_.RunUntilIdle(); + return result; + } + PasswordImporter::Status GetImportStatus() const { return importer_.GetStatus(); } @@ -90,13 +114,17 @@ return import_results_.status; } + password_manager::ImportResults GetImportResults() const { + return import_results_; + } + // Directory for creating files by this test. base::ScopedTempDir temp_directory_; private: void OnPasswordsConsumed(const password_manager::ImportResults& results) { results_callback_called_ = true; - import_results_ = std::move(results); + import_results_ = results; } base::test::TaskEnvironment task_environment_; @@ -104,9 +132,11 @@ bool results_callback_called_ = false; FakePasswordParserService service_; mojo::Receiver<mojom::CSVPasswordParser> receiver_; - scoped_refptr<TestPasswordStore> store_ = - base::MakeRefCounted<TestPasswordStore>(); - password_manager::SavedPasswordsPresenter presenter_{store_}; + scoped_refptr<TestPasswordStore> profile_store_ = + base::MakeRefCounted<TestPasswordStore>(IsAccountStore(false)); + scoped_refptr<TestPasswordStore> account_store_ = + base::MakeRefCounted<TestPasswordStore>(IsAccountStore(true)); + SavedPasswordsPresenter presenter_{profile_store_, account_store_}; password_manager::PasswordImporter importer_; }; @@ -119,23 +149,417 @@ base::FilePath input_path = temp_directory_.GetPath().AppendASCII(kTestFileName); - ASSERT_EQ( - static_cast<int>(std::size(kTestCSVInput)), - base::WriteFile(input_path, kTestCSVInput, std::size(kTestCSVInput))); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); - histogram_tester.ExpectUniqueSample("PasswordManager.ImportFileSize", - /*sample=*/83, - /*expected_bucket_count=*/1); histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); histogram_tester.ExpectUniqueSample( "PasswordManager.ImportedPasswordsPerUserInCSV", 1, 1); - ASSERT_EQ(1u, imported_passwords().size()); - EXPECT_EQ(GURL(kTestOriginURL), imported_passwords()[0].url); - EXPECT_EQ(kTestSignonRealm, imported_passwords()[0].signon_realm); - EXPECT_EQ(kTestUsername, imported_passwords()[0].username); - EXPECT_EQ(kTestPassword, imported_passwords()[0].password); + password_manager::ImportResults results = GetImportResults(); + + EXPECT_EQ(1u, results.number_imported); + ASSERT_EQ(1u, stored_passwords().size()); + EXPECT_EQ(GURL(kTestOriginURL), stored_passwords()[0].url); + EXPECT_EQ(kTestSignonRealm, stored_passwords()[0].signon_realm); + EXPECT_EQ(kTestUsername, stored_passwords()[0].username); + EXPECT_EQ(kTestPassword, stored_passwords()[0].password); +} + +TEST_F(PasswordImporterTest, CSVImportBadHeaderReturnsBadFormat) { + constexpr char kTestCSVInput[] = + "Non Canonical Field,Bar - another one,FooBar - another one\n" + "http://accounts.google.com/a/LoginAuth,test@gmail.com,test1\n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 0); + histogram_tester.ExpectTotalCount( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0); + histogram_tester.ExpectUniqueSample("PasswordManager.ImportFileSize", 120, 1); + + password_manager::ImportResults results = GetImportResults(); + + EXPECT_EQ(0u, results.number_imported); + EXPECT_THAT(results.failed_imports, IsEmpty()); + EXPECT_THAT(stored_passwords(), IsEmpty()); + EXPECT_EQ(ImportResults::Status::BAD_FORMAT, results.status); +} + +TEST_F(PasswordImporterTest, CSVImportConflictProfileStore) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + "https://test.com,username_exists_in_profile_store,password1\n" + "https://test2.com,username2,password2\n"; + + PasswordForm form_profile_store; + form_profile_store.url = GURL("https://test.com"); + form_profile_store.signon_realm = form_profile_store.url.spec(); + form_profile_store.username_value = u"username_exists_in_profile_store"; + form_profile_store.password_value = u"password1"; + form_profile_store.in_store = + password_manager::PasswordForm::Store::kProfileStore; + + ASSERT_TRUE(AddPasswordForm(form_profile_store)); + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 1, 1); + + const password_manager::ImportResults& results = GetImportResults(); + + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ("https://test.com/", results.failed_imports[0].url); + EXPECT_EQ("username_exists_in_profile_store", + results.failed_imports[0].username); + EXPECT_EQ(password_manager::ImportEntry::Status::CONFLICT_PROFILE, + results.failed_imports[0].status); + + EXPECT_EQ(1u, results.number_imported); + ASSERT_EQ(2u, stored_passwords().size()); + EXPECT_EQ(GURL("https://test2.com"), stored_passwords()[1].url); + EXPECT_EQ(u"username2", stored_passwords()[1].username); + EXPECT_EQ(u"password2", stored_passwords()[1].password); +} + +TEST_F(PasswordImporterTest, CSVImportConflictAccountStore) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + "https://test.com,username_exists_in_profile_store,password1\n" + "https://test2.com,username2,password2\n"; + + PasswordForm form_profile_store; + form_profile_store.url = GURL("https://test.com"); + form_profile_store.signon_realm = form_profile_store.url.spec(); + form_profile_store.username_value = u"username_exists_in_profile_store"; + form_profile_store.password_value = u"password1"; + form_profile_store.in_store = + password_manager::PasswordForm::Store::kAccountStore; + + ASSERT_TRUE(AddPasswordForm(form_profile_store)); + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion( + input_path, password_manager::PasswordForm::Store::kAccountStore)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 1, 1); + + const password_manager::ImportResults& results = GetImportResults(); + + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ("https://test.com/", results.failed_imports[0].url); + EXPECT_EQ("username_exists_in_profile_store", + results.failed_imports[0].username); + EXPECT_EQ(password_manager::ImportEntry::Status::CONFLICT_ACCOUNT, + results.failed_imports[0].status); + + EXPECT_EQ(1u, results.number_imported); + ASSERT_EQ(2u, stored_passwords().size()); + EXPECT_EQ(GURL("https://test2.com"), stored_passwords()[1].url); + EXPECT_EQ(u"username2", stored_passwords()[1].username); + EXPECT_EQ(u"password2", stored_passwords()[1].password); +} + +TEST_F(PasswordImporterTest, CSVImportConflictProfileAndAccountStore) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + "https://" + "test.com,username_exists_in_profile_and_account_store,password1\n" + "https://test2.com,username2,password2\n"; + + PasswordForm form_account_profile_store; + form_account_profile_store.url = GURL("https://test.com"); + form_account_profile_store.signon_realm = + form_account_profile_store.url.spec(); + form_account_profile_store.username_value = + u"username_exists_in_profile_and_account_store"; + form_account_profile_store.password_value = u"password1"; + + AddToProfileAndAccountStores(std::move(form_account_profile_store)); + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion( + input_path, password_manager::PasswordForm::Store::kAccountStore)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 1, 1); + + const password_manager::ImportResults& results = GetImportResults(); + + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ("https://test.com/", results.failed_imports[0].url); + EXPECT_EQ("username_exists_in_profile_and_account_store", + results.failed_imports[0].username); + EXPECT_EQ(password_manager::ImportEntry::Status::CONFLICT_ACCOUNT, + results.failed_imports[0].status); + + EXPECT_EQ(1u, results.number_imported); + ASSERT_EQ(2u, stored_passwords().size()); + EXPECT_EQ(GURL("https://test2.com"), stored_passwords()[1].url); + EXPECT_EQ(u"username2", stored_passwords()[1].username); + EXPECT_EQ(u"password2", stored_passwords()[1].password); +} + +TEST_F(PasswordImporterTest, CSVImportEmptyPasswordReported) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + "http://accounts.google.com/a/LoginAuth,test@gmail.com,\n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + const password_manager::ImportResults& results = GetImportResults(); + + ASSERT_EQ(0u, results.number_imported); + ASSERT_EQ(0u, stored_passwords().size()); + ASSERT_EQ(password_manager::ImportResults::Status::SUCCESS, results.status); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::MISSING_PASSWORD, + results.failed_imports[0].status); + EXPECT_EQ(kTestOriginURL, results.failed_imports[0].url); + ASSERT_EQ("test@gmail.com", results.failed_imports[0].username); +} + +TEST_F(PasswordImporterTest, CSVImportEmptyURLReported) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + ",test@gmail.com,test1 \n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + ASSERT_EQ(0u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::MISSING_URL, + results.failed_imports[0].status); + EXPECT_EQ("test@gmail.com", results.failed_imports[0].username); +} + +TEST_F(PasswordImporterTest, CSVImportLongURLReported) { + std::string long_url = "https://" + std::string(2048, 'a') + ".com"; + std::string kTestCSVInput = + "Url,Username,Password\n" + long_url + ",test@gmail.com,test1 \n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(kTestCSVInput.length()), + base::WriteFile(input_path, kTestCSVInput.c_str(), + kTestCSVInput.length())); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + ASSERT_EQ(0u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::LONG_URL, + results.failed_imports[0].status); + EXPECT_EQ("test@gmail.com", results.failed_imports[0].username); + std::string expected_url = long_url + "/"; + EXPECT_EQ(expected_url, results.failed_imports[0].url); +} + +TEST_F(PasswordImporterTest, CSVImportLongPassword) { + std::string long_password = "https://" + std::string(1001, '*') + ".com"; + std::string kTestCSVInput = std::string("Url,Username,Password\n") + + "https://test.com,test@gmail.com," + + long_password + "\n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(kTestCSVInput.length()), + base::WriteFile(input_path, kTestCSVInput.c_str(), + kTestCSVInput.length())); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + ASSERT_EQ(0u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::LONG_PASSWORD, + results.failed_imports[0].status); + EXPECT_EQ("test@gmail.com", results.failed_imports[0].username); + EXPECT_EQ("https://test.com/", results.failed_imports[0].url); +} + +TEST_F(PasswordImporterTest, CSVImportLongUsername) { + std::string long_username = "https://" + std::string(1001, '*') + ".com"; + std::string kTestCSVInput = std::string("Url,Username,Password\n") + + "https://test.com," + long_username + + ",password\n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(kTestCSVInput.length()), + base::WriteFile(input_path, kTestCSVInput.c_str(), + kTestCSVInput.length())); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + ASSERT_EQ(0u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::LONG_USERNAME, + results.failed_imports[0].status); + EXPECT_EQ(long_username, results.failed_imports[0].username); + EXPECT_EQ("https://test.com/", results.failed_imports[0].url); +} + +TEST_F(PasswordImporterTest, CSVImportInvalidURLReported) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + "ww1.google.com,test@gmail.com,test1 \n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + ASSERT_EQ(0u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::INVALID_URL, + results.failed_imports[0].status); + EXPECT_EQ("test@gmail.com", results.failed_imports[0].username); + + EXPECT_EQ("ww1.google.com", results.failed_imports[0].url); +} + +TEST_F(PasswordImporterTest, CSVImportNonASCIIURLReported) { + constexpr char kTestCSVInput[] = + "Url,Username,Password\n" + "https://.إلياس.com,test@gmail.com,test1 \n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 0, 1); + + ASSERT_EQ(0u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::NON_ASCII_URL, + results.failed_imports[0].status); + EXPECT_EQ("test@gmail.com", results.failed_imports[0].username); + EXPECT_EQ("https://.إلياس.com", results.failed_imports[0].url); +} + +TEST_F(PasswordImporterTest, SingleFailedSingleSucceeds) { + // This tests that when some rows aren't valid (2nd row in this case is + // missing a site), only valid rows are imported. + constexpr char kTestCSVInput[] = + "Url,Password,Username\n" + ",password1,test1 \n" + "https://test2.com,password2,test2 \n"; + + base::HistogramTester histogram_tester; + + base::FilePath input_path = + temp_directory_.GetPath().AppendASCII(kTestFileName); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); + ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); + + histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 1); + + histogram_tester.ExpectUniqueSample( + "PasswordManager.ImportedPasswordsPerUserInCSV", 1, 1); + + ASSERT_EQ(1u, stored_passwords().size()); + + const password_manager::ImportResults results = GetImportResults(); + EXPECT_EQ(1u, results.number_imported); + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::MISSING_URL, + results.failed_imports[0].status); + EXPECT_EQ("test1 ", results.failed_imports[0].username); } TEST_F(PasswordImporterTest, PartialImportSucceeds) { @@ -150,9 +574,8 @@ base::FilePath input_path = temp_directory_.GetPath().AppendASCII(kTestFileName); - ASSERT_EQ( - static_cast<int>(std::size(kTestCSVInput)), - base::WriteFile(input_path, kTestCSVInput, std::size(kTestCSVInput))); + ASSERT_EQ(static_cast<int>(strlen(kTestCSVInput)), + base::WriteFile(input_path, kTestCSVInput, strlen(kTestCSVInput))); ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path)); histogram_tester.ExpectUniqueSample("PasswordManager.ImportFileSize", @@ -162,11 +585,18 @@ histogram_tester.ExpectUniqueSample( "PasswordManager.ImportedPasswordsPerUserInCSV", 1, 1); - ASSERT_EQ(1u, imported_passwords().size()); - EXPECT_EQ(GURL(kTestOriginURL), imported_passwords()[0].url); - EXPECT_EQ(kTestSignonRealm, imported_passwords()[0].signon_realm); - EXPECT_EQ(kTestUsername, imported_passwords()[0].username); - EXPECT_EQ(kTestPassword, imported_passwords()[0].password); + ASSERT_EQ(1u, stored_passwords().size()); + EXPECT_EQ(GURL(kTestOriginURL), stored_passwords()[0].url); + EXPECT_EQ(kTestSignonRealm, stored_passwords()[0].signon_realm); + EXPECT_EQ(kTestUsername, stored_passwords()[0].username); + EXPECT_EQ(kTestPassword, stored_passwords()[0].password); + + const password_manager::ImportResults& results = GetImportResults(); + + ASSERT_EQ(1u, results.failed_imports.size()); + EXPECT_EQ(password_manager::ImportEntry::Status::MISSING_URL, + results.failed_imports[0].status); + EXPECT_EQ("test@gmail.com", results.failed_imports[0].username); } TEST_F(PasswordImporterTest, CSVImportLargeFileShouldFail) { @@ -180,7 +610,7 @@ ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(temp_file_path)); - EXPECT_THAT(imported_passwords(), IsEmpty()); + EXPECT_THAT(stored_passwords(), IsEmpty()); histogram_tester.ExpectUniqueSample("PasswordManager.ImportFileSize", /*sample=*/153700, /*expected_bucket_count=*/1); @@ -206,7 +636,7 @@ ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(temp_file_path)); - EXPECT_THAT(imported_passwords(), IsEmpty()); + EXPECT_THAT(stored_passwords(), IsEmpty()); EXPECT_EQ(ImportResults::Status::NUM_PASSWORDS_EXCEEDED, GetResultsStatus()); base::DeleteFile(temp_file_path); } @@ -226,7 +656,8 @@ histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 0); histogram_tester.ExpectTotalCount( "PasswordManager.ImportedPasswordsPerUserInCSV", 0); - EXPECT_THAT(imported_passwords(), IsEmpty()); + EXPECT_THAT(GetImportResults().failed_imports, IsEmpty()); + EXPECT_THAT(stored_passwords(), IsEmpty()); EXPECT_EQ(PasswordImporter::Status::IO_ERROR, GetImportStatus()); } @@ -240,7 +671,8 @@ histogram_tester.ExpectTotalCount("PasswordManager.ImportDuration", 0); histogram_tester.ExpectTotalCount( "PasswordManager.ImportedPasswordsPerUserInCSV", 0); - ASSERT_EQ(0u, imported_passwords().size()); + EXPECT_THAT(GetImportResults().failed_imports, IsEmpty()); + EXPECT_THAT(stored_passwords(), IsEmpty()); } } // namespace password_manager
diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.cc b/components/password_manager/core/browser/ui/credential_ui_entry.cc index ff10eade..c1a37ee 100644 --- a/components/password_manager/core/browser/ui/credential_ui_entry.cc +++ b/components/password_manager/core/browser/ui/credential_ui_entry.cc
@@ -46,10 +46,10 @@ CredentialUIEntry::CredentialUIEntry(const CSVPassword& csv_password, PasswordForm::Store to_store) - : signon_realm(IsValidAndroidFacetURI(csv_password.GetURL().spec()) - ? csv_password.GetURL().spec() - : GetSignonRealm(csv_password.GetURL())), - url(csv_password.GetURL()), + : signon_realm(IsValidAndroidFacetURI(csv_password.GetURL().value().spec()) + ? csv_password.GetURL().value().spec() + : GetSignonRealm(csv_password.GetURL().value())), + url(csv_password.GetURL().value()), username(base::UTF8ToUTF16(csv_password.GetUsername())), password(base::UTF8ToUTF16(csv_password.GetPassword())) { DCHECK_EQ(csv_password.GetParseStatus(), CSVPassword::Status::kOK);
diff --git a/components/password_manager/core/browser/ui/import_results.h b/components/password_manager/core/browser/ui/import_results.h index 1ae3ace..95080df9 100644 --- a/components/password_manager/core/browser/ui/import_results.h +++ b/components/password_manager/core/browser/ui/import_results.h
@@ -102,4 +102,4 @@ } // namespace password_manager -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_IMPORT_RESULTS_H_ \ No newline at end of file +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_IMPORT_RESULTS_H_
diff --git a/components/password_manager/services/csv_password/csv_password_parser_impl_unittest.cc b/components/password_manager/services/csv_password/csv_password_parser_impl_unittest.cc index 6afd263..b62b129 100644 --- a/components/password_manager/services/csv_password/csv_password_parser_impl_unittest.cc +++ b/components/password_manager/services/csv_password/csv_password_parser_impl_unittest.cc
@@ -122,8 +122,10 @@ sequence->csv_passwords[0].GetUsername()); EXPECT_EQ("132", sequence->csv_passwords[0].GetPassword()); - EXPECT_EQ(GURL(""), - sequence->csv_passwords[0].GetURL()); + ASSERT_FALSE( + sequence->csv_passwords[0].GetURL().has_value()); + EXPECT_EQ( + "", sequence->csv_passwords[0].GetURL().error()); })); }
diff --git a/components/password_manager/services/csv_password/public/mojom/csv_password_parser.mojom b/components/password_manager/services/csv_password/public/mojom/csv_password_parser.mojom index 4455882..6b34746 100644 --- a/components/password_manager/services/csv_password/public/mojom/csv_password_parser.mojom +++ b/components/password_manager/services/csv_password/public/mojom/csv_password_parser.mojom
@@ -15,6 +15,8 @@ string username; string password; url.mojom.Url url; + // If the url is invalid, the original url will be populated in this field. + string? invalid_url; }; // Interface for parsing csv raw string that is expected to
diff --git a/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.cc b/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.cc index 9c13064..438d9cde 100644 --- a/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.cc +++ b/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.cc
@@ -23,7 +23,15 @@ return false; if (!data.ReadPassword(&password)) return false; - *out = password_manager::CSVPassword(url, username, password); + if (url.is_valid()) { + *out = password_manager::CSVPassword(url, username, password); + return true; + } + absl::optional<std::string> invalid_url; + if (!data.ReadInvalidUrl(&invalid_url)) + return false; + DCHECK(invalid_url.has_value()); + *out = password_manager::CSVPassword(invalid_url.value(), username, password); return true; }
diff --git a/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.h b/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.h index 9c60bdd..bd8080b 100644 --- a/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.h +++ b/components/password_manager/services/csv_password/public/mojom/csv_password_parser_traits.h
@@ -5,17 +5,29 @@ #ifndef COMPONENTS_PASSWORD_MANAGER_SERVICES_CSV_PASSWORD_PUBLIC_MOJOM_CSV_PASSWORD_PARSER_TRAITS_H_ #define COMPONENTS_PASSWORD_MANAGER_SERVICES_CSV_PASSWORD_PUBLIC_MOJOM_CSV_PASSWORD_PARSER_TRAITS_H_ +#include "base/types/expected.h" #include "components/password_manager/core/browser/import/csv_password.h" #include "components/password_manager/services/csv_password/public/mojom/csv_password_parser.mojom.h" #include "mojo/public/cpp/bindings/struct_traits.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace mojo { template <> struct StructTraits<password_manager::mojom::CSVPasswordDataView, password_manager::CSVPassword> { - static const GURL& url(const password_manager::CSVPassword& r) { - return r.GetURL(); + static const GURL url(const password_manager::CSVPassword& r) { + base::expected<GURL, std::string> expected_url = r.GetURL(); + if (expected_url.has_value()) + return expected_url.value(); + return GURL(); + } + static absl::optional<std::string> invalid_url( + const password_manager::CSVPassword& r) { + base::expected<GURL, std::string> expected_url = r.GetURL(); + if (!expected_url.has_value()) + return expected_url.error(); + return absl::optional<std::string>(); } static const std::string& username(const password_manager::CSVPassword& r) { return r.GetUsername();
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 8ff2673c..1a93848b 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1123,6 +1123,7 @@ <translation id="2058055310819710697">Ativar o modo de desenvolvedor para apps isolados</translation> <translation id="2061123930713023976">Permitir capturas de pacotes de rede para depuração</translation> <translation id="2061810934846663491">Configurar os nomes de domínio obrigatórios para hosts de acesso remoto</translation> +<translation id="2062632109797189011">Reativar a API window.webkitStorageInfo descontinuada</translation> <translation id="2069350366303315077">Definir a política como "Ativada" faz com que o <ph name="PRODUCT_NAME" /> aplique sessões de visitante e impeça logins de perfis. Logins de visitante são perfis do <ph name="PRODUCT_NAME" /> em que as janelas estão no modo de navegação anônima. Se a política for definida como "Desativada", não for definida ou se o modo visitante for desativado (pela <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" />), o uso de perfis novos e existentes será permitido.</translation> @@ -1890,6 +1891,7 @@ Se a política for definida como "Desativada" ou não for definida, as informações de status do Android não serão informadas pelos dispositivos registrados.</translation> <translation id="288923520817177650">Permitir a criação de sessões <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> da <ph name="WEBXR_API_NAME_SHORT" /></translation> +<translation id="2889842394011108075">A window.webkitStorageInfo vai ficar disponível.</translation> <translation id="2890645751406497668">Conceder automaticamente permissão a esses sites para se conectarem a dispositivos USB com determinados IDs de fornecedores e produtos.</translation> <translation id="2891049933730408118">A definição da política especifica em quais origens permitir todos os esquemas de autenticação HTTP ao quais o <ph name="PRODUCT_NAME" /> oferece suporte, independentemente da política <ph name="AUTH_SCHEMES_POLICY_NAME" />. @@ -3547,6 +3549,7 @@ <translation id="4700190441681139987">Não permitir o acesso de nenhum site aos sensores</translation> <translation id="4703402283970867140">Ativar modelo de escurecimento inteligente para aumentar o tempo que a tela permanece ativa</translation> <translation id="4704958130749494760">Permitir automaticamente que os sites se conectem a dispositivos seriais USB.</translation> +<translation id="471360812659157054">A window.webkitStorageInfo não vai ficar disponível.</translation> <translation id="4722122254122249791">Ativar o isolamento de sites para origens específicas</translation> <translation id="4723829699367336876">Habilitar passagem de firewall a partir do cliente de acesso remoto</translation> <translation id="4725528134735324213">Ativar o Android Backup Service</translation> @@ -6746,6 +6749,11 @@ <translation id="8091982561085048989">Flag booleana indicando se o IPP Everywhere deve ser usado ou não para configurar a impressora. Essa sinalização é compatível com o <ph name="PRODUCT_OS_NAME" /> 76 ou versão mais recente.</translation> <translation id="8099880303030573137">Intervalo de inatividade no funcionamento com energia da bateria</translation> <translation id="8101381354936029836">Grupo atômico de políticas:</translation> +<translation id="8102504778644322990">Da versão M106 em diante, a API window.webkitStorageInfo não padrão vai ser removida. + Esta política reativa essa API até a versão M107. + Se a política for ativada, a API window.webkitStorageInfo vai ficar disponível. + Se ela for desativada ou deixada sem definição, a API não vai ficar disponível. + </translation> <translation id="8102913158860568230">Configuração padrão mediastream</translation> <translation id="8104962233214241919">Selecionar certificados de cliente automaticamente para estes sites</translation> <translation id="8114382167597081590">Não aplicar o Modo restrito no YouTube</translation>
diff --git a/components/segmentation_platform/embedder/default_model/feed_user_segment.cc b/components/segmentation_platform/embedder/default_model/feed_user_segment.cc index d2a7e9b..ed59f34 100644 --- a/components/segmentation_platform/embedder/default_model/feed_user_segment.cc +++ b/components/segmentation_platform/embedder/default_model/feed_user_segment.cc
@@ -6,7 +6,6 @@ #include <array> -#include "base/metrics/field_trial_params.h" #include "base/strings/strcat.h" #include "base/threading/sequenced_task_runner_handle.h" #include "components/segmentation_platform/internal/metadata/metadata_writer.h" @@ -17,6 +16,39 @@ namespace segmentation_platform { namespace { + +// List of sub-segments for Feed segment. +enum class FeedUserSubsegment { + kUnknown = 0, + kOther = 1, + + // Legacy groups, split into feed engagement types below. + kDeprecatedActiveOnFeedOnly = 2, + kDeprecatedActiveOnFeedAndNtpFeatures = 3, + + // Recorded when no feed usage was observed. + kNoFeedAndNtpFeatures = 4, + kMvtOnly = 5, + kReturnToCurrentTabOnly = 6, + kUsedNtpWithoutModules = 7, + kNoNTPOrHomeOpened = 8, + + // Cut-off after which the model returns Feed user as final segment. + + // Feed engagement combined with NTP features. + kNtpAndFeedEngaged = 9, + kNtpAndFeedEngagedSimple = 10, + kNtpAndFeedScrolled = 11, + kNtpAndFeedInteracted = 12, + kNoNtpAndFeedEngaged = 13, + kNoNtpAndFeedEngagedSimple = 14, + kNoNtpAndFeedScrolled = 15, + kNoNtpAndFeedInteracted = 16, + kMaxValue = kNoNtpAndFeedInteracted +}; + +#define RANK(x) static_cast<int>(x) + using proto::SegmentId; // Default parameters for Chrome Start model. @@ -30,33 +62,13 @@ // Discrete mapping parameters. constexpr char kFeedUserDiscreteMappingKey[] = "feed_user_segment"; -constexpr float kFeedUserDiscreteMappingMinResult = 0.8; +// All values greater than or equal to kNtpAndFeedEngaged will map to true. +constexpr float kFeedUserDiscreteMappingMinResult = + RANK(FeedUserSubsegment::kNtpAndFeedEngaged); constexpr int64_t kFeedUserDiscreteMappingRank = 1; constexpr std::pair<float, int> kDiscreteMappings[] = { {kFeedUserDiscreteMappingMinResult, kFeedUserDiscreteMappingRank}}; -#define RANK(x) static_cast<int>(FeedUserSubsegment::x) - -static constexpr std::array<std::pair<float, /*FeedUserSubsegment*/ int>, 16> - kFeedUserScoreToSubGroup = {{ - {1.0, RANK(kDeprecatedActiveOnFeedOnly)}, - {0.98, RANK(kNtpAndFeedEngaged)}, - {0.96, RANK(kNtpAndFeedEngagedSimple)}, - {0.94, RANK(kNtpAndFeedScrolled)}, - {0.92, RANK(kNtpAndFeedInteracted)}, - {0.90, RANK(kNoNtpAndFeedEngaged)}, - {0.88, RANK(kNoNtpAndFeedEngagedSimple)}, - {0.86, RANK(kNoNtpAndFeedScrolled)}, - {0.84, RANK(kNoNtpAndFeedInteracted)}, - {0.8, RANK(kDeprecatedActiveOnFeedAndNtpFeatures)}, - {0.7, RANK(kNoFeedAndNtpFeatures)}, - {0.5, RANK(kMvtOnly)}, - {0.4, RANK(kReturnToCurrentTabOnly)}, - {0.2, RANK(kUsedNtpWithoutModules)}, - {0.1, RANK(kNoNTPOrHomeOpened)}, - {0.0, RANK(kUnknown)}, - }}; - // InputFeatures. // The enum values are based on feed::FeedEngagementType. @@ -96,16 +108,6 @@ kFeedEngagementScrolled.size()), }; -float GetScoreForSubsegment(FeedUserSubsegment subgroup) { - for (const auto& score_and_type : kFeedUserScoreToSubGroup) { - if (score_and_type.second == static_cast<int>(subgroup)) { - return score_and_type.first; - } - } - NOTREACHED(); - return 0; -} - // Any updates to these strings need to also update the field trials allowlist // in go/segmentation-field-trials-map. std::string FeedUserSubsegmentToString(FeedUserSubsegment feed_group) { @@ -153,8 +155,8 @@ absl::optional<std::string> FeedUserSegment::GetSubsegmentName( int subsegment_rank) { - DCHECK(RANK(kUnknown) <= subsegment_rank && - subsegment_rank <= RANK(kMaxValue)); + DCHECK(RANK(FeedUserSubsegment::kUnknown) <= subsegment_rank && + subsegment_rank <= RANK(FeedUserSubsegment::kMaxValue)); FeedUserSubsegment subgroup = static_cast<FeedUserSubsegment>(subsegment_rank); return FeedUserSubsegmentToString(subgroup); @@ -173,10 +175,14 @@ kDiscreteMappings, 1); // Add subsegment mapping. + std::vector<std::pair<float, int>> subsegment_mapping; + for (unsigned i = 1; i <= RANK(FeedUserSubsegment::kMaxValue); ++i) { + subsegment_mapping.emplace_back(i, i); + } writer.AddDiscreteMappingEntries( base::StrCat( {kFeedUserDiscreteMappingKey, kSubsegmentDiscreteMappingSuffix}), - kFeedUserScoreToSubGroup.data(), kFeedUserScoreToSubGroup.size()); + subsegment_mapping.data(), subsegment_mapping.size()); // Set features. writer.AddUmaFeatures(kFeedUserUMAFeatures.data(), @@ -236,7 +242,7 @@ segment = segment = FeedUserSubsegment::kNoNTPOrHomeOpened; } - float result = GetScoreForSubsegment(segment); + float result = RANK(segment); base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), result)); }
diff --git a/components/segmentation_platform/embedder/default_model/feed_user_segment.h b/components/segmentation_platform/embedder/default_model/feed_user_segment.h index c011938..774d855 100644 --- a/components/segmentation_platform/embedder/default_model/feed_user_segment.h +++ b/components/segmentation_platform/embedder/default_model/feed_user_segment.h
@@ -9,34 +9,6 @@ namespace segmentation_platform { -// List of sub-segments for Feed segment. -enum class FeedUserSubsegment { - kUnknown = 0, - kOther = 1, - - // Legacy groups, split into feed engagement types below. - kDeprecatedActiveOnFeedOnly = 2, - kDeprecatedActiveOnFeedAndNtpFeatures = 3, - - // Recorded when no feed usage was observed. - kNoFeedAndNtpFeatures = 4, - kMvtOnly = 5, - kReturnToCurrentTabOnly = 6, - kUsedNtpWithoutModules = 7, - kNoNTPOrHomeOpened = 8, - - // Feed engagement combined with NTP features. - kNtpAndFeedEngaged = 9, - kNtpAndFeedEngagedSimple = 10, - kNtpAndFeedScrolled = 11, - kNtpAndFeedInteracted = 12, - kNoNtpAndFeedEngaged = 13, - kNoNtpAndFeedEngagedSimple = 14, - kNoNtpAndFeedScrolled = 15, - kNoNtpAndFeedInteracted = 16, - kMaxValue = kNoNtpAndFeedInteracted -}; - // Segmentation Chrome Feed user model provider. Provides a default model and // metadata for the Feed user optimization target. class FeedUserSegment : public ModelProvider {
diff --git a/components/services/app_service/public/cpp/app_types.cc b/components/services/app_service/public/cpp/app_types.cc index 79681b78..b6c0804 100644 --- a/components/services/app_service/public/cpp/app_types.cc +++ b/components/services/app_service/public/cpp/app_types.cc
@@ -40,7 +40,8 @@ kDefault, kSync, kUser, - kSubApp) + kSubApp, + kKiosk) APP_ENUM_TO_STRING(InstallSource, kUnknown, kSystem, @@ -241,6 +242,8 @@ return InstallReason::kUser; case apps::mojom::InstallReason::kSubApp: return InstallReason::kSubApp; + case apps::mojom::InstallReason::kKiosk: + return InstallReason::kKiosk; } } @@ -263,6 +266,8 @@ return apps::mojom::InstallReason::kUser; case InstallReason::kSubApp: return apps::mojom::InstallReason::kSubApp; + case InstallReason::kKiosk: + return apps::mojom::InstallReason::kKiosk; } }
diff --git a/components/services/app_service/public/cpp/app_types.h b/components/services/app_service/public/cpp/app_types.h index eefec58..54b6385 100644 --- a/components/services/app_service/public/cpp/app_types.h +++ b/components/services/app_service/public/cpp/app_types.h
@@ -74,7 +74,8 @@ kDefault, // Preinstalled by default, but is not considered a system app. kSync, // Installed by sync. kUser, // Installed by user action. - kSubApp // Installed by the SubApp API call. + kSubApp, // Installed by the SubApp API call. + kKiosk // Installed by Kiosk on Chrome OS. ) // Where the app was installed from.
diff --git a/components/services/app_service/public/cpp/app_update.cc b/components/services/app_service/public/cpp/app_update.cc index ada5df9..ad06abeb 100644 --- a/components/services/app_service/public/cpp/app_update.cc +++ b/components/services/app_service/public/cpp/app_update.cc
@@ -400,6 +400,7 @@ case apps::InstallReason::kPolicy: case apps::InstallReason::kOem: case apps::InstallReason::kDefault: + case apps::InstallReason::kKiosk: return true; case apps::InstallReason::kUnknown: case apps::InstallReason::kSync:
diff --git a/components/services/app_service/public/mojom/types.mojom b/components/services/app_service/public/mojom/types.mojom index 7d3be7e..d5113cc0 100644 --- a/components/services/app_service/public/mojom/types.mojom +++ b/components/services/app_service/public/mojom/types.mojom
@@ -173,6 +173,7 @@ kSync, // Installed by sync. kUser, // Installed by user action. kSubApp, // Installed by the SubApp API call. + kKiosk, // Installed by Kiosk on Chrome OS. }; // Where the app was installed from.
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 4a23acdf..6c95b4b7 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Nie genoeg berging om hierdie bladsy oop te maak nie</translation> <translation id="6259156558325130047">Herdoen herrangskik</translation> <translation id="6263376278284652872"><ph name="DOMAIN" />-boekmerke</translation> +<translation id="6264376385120300461">Laai in elk geval af</translation> <translation id="6264485186158353794">Terug na veiligheid</translation> <translation id="6265794661083428563">Kopieer die waarde van die <ph name="POLICY_NAME" />-beleid</translation> <translation id="6266934640124581640">Liggroenblou</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index b9290dac..2f37b2c 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">ይህን ገጽ ለመክፈት በቂ ማህደረ ትውስታ የለም</translation> <translation id="6259156558325130047">&ዳግም ደርድርን ድገም</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> እልባቶች</translation> +<translation id="6264376385120300461">ለማንኛውም አውርድ</translation> <translation id="6264485186158353794">ወደ አስተማማኝ ተመለስ</translation> <translation id="6265794661083428563">የ<ph name="POLICY_NAME" /> መመሪያውን ይቅዱ</translation> <translation id="6266934640124581640">ፈዘዝ ያለ ውሃ አረንጓዴ ሰማያዊ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 927bbdc..efd4561 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1942,6 +1942,7 @@ <translation id="6254436959401408446">لا تتوفر ذاكرة كافية لفتح هذه الصفحة</translation> <translation id="6259156558325130047">إعادة إ&جراء الترتيب</translation> <translation id="6263376278284652872">إشعارات <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">التنزيل على أيّ حال</translation> <translation id="6264485186158353794">الرجوع</translation> <translation id="6265794661083428563">نسخ قيمة السياسة <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">أزرق مخضر فاتح</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 6a539ea..dec1c054 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -1935,6 +1935,7 @@ <translation id="6254436959401408446">এই পৃষ্ঠাটো খুলিবলৈ পর্যাপ্ত মেম’ৰি নাই</translation> <translation id="6259156558325130047">&পুনৰ ক্ৰমবদ্ধ কৰাটো ৰিডু কৰক</translation> <translation id="6263376278284652872"><ph name="DOMAIN" />ৰ বুকমার্ক</translation> +<translation id="6264376385120300461">তথাপি ডাউনল’ড কৰক</translation> <translation id="6264485186158353794">পূৰ্বৱৰ্তী পৃষ্ঠাটোলৈ উভতি যাওক</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> নীতিৰ মানটো প্ৰতিলিপি কৰক</translation> <translation id="6266934640124581640">পাতল নীলা</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 32236efa..3e531873 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -1935,6 +1935,7 @@ <translation id="6254436959401408446">Bu səhifəni açmaq üçün kifayət qədər yaddaş yoxdur</translation> <translation id="6259156558325130047">&Təkrar sıralamanı yenidən edin</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> əlfəcinləri</translation> +<translation id="6264376385120300461">Hər bir halda endirin</translation> <translation id="6264485186158353794">Güvənliyə qayıdın</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> siyasətinin dəyərini kopyalayın</translation> <translation id="6266934640124581640">Açıq-firuzəyi</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index e5430eb..88cccbd 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Недастаткова памяці, каб адкрыць гэту старонку</translation> <translation id="6259156558325130047">&Паўтарыць змяненне парадку</translation> <translation id="6263376278284652872">Закладкі <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Усё роўна спампаваць</translation> <translation id="6264485186158353794">Назад да бяспечнага карыстання</translation> <translation id="6265794661083428563">Скапіраваць значэнне палітыкі "<ph name="POLICY_NAME" />"</translation> <translation id="6266934640124581640">Светла-сіне-зялёны</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 9bfede2..5ebc5fc 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Няма достатъчно памет за отваряне на тази страница</translation> <translation id="6259156558325130047">&Възстановяване на пренареждането</translation> <translation id="6263376278284652872">Отметки от <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Изтегляне въпреки това</translation> <translation id="6264485186158353794">Назад към безопасната страница</translation> <translation id="6265794661083428563">Копиране на стойността на правилото „<ph name="POLICY_NAME" />“</translation> <translation id="6266934640124581640">светло синьо-зелено</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index fa2a81a..74e7cc8 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -913,6 +913,7 @@ <translation id="3427342743765426898">&সম্পাদনাকে আবার করুন</translation> <translation id="342781501876943858">Chromium-এর নীতি অনুযায়ী আপনার পাসওয়ার্ড বদলে ফেলা উচিত যদি আপনি সেটি অন্য কোনও সাইটে ব্যবহার করে থাকেন।</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates সার্ভারের এক বা একাধিক টেমপ্লেট ইউআরআই সঠিক নয় এবং ব্যবহার করা যাবে না।</translation> +<translation id="3431216045099978607">ফুল স্ক্রিন থেকে বেরিয়ে এসে ডাউনলোড দেখতে |<ph name="ACCELERATOR" />| প্রেস করুন।</translation> <translation id="3431636764301398940">এই ডিভাইসে এই কার্ডটি সেভ করুন</translation> <translation id="3432601291244612633">পৃষ্ঠা বন্ধ করুন</translation> <translation id="3435738964857648380">নিরাপত্তা</translation> @@ -1940,6 +1941,7 @@ <translation id="6254436959401408446">এই পৃষ্ঠাটি খোলার জন্য পর্যাপ্ত মেমরি নেই</translation> <translation id="6259156558325130047">&পুনর্বিন্যাসকে আবার করুন</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> বুকমার্কগুলি</translation> +<translation id="6264376385120300461">তবুও ডাউনলোড করুন</translation> <translation id="6264485186158353794">সুরক্ষাতে ফিরুন</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" />-এর নীতির মান কপি করুন</translation> <translation id="6266934640124581640">হালকা টিল</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index e077582..ea8019b 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -911,7 +911,7 @@ <translation id="3427342743765426898">&Poništi uređivanje</translation> <translation id="342781501876943858">Chromium preporučuje ponovno postavljanje lozinke ukoliko ste je iskoristili na drugim web lokacijama.</translation> <translation id="3428151540071562330">Jedan ili više URI-ja šablona servera DnsOverHttpsTemplates su nevažeći i neće se koristiti.</translation> -<translation id="3431216045099978607">Pritisnite |<ph name="ACCELERATOR" />| da biste zatvorili prikaz na cijelom zaslonu i vidjeli preuzimanje.</translation> +<translation id="3431216045099978607">Pritisnite |<ph name="ACCELERATOR" />| da izađete iz prikaza preko cijelog ekrana i vidite preuzimanje.</translation> <translation id="3431636764301398940">Sačuvaj ovu karticu na ovaj uređaj</translation> <translation id="3432601291244612633">Zatvori stranicu</translation> <translation id="3435738964857648380">Sigurnost</translation> @@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">Nema dovoljno memorije za otvaranje ove stranice</translation> <translation id="6259156558325130047">Ponovi p&reuređivanje</translation> <translation id="6263376278284652872">Oznake domene <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Ipak preuzmi</translation> <translation id="6264485186158353794">Nazad na sigurno</translation> <translation id="6265794661083428563">Kopirajte vrijednost pravila <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Svijetlotirkiznoplava</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 55caf712..b882dd1 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">No hi ha prou memòria per obrir aquesta pàgina</translation> <translation id="6259156558325130047">&Refés el canvi d'ordre</translation> <translation id="6263376278284652872">Adreces d'interès de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Baixa igualment</translation> <translation id="6264485186158353794">Torna a una pàgina segura</translation> <translation id="6265794661083428563">Copia el valor de la política <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Verd blavós clar</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 729ee47..7f8eb95 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1936,6 +1936,7 @@ <translation id="6254436959401408446">K otevření této stránky není k dispozici dostatek paměti</translation> <translation id="6259156558325130047">&Opakovat změnu uspořádání</translation> <translation id="6263376278284652872">Záložky webu <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Přesto stáhnout</translation> <translation id="6264485186158353794">Zpět na bezpečnější stránku</translation> <translation id="6265794661083428563">Zkopírovat hodnotu zásady <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Světle modrozelená</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 8d12409..1a2bf23 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Dim digon o gof i agor y dudalen hon</translation> <translation id="6259156558325130047">&Ailwneud Aildrefnu</translation> <translation id="6263376278284652872">Nodau tudalen <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Lawrlwytho beth bynnag</translation> <translation id="6264485186158353794">Yn ôl i dudalen ddiogel</translation> <translation id="6265794661083428563">Copïo gwerth y polisi <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Glaswyrdd Golau</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index d90803c..b20e330 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Der er ikke nok hukommelse til at åbne denne side</translation> <translation id="6259156558325130047">&Annuller fortryd omarrangering</translation> <translation id="6263376278284652872"><ph name="DOMAIN" />-bogmærker</translation> +<translation id="6264376385120300461">Download alligevel</translation> <translation id="6264485186158353794">Tilbage i sikkerhed</translation> <translation id="6265794661083428563">Kopiér værdien fra <ph name="POLICY_NAME" />-politikken</translation> <translation id="6266934640124581640">Lys grønblå</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 39209463..642a7d4 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1937,6 +1937,7 @@ <translation id="6254436959401408446">Nicht genügend Speicher, um diese Seite zu öffnen</translation> <translation id="6259156558325130047">&Neu anordnen rückgängig machen</translation> <translation id="6263376278284652872"><ph name="DOMAIN" />-Lesezeichen</translation> +<translation id="6264376385120300461">Trotzdem herunterladen</translation> <translation id="6264485186158353794">Zurück zu sicherer Website</translation> <translation id="6265794661083428563">Den Wert der Richtlinie <ph name="POLICY_NAME" /> kopieren</translation> <translation id="6266934640124581640">Helles Blaugrün</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 82d141e..caae02a 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -1944,6 +1944,7 @@ <translation id="6254436959401408446">Δεν υπάρχει αρκετή μνήμη για το άνοιγμα αυτής της σελίδας</translation> <translation id="6259156558325130047">&Επανάληψη αναδιάταξης</translation> <translation id="6263376278284652872">Σελιδοδείκτες <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Να γίνει η λήψη ούτως ή άλλως</translation> <translation id="6264485186158353794">Πίσω στην ασφάλεια</translation> <translation id="6265794661083428563">Αντιγραφή της τιμής της πολιτικής <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Ανοιχτό γαλαζοπράσινο</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index e7932fb0..15364ef4 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -1941,6 +1941,7 @@ <translation id="6254436959401408446">Not enough memory to open this page</translation> <translation id="6259156558325130047">&Redo Reorder</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> bookmarks</translation> +<translation id="6264376385120300461">Download anyway</translation> <translation id="6264485186158353794">Back to safety</translation> <translation id="6265794661083428563">Copy the value of <ph name="POLICY_NAME" /> policy</translation> <translation id="6266934640124581640">Light teal</translation> @@ -2058,6 +2059,7 @@ <translation id="6591833882275308647">Your <ph name="DEVICE_TYPE" /> is not managed</translation> <translation id="6592952801936330159">Manage site settings button, press Enter to manage permissions and data stored across sites in Chrome settings</translation> <translation id="6596325263575161958">Encryption options</translation> +<translation id="6599642189720630047">Tracked products</translation> <translation id="6609880536175561541">Prc7 (Envelope)</translation> <translation id="6611723696964473273">Economy news</translation> <translation id="6612010098632894193">Online video</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index bdfa5c3e..ef86d14 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">Tu dispositivo no tiene suficiente memoria para abrir esta página</translation> <translation id="6259156558325130047">&Rehacer Reorganizar</translation> <translation id="6263376278284652872">Favoritos de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Descargar de todos modos</translation> <translation id="6264485186158353794">Volver a seguridad</translation> <translation id="6265794661083428563">Copia el valor de la política <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Verde azulado claro</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index ae33d1a..db33111 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">No hay suficiente memoria para abrir esta página</translation> <translation id="6259156558325130047">&Rehacer reorganización</translation> <translation id="6263376278284652872">Marcadores de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Descargar de todos modos</translation> <translation id="6264485186158353794">Volver para estar a salvo</translation> <translation id="6265794661083428563">Copia el valor de la política <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Verde azulado claro</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 6559c27..36b567b4 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Selle lehe avamiseks pole piisavalt mälu</translation> <translation id="6259156558325130047">&Korrasta uuesti</translation> <translation id="6263376278284652872">Domeeni <ph name="DOMAIN" /> järjehoidjad</translation> +<translation id="6264376385120300461">Laadi ikkagi alla</translation> <translation id="6264485186158353794">Tagasi turvalisusse</translation> <translation id="6265794661083428563">Kopeeri reegli <ph name="POLICY_NAME" /> väärtus</translation> <translation id="6266934640124581640">Helesinakasroheline</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 8dc41676..eea1ea3bb 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -1936,6 +1936,7 @@ <translation id="6254436959401408446">Ez dago fitxategia irekitzeko behar adina memoria</translation> <translation id="6259156558325130047">&Berregin berrantolatzea</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> laster-marka</translation> +<translation id="6264376385120300461">Deskargatu halere</translation> <translation id="6264485186158353794">Itzuli segurtasunera</translation> <translation id="6265794661083428563">Kopiatu <ph name="POLICY_NAME" /> gidalerroaren balioa</translation> <translation id="6266934640124581640">Anil argia</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index cf5fe6835..28387f4 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">حافظه کافی برای باز کردن این صفحه وجود ندارد</translation> <translation id="6259156558325130047">&انجام مجدد ترتیببندی مجدد</translation> <translation id="6263376278284652872">نشانکهای <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">بههرحال بارگیری شود</translation> <translation id="6264485186158353794">بازگشت به ایمنی</translation> <translation id="6265794661083428563">کپی کردن مقدار خطمشی <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">سبز دودی روشن</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 0518814..609033d 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">Muisti ei riitä sivun avaamiseen</translation> <translation id="6259156558325130047">&Toista uudelleenjärjestely</translation> <translation id="6263376278284652872">Verkkotunnuksen <ph name="DOMAIN" /> kirjanmerkit</translation> +<translation id="6264376385120300461">Lataa silti</translation> <translation id="6264485186158353794">Takaisin suojaukseen</translation> <translation id="6265794661083428563">Kopioi käytännön <ph name="POLICY_NAME" /> arvo</translation> <translation id="6266934640124581640">Vaaleanturkoosi</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 6eac1f1..d96fd77a 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Hindi sapat ang memory upang mabuksan ang page na ito</translation> <translation id="6259156558325130047">&Gawing Muli ang Pagbabago sa Ayos</translation> <translation id="6263376278284652872">Mga bookmark ng <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">I-download pa rin</translation> <translation id="6264485186158353794">Bumalik sa safety</translation> <translation id="6265794661083428563">Kopyahin ang value ng patakarang <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Light Teal</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 45d708a..6c202d0 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -421,6 +421,7 @@ <translation id="2040894699575719559">Lieu bloqué</translation> <translation id="2042213636306070719">Bac 7</translation> <translation id="204357726431741734">Connectez-vous pour utiliser les mots de passe enregistrés dans votre compte Google</translation> +<translation id="2048261947532620704">Traduction de la page en cours…</translation> <translation id="205212645995975601">Barbecue et grillades</translation> <translation id="2053111141626950936">Les pages en <ph name="LANGUAGE" /> ne seront pas traduites.</translation> <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour tous les jours.}=1{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour tous les jours.}one{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour chaque {NUM_DAYS} jour.}other{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour tous les {NUM_DAYS} jours.}}</translation> @@ -1939,6 +1940,7 @@ <translation id="6254436959401408446">Mémoire insuffisante pour ouvrir cette page</translation> <translation id="6259156558325130047">&Rétablir la réorganisation</translation> <translation id="6263376278284652872">Favoris de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Télécharger quand même</translation> <translation id="6264485186158353794">Retour à la sécurité</translation> <translation id="6265794661083428563">Copier la valeur de la politique <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Bleu sarcelle clair</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 6e7f5b5b2..951eb58f2 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Mémoire insuffisante pour ouvrir cette page</translation> <translation id="6259156558325130047">&Rétablir la réorganisation</translation> <translation id="6263376278284652872">Favoris de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Télécharger quand même</translation> <translation id="6264485186158353794">Revenir en lieu sûr</translation> <translation id="6265794661083428563">Copier la valeur de la règle <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Turquoise clair</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index fbf290f..65187ef 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Non hai memoria suficiente para abrir esta páxina</translation> <translation id="6259156558325130047">&Refacer o cambio de orde</translation> <translation id="6263376278284652872">Marcadores de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Descargar de todos os modos</translation> <translation id="6264485186158353794">Volver para estar a salvo</translation> <translation id="6265794661083428563">Copiar o valor da política <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Turquesa claro</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 7123dd3..52bda229 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -1941,6 +1941,7 @@ <translation id="6254436959401408446">આ પેજ ખોલવા માટે પૂરતી મેમરી નથી</translation> <translation id="6259156558325130047">&પુનઃક્રમાંકિત કરવું ફરી કરો</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> બુકમાર્ક</translation> +<translation id="6264376385120300461">તેમ છતાં ડાઉનલોડ કરો</translation> <translation id="6264485186158353794">સુરક્ષા પર પાછા</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> નીતિનું મૂલ્ય કૉપિ કરો</translation> <translation id="6266934640124581640">આછો મોરપીંછ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 34dfba7..4e608af 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">यह पेज खोलने के लिए ज़रूरी जगह नहीं है</translation> <translation id="6259156558325130047">&पुन: क्रमित करना फिर से करें</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> बुकमार्क</translation> +<translation id="6264376385120300461">फिर भी डाउनलोड करें</translation> <translation id="6264485186158353794">वापस सुरक्षित पेज पर जाएं</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> नीति कॉपी करें</translation> <translation id="6266934640124581640">हल्का नीला-हरा</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index e4a20b7e..d1f9a9e 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Nema dovoljno memorije za otvaranje ove stranice</translation> <translation id="6259156558325130047">&Ponovi promjenu rasporeda</translation> <translation id="6263376278284652872">Oznake domene <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Svejedno preuzmi</translation> <translation id="6264485186158353794">Natrag u sigurnost</translation> <translation id="6265794661083428563">Kopiraj vrijednost pravila <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Svijetlotirkiznoplava</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index f6b7cd0..a40e36d 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -1937,6 +1937,7 @@ <translation id="6254436959401408446">Nincs elég memória az oldal megnyitásához</translation> <translation id="6259156558325130047">&Átrendezés újra</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> könyvjelzők</translation> +<translation id="6264376385120300461">Letöltés mindenképpen</translation> <translation id="6264485186158353794">Vissza a biztonsághoz</translation> <translation id="6265794661083428563">A(z) <ph name="POLICY_NAME" /> házirend értékének másolása</translation> <translation id="6266934640124581640">Világos pávakék</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index b91bc635..23df8aba 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -911,6 +911,7 @@ <translation id="3427342743765426898">&Վերարկել փոփոխումը</translation> <translation id="342781501876943858">Խորհուրդ ենք տալիս վերակայել ձեր գաղտնաբառը, եթե այն օգտագործել եք այլ կայքերում:</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates կանոնի սերվերի ձևանմուշների URI-ներից առնվազն մեկն անվավեր է և չի կարող օգտագործվել:</translation> +<translation id="3431216045099978607">Լիաէկրան ռեժիմից դուրս գալու և ներբեռնումը տեսնելու համար սեղմեք |<ph name="ACCELERATOR" />|։</translation> <translation id="3431636764301398940">Պահել քարտն այս սարքում</translation> <translation id="3432601291244612633">Փակել էջը</translation> <translation id="3435738964857648380">Անվտանգություն</translation> @@ -1940,6 +1941,7 @@ <translation id="6254436959401408446">Այս էջը բացելու համար բավարար տարածք չկա</translation> <translation id="6259156558325130047">&Վերարկել վերադասավորումը</translation> <translation id="6263376278284652872"><ph name="DOMAIN" />-ի էջանիշներ</translation> +<translation id="6264376385120300461">Ներբեռնել</translation> <translation id="6264485186158353794">Վերադառնալ անվտանգության</translation> <translation id="6265794661083428563">Պատճենել <ph name="POLICY_NAME" /> կանոնի արժեքը</translation> <translation id="6266934640124581640">Բաց փիրուզագույն</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 9cdb830..f3d30f5 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Tidak cukup memori untuk membuka halaman ini</translation> <translation id="6259156558325130047">&Ulangi Pengaturan Ulang</translation> <translation id="6263376278284652872">Bookmark <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Tetap download</translation> <translation id="6264485186158353794">Kembali agar aman</translation> <translation id="6265794661083428563">Salin nilai kebijakan <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Hijau Kebiruan Terang</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 76d9a7b..a9c352d 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Ekki nóg minni til að birta þessa síðu</translation> <translation id="6259156558325130047">Endu&rtaka nýja röðun</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> bókamerki</translation> +<translation id="6264376385120300461">Sækja samt</translation> <translation id="6264485186158353794">Aftur í öruggt skjól</translation> <translation id="6265794661083428563">Afrita gildi <ph name="POLICY_NAME" /> reglunnar</translation> <translation id="6266934640124581640">Ljósgrænblár</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 7e4b62f7..a384689 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1935,6 +1935,7 @@ <translation id="6254436959401408446">Impossibile aprire la pagina. Memoria insufficiente.</translation> <translation id="6259156558325130047">&Ripeti ridisposizione</translation> <translation id="6263376278284652872">Segnalibri di <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Scarica comunque</translation> <translation id="6264485186158353794">Torna nell'area protetta</translation> <translation id="6265794661083428563">Copia il valore del criterio <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Verde acqua</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index fc0662f..890b23d 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1944,6 +1944,7 @@ <translation id="6254436959401408446">אין מספיק זיכרון כדי לפתוח את הדף</translation> <translation id="6259156558325130047">&ביצוע מחדש של שינוי סדר</translation> <translation id="6263376278284652872">סימניות <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">להוריד בכל זאת</translation> <translation id="6264485186158353794">חזרה לחוף מבטחים</translation> <translation id="6265794661083428563">העתקת ערך המדיניות <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">כחול-ירקרק בהיר</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index ebd3ebb8..00eb6f78 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">メモリが不足しているため、このページを開けません</translation> <translation id="6259156558325130047">順序変更のやり直し(&R)</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> のブックマーク</translation> +<translation id="6264376385120300461">ダウンロードを続行</translation> <translation id="6264485186158353794">セキュリティで保護されたページに戻る</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> ポリシーの値をコピーします</translation> <translation id="6266934640124581640">ライトティール</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 1e6f88f..dd718c9 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -1941,6 +1941,7 @@ <translation id="6254436959401408446">ამ გვერდის გასახსნელად მეხსიერება არასაკმარისია</translation> <translation id="6259156558325130047">გადალაგების &გამეორება</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> სანიშნე</translation> +<translation id="6264376385120300461">მაინც ჩამოტვირთვა</translation> <translation id="6264485186158353794">უსაფრთხოებაზე დაბრუნება</translation> <translation id="6265794661083428563">„<ph name="POLICY_NAME" />“ წესების მნიშვნელობის კოპირება</translation> <translation id="6266934640124581640">ღია ზურმუხტისფერი</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 828c361..2c11695d5 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Бұл бетті ашу үшін жад жеткіліксіз</translation> <translation id="6259156558325130047">&Қайта ретке келтіру әрекетін қайталау</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> бетбелгілері</translation> +<translation id="6264376385120300461">Сонда да жүктеп алу</translation> <translation id="6264485186158353794">Қауіпсіз аймаққа қайту</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> саясатының мәнін көшіру</translation> <translation id="6266934640124581640">Ашық көкшіл жасыл</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index f3211f4..da411151 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -1943,6 +1943,7 @@ <translation id="6254436959401408446">មិនមានទំហំអង្គចងចាំគ្រប់គ្រាន់ដើម្បីបើកទំព័រនេះទេ</translation> <translation id="6259156558325130047">ធ្វើការតម្រៀបឡើងវិញ</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> ចំណាំ</translation> +<translation id="6264376385120300461">មិនអីទេ ទាញយកចុះ</translation> <translation id="6264485186158353794">ត្រលប់ទៅកន្លែងសុវត្ថិភាព</translation> <translation id="6265794661083428563">ចម្លងតម្លៃគោលការណ៍ <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">បៃតងស្រាល</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 084fd5187..d76bad4 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -420,6 +420,7 @@ <translation id="2040894699575719559">ಸ್ಥಳವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="2042213636306070719">ಟ್ರೇ 7</translation> <translation id="204357726431741734">ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> +<translation id="2048261947532620704">ಅನುವಾದ ಪುಟ</translation> <translation id="205212645995975601">BBQ ಮತ್ತು ಗ್ರಿಲ್ಲಿಂಗ್</translation> <translation id="2053111141626950936"><ph name="LANGUAGE" />ಭಾಷೆಯಲ್ಲಿರುವ ಪುಟಗಳು ಅನುವಾದಕ್ಕೊಳಪಡುವುದಿಲ್ಲ.</translation> <translation id="2053373601901562871">{NUM_DAYS,plural, =0{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿದಿನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}=1{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿದಿನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}one{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿ {NUM_DAYS} ದಿನಗಳಿಗೆ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}other{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿ {NUM_DAYS} ದಿನಗಳಿಗೆ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}}</translation> @@ -1935,6 +1936,7 @@ <translation id="6254436959401408446">ಈ ಪುಟವನ್ನು ತೆರೆಯಲು ಸಾಕಷ್ಟು ಮೆಮೊರಿ ಇಲ್ಲ</translation> <translation id="6259156558325130047">&ಮರುಕ್ರಮಗೊಳಿಸುವುದನ್ನು ಮತ್ತೆಮಾಡು</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> ಬುಕ್ಮಾರ್ಕ್ಗಳು</translation> +<translation id="6264376385120300461">ಹೇಗಿದ್ದರೂ ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="6264485186158353794">ಸುರಕ್ಷತೆಗೆ ಹಿಂದಿರುಗಿ</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯ ಮೌಲ್ಯವನ್ನು ನಕಲಿಸಿ</translation> <translation id="6266934640124581640">ತಿಳಿ ಕೆನ್ನೀಲಿ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index b719570..0bb8eba 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">페이지를 열기 위한 메모리가 충분하지 않음</translation> <translation id="6259156558325130047">재정렬 다시 실행(&R)</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> 북마크</translation> +<translation id="6264376385120300461">무시하고 다운로드</translation> <translation id="6264485186158353794">안전한 페이지로 돌아가기</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> 정책값 복사하기</translation> <translation id="6266934640124581640">연한 청록색</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index b2eb006..a30549e 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Бул баракчаны ачууга эстутум жетишсиз</translation> <translation id="6259156558325130047">Иреттештирүүнү &кайталоо</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> кыстармалар</translation> +<translation id="6264376385120300461">Баары бир жүктөп алуу</translation> <translation id="6264485186158353794">Коопсуздукка кайтуу</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> саясатынын маанисин көчүрүү</translation> <translation id="6266934640124581640">Мала көгүш жашыл</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 3391a76..95e7e1e0 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">ບໍ່ມີຄວາມຈຳພຽງພໍເພື່ອເປີດໜ້ານີ້</translation> <translation id="6259156558325130047">ເຮັດຄືນຄໍາສັ່ງຈັດລໍາດັບຄືນ</translation> <translation id="6263376278284652872">ບຸກມາກສ໌ <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">ຢືນຢັນການດາວໂຫຼດ</translation> <translation id="6264485186158353794">ກັບຄືນສູ່ຄາມປອດໄພ</translation> <translation id="6265794661083428563">ສຳເນົາຄ່ານະໂຍບາຍ <ph name="POLICY_NAME" /> ໄວ້</translation> <translation id="6266934640124581640">ສີຂຽວອົມຟ້າຈາງ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 02788fc..46c71f0 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">Nepakanka atminties, kad būtų galima atidaryti šį puslapį</translation> <translation id="6259156558325130047">&Pertvarkyti dar kartą</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> žymės</translation> +<translation id="6264376385120300461">Vis tiek atsisiųsti</translation> <translation id="6264485186158353794">Grįžti prie saugumo</translation> <translation id="6265794661083428563">Nukopijuoti politikos „<ph name="POLICY_NAME" />“ vertę</translation> <translation id="6266934640124581640">Šviesi žalsvai mėlyna</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index d38a295..7e6dbfe9 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Nav pietiekami daudz vietas atmiņā, lai atvērtu šo lapu</translation> <translation id="6259156558325130047">&Pārkārtošanas atsaukuma atcelšana</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> grāmatzīmes</translation> +<translation id="6264376385120300461">Tomēr lejupielādēt</translation> <translation id="6264485186158353794">Atpakaļ drošībā</translation> <translation id="6265794661083428563">Kopēt politikas <ph name="POLICY_NAME" /> vērtību</translation> <translation id="6266934640124581640">Gaiši zilganzaļa</translation> @@ -2055,6 +2056,7 @@ <translation id="6591833882275308647">Jūsu <ph name="DEVICE_TYPE" /> ierīce netiek pārvaldīta</translation> <translation id="6592952801936330159">Poga ”Pārvaldīt vietnes iestatījumus”: nospiediet ievadīšanas taustiņu, lai Chrome iestatījumos pārvaldītu atļaujas un datus, kas tiek glabāti vietnēs.</translation> <translation id="6596325263575161958">Šifrēšanas opcijas</translation> +<translation id="6599642189720630047">Izsekotie produkti</translation> <translation id="6609880536175561541">Prc7 (aploksne)</translation> <translation id="6611723696964473273">Ekonomikas ziņas</translation> <translation id="6612010098632894193">Tiešsaistes video</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 21e2c9f..e9fa711 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -421,6 +421,7 @@ <translation id="2040894699575719559">Локацијата е блокирана</translation> <translation id="2042213636306070719">Фиока 7</translation> <translation id="204357726431741734">Најавете се за да користите лозинки зачувани во вашата сметка на Google</translation> +<translation id="2048261947532620704">Страницата се преведува</translation> <translation id="205212645995975601">Скари и грил</translation> <translation id="2053111141626950936">Страниците на <ph name="LANGUAGE" /> нема да се преведуваат.</translation> <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секој ден.}=1{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секој ден.}one{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секој {NUM_DAYS} ден.}other{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секои {NUM_DAYS} дена.}}</translation> @@ -911,6 +912,7 @@ <translation id="3427342743765426898">&Повтори уредување</translation> <translation id="342781501876943858">Chromium препорачува ресетирање на лозинката ако повторно сте ја употребиле на други сајтови.</translation> <translation id="3428151540071562330">Една или повеќе од шаблонските URI на серверот DnsOverHttpsTemplates се неважечки и нема да се користат.</translation> +<translation id="3431216045099978607">Притиснете |<ph name="ACCELERATOR" />| за да излезете од целиот екран и да го видите преземањето.</translation> <translation id="3431636764301398940">Зачувај ја картичкава на уредов</translation> <translation id="3432601291244612633">Затвори ја страницата</translation> <translation id="3435738964857648380">Безбедност</translation> @@ -1939,6 +1941,7 @@ <translation id="6254436959401408446">Нема доволно меморија за да се отвори страницава</translation> <translation id="6259156558325130047">&Повтори прередување</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> обележувачи</translation> +<translation id="6264376385120300461">Сепак преземи</translation> <translation id="6264485186158353794">Назад во безбедност</translation> <translation id="6265794661083428563">Копирај ја вредноста на правилото <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Светла синозелена</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 4b156312..cd1b906 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">ഈ പേജ് തുറക്കാൻ മതിയായ മെമ്മറി ഇല്ല</translation> <translation id="6259156558325130047">&പുനഃക്രമീകരിക്കുന്നത് വീണ്ടും ചെയ്യുക</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> ബുക്ക്മാർക്കുകൾ</translation> +<translation id="6264376385120300461">എന്തായാലും ഡൗൺലോഡ് ചെയ്യുക</translation> <translation id="6264485186158353794">തിരികെ സുരക്ഷയിലേക്ക്</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> നയത്തിന്റെ മൂല്യം പകർത്തുക</translation> <translation id="6266934640124581640">ഇളം ടീൽ</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index a9387e1..1c059246 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Энэ хуудсыг нээхэд санах ойн багтаамж хүрэлцэхгүй байна</translation> <translation id="6259156558325130047">& Дахин эрэмбэлэх үйлдлийг дахин хийх</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> хавчуургууд</translation> +<translation id="6264376385120300461">Ямартай ч татах</translation> <translation id="6264485186158353794">Аюулгүй байдалд буцах</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> удирдамжийн утгыг хуулах</translation> <translation id="6266934640124581640">Цайвар номин ногоон</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 4bde764..28cbb35c 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">हे पृष्ठ उघडण्यासाठी पुरेशी मेमरी नाही</translation> <translation id="6259156558325130047">&पुनर्क्रमित करा पुन्हा करा</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> बुकमार्क</translation> +<translation id="6264376385120300461">तरीही डाउनलोड करा</translation> <translation id="6264485186158353794">सुरक्षिततेकडे परत</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> धोरणाचे मूल्य कॉपी करा</translation> <translation id="6266934640124581640">फिकट हिरवट निळा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index ef7cdee2..a8d9b27 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -1941,6 +1941,7 @@ <translation id="6254436959401408446">Memori tidak mencukupi untuk membuka halaman ini</translation> <translation id="6259156558325130047">&Buat Asal Susun Semula</translation> <translation id="6263376278284652872">Penanda halaman <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Muat turun juga</translation> <translation id="6264485186158353794">Kembali ke keselamatan</translation> <translation id="6265794661083428563">Salin nilai dasar <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Hijau Kebiruan Cerah</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index ef67188..ac2c47d 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -914,6 +914,7 @@ <translation id="3427342743765426898">&တည်းဖြတ်မှု ပြန်လုပ်ရန်</translation> <translation id="342781501876943858">အခြားဝဘ်ဆိုက်များတွင် သင့်စကားဝှက်ကို ပြန်သုံးထားပါက ၎င်းကို ပြင်ဆင်သတ်မှတ်ရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates ဆာဗာ နမူနာပုံစံ URI များအနက် တစ်ခုနှင့်အထက် မှားနေသဖြင့် အသုံးပြုမည်မဟုတ်ပါ။</translation> +<translation id="3431216045099978607">ဖန်သားပြင် အပြည့်မှ ထွက်ပြီး ဒေါင်းလုဒ်ကို ကြည့်ရန် |<ph name="ACCELERATOR" />| ကို နှိပ်ပါ။</translation> <translation id="3431636764301398940">ဤကဒ်ကို ဤစက်ပစ္စည်းတွင် သိမ်းရန်</translation> <translation id="3432601291244612633">စာမျက်နှာကို ပိတ်ရန်</translation> <translation id="3435738964857648380">လုံခြုံရေး</translation> @@ -1940,6 +1941,7 @@ <translation id="6254436959401408446">ဤစာမျက်နှာကို ဖွင့်ရန် မှတ်ဉာဏ် အလုံအလောက်မရှိပါ</translation> <translation id="6259156558325130047">&ပြန်လည်မှာယူမှုကို ပြန်လုပ်ရန်</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> စာညှပ်များ</translation> +<translation id="6264376385120300461">မည်သို့ပင်ဖြစ်စေ ဒေါင်းလုဒ်လုပ်ရန်</translation> <translation id="6264485186158353794">လုံခြုံရာ နောက်သို့</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> မူဝါဒ သတ်မှတ်ချက်ကို မိတ္တူကူးရန်</translation> <translation id="6266934640124581640">စိမ်းပြာဖျော့</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 81f6067..9d5ae1f2 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -1937,6 +1937,7 @@ <translation id="6254436959401408446">यो पृष्ठ खोल्नका लागि पर्याप्त मेमोरी छैन</translation> <translation id="6259156558325130047">क्रम परिवर्तन गर्ने कार्य &पुन: गर्नुहोस्</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> बुकमार्कहरू</translation> +<translation id="6264376385120300461">जे भए पनि डाउनलोड गर्नुहोस्</translation> <translation id="6264485186158353794">सुरक्षामा फर्कनुहोस्</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> नीतिको मान कपी गर्नुहोस्</translation> <translation id="6266934640124581640">हल्का निलो र हरियो</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 04cf5549..6917059 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -1933,6 +1933,7 @@ <translation id="6254436959401408446">Onvoldoende geheugen om deze pagina te openen</translation> <translation id="6259156558325130047">&Opnieuw volgorde wijzigen</translation> <translation id="6263376278284652872">Bookmarks voor <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Toch downloaden</translation> <translation id="6264485186158353794">Terug naar veilige website</translation> <translation id="6265794661083428563">Kopieer de waarde van het <ph name="POLICY_NAME" />-beleid</translation> <translation id="6266934640124581640">Lichtblauwgroen</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index b03d4208..93c1696c 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -911,6 +911,7 @@ <translation id="3427342743765426898">&Endre likevel</translation> <translation id="342781501876943858">Chromium anbefaler at du tilbakestiller passordet ditt hvis du også har brukt det på andre nettsteder.</translation> <translation id="3428151540071562330">Én eller flere av URI-ene for DnsOverHttpsTemplates-tjenermaler er ugyldige og blir ikke brukt.</translation> +<translation id="3431216045099978607">Trykk på |<ph name="ACCELERATOR" />| for å avslutte fullskjerm og se nedlastingen.</translation> <translation id="3431636764301398940">Lagre dette kortet på denne enheten</translation> <translation id="3432601291244612633">Lukk siden</translation> <translation id="3435738964857648380">Sikkerhet</translation> @@ -1939,6 +1940,7 @@ <translation id="6254436959401408446">Det er ikke nok minne til å åpne denne siden</translation> <translation id="6259156558325130047">&Omorganiser likevel</translation> <translation id="6263376278284652872"><ph name="DOMAIN" />-bokmerker</translation> +<translation id="6264376385120300461">Last ned likevel</translation> <translation id="6264485186158353794">Tilbake til trygg grunn</translation> <translation id="6265794661083428563">Kopiér verdien av <ph name="POLICY_NAME" />-regelen</translation> <translation id="6266934640124581640">Lys blågrønn</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 5febc14..e57bb6c 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -1937,6 +1937,7 @@ <translation id="6254436959401408446">ଏହି ପୃଷ୍ଠା ଖୋଲିବା ପାଇଁ ପର୍ଯ୍ୟାପ୍ତ ମେମୋରୀ ନାହିଁ</translation> <translation id="6259156558325130047">&ରି-ଡୁକୁ ପୁନଃକ୍ରମରେ ରଖନ୍ତୁ</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> ବୁକମାର୍କଗୁଡ଼ିକ</translation> +<translation id="6264376385120300461">ଯେ କୌଣସି ମତେ ଡାଉନଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="6264485186158353794">ନିରାପତ୍ତାକୁ ଫେରନ୍ତୁ</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> ନୀତିର ମୂଲ୍ୟ କପି କରନ୍ତୁ</translation> <translation id="6266934640124581640">ହାଲ୍କା ଟିଲ୍</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 8bc5ee3a..b7fbfc00 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -421,6 +421,7 @@ <translation id="2040894699575719559">ਟਿਕਾਣਾ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation> <translation id="2042213636306070719">ਟ੍ਰੇਅ 7</translation> <translation id="204357726431741734">ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਵਰਤਣ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> +<translation id="2048261947532620704">ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="205212645995975601">BBQ ਅਤੇ ਗ੍ਰਿਲਿੰਗ</translation> <translation id="2053111141626950936"><ph name="LANGUAGE" /> ਭਾਸ਼ਾ ਵਾਲੇ ਪੰਨਿਆਂ ਦਾ ਅਨੁਵਾਦ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="2053373601901562871">{NUM_DAYS,plural, =0{ਇਸ ਕੰਟਰੋਲ ਦੇ ਚਾਲੂ ਹੋਣ ਅਤੇ ਸਥਿਤੀ ਦੇ ਕਿਰਿਆਸ਼ੀਲ ਹੋਣ 'ਤੇ, Chrome ਨਿਰਧਾਰਿਤ ਕਰਦਾ ਹੈ ਤੁਹਾਡੀ ਹਾਲੀਆ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਸਭ ਤੋਂ ਜ਼ਿਆਦਾ ਲੋਕਾਂ ਦੇ ਕਿਹੜੇ ਵੱਡੇ ਗਰੁੱਪ ਜਾਂ "ਸਮਗੁਣ" ਦੇ ਸਮਾਨ ਹੈ। ਵਿਗਿਆਪਨਦਾਤੇ ਗਰੁੱਪ ਲਈ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹਨ ਅਤੇ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਨਿੱਜੀ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਗਰੁੱਪ ਨੂੰ ਹਰ ਰੋਜ਼ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।}=1{ਇਸ ਕੰਟਰੋਲ ਦੇ ਚਾਲੂ ਹੋਣ ਅਤੇ ਸਥਿਤੀ ਦੇ ਕਿਰਿਆਸ਼ੀਲ ਹੋਣ 'ਤੇ, Chrome ਨਿਰਧਾਰਿਤ ਕਰਦਾ ਹੈ ਤੁਹਾਡੀ ਹਾਲੀਆ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਸਭ ਤੋਂ ਜ਼ਿਆਦਾ ਲੋਕਾਂ ਦੇ ਕਿਹੜੇ ਵੱਡੇ ਗਰੁੱਪ ਜਾਂ "ਸਮਗੁਣ" ਦੇ ਸਮਾਨ ਹੈ। ਵਿਗਿਆਪਨਦਾਤੇ ਗਰੁੱਪ ਲਈ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹਨ ਅਤੇ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਨਿੱਜੀ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਗਰੁੱਪ ਨੂੰ ਹਰ ਰੋਜ਼ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।}other{ਇਸ ਕੰਟਰੋਲ ਦੇ ਚਾਲੂ ਹੋਣ ਅਤੇ ਸਥਿਤੀ ਦੇ ਕਿਰਿਆਸ਼ੀਲ ਹੋਣ 'ਤੇ, Chrome ਨਿਰਧਾਰਿਤ ਕਰਦਾ ਹੈ ਤੁਹਾਡੀ ਹਾਲੀਆ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਸਭ ਤੋਂ ਜ਼ਿਆਦਾ ਲੋਕਾਂ ਦੇ ਕਿਹੜੇ ਵੱਡੇ ਗਰੁੱਪ ਜਾਂ "ਸਮਗੁਣ" ਦੇ ਸਮਾਨ ਹੈ। ਵਿਗਿਆਪਨਦਾਤੇ ਗਰੁੱਪ ਲਈ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹਨ ਅਤੇ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਨਿੱਜੀ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਗਰੁੱਪ ਨੂੰ ਹਰ {NUM_DAYS} ਦਿਨਾਂ ਬਾਅਦ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।}}</translation> @@ -1935,6 +1936,7 @@ <translation id="6254436959401408446">ਇਸ ਪੰਨੇ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਲੋੜੀਂਦੀ ਮੈਮੋਰੀ ਨਹੀਂ ਹੈ</translation> <translation id="6259156558325130047">&ਦੁਬਾਰਾ ਕ੍ਰਮ ਦੇਣ ਨੂੰ ਰੀਡੂ ਕਰੋ</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> ਬੁੱਕਮਾਰਕਸ</translation> +<translation id="6264376385120300461">ਫਿਰ ਵੀ ਡਾਊਨਲੋਡ ਕਰੋ</translation> <translation id="6264485186158353794">ਸੁਰੱਖਿਆ 'ਤੇ ਵਾਪਸ ਜਾਓ</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> ਨੀਤੀ ਦਾ ਮੁੱਲ ਕਾਪੀ ਕਰੋ</translation> <translation id="6266934640124581640">ਹਲਕਾ ਹਰਾ-ਨੀਲਾ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 6a08deb..7b28066 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1941,6 +1941,7 @@ <translation id="6254436959401408446">Za mało pamięci, by otworzyć tę stronę</translation> <translation id="6259156558325130047">&Ponów zmianę kolejności</translation> <translation id="6263376278284652872">Zakładki <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Pobierz mimo to</translation> <translation id="6264485186158353794">Wróć do bezpieczeństwa</translation> <translation id="6265794661083428563">Skopiuj wartość zasad: <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Jasny morski</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 526f2f0..d863fc9 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -421,6 +421,7 @@ <translation id="2040894699575719559">Acesso ao local bloqueado</translation> <translation id="2042213636306070719">Bandeja 7</translation> <translation id="204357726431741734">Faça login para usar as senhas salvas na sua Conta do Google</translation> +<translation id="2048261947532620704">Traduzindo página</translation> <translation id="205212645995975601">Churrasco e grelhados</translation> <translation id="2053111141626950936">Páginas em <ph name="LANGUAGE" /> não serão traduzidas.</translation> <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado todos os dias.}=1{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado todos os dias.}one{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado a cada {NUM_DAYS} dia.}other{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado a cada {NUM_DAYS} dias.}}</translation> @@ -911,6 +912,7 @@ <translation id="3427342743765426898">&Refazer editar</translation> <translation id="342781501876943858">O Chromium recomenda redefinir sua senha se você a reutilizou em outros sites.</translation> <translation id="3428151540071562330">Um ou mais dos URIs de modelo de servidor da DnsOverHttpsTemplates é inválido e não será usado.</translation> +<translation id="3431216045099978607">Pressione |<ph name="ACCELERATOR" />| para sair da tela cheia e ver o download.</translation> <translation id="3431636764301398940">Salvar este cartão neste dispositivo</translation> <translation id="3432601291244612633">Fechar página</translation> <translation id="3435738964857648380">Segurança</translation> @@ -1939,6 +1941,7 @@ <translation id="6254436959401408446">Não há memória suficiente para abrir essa página</translation> <translation id="6259156558325130047">&Refazer reordenar</translation> <translation id="6263376278284652872">Favoritos de <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Fazer o download mesmo assim</translation> <translation id="6264485186158353794">Voltar à segurança</translation> <translation id="6265794661083428563">Copiar o valor da política <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Verde-água</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 49d0bab..3971cd90 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">Não existe memória suficiente para abrir esta página</translation> <translation id="6259156558325130047">&Refazer reordenação</translation> <translation id="6263376278284652872">Marcadores do <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Transferir mesmo assim</translation> <translation id="6264485186158353794">Voltar para segurança</translation> <translation id="6265794661083428563">Copie o valor da política <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Azul esverdeado claro</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 06cc8f7..740f5af 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Nu există suficientă memorie pentru a deschide pagina</translation> <translation id="6259156558325130047">&Repetați reordonarea</translation> <translation id="6263376278284652872">Marcaje <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Descarcă oricum</translation> <translation id="6264485186158353794">Înapoi la zona sigură</translation> <translation id="6265794661083428563">Copiază valoarea pentru politica <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Turcoaz deschis</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index faa2171..8291332 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Недостаточно памяти для загрузки страницы</translation> <translation id="6259156558325130047">&Повторить изменение порядка</translation> <translation id="6263376278284652872">Закладки <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Все равно скачать</translation> <translation id="6264485186158353794">Вернуться к безопасной странице</translation> <translation id="6265794661083428563">Копировать значение правила <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Светло-бирюзовый</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 9dbfe44..0ba5a8a 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">මෙම පිටුව විවෘත කිරීමට ප්රමාණවත් තරම් මතකයක් නැත</translation> <translation id="6259156558325130047">යළි ඇනවුම් කිරීම &යළි කරන්න</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> පොත්සලකුණු</translation> +<translation id="6264376385120300461">කෙසේ වුවත් බාගන්න</translation> <translation id="6264485186158353794">ආරක්ෂාව වෙත ආපසු</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> ප්රතිපත්තියේ අගය පිටපත් කරන්න</translation> <translation id="6266934640124581640">ලා හරිත නිල්</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index dcb3400..7c405b6d 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -1934,6 +1934,7 @@ <translation id="6254436959401408446">Na otvorenie stránky nie je dostatok pamäte</translation> <translation id="6259156558325130047">&Znova zmeniť poradie</translation> <translation id="6263376278284652872">Záložky domény <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Napriek tomu stiahnuť</translation> <translation id="6264485186158353794">Späť do bezpečia</translation> <translation id="6265794661083428563">Skopírovať hodnotu pravidla <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Svetlá modrozelená</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index cd05e87..dd6bb3d 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Ni dovolj pomnilnika za odpiranje te strani</translation> <translation id="6259156558325130047">&Uveljavi razvrstitev</translation> <translation id="6263376278284652872">Zaznamki <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Vseeno prenesi</translation> <translation id="6264485186158353794">Nazaj na varno</translation> <translation id="6265794661083428563">Kopiranje vrednosti pravilnika <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Svetlo zelenomodra</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 62c5cce..ff741bf 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -911,6 +911,7 @@ <translation id="3427342743765426898">&Ribëj redaktimin</translation> <translation id="342781501876943858">Chromium rekomandon rivendosjen e fjalëkalimit tënd nëse e ke ripërdorur në sajte të tjera.</translation> <translation id="3428151540071562330">Një ose disa nga URI-të e shablloneve të serverit DnsOverHttpsTemplates janë të pavlefshme dhe nuk do të përdoren.</translation> +<translation id="3431216045099978607">Shtyp |<ph name="ACCELERATOR" />| për të dalë nga ekrani i plotë dhe për të parë shkarkimin.</translation> <translation id="3431636764301398940">Ruaje këtë kartë në këtë pajisje</translation> <translation id="3432601291244612633">Mbyll faqen</translation> <translation id="3435738964857648380">Siguria</translation> @@ -1938,6 +1939,7 @@ <translation id="6254436959401408446">Nuk ka memorie të mjaftueshme për të hapur këtë faqe</translation> <translation id="6259156558325130047">&Ribëj riporosinë</translation> <translation id="6263376278284652872">Faqeshënuesit e <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Shkarkoje gjithsesi</translation> <translation id="6264485186158353794">Kthehu aty ku je i sigurt</translation> <translation id="6265794661083428563">Kopjo vlerën e politikës së <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Gurkali e çelur</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 62078e7c..e26ebdc 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Nema dovoljno memorije za otvaranje ove stranice</translation> <translation id="6259156558325130047">&Ponovi promenu redosleda</translation> <translation id="6263376278284652872">Obeleživači domena <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Ipak preuzmi</translation> <translation id="6264485186158353794">Nazad na bezbedno</translation> <translation id="6265794661083428563">Kopirajte vrednost smernice <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Svetlotirkizna</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 85a430b47..2a9a777 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1938,6 +1938,7 @@ <translation id="6254436959401408446">Нема довољно меморије за отварање ове странице</translation> <translation id="6259156558325130047">&Понови промену редоследа</translation> <translation id="6263376278284652872">Обележивачи домена <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Ипак преузми</translation> <translation id="6264485186158353794">Назад на безбедно</translation> <translation id="6265794661083428563">Копирајте вредност смернице <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Светлотиркизна</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index aea090e..7900279a 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Det finns inte tillräckligt med minne för att öppna den här sidan</translation> <translation id="6259156558325130047">&Gör om Ändra ordning</translation> <translation id="6263376278284652872">Bokmärken för <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Ladda ned ändå</translation> <translation id="6264485186158353794">Tillbaka till säker webbplats</translation> <translation id="6265794661083428563">Kopierar värdet från principen för <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Ljust blågrön</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 176349d..f4cf80e 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Hakuna hifadhi ya kutosha kufungua ukurasa huu</translation> <translation id="6259156558325130047">Rudia Kupanga Upya</translation> <translation id="6263376278284652872">Alamisho za <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Pakua licha ya hayo</translation> <translation id="6264485186158353794">Rejea kwenye usalama</translation> <translation id="6265794661083428563">Nakili thamani ya sera ya <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Samawati ya Kijani Isiyokolea</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 527859a..2d727d98 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1935,6 +1935,7 @@ <translation id="6254436959401408446">பக்கத்தைத் திறப்பதற்குப் போதுமான நினைவகம் இல்லை</translation> <translation id="6259156558325130047">&மறுவரிசைப்படுத்தலை மீண்டும் செய்</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> புக்மார்க்குகள்</translation> +<translation id="6264376385120300461">பரவாயில்லை, பதிவிறக்கு</translation> <translation id="6264485186158353794">பாதுகாப்பான நிலைக்குத் திரும்பு</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> கொள்கையின் மதிப்பை நகலெடுக்கும்</translation> <translation id="6266934640124581640">வெளிர் பசும் நீலம்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 35cf01b..ab01ae0 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -1943,6 +1943,7 @@ <translation id="6254436959401408446">ఈ పేజీని తెరవడానికి తగినంత మెమరీ లేదు</translation> <translation id="6259156558325130047">&మళ్లీ క్రమం చేయడాన్ని రిపీట్ చేయి</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> బుక్మార్క్లు</translation> +<translation id="6264376385120300461">ఏదేమైనా డౌన్లోడ్ చేయండి</translation> <translation id="6264485186158353794">భద్రతకు తిరిగి వెళ్ళు</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> పాలసీ విలువను కాపీ చేయి</translation> <translation id="6266934640124581640">లేత నీలి ఆకుపచ్చ రంగు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 34855f8..149244dd 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1940,6 +1940,7 @@ <translation id="6254436959401408446">หน่วยความจำไม่เพียงพอที่จะเปิดหน้านี้</translation> <translation id="6259156558325130047">&ทำซ้ำการจัดลำดับใหม่</translation> <translation id="6263376278284652872">บุ๊กมาร์ก <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">ดาวน์โหลดต่อไป</translation> <translation id="6264485186158353794">กลับสู่ความปลอดภัย</translation> <translation id="6265794661083428563">คัดลอกค่าของนโยบาย <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">น้ำเงินอมเขียวอ่อน</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index edbcbf7..0be7c06 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Bu sayfayı açmaya yetecek kadar bellek yok</translation> <translation id="6259156558325130047">Sıralama Değişikliğini &Yeniden Yap</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> yer işaretleri</translation> +<translation id="6264376385120300461">Yine de indir</translation> <translation id="6264485186158353794">Güvenliğe geri dön</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> politikasının değerini kopyala</translation> <translation id="6266934640124581640">Açık Turkuaz</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index e2c32cc..b052670b 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">Недостатньо пам’яті, щоб відкрити цю сторінку</translation> <translation id="6259156558325130047">&Повторити перевпорядкування</translation> <translation id="6263376278284652872">Закладки <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Усе одно завантажити</translation> <translation id="6264485186158353794">Повернутися до безпечного режиму</translation> <translation id="6265794661083428563">Скопіювати значення правила <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Світло-бірюзовий</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index bbe5ef1..eed1e67 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -1943,6 +1943,7 @@ <translation id="6254436959401408446">اس صفحہ کو کھولنے کیلئے کافی میموری نہیں ہے</translation> <translation id="6259156558325130047">دوبارہ ترتیب کو &واپس لائیں</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> بُک مارکس</translation> +<translation id="6264376385120300461">بہر حال ڈاؤن لوڈ کریں</translation> <translation id="6264485186158353794">تحفظ پر واپس جائیں</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> پالیسی کی قدر کاپی کریں</translation> <translation id="6266934640124581640">ہلکا نیلگوں سبز</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index ea7e74a8..d9e130b3 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1935,6 +1935,7 @@ <translation id="6254436959401408446">Sahifani ochish uchun xotira yetishmayapti</translation> <translation id="6259156558325130047">&Qayta tartiblashni qaytarish</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> xatcho‘plari</translation> +<translation id="6264376385120300461">Baribir yuklab olish</translation> <translation id="6264485186158353794">Xavfsizlik sahifasiga qaytish</translation> <translation id="6265794661083428563"><ph name="POLICY_NAME" /> siyosati qiymatidan nusxa olish</translation> <translation id="6266934640124581640">Och moviy</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 3836d12..240fa0a 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -42,7 +42,7 @@ <translation id="1072594122896439679">Nhạc và âm thanh</translation> <translation id="1074497978438210769">Không bảo mật</translation> <translation id="1075079914415273530">Nông nghiệp và lâm nghiệp</translation> -<translation id="1080116354587839789">Vừa với chiều rộng</translation> +<translation id="1080116354587839789">Chỉnh cho vừa với chiều rộng</translation> <translation id="1081061862829655580">Khay 19</translation> <translation id="1086953900555227778">Index-5x8</translation> <translation id="1088860948719068836">Thêm tên trên thẻ</translation> @@ -1415,7 +1415,7 @@ <translation id="4811450222531576619">Tìm hiểu về nguồn và chủ đề của trang</translation> <translation id="4812751092864334025">Sản phẩm công nghệ có thể bị đeo</translation> <translation id="4813512666221746211">Lỗi mạng</translation> -<translation id="4816492930507672669">Vừa với trang</translation> +<translation id="4816492930507672669">Chỉnh cho vừa với trang</translation> <translation id="4819347708020428563">Chỉnh sửa chú thích ở chế độ xem mặc định?</translation> <translation id="4825496307559726072"><ph name="CREATE_GOOGLE_SHEET_FOCUSED_FRIENDLY_MATCH_TEXT" />, nhấn phím Tab rồi nhấn phím Enter để tạo nhanh một trang tính mới trong Google Trang tính</translation> <translation id="4825507807291741242">Mạnh mẽ</translation> @@ -1941,6 +1941,7 @@ <translation id="6254436959401408446">Không đủ bộ nhớ để mở trang này</translation> <translation id="6259156558325130047">&Làm lại sắp xếp lại</translation> <translation id="6263376278284652872">Dấu trang trên <ph name="DOMAIN" /></translation> +<translation id="6264376385120300461">Vẫn tải xuống</translation> <translation id="6264485186158353794">Quay lại an toàn</translation> <translation id="6265794661083428563">Sao chép giá trị của chính sách <ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">Xanh mòng két nhạt</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 9efef63..c75d59a 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1934,6 +1934,7 @@ <translation id="6254436959401408446">内存不足,无法打开此网页</translation> <translation id="6259156558325130047">恢复顺序调整(&R)</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> 书签</translation> +<translation id="6264376385120300461">仍然下载</translation> <translation id="6264485186158353794">返回安全连接</translation> <translation id="6265794661083428563">复制 <ph name="POLICY_NAME" /> 政策的值</translation> <translation id="6266934640124581640">浅青色</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 5baa35e..49dee5c4 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -645,6 +645,7 @@ <translation id="2649259151839507861"><ph name="CLEAR_BROWSING_DATA_FOCUSED_FRIENDLY_MATCH_TEXT" />,㩒一下 Tab 鍵,然後㩒一下 Enter 鍵就可以喺 Chrome 設定度清除瀏覽記錄、Cookie、快取同更多資料</translation> <translation id="2650446666397867134">存取檔案被拒</translation> <translation id="2653659639078652383">提交</translation> +<translation id="2657637947725373811">{0,plural, =1{要傳輸機密檔案嗎?}other{要傳輸機密檔案嗎?}}</translation> <translation id="2660779039299703961">活動</translation> <translation id="2664887757054927933">{COUNT,plural, =0{無}=1{有 1 個密碼 (<ph name="DOMAIN_LIST" />)}=2{有 2 個密碼 (<ph name="DOMAIN_LIST" />)}other{有 # 個密碼 (<ph name="DOMAIN_LIST" />)}}</translation> <translation id="2666092431469916601">返回頁首</translation> @@ -789,6 +790,7 @@ <translation id="3108943290502734357">中匣</translation> <translation id="3109728660330352905">您並未獲授權查看此網頁。</translation> <translation id="3113284927548439113">第三批</translation> +<translation id="3115363211799416195">{0,plural, =1{要下載機密檔案嗎?}other{要下載機密檔案嗎?}}</translation> <translation id="3115874930288085374"><ph name="ENROLLMENT_DOMAIN" /> 要求您備份資料,並歸還此 <ph name="DEVICE_TYPE" />。</translation> <translation id="3116158981186517402">粘合</translation> <translation id="3120730422813725195">Elo</translation> @@ -911,6 +913,7 @@ <translation id="3427342743765426898">重做編輯(&R)</translation> <translation id="342781501876943858">如果您已在其他網站上重用密碼,Chromium 建議您重設密碼。</translation> <translation id="3428151540071562330">一或多個 DnsOverHttpsTemplates 伺服器範本 URI 無效,因此系統不會採用這些伺服器範本 URI。</translation> +<translation id="3431216045099978607">按下 |<ph name="ACCELERATOR" />| 以離開全螢幕,並查看下載項目。</translation> <translation id="3431636764301398940">將這張信用卡儲存至此裝置</translation> <translation id="3432601291244612633">關閉頁面</translation> <translation id="3435738964857648380">安全性</translation> @@ -977,6 +980,7 @@ <translation id="3615877443314183785">請輸入有效的到期日</translation> <translation id="36224234498066874">清除瀏覽資料…</translation> <translation id="362276910939193118">顯示完整記錄</translation> +<translation id="3628905806504633297">{0,plural, =1{管理員政策不建議傳輸此檔案到<ph name="DESTINATION_NAME" />}other{管理員政策不建議傳輸這些檔案到<ph name="DESTINATION_NAME" />}}</translation> <translation id="3630155396527302611">如果程式已列在允許存取網絡的清單中,建議您 從清單中移除該程式,然後重新加入。</translation> <translation id="3630699740441428070">此裝置的管理員已設定您的網絡連線,此設定可允許管理員查看您的網絡流量,包括您瀏覽的網站。</translation> @@ -1336,6 +1340,7 @@ <translation id="4607603470419975064">查看 Google 提示掣,㩒一下 Enter 鍵就可以了解 Chrome 嘅功能</translation> <translation id="4607608436550361748">查看 Chrome 提示</translation> <translation id="4617273035598175554">平面設計和動畫軟件</translation> +<translation id="4622292761762557753">仍要傳輸</translation> <translation id="4627675673814409125">此政策無法設定於 Chrome 設定檔層級,因此會被忽略。</translation> <translation id="4628948037717959914">相片</translation> <translation id="4631649115723685955">已連結現金回贈</translation> @@ -1651,6 +1656,7 @@ <translation id="540969355065856584">伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證目前無效。這可能是因為設定錯誤,或有攻擊者攔截您的連線。</translation> <translation id="5412040515238827314">格式無效:輸入的值需要是模式清單。</translation> <translation id="5412236728747081950">此網站會從 Chrome 取得您的喜好,為您顯示更相關的廣告</translation> +<translation id="5412245327974352290"><ph name="TRADITIONAL_TEXT" /> - <ph name="ADDITIONAL_TEXT" /></translation> <translation id="541416427766103491">堆疊器 4</translation> <translation id="5421136146218899937">清除瀏覽數據…</translation> <translation id="5426179911063097041"><ph name="SITE" /> 要求傳送通知給您</translation> @@ -1938,6 +1944,7 @@ <translation id="6254436959401408446">記憶體不足,因此無法開啟此網頁</translation> <translation id="6259156558325130047">重做重新排序(&R)</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> 書籤</translation> +<translation id="6264376385120300461">仍要下載</translation> <translation id="6264485186158353794">返回安全連線</translation> <translation id="6265794661083428563">複製 <ph name="POLICY_NAME" /> 政策的值</translation> <translation id="6266934640124581640">淺藍綠色</translation> @@ -2582,6 +2589,7 @@ <translation id="8004582292198964060">瀏覽器</translation> <translation id="8009225694047762179">管理密碼</translation> <translation id="8012116502927253373">{NUM_CARDS,plural, =1{系統將會儲存此付款卡和帳單地址。您登入 <ph name="USER_EMAIL" /> 後便可以使用這些資料。}other{系統將會儲存這些付款卡和帳單地址。您登入 <ph name="USER_EMAIL" /> 後便可以使用這些資料。}}</translation> +<translation id="8019861005170389898"><ph name="TRADITIONAL_TEXT" /> (<ph name="ADDITIONAL_TEXT" />)</translation> <translation id="8025119109950072390">攻擊者可能會透過此網站誘使您採取一些危險的行動,例如安裝軟件或洩漏您的個人資料 (包括密碼、電話號碼或信用卡資料)。</translation> <translation id="8026334261755873520">清除瀏覽數據</translation> <translation id="8027077570865220386">紙匣 15</translation> @@ -2633,6 +2641,7 @@ <translation id="8148608574971654810">PDF 版本:</translation> <translation id="8149426793427495338">您的電腦已進入休眠狀態。</translation> <translation id="8150722005171944719">無法讀取位於 <ph name="URL" /> 的檔案。這個檔案可能已被移除或移動位置,或者檔案權限為禁止存取。</translation> +<translation id="8153865548451212769">{0,plural, =1{管理員政策不建議下載此檔案到<ph name="DESTINATION_NAME" />}other{管理員政策不建議下載這些檔案到<ph name="DESTINATION_NAME" />}}</translation> <translation id="8157295877370077682">離開網站</translation> <translation id="8163866351304776260">四孔 (左側)</translation> <translation id="8175796834047840627">由於您已登入,因此 Chrome 提議將您的付款卡儲存至 Google 帳戶。您可以在設定中變更此行為。</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 4666d3a..0a982573 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1939,6 +1939,7 @@ <translation id="6254436959401408446">記憶體不足,無法開啟這個網頁</translation> <translation id="6259156558325130047">重做重新排序(&R)</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> 書籤</translation> +<translation id="6264376385120300461">仍要下載</translation> <translation id="6264485186158353794">返回安全性瀏覽</translation> <translation id="6265794661083428563">複製 <ph name="POLICY_NAME" /> 政策的值</translation> <translation id="6266934640124581640">淺藍綠色</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 6611b2b..799c3a3 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -1936,6 +1936,7 @@ <translation id="6254436959401408446">Ayikho imemori eyanele ukuvula leli khasi</translation> <translation id="6259156558325130047">&Yenza futhi ukuhlela kabusha</translation> <translation id="6263376278284652872"><ph name="DOMAIN" /> amabhukhimakhi</translation> +<translation id="6264376385120300461">Dawuniloda noma kunjalo</translation> <translation id="6264485186158353794">Buyela ekuvikeleni</translation> <translation id="6265794661083428563">Kopisha inani lenqubomgomo ye-<ph name="POLICY_NAME" /></translation> <translation id="6266934640124581640">I-teal ekhanyayo</translation>
diff --git a/components/ui_devtools/tracing_agent.cc b/components/ui_devtools/tracing_agent.cc index d5fb365..50eeb1e 100644 --- a/components/ui_devtools/tracing_agent.cc +++ b/components/ui_devtools/tracing_agent.cc
@@ -68,8 +68,7 @@ if (TracingAgent* h = tracing_agent_.get()) h->OnTraceDataCollected(std::move(chunk)); } - void ReceiveTraceFinalContents( - std::unique_ptr<const base::DictionaryValue> metadata) { + void ReceiveTraceFinalContents() { if (TracingAgent* h = tracing_agent_.get()) h->OnTraceComplete(); } @@ -144,7 +143,7 @@ if (!tracing_session_host_) { if (endpoint_) { // Will delete |this|. - endpoint_->ReceiveTraceFinalContents(nullptr); + endpoint_->ReceiveTraceFinalContents(); } return; } @@ -220,7 +219,7 @@ std::move(pending_disable_tracing_task_).Run(); if (endpoint_) { - endpoint_->ReceiveTraceFinalContents(nullptr); + endpoint_->ReceiveTraceFinalContents(); } } @@ -268,7 +267,7 @@ if (!endpoint_) return; // Will delete |this|. - endpoint_->ReceiveTraceFinalContents(nullptr); + endpoint_->ReceiveTraceFinalContents(); } mojo::Receiver<tracing::mojom::TracingSessionClient> receiver_{this};
diff --git a/components/webapps/browser/installable/installable_metrics.cc b/components/webapps/browser/installable/installable_metrics.cc index 298b6239..07c80e7 100644 --- a/components/webapps/browser/installable/installable_metrics.cc +++ b/components/webapps/browser/installable/installable_metrics.cc
@@ -43,6 +43,7 @@ case WebappInstallSource::MENU_CUSTOM_TAB: case WebappInstallSource::OMNIBOX_INSTALL_ICON: case WebappInstallSource::SYSTEM_DEFAULT: + case WebappInstallSource::KIOSK: return true; case WebappInstallSource::MANAGEMENT_API: case WebappInstallSource::SUB_APP: @@ -80,6 +81,7 @@ case WebappInstallSource::SYSTEM_DEFAULT: case WebappInstallSource::SYNC: case WebappInstallSource::SUB_APP: + case WebappInstallSource::KIOSK: return false; case WebappInstallSource::COUNT: NOTREACHED();
diff --git a/components/webapps/browser/installable/installable_metrics.h b/components/webapps/browser/installable/installable_metrics.h index b9d952f..9277bcb 100644 --- a/components/webapps/browser/installable/installable_metrics.h +++ b/components/webapps/browser/installable/installable_metrics.h
@@ -105,6 +105,9 @@ // PWA rich install bottom sheet in WebLayer. RICH_INSTALL_UI_WEBLAYER = 20, + // Installed by Kiosk on Chrome OS. + KIOSK = 21, + // Add any new values above this one. COUNT, };
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index 00915d0..99b4eda 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -773,6 +773,7 @@ ui_request_->exclude_system_audio = controls.exclude_system_audio; ui_request_->exclude_self_browser_surface = controls.exclude_self_browser_surface; + ui_request_->preferred_display_surface = controls.preferred_display_surface; } // Creates a tab capture specific MediaStreamRequest object that is used by
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 495261c..98c2a069 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -557,6 +557,7 @@ // These checks are custom wrappers around base::FeatureList::IsEnabled // They're moved here to distinguish them from actual base checks WebRuntimeFeatures::EnableOverlayScrollbars(ui::IsOverlayScrollbarEnabled()); + WebRuntimeFeatures::EnableFluentScrollbars(ui::IsFluentScrollbarEnabled()); // TODO(rodneyding): This is a rare case for a stable feature // Need to investigate more to determine whether to refactor it.
diff --git a/content/public/browser/media_stream_request.h b/content/public/browser/media_stream_request.h index 89e3275..a299d16 100644 --- a/content/public/browser/media_stream_request.h +++ b/content/public/browser/media_stream_request.h
@@ -90,6 +90,12 @@ // tabs offered to the user. bool exclude_self_browser_surface = false; + // Flag to indicate a preference for which display surface type (screen, + // windows, or tabs) should be most prominently offered to the user. The + // browser may disregard this preference. + blink::mojom::PreferredDisplaySurface preferred_display_surface = + blink::mojom::PreferredDisplaySurface::NO_PREFERENCE; + // Flag to indicate whether the request is for PTZ use. bool request_pan_tilt_zoom_permission; };
diff --git a/content/test/attribution_simulator_impl.cc b/content/test/attribution_simulator_impl.cc index a1c8938..3ce3597 100644 --- a/content/test/attribution_simulator_impl.cc +++ b/content/test/attribution_simulator_impl.cc
@@ -16,6 +16,7 @@ #include "base/bind.h" #include "base/check.h" #include "base/files/file_path.h" +#include "base/functional/overloaded.h" #include "base/guid.h" #include "base/memory/raw_ptr.h" #include "base/numerics/safe_conversions.h" @@ -71,25 +72,17 @@ namespace { base::Time GetEventTime(const AttributionSimulationEventAndValue& event) { - struct Visitor { - base::Time operator()(const StorableSource& source) { - return source.common_info().impression_time(); - } - - base::Time operator()(const AttributionTriggerAndTime& trigger) { - return trigger.time; - } - - base::Time operator()(const AttributionSimulatorCookie& cookie) { - return cookie.cookie.CreationDate(); - } - - base::Time operator()(const AttributionDataClear& clear) { - return clear.time; - } - }; - - return absl::visit(Visitor(), event.first); + return absl::visit( + base::Overloaded{ + [](const StorableSource& source) { + return source.common_info().impression_time(); + }, + [](const AttributionTriggerAndTime& trigger) { return trigger.time; }, + [](const AttributionSimulatorCookie& cookie) { + return cookie.cookie.CreationDate(); + }, + [](const AttributionDataClear& clear) { return clear.time; }}, + event.first); } class AlwaysSetCookieChecker : public AttributionCookieChecker {
diff --git a/device/BUILD.gn b/device/BUILD.gn index 64f2e6f9..c3c4b338d 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -275,6 +275,7 @@ "bluetooth/dbus/bluetooth_gatt_application_service_provider_unittest.cc", "bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_unittest.cc", "bluetooth/floss/bluetooth_floss_unittest.cc", + "bluetooth/floss/bluetooth_socket_floss_unittest.cc", "bluetooth/floss/exported_callback_manager_unittest.cc", "bluetooth/floss/floss_adapter_client_unittest.cc", "bluetooth/floss/floss_manager_client_unittest.cc",
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn index 62f940e0..683ef73 100644 --- a/device/bluetooth/BUILD.gn +++ b/device/bluetooth/BUILD.gn
@@ -438,6 +438,8 @@ "floss/bluetooth_device_floss.h", "floss/bluetooth_pairing_floss.cc", "floss/bluetooth_pairing_floss.h", + "floss/bluetooth_socket_floss.cc", + "floss/bluetooth_socket_floss.h", "floss/exported_callback_manager.h", "floss/floss_adapter_client.cc", "floss/floss_adapter_client.h", @@ -526,6 +528,8 @@ "floss/fake_floss_adapter_client.h", "floss/fake_floss_manager_client.cc", "floss/fake_floss_manager_client.h", + "floss/fake_floss_socket_manager.cc", + "floss/fake_floss_socket_manager.h", ] } if (use_dbus) {
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.cc b/device/bluetooth/floss/bluetooth_adapter_floss.cc index 24ce5af..7e6e102 100644 --- a/device/bluetooth/floss/bluetooth_adapter_floss.cc +++ b/device/bluetooth/floss/bluetooth_adapter_floss.cc
@@ -15,8 +15,11 @@ #include "base/threading/thread_task_runner_handle.h" #include "components/device_event_log/device_event_log.h" #include "device/bluetooth/bluetooth_adapter.h" +#include "device/bluetooth/bluetooth_socket_thread.h" #include "device/bluetooth/floss/bluetooth_device_floss.h" +#include "device/bluetooth/floss/bluetooth_socket_floss.h" #include "device/bluetooth/floss/floss_dbus_manager.h" +#include "device/bluetooth/floss/floss_socket_manager.h" #include "device/bluetooth/public/cpp/bluetooth_address.h" namespace floss { @@ -62,7 +65,10 @@ return base::WrapRefCounted(new BluetoothAdapterFloss()); } -BluetoothAdapterFloss::BluetoothAdapterFloss() = default; +BluetoothAdapterFloss::BluetoothAdapterFloss() { + ui_task_runner_ = base::ThreadTaskRunnerHandle::Get(); + socket_thread_ = device::BluetoothSocketThread::Get(); +} BluetoothAdapterFloss::~BluetoothAdapterFloss() { Shutdown(); @@ -514,8 +520,8 @@ DCHECK(FlossDBusManager::Get()); DCHECK(IsPresent()); - auto device_floss = - base::WrapUnique(new BluetoothDeviceFloss(this, device_found)); + auto device_floss = base::WrapUnique(new BluetoothDeviceFloss( + this, device_found, ui_task_runner_, socket_thread_)); std::string canonical_address = device::CanonicalizeBluetoothAddress(device_floss->GetAddress()); @@ -549,8 +555,8 @@ DCHECK(FlossDBusManager::Get()); DCHECK(IsPresent()); - auto device_floss = - base::WrapUnique(new BluetoothDeviceFloss(this, device_cleared)); + auto device_floss = base::WrapUnique(new BluetoothDeviceFloss( + this, device_cleared, ui_task_runner_, socket_thread_)); std::string canonical_address = device::CanonicalizeBluetoothAddress(device_floss->GetAddress()); if (base::Contains(devices_, canonical_address)) { @@ -712,7 +718,15 @@ const ServiceOptions& options, CreateServiceCallback callback, CreateServiceErrorCallback error_callback) { - NOTIMPLEMENTED(); + DCHECK(!dbus_is_shutdown_); + BLUETOOTH_LOG(DEBUG) << "Creating RFCOMM service: " << uuid.canonical_value(); + scoped_refptr<BluetoothSocketFloss> socket = + BluetoothSocketFloss::CreateBluetoothSocket(ui_task_runner_, + socket_thread_); + + socket->Listen(this, FlossSocketManager::SocketType::kRfcomm, uuid, options, + base::BindOnce(std::move(callback), socket), + std::move(error_callback)); } void BluetoothAdapterFloss::CreateL2capService( @@ -720,7 +734,15 @@ const ServiceOptions& options, CreateServiceCallback callback, CreateServiceErrorCallback error_callback) { - NOTIMPLEMENTED(); + DCHECK(!dbus_is_shutdown_); + BLUETOOTH_LOG(DEBUG) << "Creating L2CAP service: " << uuid.canonical_value(); + scoped_refptr<BluetoothSocketFloss> socket = + BluetoothSocketFloss::CreateBluetoothSocket(ui_task_runner_, + socket_thread_); + + socket->Listen(this, FlossSocketManager::SocketType::kL2cap, uuid, options, + base::BindOnce(std::move(callback), socket), + std::move(error_callback)); } void BluetoothAdapterFloss::RegisterAdvertisement(
diff --git a/device/bluetooth/floss/bluetooth_adapter_floss.h b/device/bluetooth/floss/bluetooth_adapter_floss.h index fea4f26c..49242e8 100644 --- a/device/bluetooth/floss/bluetooth_adapter_floss.h +++ b/device/bluetooth/floss/bluetooth_adapter_floss.h
@@ -17,6 +17,7 @@ #include "device/bluetooth/bluetooth_discovery_session.h" #include "device/bluetooth/bluetooth_export.h" #include "device/bluetooth/bluetooth_gatt_service.h" +#include "device/bluetooth/bluetooth_socket_thread.h" #include "device/bluetooth/floss/floss_adapter_client.h" #include "device/bluetooth/floss/floss_dbus_client.h" #include "device/bluetooth/floss/floss_manager_client.h" @@ -213,6 +214,11 @@ // up properly). bool dbus_is_shutdown_ = false; + // Socket thread object used to create sockets. Public socket apis are run on + // the ui thread but socket operations (including connect/disconnect) will be + // run in this thread. See |BluetoothSocketNet| for more details. + scoped_refptr<device::BluetoothSocketThread> socket_thread_; + base::WeakPtrFactory<BluetoothAdapterFloss> weak_ptr_factory_{this}; };
diff --git a/device/bluetooth/floss/bluetooth_device_floss.cc b/device/bluetooth/floss/bluetooth_device_floss.cc index 50e51be..2df80591 100644 --- a/device/bluetooth/floss/bluetooth_device_floss.cc +++ b/device/bluetooth/floss/bluetooth_device_floss.cc
@@ -13,8 +13,10 @@ #include "device/bluetooth/bluetooth_device.h" #include "device/bluetooth/bluetooth_gatt_connection.h" #include "device/bluetooth/floss/bluetooth_adapter_floss.h" +#include "device/bluetooth/floss/bluetooth_socket_floss.h" #include "device/bluetooth/floss/floss_dbus_client.h" #include "device/bluetooth/floss/floss_dbus_manager.h" +#include "device/bluetooth/floss/floss_socket_manager.h" namespace floss { @@ -269,14 +271,34 @@ const device::BluetoothUUID& uuid, ConnectToServiceCallback callback, ConnectToServiceErrorCallback error_callback) { - NOTIMPLEMENTED(); + BLUETOOTH_LOG(EVENT) << address_ + << ": Connecting to service: " << uuid.canonical_value(); + scoped_refptr<BluetoothSocketFloss> socket = + BluetoothSocketFloss::CreateBluetoothSocket(ui_task_runner_, + socket_thread_); + + socket->Connect(this, FlossSocketManager::Security::kSecure, uuid, + base::BindOnce(std::move(callback), socket), + base::BindOnce(&BluetoothDeviceFloss::OnConnectToServiceError, + weak_ptr_factory_.GetWeakPtr(), + std::move(error_callback))); } void BluetoothDeviceFloss::ConnectToServiceInsecurely( const device::BluetoothUUID& uuid, ConnectToServiceCallback callback, ConnectToServiceErrorCallback error_callback) { - NOTIMPLEMENTED(); + BLUETOOTH_LOG(EVENT) << address_ + << ": Connecting to service: " << uuid.canonical_value(); + scoped_refptr<BluetoothSocketFloss> socket = + BluetoothSocketFloss::CreateBluetoothSocket(ui_task_runner_, + socket_thread_); + + socket->Connect(this, FlossSocketManager::Security::kInsecure, uuid, + base::BindOnce(std::move(callback), socket), + base::BindOnce(&BluetoothDeviceFloss::OnConnectToServiceError, + weak_ptr_factory_.GetWeakPtr(), + std::move(error_callback))); } std::unique_ptr<device::BluetoothGattConnection> @@ -352,9 +374,16 @@ NOTIMPLEMENTED(); } -BluetoothDeviceFloss::BluetoothDeviceFloss(BluetoothAdapterFloss* adapter, - const FlossDeviceId& device) - : BluetoothDevice(adapter), address_(device.address), name_(device.name) { +BluetoothDeviceFloss::BluetoothDeviceFloss( + BluetoothAdapterFloss* adapter, + const FlossDeviceId& device, + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<device::BluetoothSocketThread> socket_thread) + : BluetoothDevice(adapter), + address_(device.address), + name_(device.name), + ui_task_runner_(ui_task_runner), + socket_thread_(socket_thread) { // TODO(abps): Add observers and cache data here. } @@ -481,6 +510,17 @@ std::move(callback).Run(); } +void BluetoothDeviceFloss::OnConnectToServiceError( + ConnectToServiceErrorCallback error_callback, + const std::string& error_message) { + BLUETOOTH_LOG(ERROR) << address_ + << ": Failed to connect to service: " << error_message; + + // TODO - Log service connection failures for metrics. + + std::move(error_callback).Run(error_message); +} + void BluetoothDeviceFloss::InitializeDeviceProperties() { // TODO(b/204708206): Update with property framework when available FlossDBusManager::Get()->GetAdapterClient()->GetRemoteType(
diff --git a/device/bluetooth/floss/bluetooth_device_floss.h b/device/bluetooth/floss/bluetooth_device_floss.h index 1077657..644f0a4 100644 --- a/device/bluetooth/floss/bluetooth_device_floss.h +++ b/device/bluetooth/floss/bluetooth_device_floss.h
@@ -12,6 +12,7 @@ #include "device/bluetooth/bluetooth_common.h" #include "device/bluetooth/bluetooth_device.h" #include "device/bluetooth/bluetooth_export.h" +#include "device/bluetooth/bluetooth_socket_thread.h" #include "device/bluetooth/floss/bluetooth_pairing_floss.h" #include "device/bluetooth/floss/floss_adapter_client.h" @@ -32,8 +33,11 @@ BluetoothDeviceFloss(const BluetoothDeviceFloss&) = delete; BluetoothDeviceFloss& operator=(const BluetoothDeviceFloss&) = delete; - BluetoothDeviceFloss(BluetoothAdapterFloss* adapter, - const FlossDeviceId& device); + BluetoothDeviceFloss( + BluetoothAdapterFloss* adapter, + const FlossDeviceId& device, + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<device::BluetoothSocketThread> socket_thread); ~BluetoothDeviceFloss() override; // BluetoothDevice override @@ -147,6 +151,9 @@ ErrorCallback error_callback, DBusResult<Void> ret); + void OnConnectToServiceError(ConnectToServiceErrorCallback error_callback, + const std::string& error_message); + absl::optional<ConnectCallback> pending_callback_on_connect_profiles_ = absl::nullopt; @@ -177,6 +184,10 @@ // not used in the Chrome layer. bool is_connected_ = false; + // UI thread task runner and socket thread used to create sockets. + scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; + scoped_refptr<device::BluetoothSocketThread> socket_thread_; + // Represents currently ongoing pairing with this remote device. std::unique_ptr<BluetoothPairingFloss> pairing_;
diff --git a/device/bluetooth/floss/bluetooth_floss_unittest.cc b/device/bluetooth/floss/bluetooth_floss_unittest.cc index a4eb545..a8a3b0f 100644 --- a/device/bluetooth/floss/bluetooth_floss_unittest.cc +++ b/device/bluetooth/floss/bluetooth_floss_unittest.cc
@@ -13,6 +13,7 @@ #include "device/bluetooth/floss/bluetooth_adapter_floss.h" #include "device/bluetooth/floss/fake_floss_adapter_client.h" #include "device/bluetooth/floss/fake_floss_manager_client.h" +#include "device/bluetooth/floss/fake_floss_socket_manager.h" #include "device/bluetooth/floss/floss_dbus_manager.h" #include "device/bluetooth/test/mock_pairing_delegate.h" #include "device/bluetooth/test/test_bluetooth_adapter_observer.h" @@ -42,12 +43,14 @@ auto fake_floss_manager_client = std::make_unique<FakeFlossManagerClient>(); auto fake_floss_adapter_client = std::make_unique<FakeFlossAdapterClient>(); + auto fake_floss_socket_manager = std::make_unique<FakeFlossSocketManager>(); fake_floss_manager_client_ = fake_floss_manager_client.get(); fake_floss_adapter_client_ = fake_floss_adapter_client.get(); dbus_setter->SetFlossManagerClient(std::move(fake_floss_manager_client)); dbus_setter->SetFlossAdapterClient(std::move(fake_floss_adapter_client)); + dbus_setter->SetFlossSocketManager(std::move(fake_floss_socket_manager)); } void InitializeAdapter() {
diff --git a/device/bluetooth/floss/bluetooth_socket_floss.cc b/device/bluetooth/floss/bluetooth_socket_floss.cc new file mode 100644 index 0000000..9d2af97 --- /dev/null +++ b/device/bluetooth/floss/bluetooth_socket_floss.cc
@@ -0,0 +1,377 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/bluetooth/floss/bluetooth_socket_floss.h" + +#include "device/bluetooth/floss/bluetooth_adapter_floss.h" +#include "device/bluetooth/floss/bluetooth_device_floss.h" +#include "device/bluetooth/floss/floss_dbus_client.h" +#include "device/bluetooth/floss/floss_dbus_manager.h" +#include "device/bluetooth/floss/floss_socket_manager.h" +#include "net/base/ip_endpoint.h" +#include "net/base/net_errors.h" + +namespace floss { +namespace { +const char kInvalidSocketType[] = "Invalid Socket Type"; +const char kInvalidUUID[] = "Invalid UUID"; +const char kSocketNotListening[] = "Socket is not listening"; +const char kSocketListenFailed[] = "Socket failed to listen"; +const char kSocketAcceptFailed[] = "Socket failed to accept"; + +const char kSocketFailedToConnect[] = "Socket failed to connect"; +const char kSocketInvalidFd[] = "Socket has invalid fd"; +const char kSocketAlreadyConnected[] = "Socket already connected"; +const char kSocketErrorAdopting[] = "Socket error during adoption"; +} // namespace + +// static +scoped_refptr<BluetoothSocketFloss> BluetoothSocketFloss::CreateBluetoothSocket( + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<device::BluetoothSocketThread> socket_thread) { + DCHECK(ui_task_runner->RunsTasksInCurrentSequence()); + + return base::WrapRefCounted( + new BluetoothSocketFloss(ui_task_runner, socket_thread)); +} + +BluetoothSocketFloss::AcceptRequest::AcceptRequest() = default; +BluetoothSocketFloss::AcceptRequest::~AcceptRequest() = default; + +BluetoothSocketFloss::BluetoothSocketFloss( + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<device::BluetoothSocketThread> socket_thread) + : BluetoothSocketNet(ui_task_runner, socket_thread) {} + +BluetoothSocketFloss::~BluetoothSocketFloss() = default; + +void BluetoothSocketFloss::Connect(BluetoothDeviceFloss* device, + const FlossSocketManager::Security security, + const device::BluetoothUUID& uuid, + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback) { + DCHECK(device); + + if (!uuid.IsValid()) { + std::move(error_callback).Run(kInvalidUUID); + return; + } + + adapter_ = base::WrapRefCounted(device->GetAdapter()); + device_address_ = device->GetAddress(); + + FlossDBusManager::Get()->GetSocketManager()->ConnectUsingRfcomm( + device->AsFlossDeviceId(), uuid, security, + base::BindOnce(&BluetoothSocketFloss::CompleteConnect, + weak_ptr_factory_.GetWeakPtr(), + std::move(success_callback), std::move(error_callback))); +} + +void BluetoothSocketFloss::Listen( + scoped_refptr<device::BluetoothAdapter> adapter, + FlossSocketManager::SocketType socket_type, + const absl::optional<device::BluetoothUUID>& uuid, + const device::BluetoothAdapter::ServiceOptions& service_options, + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback) { + // TODO(abps) - Figure out whether we can accept channel/psm from options. + + FlossSocketManager::Security security = + (service_options.require_authentication && + *service_options.require_authentication) + ? FlossSocketManager::Security::kSecure + : FlossSocketManager::Security::kInsecure; + + if (!uuid->IsValid()) { + std::move(error_callback).Run(kInvalidUUID); + return; + } + + if (socket_type != FlossSocketManager::SocketType::kL2capLe && + socket_type != FlossSocketManager::SocketType::kRfcomm) { + std::move(error_callback).Run(kInvalidSocketType); + return; + } + + adapter_ = adapter; + + ResponseCallback<FlossDBusClient::BtifStatus> callback = base::BindOnce( + &BluetoothSocketFloss::CompleteListen, weak_ptr_factory_.GetWeakPtr(), + std::move(success_callback), std::move(error_callback)); + + FlossSocketManager::ConnectionStateChanged state_change = + base::BindRepeating(&BluetoothSocketFloss::DoConnectionStateChanged, + weak_ptr_factory_.GetWeakPtr()); + + FlossSocketManager::ConnectionAccepted accepted = + base::BindRepeating(&BluetoothSocketFloss::DoConnectionAccepted, + weak_ptr_factory_.GetWeakPtr()); + + if (socket_type == FlossSocketManager::SocketType::kL2capLe) { + FlossDBusManager::Get()->GetSocketManager()->ListenUsingL2cap( + security, std::move(callback), state_change, accepted); + } else if (socket_type == FlossSocketManager::SocketType::kRfcomm) { + DCHECK(uuid); + std::string name; + if (service_options.name) { + name = *service_options.name; + } + + FlossDBusManager::Get()->GetSocketManager()->ListenUsingRfcomm( + name, *uuid, security, std::move(callback), state_change, accepted); + } +} + +void BluetoothSocketFloss::Disconnect(base::OnceClosure callback) { + // If this is a connecting socket, simply close self. + if (connecting_socket_info_.is_valid()) { + BluetoothSocketNet::Disconnect(std::move(callback)); + + // Note: Adapter needs to be cleared here or BluetoothSocketNet will be + // holding a weak pointer and try to destroy a scoped_refptr in a the socket + // thread. + adapter_ = nullptr; + return; + } + + // Close the socket manager instance. + if (listening_socket_info_) { + FlossDBusManager::Get()->GetSocketManager()->Close( + listening_socket_info_->id, + base::BindOnce(&BluetoothSocketFloss::CompleteClose, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + + // If there is a pending accept, clear it. + if (accept_request_) { + std::move(accept_request_->error_callback) + .Run(net::ErrorToString(net::ERR_CONNECTION_CLOSED)); + accept_request_.reset(nullptr); + } + + // Just dropping the queue is sufficient. No need to send anything back + // because these are already accepted connections. Queue has no |clear| + // function so just assign a new empty queue. + connection_request_queue_ = {}; +} + +void BluetoothSocketFloss::Accept(AcceptCompletionCallback success_callback, + ErrorCompletionCallback error_callback) { + if (!listening_socket_info_) { + std::move(error_callback).Run(kSocketNotListening); + return; + } + + // Accept is already pending. + if (accept_request_.get()) { + std::move(error_callback).Run(net::ErrorToString(net::ERR_IO_PENDING)); + return; + } + + accept_request_ = std::make_unique<AcceptRequest>(); + accept_request_->success_callback = std::move(success_callback); + accept_request_->error_callback = std::move(error_callback); + + // If there's any already ready connections, dispatch right away. + if (connection_request_queue_.size() >= 1) { + CompleteListeningConnect(); + } + + // If this socket is currently not accepting at the platform level, flip this + // to accepting. + if (!is_accepting_) { + FlossDBusManager::Get()->GetSocketManager()->Accept( + listening_socket_info_->id, absl::nullopt, + base::BindOnce(&BluetoothSocketFloss::CompleteAccept, + weak_ptr_factory_.GetWeakPtr())); + } +} + +void BluetoothSocketFloss::DoConnectionStateChanged( + FlossSocketManager::ServerSocketState state, + FlossSocketManager::FlossListeningSocket socket, + FlossDBusClient::BtifStatus status) { + // If we don't already have socket info, store it. + if (!listening_socket_info_) { + listening_socket_info_ = socket; + } + + // Every time we get a socket state update, the socket gets reset to a not + // accepting state. Mark our internal state to match that. + is_accepting_ = false; + + // We also always want to be accepting and queue up connections here to be + // consumed when in the ready state. + if (state == FlossSocketManager::ServerSocketState::kReady) { + FlossDBusManager::Get()->GetSocketManager()->Accept( + listening_socket_info_->id, absl::nullopt, + base::BindOnce(&BluetoothSocketFloss::CompleteAccept, + weak_ptr_factory_.GetWeakPtr())); + } +} + +void BluetoothSocketFloss::DoConnectionAccepted( + FlossSocketManager::FlossSocket&& socket) { + // Queue dispatch of new connection. + connection_request_queue_.push(std::move(socket)); + + // If there's an accept ready, dispatch immediately. + if (accept_request_) { + CompleteListeningConnect(); + } +} + +void BluetoothSocketFloss::CompleteListen( + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback, + DBusResult<FlossDBusClient::BtifStatus> result) { + if (!result.has_value()) { + std::move(error_callback).Run(result.error().ToString()); + return; + } + + if (*result != FlossDBusClient::BtifStatus::kSuccess) { + std::move(error_callback).Run(kSocketListenFailed); + return; + } + + std::move(success_callback).Run(); +} + +void BluetoothSocketFloss::CompleteConnect( + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback, + FlossDBusClient::BtifStatus status, + absl::optional<FlossSocketManager::FlossSocket>&& socket) { + socket_thread()->task_runner()->PostTask( + FROM_HERE, + base::BindOnce(&BluetoothSocketFloss::CompleteConnectionInSocketThread, + this, std::move(success_callback), + std::move(error_callback), status, std::move(socket))); +} + +void BluetoothSocketFloss::CompleteConnectionInSocketThread( + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback, + FlossDBusClient::BtifStatus status, + absl::optional<FlossSocketManager::FlossSocket>&& socket) { + if (status != FlossDBusClient::BtifStatus::kSuccess || !socket) { + LOG(ERROR) << device_address_ << ": Socket failed connection: " + << static_cast<uint32_t>(status); + ui_task_runner()->PostTask( + FROM_HERE, + base::BindOnce(std::move(error_callback), kSocketFailedToConnect)); + return; + } + + connecting_socket_info_ = std::move(*socket); + + if (!connecting_socket_info_.fd || !connecting_socket_info_.fd->is_valid()) { + LOG(WARNING) << device_address_ + << ": Invalid file descriptor received from Bluetooth daemon"; + ui_task_runner()->PostTask( + FROM_HERE, base::BindOnce(std::move(error_callback), kSocketInvalidFd)); + return; + } + + if (tcp_socket()) { + LOG(WARNING) << device_address_ << ": Already connected"; + ui_task_runner()->PostTask( + FROM_HERE, + base::BindOnce(std::move(error_callback), kSocketAlreadyConnected)); + return; + } + + ResetTCPSocket(); + + int net_result = tcp_socket()->AdoptConnectedSocket( + connecting_socket_info_.fd->release(), net::IPEndPoint()); + + if (net_result != net::OK) { + LOG(WARNING) << device_address_ << ": Error adopting socket: " + << std::string(net::ErrorToString(net_result)); + ui_task_runner()->PostTask( + FROM_HERE, + base::BindOnce(std::move(error_callback), kSocketErrorAdopting)); + return; + } + + ui_task_runner()->PostTask(FROM_HERE, std::move(success_callback)); +} + +void BluetoothSocketFloss::CompleteAccept( + DBusResult<FlossDBusClient::BtifStatus> result) { + if (!result.has_value() && accept_request_) { + std::move(accept_request_->error_callback).Run(result.error().ToString()); + accept_request_.reset(nullptr); + return; + } + + if (*result != FlossDBusClient::BtifStatus::kSuccess && accept_request_) { + LOG(WARNING) << "Failed to listen on socket with uuid " + << listening_socket_info_->uuid.value(); + std::move(accept_request_->error_callback).Run(kSocketAcceptFailed); + accept_request_.reset(nullptr); + return; + } + + if (*result == FlossDBusClient::BtifStatus::kSuccess) { + is_accepting_ = true; + } +} + +void BluetoothSocketFloss::CompleteClose( + base::OnceClosure callback, + DBusResult<FlossDBusClient::BtifStatus> result) { + if (!result.has_value()) { + is_accepting_ = false; + } + + DVLOG(1) << "Result of closing socket = " << static_cast<uint32_t>(*result); + + std::move(callback).Run(); +} + +void BluetoothSocketFloss::CompleteListeningConnect() { + if (!listening_socket_info_) { + LOG(ERROR) << "Tried to complete connect on socket that isn't listening."; + return; + } + + if (connection_request_queue_.size() == 0) { + LOG(ERROR) << "Tried to complete connect with no pending connections."; + return; + } + + if (!accept_request_) { + LOG(ERROR) << "Tried to complete connect with no pending accept."; + return; + } + + scoped_refptr<BluetoothSocketFloss> client_socket = + BluetoothSocketFloss::CreateBluetoothSocket(ui_task_runner(), + socket_thread()); + + absl::optional<FlossSocketManager::FlossSocket> sock( + std::move(connection_request_queue_.front())); + connection_request_queue_.pop(); + + device::BluetoothDevice* device = + adapter_->GetDevice(sock->remote_device.address); + + socket_thread()->task_runner()->PostTask( + FROM_HERE, + base::BindOnce( + &BluetoothSocketFloss::CompleteConnectionInSocketThread, + client_socket, + base::BindOnce(std::move(accept_request_->success_callback), device, + client_socket), + std::move(accept_request_->error_callback), + FlossDBusClient::BtifStatus::kSuccess, std::move(sock))); + + // The last accept request has been consumed by the socket above. + accept_request_.reset(nullptr); +} + +} // namespace floss
diff --git a/device/bluetooth/floss/bluetooth_socket_floss.h b/device/bluetooth/floss/bluetooth_socket_floss.h new file mode 100644 index 0000000..7d2df5dc9 --- /dev/null +++ b/device/bluetooth/floss/bluetooth_socket_floss.h
@@ -0,0 +1,160 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_SOCKET_FLOSS_H_ +#define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_SOCKET_FLOSS_H_ + +#include <memory> +#include <string> + +#include "device/bluetooth/bluetooth_adapter.h" +#include "device/bluetooth/bluetooth_export.h" +#include "device/bluetooth/bluetooth_socket.h" +#include "device/bluetooth/bluetooth_socket_net.h" +#include "device/bluetooth/bluetooth_socket_thread.h" +#include "device/bluetooth/floss/floss_dbus_client.h" +#include "device/bluetooth/floss/floss_socket_manager.h" +#include "device/bluetooth/public/cpp/bluetooth_uuid.h" + +namespace floss { + +class BluetoothDeviceFloss; + +// BluetoothSocketFloss implements BluetoothSocket for platforms that use Floss. +// It must be initialized with a socketpair file descriptor taken via the +// |FlossSocketManager| apis. +// +// This class is not thread-safe, but is only called from the UI thread. +class DEVICE_BLUETOOTH_EXPORT BluetoothSocketFloss + : public device::BluetoothSocketNet { + public: + static scoped_refptr<BluetoothSocketFloss> CreateBluetoothSocket( + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<device::BluetoothSocketThread> socket_thread); + + BluetoothSocketFloss(const BluetoothSocketFloss&) = delete; + BluetoothSocketFloss& operator=(const BluetoothSocketFloss&) = delete; + + // Connects this socket to the service on |device| published as UUID |uuid|, + // the underlying protocol and PSM or Channel is obtained through service + // discovery. On a successful connection, the socket properties will be + // updated and |success_callback| called. On failure |error_callback| will be + // called with a message explaining the cause of the failure. + // + // This API only supports RFCOMM at this time. + virtual void Connect(BluetoothDeviceFloss* device, + const FlossSocketManager::Security security, + const device::BluetoothUUID& uuid, + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback); + + // Listens using this socket using a service published on |adapter|. The + // service is either RFCOMM or L2CAP depending on |socket_type| and published + // as UUID |uuid| (if RFCOMM). The |service_options| argument is interpreted + // according to |socket_type|. |success_callback| will be called if the + // service is successfully registered, |error_callback| on failure with a + // message explaining the cause. + // + // This API supports connect-oriented L2cap (L2capLE) and Rfcomm. + virtual void Listen( + scoped_refptr<device::BluetoothAdapter> adapter, + FlossSocketManager::SocketType socket_type, + const absl::optional<device::BluetoothUUID>& uuid, + const device::BluetoothAdapter::ServiceOptions& service_options, + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback); + + // BluetoothSocket: + void Disconnect(base::OnceClosure callback) override; + void Accept(AcceptCompletionCallback success_callback, + ErrorCompletionCallback error_callback) override; + + protected: + // Repeating callback that handles when a listening socket becomes ready to + // accept new connections or when a socket closes. + void DoConnectionStateChanged(FlossSocketManager::ServerSocketState state, + FlossSocketManager::FlossListeningSocket socket, + FlossDBusClient::BtifStatus status); + + // Repeating callback that handles when a listening socket accepts a new + // connection. + void DoConnectionAccepted(FlossSocketManager::FlossSocket&& socket); + + // Callback that handles completion of a socket listen. + void CompleteListen(base::OnceClosure success_callback, + ErrorCompletionCallback error_callback, + DBusResult<FlossDBusClient::BtifStatus> result); + + // Callback that handles completion of a socket connection. + void CompleteConnect( + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback, + FlossDBusClient::BtifStatus status, + absl::optional<FlossSocketManager::FlossSocket>&& socket); + + // Callback that handles completion of socket accept. + void CompleteAccept(DBusResult<FlossDBusClient::BtifStatus> result); + + // Callback that handles completion of socket close. + void CompleteClose(base::OnceClosure callback, + DBusResult<FlossDBusClient::BtifStatus> result); + + // Grabs a connected socket from |connection_request_queue_| and dispatches it + // via |accept_request_|. + void CompleteListeningConnect(); + + // Complete initializing the socket in the socket thread. Since the underlying + // implementation is |BluetoothSocketNet|, we need to follow convention and + // complete the connection in the socket thread. Otherwise, we will get DCHECK + // failures in |Disconnect|. + void CompleteConnectionInSocketThread( + base::OnceClosure success_callback, + ErrorCompletionCallback error_callback, + FlossDBusClient::BtifStatus status, + absl::optional<FlossSocketManager::FlossSocket>&& socket); + + private: + struct AcceptRequest { + AcceptRequest(); + ~AcceptRequest(); + + AcceptCompletionCallback success_callback; + ErrorCompletionCallback error_callback; + }; + + BluetoothSocketFloss( + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<device::BluetoothSocketThread> socket_thread); + + ~BluetoothSocketFloss() override; + + // Adapter that this socket is created against. + scoped_refptr<device::BluetoothAdapter> adapter_; + + // Address of device being connected to. Empty if socket is listening. + std::string device_address_; + + // Information about a listening socket. Empty if this socket isn't listening. + absl::optional<FlossSocketManager::FlossListeningSocket> + listening_socket_info_; + + // Is this socket currently accepting? This status reflects what the listening + // socket is currently doing on the Floss daemon side. + bool is_accepting_ = false; + + // Information about a connecting socket. Check |is_valid| before using. + FlossSocketManager::FlossSocket connecting_socket_info_; + + // Socket is ready to accept the next request using callbacks here. + std::unique_ptr<AcceptRequest> accept_request_; + + // After a connection is accepted, store the connection until it's ready to be + // consumed. + base::queue<FlossSocketManager::FlossSocket> connection_request_queue_; + + base::WeakPtrFactory<BluetoothSocketFloss> weak_ptr_factory_{this}; +}; +} // namespace floss + +#endif // DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_SOCKET_FLOSS_H_
diff --git a/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc b/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc new file mode 100644 index 0000000..9e14f5b --- /dev/null +++ b/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc
@@ -0,0 +1,349 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/bluetooth/floss/bluetooth_socket_floss.h" + +#include <memory> + +#include "base/bind.h" +#include "base/callback_helpers.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" +#include "base/run_loop.h" +#include "base/test/bind.h" +#include "base/test/task_environment.h" +#include "device/bluetooth/bluetooth_adapter.h" +#include "device/bluetooth/bluetooth_device.h" +#include "device/bluetooth/bluetooth_socket.h" +#include "device/bluetooth/bluetooth_socket_thread.h" +#include "device/bluetooth/floss/bluetooth_adapter_floss.h" +#include "device/bluetooth/floss/fake_floss_adapter_client.h" +#include "device/bluetooth/floss/fake_floss_manager_client.h" +#include "device/bluetooth/floss/fake_floss_socket_manager.h" +#include "device/bluetooth/floss/floss_dbus_client.h" +#include "device/bluetooth/floss/floss_dbus_manager.h" +#include "net/base/io_buffer.h" +#include "net/base/net_errors.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +using ::device::BluetoothAdapter; + +} // namespace + +namespace floss { + +class BluetoothSocketFlossTest : public testing::Test { + public: + void SetUp() override { + std::unique_ptr<floss::FlossDBusManagerSetter> dbus_setter = + floss::FlossDBusManager::GetSetterForTesting(); + + auto fake_floss_manager_client = std::make_unique<FakeFlossManagerClient>(); + auto fake_floss_adapter_client = std::make_unique<FakeFlossAdapterClient>(); + auto fake_floss_socket_manager = std::make_unique<FakeFlossSocketManager>(); + + fake_floss_manager_client_ = fake_floss_manager_client.get(); + fake_floss_adapter_client_ = fake_floss_adapter_client.get(); + fake_floss_socket_manager_ = fake_floss_socket_manager.get(); + + dbus_setter->SetFlossManagerClient(std::move(fake_floss_manager_client)); + dbus_setter->SetFlossAdapterClient(std::move(fake_floss_adapter_client)); + dbus_setter->SetFlossSocketManager(std::move(fake_floss_socket_manager)); + + InitializeAndEnableAdapter(); + } + + void TearDown() override { + adapter_ = nullptr; + device::BluetoothSocketThread::CleanupForTesting(); + } + + void InitializeAndEnableAdapter() { + adapter_ = BluetoothAdapterFloss::CreateAdapter(); + + fake_floss_manager_client_->SetAdapterPowered(/*adapter*/ 0, + /*powered*/ true); + + base::RunLoop run_loop; + adapter_->Initialize(run_loop.QuitClosure()); + run_loop.Run(); + + ASSERT_TRUE(adapter_); + ASSERT_TRUE(adapter_->IsInitialized()); + ASSERT_TRUE(adapter_->IsPowered()); + + ASSERT_TRUE(adapter_.get() != nullptr); + + fake_floss_manager_client_->NotifyObservers( + base::BindLambdaForTesting([](FlossManagerClient::Observer* observer) { + observer->AdapterEnabledChanged(/*adapter=*/0, /*enabled=*/true); + })); + base::RunLoop().RunUntilIdle(); + + // Get the socket thread. + device::BluetoothSocketThread::Get(); + } + + void AcceptSuccessCallback(base::OnceClosure exitloop, + const device::BluetoothDevice* device, + scoped_refptr<device::BluetoothSocket> socket) { + success_callback_count_++; + last_socket_ = socket; + std::move(exitloop).Run(); + } + + void ConnectToServiceSuccessCallback( + base::OnceClosure exitloop, + scoped_refptr<device::BluetoothSocket> socket) { + success_callback_count_++; + last_socket_ = socket; + std::move(exitloop).Run(); + } + + void CreateServiceSuccessCallback( + base::OnceClosure exitloop, + scoped_refptr<device::BluetoothSocket> socket) { + success_callback_count_++; + last_socket_ = socket; + std::move(exitloop).Run(); + } + + void DisconnectSuccessCallback(base::OnceClosure exitloop) { + std::move(exitloop).Run(); + } + + void ErrorCallback(base::OnceClosure exitloop, const std::string& message) { + LOG(ERROR) << "ErrorCallback: " << message; + error_callback_count_++; + last_message_ = message; + std::move(exitloop).Run(); + } + + void ImmediateSuccessCallback() { success_callback_count_++; } + + void SendSuccessCallback(base::OnceClosure exitloop, int bytes_sent) { + ++success_callback_count_; + last_bytes_sent_ = bytes_sent; + std::move(exitloop).Run(); + } + + // Clear counters for test. + void ClearCounters() { + last_bytes_sent_ = 0; + last_bytes_received_ = 0; + success_callback_count_ = 0; + error_callback_count_ = 0; + last_socket_ = nullptr; + } + + void DisconnectSocket(const scoped_refptr<device::BluetoothSocket>& socket) { + base::RunLoop run_loop; + socket->Disconnect(base::BindOnce( + &BluetoothSocketFlossTest::DisconnectSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), run_loop.QuitWhenIdleClosure())); + } + + base::test::TaskEnvironment task_environment_; + scoped_refptr<BluetoothAdapter> adapter_; + + std::string last_message_; + int last_bytes_sent_ = 0; + int last_bytes_received_ = 0; + int success_callback_count_ = 0; + int error_callback_count_ = 0; + scoped_refptr<device::BluetoothSocket> last_socket_; + + // Holds pointer to FakeFloss*Client's so that we can manipulate the fake + // within tests. + raw_ptr<FakeFlossManagerClient> fake_floss_manager_client_; + raw_ptr<FakeFlossAdapterClient> fake_floss_adapter_client_; + raw_ptr<FakeFlossSocketManager> fake_floss_socket_manager_; + + base::WeakPtrFactory<BluetoothSocketFlossTest> weak_ptr_factory_{this}; +}; + +TEST_F(BluetoothSocketFlossTest, Connect) { + device::BluetoothDevice* device = + adapter_->GetDevice(FakeFlossAdapterClient::kBondedAddress1); + ASSERT_TRUE(device != nullptr); + + // First establish a connection. + { + base::RunLoop run_loop; + device->ConnectToService( + device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid), + base::BindOnce( + &BluetoothSocketFlossTest::ConnectToServiceSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.Run(); + } + + EXPECT_EQ(1, success_callback_count_); + EXPECT_EQ(0, error_callback_count_); + EXPECT_TRUE(last_socket_.get() != nullptr); + + // Take ownership of socket. + scoped_refptr<device::BluetoothSocket> socket = last_socket_; + ClearCounters(); + + auto write_buffer = base::MakeRefCounted<net::StringIOBuffer>("test"); + { + base::RunLoop run_loop; + socket->Send(write_buffer.get(), write_buffer->size(), + base::BindOnce(&BluetoothSocketFlossTest::SendSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.Run(); + } + + EXPECT_EQ(1, success_callback_count_); + EXPECT_EQ(0, error_callback_count_); + EXPECT_EQ(last_bytes_sent_, write_buffer->size()); + ClearCounters(); + + // Clean up the socket + DisconnectSocket(socket); +} + +TEST_F(BluetoothSocketFlossTest, Listen) { + // Get socket id for next returned socket. + FlossSocketManager::SocketId id = fake_floss_socket_manager_->GetNextId(); + + // First create the service. + { + base::RunLoop run_loop; + adapter_->CreateRfcommService( + device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid), + BluetoothAdapter::ServiceOptions(), + base::BindOnce(&BluetoothSocketFlossTest::CreateServiceSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.Run(); + } + + EXPECT_EQ(1, success_callback_count_); + EXPECT_EQ(0, error_callback_count_); + EXPECT_TRUE(last_socket_.get() != nullptr); + + // Take ownership of server socket. + scoped_refptr<device::BluetoothSocket> server_socket = last_socket_; + ClearCounters(); + + // Mark the socket as ready. This should trigger an accept. + fake_floss_socket_manager_->SendSocketReady( + id, device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid), + FlossDBusClient::BtifStatus::kSuccess); + + // Simulate incoming connection. This queues one up to be accepted later. + FlossDeviceId device = {.address = FakeFlossAdapterClient::kBondedAddress1, + .name = "Foobar"}; + fake_floss_socket_manager_->SendIncomingConnection( + id, device, device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid)); + + // Accept a connection and verify there is something there. + { + base::RunLoop run_loop; + server_socket->Accept( + base::BindOnce(&BluetoothSocketFlossTest::AcceptSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.Run(); + } + EXPECT_EQ(1, success_callback_count_); + EXPECT_EQ(0, error_callback_count_); + EXPECT_TRUE(last_socket_.get() != nullptr); + + // Take ownership of the client socket and close it. + scoped_refptr<device::BluetoothSocket> client_socket = last_socket_; + ClearCounters(); + + DisconnectSocket(client_socket); + client_socket = nullptr; + ClearCounters(); + + // Accept a connection when there's nothing there and then send connection. + { + // First runloop will push the accept callbacks into socket. + // Second runloop will actually trigger when incoming connection occurs. + base::RunLoop outer_loop; + base::RunLoop inner_loop; + + server_socket->Accept( + base::BindOnce(&BluetoothSocketFlossTest::AcceptSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + inner_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + inner_loop.QuitWhenIdleClosure())); + outer_loop.RunUntilIdle(); + + // No sockets found to accept. + EXPECT_EQ(0, success_callback_count_); + EXPECT_EQ(0, error_callback_count_); + EXPECT_TRUE(last_socket_.get() == nullptr); + + fake_floss_socket_manager_->SendIncomingConnection( + id, device, device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid)); + inner_loop.Run(); + + EXPECT_EQ(0, error_callback_count_); + EXPECT_EQ(1, success_callback_count_); + EXPECT_TRUE(last_socket_.get() != nullptr); + + // Disconnect last connecting socket + client_socket = last_socket_; + DisconnectSocket(client_socket); + client_socket = nullptr; + last_socket_ = nullptr; + } + + // Try to accept twice and make sure the second one fails. + ClearCounters(); + { + base::RunLoop run_loop; + server_socket->Accept( + base::BindOnce(&BluetoothSocketFlossTest::AcceptSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.RunUntilIdle(); + + // No change after first one + EXPECT_EQ(0, error_callback_count_); + + server_socket->Accept( + base::BindOnce(&BluetoothSocketFlossTest::AcceptSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.RunUntilIdle(); + + // Second one should fail + EXPECT_EQ(1, error_callback_count_); + ClearCounters(); + } + + // Clean up server socket at end. + DisconnectSocket(server_socket); +} + +} // namespace floss
diff --git a/device/bluetooth/floss/fake_floss_socket_manager.cc b/device/bluetooth/floss/fake_floss_socket_manager.cc new file mode 100644 index 0000000..332e741 --- /dev/null +++ b/device/bluetooth/floss/fake_floss_socket_manager.cc
@@ -0,0 +1,243 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/bluetooth/floss/fake_floss_socket_manager.h" + +#include <fcntl.h> +#include <stddef.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> + +#include "base/logging.h" +#include "base/task/single_thread_task_runner.h" +#include "base/task/thread_pool.h" +#include "base/threading/thread_task_runner_handle.h" +#include "base/types/expected.h" +#include "device/bluetooth/floss/floss_dbus_client.h" + +namespace floss { +namespace { +constexpr char kNotImplemented[] = "Not implemented"; +constexpr char kUnsupportedUuid[] = "Unsupported UUID"; + +// Simple echo server that reads data set, writes it back and closes. +void EchoServer(int fd) { + char buf[1024]; + ssize_t len; + ssize_t count; + + len = read(fd, buf, sizeof buf); + if (len < 0) { + close(fd); + return; + } + + count = len; + len = write(fd, buf, count); + if (len < 0) { + close(fd); + return; + } + + close(fd); +} + +// Make a socket pair of a compatible type with the type used by Bluetooth; +// spin up a thread to simulate the server side and return the client side file +// descriptor. +int SimulateSocket() { + // TODO(b/233124021) - L2cap support + int socket_type = SOCK_STREAM; + + int fds[2]; + if (socketpair(AF_UNIX, socket_type, 0, fds) < 0) { + LOG(ERROR) << "socketpair failed"; + return -1; + } + + int args; + args = fcntl(fds[1], F_GETFL, NULL); + if (args < 0) { + LOG(ERROR) << "failed to get socket flags"; + close(fds[0]); + close(fds[1]); + return -1; + } + + args |= O_NONBLOCK; + if (fcntl(fds[1], F_SETFL, args) < 0) { + LOG(ERROR) << "failed to set socket non-blocking"; + close(fds[0]); + close(fds[1]); + return -1; + } + + base::ThreadPool::PostTask( + FROM_HERE, + {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + base::BindOnce(&EchoServer, fds[0])); + + return fds[1]; +} + +} // namespace + +// Arbitrary uuid for testing. +const char FakeFlossSocketManager::kRfcommUuid[] = "12ef5008"; + +FakeFlossSocketManager::FakeFlossSocketManager() = default; +FakeFlossSocketManager::~FakeFlossSocketManager() = default; + +void FakeFlossSocketManager::Init(dbus::Bus* bus, + const std::string& service_name, + const std::string& adapter_path) {} + +void FakeFlossSocketManager::ListenUsingL2cap( + const Security security_level, + ResponseCallback<BtifStatus> callback, + ConnectionStateChanged ready_cb, + ConnectionAccepted new_connection_cb) { + std::move(callback).Run( + base::unexpected(Error(kNotImplemented, "ListenUsingL2Cap"))); +} + +void FakeFlossSocketManager::ListenUsingRfcomm( + const std::string& name, + const device::BluetoothUUID& uuid, + const Security security_level, + ResponseCallback<BtifStatus> callback, + ConnectionStateChanged ready_cb, + ConnectionAccepted new_connection_cb) { + if (uuid.canonical_value() != + device::BluetoothUUID(kRfcommUuid).canonical_value()) { + std::move(callback).Run( + base::unexpected(Error(kUnsupportedUuid, "ListenUsingRfcomm"))); + return; + } + + SocketId next_id = socket_id_ctr_++; + + listening_sockets_to_callbacks_.insert( + {next_id, {std::move(ready_cb), std::move(new_connection_cb)}}); + + std::move(callback).Run(BtifStatus::kSuccess); +} + +void FakeFlossSocketManager::ConnectUsingL2cap( + const FlossDeviceId& remote_device, + const int psm, + const Security security_level, + ConnectionCompleted callback) { + std::move(callback).Run(BtifStatus::kFail, /*socket=*/absl::nullopt); +} + +void FakeFlossSocketManager::ConnectUsingRfcomm( + const FlossDeviceId& remote_device, + const device::BluetoothUUID& uuid, + const Security security_level, + ConnectionCompleted callback) { + // Check for the supported uuid or return error. + if (uuid.canonical_value() != + device::BluetoothUUID(kRfcommUuid).canonical_value()) { + std::move(callback).Run(BtifStatus::kFail, /*socket=*/absl::nullopt); + return; + } + + // Grab a new socket id and complete the connection. + FlossSocket socket; + socket.id = socket_id_ctr_++; + socket.remote_device = remote_device; + socket.type = SocketType::kRfcomm; + socket.uuid = uuid; + socket.fd = base::ScopedFD(SimulateSocket()); + + absl::optional<FlossSocket> sockout(std::move(socket)); + std::move(callback).Run(BtifStatus::kSuccess, std::move(sockout)); +} + +void FakeFlossSocketManager::Accept(const SocketId id, + absl::optional<uint32_t> timeout_ms, + ResponseCallback<BtifStatus> callback) { + auto found = listening_sockets_to_callbacks_.find(id); + if (found != listening_sockets_to_callbacks_.end()) { + std::move(callback).Run(BtifStatus::kSuccess); + } else { + std::move(callback).Run(BtifStatus::kFail); + } +} + +void FakeFlossSocketManager::Close(const SocketId id, + ResponseCallback<BtifStatus> callback) { + auto found = listening_sockets_to_callbacks_.find(id); + + // Once the id is found, first send closed event, then the response callback + // and then erase the id from map. + if (found != listening_sockets_to_callbacks_.end()) { + auto& [state_changed, accepted] = listening_sockets_to_callbacks_[id]; + + FlossListeningSocket socket; + socket.id = id; + + state_changed.Run(ServerSocketState::kClosed, std::move(socket), + BtifStatus::kSuccess); + std::move(callback).Run(BtifStatus::kSuccess); + + listening_sockets_to_callbacks_.erase(found); + } else { + std::move(callback).Run(BtifStatus::kFail); + } +} + +void FakeFlossSocketManager::SendSocketReady(const SocketId id, + const device::BluetoothUUID& uuid, + const BtifStatus status) { + if (listening_sockets_to_callbacks_.find(id) != + listening_sockets_to_callbacks_.end()) { + FlossListeningSocket socket; + socket.id = id; + socket.type = SocketType::kRfcomm; + socket.uuid = uuid; + + auto& [state_changed, accepted] = listening_sockets_to_callbacks_[id]; + state_changed.Run(ServerSocketState::kReady, std::move(socket), + BtifStatus::kSuccess); + } +} + +void FakeFlossSocketManager::SendSocketClosed(const SocketId id, + const BtifStatus status) { + if (listening_sockets_to_callbacks_.find(id) != + listening_sockets_to_callbacks_.end()) { + FlossListeningSocket socket; + socket.id = id; + socket.type = SocketType::kRfcomm; + + auto& [state_changed, accepted] = listening_sockets_to_callbacks_[id]; + state_changed.Run(ServerSocketState::kClosed, std::move(socket), + BtifStatus::kSuccess); + } +} + +void FakeFlossSocketManager::SendIncomingConnection( + const SocketId listener_id, + const FlossDeviceId& remote_device, + const device::BluetoothUUID& uuid) { + if (listening_sockets_to_callbacks_.find(listener_id) != + listening_sockets_to_callbacks_.end()) { + // Create a fake socket and send a new connection callback. + FlossSocket socket; + socket.id = listener_id; + socket.remote_device = remote_device; + socket.type = SocketType::kRfcomm; + socket.uuid = uuid; + socket.fd = base::ScopedFD(SimulateSocket()); + + auto& [state_changed, accepted] = + listening_sockets_to_callbacks_[listener_id]; + accepted.Run(std::move(socket)); + } +} + +} // namespace floss
diff --git a/device/bluetooth/floss/fake_floss_socket_manager.h b/device/bluetooth/floss/fake_floss_socket_manager.h new file mode 100644 index 0000000..a6b041a --- /dev/null +++ b/device/bluetooth/floss/fake_floss_socket_manager.h
@@ -0,0 +1,79 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_BLUETOOTH_FLOSS_FAKE_FLOSS_SOCKET_MANAGER_H_ +#define DEVICE_BLUETOOTH_FLOSS_FAKE_FLOSS_SOCKET_MANAGER_H_ + +#include "base/logging.h" +#include "device/bluetooth/bluetooth_export.h" +#include "device/bluetooth/floss/floss_socket_manager.h" + +namespace floss { + +class DEVICE_BLUETOOTH_EXPORT FakeFlossSocketManager + : public FlossSocketManager { + public: + FakeFlossSocketManager(); + ~FakeFlossSocketManager() override; + + // Recognized uuid for testing rfcomm socket. + static const char kRfcommUuid[]; + + // Recognized psm for testing l2cap socket. + static const int kL2capPsm; + + // Uuid which will fail to be registered. + static const char kUnregisterableUuid[]; + + // Fake overrides. + void Init(dbus::Bus* bus, + const std::string& service_name, + const std::string& adapter_path) override; + void ListenUsingL2cap(const Security security_level, + ResponseCallback<BtifStatus> callback, + ConnectionStateChanged ready_cb, + ConnectionAccepted new_connection_cb) override; + void ListenUsingRfcomm(const std::string& name, + const device::BluetoothUUID& uuid, + const Security security_level, + ResponseCallback<BtifStatus> callback, + ConnectionStateChanged ready_cb, + ConnectionAccepted new_connection_cb) override; + void ConnectUsingL2cap(const FlossDeviceId& remote_device, + const int psm, + const Security security_level, + ConnectionCompleted callback) override; + void ConnectUsingRfcomm(const FlossDeviceId& remote_device, + const device::BluetoothUUID& uuid, + const Security security_level, + ConnectionCompleted callback) override; + void Accept(const SocketId id, + absl::optional<uint32_t> timeout_ms, + ResponseCallback<BtifStatus> callback) override; + void Close(const SocketId id, ResponseCallback<BtifStatus> callback) override; + + // Send ready state to a listener socket. + void SendSocketReady(const SocketId id, + const device::BluetoothUUID& uuid, + const BtifStatus status); + + // Send closed state to a listener socket. + void SendSocketClosed(const SocketId id, const BtifStatus status); + + // Send an incoming connection to a listener socket. + void SendIncomingConnection(const SocketId listener_id, + const FlossDeviceId& remote_device, + const device::BluetoothUUID& uuid); + + // Gets the next id to be used for sockets. + SocketId GetNextId() const { return socket_id_ctr_; } + + private: + SocketId socket_id_ctr_ = 100; + + base::WeakPtrFactory<FakeFlossSocketManager> weak_ptr_factory_{this}; +}; + +} // namespace floss + +#endif // DEVICE_BLUETOOTH_FLOSS_FAKE_FLOSS_SOCKET_MANAGER_H_
diff --git a/device/bluetooth/floss/floss_dbus_manager.cc b/device/bluetooth/floss/floss_dbus_manager.cc index 156ef36..e61a96c 100644 --- a/device/bluetooth/floss/floss_dbus_manager.cc +++ b/device/bluetooth/floss/floss_dbus_manager.cc
@@ -18,6 +18,7 @@ #include "device/bluetooth/floss/fake_floss_manager_client.h" #include "device/bluetooth/floss/floss_adapter_client.h" #include "device/bluetooth/floss/floss_manager_client.h" +#include "device/bluetooth/floss/floss_socket_manager.h" namespace floss { @@ -177,6 +178,10 @@ return client_bundle_->adapter_client(); } +FlossSocketManager* FlossDBusManager::GetSocketManager() { + return client_bundle_->socket_manager(); +} + void FlossDBusManager::InitializeAdapterClients(int adapter) { // Clean up active adapter clients if (active_adapter_ != kInvalidAdapter) { @@ -196,6 +201,8 @@ // Initialize any adapter clients. client_bundle_->adapter_client()->Init(GetSystemBus(), kAdapterService, adapter_path.value()); + client_bundle_->socket_manager()->Init(GetSystemBus(), kAdapterService, + adapter_path.value()); } void FlossDBusManagerSetter::SetFlossManagerClient( @@ -208,6 +215,11 @@ FlossDBusManager::Get()->client_bundle_->adapter_client_ = std::move(client); } +void FlossDBusManagerSetter::SetFlossSocketManager( + std::unique_ptr<FlossSocketManager> mgr) { + FlossDBusManager::Get()->client_bundle_->socket_manager_ = std::move(mgr); +} + FlossClientBundle::FlossClientBundle(bool use_stubs) : use_stubs_(use_stubs) { if (use_stubs) { return; @@ -226,6 +238,7 @@ } adapter_client_ = FlossAdapterClient::Create(); + socket_manager_ = FlossSocketManager::Create(); } } // namespace floss
diff --git a/device/bluetooth/floss/floss_dbus_manager.h b/device/bluetooth/floss/floss_dbus_manager.h index 38af736..e8103c5 100644 --- a/device/bluetooth/floss/floss_dbus_manager.h +++ b/device/bluetooth/floss/floss_dbus_manager.h
@@ -27,9 +27,10 @@ namespace floss { class FlossAdapterClient; -class FlossManagerClient; class FlossClientBundle; class FlossDBusManagerSetter; +class FlossManagerClient; +class FlossSocketManager; // FlossDBusManager manages the lifetimes of D-Bus connections and clients. It // ensures the proper ordering of shutdowns for the D-Bus thread, connections @@ -100,6 +101,7 @@ // pointers after FlossDBusManager has been shut down. FlossManagerClient* GetManagerClient(); FlossAdapterClient* GetAdapterClient(); + FlossSocketManager* GetSocketManager(); private: friend class FlossDBusManagerSetter; @@ -146,6 +148,7 @@ public: void SetFlossManagerClient(std::unique_ptr<FlossManagerClient> client); void SetFlossAdapterClient(std::unique_ptr<FlossAdapterClient> client); + void SetFlossSocketManager(std::unique_ptr<FlossSocketManager> manager); }; // FlossDBusThreadManager manages the D-Bus thread, the thread dedicated to @@ -192,6 +195,8 @@ FlossAdapterClient* adapter_client() { return adapter_client_.get(); } + FlossSocketManager* socket_manager() { return socket_manager_.get(); } + private: friend FlossDBusManagerSetter; friend FlossDBusManager; @@ -201,6 +206,7 @@ bool use_stubs_; std::unique_ptr<FlossManagerClient> manager_client_; std::unique_ptr<FlossAdapterClient> adapter_client_; + std::unique_ptr<FlossSocketManager> socket_manager_; }; } // namespace floss
diff --git a/device/bluetooth/floss/floss_socket_manager.h b/device/bluetooth/floss/floss_socket_manager.h index f680633..e7cd299 100644 --- a/device/bluetooth/floss/floss_socket_manager.h +++ b/device/bluetooth/floss/floss_socket_manager.h
@@ -223,6 +223,15 @@ // Service which implements the SocketManager interface. std::string service_name_; + // Map of listening sockets to callbacks. + std::unordered_map<SocketId, + std::pair<ConnectionStateChanged, ConnectionAccepted>> + listening_sockets_to_callbacks_; + + // Map of connection sockets that haven't completed. + std::unordered_map<SocketId, ConnectionCompleted> + connecting_sockets_to_callbacks_; + private: template <typename R, typename... Args> void CallSocketMethod(ResponseCallback<R> callback, @@ -239,15 +248,6 @@ // ownership of the file descriptors. A value of zero is invalid. CallbackId callback_id_ = 0; - // Map of listening sockets to callbacks. - std::unordered_map<SocketId, - std::pair<ConnectionStateChanged, ConnectionAccepted>> - listening_sockets_to_callbacks_; - - // Map of connection sockets that haven't completed. - std::unordered_map<SocketId, ConnectionCompleted> - connecting_sockets_to_callbacks_; - base::WeakPtrFactory<FlossSocketManager> weak_ptr_factory_{this}; }; } // namespace floss
diff --git a/gpu/command_buffer/common/capabilities.h b/gpu/command_buffer/common/capabilities.h index 0329162..027528e7 100644 --- a/gpu/command_buffer/common/capabilities.h +++ b/gpu/command_buffer/common/capabilities.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include <vector> +#include "base/containers/flat_map.h" #include "gpu/command_buffer/common/gpu_memory_buffer_support.h" #include "gpu/gpu_export.h" #include "ui/gfx/buffer_types.h" @@ -219,6 +220,9 @@ gfx::BufferFormat::YVU_420, }; std::vector<gfx::BufferUsageAndFormat> texture_target_exception_list; + + base::flat_map<uint32_t, std::vector<uint64_t>> drm_formats_and_modifiers; + std::string drm_render_node; }; } // namespace gpu
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index 9060177..1c2420d 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -360,6 +360,10 @@ "//ui/gl/init", ] + if (is_chromeos) { + deps += [ "//build/config/linux/libdrm" ] + } + # If statically linked against ANGLE, link against angle:translator which is already included with ANGLE. if (use_static_angle) { deps += [ "//third_party/angle:translator" ]
diff --git a/gpu/command_buffer/service/dawn_caching_interface.cc b/gpu/command_buffer/service/dawn_caching_interface.cc index 49fd12c..49f95e15 100644 --- a/gpu/command_buffer/service/dawn_caching_interface.cc +++ b/gpu/command_buffer/service/dawn_caching_interface.cc
@@ -8,14 +8,16 @@ #include "base/callback_helpers.h" #include "base/memory/ptr_util.h" +#include "gpu/command_buffer/service/decoder_client.h" #include "gpu/config/gpu_preferences.h" #include "net/base/io_buffer.h" #include "net/disk_cache/disk_cache.h" namespace gpu::webgpu { -DawnCachingInterface::DawnCachingInterface(ScopedDiskCacheBackend backend) - : backend_(std::move(backend)) {} +DawnCachingInterface::DawnCachingInterface(ScopedDiskCacheBackend backend, + DecoderClient* decoder_client) + : backend_(std::move(backend)), decoder_client_(decoder_client) {} DawnCachingInterface::~DawnCachingInterface() = default; @@ -71,7 +73,12 @@ static_cast<const char*>(value)); entry->WriteData(0, 0, buffer.get(), value_size, base::DoNothing(), false); - // TODO(dawn:549) Send the blob to be stored on disk. + // Send the cache entry to be stored on the host-side if applicable. + if (decoder_client_) { + std::string value_str(static_cast<const char*>(value), value_size); + decoder_client_->CacheBlob(gpu::GpuDiskCacheType::kDawnWebGPU, key_str, + value_str); + } } DawnCachingInterfaceFactory::DawnCachingInterfaceFactory(BackendFactory factory) @@ -107,18 +114,21 @@ std::unique_ptr<DawnCachingInterface> DawnCachingInterfaceFactory::CreateInstance( - const gpu::GpuDiskCacheHandle& handle) { + const gpu::GpuDiskCacheHandle& handle, + DecoderClient* decoder_client) { DCHECK(gpu::GetHandleType(handle) == gpu::GpuDiskCacheType::kDawnWebGPU); if (const auto it = backends_.find(handle); it != backends_.end()) { - return base::WrapUnique(new DawnCachingInterface(it->second)); + return base::WrapUnique( + new DawnCachingInterface(it->second, decoder_client)); } ScopedDiskCacheBackend backend = backend_factory_.Run(); if (backend->data.get() != nullptr) { backends_[handle] = backend; } - return base::WrapUnique(new DawnCachingInterface(std::move(backend))); + return base::WrapUnique( + new DawnCachingInterface(std::move(backend), decoder_client)); } std::unique_ptr<DawnCachingInterface>
diff --git a/gpu/command_buffer/service/dawn_caching_interface.h b/gpu/command_buffer/service/dawn_caching_interface.h index 7d92716..1aec136 100644 --- a/gpu/command_buffer/service/dawn_caching_interface.h +++ b/gpu/command_buffer/service/dawn_caching_interface.h
@@ -15,7 +15,11 @@ #include "gpu/ipc/common/gpu_disk_cache_type.h" #include "net/disk_cache/disk_cache.h" -namespace gpu::webgpu { +namespace gpu { + +class DecoderClient; + +namespace webgpu { class DawnCachingInterfaceFactory; @@ -55,10 +59,16 @@ // Constructor is private because creation of interfaces should be deferred to // the factory. - explicit DawnCachingInterface(ScopedDiskCacheBackend backend); + explicit DawnCachingInterface(ScopedDiskCacheBackend backend, + DecoderClient* decoder_client = nullptr); // Caching interface owns a reference to the backend. ScopedDiskCacheBackend backend_ = nullptr; + + // Decoder client provides ability to store cache entries to persistent disk. + // The client is not owned by this class and needs to be valid throughout the + // interfaces lifetime. + raw_ptr<DecoderClient> decoder_client_ = nullptr; }; // Factory class for producing and managing DawnCachingInterfaces. @@ -78,7 +88,8 @@ // necessary. For handle based instances, the factory keeps a reference to the // backend until ReleaseHandle below is called. std::unique_ptr<DawnCachingInterface> CreateInstance( - const gpu::GpuDiskCacheHandle& handle); + const gpu::GpuDiskCacheHandle& handle, + DecoderClient* decoder_client = nullptr); // Returns a pointer to a DawnCachingInterface that owns the in memory // backend. This is used for incognito cases where the cache should not be @@ -108,6 +119,7 @@ std::map<gpu::GpuDiskCacheHandle, ScopedDiskCacheBackend> backends_; }; -} // namespace gpu::webgpu +} // namespace webgpu +} // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_DAWN_CACHING_INTERFACE_H_
diff --git a/gpu/command_buffer/service/dawn_caching_interface_unittest.cc b/gpu/command_buffer/service/dawn_caching_interface_unittest.cc index 0b3c6e4..e9ea9b7 100644 --- a/gpu/command_buffer/service/dawn_caching_interface_unittest.cc +++ b/gpu/command_buffer/service/dawn_caching_interface_unittest.cc
@@ -7,12 +7,15 @@ #include <string> #include <string_view> +#include "gpu/command_buffer/service/mocks.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace gpu::webgpu { namespace { +using ::testing::StrictMock; + class DawnCachingInterfaceTest : public testing::Test { protected: static constexpr std::string_view kKey = "cache key"; @@ -24,6 +27,7 @@ DawnCachingInterfaceFactory factory_; gpu::GpuDiskCacheHandle handle_ = kDawnHandle; + StrictMock<MockDecoderClient> decoder_client_mock_; }; TEST_F(DawnCachingInterfaceTest, LoadNonexistentSize) { @@ -114,5 +118,16 @@ } } +TEST_F(DawnCachingInterfaceTest, StoreTriggersHostSide) { + auto dawn_caching_interface = + factory_.CreateInstance(handle_, &decoder_client_mock_); + + EXPECT_CALL(decoder_client_mock_, + CacheBlob(gpu::GpuDiskCacheType::kDawnWebGPU, std::string(kKey), + std::string(kData))); + dawn_caching_interface->StoreData(kKey.data(), kKeySize, kData.data(), + kDataSize); +} + } // namespace } // namespace gpu::webgpu
diff --git a/gpu/command_buffer/service/gl_utils.cc b/gpu/command_buffer/service/gl_utils.cc index 1933bd92..85c3b487 100644 --- a/gpu/command_buffer/service/gl_utils.cc +++ b/gpu/command_buffer/service/gl_utils.cc
@@ -16,6 +16,11 @@ #include "gpu/command_buffer/service/texture_manager.h" #include "ui/gl/gl_version_info.h" +#if BUILDFLAG(IS_CHROMEOS) +#include <drm_fourcc.h> +#include "ui/gl/gl_surface_egl.h" +#endif + namespace gpu { namespace gles2 { @@ -276,6 +281,136 @@ } } +#if BUILDFLAG(IS_CHROMEOS) +bool IsValidFourCCFormat(uint32_t current_format) { + switch (current_format) { + case DRM_FORMAT_R8: + case DRM_FORMAT_GR88: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_ARGB2101010: + case DRM_FORMAT_ABGR2101010: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_NV12: + case DRM_FORMAT_YVU420: + case DRM_FORMAT_P010: + return true; + default: + return false; + } +} + +gfx::BufferFormat GetBufferFormatFromFourCCFormat(int format) { + switch (format) { + case DRM_FORMAT_R8: + return gfx::BufferFormat::R_8; + case DRM_FORMAT_GR88: + return gfx::BufferFormat::RG_88; + case DRM_FORMAT_ABGR8888: + return gfx::BufferFormat::RGBA_8888; + case DRM_FORMAT_XBGR8888: + return gfx::BufferFormat::RGBX_8888; + case DRM_FORMAT_ARGB8888: + return gfx::BufferFormat::BGRA_8888; + case DRM_FORMAT_XRGB8888: + return gfx::BufferFormat::BGRX_8888; + case DRM_FORMAT_ABGR2101010: + return gfx::BufferFormat::RGBA_1010102; + case DRM_FORMAT_ARGB2101010: + return gfx::BufferFormat::BGRA_1010102; + case DRM_FORMAT_RGB565: + return gfx::BufferFormat::BGR_565; + case DRM_FORMAT_NV12: + return gfx::BufferFormat::YUV_420_BIPLANAR; + case DRM_FORMAT_YVU420: + return gfx::BufferFormat::YVU_420; + case DRM_FORMAT_P010: + return gfx::BufferFormat::P010; + default: + NOTREACHED(); + return gfx::BufferFormat::BGRA_8888; + } +} + +void PopulateDRMCapabilities(Capabilities* caps) { + DCHECK(caps != nullptr); + + EGLDisplay egl_display = gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(); + if (egl_display) { + if (gl::GLSurfaceEGL::GetGLDisplayEGL() + ->ext->b_EGL_EXT_image_dma_buf_import_modifiers) { + EGLint num_formats = 0; + if (eglQueryDmaBufFormatsEXT(egl_display, 0, nullptr, &num_formats) && + num_formats > 0) { + std::vector<EGLint> formats_array(num_formats); + bool res = eglQueryDmaBufFormatsEXT(egl_display, num_formats, + formats_array.data(), &num_formats); + DCHECK(res); + + for (EGLint format : formats_array) { + if (!IsValidFourCCFormat(format)) { + continue; + } + + if (!caps->gpu_memory_buffer_formats.Has( + GetBufferFormatFromFourCCFormat(format))) { + continue; + } + + std::vector<uint64_t> modifiers; + // Advertise implicit modifier support + modifiers.push_back(DRM_FORMAT_MOD_INVALID); + + EGLint num_modifiers = 0; + if (eglQueryDmaBufModifiersEXT(egl_display, format, 0, nullptr, + nullptr, &num_modifiers) && + num_modifiers > 0) { + std::vector<EGLuint64KHR> modifiers_array(num_modifiers); + res = eglQueryDmaBufModifiersEXT(egl_display, format, num_modifiers, + modifiers_array.data(), nullptr, + &num_modifiers); + DCHECK(res); + + for (uint64_t modifier : modifiers_array) { + modifiers.push_back(modifier); + } + } + + caps->drm_formats_and_modifiers.emplace(format, modifiers); + } + } + } + + if (gl::g_driver_egl.client_ext.b_EGL_EXT_device_query) { + EGLAttrib attrib; + if (eglQueryDisplayAttribEXT(egl_display, EGL_DEVICE_EXT, &attrib)) { + EGLDeviceEXT egl_device = (EGLDeviceEXT)attrib; + const char* device_extensions = + eglQueryDeviceStringEXT(egl_device, EGL_EXTENSIONS); + if (device_extensions) { + gfx::ExtensionSet device_extension_set = + gfx::MakeExtensionSet(device_extensions); + if (gfx::HasExtension(device_extension_set, + "EGL_EXT_device_drm_render_node")) { + const char* path = eglQueryDeviceStringEXT( + egl_device, EGL_DRM_RENDER_NODE_FILE_EXT); + caps->drm_render_node = std::string(path); + } + if (caps->drm_render_node.empty() && + gfx::HasExtension(device_extension_set, "EGL_EXT_device_drm")) { + const char* path = + eglQueryDeviceStringEXT(egl_device, EGL_DRM_DEVICE_FILE_EXT); + caps->drm_render_node = std::string(path); + } + } + } + } + } +} +#endif + bool CheckUniqueAndNonNullIds(GLsizei n, const GLuint* client_ids) { if (n <= 0) return true;
diff --git a/gpu/command_buffer/service/gl_utils.h b/gpu/command_buffer/service/gl_utils.h index 5538bc4..a203446d0 100644 --- a/gpu/command_buffer/service/gl_utils.h +++ b/gpu/command_buffer/service/gl_utils.h
@@ -79,6 +79,10 @@ void PopulateNumericCapabilities(Capabilities* caps, const FeatureInfo* feature_info); +#if BUILDFLAG(IS_CHROMEOS) +void PopulateDRMCapabilities(Capabilities* caps); +#endif + bool CheckUniqueAndNonNullIds(GLsizei n, const GLuint* client_ids); const char* GetServiceVersionString(const FeatureInfo* feature_info);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index db701f9..0203148 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4337,6 +4337,10 @@ caps.angle_rgbx_internal_format = feature_info_->feature_flags().angle_rgbx_internal_format; +#if BUILDFLAG(IS_CHROMEOS) + PopulateDRMCapabilities(&caps); +#endif + return caps; }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc index c3bcb6af..bb07519 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -1749,6 +1749,10 @@ caps.angle_rgbx_internal_format = feature_info_->feature_flags().angle_rgbx_internal_format; +#if BUILDFLAG(IS_CHROMEOS) + PopulateDRMCapabilities(&caps); +#endif + return caps; }
diff --git a/gpu/command_buffer/service/mocks.cc b/gpu/command_buffer/service/mocks.cc index c8eb568..44510bf 100644 --- a/gpu/command_buffer/service/mocks.cc +++ b/gpu/command_buffer/service/mocks.cc
@@ -70,6 +70,9 @@ command_buffer_service_->SetToken(args->token); } +MockDecoderClient::MockDecoderClient() = default; +MockDecoderClient::~MockDecoderClient() = default; + namespace gles2 { MockShaderTranslator::MockShaderTranslator() = default; @@ -84,5 +87,3 @@ } // namespace gles2 } // namespace gpu - -
diff --git a/gpu/command_buffer/service/mocks.h b/gpu/command_buffer/service/mocks.h index a0d4565..7b84247 100644 --- a/gpu/command_buffer/service/mocks.h +++ b/gpu/command_buffer/service/mocks.h
@@ -19,6 +19,7 @@ #include "base/memory/raw_ptr.h" #include "gpu/command_buffer/common/cmd_buffer_common.h" #include "gpu/command_buffer/service/async_api_interface.h" +#include "gpu/command_buffer/service/decoder_client.h" #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/command_buffer/service/program_cache.h" #include "gpu/command_buffer/service/shader_translator.h" @@ -87,6 +88,27 @@ raw_ptr<CommandBufferServiceBase> command_buffer_service_; }; +class MockDecoderClient : public DecoderClient { + public: + MockDecoderClient(); + ~MockDecoderClient() override; + + MOCK_METHOD(void, OnConsoleMessage, (int32_t id, const std::string& message)); + MOCK_METHOD(void, OnGpuSwitched, (gl::GpuPreference active_gpu_heuristic)); + MOCK_METHOD(void, + CacheBlob, + (gpu::GpuDiskCacheType type, + const std::string& key, + const std::string& shader)); + MOCK_METHOD(void, OnFenceSyncRelease, (uint64_t release)); + MOCK_METHOD(void, OnDescheduleUntilFinished, ()); + MOCK_METHOD(void, OnRescheduleAfterFinished, ()); + MOCK_METHOD(void, OnSwapBuffers, (uint64_t swap_id, uint32_t flags)); + MOCK_METHOD(void, ScheduleGrContextCleanup, ()); + MOCK_METHOD(void, SetActiveURL, (GURL url)); + MOCK_METHOD(void, HandleReturnData, (base::span<const uint8_t> data)); +}; + namespace gles2 { class MockShaderTranslator : public ShaderTranslatorInterface {
diff --git a/gpu/command_buffer/service/webgpu_decoder.cc b/gpu/command_buffer/service/webgpu_decoder.cc index a5ce0cd0..b2154adc 100644 --- a/gpu/command_buffer/service/webgpu_decoder.cc +++ b/gpu/command_buffer/service/webgpu_decoder.cc
@@ -22,11 +22,13 @@ MemoryTracker* memory_tracker, gles2::Outputter* outputter, const GpuPreferences& gpu_preferences, - scoped_refptr<SharedContextState> shared_context_state) { + scoped_refptr<SharedContextState> shared_context_state, + const DawnCacheOptions& dawn_cache_options) { #if BUILDFLAG(USE_DAWN) return CreateWebGPUDecoderImpl( client, command_buffer_service, shared_image_manager, memory_tracker, - outputter, gpu_preferences, std::move(shared_context_state)); + outputter, gpu_preferences, std::move(shared_context_state), + dawn_cache_options); #else NOTREACHED(); return nullptr;
diff --git a/gpu/command_buffer/service/webgpu_decoder.h b/gpu/command_buffer/service/webgpu_decoder.h index 8e994cc..4a228c7 100644 --- a/gpu/command_buffer/service/webgpu_decoder.h +++ b/gpu/command_buffer/service/webgpu_decoder.h
@@ -8,6 +8,8 @@ #include "gpu/command_buffer/service/common_decoder.h" #include "gpu/command_buffer/service/decoder_context.h" #include "gpu/gpu_gles2_export.h" +#include "gpu/ipc/common/gpu_disk_cache_type.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace gpu { @@ -24,6 +26,14 @@ namespace webgpu { +class DawnCachingInterfaceFactory; + +// Options specifically passed for Dawn caching; +struct DawnCacheOptions { + DawnCachingInterfaceFactory* caching_interface_factory = nullptr; + absl::optional<GpuDiskCacheHandle> handle = {}; +}; + class GPU_GLES2_EXPORT WebGPUDecoder : public DecoderContext, public CommonDecoder { public: @@ -34,7 +44,8 @@ MemoryTracker* memory_tracker, gles2::Outputter* outputter, const GpuPreferences& gpu_preferences, - scoped_refptr<SharedContextState> shared_context_state); + scoped_refptr<SharedContextState> shared_context_state, + const DawnCacheOptions& dawn_cache_options = {}); WebGPUDecoder(const WebGPUDecoder&) = delete; WebGPUDecoder& operator=(const WebGPUDecoder&) = delete;
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index e3bd549..53a1917a 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -24,6 +24,7 @@ #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/webgpu_cmd_format.h" #include "gpu/command_buffer/service/command_buffer_service.h" +#include "gpu/command_buffer/service/dawn_caching_interface.h" #include "gpu/command_buffer/service/dawn_instance.h" #include "gpu/command_buffer/service/dawn_platform.h" #include "gpu/command_buffer/service/dawn_service_memory_transfer_service.h" @@ -85,13 +86,15 @@ class WebGPUDecoderImpl final : public WebGPUDecoder { public: - WebGPUDecoderImpl(DecoderClient* client, - CommandBufferServiceBase* command_buffer_service, - SharedImageManager* shared_image_manager, - MemoryTracker* memory_tracker, - gles2::Outputter* outputter, - const GpuPreferences& gpu_preferences, - scoped_refptr<SharedContextState> shared_context_state); + WebGPUDecoderImpl( + DecoderClient* client, + CommandBufferServiceBase* command_buffer_service, + SharedImageManager* shared_image_manager, + MemoryTracker* memory_tracker, + gles2::Outputter* outputter, + const GpuPreferences& gpu_preferences, + scoped_refptr<SharedContextState> shared_context_state, + std::unique_ptr<DawnCachingInterface> dawn_caching_interface_factory); WebGPUDecoderImpl(const WebGPUDecoderImpl&) = delete; WebGPUDecoderImpl& operator=(const WebGPUDecoderImpl&) = delete; @@ -940,10 +943,27 @@ MemoryTracker* memory_tracker, gles2::Outputter* outputter, const GpuPreferences& gpu_preferences, - scoped_refptr<SharedContextState> shared_context_state) { - return new WebGPUDecoderImpl( - client, command_buffer_service, shared_image_manager, memory_tracker, - outputter, gpu_preferences, std::move(shared_context_state)); + scoped_refptr<SharedContextState> shared_context_state, + const DawnCacheOptions& dawn_cache_options) { + // Construct a Dawn caching interface if the Dawn configurations enables it. + // If a handle was set, pass the relevant handle and DecoderClient so that + // writing to disk is enabled. Otherwise pass an incognito in-memory version. + std::unique_ptr<webgpu::DawnCachingInterface> dawn_caching_interface = + nullptr; + if (auto* caching_interface_factory = + dawn_cache_options.caching_interface_factory) { + if (dawn_cache_options.handle) { + dawn_caching_interface = caching_interface_factory->CreateInstance( + *dawn_cache_options.handle, client); + } else { + dawn_caching_interface = caching_interface_factory->CreateInstance(); + } + } + + return new WebGPUDecoderImpl(client, command_buffer_service, + shared_image_manager, memory_tracker, outputter, + gpu_preferences, std::move(shared_context_state), + std::move(dawn_caching_interface)); } WebGPUDecoderImpl::WebGPUDecoderImpl( @@ -953,7 +973,8 @@ MemoryTracker* memory_tracker, gles2::Outputter* outputter, const GpuPreferences& gpu_preferences, - scoped_refptr<SharedContextState> shared_context_state) + scoped_refptr<SharedContextState> shared_context_state, + std::unique_ptr<DawnCachingInterface> dawn_caching_interface) : WebGPUDecoder(client, command_buffer_service, outputter), shared_context_state_(std::move(shared_context_state)), gr_context_type_(gpu_preferences.gr_context_type), @@ -961,7 +982,7 @@ std::make_unique<SharedImageRepresentationFactory>( shared_image_manager, memory_tracker)), - dawn_platform_(new DawnPlatform()), + dawn_platform_(new DawnPlatform(std::move(dawn_caching_interface))), dawn_instance_( DawnInstance::Create(dawn_platform_.get(), gpu_preferences)), memory_transfer_service_(new DawnServiceMemoryTransferService(this)),
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.h b/gpu/command_buffer/service/webgpu_decoder_impl.h index 4d572d0..9c40773 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.h +++ b/gpu/command_buffer/service/webgpu_decoder_impl.h
@@ -24,6 +24,7 @@ namespace webgpu { +struct DawnCacheOptions; class WebGPUDecoder; GPU_GLES2_EXPORT WebGPUDecoder* CreateWebGPUDecoderImpl( @@ -33,7 +34,8 @@ MemoryTracker* memory_tracker, gles2::Outputter* outputter, const GpuPreferences& gpu_preferences, - scoped_refptr<SharedContextState> shared_context_state); + scoped_refptr<SharedContextState> shared_context_state, + const DawnCacheOptions& dawn_cache_options); } // namespace webgpu } // namespace gpu
diff --git a/gpu/ipc/common/gpu_command_buffer_traits_multi.h b/gpu/ipc/common/gpu_command_buffer_traits_multi.h index 9b1d576..f858268 100644 --- a/gpu/ipc/common/gpu_command_buffer_traits_multi.h +++ b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
@@ -162,6 +162,8 @@ IPC_STRUCT_TRAITS_MEMBER(gpu_memory_buffer_formats) IPC_STRUCT_TRAITS_MEMBER(texture_target_exception_list) + IPC_STRUCT_TRAITS_MEMBER(drm_formats_and_modifiers) + IPC_STRUCT_TRAITS_MEMBER(drm_render_node) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(gpu::CommandBuffer::State)
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc index a61cbe58..414143c 100644 --- a/gpu/ipc/service/gpu_channel.cc +++ b/gpu/ipc/service/gpu_channel.cc
@@ -1032,6 +1032,15 @@ } #endif // BUILDFLAG(IS_FUCHSIA) +absl::optional<gpu::GpuDiskCacheHandle> GpuChannel::GetCacheHandleForType( + gpu::GpuDiskCacheType type) { + auto it = caches_.find(type); + if (it == caches_.end()) { + return {}; + } + return it->second; +} + void GpuChannel::RegisterCacheHandle(const gpu::GpuDiskCacheHandle& handle) { gpu::GpuDiskCacheType type = gpu::GetHandleType(handle); @@ -1049,11 +1058,11 @@ void GpuChannel::CacheBlob(gpu::GpuDiskCacheType type, const std::string& key, const std::string& shader) { - auto it = caches_.find(type); - if (it == caches_.end()) { + auto handle = GetCacheHandleForType(type); + if (!handle) { return; } - gpu_channel_manager_->delegate()->StoreBlobToDisk(it->second, key, shader); + gpu_channel_manager_->delegate()->StoreBlobToDisk(*handle, key, shader); } uint64_t GpuChannel::GetMemoryUsage() const {
diff --git a/gpu/ipc/service/gpu_channel.h b/gpu/ipc/service/gpu_channel.h index e379bd5..6869e799 100644 --- a/gpu/ipc/service/gpu_channel.h +++ b/gpu/ipc/service/gpu_channel.h
@@ -32,6 +32,7 @@ #include "ipc/ipc_sync_channel.h" #include "mojo/public/cpp/bindings/generic_pending_associated_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" #include "ui/gl/gl_share_group.h" @@ -140,6 +141,8 @@ // Called to remove a listener for a particular message routing ID. void RemoveRoute(int32_t route_id); + absl::optional<gpu::GpuDiskCacheHandle> GetCacheHandleForType( + gpu::GpuDiskCacheType type); void RegisterCacheHandle(const gpu::GpuDiskCacheHandle& handle); void CacheBlob(gpu::GpuDiskCacheType type, const std::string& key,
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc index a835c5c..090a99a 100644 --- a/gpu/ipc/service/gpu_channel_manager.cc +++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -30,6 +30,9 @@ #include "build/build_config.h" #include "gpu/command_buffer/common/context_creation_attribs.h" #include "gpu/command_buffer/common/sync_token.h" +#if BUILDFLAG(USE_DAWN) +#include "gpu/command_buffer/service/dawn_caching_interface.h" +#endif #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/gpu_tracer.h" @@ -368,6 +371,10 @@ gr_shader_cache_.emplace(gpu_preferences.gpu_program_cache_size, this); gr_shader_cache_->CacheClientIdOnDisk(gpu::kDisplayCompositorClientId); } +#if BUILDFLAG(USE_DAWN) + dawn_caching_interface_factory_ = + std::make_unique<webgpu::DawnCachingInterfaceFactory>(); +#endif } GpuChannelManager::~GpuChannelManager() { @@ -528,7 +535,9 @@ break; } case gpu::GpuDiskCacheType::kDawnWebGPU: { - // TODO(dawn:549) Implement cache destruction for Dawn. +#if BUILDFLAG(USE_DAWN) + dawn_caching_interface_factory_->ReleaseHandle(handle); +#endif break; } } @@ -576,8 +585,16 @@ break; } case gpu::GpuDiskCacheType::kDawnWebGPU: { - // TODO(dawn:549) Implement populating cache for Dawn. - NOTREACHED(); +#if BUILDFLAG(USE_DAWN) + std::unique_ptr<gpu::webgpu::DawnCachingInterface> + dawn_caching_interface = + dawn_caching_interface_factory_->CreateInstance(handle); + if (!dawn_caching_interface) { + return; + } + dawn_caching_interface->StoreData(key.data(), key.size(), data.data(), + data.size()); +#endif break; } }
diff --git a/gpu/ipc/service/gpu_channel_manager.h b/gpu/ipc/service/gpu_channel_manager.h index 136207a0..6eb109a 100644 --- a/gpu/ipc/service/gpu_channel_manager.h +++ b/gpu/ipc/service/gpu_channel_manager.h
@@ -74,6 +74,10 @@ class ProgramCache; } // namespace gles2 +namespace webgpu { +class DawnCachingInterfaceFactory; +} // namespace webgpu + // A GpuChannelManager is a thread responsible for issuing rendering commands // managing the lifetimes of GPU channels and forwarding IPC requests from the // browser process to them based on the corresponding renderer ID. @@ -212,6 +216,16 @@ return gr_shader_cache_ ? &*gr_shader_cache_ : nullptr; } +#if BUILDFLAG(USE_DAWN) + webgpu::DawnCachingInterfaceFactory* dawn_caching_interface_factory() { + return dawn_caching_interface_factory_.get(); + } +#else + webgpu::DawnCachingInterfaceFactory* dawn_caching_interface_factory() { + return nullptr; + } +#endif + // raster::GrShaderCache::Client implementation. void StoreShader(const std::string& key, const std::string& shader) override; @@ -361,6 +375,11 @@ absl::optional<raster::GrShaderCache> gr_shader_cache_; scoped_refptr<SharedContextState> shared_context_state_; +#if BUILDFLAG(USE_DAWN) + std::unique_ptr<webgpu::DawnCachingInterfaceFactory> + dawn_caching_interface_factory_; +#endif + // With --enable-vulkan, |vulkan_context_provider_| will be set from // viz::GpuServiceImpl. The raster decoders will use it for rasterization if // features::Vulkan is used.
diff --git a/gpu/ipc/service/webgpu_command_buffer_stub.cc b/gpu/ipc/service/webgpu_command_buffer_stub.cc index d3c8c552..093d8833 100644 --- a/gpu/ipc/service/webgpu_command_buffer_stub.cc +++ b/gpu/ipc/service/webgpu_command_buffer_stub.cc
@@ -13,6 +13,7 @@ #include "gpu/command_buffer/common/constants.h" #include "gpu/command_buffer/common/gpu_memory_buffer_support.h" #include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/service/dawn_caching_interface.h" #include "gpu/command_buffer/service/gl_context_virtual.h" #include "gpu/command_buffer/service/gl_state_restorer_impl.h" #include "gpu/command_buffer/service/logger.h" @@ -114,12 +115,16 @@ memory_tracker_ = CreateMemoryTracker(); + webgpu::DawnCacheOptions dawn_cache_options = { + manager->dawn_caching_interface_factory(), + channel_->GetCacheHandleForType(gpu::GpuDiskCacheType::kDawnWebGPU)}; + command_buffer_ = std::make_unique<CommandBufferService>(this, memory_tracker_.get()); std::unique_ptr<webgpu::WebGPUDecoder> decoder(webgpu::WebGPUDecoder::Create( this, command_buffer_.get(), manager->shared_image_manager(), memory_tracker_.get(), manager->outputter(), manager->gpu_preferences(), - std::move(shared_context_state))); + std::move(shared_context_state), dawn_cache_options)); sync_point_client_state_ = channel_->sync_point_manager()->CreateSyncPointClientState(
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb index f90523f..f94baab 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb
@@ -41,6 +41,7 @@ <translation id="2918709798697875261">Votre organisation vous demande de rester déconnecté de Chromium.</translation> <translation id="2942241131342758843">Utilisez Chromium par défaut pour ouvrir des liens, faire des recherches dans des widgets et entrer automatiquement des mots de passe dans d'autres applications</translation> <translation id="2977470724722393594">Chromium est à jour</translation> +<translation id="3102849287235003384">Pour vous déconnecter de votre compte Google sur tous les sites Web, <ph name="BEGIN_LINK" />déconnectez-vous de Chrome<ph name="END_LINK" />.</translation> <translation id="3256316712990552818">Copiée dans Chromium</translation> <translation id="3344973607274501920">Chromium n'a pas pu vérifier vos mots de passe. Essayez de vérifier votre connexion Internet.</translation> <translation id="3472200483164753384">Fonctionnalité non prise en charge par Chromium Canary</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb index 0c08f6b..e0489836 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
@@ -41,6 +41,7 @@ <translation id="2918709798697875261">Szervezete nem engedélyezi, hogy bejelentkezzen a Chromiumba.</translation> <translation id="2942241131342758843">A Chromiumot alapértelmezett böngészőként használva linkek nyithatók meg, modulokban lehet keresni, és jelszavak tölthetők be automatikusan az egyéb alkalmazásokban</translation> <translation id="2977470724722393594">A Chromium naprakész</translation> +<translation id="3102849287235003384">Ha az összes webhelyen ki szeretne jelentkezni Google-fiókjából, <ph name="BEGIN_LINK" />jelentkezzen ki a Chromiumból<ph name="END_LINK" />.</translation> <translation id="3256316712990552818">A Chromiumra másolva</translation> <translation id="3344973607274501920">A Chromium nem tudta ellenőrizni a jelszavakat. Ellenőrizze az internetkapcsolatot.</translation> <translation id="3472200483164753384">A Chromium Canary nem támogatja</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb index e11b1233..a5a749f 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -41,6 +41,7 @@ <translation id="2918709798697875261">ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನೀವು Chromium ನಿಂದ ಸೈನ್ ಔಟ್ ಆಗಿರಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.</translation> <translation id="2942241131342758843">ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಲು, ವಿಜೆಟ್ಗಳಿಂದ ಹುಡುಕಲು ಮತ್ತು ಇತರ ಆ್ಯಪ್ಗಳಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಭರ್ತಿ ಮಾಡಲು ಡೀಫಾಲ್ಟ್ ಆಗಿ Chromium ಬಳಸಿ</translation> <translation id="2977470724722393594">Chromium ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> +<translation id="3102849287235003384">ಎಲ್ಲಾ ವೆಬ್ಸೈಟ್ಗಳಲ್ಲಿ ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಲು, <ph name="BEGIN_LINK" />Chromium ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಿ<ph name="END_LINK" />.</translation> <translation id="3256316712990552818">Chromium ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="3344973607274501920">Chromium ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಪರಿಶೀಲಿಸಿ ನೋಡಿ.</translation> <translation id="3472200483164753384">Chromium Canary ನಲ್ಲಿ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb index 0a6974bf..26e2295 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb
@@ -40,6 +40,7 @@ <translation id="2918709798697875261">तपाईंको सङ्गठनका अनुसार तपाईं Chromium बाट साइन आउट रहिरहनु पर्ने हुन्छ।</translation> <translation id="2942241131342758843">लिंक खोल्न, विजेटबाट खोजी गर्न तथा अन्य एपहरूमा पासवर्ड स्वतः भर्न डिफल्ट रूपमा Chromium प्रयोग गर्नुहोस्</translation> <translation id="2977470724722393594">Chromium अद्यावधिक छ</translation> +<translation id="3102849287235003384">सबै वेबसाइटहरूमा आफ्नो Google खाताबाट साइन आउट गर्न <ph name="BEGIN_LINK" />Chromium बाट साइन आउट गर्नुहोस्<ph name="END_LINK" />।</translation> <translation id="3256316712990552818">Chromium मा सारियो</translation> <translation id="3344973607274501920">Chromium ले तपाईंका पासवर्डहरू जाँच्न सकेन। आफ्नो इन्टरनेट जाँच गरी हेर्नुहोस्।</translation> <translation id="3472200483164753384">Chromium क्यानेरीमा प्रयोग गर्न मिल्दैन</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb index 3c79e29..486a4dde 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -41,6 +41,7 @@ <translation id="2918709798697875261">Organisasjonen din krever at du forblir logget av Chromium.</translation> <translation id="2942241131342758843">Bruk Chromium som standard til å åpne linker, søke i moduler og fylle ut passord i andre apper automatisk</translation> <translation id="2977470724722393594">Chromium er oppdatert</translation> +<translation id="3102849287235003384">For å logge av Google-kontoen din på alle nettsteder, <ph name="BEGIN_LINK" />logg av Chromium<ph name="END_LINK" />.</translation> <translation id="3256316712990552818">Kopiert til Chromium</translation> <translation id="3344973607274501920">Chromium kunne ikke sjekke passordene dine. Se om du er koblet til internett.</translation> <translation id="3472200483164753384">Støttes ikke i Chromium Canary</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb index d071e04..e6cb92d 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
@@ -66,6 +66,7 @@ <translation id="5308226104666789935">Chromium 無法檢查更新</translation> <translation id="5396916991083608703">要將 Chromium 設定為預設瀏覽器嗎?</translation> <translation id="5521125884468363740">如要在任何使用 Chromium 的裝置上查看分頁,請登入並開啟同步功能</translation> +<translation id="5522297504975449419">部分 Chromium 功能將無法再使用。</translation> <translation id="5573014823074921752">Chromium 提示。如果要多啲標籤選項,請㩒住螢幕底部或者頂部工具列入面中嘅 [顯示分頁] 掣。</translation> <translation id="5700709190537129682">Chromium 無法檢查密碼</translation> <translation id="5777187867430702742">Chromium 頁面</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb index a5a2c9d..749d1dd 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb
@@ -28,6 +28,7 @@ <translation id="2576431527583832481">Une nouvelle version améliorée de Google Chrome est maintenant offerte.</translation> <translation id="257708665678654955">Souhaitez-vous que Google Chrome vous propose de traduire les pages de ce site rédigées en <ph name="LANGUAGE_NAME" /> lors de votre prochaine visite?</translation> <translation id="2671426118752779020">Vous pouvez utiliser les mots de passe que vous avez enregistrés dans le gestionnaire de mots de passe Google pour d'autres applications sur votre iPhone.</translation> +<translation id="2689064829982324496">Pour vous déconnecter de votre compte Google sur tous les sites Web, <ph name="BEGIN_LINK" />déconnectez-vous de Chrome<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome n'a pas pu vérifier s'il y a des mises à jour. Réessayez plus tard.</translation> <translation id="2732745070297234559">Chrome n'a pas pu vérifier tous les mots de passe. Réessayez demain.</translation> <translation id="2869959624320573933">Connectez-vous à Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb index 1f09f59..56cf602b 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
@@ -28,6 +28,7 @@ <translation id="2576431527583832481">A Chrome most még jobb lett! Új verzió áll rendelkezésre.</translation> <translation id="257708665678654955">Szeretné, hogy a Google Chrome a jövőben felajánlja e webhely <ph name="LANGUAGE_NAME" /> nyelvű oldalainak fordítását?</translation> <translation id="2671426118752779020">A Google Jelszókezelőbe mentett jelszavakat használhatja más alkalmazásokban iPhone eszközén.</translation> +<translation id="2689064829982324496">Ha az összes webhelyen ki szeretne jelentkezni Google-fiókjából, <ph name="BEGIN_LINK" />jelentkezzen ki a Chrome-ból<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">A Chrome nem tudott frissítéseket keresni. Próbálja újra később.</translation> <translation id="2732745070297234559">A Chrome nem tudta ellenőrizni az összes jelszót. Próbálkozzon újra holnap.</translation> <translation id="2869959624320573933">Bejelentkezés a Chrome-ba</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb index 5cc1e3d..64209411 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
@@ -28,6 +28,7 @@ <translation id="2576431527583832481">Chrome ಈಗ ತಾನೇ ಉತ್ತಮಗೊಂಡಿದೆ! ಹೊಸ ಆವೃತ್ತಿ ಲಭ್ಯವಿದೆ.</translation> <translation id="257708665678654955">ಮುಂದಿನ ಬಾರಿ ಈ ಸೈಟ್ನಿಂದ <ph name="LANGUAGE_NAME" /> ಪುಟಗಳನ್ನು ಅನುವಾದಿಸಲು Google Chrome ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸಲು ನೀವು ಬಯಸುವಿರಾ?</translation> <translation id="2671426118752779020">ನಿಮ್ಮ iPhone ನಲ್ಲಿನ ಇತರ ಆ್ಯಪ್ಗಳಲ್ಲಿರುವ Google ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ನೀವು ಉಳಿಸಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನೀವು ಬಳಸಬಹುದು.</translation> +<translation id="2689064829982324496">ಎಲ್ಲಾ ವೆಬ್ಸೈಟ್ಗಳಲ್ಲಿ ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಲು, <ph name="BEGIN_LINK" />Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಿ<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">ಅಪ್ಡೇಟ್ಗಳಿವೆಯೇ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="2732745070297234559">ಎಲ್ಲಾ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಾಳೆ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="2869959624320573933">Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb index f5b681e..ba344352 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb
@@ -28,6 +28,7 @@ <translation id="2576431527583832481">Chrome अब अझ राम्रो भएको छ! एउटा नयाँ संस्करण उपलब्ध छ।</translation> <translation id="257708665678654955">तपाइँ Google Chrome लाई अर्को पटक यस साइटबाट <ph name="LANGUAGE_NAME" />को पृष्ठहरू अनुवाद गर्न प्रस्ताव गर्न चाहनुहुन्छ?</translation> <translation id="2671426118752779020">तपाईं आफूले Google पासवर्ड म्यानेजरमा सेभ गरेका पासवर्डहरू आफ्नो iPhone मा भएका अन्य एपमा प्रयोग गर्न सक्नुहुन्छ।</translation> +<translation id="2689064829982324496">सबै वेबसाइटहरूमा आफ्नो Google खाताबाट साइन आउट गर्न <ph name="BEGIN_LINK" />Chrome बाट साइन आउट गर्नुहोस्<ph name="END_LINK" />।</translation> <translation id="2695886661449553974">Chrome ले अपडेटहरू उपलब्ध छन् कि छैनन् भन्ने कुरा जाँच गर्न सकेन। पछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="2732745070297234559">Chrome ले सबै पासवर्डहरू जाँच्न सकेन। भोलि फेरि प्रयास गर्नुहोस्।</translation> <translation id="2869959624320573933">Chrome मा साइन इन गर्नुहोस्</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb index b998066d..06303ac 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -28,6 +28,7 @@ <translation id="2576431527583832481">Chrome har blitt enda bedre. En ny versjon er nå tilgjengelig.</translation> <translation id="257708665678654955">Vil du at Google Chrome skal tilby å oversette sider på <ph name="LANGUAGE_NAME" /> på dette nettstedet neste gang?</translation> <translation id="2671426118752779020">Du kan bruke passordene du har lagret i Google Passordlagring, i andre apper på iPhonen din.</translation> +<translation id="2689064829982324496">For å logge av Google-kontoen din på alle nettsteder, <ph name="BEGIN_LINK" />logg av Chrome<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome kunne ikke se etter oppdateringer. Prøv på nytt senere.</translation> <translation id="2732745070297234559">Chrome kunne ikke sjekke alle passordene. Prøv på nytt i morgen.</translation> <translation id="2869959624320573933">Logg på Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb index 21d81ee..a66d75e 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
@@ -77,6 +77,7 @@ <translation id="5998675059699164418">您的機構要求您登入才能使用 Chrome。</translation> <translation id="6054613632208573261">預設為使用 Chrome</translation> <translation id="6063091872902370735">允許登入 Chrome</translation> +<translation id="6110625574506755980">部分 Chrome 功能將無法再使用。</translation> <translation id="6181930887571472871">切換至 Chrome</translation> <translation id="6238746320622508509">讓 Chrome 鎖定您的無痕式分頁。</translation> <translation id="6387994324662817823">密碼只會儲存至此裝置上的「Google 密碼管理工具」。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index a9393f93..fd8fd93 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -280,6 +280,7 @@ <translation id="3277021493514034324">Werfadres is gekopieer</translation> <translation id="3285962946108803577">Deel bladsy …</translation> <translation id="3290875554372353449">Kies 'n rekening</translation> +<translation id="3305294846493618482">meer</translation> <translation id="3311748811247479259">Af</translation> <translation id="3324193307694657476">Adres 2</translation> <translation id="3328801116991980348">Werfinligting</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index bf586c77..6d0582348 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -280,6 +280,7 @@ <translation id="3277021493514034324">ဝဘ်ဆိုက်လိပ်စာကို မိတ္တူကူးယူထားသည်</translation> <translation id="3285962946108803577">စာမျက်နှာကို မျှဝေရန်...</translation> <translation id="3290875554372353449">'အကောင့်' တစ်ခု ရွေးရန်</translation> +<translation id="3305294846493618482">နောက်ထပ်</translation> <translation id="3311748811247479259">ပိတ်ထားသည်</translation> <translation id="3324193307694657476">လိပ်စာ 2</translation> <translation id="3328801116991980348">ဆိုက် အချက်အလက်များ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 598f25f..bdcb49e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -280,6 +280,7 @@ <translation id="3277021493514034324">साइटको ठेगाना प्रतिलिपि गरियो</translation> <translation id="3285962946108803577">पेज सेयर गर्नुहोस्...</translation> <translation id="3290875554372353449">कुनै खाता छान्नुहोस्</translation> +<translation id="3305294846493618482">थप</translation> <translation id="3311748811247479259">निष्क्रिय छ</translation> <translation id="3324193307694657476">ठेगाना 2</translation> <translation id="3328801116991980348">साइट जानकारी</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index b37283a..efdf72d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -280,6 +280,7 @@ <translation id="3277021493514034324">Nettstedsadressen er kopiert</translation> <translation id="3285962946108803577">Del siden</translation> <translation id="3290875554372353449">Velg konto</translation> +<translation id="3305294846493618482">mer</translation> <translation id="3311748811247479259">Av</translation> <translation id="3324193307694657476">Adresse 2</translation> <translation id="3328801116991980348">Informasjon om nettstedet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 3160e52..31c71d1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -280,6 +280,7 @@ <translation id="3277021493514034324">سائٹ کا پتہ کاپی ہو گیا</translation> <translation id="3285962946108803577">صفحہ کا اشتراک کریں...</translation> <translation id="3290875554372353449">اکاؤنٹ منتخب کریں</translation> +<translation id="3305294846493618482">مزید</translation> <translation id="3311748811247479259">آف</translation> <translation id="3324193307694657476">پتہ 2</translation> <translation id="3328801116991980348">سائٹ کی معلومات</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 29c5332..0299e96 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -280,6 +280,7 @@ <translation id="3277021493514034324">Ikheli lesayithi likopishiwe</translation> <translation id="3285962946108803577">Yabelana Ngekhasi...</translation> <translation id="3290875554372353449">Khetha i-Akhawunti</translation> +<translation id="3305294846493618482">okuningi</translation> <translation id="3311748811247479259">Valiwe</translation> <translation id="3324193307694657476">Ikheli 2</translation> <translation id="3328801116991980348">Ulwazi lwesayithi</translation>
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.h b/ios/chrome/browser/find_in_page/find_in_page_controller.h index 830b9e5..902d6c41 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.h +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.h
@@ -31,17 +31,17 @@ - (id)initWithWebState:(web::WebState*)webState; // Is Find In Page available right now (given the state of the WebState)? - (BOOL)canFindInPage; -// Find |query| in page, update model with results of find. Calls -// |completionHandler| after the find operation is complete. |completionHandler| +// Find `query` in page, update model with results of find. Calls +// `completionHandler` after the find operation is complete. `completionHandler` // can be nil. - (void)findStringInPage:(NSString*)query; -// Move to the next find result based on |-findInPageModel|, and scroll to +// Move to the next find result based on `-findInPageModel`, and scroll to // match. - (void)findNextStringInPage; -// Move to the previous find result based on |-findInPageModel|. +// Move to the previous find result based on `-findInPageModel`. - (void)findPreviousStringInPage; -// Disable find in page script and model. |responseDelegate| will be used to -// respond. Cleanup is not guaranteed to be finished when |responseDelegate| +// Disable find in page script and model. `responseDelegate` will be used to +// respond. Cleanup is not guaranteed to be finished when `responseDelegate` // receives a response. - (void)disableFindInPage; @@ -53,7 +53,7 @@ // Instructs the controller to detach itself from the web state. - (void)detachFromWebState; -// Sets the search term to |string|. Stored until the application quit. +// Sets the search term to `string`. Stored until the application quit. + (void)setSearchTerm:(NSString*)string; // The search term, stored until the application quit. + (NSString*)searchTerm;
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.mm b/ios/chrome/browser/find_in_page/find_in_page_controller.mm index 3b8f038..2f1cd63 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.mm +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.mm
@@ -211,7 +211,7 @@ withMatchCount:(NSInteger)matchCount forWebState:(web::WebState*)webState { if (matchCount == 0 && !query) { - // StopFinding responds with |matchCount| as 0 and |query| as nil. + // StopFinding responds with `matchCount` as 0 and `query` as nil. [self.responseDelegate findDidStop]; return; }
diff --git a/ios/chrome/browser/find_in_page/find_in_page_model.h b/ios/chrome/browser/find_in_page/find_in_page_model.h index 1b03d30..552e6e28 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_model.h +++ b/ios/chrome/browser/find_in_page/find_in_page_model.h
@@ -17,13 +17,13 @@ // The current search string. @property(copy, nonatomic, readonly) NSString* text; -// The number of matches for |text|. +// The number of matches for `text`. @property(nonatomic, readonly) NSUInteger matches; // The currently higlighted index. @property(nonatomic, readonly) NSUInteger currentIndex; -// The content offset needed to display the |currentIndex| match. +// The content offset needed to display the `currentIndex` match. @property(nonatomic, readonly) CGPoint currentPoint; // Update the query string and the number of matches.
diff --git a/ios/chrome/browser/find_in_page/find_tab_helper.h b/ios/chrome/browser/find_in_page/find_tab_helper.h index 815bee6e..41bf07b5 100644 --- a/ios/chrome/browser/find_in_page/find_tab_helper.h +++ b/ios/chrome/browser/find_in_page/find_tab_helper.h
@@ -41,7 +41,7 @@ // Runs an asynchronous Find operation that will call the given completion // handler with results. Highlights matches on the current page. Uses the - // previously remembered search string and searches in the given |direction|. + // previously remembered search string and searches in the given `direction`. void ContinueFinding(FindDirection direction); // Stops any running find operations and runs the given completion block. @@ -75,7 +75,7 @@ // Private constructor used by CreateForWebState(). FindTabHelper(web::WebState* web_state); - // Create the FindInPageController for |web_state|. Only called if/when + // Create the FindInPageController for `web_state`. Only called if/when // the WebState is realized. void CreateFindInPageController(web::WebState* web_state);
diff --git a/ios/chrome/browser/promos_manager/constants.cc b/ios/chrome/browser/promos_manager/constants.cc index 5f23e703..10d2217b 100644 --- a/ios/chrome/browser/promos_manager/constants.cc +++ b/ios/chrome/browser/promos_manager/constants.cc
@@ -9,12 +9,19 @@ namespace promos_manager { const int kLastSeenDayPromoNotFound = -1; +const int kNumDaysImpressionHistoryStored = 365; // WARNING - PLEASE READ: Sadly, we cannot switch over strings in C++, so be // very careful when updating this method to ensure all enums are accounted for. Promo PromoForName(std::string promo) { if (promo == "promos_manager::Promo::Test") { return promos_manager::Promo::Test; + } else if (promo == "promos_manager::Promo::DefaultBrowser") { + return promos_manager::Promo::DefaultBrowser; + } else if (promo == "promos_manager::Promo::AppStoreRating") { + return promos_manager::Promo::AppStoreRating; + } else if (promo == "promos_manager::Promo::CredentialProviderExtension") { + return promos_manager::Promo::CredentialProviderExtension; } else { NOTREACHED(); @@ -28,6 +35,12 @@ switch (promo) { case promos_manager::Promo::Test: return "promos_manager::Promo::Test"; + case promos_manager::Promo::DefaultBrowser: + return "promos_manager::Promo::DefaultBrowser"; + case promos_manager::Promo::AppStoreRating: + return "promos_manager::Promo::AppStoreRating"; + case promos_manager::Promo::CredentialProviderExtension: + return "promos_manager::Promo::CredentialProviderExtension"; } }
diff --git a/ios/chrome/browser/promos_manager/constants.h b/ios/chrome/browser/promos_manager/constants.h index e2720bc..e0c18be4 100644 --- a/ios/chrome/browser/promos_manager/constants.h +++ b/ios/chrome/browser/promos_manager/constants.h
@@ -13,8 +13,14 @@ // promos_manager::Promo `promo` isn't found in the impressions list. extern const int kLastSeenDayPromoNotFound; +// The max number of days for impression history to be stored & maintained. +extern const int kNumDaysImpressionHistoryStored; + enum class Promo { - Test = 0, // Test promo used for testing purposes (e.g. unit tests) + Test = 0, // Test promo used for testing purposes (e.g. unit tests) + DefaultBrowser = 1, // Fullscreen Default Browser Promo + AppStoreRating = 2, // App Store Rating Prompt + CredentialProviderExtension = 3, // Credential Provider Extension }; typedef struct Impression {
diff --git a/ios/chrome/browser/promos_manager/promos_manager.h b/ios/chrome/browser/promos_manager/promos_manager.h index bda2f2f..de4e7bf 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.h +++ b/ios/chrome/browser/promos_manager/promos_manager.h
@@ -13,6 +13,8 @@ #import "ios/chrome/browser/promos_manager/constants.h" #import "ios/chrome/browser/promos_manager/impression_limit.h" +class PromosManagerTest; + // Centralized promos manager for coordinating and scheduling the display of // app-wide promos. Feature teams interested in displaying promos should // leverage this manager. @@ -35,11 +37,17 @@ // base::Value::List of the promo impression history. base::Value::List impression_history_; + // `promo`-specific impression limits, if defined. May return an empty + // NSArray, indicating no promo-specific impression limits were defined for + // `promo`. + NSArray<ImpressionLimit*>* PromoImpressionLimits( + promos_manager::Promo promo) const; + // Impression limits that count against all promos. - NSArray<ImpressionLimit*>* GlobalImpressionLimits(); + NSArray<ImpressionLimit*>* GlobalImpressionLimits() const; // Impression limits that count against any given promo. - NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits(); + NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits() const; // Returns the most recent day (int) that `promo` was seen by the user. // @@ -54,6 +62,83 @@ int LastSeenDay( promos_manager::Promo promo, std::vector<promos_manager::Impression>& sorted_impressions) const; + + // Allow unit tests to access private methods. + friend class PromosManagerTest; + + // Returns true if any impression limit from `impression_limits` is triggered, + // and false otherwise. + // + // At each limit, evaluates the following: + // + // (1) Is the current limit valid for evaluation? This is determined by + // whether or not `window_days` is < the current limit's window. + // + // (2) If the limit is valid for evaluation, compare `impression_count` with + // the current limit's impression count. If `impression_count` >= the current + // limit's impression count, the limit has been triggered. + + // (3) If the limit is triggered, exits early and returns true. Otherwise, + // keep going. + bool AnyImpressionLimitTriggered( + int impression_count, + int window_days, + NSArray<ImpressionLimit*>* impression_limits) const; + + // Algorithm loops over pre-pruned & pre-sorted impressions history list. + // The algorithm assumes: + // + // (1) `valid_impressions` only contains impressions that occurred in the + // last `kNumDaysForStoringImpressionHistory` days. (2) + // `valid_impressions` is sorted by impression day (most recent -> least + // recent). + // + // At each impression, the algorithm asks if either a time-based or + // time-agnostic impression limit has been met. If so, the algorithm exits + // early and returns false. + // + // If the algorithm reaches its end, no impression limits were hit for + // `promo`. If so, the algorithm returns true, as it's safe to display + // `promo`. + bool CanShowPromo( + promos_manager::Promo promo, + const std::vector<promos_manager::Impression>& valid_impressions) const; + + // Returns a list of impression counts (std::vector<int>) from a promo + // impression counts map. + std::vector<int> ImpressionCounts( + std::map<promos_manager::Promo, int>& promo_impression_counts) const; + + // Returns the greatest impression count (int) from a promo impression counts + // map. + int MaxImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const; + + // Returns the total number of impressions (int) from a promo impression + // counts map. + int TotalImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const; + + // Allow unit tests to access private methods. + friend class PromosManagerTest; + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsLastSeenDayForPromo); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, + ReturnsSentinelForNonExistentPromo); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsImpressionCounts); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsEmptyImpressionCounts); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsTotalImpressionCount); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, + ReturnsZeroForTotalImpressionCount); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsMaxImpressionCount); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsZeroForMaxImpressionCount); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, + DetectsSingleImpressionLimitTriggered); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, + DetectsOneOfMultipleImpressionLimitsTriggered); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, + DetectsNoImpressionLimitTriggered); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DecidesCanShowPromo); + FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DecidesCannotShowPromo); }; #endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm index 8ad40235c..02d9daa 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.mm +++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -5,8 +5,14 @@ #import "ios/chrome/browser/promos_manager/promos_manager.h" #import <Foundation/Foundation.h> + +#import <algorithm> +#import <iterator> +#import <map> +#import <numeric> #import <vector> +#import "base/time/time.h" #import "base/values.h" #import "components/prefs/pref_service.h" #import "ios/chrome/browser/pref_names.h" @@ -25,6 +31,12 @@ return a.day > b.day; } +// The number of days since the Unix epoch; one day, in this context, runs +// from UTC midnight to UTC midnight. +int TodaysDay() { + return (base::Time::Now() - base::Time::UnixEpoch()).InDays(); +} + } // namespace #pragma mark - PromosManager @@ -57,7 +69,13 @@ #pragma mark - Private -NSArray<ImpressionLimit*>* GlobalImpressionLimits() { +NSArray<ImpressionLimit*>* PromosManager::PromoImpressionLimits( + promos_manager::Promo promo) const { + // TODO(crbug.com/1354665): Return `promo`-specific limits. + return @[]; +} + +NSArray<ImpressionLimit*>* PromosManager::GlobalImpressionLimits() const { static NSArray<ImpressionLimit*>* limits; static dispatch_once_t onceToken; @@ -72,7 +90,8 @@ return limits; } -NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits() { +NSArray<ImpressionLimit*>* PromosManager::GlobalPerPromoImpressionLimits() + const { static NSArray<ImpressionLimit*>* limits; static dispatch_once_t onceToken; @@ -103,3 +122,112 @@ return promos_manager::kLastSeenDayPromoNotFound; } + +bool PromosManager::AnyImpressionLimitTriggered( + int impression_count, + int window_days, + NSArray<ImpressionLimit*>* impression_limits) const { + for (ImpressionLimit* impression_limit in impression_limits) { + if (window_days < impression_limit.numDays && + impression_count >= impression_limit.numImpressions) + return true; + } + + return false; +} + +bool PromosManager::CanShowPromo( + promos_manager::Promo promo, + const std::vector<promos_manager::Impression>& valid_impressions) const { + // Maintains a map ([promos_manager::Promo] : [current impression count]) for + // evaluating against GlobalImpressionLimits(), + // GlobalPerPromoImpressionLimits(), and, if defined, `promo`-specific + // impression limits + std::map<promos_manager::Promo, int> promo_impression_counts; + + NSArray<ImpressionLimit*>* promo_impression_limits = + PromoImpressionLimits(promo); + NSArray<ImpressionLimit*>* global_per_promo_impression_limits = + GlobalPerPromoImpressionLimits(); + NSArray<ImpressionLimit*>* global_impression_limits = + GlobalImpressionLimits(); + + int window_start = TodaysDay(); + int window_end = + (window_start - promos_manager::kNumDaysImpressionHistoryStored) + 1; + size_t curr_impression_index = 0; + + // Impression limits are defined by a certain number of impressions + // (int) within a certain window of days (int). + // + // This loop starts at TodaysDay() (today) and grows a window, day-by-day, to + // check against different impression limits. + // + // Depending on the size of the window, impression limits may become valid or + // invalid. For example, if the window covers 7 days, an impression limit of + // 2-day scope is no longer valid. However, if window covered 1-2 days, an + // impression limit of 2-day scope is valid. + for (int curr_day = window_start; curr_day >= window_end; --curr_day) { + if (curr_impression_index < valid_impressions.size()) { + promos_manager::Impression curr_impression = + valid_impressions[curr_impression_index]; + // If the current impression matches the current day, add it to + // `promo_impression_counts`. + if (curr_impression.day == curr_day) { + promo_impression_counts[curr_impression.promo]++; + curr_impression_index++; + } else { + // Only check impression limits when counts are incremented: if an + // impression limit were to be triggered below - but counts weren't + // incremented above - it wouldve've already been triggered in a + // previous loop run. + continue; + } + } + + int window_days = window_start - curr_day; + int promo_impression_count = promo_impression_counts[promo]; + int most_seen_promo_impression_count = + MaxImpressionCount(promo_impression_counts); + int total_impression_count = TotalImpressionCount(promo_impression_counts); + + if (AnyImpressionLimitTriggered(promo_impression_count, window_days, + promo_impression_limits) || + AnyImpressionLimitTriggered(most_seen_promo_impression_count, + window_days, + global_per_promo_impression_limits) || + AnyImpressionLimitTriggered(total_impression_count, window_days, + global_impression_limits)) + return false; + } + + return true; +} + +std::vector<int> PromosManager::ImpressionCounts( + std::map<promos_manager::Promo, int>& promo_impression_counts) const { + std::vector<int> counts; + + for (const auto& [promo, count] : promo_impression_counts) + counts.push_back(count); + + return counts; +} + +int PromosManager::MaxImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const { + std::vector<int> counts = ImpressionCounts(promo_impression_counts); + std::vector<int>::iterator max_count_iter = + std::max_element(counts.begin(), counts.end()); + size_t index = std::distance(counts.begin(), max_count_iter); + if (index < counts.size()) + return counts[index]; + return 0; +} + +int PromosManager::TotalImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const { + std::vector<int> counts = ImpressionCounts(promo_impression_counts); + + return std::accumulate(counts.begin(), counts.end(), 0); +}
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm b/ios/chrome/browser/promos_manager/promos_manager_unittest.mm index 656eacc2..419e186 100644 --- a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm +++ b/ios/chrome/browser/promos_manager/promos_manager_unittest.mm
@@ -21,6 +21,16 @@ #error "This file requires ARC support." #endif +namespace { + +// The number of days since the Unix epoch; one day, in this context, runs +// from UTC midnight to UTC midnight. +int TodaysDay() { + return (base::Time::Now() - base::Time::UnixEpoch()).InDays(); +} + +} // namespace + PromosManagerTest::PromosManagerTest() { scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); } @@ -120,3 +130,187 @@ EXPECT_EQ(impressionLimits[1].numImpressions, 2); EXPECT_EQ(impressionLimits[1].numDays, 31); } + +// Tests the last seen day (int) is correctly returned for given +// promos_manager::Promo(s). +TEST_F(PromosManagerTest, ReturnsLastSeenDayForPromo) { + std::vector<promos_manager::Impression> impressions = { + promos_manager::Impression(promos_manager::Promo::Test, 7), + promos_manager::Impression(promos_manager::Promo::Test, 3), + promos_manager::Impression(promos_manager::Promo::Test, 1), + }; + + EXPECT_EQ( + promos_manager_->LastSeenDay(promos_manager::Promo::Test, impressions), + 7); +} + +// Tests the sentinel value is returned when a given promos_manager::Promo isn't +// found in the impression history. +TEST_F(PromosManagerTest, ReturnsSentinelForNonExistentPromo) { + std::vector<promos_manager::Impression> impressions; + + EXPECT_EQ( + promos_manager_->LastSeenDay(promos_manager::Promo::Test, impressions), + promos_manager::kLastSeenDayPromoNotFound); +} + +// Tests PromosManager::ImpressionCounts() correctly returns a counts list from +// an impression counts map. +TEST_F(PromosManagerTest, ReturnsImpressionCounts) { + std::map<promos_manager::Promo, int> promo_impression_counts = { + {promos_manager::Promo::Test, 3}, + {promos_manager::Promo::AppStoreRating, 1}, + {promos_manager::Promo::CredentialProviderExtension, 6}, + {promos_manager::Promo::DefaultBrowser, 5}, + }; + + std::vector<int> counts = {3, 5, 1, 6}; + + EXPECT_EQ(promos_manager_->ImpressionCounts(promo_impression_counts), counts); +} + +// Tests PromosManager::ImpressionCounts() correctly returns an empty counts +// list for an empty impression counts map. +TEST_F(PromosManagerTest, ReturnsEmptyImpressionCounts) { + std::map<promos_manager::Promo, int> promo_impression_counts; + std::vector<int> counts; + + EXPECT_EQ(promos_manager_->ImpressionCounts(promo_impression_counts), counts); +} + +// Tests PromosManager::TotalImpressionCount() correctly adds the counts of +// different promos from an impression counts map. +TEST_F(PromosManagerTest, ReturnsTotalImpressionCount) { + std::map<promos_manager::Promo, int> promo_impression_counts = { + {promos_manager::Promo::Test, 3}, + {promos_manager::Promo::AppStoreRating, 1}, + {promos_manager::Promo::CredentialProviderExtension, 6}, + {promos_manager::Promo::DefaultBrowser, 5}, + + }; + + EXPECT_EQ(promos_manager_->TotalImpressionCount(promo_impression_counts), 15); +} + +// Tests PromosManager::TotalImpressionCount() returns zero for an empty +// impression counts map. +TEST_F(PromosManagerTest, ReturnsZeroForTotalImpressionCount) { + std::map<promos_manager::Promo, int> promo_impression_counts; + + EXPECT_EQ(promos_manager_->TotalImpressionCount(promo_impression_counts), 0); +} + +// Tests PromosManager::MaxImpressionCount() correctly returns the max +// impression count from an impression counts map. +TEST_F(PromosManagerTest, ReturnsMaxImpressionCount) { + std::map<promos_manager::Promo, int> promo_impression_counts = { + {promos_manager::Promo::Test, 3}, + {promos_manager::Promo::AppStoreRating, 1}, + {promos_manager::Promo::CredentialProviderExtension, 6}, + {promos_manager::Promo::DefaultBrowser, 5}, + }; + + EXPECT_EQ(promos_manager_->MaxImpressionCount(promo_impression_counts), 6); +} + +// Tests PromosManager::MaxImpressionCount() correctly returns zero for an empty +// impression counts map. +TEST_F(PromosManagerTest, ReturnsZeroForMaxImpressionCount) { + std::map<promos_manager::Promo, int> promo_impression_counts; + + EXPECT_EQ(promos_manager_->MaxImpressionCount(promo_impression_counts), 0); +} + +// Tests PromosManager::AnyImpressionLimitTriggered() correctly detects an +// impression limit is triggered. +TEST_F(PromosManagerTest, DetectsSingleImpressionLimitTriggered) { + ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 + forNumDays:7]; + NSArray<ImpressionLimit*>* limits = @[ + thricePerWeek, + ]; + + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(3, 1, limits), true); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(4, 5, limits), true); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(4, 6, limits), true); + // This is technically the 8th day, so it's the start of a new week, and + // doesn't hit the limit. + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(3, 7, limits), false); +} + +// Tests PromosManager::AnyImpressionLimitTriggered() correctly detects an +// impression limit is triggered over multiple impression limits. +TEST_F(PromosManagerTest, DetectsOneOfMultipleImpressionLimitsTriggered) { + ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1 + forNumDays:2]; + ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 + forNumDays:7]; + NSArray<ImpressionLimit*>* limits = @[ + thricePerWeek, + onceEveryTwoDays, + ]; + + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(1, 1, limits), true); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(1, 2, limits), false); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(2, 2, limits), false); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(2, 4, limits), false); +} + +// Tests PromosManager::AnyImpressionLimitTriggered() correctly detects no +// impression limits are triggered. +TEST_F(PromosManagerTest, DetectsNoImpressionLimitTriggered) { + ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1 + forNumDays:2]; + ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 + forNumDays:7]; + NSArray<ImpressionLimit*>* limits = @[ onceEveryTwoDays, thricePerWeek ]; + + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(1, 1, nil), false); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(0, 3, limits), false); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(1, 5, limits), false); + EXPECT_EQ(promos_manager_->AnyImpressionLimitTriggered(2, 5, limits), false); +} + +// Tests PromosManager::CanShowPromo() correctly allows a promo to be shown +// because it hasn't met any impression limits. +TEST_F(PromosManagerTest, DecidesCanShowPromo) { + const std::vector<promos_manager::Impression> zeroImpressions = {}; + EXPECT_EQ(promos_manager_->CanShowPromo(promos_manager::Promo::Test, + zeroImpressions), + true); +} + +// Tests PromosManager::CanShowPromo() correctly denies promos from being shown +// as they've triggered impression limits. +TEST_F(PromosManagerTest, DecidesCannotShowPromo) { + int today = TodaysDay(); + + const std::vector<promos_manager::Impression> impressions = { + promos_manager::Impression(promos_manager::Promo::Test, today), + promos_manager::Impression(promos_manager::Promo::DefaultBrowser, + today - 7), + promos_manager::Impression(promos_manager::Promo::AppStoreRating, + today - 14), + promos_manager::Impression( + promos_manager::Promo::CredentialProviderExtension, today - 180), + }; + + // False because triggers no more than 1 impression per month global + // impression limit. + EXPECT_EQ( + promos_manager_->CanShowPromo(promos_manager::Promo::Test, impressions), + false); + EXPECT_EQ(promos_manager_->CanShowPromo(promos_manager::Promo::DefaultBrowser, + impressions), + false); + EXPECT_EQ(promos_manager_->CanShowPromo(promos_manager::Promo::AppStoreRating, + impressions), + false); + // False because an impression has already been shown this month, even though + // it's not the CredentialProviderExtension promo. + EXPECT_EQ( + promos_manager_->CanShowPromo( + promos_manager::Promo::CredentialProviderExtension, impressions), + false); +}
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn b/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn index 8088cdc7..c8be41d 100644 --- a/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn +++ b/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn
@@ -7,8 +7,11 @@ sources = [ "chrome_tailored_security_service.h", "chrome_tailored_security_service.mm", + "tailored_security_service_factory.h", + "tailored_security_service_factory.mm", ] deps = [ + "//components/keyed_service/ios", "//components/prefs", "//components/safe_browsing/core/browser/tailored_security_service", "//components/safe_browsing/core/common", @@ -19,3 +22,17 @@ "//ios/chrome/browser/signin", ] } + +source_set("unit_tests") { + testonly = true + sources = [ "tailored_security_service_factory_unittest.mm" ] + + deps = [ + ":tailored_security", + "//ios/chrome/browser/browser_state:test_support", + "//ios/web/public/test", + "//testing/gtest", + ] + + configs += [ "//build/config/compiler:enable_arc" ] +}
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h b/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h index bcf64504..dfabfb13 100644 --- a/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h +++ b/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h
@@ -9,6 +9,10 @@ class ChromeBrowserState; +namespace signin { +class IdentityManager; +} + namespace safe_browsing { // TailoredSecurityService for iOS. This class is used to bridge @@ -17,7 +21,9 @@ // features. class ChromeTailoredSecurityService : public TailoredSecurityService { public: - explicit ChromeTailoredSecurityService(ChromeBrowserState* state); + explicit ChromeTailoredSecurityService( + ChromeBrowserState* state, + signin::IdentityManager* identity_manager); ~ChromeTailoredSecurityService() override; protected:
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.mm b/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.mm index 31256ee..fdc4a63b 100644 --- a/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.mm +++ b/ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.mm
@@ -24,10 +24,9 @@ namespace safe_browsing { ChromeTailoredSecurityService::ChromeTailoredSecurityService( - ChromeBrowserState* browser_state) - : TailoredSecurityService( - IdentityManagerFactory::GetForBrowserState(browser_state), - browser_state->GetPrefs()), + ChromeBrowserState* browser_state, + signin::IdentityManager* identity_manager) + : TailoredSecurityService(identity_manager, browser_state->GetPrefs()), browser_state_(browser_state) {} ChromeTailoredSecurityService::~ChromeTailoredSecurityService() = default; @@ -37,6 +36,7 @@ web::WebState::Create(web::WebState::CreateParams(browser_state_)); if (!web_state) { if (is_enabled) { + // Record BrowserState/WebContents not being available. RecordEnabledNotificationResult( TailoredSecurityNotificationResult::kNoWebContentsAvailable); }
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h new file mode 100644 index 0000000..2f7850f --- /dev/null +++ b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h
@@ -0,0 +1,46 @@ +// Copyright 2022 The Chromium Authors. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_SERVICE_FACTORY_H_ + +#import "base/no_destructor.h" +#import "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class ChromeBrowserState; +class KeyedService; + +namespace safe_browsing { +class TailoredSecurityService; +} + +namespace web { +class BrowserState; +} + +// Singleton that owns TailoredSecurityService objects, one for each active +// ChromeBrowserState. It returns nullptr for Incognito browser states. +class TailoredSecurityServiceFactory : public BrowserStateKeyedServiceFactory { + public: + // Returns the instance of TailoredSecurityService associated with this + // browser state, creating one if none exists and the given browser state is + // not in Incognito mode. + static safe_browsing::TailoredSecurityService* GetForBrowserState( + ChromeBrowserState* browser_state); + + // Returns the singleton instance of TailoredSecurityServiceFactory. + static TailoredSecurityServiceFactory* GetInstance(); + + private: + friend class base::NoDestructor<TailoredSecurityServiceFactory>; + + TailoredSecurityServiceFactory(); + ~TailoredSecurityServiceFactory() override = default; + + // BrowserStateKeyedServiceFactory: + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* browser_state) const override; +}; + +#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm new file mode 100644 index 0000000..5412ee5 --- /dev/null +++ b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm
@@ -0,0 +1,46 @@ +// Copyright 2022 The Chromium Authors. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h" + +#import "components/keyed_service/ios/browser_state_dependency_manager.h" +#import "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h" +#import "ios/chrome/browser/signin/identity_manager_factory.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +// static +safe_browsing::TailoredSecurityService* +TailoredSecurityServiceFactory::GetForBrowserState( + ChromeBrowserState* browser_state) { + return static_cast<safe_browsing::TailoredSecurityService*>( + GetInstance()->GetServiceForBrowserState(browser_state, /*create=*/true)); +} + +// static +TailoredSecurityServiceFactory* TailoredSecurityServiceFactory::GetInstance() { + static base::NoDestructor<TailoredSecurityServiceFactory> instance; + return instance.get(); +} + +TailoredSecurityServiceFactory::TailoredSecurityServiceFactory() + : BrowserStateKeyedServiceFactory( + "TailoredSecurityService", + BrowserStateDependencyManager::GetInstance()) { + DependsOn(IdentityManagerFactory::GetInstance()); +} + +std::unique_ptr<KeyedService> +TailoredSecurityServiceFactory::BuildServiceInstanceFor( + web::BrowserState* browser_state) const { + ChromeBrowserState* chrome_browser_state = + ChromeBrowserState::FromBrowserState(browser_state); + return std::make_unique<safe_browsing::ChromeTailoredSecurityService>( + chrome_browser_state, + IdentityManagerFactory::GetForBrowserState(chrome_browser_state)); +}
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory_unittest.mm b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory_unittest.mm new file mode 100644 index 0000000..b52c567f --- /dev/null +++ b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory_unittest.mm
@@ -0,0 +1,36 @@ +// Copyright 2022 The Chromium Authors. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h" + +#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +// Class used to test TailoredSecurityServiceFactory initialization. +class TailoredSecurityServiceFactoryTest : public PlatformTest { + protected: + TailoredSecurityServiceFactoryTest() + : browser_state_(TestChromeBrowserState::Builder().Build()) {} + + web::WebTaskEnvironment task_environment_; + std::unique_ptr<ChromeBrowserState> browser_state_; +}; + +// Checks that TailoredSecurityServiceFactory returns a null for an +// off-the-record browser state, but returns a non-null instance for a regular +// browser state. +TEST_F(TailoredSecurityServiceFactoryTest, OffTheRecordReturnsNull) { + // The factory should return null for an off-the-record browser state. + EXPECT_FALSE(TailoredSecurityServiceFactory::GetForBrowserState( + browser_state_->GetOffTheRecordChromeBrowserState())); + + // There should be a non-null instance for a regular browser state. + EXPECT_TRUE( + TailoredSecurityServiceFactory::GetForBrowserState(browser_state_.get())); +}
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm index d40a3c2..9c06521 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
@@ -37,6 +37,16 @@ @implementation BrowserViewControllerTestCase +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + + config.features_enabled.push_back(kContentSuggestionsUIModuleRefresh); + // Enable arm that does not hide shortcuts. + config.features_enabled.push_back(kTrendingQueriesModule); + config.variations_enabled = {3350760}; + return config; +} + // Tests that the NTP is interactable even when multiple NTP are opened during // the animation of the first NTP opening. See crbug.com/1032544. - (void)testPageInteractable {
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h index e7185450..4690985e 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h
@@ -13,4 +13,7 @@ // Accessibility Identifier for the NTP Promo view. extern NSString* const kContentSuggestionsWhatsNewIdentifier; +// Accessibility Identifier for QuerySuggestionView. +extern NSString* const kQuerySuggestionViewA11yIdentifierPrefix; + #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_CELLS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.mm index 688c096d..65511c5 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.mm
@@ -12,3 +12,6 @@ NSString* const kContentSuggestionsWhatsNewIdentifier = @"ContentSuggestionsWhatsNewIdentifier"; + +NSString* const kQuerySuggestionViewA11yIdentifierPrefix = + @"QuerySuggestionViewA11yIdentifierPrefix";
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm index 49fe8ef7..33015c0 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
@@ -104,6 +104,7 @@ [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; self.title.textColor = [UIColor colorNamed:kTextSecondaryColor]; self.title.accessibilityTraits |= UIAccessibilityTraitHeader; + self.title.accessibilityIdentifier = [self titleString]; self.title.translatesAutoresizingMaskIntoConstraints = NO; [contentContainer addSubview:self.title]; [NSLayoutConstraint activateConstraints:@[
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.mm b/ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.mm index 945fc74..151c1d2b7 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.h" +#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h" #import "ios/chrome/browser/ui/icons/chrome_symbol.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" @@ -60,7 +61,10 @@ self.queryLabel.translatesAutoresizingMaskIntoConstraints = NO; self.queryLabel.numberOfLines = 2; self.queryLabel.adjustsFontForContentSizeCategory = YES; - // self.userInteractionEnabled = YES; + // Set this for visibility validation in EGTests. + self.queryLabel.accessibilityIdentifier = [NSString + stringWithFormat:@"%@%i", kQuerySuggestionViewA11yIdentifierPrefix, + config.index]; if (!config) { // If there is no config, then this is a placeholder tile.
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index ff1f1e2a..d9c391d 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -137,6 +137,11 @@ config.additional_args.push_back(std::string("--") + switches::kEnableDiscoverFeed); config.features_enabled.push_back(kDiscoverFeedInNtp); + + config.features_enabled.push_back(kContentSuggestionsUIModuleRefresh); + // Enable arm that does not hide shortcuts. + config.features_enabled.push_back(kTrendingQueriesModule); + config.variations_enabled = {3350760}; return config; } @@ -184,17 +189,6 @@ #define MAYBE_testCollectionShortcuts testCollectionShortcuts #endif - (void)MAYBE_testCollectionShortcuts { - // Relaunch the app with trending queries disabled, to ensure that the - // shortcuts module is always present. - // TODO(crbug.com/1350826): Trending queries is configured as a - // first-run trial, and one of the arms removes the Shortcuts - // module. Fix these tests to force an appropriate configuration or - // otherwise support the various possible experiment arms. - AppLaunchConfiguration config = [self appConfigurationForTestCase]; - config.relaunch_policy = ForceRelaunchByCleanShutdown; - config.features_disabled.push_back(kTrendingQueriesModule); - [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; - // Check the Bookmarks. [[EarlGrey selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( @@ -527,6 +521,29 @@ [NewTabPageAppInterface resetWhatsNewPromo]; } +// Tests that the trending queries module header is visible and all four +// trending queries are interactable. +- (void)testTrendingQueries { + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID([NSString + stringWithFormat: + @"%@", + l10n_util::GetNSString( + IDS_IOS_CONTENT_SUGGESTIONS_TRENDING_QUERIES_MODULE_TITLE)])] + assertWithMatcher:grey_sufficientlyVisible()]; + + for (int index = 0; index < 4; index++) { + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID([NSString + stringWithFormat:@"%@%i", + kQuerySuggestionViewA11yIdentifierPrefix, + index])] + assertWithMatcher:grey_interactable()]; + } +} + // Tests that the position of the collection view is restored when navigating // back to the NTP. // TODO(crbug.com/1299362): Re-enable test after fixing flakiness. @@ -730,17 +747,6 @@ #define MAYBE_testFavicons testFavicons #endif - (void)MAYBE_testFavicons { - // Relaunch the app with trending queries disabled, to ensure that the - // shortcuts module is always present. - // TODO(crbug.com/1350826): Trending queries is configured as a - // first-run trial, and one of the arms removes the Shortcuts - // module. Fix these tests to force an appropriate configuration or - // otherwise support the various possible experiment arms. - AppLaunchConfiguration config = [self appConfigurationForTestCase]; - config.relaunch_policy = ForceRelaunchByCleanShutdown; - config.features_disabled.push_back(kTrendingQueriesModule); - [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; - for (NSInteger index = 0; index < 4; index++) { [[EarlGrey selectElementWithMatcher: @@ -750,6 +756,19 @@ kContentSuggestionsMostVisitedAccessibilityIdentifierPrefix, index])] assertWithMatcher:grey_sufficientlyVisible()]; } + // Scroll down if the shortcuts may not be completely in view due to Trending + // Queries. + [[[EarlGrey + selectElementWithMatcher: + grey_allOf( + grey_accessibilityID([NSString + stringWithFormat: + @"%@0", + kContentSuggestionsShortcutsAccessibilityIdentifierPrefix]), + grey_sufficientlyVisible(), nil)] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 100.0f) + onElementWithMatcher:chrome_test_util::NTPCollectionView()] + assertWithMatcher:grey_notNil()]; for (NSInteger index = 0; index < 4; index++) { [[EarlGrey selectElementWithMatcher: @@ -782,6 +801,19 @@ kContentSuggestionsMostVisitedAccessibilityIdentifierPrefix, index])] assertWithMatcher:grey_sufficientlyVisible()]; } + // Scroll down if the shortcuts may not be completely in view due to Trending + // Queries. + [[[EarlGrey + selectElementWithMatcher: + grey_allOf( + grey_accessibilityID([NSString + stringWithFormat: + @"%@0", + kContentSuggestionsShortcutsAccessibilityIdentifierPrefix]), + grey_sufficientlyVisible(), nil)] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 100.0f) + onElementWithMatcher:chrome_test_util::NTPCollectionView()] + assertWithMatcher:grey_notNil()]; for (NSInteger index = 0; index < 4; index++) { [[EarlGrey selectElementWithMatcher: @@ -851,7 +883,7 @@ // Ensures that logo/doodle is no longer visible when scrolled down. [[EarlGrey selectElementWithMatcher:chrome_test_util::NTPLogo()] - assertWithMatcher:grey_not(grey_sufficientlyVisible())]; + assertWithMatcher:grey_notVisible()]; } // Test to ensure that initial position and content are maintained when rotating @@ -1351,18 +1383,7 @@ - (AppLaunchConfiguration)appConfigurationForTestCase { AppLaunchConfiguration config = [super appConfigurationForTestCase]; - config.additional_args.push_back( - "--enable-features=" + std::string(kIOSOmniboxUpdatedPopupUI.name) + "<" + - std::string(kIOSOmniboxUpdatedPopupUI.name)); - - config.additional_args.push_back( - "--force-fieldtrials=" + std::string(kIOSOmniboxUpdatedPopupUI.name) + - "/Test"); - - config.additional_args.push_back( - "--force-fieldtrial-params=" + - std::string(kIOSOmniboxUpdatedPopupUI.name) + ".Test:" + - std::string(kIOSOmniboxUpdatedPopupUIVariationName) + "/" + _variant); + config.features_enabled.push_back(kIOSOmniboxUpdatedPopupUI); return config; } @@ -1392,6 +1413,14 @@ [super setUp]; } +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config = [super appConfigurationForTestCase]; + + config.variations_enabled.push_back(3348486); + + return config; +} + // This is currently needed to prevent this test case from being ignored. // TODO(crbug.com/1339419): Test fails on device. #if !TARGET_IPHONE_SIMULATOR @@ -1420,6 +1449,14 @@ [super setUp]; } +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config = [super appConfigurationForTestCase]; + + config.variations_enabled.push_back(3348487); + + return config; +} + // This is currently needed to prevent this test case from being ignored. // TODO(crbug.com/1339419): Test fails on device. #if !TARGET_IPHONE_SIMULATOR
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 4c32aeb..efb78edfe 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -268,7 +268,7 @@ _webState = webState; [self.logoVendor setWebState:webState]; if (_webState && _webStateObserver) { - [self setContentOffsetForWebState:webState]; + [self setContentOffsetForWebState:webState refreshFeedIfNeeded:NO]; _webState->AddObserver(_webStateObserver.get()); } } @@ -280,7 +280,7 @@ // changes. - (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success { DCHECK_EQ(_webState, webState); - [self setContentOffsetForWebState:webState]; + [self setContentOffsetForWebState:webState refreshFeedIfNeeded:YES]; } - (void)webStateWasHidden:(web::WebState*)webState { @@ -370,8 +370,10 @@ #pragma mark - Private -// Set the NTP scroll offset for the current navigation item. -- (void)setContentOffsetForWebState:(web::WebState*)webState { +// Set the NTP scroll offset for the current navigation item. If +// `refreshFeedIfNeeded` is YES a feed refresh will be attempted. +- (void)setContentOffsetForWebState:(web::WebState*)webState + refreshFeedIfNeeded:(BOOL)refreshFeedIfNeeded { if (webState->GetVisibleURL().DeprecatedGetOriginAsURL() != kChromeUINewTabURL) { return; @@ -398,7 +400,8 @@ [self.suggestionsMediator refreshMostVisitedTiles]; // Refresh DiscoverFeed unless in off-the-record NTP. - if (!self.browser->GetBrowserState()->IsOffTheRecord()) { + if (!self.browser->GetBrowserState()->IsOffTheRecord() && + refreshFeedIfNeeded) { DiscoverFeedServiceFactory::GetForBrowserState( self.browser->GetBrowserState()) ->RefreshFeedIfNeeded();
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index bfcd3723..f52478c 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -237,6 +237,7 @@ "//ios/chrome/browser/promos_manager:unit_tests", "//ios/chrome/browser/reading_list:unit_tests", "//ios/chrome/browser/safe_browsing:unit_tests", + "//ios/chrome/browser/safe_browsing/tailored_security:unit_tests", "//ios/chrome/browser/safe_mode:unit_tests", "//ios/chrome/browser/screenshot:unit_tests", "//ios/chrome/browser/search_engines:unit_tests",
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fr-CA.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fr-CA.xtb index e2468fb..cf89080b 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fr-CA.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fr-CA.xtb
@@ -1,19 +1,31 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr-CA"> +<translation id="2513892053093488070">Recherche vocale</translation> +<translation id="2535710892645968259">Commencez à jouer au jeu du dinosaure de Chrome à partir de votre écran de verrouillage.</translation> <translation id="2542770169955243077">Jeu de dinosaures de Chrome</translation> <translation id="302608144225178783">Commencez à jouer au jeu de dinosaures de Chrome directement à l'écran d'accueil.</translation> +<translation id="3296938369177810197">Recherche vocale</translation> <translation id="3464120926993669599">Rechercher en mode de navigation privée</translation> +<translation id="3501428580460217920">Recherchez ou naviguez dans un nouvel onglet de navigation privée dans Chrome.</translation> <translation id="3528874492835415837">Faites une recherche ou entrez une URL</translation> +<translation id="3798529146539130967">Effectuez une recherche dans Chrome à l'aide de votre voix.</translation> <translation id="405442954313519726">Recherchez ou naviguez dans un nouvel onglet, en mode de navigation privée, à l'aide de votre voix ou à l'aide d'un code QR.</translation> +<translation id="4557098988773644458">Commencer à jouer au jeu du dinosaure de Chrome</translation> <translation id="4954445889641385956">Faites une recherche ou entrez une URL</translation> +<translation id="5234725349196694896">Effectuez des recherches à l'aide de votre moteur de recherche préféré dans Chrome.</translation> <translation id="5277852985315196237">Faites une recherche ou entrez une URL</translation> <translation id="529497070985873480">Jeu de dinosaures de Chrome</translation> <translation id="5683557219437283801">Recherche vocale</translation> <translation id="6179961764474023795">Actions rapides</translation> +<translation id="6336802729091778259">Jeu du dinosaure de Chrome</translation> +<translation id="6663288906398689853">Rechercher</translation> <translation id="6855322554930231468">Recherche</translation> +<translation id="7010831364920321713">Rechercher en mode de navigation privée</translation> <translation id="7048549665319929185">Faites une recherche ou entrez une URL</translation> <translation id="7317302007099170473">Numériser le code QR</translation> +<translation id="744668050028871192">Rechercher</translation> <translation id="8104498668011127805">Commencer à jouer au jeu de dinosaure de Chrome</translation> +<translation id="8171952085734471362">Rechercher en mode de navigation privée</translation> <translation id="8564942608461410346">Effectuez des recherches à l'aide de votre moteur de recherche préféré dans Chrome.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb index b90977b7..0efd974 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb
@@ -1,20 +1,32 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> +<translation id="2513892053093488070">Hangalapú keresés</translation> +<translation id="2535710892645968259">Vágjon bele a Chrome dinós játékába közvetlenül a lezárási képernyőről.</translation> <translation id="2542770169955243077">A Chrome dinós játéka</translation> <translation id="302608144225178783">Vágjon bele a Chrome dinós játékába közvetlenül a kezdőképernyőről.</translation> +<translation id="3296938369177810197">Hangalapú keresés</translation> <translation id="3464120926993669599">Keresés inkognitó módban</translation> +<translation id="3501428580460217920">Új inkognitó lapon kereshet vagy navigálhat a Chrome-ban.</translation> <translation id="3528874492835415837">Keressen, vagy írjon be URL-címet</translation> +<translation id="3798529146539130967">A Chrome-ban hangja segítségével is kereshet.</translation> <translation id="405442954313519726">Keresés vagy navigáció új lapon, inkognitó módban, hangja segítségével vagy QR-kóddal.</translation> +<translation id="4557098988773644458">Vágjon bele a Chrome dinós játékába</translation> <translation id="4954445889641385956">Keressen, vagy írjon be URL-címet</translation> +<translation id="5234725349196694896">Kedvenc keresőmotorjával kereshet a Chrome-ban.</translation> <translation id="5277852985315196237">Keressen, vagy írjon be URL-címet</translation> <translation id="529497070985873480">Chrome-dinó</translation> <translation id="5683557219437283801">Hangalapú keresés</translation> <translation id="6179961764474023795">Gyorsműveletek</translation> +<translation id="6336802729091778259">A Chrome dinós játéka</translation> +<translation id="6663288906398689853">Keresés</translation> <translation id="6855322554930231468">Keresés</translation> +<translation id="7010831364920321713">Keresés inkognitó módban</translation> <translation id="7048549665319929185">Keressen, vagy írjon be URL-címet</translation> <translation id="7317302007099170473">QR-kód beolvasása</translation> +<translation id="744668050028871192">Keresés</translation> <translation id="8104498668011127805">Vágjon bele a Chrome dinós játékába</translation> +<translation id="8171952085734471362">Keresés inkognitó módban</translation> <translation id="8564942608461410346">Kedvenc keresőmotorjával kereshet a Chrome-ban.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kn.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kn.xtb index df05b070..e516a14c 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kn.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kn.xtb
@@ -1,20 +1,32 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="kn"> +<translation id="2513892053093488070">ಧ್ವನಿ ಹುಡುಕಾಟ</translation> +<translation id="2535710892645968259">ನಿಮ್ಮ ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಿಂದಲೇ Chrome Dino ಗೇಮ್ಗೆ ಹೋಗಿ.</translation> <translation id="2542770169955243077">Chrome Dino ಗೇಮ್</translation> <translation id="302608144225178783">ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ನಿಂದಲೇ Chrome Dino ಗೇಮ್ಗೆ ಹೋಗಿ.</translation> +<translation id="3296938369177810197">ಧ್ವನಿ ಹುಡುಕಾಟ</translation> <translation id="3464120926993669599">ಅಜ್ಞಾತ ಹುಡುಕಾಟ</translation> +<translation id="3501428580460217920">Chrome ನಲ್ಲಿ ಹೊಸ ಅಜ್ಞಾತ ಟ್ಯಾಬ್ನಲ್ಲಿ ಹುಡುಕಿ ಅಥವಾ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ.</translation> <translation id="3528874492835415837">ಹುಡುಕಾಟ ನಡೆಸಿ ಅಥವಾ URL ಅನ್ನು ಟೈಪ್ ಮಾಡಿ</translation> +<translation id="3798529146539130967">ನಿಮ್ಮ ಧ್ವನಿಯನ್ನು ಬಳಸಿಕೊಂಡು Chrome ನಲ್ಲಿ ಹುಡುಕಿ.</translation> <translation id="405442954313519726">ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ, ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ, ನಿಮ್ಮ ಧ್ವನಿ ಬಳಸಿಕೊಂಡು ಅಥವಾ QR ಕೋಡ್ ಮೂಲಕ ಹುಡುಕಾಟ ನಡೆಸಿ ಅಥವಾ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ.</translation> +<translation id="4557098988773644458">Chrome Dino ಗೆ ಹೋಗಿ</translation> <translation id="4954445889641385956">ಹುಡುಕಾಟ ನಡೆಸಿ ಅಥವಾ URL ಅನ್ನು ಟೈಪ್ ಮಾಡಿ</translation> +<translation id="5234725349196694896">ನಿಮ್ಮ ನೆಚ್ಚಿನ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಮೂಲಕ Chrome ನಲ್ಲಿ ಹುಡುಕಿ</translation> <translation id="5277852985315196237">ಹುಡುಕಾಟ ನಡೆಸಿ ಅಥವಾ URL ಅನ್ನು ಟೈಪ್ ಮಾಡಿ</translation> <translation id="529497070985873480">Chrome Dino</translation> <translation id="5683557219437283801">ಧ್ವನಿ ಹುಡುಕಾಟ</translation> <translation id="6179961764474023795">ತ್ವರಿತ ಕ್ರಮಗಳು</translation> +<translation id="6336802729091778259">Chrome Dino ಗೇಮ್</translation> +<translation id="6663288906398689853">ಹುಡುಕಿ</translation> <translation id="6855322554930231468">ಹುಡುಕಿ</translation> +<translation id="7010831364920321713">ಅಜ್ಞಾತ ಹುಡುಕಾಟ</translation> <translation id="7048549665319929185">ಹುಡುಕಾಟ ನಡೆಸಿ ಅಥವಾ URL ಅನ್ನು ಟೈಪ್ ಮಾಡಿ</translation> <translation id="7317302007099170473">QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> +<translation id="744668050028871192">ಹುಡುಕಿ</translation> <translation id="8104498668011127805">Chrome Dino ಗೆ ಹೋಗಿ</translation> +<translation id="8171952085734471362">ಅಜ್ಞಾತ ಹುಡುಕಾಟ</translation> <translation id="8564942608461410346">ನಿಮ್ಮ ನೆಚ್ಚಿನ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಮೂಲಕ Chrome ನಲ್ಲಿ ಹುಡುಕಿ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb index df598ae..c5fddff 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb
@@ -1,20 +1,32 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ne"> +<translation id="2513892053093488070">भ्वाइस सर्च</translation> +<translation id="2535710892645968259">आफ्नो लक स्क्रिनबाटै Chrome Dino गेम खेल्नुहोस्।</translation> <translation id="2542770169955243077">Chrome Dino गेम</translation> <translation id="302608144225178783">आफ्नो होम स्क्रिनबाट Chrome Dino गेम खेल्नुहोस्।</translation> +<translation id="3296938369177810197">भ्वाइस सर्च</translation> <translation id="3464120926993669599">इन्कोग्निटो खोज</translation> +<translation id="3501428580460217920">Chrome मा नयाँ इन्कोग्निटो ट्याब खोलेर खोज्नुहोस् वा नेभिगेट गर्नुहोस्।</translation> <translation id="3528874492835415837">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> +<translation id="3798529146539130967">बोलेरै Chrome मा खोज्नुहोस्।</translation> <translation id="405442954313519726">बोलेर वा QR कोड प्रयोग गरेर इन्कोग्निटो मोडमा कुनै कुरा खोज्नुहोस् वा नयाँ ट्याबमा जानुहोस्।</translation> +<translation id="4557098988773644458">Chrome Dino गेम खेल्नुहोस्</translation> <translation id="4954445889641385956">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> +<translation id="5234725349196694896">Chrome मा आफूलाई मन पर्ने सर्च इन्जिन प्रयोग गरी खोज्नुहोस्।</translation> <translation id="5277852985315196237">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> <translation id="529497070985873480">Chrome Dino</translation> <translation id="5683557219437283801">भ्वाइस सर्च</translation> <translation id="6179961764474023795">द्रुत कारबाहीहरू</translation> +<translation id="6336802729091778259">Chrome Dino गेम</translation> +<translation id="6663288906398689853">खोज्नुहोस्</translation> <translation id="6855322554930231468">खोज्नुहोस्</translation> +<translation id="7010831364920321713">इन्कोग्निटो खोज</translation> <translation id="7048549665319929185">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> <translation id="7317302007099170473">QR कोड स्क्यान गर्नुहोस्</translation> +<translation id="744668050028871192">खोज्नुहोस्</translation> <translation id="8104498668011127805">Chrome Dino गेम खेल्नुहोस्</translation> +<translation id="8171952085734471362">इन्कोग्निटो खोज</translation> <translation id="8564942608461410346">Chrome मा आफूलाई मन पर्ने सर्च इन्जिन प्रयोग गरी खोज्नुहोस्।</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb index 35e7408..72936e7 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb
@@ -1,20 +1,32 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="2513892053093488070">Talesøk</translation> +<translation id="2535710892645968259">Hopp inn i Chrome Dino-spillet fra låseskjermen.</translation> <translation id="2542770169955243077">Chrome Dino-spillet</translation> <translation id="302608144225178783">Hopp inn i Chrome Dino-spillet fra startskjermen.</translation> +<translation id="3296938369177810197">Talesøk</translation> <translation id="3464120926993669599">Inkognitosøk</translation> +<translation id="3501428580460217920">Søk eller naviger i en ny inkognitofane i Chrome.</translation> <translation id="3528874492835415837">Søk, eller skriv inn en nettadresse</translation> +<translation id="3798529146539130967">Søk i Chrome med stemmen.</translation> <translation id="405442954313519726">Søk eller naviger på en ny fane, i Inkognitomodus, ved bruk av stemmen eller med en QR-kode.</translation> +<translation id="4557098988773644458">Hopp inn i Chrome Dino-spillet</translation> <translation id="4954445889641385956">Søk, eller skriv inn en nettadresse</translation> +<translation id="5234725349196694896">Søk i Chrome med favorittsøkemotoren din.</translation> <translation id="5277852985315196237">Søk, eller skriv inn en nettadresse</translation> <translation id="529497070985873480">Chrome Dino</translation> <translation id="5683557219437283801">Talesøk</translation> <translation id="6179961764474023795">Hurtighandlinger</translation> +<translation id="6336802729091778259">Chrome Dino-spillet</translation> +<translation id="6663288906398689853">Søk</translation> <translation id="6855322554930231468">Søk</translation> +<translation id="7010831364920321713">Inkognitosøk</translation> <translation id="7048549665319929185">Søk, eller skriv inn en nettadresse</translation> <translation id="7317302007099170473">Skann QR-kode</translation> +<translation id="744668050028871192">Søk</translation> <translation id="8104498668011127805">Hopp inn i Chrome Dino-spillet</translation> +<translation id="8171952085734471362">Inkognitosøk</translation> <translation id="8564942608461410346">Søk i Chrome med favorittsøkemotoren din.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 223b23f..dd62e78 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -7bd464603dd765c23feb18aceefeb1c1dc671a9d \ No newline at end of file +292b01a988bf83c426722c982c85c64990506093 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 42607c9..d528e85 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -2e5d4633d6328ea13da22410b382e19b8c38274e \ No newline at end of file +2f31b844e2662550d89a5f48874977eeb76bf168 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 41f2afd9..7b75665 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -b2298131b8e0a9c26bdbd9b1d6eb2702bd3d6dcf \ No newline at end of file +226acd15289b4c0bcee7235a24fbb357556fdc9e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index cc1b00f..d46ab57 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -258ea725c0b9400e9f176196a9035086e47de93a \ No newline at end of file +d7eb29b9caf15def2b1d6093f8428402f240c013 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index c83351e1..d2eabfa1 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -5460a5f2851583d0fca4f5588e8322abd26b2cf2 \ No newline at end of file +e26f56ebf41c4e45a1847205dab787eab24ef8f5 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 6b2990e..5d3b7f0 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -a87805c062b890080eafef65eb487691264721c8 \ No newline at end of file +e73658ed2303c5ab55ce6fe19d7cda1994405b4c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index fc7d2dd..a6669280 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -0a342e12b6a97d90ee850575677cd2f284fc7eb3 \ No newline at end of file +587a2e34c27cfc645eebd6b4742151ac70b5713f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 0ee8ba1b..1bcf6cf 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -1ee4b7151fe65989fa458a6c5d94a7758f09ded9 \ No newline at end of file +66c3f911424e56141667a45064077a0750adc43f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index d930628..9002d64 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -602ec65e2727f7d5bcddc9f1a7fae3c47f325098 \ No newline at end of file +07ceb477e8e6a8c3bd2023102e8017bbd5bc3cd1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index af37ded..e948427 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -79e9f77b88ef9336b96d049aa5c7752d97c6ce29 \ No newline at end of file +719118d60825f72bfecd7bb77dfb603e9d6a8d24 \ No newline at end of file
diff --git a/ios/web/find_in_page/BUILD.gn b/ios/web/find_in_page/BUILD.gn index 823df20..2c49020b 100644 --- a/ios/web/find_in_page/BUILD.gn +++ b/ios/web/find_in_page/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//ios/web/public/js_messaging/compile_ts.gni") -import("//ios/web/public/js_messaging/optimize_js.gni") +import("//ios/web/public/js_messaging/optimize_ts.gni") source_set("find_in_page") { deps = [ @@ -41,20 +41,23 @@ ] } -optimize_js("find_in_page_js") { +optimize_ts("find_in_page_js") { visibility = [ ":find_in_page" ] - primary_script = "resources/find_in_page_native_api.js" - sources = [ "resources/find_in_page_native_api.js" ] + sources = [ "resources/find_in_page_native_api.ts" ] - deps = [ ":compile_ts" ] + deps = [ + ":compile_ts", + "//ios/web/public/js_messaging:gcrweb", + ] } -optimize_js("find_in_page_event_listeners_js") { +optimize_ts("find_in_page_event_listeners_js") { visibility = [ ":find_in_page" ] - primary_script = "resources/find_in_page_event_listeners.js" - sources = [ "resources/find_in_page_event_listeners.js" ] + sources = [ "resources/find_in_page_event_listeners.ts" ] + + deps = [ "//ios/web/public/js_messaging:gcrweb" ] } source_set("find_in_page_unittests") {
diff --git a/ios/web/find_in_page/resources/find_in_page.ts b/ios/web/find_in_page/resources/find_in_page.ts index 8a6b30eb..8adb222 100644 --- a/ios/web/find_in_page/resources/find_in_page.ts +++ b/ios/web/find_in_page/resources/find_in_page.ts
@@ -199,12 +199,12 @@ class Replacement { /** * @param {Node} HTMLElement The HTML Node containing search result. - * @param {Array<HTMLElement>} newNodes New HTML Nodes created for + * @param {Array<Node>} newNodes New HTML Nodes created for * substitution of |oldNode|. */ constructor( private readonly oldNode: HTMLElement, - private readonly newNodes: HTMLElement[]) {} + private readonly newNodes: Node[]) {} /** * Executes the replacement to highlight search result. @@ -245,9 +245,10 @@ /** * @param {number} begin Beginning index of |node|.textContent in |allText_|. * @param {number} end Ending index of |node|.textContent in |allText_|. - * @param {Node} node The TEXT Node of this section. + * @param {HTMLElement} node The TEXT Node of this section. */ - constructor(public begin: number, public end: number, public node: Node) {} + constructor( + public begin: number, public end: number, public node: HTMLElement) {} } /**
diff --git a/ios/web/find_in_page/resources/find_in_page_event_listeners.js b/ios/web/find_in_page/resources/find_in_page_event_listeners.js deleted file mode 100644 index d527ad6..0000000 --- a/ios/web/find_in_page/resources/find_in_page_event_listeners.js +++ /dev/null
@@ -1,7 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Requires |__gCrWeb.findInPage.stop| from find_in_page.js - -window.addEventListener('pagehide', __gCrWeb.findInPage.stop);
diff --git a/ios/web/find_in_page/resources/find_in_page_event_listeners.ts b/ios/web/find_in_page/resources/find_in_page_event_listeners.ts new file mode 100644 index 0000000..9bf68bf --- /dev/null +++ b/ios/web/find_in_page/resources/find_in_page_event_listeners.ts
@@ -0,0 +1,7 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js'; + +window.addEventListener('pagehide', gCrWeb.findInPage.stop);
diff --git a/ios/web/find_in_page/resources/find_in_page_native_api.js b/ios/web/find_in_page/resources/find_in_page_native_api.ts similarity index 76% rename from ios/web/find_in_page/resources/find_in_page_native_api.js rename to ios/web/find_in_page/resources/find_in_page_native_api.ts index 378b57f..8d56224 100644 --- a/ios/web/find_in_page/resources/find_in_page_native_api.js +++ b/ios/web/find_in_page/resources/find_in_page_native_api.ts
@@ -2,14 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import { - Match, - PartialMatch, - Replacement, - Section, - Timer -} from '//ios/web/find_in_page/resources/find_in_page.js'; - +// clang-format off import { CSS_CLASS_NAME, CSS_CLASS_NAME_SELECT, @@ -19,10 +12,13 @@ TIMEOUT } from '//ios/web/find_in_page/resources/find_in_page_constants.js'; -import { - createRegex, - escapeHTML -} from '//ios/web/find_in_page/resources/find_in_page_utils.js'; +import {Match, PartialMatch, Replacement, Section, Timer} from + '//ios/web/find_in_page/resources/find_in_page.js'; +import {createRegex, escapeHTML} from + '//ios/web/find_in_page/resources/find_in_page_utils.js'; + +import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js'; +// clang-format on /** * Based on code from the Google iOS app. @@ -33,16 +29,6 @@ * selected one in orange color; */ -/** - * Namespace for this file. - */ -__gCrWeb.findInPage = {}; - -// Store findInPage namespace object in a global __gCrWeb object referenced by -// a string, so it does not get renamed by closure compiler during the -// minification. -__gCrWeb['findInPage'] = __gCrWeb.findInPage; - // Mark: Private properties /** @@ -56,7 +42,7 @@ * All the sections_ in |allText_|. * @type {Array<Section>} */ -let sections_ = []; +let sections_: Section[] = []; /** * The index of the Section where the last PartialMatch is found. @@ -89,13 +75,13 @@ * A temporary array used for storing all PartialMatches inside current Section. * @type {Array<PartialMatch>} */ -let partialMatches_ = []; +let partialMatches_: PartialMatch[] = []; /** * The replacements of current FindInPage action. * @type {Array<Replacement>} */ -let replacements_ = []; +let replacements_: Replacement[] = []; /** * The index of the Replacement from which the highlight process continue when @@ -120,7 +106,7 @@ * The style DOM element that we add. * @type {Element} */ -let styleElement_ = null; +let styleElement_: Element|null; /** * A search is in progress. @@ -135,14 +121,6 @@ */ let searchStateIsClean_ = true; -// Mark: Public properties accessed from native code. - -/** - * The list of all the matches in current page. - * @type {Array<Match>} - */ -__gCrWeb.findInPage.matches = []; - // Mark: Private helper functions /** @@ -152,12 +130,13 @@ * |allText_|. * @return {number} The index of the result in |sections_|. */ -function findFirstSectionEndsAfter_(index) { +function findFirstSectionEndsAfter_(index: number): number { let left = sectionsIndex_; let right = sections_.length; while (left < right) { let mid = Math.floor((left + right) / 2); - if (sections_[mid].end <= index) { + const section = sections_[mid]; + if (section && section.end <= index) { left = mid + 1; } else { right = mid; @@ -175,15 +154,20 @@ * |partialMatches_| will be cleared when processing ends. * @return {undefined} */ -function processPartialMatchesInCurrentSection() { +function processPartialMatchesInCurrentSection(): void { if (partialMatches_.length == 0) return; let section = sections_[sectionsIndex_]; + if (!section) { + return; + } let oldNode = section.node; - let newNodes = []; + if (!oldNode.ownerDocument || !oldNode.textContent) { + return; + } + let newNodes: Node[] = []; let previousEnd = section.begin; - for (let i = 0; i < partialMatches_.length; ++i) { - let partialMatch = partialMatches_[i]; + for (const partialMatch of partialMatches_) { // Create the TEXT node for leading non-matching string piece. Notice that // substr must be taken from TEXT Node.textContent instead of |allText_| // since it's in lower case. @@ -202,7 +186,7 @@ previousEnd = partialMatch.end; // Record the <chrome_find> Node in corresponding Match. - __gCrWeb.findInPage.matches[partialMatch.matchId].nodes.push(newNode); + gCrWeb.findInPage.matches[partialMatch.matchId].nodes.push(newNode); } // Create the TEXT node for trailing non-matching string piece. if (previousEnd != section.end) { @@ -218,14 +202,14 @@ } /** - * @return {Match} The currently selected Match. Returns null if no + * @return {Match} The currently selected Match. Returns undefined if no * currently selected match. */ -function getCurrentSelectedMatch_() { +function getCurrentSelectedMatch_(): Match|undefined { if (selectedMatchIndex_ < 0) { - return null; + return undefined; } - return __gCrWeb.findInPage.matches[selectedMatchIndex_]; + return gCrWeb.findInPage.matches[selectedMatchIndex_]; }; /** @@ -234,12 +218,11 @@ * has taken too long. * @return {Number} of visible matches. */ -function countVisibleMatches_(timer) { - let max = __gCrWeb.findInPage.matches.length; +function countVisibleMatches_(timer: Timer|null): number { + let max = gCrWeb.findInPage.matches.length; let maxVisible = MAX_VISIBLE_ELEMENTS; var currentlyVisibleMatchCount = 0; for (let index = visibleMatchesCountIndexIterator_; index < max; index++) { - let match = __gCrWeb.findInPage.matches[index]; if (timer && timer.overtime()) { visibleMatchesCountIndexIterator_ = index; return TIMEOUT; @@ -250,7 +233,8 @@ continue; } - if (match.visible()) { + let match = gCrWeb.findInPage.matches[index]; + if (match && match.visible()) { currentlyVisibleMatchCount++; } } @@ -263,16 +247,16 @@ * Removes highlights of previous search and reset all global vars. * @return {undefined} */ -function cleanUp_() { - for (let i = 0; i < replacements_.length; ++i) { - replacements_[i].undoSwap(); +function cleanUp_(): void { + for (const replacement of replacements_) { + replacement.undoSwap(); } allText_ = ''; sections_ = []; sectionsIndex_ = 0; - __gCrWeb.findInPage.matches = []; + gCrWeb.findInPage.matches = []; selectedMatchIndex_ = -1; selectedVisibleMatchIndex_ = -1; matchId_ = 0; @@ -287,33 +271,36 @@ /** * Scrolls to the position of the currently selected match. */ -function scrollToCurrentlySelectedMatch_() { +function scrollToCurrentlySelectedMatch_(): void { let match = getCurrentSelectedMatch_(); if (!match) { return; } - match.nodes[0].scrollIntoView({block: 'center', inline: 'center'}); + const nodes = match.nodes; + if (!nodes || nodes.length == 0) { + return; + } + + const firstNode = nodes[0]; + if (!firstNode) { + return; + } + + firstNode.scrollIntoView({block: 'center', inline: 'center'}); }; /** - * Enable the __gCrWeb.findInPage module. - * Mainly just adds the style for the classes. + * Enable find in page by adding the appropriate style element to the page. */ -function enable_() { +function enable_(): void { if (styleElement_) { // Already enabled. return; } - addDocumentStyle_(document); -}; -/** - * Adds the appropriate style element to the page. - */ -function addDocumentStyle_(thisDocument) { - let styleContent = []; - function addCSSRule(name, style) { + let styleContent: string[] = []; + function addCSSRule(name: string, style: string) { styleContent.push(name, '{', style, '}'); }; addCSSRule( @@ -326,25 +313,27 @@ 'background-color:#ff9632 !important;' + 'padding:0px;margin:0px;' + 'overflow:visible !important;'); - styleElement_ = thisDocument.createElement('style'); + styleElement_ = document.createElement('style'); styleElement_.id = CSS_STYLE_ID; styleElement_.setAttribute('type', 'text/css'); - styleElement_.appendChild(thisDocument.createTextNode(styleContent.join(''))); - thisDocument.body.appendChild(styleElement_); + styleElement_.appendChild(document.createTextNode(styleContent.join(''))); + document.body.appendChild(styleElement_); }; /** * Removes the style element from the page. */ -function removeStyle_() { +function removeStyle_(): void { if (styleElement_) { let style = document.getElementById(CSS_STYLE_ID); - document.body.removeChild(style); + if (style) { + document.body.removeChild(style); + } styleElement_ = null; } }; -// Mark: Public APIs called from native code. +// Mark: Public API functions called from native code. /** * Looks for a phrase in the DOM. @@ -352,11 +341,11 @@ * @param {number} timeout Maximum time to run. * @return {number} that represents the total matches found. */ -__gCrWeb.findInPage.findString = function(string, timeout) { +function findString(string: string, timeout: number): number { // Enable findInPage module if hasn't been done yet. - if (!__gCrWeb.findInPage.hasInitialized) { + if (!gCrWeb.findInPage.hasInitialized) { enable_(); - __gCrWeb.findInPage.hasInitialized = true; + gCrWeb.findInPage.hasInitialized = true; } if (!searchStateIsClean_) { @@ -369,7 +358,7 @@ } // Holds what nodes we have not processed yet. - __gCrWeb.findInPage.stack = [document.body]; + gCrWeb.findInPage.stack = [document.body]; // Number of visible matches found. visibleMatchCount_ = 0; @@ -377,11 +366,11 @@ // Index tracking variables so search can be broken up into multiple calls. visibleMatchesCountIndexIterator_ = 0; - __gCrWeb.findInPage.regex = createRegex(string); + gCrWeb.findInPage.regex = createRegex(string); searchInProgress_ = true; - return __gCrWeb.findInPage.pumpSearch(timeout); + return pumpSearch(timeout); }; /** @@ -402,7 +391,7 @@ * @param {number} timeout Only run find in page until timeout. * @return {number} that represents the total matches found. */ -__gCrWeb.findInPage.pumpSearch = function(timeout) { +function pumpSearch(timeout: number): number { // TODO(crbug.com/895531): It would be better if this DCHECKed. if (searchInProgress_ == false) { return 0; @@ -413,8 +402,8 @@ let timer = new Timer(timeout); // Go through every node in DFS fashion. - while (__gCrWeb.findInPage.stack.length) { - let node = __gCrWeb.findInPage.stack.pop(); + while (gCrWeb.findInPage.stack.length) { + let node = gCrWeb.findInPage.stack.pop(); let children = node.childNodes; if (children && children.length) { // add all (reasonable) children @@ -422,7 +411,7 @@ let child = children[i]; if ((child.nodeType == 1 || child.nodeType == 3) && !IGNORE_NODE_NAMES.has(child.nodeName)) { - __gCrWeb.findInPage.stack.push(children[i]); + gCrWeb.findInPage.stack.push(children[i]); } } } @@ -442,13 +431,13 @@ // Do regex match in |allText_|, create |matches| and |replacements|. The // regex is set on __gCrWeb, so its state is kept between continuous calls on // pumpSearch. - let regex = __gCrWeb.findInPage.regex; + let regex = gCrWeb.findInPage.regex; if (regex) { for (let res; res = regex.exec(allText_);) { // The range of current Match in |allText_| is [begin, end). let begin = res.index; let end = begin + res[0].length; - __gCrWeb.findInPage.matches.push(new Match()); + gCrWeb.findInPage.matches.push(new Match()); // Find the Section where current Match starts. let oldSectionIndex = sectionsIndex_; @@ -463,6 +452,9 @@ // Create all PartialMatches of current Match. while (true) { let section = sections_[sectionsIndex_]; + if (!section) { + break; + } partialMatches_.push(new PartialMatch( matchId_, Math.max(section.begin, begin), Math.min(section.end, end))); @@ -484,7 +476,7 @@ } // Process remaining PartialMatches. processPartialMatchesInCurrentSection(); - __gCrWeb.findInPage.regex = undefined; + gCrWeb.findInPage.regex = undefined; } // Execute replacements to highlight search results. @@ -493,7 +485,10 @@ replacementsIndex_ = i; return TIMEOUT; } - replacements_[i].doSwap(); + const replacement = replacements_[i]; + if (replacement) { + replacement.doSwap(); + } } let visibleMatchCount = countVisibleMatches_(timer); @@ -516,7 +511,8 @@ * @return {Dictionary} of currently visible matches and currently selected * match index. */ -__gCrWeb.findInPage.selectAndScrollToVisibleMatch = function(index) { +function selectAndScrollToVisibleMatch(index: number): + {matches: number, index: number, contextString?: string} { if (index >= visibleMatchCount_ || index < 0) { // Do nothing if invalid index is passed or if there are no matches. return {matches: visibleMatchCount_, index: selectedMatchIndex_}; @@ -528,8 +524,6 @@ match.removeSelectHighlight(); } - let previouslySelectedMatchIndex = selectedMatchIndex_; - // Recalculate total visible matches in case it has changed. let visibleMatchCount = countVisibleMatches_(null); @@ -549,8 +543,8 @@ let total_match_index = 0; var visible_match_count = index; // Select the |index|-th visible match. - while (total_match_index < __gCrWeb.findInPage.matches.length) { - if (__gCrWeb.findInPage.matches[total_match_index].visible()) { + while (total_match_index < gCrWeb.findInPage.matches.length) { + if (gCrWeb.findInPage.matches[total_match_index].visible()) { visible_match_count--; if (visible_match_count < 0) { break; @@ -563,6 +557,9 @@ selectedVisibleMatchIndex_ = index; match = getCurrentSelectedMatch_(); + if (!match) { + return {matches: visibleMatchCount, index: -1}; + } match.addSelectHighlight(); scrollToCurrentlySelectedMatch_(); @@ -573,22 +570,26 @@ // nextSibling and previousSibling properties to the match nodes sometimes // are text nodes, not HTML nodes. This results in '[object Text]' string // being added to the array instead of the object. - let nodes = match.nodes.slice(); - if (match.nodes[0].previousSibling) { - nodes.unshift([match.nodes[0].previousSibling.textContent]); + + let contextString = ''; + const firstNode = match.nodes[0]; + if (firstNode && firstNode.previousSibling) { + contextString += firstNode.previousSibling.textContent; } - if (match.nodes[match.nodes.length - 1].nextSibling) { - nodes.push([match.nodes[match.nodes.length - 1].nextSibling.textContent]); + contextString += match.nodes + .map(function(node) { + if (node.textContent) { + return node.textContent; + } else { + return node; + } + }) + .join(''); + + const lastNode = match.nodes[match.nodes.length - 1]; + if (lastNode && lastNode.nextSibling) { + contextString += lastNode.nextSibling.textContent; } - let contextString = nodes - .map(function(node) { - if (node.textContent) { - return node.textContent; - } else { - return node; - } - }) - .join(''); return { matches: visibleMatchCount, @@ -598,13 +599,29 @@ }; /** - * Disables the __gCrWeb.findInPage module. - * Removes any matches and the style and class names. + * Disables the __gCrWeb.findInPage module and removes any matches and the style + * and class names. */ -__gCrWeb.findInPage.stop = function() { +function stop(): void { if (styleElement_) { removeStyle_(); cleanUp_(); } - __gCrWeb.findInPage.hasInitialized = false; + gCrWeb.findInPage.hasInitialized = false; +}; + +// Mark: Public API + +/** + * The list of all the matches in current page. + * @type {Array<Match>} + */ +let matches: Match[] = []; + +gCrWeb.findInPage = { + findString, + matches, + pumpSearch, + selectAndScrollToVisibleMatch, + stop };
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc index 34a0412..3fd4822 100644 --- a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc +++ b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
@@ -853,17 +853,7 @@ perfetto::StaticString{method_name_callback_(*message)}, [&](perfetto::EventContext& ctx) { auto* info = ctx.event()->set_chrome_mojo_event_info(); - // Generate mojo interface tag only for local traces. - // - // This saves trace buffer space for field traces. The - // interface tag can be extracted from the interface method - // after symbolization. - // - // For local traces, this produces a raw string so that the - // trace doesn't require symbolization to be useful. - if (!ctx.ShouldFilterDebugAnnotations()) { - info->set_mojo_interface_tag(interface_name_); - } + info->set_mojo_interface_tag(interface_name_); const auto method_info = method_info_callback_(*message); if (method_info) { info->set_ipc_hash((*method_info)());
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 8409687..e90b6c1 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc
@@ -72,6 +72,10 @@ http2_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] = kSpdyMaxHeaderListSize; + it = http2_settings.find(spdy::SETTINGS_ENABLE_PUSH); + if (it == http2_settings.end()) + http2_settings[spdy::SETTINGS_ENABLE_PUSH] = kSpdyDisablePush; + return http2_settings; }
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index 9e3eb46..e447de32 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h
@@ -83,8 +83,11 @@ // Specifies the maximum concurrent streams server could send (via push). const uint32_t kSpdyMaxConcurrentPushedStreams = 1000; - // Self-contained structure with all the simple configuration options - // supported by the HttpNetworkSession. +// Specifies the the default value for the push setting, which is disabled. +const uint32_t kSpdyDisablePush = 0; + +// Self-contained structure with all the simple configuration options +// supported by the HttpNetworkSession. struct NET_EXPORT HttpNetworkSessionParams { HttpNetworkSessionParams(); HttpNetworkSessionParams(const HttpNetworkSessionParams& other);
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 4a0ee1fa..a1ccf14 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2022-08-19 12:56 UTC +# Last updated: 2022-08-20 12:55 UTC PinsListTimestamp -1660913789 +1661000127 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index 17fe141..78deefb 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -442,8 +442,11 @@ HttpResponseInfo* response, HttpResponseInfo* push_response, const std::string& expected) { + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, - nullptr); + std::move(session_deps)); + helper.RunPreTestSetup(); helper.AddData(data); @@ -504,8 +507,11 @@ } void RunBrokenPushTest(SequencedSocketData* data, int expected_rv) { + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, - nullptr); + std::move(session_deps)); + helper.RunPreTestSetup(); helper.AddData(data); @@ -2253,7 +2259,10 @@ }; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunToCompletion(&data); TransactionHelperResult out = helper.output(); EXPECT_THAT(out.rv, IsOk()); @@ -2536,6 +2545,9 @@ MockClientSocketFactory socket_factory; auto context_builder = CreateSpdyTestURLRequestContextBuilder(&socket_factory); + HttpNetworkSessionParams test_params; + test_params.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + context_builder->set_http_network_session_params(test_params); auto spdy_url_request_context = context_builder->Build(); SpdySessionPoolPeer pool_peer( spdy_url_request_context->http_transaction_factory() @@ -2796,7 +2808,10 @@ SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -2867,7 +2882,10 @@ SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -3014,7 +3032,10 @@ SequencedSocketData data_placeholder2; SequencedSocketData data_placeholder3; - NormalSpdyTransactionHelper helper(request_, LOWEST, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, LOWEST, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); helper.AddData(&data_placeholder1); // other requests reuse the same socket @@ -3080,7 +3101,10 @@ }; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -3429,7 +3453,10 @@ }; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunToCompletion(&data); histogram_tester.ExpectBucketCount( @@ -3463,7 +3490,10 @@ }; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -3525,7 +3555,10 @@ MockRead(ASYNC, ERR_IO_PENDING, 6), CreateMockRead(stream3_syn, 7)}; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -3595,7 +3628,10 @@ SequencedSocketData data(reads1, writes1); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -3670,6 +3706,8 @@ auto session_deps = std::make_unique<SpdySessionDependencies>(); session_deps->host_resolver = std::move(resolver); + + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, std::move(session_deps)); @@ -4559,7 +4597,10 @@ MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5)}; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunToCompletion(&data); histogram_tester.ExpectBucketCount( @@ -4593,7 +4634,10 @@ MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5)}; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunToCompletion(&data); histogram_tester.ExpectBucketCount( @@ -6420,8 +6464,10 @@ SequencedSocketData data(reads, writes); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, - nullptr); + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -6678,7 +6724,7 @@ "mail.example.org", base::Time::Now() + base::Days(1) /* expiry */, true, GURL(), request_.network_isolation_key); } - + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, std::move(session_deps)); @@ -6774,7 +6820,10 @@ request_.url = GURL(url_to_fetch); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -6879,7 +6928,10 @@ request_.url = GURL(url_to_fetch); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data); @@ -6980,7 +7032,10 @@ ssl_provider->ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddDataWithSSLSocketDataProvider(&data, std::move(ssl_provider)); @@ -7070,7 +7125,10 @@ // Request |url_to_fetch0| to open connection to mail.example.org. request_.url = GURL(url_to_fetch0); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); // "spdy_pooling.pem" is valid for www.example.org, but not for @@ -7471,6 +7529,7 @@ stream_max_recv_window_size; initial_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] = kSpdyMaxHeaderListSize; + initial_settings[spdy::SETTINGS_ENABLE_PUSH] = 0; spdy::SpdySerializedFrame initial_settings_frame( spdy_util_.ConstructSpdySettings(initial_settings)); @@ -8211,7 +8270,11 @@ }; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunToCompletion(&data); TransactionHelperResult out = helper.output(); EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR)); @@ -8250,7 +8313,10 @@ }; SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunToCompletion(&data); TransactionHelperResult out = helper.output(); EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR)); @@ -8658,7 +8724,10 @@ SequencedSocketData data(reads, writes); - NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + auto session_deps = std::make_unique<SpdySessionDependencies>(); + session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, + std::move(session_deps)); helper.RunPreTestSetup(); helper.AddData(&data);
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc index 6f8f674..a051ff4 100644 --- a/net/spdy/spdy_session_unittest.cc +++ b/net/spdy/spdy_session_unittest.cc
@@ -932,6 +932,8 @@ TEST_F(SpdySessionTest, HeadersAfterGoAway) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); spdy::SpdySerializedFrame push( spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kDefaultUrl)); @@ -993,6 +995,8 @@ TEST_F(SpdySessionTest, UnsupportedPushedStatusCode) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::Http2HeaderBlock push_promise_header_block; push_promise_header_block[spdy::kHttp2MethodHeader] = "GET"; spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_promise_header_block); @@ -1648,6 +1652,8 @@ TEST_F(SpdySessionTest, CancelPushAfterSessionGoesAway) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM)); spdy::SpdySerializedFrame priority( @@ -1708,7 +1714,7 @@ TEST_F(SpdySessionTestWithMockTime, CancelPushAfterExpired) { base::HistogramTester histogram_tester; - + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM)); spdy::SpdySerializedFrame priority( @@ -1793,6 +1799,7 @@ TEST_F(SpdySessionTestWithMockTime, ClaimPushedStreamBeforeExpires) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM)); @@ -1882,6 +1889,8 @@ TEST_F(SpdySessionTest, CancelPushBeforeClaimed) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM)); spdy::SpdySerializedFrame priority( @@ -5656,6 +5665,8 @@ // Regression. Sorta. Push streams and client streams were sharing a single // limit for a long time. TEST_F(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::SettingsMap new_settings; new_settings[spdy::SETTINGS_MAX_CONCURRENT_STREAMS] = 2; spdy::SpdySerializedFrame settings_frame( @@ -5745,6 +5756,7 @@ TEST_F(SpdySessionTest, RejectPushedStreamExceedingConcurrencyLimit) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; spdy::SpdySerializedFrame push_a( spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kPushedUrl)); @@ -5836,6 +5848,8 @@ TEST_F(SpdySessionTest, StreamsAdvertisingDifferentOriginAreRefused) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + // Origin of kDefaultUrl should be different from the origin of // kHttpURLFromAnotherOrigin. ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpURLFromAnotherOrigin).host()); @@ -5905,6 +5919,8 @@ TEST_F(SpdySessionTest, IgnoreReservedRemoteStreamsCount) { base::HistogramTester histogram_tester; + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::SpdySerializedFrame push_a( spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kPushedUrl)); spdy::Http2HeaderBlock push_headers; @@ -6007,6 +6023,8 @@ } TEST_F(SpdySessionTest, CancelReservedStreamOnHeadersReceived) { + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + spdy::Http2HeaderBlock push_headers; push_headers[":method"] = "GET"; spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers); @@ -6115,6 +6133,7 @@ } TEST_F(SpdySessionTest, GetPushedStream) { + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; spdy::Http2HeaderBlock push_headers; push_headers[":method"] = "GET"; spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers); @@ -6401,6 +6420,7 @@ kSpdyMaxConcurrentPushedStreams; expected_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] = kSpdyMaxHeaderListSize; + expected_settings[spdy::SETTINGS_ENABLE_PUSH] = 0; spdy::SpdySerializedFrame settings_frame( spdy_util_.ConstructSpdySettings(expected_settings)); @@ -6548,6 +6568,7 @@ kSpdyMaxConcurrentPushedStreams; expected_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] = kSpdyMaxHeaderListSize; + expected_settings[spdy::SETTINGS_ENABLE_PUSH] = 0; RunInitialSettingsTest(expected_settings); } @@ -6598,6 +6619,7 @@ kSpdyMaxConcurrentPushedStreams; expected_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] = kSpdyMaxHeaderListSize; + expected_settings[spdy::SETTINGS_ENABLE_PUSH] = 0; expected_settings[7] = 1234; expected_settings[25] = 5678; RunInitialSettingsTest(expected_settings);
diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc index f715c3e..ebbeae9 100644 --- a/net/spdy/spdy_stream_unittest.cc +++ b/net/spdy/spdy_stream_unittest.cc
@@ -173,6 +173,24 @@ SSLSocketDataProvider ssl_; }; +class SpdyStreamPushTest : public SpdyStreamTest { + protected: + // A function that takes a SpdyStream and the number of bytes which + // will unstall the next frame completely. + typedef base::OnceCallback<void(const base::WeakPtr<SpdyStream>&, int32_t)> + UnstallFunction; + + explicit SpdyStreamPushTest( + base::test::TaskEnvironment::TimeSource time_source = + base::test::TaskEnvironment::TimeSource::DEFAULT) + : SpdyStreamTest(time_source) { + session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1; + session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); + } + + ~SpdyStreamPushTest() override = default; +}; + TEST_F(SpdyStreamTest, SendDataAfterOpen) { spdy::SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); @@ -350,7 +368,7 @@ EXPECT_TRUE(data.AllWriteDataConsumed()); } -TEST_F(SpdyStreamTest, PushedStream) { +TEST_F(SpdyStreamPushTest, PushedStream) { spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST)); AddWrite(req); @@ -682,7 +700,7 @@ // Receiving a header with uppercase ASCII should result in a protocol error // even for a push stream. -TEST_F(SpdyStreamTest, UpperCaseHeadersOnPush) { +TEST_F(SpdyStreamPushTest, UpperCaseHeadersOnPush) { spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST)); AddWrite(req); @@ -795,7 +813,7 @@ EXPECT_TRUE(data.AllReadDataConsumed()); } -TEST_F(SpdyStreamTest, HeadersMustHaveStatusOnPushedStream) { +TEST_F(SpdyStreamPushTest, HeadersMustHaveStatusOnPushedStream) { spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST)); AddWrite(req); @@ -867,7 +885,7 @@ EXPECT_TRUE(data.AllReadDataConsumed()); } -TEST_F(SpdyStreamTest, HeadersMustPreceedData) { +TEST_F(SpdyStreamPushTest, HeadersMustPreceedData) { spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST)); AddWrite(req); @@ -908,7 +926,7 @@ EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR)); } -TEST_F(SpdyStreamTest, HeadersMustPreceedDataOnPushedStream) { +TEST_F(SpdyStreamPushTest, HeadersMustPreceedDataOnPushedStream) { spdy::SpdySerializedFrame req( spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST)); AddWrite(req);
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc index 7190eda4..1b7c0e81 100644 --- a/net/websockets/websocket_stream_test.cc +++ b/net/websockets/websocket_stream_test.cc
@@ -202,6 +202,7 @@ write_settings[spdy::SETTINGS_INITIAL_WINDOW_SIZE] = 6 * 1024 * 1024; write_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] = kSpdyMaxHeaderListSize; + write_settings[spdy::SETTINGS_ENABLE_PUSH] = 0; frames_.push_back(spdy_util_.ConstructSpdySettings(write_settings)); AddWrite(&frames_.back());
diff --git a/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc b/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc index eb1893a..2fa516a 100644 --- a/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc +++ b/services/network/public/cpp/first_party_sets_mojom_traits_unittest.cc
@@ -25,6 +25,16 @@ EXPECT_EQ(original, round_tripped); } +TEST(FirstPartySetsTraitsTest, Roundtrips_SiteType) { + for (net::SiteType site_type : + {net::SiteType::kPrimary, net::SiteType::kAssociated}) { + net::SiteType roundtrip; + ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::SiteType>( + site_type, roundtrip)); + EXPECT_EQ(site_type, roundtrip); + } +} + TEST(FirstPartySetsTraitsTest, Roundtrips_FirstPartySetEntry) { net::SchemefulSite primary(GURL("https://primary.test"));
diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn index df80f5b7..ce31778 100644 --- a/services/network/public/mojom/BUILD.gn +++ b/services/network/public/mojom/BUILD.gn
@@ -756,9 +756,26 @@ cpp = "::net::FirstPartySetEntry::SiteIndex" }, { + mojom = "network.mojom.SiteType" + cpp = "::net::SiteType" + }, + { mojom = "network.mojom.FirstPartySetEntry" cpp = "::net::FirstPartySetEntry" }, + { + mojom = "network.mojom.SamePartyCookieContextType" + cpp = "::net::SamePartyContext::Type" + }, + { + mojom = "network.mojom.SamePartyContext" + cpp = "::net::SamePartyContext" + }, + { + mojom = "network.mojom.FirstPartySetMetadata" + cpp = "::net::FirstPartySetMetadata" + move_only = true + }, ] traits_headers = [ "//services/network/public/cpp/first_party_sets_mojom_traits.h", @@ -900,11 +917,6 @@ mojom = "network.mojom.CookieSourceScheme" cpp = "::net::CookieSourceScheme" }, - { - mojom = "network.mojom.FirstPartySetMetadata" - cpp = "::net::FirstPartySetMetadata" - move_only = true - }, ] traits_headers = [ "//services/network/public/cpp/cookie_manager_mojom_traits.h" ]
diff --git a/testing/buildbot/filters/pixel_tests.filter b/testing/buildbot/filters/pixel_tests.filter index 499a88c..c2a7efe9 100644 --- a/testing/buildbot/filters/pixel_tests.filter +++ b/testing/buildbot/filters/pixel_tests.filter
@@ -17,6 +17,7 @@ AssistantOnboardingViewBrowserTest.InvokeUi_* BookmarkBubbleViewBrowserTest.* BookmarkEditorViewBrowserTest.* +BubbleFrameViewBrowserTest.* ChromeLabsUiTest.* ConfirmBubbleTest.* ContentAnalysysDialogUiTest.*
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index db91a892..443887e 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -1561,6 +1561,8 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::FeatureParam<bool> kPretokenizeInlineSheets = { &kPretokenizeCSS, "pretokenize_inline_sheets", true}; +const base::FeatureParam<bool> kPretokenizeExternalSheets = { + &kPretokenizeCSS, "pretokenize_external_sheets", true}; const base::Feature kSimulateClickOnAXFocus { "SimulateClickOnAXFocus",
diff --git a/third_party/blink/common/mediastream/media_stream_mojom_traits.cc b/third_party/blink/common/mediastream/media_stream_mojom_traits.cc index 85871e025..433376ee 100644 --- a/third_party/blink/common/mediastream/media_stream_mojom_traits.cc +++ b/third_party/blink/common/mediastream/media_stream_mojom_traits.cc
@@ -73,6 +73,7 @@ out->request_pan_tilt_zoom_permission = input.request_pan_tilt_zoom_permission(); out->request_all_screens = input.request_all_screens(); + out->preferred_display_surface = input.preferred_display_surface(); return true; }
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 7010377..84095bf2 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -811,6 +811,8 @@ BLINK_COMMON_EXPORT extern const base::Feature kPretokenizeCSS; BLINK_COMMON_EXPORT extern const base::FeatureParam<bool> kPretokenizeInlineSheets; +BLINK_COMMON_EXPORT extern const base::FeatureParam<bool> + kPretokenizeExternalSheets; // TODO(accessibility): This flag is set to accommodate JAWS on Windows so they // can adjust to us not simulating click events on a focus action. It should be
diff --git a/third_party/blink/public/common/mediastream/media_stream_controls.h b/third_party/blink/public/common/mediastream/media_stream_controls.h index f86f91c..b8386b8 100644 --- a/third_party/blink/public/common/mediastream/media_stream_controls.h +++ b/third_party/blink/public/common/mediastream/media_stream_controls.h
@@ -58,6 +58,8 @@ bool exclude_self_browser_surface = false; bool request_pan_tilt_zoom_permission = false; bool request_all_screens = false; + mojom::PreferredDisplaySurface preferred_display_surface = + mojom::PreferredDisplaySurface::NO_PREFERENCE; }; } // namespace blink
diff --git a/third_party/blink/public/common/mediastream/media_stream_mojom_traits.h b/third_party/blink/public/common/mediastream/media_stream_mojom_traits.h index 5501d94b..2d71ac86 100644 --- a/third_party/blink/public/common/mediastream/media_stream_mojom_traits.h +++ b/third_party/blink/public/common/mediastream/media_stream_mojom_traits.h
@@ -122,6 +122,11 @@ return controls.request_all_screens; } + static blink::mojom::PreferredDisplaySurface preferred_display_surface( + const blink::StreamControls& controls) { + return controls.preferred_display_surface; + } + static bool Read(blink::mojom::StreamControlsDataView input, blink::StreamControls* out); };
diff --git a/third_party/blink/public/mojom/mediastream/media_stream.mojom b/third_party/blink/public/mojom/mediastream/media_stream.mojom index 08e7eb53..be89a0d 100644 --- a/third_party/blink/public/mojom/mediastream/media_stream.mojom +++ b/third_party/blink/public/mojom/mediastream/media_stream.mojom
@@ -88,6 +88,15 @@ PAUSE, }; +// Type of preferred display surface to indicate which display surface type +// (screen, windows, or tabs) should be most prominently offered to the user. +enum PreferredDisplaySurface { + NO_PREFERENCE, + MONITOR, + WINDOW, + BROWSER, +}; + // See MediaStreamDispatcherHost below for information. struct StreamSelectionInfo { StreamSelectionStrategy strategy; @@ -126,6 +135,7 @@ bool exclude_self_browser_surface; bool request_pan_tilt_zoom_permission; bool request_all_screens; + PreferredDisplaySurface preferred_display_surface; }; // Results returned by a successful GetOpenDevice call.
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h index 6c7f175..04e637a 100644 --- a/third_party/blink/public/platform/web_runtime_features.h +++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -116,6 +116,7 @@ BLINK_PLATFORM_EXPORT static void EnableFencedFrames(bool); BLINK_PLATFORM_EXPORT static bool IsFencedFramesEnabled(); BLINK_PLATFORM_EXPORT static void EnableFileSystem(bool); + BLINK_PLATFORM_EXPORT static void EnableFluentScrollbars(bool); BLINK_PLATFORM_EXPORT static void EnableGenericSensorExtraClasses(bool); BLINK_PLATFORM_EXPORT static void EnableImplicitRootScroller(bool); BLINK_PLATFORM_EXPORT static void EnableLazyFrameLoading(bool);
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc index 1225e943..4411e94 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -160,8 +160,9 @@ std::unique_ptr<ParkableStringImpl::SecureDigest> digest, CrossThreadOnceClosure main_thread_continuation) { if (response_body_loader_client) { - response_body_loader_client->DidReceiveDecodedData(decoded_data, - std::move(digest)); + response_body_loader_client->DidReceiveDecodedData( + decoded_data, std::make_unique<ScriptResource::ScriptDecodedDataInfo>( + std::move(digest))); } std::move(main_thread_continuation).Run();
diff --git a/third_party/blink/renderer/core/css/style_sheet_contents.cc b/third_party/blink/renderer/core/css/style_sheet_contents.cc index 755d7deb..dc7acf7 100644 --- a/third_party/blink/renderer/core/css/style_sheet_contents.cc +++ b/third_party/blink/renderer/core/css/style_sheet_contents.cc
@@ -435,8 +435,9 @@ const auto* context = MakeGarbageCollected<CSSParserContext>(ParserContext(), this); - CSSParser::ParseSheet(context, this, sheet_text, - CSSDeferPropertyParsing::kYes); + CSSParser::ParseSheet( + context, this, sheet_text, CSSDeferPropertyParsing::kYes, true, + sheet_text.IsNull() ? nullptr : cached_style_sheet->TakeTokenizer()); } ParseSheetResult StyleSheetContents::ParseString(
diff --git a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc index 81f1b1b..d16551db 100644 --- a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc +++ b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.cc
@@ -26,6 +26,8 @@ #include "third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h" +#include "base/trace_event/trace_event.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h" #include "third_party/blink/renderer/core/css/style_sheet_contents.h" @@ -34,13 +36,176 @@ #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h" +#include "third_party/blink/renderer/platform/loader/fetch/response_body_loader.h" #include "third_party/blink/renderer/platform/loader/fetch/text_resource_decoder_options.h" #include "third_party/blink/renderer/platform/network/http_names.h" #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" +#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" +#include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" #include "third_party/blink/renderer/platform/weborigin/security_policy.h" +#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h" +#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h" +#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h" +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h" namespace blink { +namespace { + +class CSSDecodedDataInfo final : public Resource::DecodedDataInfo { + public: + CSSDecodedDataInfo(std::unique_ptr<CachedCSSTokenizer> tokenizer, + const String& encoding) + : tokenizer_(std::move(tokenizer)), encoding_(encoding) {} + + ResourceType GetType() const override { return ResourceType::kCSSStyleSheet; } + + std::unique_ptr<CachedCSSTokenizer> tokenizer_; + String encoding_; +}; + +} // namespace + +template <> +struct DowncastTraits<CSSDecodedDataInfo> { + static bool AllowFrom(const Resource::DecodedDataInfo& info) { + return info.GetType() == ResourceType::kCSSStyleSheet; + } +}; + +class CSSStyleSheetResource::CSSTokenizerWorker final { + public: + CSSTokenizerWorker( + mojo::ScopedDataPipeConsumerHandle data_pipe, + ResponseBodyLoaderClient* response_body_loader_client, + std::unique_ptr<TextResourceDecoder> decoder, + scoped_refptr<base::SingleThreadTaskRunner> loader_task_runner) + : data_pipe_(std::move(data_pipe)), + response_body_loader_client_(response_body_loader_client), + decoder_(std::move(decoder)), + loader_task_runner_(std::move(loader_task_runner)) { + watcher_ = std::make_unique<mojo::SimpleWatcher>( + FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL); + + watcher_->Watch(data_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE, + MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, + WTF::BindRepeating(&CSSTokenizerWorker::OnDataPipeReadable, + WTF::Unretained(this))); + + MojoResult ready_result; + mojo::HandleSignalsState ready_state; + MojoResult rv = watcher_->Arm(&ready_result, &ready_state); + if (rv == MOJO_RESULT_OK) + return; + + DCHECK_EQ(MOJO_RESULT_FAILED_PRECONDITION, rv); + OnDataPipeReadable(ready_result, ready_state); + } + + void OnDataPipeReadable(MojoResult result, + const mojo::HandleSignalsState& state) { + // A non-OK result means we've read all the data or there is an error. + if (result != MOJO_RESULT_OK) { + TRACE_EVENT0("blink", "CSSTokenizerWorker::Tokenize"); + watcher_.reset(); + + std::unique_ptr<CSSDecodedDataInfo> info; + String text; + // This means the load succeeded. If no data has been received, the text + // should be null. + if (result == MOJO_RESULT_FAILED_PRECONDITION && has_data_) { + builder_.Append(decoder_->Flush()); + text = builder_.ReleaseString(); + // The expensive tokenization work we want to complete in the background + // is done in the CreateCachedTokenizer() call below. + info = std::make_unique<CSSDecodedDataInfo>( + CSSTokenizer::CreateCachedTokenizer(text), + String(decoder_->Encoding().GetName())); + } + PostCrossThreadTask(*loader_task_runner_, FROM_HERE, + CrossThreadBindOnce(NotifyClientDidFinishLoading, + response_body_loader_client_, + text, std::move(info), result)); + return; + } + + CHECK(state.readable()); + CHECK(data_pipe_); + + const void* data; + uint32_t data_size; + // There should be data, so this read should succeed. + CHECK_EQ( + data_pipe_->BeginReadData(&data, &data_size, MOJO_READ_DATA_FLAG_NONE), + MOJO_RESULT_OK); + has_data_ = true; + + auto copy_for_resource = std::make_unique<char[]>(data_size); + memcpy(copy_for_resource.get(), data, data_size); + PostCrossThreadTask( + *loader_task_runner_, FROM_HERE, + CrossThreadBindOnce(NotifyClientDidReceiveData, + response_body_loader_client_, + std::move(copy_for_resource), data_size)); + builder_.Append( + decoder_->Decode(reinterpret_cast<const char*>(data), data_size)); + + CHECK_EQ(data_pipe_->EndReadData(data_size), MOJO_RESULT_OK); + + watcher_->ArmOrNotify(); + } + + private: + static void NotifyClientDidReceiveData( + ResponseBodyLoaderClient* response_body_loader_client, + std::unique_ptr<char[]> data, + size_t data_size) { + DCHECK(IsMainThread()); + // The response_body_loader_client is held weakly, so it may be dead by the + // time this callback is called. If so, we can simply drop this chunk. + if (!response_body_loader_client) + return; + + response_body_loader_client->DidReceiveData( + base::make_span(data.get(), data_size)); + } + + static void NotifyClientDidFinishLoading( + ResponseBodyLoaderClient* response_body_loader_client, + const String& decoded_sheet_text, + std::unique_ptr<CSSDecodedDataInfo> info, + MojoResult result) { + DCHECK(IsMainThread()); + if (!response_body_loader_client) + return; + + switch (result) { + case MOJO_RESULT_CANCELLED: + response_body_loader_client->DidCancelLoadingBody(); + break; + case MOJO_RESULT_FAILED_PRECONDITION: + DCHECK(info); + DCHECK(!decoded_sheet_text.IsNull()); + response_body_loader_client->DidReceiveDecodedData(decoded_sheet_text, + std::move(info)); + response_body_loader_client->DidFinishLoadingBody(); + break; + default: + response_body_loader_client->DidFailLoadingBody(); + break; + } + } + + std::unique_ptr<mojo::SimpleWatcher> watcher_; + mojo::ScopedDataPipeConsumerHandle data_pipe_; + CrossThreadWeakPersistent<ResponseBodyLoaderClient> + response_body_loader_client_; + std::unique_ptr<TextResourceDecoder> decoder_; + scoped_refptr<base::SingleThreadTaskRunner> loader_task_runner_; + bool has_data_ = false; + + StringBuilder builder_; +}; CSSStyleSheetResource* CSSStyleSheetResource::Fetch(FetchParameters& params, ResourceFetcher* fetcher, @@ -71,7 +236,9 @@ : TextResource(resource_request, ResourceType::kCSSStyleSheet, options, - decoder_options) {} + decoder_options), + tokenizer_text_decoder_( + std::make_unique<TextResourceDecoder>(decoder_options)) {} CSSStyleSheetResource::~CSSStyleSheetResource() = default; @@ -103,6 +270,58 @@ dump->Guid(), String(WTF::Partitions::kAllocatedObjectPoolName)); } +void CSSStyleSheetResource::SetEncoding(const String& chs) { + TextResource::SetEncoding(chs); + if (tokenizer_text_decoder_) { + tokenizer_text_decoder_->SetEncoding( + WTF::TextEncoding(chs), TextResourceDecoder::kEncodingFromHTTPHeader); + } +} + +void CSSStyleSheetResource::ResponseBodyReceived( + ResponseBodyLoaderDrainableInterface& body_loader, + scoped_refptr<base::SingleThreadTaskRunner> loader_task_runner) { + if (!base::FeatureList::IsEnabled(features::kPretokenizeCSS) || + !features::kPretokenizeExternalSheets.Get() || !tokenizer_text_decoder_) { + return; + } + + ResponseBodyLoaderClient* response_body_loader_client = nullptr; + mojo::ScopedDataPipeConsumerHandle data_pipe = + body_loader.DrainAsDataPipe(&response_body_loader_client); + if (!data_pipe) + return; + + AdvanceLoadingState(LoadingState::kTokenizing); + worker_ = WTF::SequenceBound<CSSTokenizerWorker>( + worker_pool::CreateSequencedTaskRunner( + {base::TaskPriority::USER_BLOCKING}), + std::move(data_pipe), + WrapCrossThreadWeakPersistent(response_body_loader_client), + std::move(tokenizer_text_decoder_), loader_task_runner); +} + +void CSSStyleSheetResource::DidReceiveDecodedData( + const String& data, + std::unique_ptr<DecodedDataInfo> info) { + CHECK_EQ(loading_state_, LoadingState::kTokenizing); + SetDecodedSheetText(data); + if (!info) + return; + + auto* css_info = To<CSSDecodedDataInfo>(info.get()); + tokenizer_ = std::move(css_info->tokenizer_); + + // The encoding may have been autodetected when decoding the data, so make + // sure to set the final encoding here. Calling TextResource::SetEncoding is + // still a little inconsistent (e.g. EncodingSource is not set properly, the + // autodetected encoding is set while the decoder itself is not used) but this + // should be OK for now as TextResource::decoder_ is used only for Encoding() + // after this point. + // TODO: Clean this up if needed. + TextResource::SetEncoding(css_info->encoding_); +} + network::mojom::ReferrerPolicy CSSStyleSheetResource::GetReferrerPolicy() const { network::mojom::ReferrerPolicy referrer_policy = @@ -139,9 +358,32 @@ } void CSSStyleSheetResource::NotifyFinished() { + // The worker has completed decoding and tokenization so is no longer needed. + worker_.Reset(); + // Decode the data to find out the encoding and cache the decoded sheet text. - if (Data()) - SetDecodedSheetText(DecodedText()); + switch (loading_state_) { + case LoadingState::kTokenizing: + if (Data()) { + // If tokenizing has already happened the decoded sheet text will + // already be set. + DCHECK(!decoded_sheet_text_.IsNull()); + } else { + DCHECK(decoded_sheet_text_.IsNull()); + } + break; + case LoadingState::kLoading: + if (Data()) { + DCHECK(decoded_sheet_text_.IsNull()); + SetDecodedSheetText(DecodedText()); + } + break; + case LoadingState::kFinished: + NOTREACHED(); + break; + } + + AdvanceLoadingState(LoadingState::kFinished); Resource::NotifyFinished(); @@ -154,6 +396,7 @@ } void CSSStyleSheetResource::DestroyDecodedDataIfPossible() { + tokenizer_.reset(); if (!parsed_style_sheet_cache_) return; @@ -165,6 +408,12 @@ DestroyDecodedDataIfPossible(); } +void CSSStyleSheetResource::SetRevalidatingRequest( + const ResourceRequestHead& head) { + TextResource::SetRevalidatingRequest(head); + AdvanceLoadingState(LoadingState::kLoading); +} + bool CSSStyleSheetResource::CanUseSheet(const CSSParserContext* parser_context, MIMETypeCheck mime_type_check) const { if (ErrorOccurred()) @@ -264,4 +513,26 @@ SetDecodedSize(decoded_size); } +void CSSStyleSheetResource::AdvanceLoadingState(LoadingState new_state) { + switch (loading_state_) { + case LoadingState::kLoading: + CHECK(new_state == LoadingState::kTokenizing || + new_state == LoadingState::kFinished); + break; + case LoadingState::kTokenizing: + CHECK(new_state == LoadingState::kFinished); + break; + case LoadingState::kFinished: + CHECK(new_state == LoadingState::kLoading && IsCacheValidator()); + break; + } + + loading_state_ = new_state; + + // If we're done loading, either no data was received or the decoded text + // should be set. + if (loading_state_ == LoadingState::kFinished) + DCHECK(!Data() || !decoded_sheet_text_.IsNull()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h index 2f4b8ce..f6ae138 100644 --- a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h +++ b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h
@@ -27,9 +27,11 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_CSS_STYLE_SHEET_RESOURCE_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/css/parser/css_tokenizer.h" #include "third_party/blink/renderer/core/loader/resource/text_resource.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/loader/fetch/text_resource_decoder_options.h" +#include "third_party/blink/renderer/platform/wtf/sequence_bound.h" #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h" namespace blink { @@ -58,6 +60,12 @@ void Trace(Visitor*) const override; void OnMemoryDump(WebMemoryDumpLevelOfDetail, WebProcessMemoryDump*) const override; + void SetEncoding(const String& chs) override; + void ResponseBodyReceived( + ResponseBodyLoaderDrainableInterface& body_loader, + scoped_refptr<base::SingleThreadTaskRunner> loader_task_runner) override; + void DidReceiveDecodedData(const String& data, + std::unique_ptr<DecodedDataInfo> info) override; const String SheetText(const CSSParserContext*, MIMETypeCheck = MIMETypeCheck::kStrict) const; @@ -65,6 +73,14 @@ void SaveParsedStyleSheet(StyleSheetContents*); network::mojom::ReferrerPolicy GetReferrerPolicy() const; + std::unique_ptr<CachedCSSTokenizer> TakeTokenizer() const { + return std::move(tokenizer_); + } + + void SetTokenizerForTesting(std::unique_ptr<CachedCSSTokenizer> tokenizer) { + tokenizer_ = std::move(tokenizer); + } + private: class CSSStyleSheetResourceFactory : public ResourceFactory { public: @@ -89,13 +105,30 @@ void DestroyDecodedDataIfPossible() override; void DestroyDecodedDataForFailedRevalidation() override; + void SetRevalidatingRequest(const ResourceRequestHead& head) override; void UpdateDecodedSize(); + // Valid loading state transitions: + // + // kLoading => kTokenizing, kFinished + // kTokenizing => kFinished + // kFinished => kLoading (for revalidation) + enum class LoadingState { kLoading, kTokenizing, kFinished }; + + void AdvanceLoadingState(LoadingState new_state); + + LoadingState loading_state_ = LoadingState::kLoading; + // Decoded sheet text cache is available iff loading this CSS resource is // successfully complete. String decoded_sheet_text_; Member<StyleSheetContents> parsed_style_sheet_cache_; + + class CSSTokenizerWorker; + WTF::SequenceBound<CSSTokenizerWorker> worker_; + std::unique_ptr<TextResourceDecoder> tokenizer_text_decoder_; + mutable std::unique_ptr<CachedCSSTokenizer> tokenizer_; }; template <>
diff --git a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc index 51d3e3ce..344aeb9 100644 --- a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc +++ b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc
@@ -5,9 +5,11 @@ #include "third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h" #include "base/memory/scoped_refptr.h" +#include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" +#include "third_party/blink/public/platform/web_back_forward_cache_loader_helper.h" #include "third_party/blink/public/platform/web_url_response.h" #include "third_party/blink/renderer/core/css/css_crossfade_value.h" #include "third_party/blink/renderer/core/css/css_image_value.h" @@ -28,8 +30,14 @@ #include "third_party/blink/renderer/platform/loader/fetch/fetch_context.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource_client.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource_loader.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" +#include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h" +#include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" +#include "third_party/blink/renderer/platform/testing/mock_context_lifecycle_notifier.h" +#include "third_party/blink/renderer/platform/testing/noop_web_url_loader.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/testing/url_test_helpers.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" @@ -42,6 +50,55 @@ namespace { +class NoopLoaderFactory final : public ResourceFetcher::LoaderFactory { + std::unique_ptr<WebURLLoader> CreateURLLoader( + const ResourceRequest& request, + const ResourceLoaderOptions& options, + scoped_refptr<base::SingleThreadTaskRunner> freezable_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> unfreezable_task_runner, + WebBackForwardCacheLoaderHelper back_forward_cache_loader_helper) + override { + return std::make_unique<NoopWebURLLoader>(std::move(freezable_task_runner)); + } + std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override { + return std::make_unique<CodeCacheLoaderMock>(); + } +}; + +ResourceFetcher* CreateFetcher() { + auto* properties = MakeGarbageCollected<TestResourceFetcherProperties>(); + return MakeGarbageCollected<ResourceFetcher>(ResourceFetcherInit( + properties->MakeDetachable(), MakeGarbageCollected<MockFetchContext>(), + base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), + MakeGarbageCollected<NoopLoaderFactory>(), + MakeGarbageCollected<MockContextLifecycleNotifier>(), + nullptr /* back_forward_cache_loader_helper */)); +} + +// ResourceClient which can wait for the resource load to finish. +class TestResourceClient : public GarbageCollected<TestResourceClient>, + public ResourceClient { + public: + void NotifyFinished(Resource* resource) override { + has_finished_ = true; + if (run_loop_) + run_loop_->Quit(); + } + String DebugName() const override { return "TestResourceClient"; } + + void WaitForFinish() { + if (has_finished_) + return; + + run_loop_ = std::make_unique<base::RunLoop>(); + run_loop_->Run(); + } + + protected: + std::unique_ptr<base::RunLoop> run_loop_; + bool has_finished_ = false; +}; + class CSSStyleSheetResourceTest : public PageTestBase { protected: CSSStyleSheetResourceTest() { @@ -178,5 +235,77 @@ EXPECT_FALSE(parsed_stylesheet->HasRuleSet()); } +TEST_F(CSSStyleSheetResourceTest, TokenizerCreated) { + base::test::ScopedFeatureList feature_list(features::kPretokenizeCSS); + auto* fetcher = CreateFetcher(); + + KURL url("https://www.example.com/"); + ResourceRequest request(url); + request.SetRequestContext(mojom::blink::RequestContextType::FETCH); + + auto* client = MakeGarbageCollected<TestResourceClient>(); + auto params = FetchParameters::CreateForTest(std::move(request)); + auto* resource = CSSStyleSheetResource::Fetch(params, fetcher, client); + + mojo::ScopedDataPipeProducerHandle producer; + mojo::ScopedDataPipeConsumerHandle consumer; + ASSERT_EQ(mojo::CreateDataPipe(100, producer, consumer), MOJO_RESULT_OK); + + ResourceResponse response(url); + response.SetHttpStatusCode(200); + + ResourceLoader* loader = resource->Loader(); + loader->DidReceiveResponse(WrappedResourceResponse(response)); + loader->DidStartLoadingResponseBody(std::move(consumer)); + loader->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + + // Send the body in two chunks to make sure this is handled correctly. + uint32_t num_bytes = 4; + MojoResult result = + producer->WriteData(".foo", &num_bytes, MOJO_WRITE_DATA_FLAG_NONE); + ASSERT_EQ(result, MOJO_RESULT_OK); + ASSERT_EQ(num_bytes, 4u); + + num_bytes = 5; + result = producer->WriteData("{a:b}", &num_bytes, MOJO_WRITE_DATA_FLAG_NONE); + ASSERT_EQ(result, MOJO_RESULT_OK); + ASSERT_EQ(num_bytes, 5u); + + producer.reset(); + client->WaitForFinish(); + + // A non-empty tokenizer should be created, and the sheet text will contain + // the full response body. + auto tokenizer = resource->TakeTokenizer(); + EXPECT_NE(tokenizer, nullptr); + + // Finish tokenizing and grab the token count. + while (tokenizer->TokenizeSingle().GetType() != kEOFToken) { + } + EXPECT_GT(tokenizer->TokenCount(), 1u); + + EXPECT_EQ( + resource->SheetText(nullptr, CSSStyleSheetResource::MIMETypeCheck::kLax), + ".foo{a:b}"); +} + +TEST_F(CSSStyleSheetResourceTest, TokenizerUsed) { + CSSStyleSheetResource* resource = CreateAndSaveTestStyleSheetResource(); + constexpr char kData[] = ".foo{}"; + resource->AppendData(kData, strlen(kData)); + + auto* parser_context = MakeGarbageCollected<CSSParserContext>( + kHTMLStandardMode, SecureContextMode::kInsecureContext); + auto* contents = MakeGarbageCollected<StyleSheetContents>(parser_context); + + resource->SetTokenizerForTesting( + CSSTokenizer::CreateCachedTokenizer(".foo{} .bar{}")); + contents->ParseAuthorStyleSheet(resource); + + // If the cached tokenizer is used, the resulting sheet should have 2 rules + // (.foo and .bar). + EXPECT_EQ(contents->RuleCount(), 2u); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/resource/script_resource.cc b/third_party/blink/renderer/core/loader/resource/script_resource.cc index 35c90a7..697201fe 100644 --- a/third_party/blink/renderer/core/loader/resource/script_resource.cc +++ b/third_party/blink/renderer/core/loader/resource/script_resource.cc
@@ -423,12 +423,16 @@ void ScriptResource::DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) { + std::unique_ptr<DecodedDataInfo> info) { // Web snapshots use RawSourceText(), and don't need the decoded data. if (IsWebSnapshot()) return; - source_text_ = ParkableString(data.Impl(), std::move(digest)); + if (!info) + return; + + source_text_ = ParkableString( + data.Impl(), std::move(To<ScriptDecodedDataInfo>(info.get())->digest_)); SetDecodedSize(source_text_.CharactersSizeInBytes()); }
diff --git a/third_party/blink/renderer/core/loader/resource/script_resource.h b/third_party/blink/renderer/core/loader/resource/script_resource.h index 0786e02..bb3b86c 100644 --- a/third_party/blink/renderer/core/loader/resource/script_resource.h +++ b/third_party/blink/renderer/core/loader/resource/script_resource.h
@@ -87,9 +87,19 @@ void ResponseBodyReceived( ResponseBodyLoaderDrainableInterface& body_loader, scoped_refptr<base::SingleThreadTaskRunner> loader_task_runner) override; - void DidReceiveDecodedData( - const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) override; + + class ScriptDecodedDataInfo final : public DecodedDataInfo { + public: + explicit ScriptDecodedDataInfo( + std::unique_ptr<ParkableStringImpl::SecureDigest> digest) + : digest_(std::move(digest)) {} + + ResourceType GetType() const override { return ResourceType::kScript; } + + std::unique_ptr<ParkableStringImpl::SecureDigest> digest_; + }; + void DidReceiveDecodedData(const String& data, + std::unique_ptr<DecodedDataInfo> info) override; void Trace(Visitor*) const override; @@ -259,6 +269,13 @@ } }; +template <> +struct DowncastTraits<ScriptResource::ScriptDecodedDataInfo> { + static bool AllowFrom(const Resource::DecodedDataInfo& info) { + return info.GetType() == ResourceType::kScript; + } +}; + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_SCRIPT_RESOURCE_H_
diff --git a/third_party/blink/renderer/core/paint/box_border_painter.cc b/third_party/blink/renderer/core/paint/box_border_painter.cc index 4282dd7..916128b2 100644 --- a/third_party/blink/renderer/core/paint/box_border_painter.cc +++ b/third_party/blink/renderer/core/paint/box_border_painter.cc
@@ -793,7 +793,8 @@ // When painting outlines, we ignore outer/inner radii. const auto force_rectangular = !outer_.IsRounded() && !inner_.IsRounded(); - AutoDarkMode auto_dark_mode(BorderPaintAutoDarkMode(style_, color)); + AutoDarkMode auto_dark_mode( + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kBackground)); // outer stripe const LayoutRectOutsets outer_third_outsets = @@ -825,18 +826,20 @@ FirstEdge().BorderStyle() != EBorderStyle::kDouble) return false; - AutoDarkMode auto_dark_mode( - BorderPaintAutoDarkMode(style_, FirstEdge().color)); if (visible_edge_set_ == kAllBorderEdges) { if (FirstEdge().BorderStyle() == EBorderStyle::kSolid) { if (is_uniform_width_ && !outer_.IsRounded()) { // 4-side, solid, uniform-width, rectangular border => one drawRect() - DrawSolidBorderRect(context_, outer_.Rect(), FirstEdge().Width(), - FirstEdge().color, auto_dark_mode); + DrawSolidBorderRect( + context_, outer_.Rect(), FirstEdge().Width(), FirstEdge().color, + PaintAutoDarkMode(style_, + DarkModeFilter::ElementRole::kBackground)); } else { // 4-side, solid border => one drawDRRect() - DrawBleedAdjustedDRRect(context_, bleed_avoidance_, outer_, inner_, - FirstEdge().color, auto_dark_mode); + DrawBleedAdjustedDRRect( + context_, bleed_avoidance_, outer_, inner_, FirstEdge().color, + PaintAutoDarkMode(style_, + DarkModeFilter::ElementRole::kBackground)); } } else { // 4-side, double border => 2x drawDRRect() @@ -864,7 +867,9 @@ } context_.SetFillColor(FirstEdge().color); - context_.FillPath(path, auto_dark_mode); + context_.FillPath( + path, + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kBackground)); return true; } @@ -1276,7 +1281,8 @@ side_rect.bottom(), side, color, edge_to_render.BorderStyle(), miter1 != kNoMiter ? floorf(adjacent_edge1.Width()) : 0, miter2 != kNoMiter ? floorf(adjacent_edge2.Width()) : 0, - /*antialias*/ true, BorderPaintAutoDarkMode(style_, color)); + /*antialias*/ true, + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kBackground)); } } @@ -1328,8 +1334,9 @@ context_.SetStrokeStyle(kNoStroke); context_.SetFillColor(color); - context_.DrawRect(gfx::ToRoundedRect(outer_.Rect()), - BorderPaintAutoDarkMode(style_, color)); + context_.DrawRect( + gfx::ToRoundedRect(outer_.Rect()), + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kBackground)); } void BoxBorderPainter::DrawDashedDottedBoxSideFromPath( @@ -1364,8 +1371,10 @@ // TODO(schenney): stroking the border path causes issues with tight corners: // https://bugs.chromium.org/p/chromium/issues/detail?id=344234 - context_.StrokePath(centerline_path, BorderPaintAutoDarkMode(style_, color), - centerline_path.length(), border_thickness); + context_.StrokePath( + centerline_path, + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kBackground), + centerline_path.length(), border_thickness); } void BoxBorderPainter::DrawWideDottedBoxSideFromPath( @@ -1377,9 +1386,10 @@ // TODO(schenney): stroking the border path causes issues with tight corners: // https://bugs.webkit.org/show_bug.cgi?id=58711 - context_.StrokePath(border_path, - BorderPaintAutoDarkMode(style_, context_.StrokeColor()), - border_path.length(), border_thickness); + context_.StrokePath( + border_path, + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kBackground), + border_path.length(), border_thickness); } void BoxBorderPainter::DrawDoubleBoxSideFromPath(
diff --git a/third_party/blink/renderer/core/paint/collapsed_border_painter.cc b/third_party/blink/renderer/core/paint/collapsed_border_painter.cc index ee3d51a5..3de6cad 100644 --- a/third_party/blink/renderer/core/paint/collapsed_border_painter.cc +++ b/third_party/blink/renderer/core/paint/collapsed_border_painter.cc
@@ -357,6 +357,9 @@ TableCellPainter(cell_).PaintRectNotIncludingVisualOverflow( paint_state.PaintOffset())); + AutoDarkMode auto_dark_mode(PaintAutoDarkMode( + cell_.StyleRef(), DarkModeFilter::ElementRole::kBackground)); + // We never paint diagonals at the joins. We simply let the border with the // highest precedence paint on top of borders with lower precedence. if (before_.value) { @@ -366,8 +369,7 @@ before_.outer_width + before_.inner_width); BoxBorderPainter::DrawBoxSide( context, edge_rect, BoxSide::kTop, before_.value->GetColor(), - CollapsedBorderStyle(before_.value->Style()), - BorderPaintAutoDarkMode(cell_.StyleRef(), before_.value->GetColor())); + CollapsedBorderStyle(before_.value->Style()), auto_dark_mode); } if (after_.value) { gfx::Rect edge_rect(rect.x() - after_.begin_outset, @@ -376,8 +378,7 @@ after_.inner_width + after_.outer_width); BoxBorderPainter::DrawBoxSide( context, edge_rect, BoxSide::kBottom, after_.value->GetColor(), - CollapsedBorderStyle(after_.value->Style()), - BorderPaintAutoDarkMode(cell_.StyleRef(), after_.value->GetColor())); + CollapsedBorderStyle(after_.value->Style()), auto_dark_mode); } if (start_.value) { gfx::Rect edge_rect( @@ -386,8 +387,7 @@ rect.height() + start_.begin_outset + start_.end_outset); BoxBorderPainter::DrawBoxSide( context, edge_rect, BoxSide::kLeft, start_.value->GetColor(), - CollapsedBorderStyle(start_.value->Style()), - BorderPaintAutoDarkMode(cell_.StyleRef(), start_.value->GetColor())); + CollapsedBorderStyle(start_.value->Style()), auto_dark_mode); } if (end_.value) { gfx::Rect edge_rect(rect.right() - end_.inner_width, @@ -396,8 +396,7 @@ rect.height() + end_.begin_outset + end_.end_outset); BoxBorderPainter::DrawBoxSide( context, edge_rect, BoxSide::kRight, end_.value->GetColor(), - CollapsedBorderStyle(end_.value->Style()), - BorderPaintAutoDarkMode(cell_.StyleRef(), end_.value->GetColor())); + CollapsedBorderStyle(end_.value->Style()), auto_dark_mode); } }
diff --git a/third_party/blink/renderer/core/paint/frame_set_painter.cc b/third_party/blink/renderer/core/paint/frame_set_painter.cc index b800d87f..1c9a229b 100644 --- a/third_party/blink/renderer/core/paint/frame_set_painter.cc +++ b/third_party/blink/renderer/core/paint/frame_set_painter.cc
@@ -35,30 +35,28 @@ // FIXME: We should do something clever when borders from distinct framesets // meet at a join. + AutoDarkMode auto_dark_mode(PaintAutoDarkMode( + layout_frame_set_.StyleRef(), DarkModeFilter::ElementRole::kBackground)); + // Fill first. GraphicsContext& context = paint_info.context; - Color border_color = + context.FillRect( + border_rect, layout_frame_set_.FrameSet()->HasBorderColor() ? layout_frame_set_.ResolveColor(GetCSSPropertyBorderLeftColor()) - : BorderFillColor(); - context.FillRect( - border_rect, border_color, - BorderPaintAutoDarkMode(layout_frame_set_.StyleRef(), border_color)); + : BorderFillColor(), + auto_dark_mode); // Now stroke the edges but only if we have enough room to paint both edges // with a little bit of the fill color showing through. if (border_rect.width() >= 3) { context.FillRect( gfx::Rect(border_rect.origin(), gfx::Size(1, border_rect.height())), - BorderStartEdgeColor(), - BorderPaintAutoDarkMode(layout_frame_set_.StyleRef(), - BorderStartEdgeColor())); + BorderStartEdgeColor(), auto_dark_mode); context.FillRect( gfx::Rect(gfx::Point(border_rect.right() - 1, border_rect.y()), gfx::Size(1, border_rect.height())), - BorderEndEdgeColor(), - BorderPaintAutoDarkMode(layout_frame_set_.StyleRef(), - BorderEndEdgeColor())); + BorderEndEdgeColor(), auto_dark_mode); } } @@ -67,30 +65,28 @@ // FIXME: We should do something clever when borders from distinct framesets // meet at a join. + AutoDarkMode auto_dark_mode(PaintAutoDarkMode( + layout_frame_set_.StyleRef(), DarkModeFilter::ElementRole::kBackground)); + // Fill first. GraphicsContext& context = paint_info.context; - Color border_color = + context.FillRect( + border_rect, layout_frame_set_.FrameSet()->HasBorderColor() ? layout_frame_set_.ResolveColor(GetCSSPropertyBorderLeftColor()) - : BorderFillColor(); - context.FillRect( - border_rect, border_color, - BorderPaintAutoDarkMode(layout_frame_set_.StyleRef(), border_color)); + : BorderFillColor(), + auto_dark_mode); // Now stroke the edges but only if we have enough room to paint both edges // with a little bit of the fill color showing through. if (border_rect.height() >= 3) { context.FillRect( gfx::Rect(border_rect.origin(), gfx::Size(border_rect.width(), 1)), - BorderStartEdgeColor(), - BorderPaintAutoDarkMode(layout_frame_set_.StyleRef(), - BorderStartEdgeColor())); + BorderStartEdgeColor(), auto_dark_mode); context.FillRect( gfx::Rect(gfx::Point(border_rect.x(), border_rect.bottom() - 1), gfx::Size(border_rect.width(), 1)), - BorderEndEdgeColor(), - BorderPaintAutoDarkMode(layout_frame_set_.StyleRef(), - BorderEndEdgeColor())); + BorderEndEdgeColor(), auto_dark_mode); } }
diff --git a/third_party/blink/renderer/core/paint/multi_column_set_painter.cc b/third_party/blink/renderer/core/paint/multi_column_set_painter.cc index 0477e01..b32609c 100644 --- a/third_party/blink/renderer/core/paint/multi_column_set_painter.cc +++ b/third_party/blink/renderer/core/paint/multi_column_set_painter.cc
@@ -67,7 +67,9 @@ gfx::Rect pixel_snapped_rule_rect = ToPixelSnappedRect(bound); BoxBorderPainter::DrawBoxSide( paint_info.context, pixel_snapped_rule_rect, box_side, rule_color, - rule_style, BorderPaintAutoDarkMode(block_style, rule_color)); + rule_style, + PaintAutoDarkMode(block_style, + DarkModeFilter::ElementRole::kBackground)); } }
diff --git a/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc index 78fbd3ae..0e4f277 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc
@@ -82,8 +82,8 @@ layout_data->has_border_color ? style.VisitedDependentColor(GetCSSPropertyBorderLeftColor()) : kBorderFillColor; - auto auto_dark_mode = BorderPaintAutoDarkMode(style, border_fill_color); - + auto auto_dark_mode = + PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground); size_t children_count = box_fragment_.Children().size(); const Vector<LayoutUnit>& row_sizes = layout_data->row_sizes; const Vector<LayoutUnit>& col_sizes = layout_data->col_sizes; @@ -125,15 +125,12 @@ // with a little bit of the fill color showing through. if (border_rect.height() < 3) return; - const ComputedStyle& style = box_fragment_.Style(); context.FillRect( gfx::Rect(border_rect.origin(), gfx::Size(border_rect.width(), 1)), - kBorderStartEdgeColor, - BorderPaintAutoDarkMode(style, kBorderStartEdgeColor)); + kBorderStartEdgeColor, auto_dark_mode); context.FillRect(gfx::Rect(border_rect.x(), border_rect.bottom() - 1, border_rect.width(), 1), - kBorderEndEdgeColor, - BorderPaintAutoDarkMode(style, kBorderEndEdgeColor)); + kBorderEndEdgeColor, auto_dark_mode); } void NGFrameSetPainter::PaintColumnBorder(const PaintInfo& paint_info, @@ -151,15 +148,12 @@ // with a little bit of the fill color showing through. if (border_rect.width() < 3) return; - const ComputedStyle& style = box_fragment_.Style(); context.FillRect( gfx::Rect(border_rect.origin(), gfx::Size(1, border_rect.height())), - kBorderStartEdgeColor, - BorderPaintAutoDarkMode(style, kBorderStartEdgeColor)); + kBorderStartEdgeColor, auto_dark_mode); context.FillRect(gfx::Rect(border_rect.right() - 1, border_rect.y(), 1, border_rect.height()), - kBorderEndEdgeColor, - BorderPaintAutoDarkMode(style, kBorderEndEdgeColor)); + kBorderEndEdgeColor, auto_dark_mode); } } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc b/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc index 868b538..cb2b424 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc
@@ -528,6 +528,8 @@ return; DrawingRecorder recorder(paint_info.context, layout_table, paint_info.phase, visual_rect); + AutoDarkMode auto_dark_mode(PaintAutoDarkMode( + fragment_.Style(), DarkModeFilter::ElementRole::kBackground)); const wtf_size_t edges_per_row = collapsed_borders->EdgesPerRow(); const wtf_size_t total_row_count = @@ -719,8 +721,7 @@ } BoxBorderPainter::DrawBoxSide( paint_info.context, ToPixelSnappedRect(physical_border_rect), - box_side, edge.BorderColor(), edge.BorderStyle(), - BorderPaintAutoDarkMode(fragment_.Style(), edge.BorderColor())); + box_side, edge.BorderColor(), edge.BorderStyle(), auto_dark_mode); } } }
diff --git a/third_party/blink/renderer/core/paint/paint_auto_dark_mode.h b/third_party/blink/renderer/core/paint/paint_auto_dark_mode.h index 9cc8acb..9e84771c 100644 --- a/third_party/blink/renderer/core/paint/paint_auto_dark_mode.h +++ b/third_party/blink/renderer/core/paint/paint_auto_dark_mode.h
@@ -23,15 +23,6 @@ return AutoDarkMode(role, auto_dark_mode_enabled); } -inline AutoDarkMode BorderPaintAutoDarkMode(const ComputedStyle& style, - Color border_color) { - SkColor background_color = - style.VisitedDependentColor(GetCSSPropertyBackgroundColor()).Rgb(); - return PaintAutoDarkMode(style, - DarkModeFilter::DarkModeFilter::BorderElementRole( - border_color.Rgb(), background_color)); -} - class ImageClassifierHelper { public: CORE_EXPORT static ImageAutoDarkMode GetImageAutoDarkMode(
diff --git a/third_party/blink/renderer/core/scroll/build.gni b/third_party/blink/renderer/core/scroll/build.gni index 90f0de85..38a5f08 100644 --- a/third_party/blink/renderer/core/scroll/build.gni +++ b/third_party/blink/renderer/core/scroll/build.gni
@@ -57,6 +57,8 @@ blink_core_sources_scroll += [ "scrollbar_theme_aura.cc", "scrollbar_theme_aura.h", + "scrollbar_theme_fluent.cc", + "scrollbar_theme_fluent.h", ] } @@ -67,3 +69,7 @@ "scrollbar_test_suite.h", "scrollbar_theme_overlay_test.cc", ] + +if (use_aura) { + blink_core_tests_scroll += [ "scrollbar_theme_fluent_unittest.cc" ] +}
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.h b/third_party/blink/renderer/core/scroll/scrollable_area.h index abe4791..28170e6 100644 --- a/third_party/blink/renderer/core/scroll/scrollable_area.h +++ b/third_party/blink/renderer/core/scroll/scrollable_area.h
@@ -106,7 +106,7 @@ virtual ChromeClient* GetChromeClient() const { return nullptr; } // Used to scale a length in dip units into a length in layout/paint units. - float ScaleFromDIP() const; + virtual float ScaleFromDIP() const; virtual SmoothScrollSequencer* GetSmoothScrollSequencer() const { return nullptr;
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_test_suite.h b/third_party/blink/renderer/core/scroll/scrollbar_test_suite.h index d66981f..46a647418 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_test_suite.h +++ b/third_party/blink/renderer/core/scroll/scrollbar_test_suite.h
@@ -124,6 +124,11 @@ return ScrollbarTheme::GetTheme(); } + float ScaleFromDIP() const override { return scale_from_dip_; } + void SetScaleFromDIP(float scale_from_dip) { + scale_from_dip_ = scale_from_dip; + } + using ScrollableArea::ClearNeedsPaintInvalidationForScrollControls; using ScrollableArea::HorizontalScrollbarNeedsPaintInvalidation; using ScrollableArea::ShowNonMacOverlayScrollbars; @@ -143,6 +148,7 @@ ScrollOffset scroll_offset_; ScrollOffset maximum_scroll_offset_; Member<MockPlatformChromeClient> chrome_client_; + float scale_from_dip_ = 1.f; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme.h b/third_party/blink/renderer/core/scroll/scrollbar_theme.h index 2d17aead..6d8c506 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_theme.h +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme.h
@@ -260,6 +260,9 @@ static bool MockScrollbarsEnabled() { return ScrollbarThemeSettings::MockScrollbarsEnabled(); } + static bool FluentScrollbarsEnabled() { + return ScrollbarThemeSettings::FluentScrollbarsEnabled(); + } private: // Must be implemented to return the correct theme subclass.
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc index 7bebc5e..50cd140 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
@@ -37,6 +37,7 @@ #include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/renderer/core/scroll/scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scrollbar.h" +#include "third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.h" #include "third_party/blink/renderer/core/style/computed_style_base_constants.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" @@ -141,6 +142,9 @@ if (OverlayScrollbarsEnabled()) return ScrollbarThemeOverlay::GetInstance(); + if (FluentScrollbarsEnabled()) + return ScrollbarThemeFluent::GetInstance(); + DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ()); return theme; } @@ -379,7 +383,7 @@ .IsEmpty(); } -gfx::Size ScrollbarThemeAura::ButtonSize(const Scrollbar& scrollbar) { +gfx::Size ScrollbarThemeAura::ButtonSize(const Scrollbar& scrollbar) const { if (!HasScrollbarButtons(scrollbar.Orientation())) return gfx::Size(0, 0);
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.h b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.h index bce943e5..3ea3bbec 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.h +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.h
@@ -76,6 +76,7 @@ bool SupportsDragSnapBack() const override; bool ShouldSnapBackToDragOrigin(const Scrollbar&, const WebMouseEvent&) override; + virtual gfx::Size ButtonSize(const Scrollbar&) const; private: FRIEND_TEST_ALL_PREFIXES(ScrollbarThemeAuraTest, ButtonSizeHorizontal); @@ -83,7 +84,6 @@ FRIEND_TEST_ALL_PREFIXES(ScrollbarThemeAuraTest, NoButtonsReturnsSize0); virtual bool HasScrollbarButtons(ScrollbarOrientation) const; - gfx::Size ButtonSize(const Scrollbar&); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc new file mode 100644 index 0000000..8c50ceb --- /dev/null +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc
@@ -0,0 +1,85 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h" + +#include "third_party/blink/public/platform/web_theme_engine.h" +#include "third_party/blink/renderer/platform/theme/web_theme_engine_helper.h" +#include "ui/gfx/geometry/rect.h" + +namespace blink { + +ScrollbarThemeFluent& ScrollbarThemeFluent::GetInstance() { + DEFINE_STATIC_LOCAL(ScrollbarThemeFluent, theme, ()); + return theme; +} + +int ScrollbarThemeFluent::ScrollbarThickness(float scale_from_dip, + EScrollbarWidth scrollbar_width) { + // The difference between track's and thumb's thicknesses should always be + // even to have equal thumb offsets from both sides so the thumb can remain + // in the middle of the track. Add one pixel if the difference is odd. + const int scrollbar_thickness = + static_cast<int>(scrollbar_track_thickness_ * scale_from_dip); + return (scrollbar_thickness - ThumbThickness(scale_from_dip)) % 2 != 0 + ? scrollbar_thickness + 1 + : scrollbar_thickness; +} + +gfx::Rect ScrollbarThemeFluent::ThumbRect(const Scrollbar& scrollbar) { + gfx::Rect thumb_rect = ScrollbarTheme::ThumbRect(scrollbar); + const int thumb_thickness = ThumbThickness(scrollbar.ScaleFromDIP()); + if (scrollbar.Orientation() == kHorizontalScrollbar) { + thumb_rect.set_height(thumb_thickness); + } else { + thumb_rect.set_width(thumb_thickness); + } + + const gfx::Rect track_rect = TrackRect(scrollbar); + const float offset_from_viewport = + scrollbar.Orientation() == kHorizontalScrollbar + ? (track_rect.height() - thumb_thickness) / 2 + : (track_rect.width() - thumb_thickness) / 2; + + // Thumb rect position is relative to the inner edge of the scrollbar + // track. Therefore the thumb is translated to the opposite end (towards + // viewport border) of the track with the offset deducted. + if (scrollbar.Orientation() == kHorizontalScrollbar) { + thumb_rect.Offset( + 0, track_rect.height() - thumb_rect.height() - offset_from_viewport); + } else { + thumb_rect.Offset( + track_rect.width() - thumb_rect.width() - offset_from_viewport, 0); + } + + return thumb_rect; +} + +int ScrollbarThemeFluent::ThumbThickness(const float scale_from_dip) const { + return static_cast<int>(scrollbar_thumb_thickness_ * scale_from_dip); +} + +gfx::Size ScrollbarThemeFluent::ButtonSize(const Scrollbar& scrollbar) const { + // In cases when scrollbar's frame rect is too small to contain buttons and + // track, buttons should take all the available space. + if (scrollbar.Orientation() == kVerticalScrollbar) { + const int button_width = scrollbar.Width(); + const int button_height_unclamped = + scrollbar_button_length_ * scrollbar.ScaleFromDIP(); + const int button_height = scrollbar.Height() < 2 * button_height_unclamped + ? scrollbar.Height() / 2 + : button_height_unclamped; + return gfx::Size(button_width, button_height); + } else { + const int button_height = scrollbar.Height(); + const int button_width_unclamped = + scrollbar_button_length_ * scrollbar.ScaleFromDIP(); + const int button_width = scrollbar.Width() < 2 * button_width_unclamped + ? scrollbar.Width() / 2 + : button_width_unclamped; + return gfx::Size(button_width, button_height); + } +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h new file mode 100644 index 0000000..c882437 --- /dev/null +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h
@@ -0,0 +1,47 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLLBAR_THEME_FLUENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLLBAR_THEME_FLUENT_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" +#include "third_party/blink/renderer/core/scroll/scrollbar_theme_aura.h" + +namespace blink { + +// The scrollbar theme is only used for Fluent Scrollbars on Windows. +// Please see the visual spec and the design document for more details: +// https://docs.google.com/document/d/1EpJnWAcPCxBQo6zPGR1Tg1NACiIJ-6dk7cYyK1DhBWw +class CORE_EXPORT ScrollbarThemeFluent : public ScrollbarThemeAura { + public: + ScrollbarThemeFluent(const ScrollbarThemeFluent&) = delete; + ScrollbarThemeFluent& operator=(const ScrollbarThemeFluent&) = delete; + + static ScrollbarThemeFluent& GetInstance(); + ~ScrollbarThemeFluent() override = default; + + int ScrollbarThickness(float scale_from_dip, + EScrollbarWidth scrollbar_width) override; + + protected: + ScrollbarThemeFluent() = default; + + gfx::Rect ThumbRect(const Scrollbar&) override; + gfx::Size ButtonSize(const Scrollbar&) const override; + + private: + int ThumbThickness(const float scale_from_dip) const; + + // TODO(crbug.com/1353042): Remove hardcoded values. Get dimensions from + // ui/native_theme via WebThemeEngine. + // Button height for vertical scrollbar and width for horizontal. + int scrollbar_button_length_ = 18; + int scrollbar_thumb_thickness_ = 6; + int scrollbar_track_thickness_ = 14; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLLBAR_THEME_FLUENT_H_
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent_unittest.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent_unittest.cc new file mode 100644 index 0000000..3333d47 --- /dev/null +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent_unittest.cc
@@ -0,0 +1,131 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/scroll/scroll_types.h" +#include "third_party/blink/renderer/core/scroll/scrollbar.h" +#include "third_party/blink/renderer/core/scroll/scrollbar_test_suite.h" +#include "ui/gfx/geometry/rect.h" + +namespace blink { + +using ::testing::NiceMock; + +namespace { + +// Fluent scrollbar parts' dimensions. +constexpr int kScrollbarButtonLength = 18; +constexpr int kScrollbarThumbOffset = 4; +constexpr int kScrollbarThumbThickness = 6; +constexpr int kScrollbarTrackThickness = 14; + +// Const values for unit tests. +constexpr int kThumbLengthForTests = 30; +constexpr int kScrollbarLengthForTests = 200; +constexpr int kOffsetFromViewport = 100; + +} // namespace + +class ScrollbarThemeFluentMock final : public ScrollbarThemeFluent { + public: + int ThumbLength(const Scrollbar& scrollbar) override { + return kThumbLengthForTests; + } + + protected: + FRIEND_TEST_ALL_PREFIXES(ScrollbarThemeFluentTest, + VerticalScrollbarPartsSizes); + FRIEND_TEST_ALL_PREFIXES(ScrollbarThemeFluentTest, + HorizontalScrollbarPartsSizes); +}; + +class ScrollbarThemeFluentTest : public ::testing::Test, + public ::testing::WithParamInterface<float> { + protected: + void SetUp() override { + ScrollbarThemeSettings::SetFluentScrollbarsEnabled(true); + mock_scrollable_area_ = + MakeGarbageCollected<NiceMock<MockScrollableArea>>(); + mock_scrollable_area_->SetScaleFromDIP(GetParam()); + } + + int ButtonLength() const { + return static_cast<int>(kScrollbarButtonLength * ScaleFromDIP()); + } + + int TrackLength() const { + return kScrollbarLengthForTests - 2 * ButtonLength(); + } + + int TrackThickness() const { + return static_cast<int>(kScrollbarTrackThickness * ScaleFromDIP()); + } + + int ThumbThickness() const { + return static_cast<int>(kScrollbarThumbThickness * ScaleFromDIP()); + } + + int ThumbOffset() const { + return static_cast<int>(kScrollbarThumbOffset * ScaleFromDIP()); + } + + float ScaleFromDIP() const { return GetParam(); } + + Persistent<NiceMock<MockScrollableArea>> mock_scrollable_area_; +}; + +TEST_P(ScrollbarThemeFluentTest, VerticalScrollbarPartsSizes) { + ScrollbarThemeFluentMock theme; + Scrollbar* vetical_scrollbar = Scrollbar::CreateForTesting( + mock_scrollable_area_, kVerticalScrollbar, &theme); + vetical_scrollbar->SetFrameRect(gfx::Rect( + kOffsetFromViewport, 0, + theme.ScrollbarThickness(ScaleFromDIP(), EScrollbarWidth::kAuto), + kScrollbarLengthForTests)); + + EXPECT_EQ(ThumbThickness() + 2 * ThumbOffset(), TrackThickness()); + + const gfx::Rect track_rect = theme.TrackRect(*vetical_scrollbar); + EXPECT_EQ(track_rect, gfx::Rect(kOffsetFromViewport, ButtonLength(), + TrackThickness(), TrackLength())); + + const gfx::Rect thumb_rect = theme.ThumbRect(*vetical_scrollbar); + EXPECT_EQ(thumb_rect, + gfx::Rect(kOffsetFromViewport + ThumbOffset(), ButtonLength(), + ThumbThickness(), kThumbLengthForTests)); + + const gfx::Size button_size = theme.ButtonSize(*vetical_scrollbar); + EXPECT_EQ(button_size, gfx::Size(TrackThickness(), ButtonLength())); +} + +TEST_P(ScrollbarThemeFluentTest, HorizontalScrollbarPartsSizes) { + ScrollbarThemeFluentMock theme; + Scrollbar* horizontal_scrollbar = Scrollbar::CreateForTesting( + mock_scrollable_area_, kHorizontalScrollbar, &theme); + horizontal_scrollbar->SetFrameRect(gfx::Rect( + 0, kOffsetFromViewport, kScrollbarLengthForTests, + theme.ScrollbarThickness(ScaleFromDIP(), EScrollbarWidth::kAuto))); + + EXPECT_EQ(ThumbThickness() + 2 * ThumbOffset(), TrackThickness()); + + const gfx::Rect track_rect = theme.TrackRect(*horizontal_scrollbar); + EXPECT_EQ(track_rect, gfx::Rect(ButtonLength(), kOffsetFromViewport, + TrackLength(), TrackThickness())); + + const gfx::Rect thumb_rect = theme.ThumbRect(*horizontal_scrollbar); + EXPECT_EQ(thumb_rect, + gfx::Rect(ButtonLength(), kOffsetFromViewport + ThumbOffset(), + kThumbLengthForTests, ThumbThickness())); + + const gfx::Size button_size = theme.ButtonSize(*horizontal_scrollbar); + EXPECT_EQ(button_size, gfx::Size(ButtonLength(), TrackThickness())); +} + +INSTANTIATE_TEST_SUITE_P(All, + ScrollbarThemeFluentTest, + ::testing::Values(1.f, 1.25f, 1.5f, 1.75f, 2.f)); + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc index ff99129..bb7b658 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -98,10 +98,6 @@ constexpr char kCryptotokenOrigin[] = "chrome-extension://kmendfapggjehodndflmmgagdbamhnfd"; -// Maximum number of unique origins in ancestor chain (including the source -// frame origin) for which FedCM API is enabled. -const int kMaxUniqueOriginInAncestorChainForFedCM = 2; - // RequiredOriginType enumerates the requirements on the environment to perform // an operation. enum class RequiredOriginType { @@ -174,11 +170,6 @@ frame, kMaxUniqueOriginInAncestorChainForWebOTP); } -bool IsAncestorChainValidForFedCM(const Frame* frame) { - return AreUniqueOriginsLessOrEqualTo(frame, - kMaxUniqueOriginInAncestorChainForFedCM); -} - bool CheckSecurityRequirementsBeforeRequest( ScriptPromiseResolver* resolver, RequiredOriginType required_origin_type) { @@ -268,12 +259,6 @@ "document.")); return false; } - if (!IsAncestorChainValidForFedCM(resolver->DomWindow()->GetFrame())) { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNotAllowedError, - "More than two unique origins are detected in the origin chain.")); - return false; - } break; case RequiredOriginType::kSecureWithPaymentPermissionPolicy: @@ -329,10 +314,8 @@ break; case RequiredOriginType::kSecureAndPermittedByFederatedPermissionsPolicy: - SECURITY_CHECK( - resolver->GetExecutionContext()->IsFeatureEnabled( - mojom::blink::PermissionsPolicyFeature::kFederatedCredentials) && - IsAncestorChainValidForFedCM(resolver->DomWindow()->GetFrame())); + SECURITY_CHECK(resolver->GetExecutionContext()->IsFeatureEnabled( + mojom::blink::PermissionsPolicyFeature::kFederatedCredentials)); break; case RequiredOriginType::kSecureWithPaymentPermissionPolicy:
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc index 946994d..18864e0 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
@@ -702,6 +702,14 @@ CopyBooleanOrDoubleConstraint(constraints_in->zoom(), naked_treatment, constraint_buffer.zoom); } + if (constraints_in->hasDisplaySurface()) { + if (!ValidateAndCopyStringConstraint( + constraints_in->displaySurface(), naked_treatment, + constraint_buffer.display_surface, error_state)) { + DCHECK(error_state.HadException()); + return false; + } + } return true; }
diff --git a/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl b/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl index 58b1005..b0a57f3 100644 --- a/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl +++ b/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl
@@ -49,6 +49,8 @@ ConstrainBoolean torch; // W3C Media Capture Extensions [RuntimeEnabled=MediaCaptureBackgroundBlur] ConstrainBoolean backgroundBlur; + // https://github.com/w3c/mediacapture-screen-share/pull/216/files + [RuntimeEnabled=DisplaySurfaceConstraint] ConstrainDOMString displaySurface; // The "mandatory" and "_optional" members are retained for conformance // with https://www.w3.org/TR/2013/WD-mediacapture-streams-20130903/ object mandatory;
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc index 7373388..53a45fb 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -845,6 +845,9 @@ stream_controls->exclude_self_browser_surface = request->exclude_self_browser_surface(); + stream_controls->preferred_display_surface = + request->preferred_display_surface(); + if (blink::IsDeviceMediaType(video_controls.stream_type)) { GetMediaDevicesDispatcher()->GetVideoInputCapabilities( WTF::Bind(&UserMediaProcessor::SelectVideoDeviceSettings,
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc index 0f01d9f..b44a2cf 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -321,6 +321,8 @@ if (error_state.HadException()) return nullptr; + std::string display_surface_constraint; + if (media_type == UserMediaRequestType::kUserMedia && !video.IsNull()) { if (video.Basic().pan.HasMandatory()) { error_state.ThrowTypeError("Mandatory pan constraint is not supported"); @@ -388,6 +390,11 @@ if (error_state.HadException()) return nullptr; } + if (video.Basic().display_surface.HasIdeal() && + video.Basic().display_surface.Ideal().size() > 0) { + display_surface_constraint = + video.Basic().display_surface.Ideal()[0].Utf8(); + } } if (audio.IsNull() && video.IsNull()) { @@ -418,6 +425,17 @@ options->selfBrowserSurface().AsEnum() == V8SelfCapturePreferenceEnum::Enum::kExclude); + mojom::blink::PreferredDisplaySurface preferred_display_surface = + mojom::blink::PreferredDisplaySurface::NO_PREFERENCE; + if (display_surface_constraint == "monitor") { + preferred_display_surface = mojom::blink::PreferredDisplaySurface::MONITOR; + } else if (display_surface_constraint == "window") { + preferred_display_surface = mojom::blink::PreferredDisplaySurface::WINDOW; + } else if (display_surface_constraint == "browser") { + preferred_display_surface = mojom::blink::PreferredDisplaySurface::BROWSER; + } + result->set_preferred_display_surface(preferred_display_surface); + return result; }
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.h b/third_party/blink/renderer/modules/mediastream/user_media_request.h index 9ac342a..f0a7a84 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_request.h +++ b/third_party/blink/renderer/modules/mediastream/user_media_request.h
@@ -32,6 +32,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_USER_MEDIA_REQUEST_H_ #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" +#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-blink.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/modules/mediastream/media_stream.h" @@ -156,6 +157,13 @@ bool exclude_self_browser_surface() const { return exclude_self_browser_surface_; } + void set_preferred_display_surface( + mojom::blink::PreferredDisplaySurface value) { + preferred_display_surface_ = value; + } + mojom::blink::PreferredDisplaySurface preferred_display_surface() const { + return preferred_display_surface_; + } bool auto_select_all_screens() const { return auto_select_all_screens_; } // Mark this request as an GetOpenDevice request for initializing a @@ -187,6 +195,8 @@ const bool should_prefer_current_tab_ = false; bool exclude_system_audio_ = false; bool exclude_self_browser_surface_ = false; + mojom::blink::PreferredDisplaySurface preferred_display_surface_ = + mojom::blink::PreferredDisplaySurface::NO_PREFERENCE; const bool auto_select_all_screens_ = false; bool should_disable_hardware_noise_suppression_; bool has_transient_user_activation_ = false;
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc index c1a474db..2bf1ae56 100644 --- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc +++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -353,6 +353,10 @@ ScrollbarThemeSettings::SetOverlayScrollbarsEnabled(enable); } +void WebRuntimeFeatures::EnableFluentScrollbars(bool enable) { + ScrollbarThemeSettings::SetFluentScrollbarsEnabled(enable); +} + void WebRuntimeFeatures::EnableSharedArrayBuffer(bool enable) { RuntimeEnabledFeatures::SetSharedArrayBufferEnabled(enable); }
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc index d79015a..3165d67 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc +++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -208,16 +208,6 @@ return immutable_.image_filter; } -DarkModeFilter::ElementRole DarkModeFilter::BorderElementRole( - SkColor border_color, - SkColor background_color) { - if (background_color == 0 || - DarkModeColorClassifier::CalculateColorBrightness(border_color) < - DarkModeColorClassifier::CalculateColorBrightness(background_color)) - return ElementRole::kForeground; - return ElementRole::kBackground; -} - absl::optional<cc::PaintFlags> DarkModeFilter::ApplyToFlagsIfNeeded( const cc::PaintFlags& flags, ElementRole role) {
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.h b/third_party/blink/renderer/platform/graphics/dark_mode_filter.h index 1e5cb9f..c3f7111 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.h +++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.h
@@ -34,9 +34,6 @@ enum class ElementRole { kForeground, kListSymbol, kBackground, kSVG }; enum class ImageType { kNone, kIcon, kSeparator, kPhoto }; - static ElementRole BorderElementRole(SkColor border_color, - SkColor background_color); - SkColor InvertColorIfNeeded(SkColor color, ElementRole element_role); absl::optional<cc::PaintFlags> ApplyToFlagsIfNeeded(
diff --git a/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.cc b/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.cc index 9712fb3..45be2df 100644 --- a/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.cc +++ b/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.cc
@@ -8,6 +8,7 @@ static bool g_mock_scrollbars_enabled = false; static bool g_overlay_scrollbars_enabled = false; +static bool g_fluent_scrollbars_enabled = false; void ScrollbarThemeSettings::SetMockScrollbarsEnabled(bool flag) { g_mock_scrollbars_enabled = flag; @@ -25,4 +26,12 @@ return g_overlay_scrollbars_enabled; } +void ScrollbarThemeSettings::SetFluentScrollbarsEnabled(bool flag) { + g_fluent_scrollbars_enabled = flag; +} + +bool ScrollbarThemeSettings::FluentScrollbarsEnabled() { + return g_fluent_scrollbars_enabled; +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.h b/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.h index bb492bf..1e9c87e 100644 --- a/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.h +++ b/third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.h
@@ -27,6 +27,7 @@ friend class ScopedMockOverlayScrollbars; friend class ScrollbarsTest; friend class ScrollbarTheme; + friend class ScrollbarThemeFluentTest; friend class ScrollbarThemeMacTest; friend class WebRuntimeFeatures; @@ -40,6 +41,9 @@ // device emulation on desktop, so code should use Page::GetScrollbarTheme() // instead of this function. static bool OverlayScrollbarsEnabled(); + + static void SetFluentScrollbarsEnabled(bool); + static bool FluentScrollbarsEnabled(); }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc b/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc index 83d16d2..c4f28e5 100644 --- a/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc
@@ -69,7 +69,7 @@ void DidReceiveData(base::span<const char>) override {} void DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) override {} + std::unique_ptr<Resource::DecodedDataInfo> info) override {} void DidFinishLoadingBody() override {} void DidFailLoadingBody() override {} void DidCancelLoadingBody() override {}
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.h b/third_party/blink/renderer/platform/loader/fetch/resource.h index 993e1e3..c66b5ff 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource.h
@@ -264,9 +264,18 @@ virtual void ResponseBodyReceived( ResponseBodyLoaderDrainableInterface& body_loader, scoped_refptr<base::SingleThreadTaskRunner> loader_task_runner) {} - virtual void DidReceiveDecodedData( - const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) {} + + // A class Resource subclasses can use to hold ResourceType specific info + // related to DidReceiveDecodedData(). + class DecodedDataInfo { + public: + virtual ~DecodedDataInfo() = default; + + virtual ResourceType GetType() const = 0; + }; + virtual void DidReceiveDecodedData(const String& data, + std::unique_ptr<DecodedDataInfo> info) {} + void SetResponse(const ResourceResponse&); const ResourceResponse& GetResponse() const { return response_; }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index 53a68149..a7ac280 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -609,8 +609,8 @@ void ResourceLoader::DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) { - resource_->DidReceiveDecodedData(data, std::move(digest)); + std::unique_ptr<Resource::DecodedDataInfo> info) { + resource_->DidReceiveDecodedData(data, std::move(info)); } void ResourceLoader::DidFinishLoadingBody() {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h index 0a76e066..5ea56422 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
@@ -181,7 +181,7 @@ void DidReceiveData(base::span<const char> data) override; void DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) override; + std::unique_ptr<Resource::DecodedDataInfo> info) override; void DidFinishLoadingBody() override; void DidFailLoadingBody() override; void DidCancelLoadingBody() override;
diff --git a/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc b/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc index 10a52332..e7634c8 100644 --- a/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/response_body_loader.cc
@@ -415,11 +415,11 @@ void ResponseBodyLoader::DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) { + std::unique_ptr<Resource::DecodedDataInfo> info) { if (aborted_) return; - client_->DidReceiveDecodedData(data, std::move(digest)); + client_->DidReceiveDecodedData(data, std::move(info)); } void ResponseBodyLoader::DidFinishLoadingBody() {
diff --git a/third_party/blink/renderer/platform/loader/fetch/response_body_loader.h b/third_party/blink/renderer/platform/loader/fetch/response_body_loader.h index 1accdf13..c00ffaa 100644 --- a/third_party/blink/renderer/platform/loader/fetch/response_body_loader.h +++ b/third_party/blink/renderer/platform/loader/fetch/response_body_loader.h
@@ -129,7 +129,7 @@ void DidReceiveData(base::span<const char> data) override; void DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) override; + std::unique_ptr<Resource::DecodedDataInfo> info) override; void DidFinishLoadingBody() override; void DidFailLoadingBody() override; void DidCancelLoadingBody() override;
diff --git a/third_party/blink/renderer/platform/loader/fetch/response_body_loader_client.h b/third_party/blink/renderer/platform/loader/fetch/response_body_loader_client.h index 3b6e3ed..5784cbc 100644 --- a/third_party/blink/renderer/platform/loader/fetch/response_body_loader_client.h +++ b/third_party/blink/renderer/platform/loader/fetch/response_body_loader_client.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESPONSE_BODY_LOADER_CLIENT_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESPONSE_BODY_LOADER_CLIENT_H_ -#include "third_party/blink/renderer/platform/bindings/parkable_string.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource.h" namespace blink { @@ -21,7 +21,7 @@ // be called at most once. virtual void DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) = 0; + std::unique_ptr<Resource::DecodedDataInfo> info) = 0; // Called when finishing reading the entire body. This must be the last // signal.
diff --git a/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc b/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc index 97e40394..647efac 100644 --- a/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc
@@ -78,7 +78,7 @@ } void DidReceiveDecodedData( const String& data, - std::unique_ptr<ParkableStringImpl::SecureDigest> digest) override {} + std::unique_ptr<Resource::DecodedDataInfo> info) override {} void DidFinishLoadingBody() override { DCHECK(!finished_); DCHECK(!failed_);
diff --git a/third_party/blink/renderer/platform/mediastream/media_constraints.cc b/third_party/blink/renderer/platform/mediastream/media_constraints.cc index ea77c18..f807734 100644 --- a/third_party/blink/renderer/platform/mediastream/media_constraints.cc +++ b/third_party/blink/renderer/platform/mediastream/media_constraints.cc
@@ -354,6 +354,7 @@ tilt("tilt"), zoom("zoom"), group_id("groupId"), + display_surface("displaySurface"), media_stream_source("mediaStreamSource"), render_to_associated_sink("chromeRenderToAssociatedSink"), goog_echo_cancellation("googEchoCancellation"), @@ -384,6 +385,7 @@ &channel_count, &device_id, &group_id, + &display_surface, &media_stream_source, &disable_local_echo, &pan,
diff --git a/third_party/blink/renderer/platform/mediastream/media_constraints.h b/third_party/blink/renderer/platform/mediastream/media_constraints.h index b06bb0a..b3d0196 100644 --- a/third_party/blink/renderer/platform/mediastream/media_constraints.h +++ b/third_party/blink/renderer/platform/mediastream/media_constraints.h
@@ -248,6 +248,7 @@ DoubleConstraint tilt; DoubleConstraint zoom; StringConstraint group_id; + StringConstraint display_surface; // Constraints not exposed in Blink at the moment, only through // the legacy name interface. StringConstraint media_stream_source; // tab, screen, desktop, system
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 266e173b..577437f 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -864,6 +864,15 @@ settable_from_internals: true, }, { + // When a Web application calls getDisplayMedia() and asks for video, + // allow a hint to be provided as to whether it prefers that a + // certain surface type be more prominently offered to the user. + // + // https://github.com/w3c/mediacapture-screen-share/pull/186/files + name: "DisplaySurfaceConstraint", + status: "stable", + }, + { name: "DocumentCookie", }, {
diff --git a/third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h b/third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h index 0a27c7a..9a4a426f 100644 --- a/third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h +++ b/third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h
@@ -47,6 +47,8 @@ class ScopedHandleBase; class DataPipeProducerHandle; typedef ScopedHandleBase<DataPipeProducerHandle> ScopedDataPipeProducerHandle; +class DataPipeConsumerHandle; +typedef ScopedHandleBase<DataPipeConsumerHandle> ScopedDataPipeConsumerHandle; } // namespace mojo namespace WTF { @@ -86,6 +88,13 @@ STATIC_ONLY(CrossThreadCopier); }; +template <> +struct CrossThreadCopier<mojo::ScopedDataPipeConsumerHandle> + : public CrossThreadCopierByValuePassThrough< + mojo::ScopedDataPipeConsumerHandle> { + STATIC_ONLY(CrossThreadCopier); +}; + } // namespace WTF #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CROSS_THREAD_COPIER_MOJO_H_
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index a614c79..c6f713a 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1340,5 +1340,22 @@ "platforms": ["Linux", "Mac", "Win"], "bases": ["external/wpt/pending_beacon"], "args": ["--enable-features=PendingBeaconAPI"] + }, + { + "prefix": "pretokenize-css", + "platforms": ["Linux", "Mac", "Win"], + "bases": [ + "external/wpt/css/css-syntax/charset", + "external/wpt/subresource-integrity", + "fast/css/cached-sheet-restore-crash.html", + "fast/css/link-alternate-stylesheet-1.html", + "fast/css/link-alternate-stylesheet-2.html", + "fast/css/link-alternate-stylesheet-3.html", + "fast/css/link-alternate-stylesheet-4.html", + "fast/css/link-alternate-stylesheet-5.html", + "fast/css/sheet-collection-link.html", + "fast/encoding/css-charset-default.xhtml" + ], + "args": ["--enable-features=PretokenizeCSS"] } ]
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations index fd70178b..228ffb3 100644 --- a/third_party/blink/web_tests/android/WebviewWPTExpectations +++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -1461,7 +1461,6 @@ crbug.com/1050754 external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-typed-om/idlharness.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-typed-om/stylevalue-normalization/normalize-image.html [ Failure Pass ] -crbug.com/1050754 external/wpt/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssUnitValue.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/numeric-factory.tentative.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-typed-om/the-stylepropertymap/properties/alignment-baseline.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/dark-mode/colors/border.html b/third_party/blink/web_tests/dark-mode/colors/border.html deleted file mode 100644 index 06c9155..0000000 --- a/third_party/blink/web_tests/dark-mode/colors/border.html +++ /dev/null
@@ -1,45 +0,0 @@ -<!doctype html> -<!-- crbug.com/1263545: light contrast input border should still be visible --> -<div style="width: 150px; background: #fff; border: 1px solid #dfe1e5;">light contrast border</div> -<br> - -<!-- crbug.com/1263545: buttons with a visible border should still have a visible border --> -<div style="width: 150px; background: #f8f9fa; border: 1px solid #dadce0;">light contrast border 2</div> -<br> - -<!-- crbug.com/1263545: buttons with no contrast border should still have no visible border --> -<!-- TODO(Lin) --> -<div style="width: 150px; background: #f8f9fa; border: 1px solid #f8f9fa;">no contrast border</div> -<br> - -<!-- crbug.com/1057723: tables with contrasting borders should still have contrasting borders --> -<table> - <tr> - <td style="border: 1px solid black; background: white;">a</td> - <td style="border: 1px solid black; background: white;">b</td> - </tr> -</table> -<br> -<table style="border-collapse: collapse;"> - <tr> - <td style="border: 1px solid black; background: white;">c</td> - <td style="border: 1px solid black; background: white;">d</td> - </tr> -</table> -<br> - -<!-- crbug.com/1271977: svg with contrasting strokes should still have contrasting strokes --> -<!-- TODO(Lin) --> -<svg width="50" height="50"> - <rect x="5" y="5" width="40" height="40" fill="white" stroke="black" stroke-width="1"></rect> -</svg> -<br> - -<!-- crbug.com/992137: heavy contrast input border should still be visible --> -<div style="width: 150px; background: #fff; border: 1px solid black;">heavy contrast border</div> -<br> - -<!-- crbug.com/992137: borders with transparent backgrounds and contrasting borders should still have contrasting borders --> -<div style="background: white;"> - <div style="width: 150px; background: transparent; border: 1px solid black;">border</div> -</div>
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index 4703dc84f..5f5494d 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 7324deb96f0649f49d81e13851e02634433a38c5 +Version: 5a8a34738d5bf0e8e86dc581edf44cbf90d483a5
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 7b5b57f..6208f5b 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -146420,6 +146420,19 @@ {} ] ], + "overflow-clip-margin-011.html": [ + "5952f5e9ded1f463bc72062d9c9fa0833b165200", + [ + null, + [ + [ + "/css/css-overflow/overflow-clip-margin-011-ref.html", + "==" + ] + ], + {} + ] + ], "overflow-clip-margin-invalidation.html": [ "d9c87a34a53f17451b0d3ae8c2071971d1df3a94", [ @@ -283315,6 +283328,10 @@ "e548417c728fce159e7a7388d5530966944bd4ea", [] ], + "overflow-clip-margin-011-ref.html": [ + "684de0cf0cbb59fdbe488573b19d9b55974ce93a", + [] + ], "overflow-clip-margin-invalidation-ref.html": [ "1ec2a5ce0a21c8dd578b3fcfde702307e4e2a9a8", [] @@ -291583,7 +291600,7 @@ }, "support": { "toggle-helpers.js": [ - "098bf481a169ba920622eb2c5a69bdb81011563e", + "48f0916b4e6dc35d6c805747756250d1d09de45c", [] ] } @@ -395245,14 +395262,14 @@ ] }, "toggle-activation-with-groups.tentative.html": [ - "d026ab368e00eff2157dd07989b7f5480fe590b7", + "1d731d902ba6683ee13622d042bff7b055ef8e3e", [ null, {} ] ], "toggle-activation.tentative.html": [ - "b087f07fd8109ab52bf7e786442e95d63f54316f", + "fca06d1ac7a9798189ed557a494fe25030a43134", [ null, {} @@ -396528,7 +396545,7 @@ ] ], "normalize-tokens.tentative.html": [ - "6dbc3e3dde4b6f0bd9596b30339a89116c763ec6", + "c83e093e62280b0ea4276c2db38273b78e1e5a70", [ null, {} @@ -530817,14 +530834,14 @@ ] ], "innerhtml-before-closing-tag.tentative.html": [ - "9a6067709066c4fdd5336975c53536a64b3dea11", + "cfa471d1a6f7ae72af382d67ef918e3b3bb46086", [ null, {} ] ], "innerhtml-on-ordinary-template.tentative.html": [ - "6d01ced8e81d96400479c19fcc6c7d702c7ce314", + "221b252ae96dbf8d04054d074d20e4b0426fbc4a", [ null, {} @@ -560007,7 +560024,7 @@ ] ], "supported-stats.html": [ - "fd08a16b11ec3dfabaad5af70b8f38255226c5a9", + "f59f5d8e8f95244aac767660fe8c141c048bd874", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-iframe.https.html b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-iframe.https.html index ea61c554..baecd33 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-iframe.https.html +++ b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-iframe.https.html
@@ -26,22 +26,6 @@ promise_test(async t => { const message = await createIframeAndWaitForMessage( - t, "support/fedcm-iframe.html", - /*setPermissionPolicy=*/false); - assert_equals(message.result, "Pass"); - assert_equals(message.token, "a_token"); -}, "FedCM enabled in same origin iframe"); - -promise_test(async t => { - const message = await createIframeAndWaitForMessage( - t, remoteBaseURL + "support/fedcm-iframe.html", - /*setPermissionPolicy=*/true); - assert_equals(message.result, "Pass"); - assert_equals(message.token, "a_token"); -}, "FedCM enabled in cross origin iframe with permissions policy"); - -promise_test(async t => { - const message = await createIframeAndWaitForMessage( t, remoteBaseURL + "support/fedcm-iframe.html", /*setPermissionPolicy=*/false); assert_equals(message.result, "Fail"); @@ -52,7 +36,24 @@ const message = await createIframeAndWaitForMessage( t, remoteBaseURL + "support/fedcm-iframe-level2.html", /*setPermissionPolicy=*/true); + assert_equals(message.result, "Pass"); + assert_equals(message.token, "a_token"); +}, "FedCM enabled in 2 level deep nested iframe. FedCM should be enabled regardless of iframe nesting depth"); + +promise_test(async t => { + const message = await createIframeAndWaitForMessage( + t, remoteBaseURL + "support/fedcm-iframe-level2.html", + /*setPermissionPolicy=*/false); assert_equals(message.result, "Fail"); assert_equals(message.errorType, "NotAllowedError"); - }, "FedCM disabled in nested cross origin iframes regardless of permissions policy"); +}, "FedCM disabled in 2 level deep nested iframe where middle iframe does not have permission policy"); + +promise_test(async t => { + const message = await createIframeAndWaitForMessage( + t, remoteBaseURL + "support/fedcm-iframe-level2-no-permission.html", + /*setPermissionPolicy=*/true); + assert_equals(message.result, "Fail"); + assert_equals(message.errorType, "NotAllowedError"); +}, "FedCM disabled in 2 level deep nested iframe where innermost iframe does not have permission policy"); + </script>
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-iframe-level2-no-permission.html b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-iframe-level2-no-permission.html new file mode 100644 index 0000000..bb285e40 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-iframe-level2-no-permission.html
@@ -0,0 +1,21 @@ +<!doctype html> +<link rel="help" href="https://wicg.github.io/FedCM"> +<script src="/common/get-host-info.sub.js"></script> +<div id=log> +<script> +'use strict'; + +const host = get_host_info(); +const remoteBaseURL = + host.AUTHENTICATED_ORIGIN + + window.location.pathname.replace(/\/[^\/]*$/, '/'); + +window.onload = async () => { + var iframe = document.createElement("iframe"); + iframe.src = remoteBaseURL + "fedcm-iframe.html"; + // No permission specified + // iframe.allow = "federated-credentials"; + document.body.appendChild(iframe); +}; + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html index 6dbc3e3d..c83e093e 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html
@@ -57,7 +57,6 @@ test(t => { assert_string_normalizes_to(t, 'margin', value, new CSSUnparsedValue(expectedResult)); - assert_false(true); }, 'Normalizing "' + value + '" on a shorthand returns correct CSSUnparsedValue'); test(t => {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/dark-mode/colors/border-expected.png deleted file mode 100644 index 44fe71d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 5a0ee9b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png index 66e4f66..802c42d9 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index ae5c3fa4..849f8e5 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 7da1797..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/dark-mode/colors/border-expected.png deleted file mode 100644 index 44fe71d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 5a0ee9b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png deleted file mode 100644 index 66e4f66..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 7da1797..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png index e62aa23..fe5fe105 100644 --- a/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ b/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/linux/dark-mode/colors/border-expected.png deleted file mode 100644 index 44fe71d..0000000 --- a/third_party/blink/web_tests/platform/linux/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 5a0ee9b..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png index 66e4f66..802c42d9 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index 1e60df3..432e3d6 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac/dark-mode/colors/border-expected.png deleted file mode 100644 index 09462e1..0000000 --- a/third_party/blink/web_tests/platform/mac/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index a931abf..6a473e1 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/win/dark-mode/colors/border-expected.png deleted file mode 100644 index 4bbf6f6..0000000 --- a/third_party/blink/web_tests/platform/win/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 5e9a5f0..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png index 310db56..dd9929d 100644 --- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index 77442b4f..ef75e312 100644 --- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/pretokenize-css/README.md b/third_party/blink/web_tests/virtual/pretokenize-css/README.md new file mode 100644 index 0000000..f1f91045 --- /dev/null +++ b/third_party/blink/web_tests/virtual/pretokenize-css/README.md
@@ -0,0 +1 @@ +This directory is for testing PretokenizeCSS (crbug.com/1289471).
diff --git a/third_party/blink/web_tests/virtual/pretokenize-css/fast/css/README.txt b/third_party/blink/web_tests/virtual/pretokenize-css/fast/css/README.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/third_party/blink/web_tests/virtual/pretokenize-css/fast/css/README.txt
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 2201eb8..6bd3c08 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -48433,6 +48433,8 @@ <int value="8" label="kLacrosDownload"/> <int value="9" label="kScan"/> <int value="10" label="kPhoneHubCameraRoll"/> + <int value="11" label="kDriveSuggestion"/> + <int value="12" label="kLocalSuggestion"/> </enum> <enum name="HoldingSpacePodAction"> @@ -51056,6 +51058,7 @@ <int value="5" label="Installed by sync"/> <int value="6" label="Installed by user action"/> <int value="7" label="Installed by SubApp API"/> + <int value="8" label="Installed by Kiosk on Chrome OS"/> </enum> <enum name="InstallSource"> @@ -59840,6 +59843,7 @@ <int value="332960119" label="PdfXfaSupport:disabled"/> <int value="333032941" label="CellularCustomAPNProfiles:enabled"/> <int value="334802038" label="OfflinePreviews:disabled"/> + <int value="335976368" label="LoadCryptoTokenExtension:disabled"/> <int value="335976733" label="NotificationStackingBarRedesign:enabled"/> <int value="336429189" label="DisallowUnsafeHttpDownloads:disabled"/> <int value="336830575" label="DeviceForceScheduledReboot:enabled"/> @@ -61029,6 +61033,7 @@ <int value="1082840061" label="LinkDoctorDeprecationAndroid:disabled"/> <int value="1083020187" label="FractionalScrollOffsets:enabled"/> <int value="1083201516" label="PersistentWindowBounds:enabled"/> + <int value="1083575298" label="LoadCryptoTokenExtension:enabled"/> <int value="1084365949" label="ReleaseNotesNotification:disabled"/> <int value="1084484359" label="ContextualTriggersSelectionSize:disabled"/> <int value="1084972292" label="WebXRAnchors:enabled"/> @@ -88979,6 +88984,7 @@ <int value="4" label="Opened from comboxbox selected"/> <int value="5" label="Opened from tab changed"/> <int value="6" label="Opened from side panel entry deregistered"/> + <int value="7" label="Opened side search via autotriggering"/> </enum> <enum name="SideSearchAvailabilityChangeType"> @@ -101068,6 +101074,7 @@ label="Installed via the Chrome Android service for installing WebAPKs from another app"/> <int value="20" label="Rich install UI in WebLayer"/> + <int value="21" label="Installed by Kiosk on Chrome OS"/> </enum> <enum name="WebAppLauncherLaunchResult">
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml index 65cefdd..98d5e82 100644 --- a/tools/metrics/histograms/metadata/apps/histograms.xml +++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -105,6 +105,7 @@ </variants> <variants name="InstallReason"> + <variant name="Kiosk" summary="Installed by Kiosk on Chrome OS"/> <variant name="Oem" summary="Installed by an OEM"/> <variant name="Policy" summary="Installed by policy"/> <variant name="Preload" summary="Preinstalled by default"/>
diff --git a/tools/metrics/histograms/metadata/holding_space/histograms.xml b/tools/metrics/histograms/metadata/holding_space/histograms.xml index 7d0424b..0cd48746 100644 --- a/tools/metrics/histograms/metadata/holding_space/histograms.xml +++ b/tools/metrics/histograms/metadata/holding_space/histograms.xml
@@ -43,9 +43,13 @@ summary="Items backed by a diagnostics log file."/> <variant name="Download" summary="Items backed by a download file originating from Ash Chrome."/> + <variant name="DriveSuggestion" + summary="Items backed by a suggested Drive file."/> <variant name="LacrosDownload" summary="Items backed by a download file originating from Lacros Chrome."/> + <variant name="LocalSuggestion" + summary="Items backed by a suggested local file."/> <variant name="NearbyShare" summary="Items backed by a nearby shared file."/> <variant name="PhoneHubCameraRoll" summary="Recent photos and videos taken on connected Android phone."/>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 5f810b3..1466fc6 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -5847,6 +5847,17 @@ </summary> </histogram> +<histogram name="Feedback.ChromeOSApp.ViewedHelpContent" units="boolean" + expires_after="2023-07-27"> + <owner>longbowei@google.com</owner> + <owner>xiangdongkong@google.com</owner> + <owner>cros-feedback-app@google.com</owner> + <summary> + Record number of times the user viewed the help content. Fires when user + clicks help content on search page. + </summary> +</histogram> + <histogram name="Feedback.ChromeOSApp.ViewedImage" units="boolean" expires_after="2023-07-27"> <owner>longbowei@google.com</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index b5ce17f..ccaf5d7b 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,16 +5,16 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "2643f7ff8a6db78346d4bdd61c6077c9507fee3f", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f87b4c862dcd8acc8879f7d69aa8e2a968f07bed/trace_processor_shell.exe" + "hash": "25ce57c21eb71e215bf9eb6f3dd823e573ac7136", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/695a70b29174a7dc11107885a7f713d75b3856d4/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "65e00b832831bd94638cc93f391882a1539e5080", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/f87b4c862dcd8acc8879f7d69aa8e2a968f07bed/trace_processor_shell" + "hash": "361cf8b371291916d5f0314367707fa587ae2647", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/695a70b29174a7dc11107885a7f713d75b3856d4/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", @@ -22,7 +22,7 @@ }, "linux": { "hash": "1a46112d1c1788ab0037e53458d9104fd932452e", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/f87b4c862dcd8acc8879f7d69aa8e2a968f07bed/trace_processor_shell" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/695a70b29174a7dc11107885a7f713d75b3856d4/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/base/models/dialog_model.h b/ui/base/models/dialog_model.h index 3ab29e7..23bc086 100644 --- a/ui/base/models/dialog_model.h +++ b/ui/base/models/dialog_model.h
@@ -135,6 +135,11 @@ return *this; } + Builder& SetSubtitle(std::u16string subtitle) { + model_->subtitle_ = std::move(subtitle); + return *this; + } + Builder& SetBannerImage(ImageModel banner, ImageModel dark_mode_banner = ImageModel()) { model_->banner_ = std::move(banner); @@ -377,6 +382,10 @@ return title_; } + const std::u16string& subtitle(base::PassKey<DialogModelHost>) const { + return subtitle_; + } + const ImageModel& main_image(base::PassKey<DialogModelHost>) const { return main_image_; } @@ -446,6 +455,7 @@ bool close_on_deactivate_ = true; std::string internal_name_; std::u16string title_; + std::u16string subtitle_; ImageModel icon_; ImageModel dark_mode_icon_;
diff --git a/ui/chromeos/translations/ui_chromeos_strings_af.xtb b/ui/chromeos/translations/ui_chromeos_strings_af.xtb index 6e36724d..44c9e41 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_af.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_af.xtb
@@ -374,6 +374,7 @@ <translation id="4336032328163998280">Kopieerhandeling het misluk. <ph name="ERROR_MESSAGE" /></translation> <translation id="4340491671558548972">Voeg by kantbalk</translation> <translation id="4348495354623233847">Sorani-Koerdies met sleutelbord wat op Arabies gegrond is</translation> +<translation id="434941167647142660">Oorspronklike ligging</translation> <translation id="4363958938297989186">Russies met fonetiese sleutelbord</translation> <translation id="4364327530094270451">Spanspek</translation> <translation id="4378551569595875038">Koppel tans …</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_my.xtb b/ui/chromeos/translations/ui_chromeos_strings_my.xtb index 62bd2ec..57ba25a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_my.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_my.xtb
@@ -374,6 +374,7 @@ <translation id="4336032328163998280">ကူးယူရန် လုပ်ကိုင်မှု မအောင်မြင်ခဲ့ပါ။ <ph name="ERROR_MESSAGE" /></translation> <translation id="4340491671558548972">ဆိုက်ဘားသို့ ထည့်ရန်</translation> <translation id="4348495354623233847">အာရဗီအခြေခံ ကီးဘုတ်ဖြင့် ဆိုရာနီကဒ်</translation> +<translation id="434941167647142660">မူလနေရာ</translation> <translation id="4363958938297989186">အသံထွက်ကီးဘုတ်ဖြင့် ရုရှား</translation> <translation id="4364327530094270451">ဖရဲသီး</translation> <translation id="4378551569595875038">ချိတ်ဆက်ရန်...</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb index ad26ef3..f525eed 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb
@@ -374,6 +374,7 @@ <translation id="4336032328163998280">प्रतिलिपि सञ्चालन असफल भयो। <ph name="ERROR_MESSAGE" /></translation> <translation id="4340491671558548972">साइडबारमा हाल्नुहोस्</translation> <translation id="4348495354623233847">अरबीमा आधारित सोरानी कुर्दिस किबोर्ड</translation> +<translation id="434941167647142660">मूल लोकेसन</translation> <translation id="4363958938297989186">रुसी फोनेटिक किबोर्ड</translation> <translation id="4364327530094270451">खरबुजो</translation> <translation id="4378551569595875038">जडान गर्दै...</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index cf40a0a..16713af 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -374,6 +374,7 @@ <translation id="4336032328163998280">Kopieringshandlingen mislyktes. <ph name="ERROR_MESSAGE" /></translation> <translation id="4340491671558548972">Legg til i sidefeltet</translation> <translation id="4348495354623233847">Sorani-kurdisk med arabisk-basert tastatur</translation> +<translation id="434941167647142660">Opprinnelig plassering</translation> <translation id="4363958938297989186">Russisk med fonetisk tastatur</translation> <translation id="4364327530094270451">Melon</translation> <translation id="4378551569595875038">Kobler til …</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index be2ff06..24eb33d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -374,6 +374,7 @@ <translation id="4336032328163998280">کاپی آپریشن ناکام ہو گیا۔ <ph name="ERROR_MESSAGE" /></translation> <translation id="4340491671558548972">سائیڈ بار میں شامل کریں</translation> <translation id="4348495354623233847">عربی پر مبنی کی بورڈ کے ساتھ سورانی کردش</translation> +<translation id="434941167647142660">اصل مقام</translation> <translation id="4363958938297989186">فونیٹک کی بورڈ کے ساتھ روسی</translation> <translation id="4364327530094270451">خربوزہ</translation> <translation id="4378551569595875038">منسلک ہو رہا ہے…</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb index cd49e2f..b1bc733d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -374,6 +374,7 @@ <translation id="4336032328163998280">Ukusebenza kwekhophi kuhlulekile. <ph name="ERROR_MESSAGE" /></translation> <translation id="4340491671558548972">Engeza kubha eseceleni</translation> <translation id="4348495354623233847">Isi-Sorani Kurdish esinekhibhodi esekelwe ku-Arabic</translation> +<translation id="434941167647142660">Indawo yoqobo</translation> <translation id="4363958938297989186">Isi-Russian esinekhibhodi ye-Phonetic</translation> <translation id="4364327530094270451">Ikhabe</translation> <translation id="4378551569595875038">Iyaxhuma...</translation>
diff --git a/ui/gtk/native_theme_gtk.cc b/ui/gtk/native_theme_gtk.cc index 93281b8..0525b8c0 100644 --- a/ui/gtk/native_theme_gtk.cc +++ b/ui/gtk/native_theme_gtk.cc
@@ -161,7 +161,7 @@ // Update the preferred contrast settings for the NativeThemeAura instance and // notify its observers about the change. ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); - native_theme->set_preferred_contrast( + native_theme->SetPreferredContrast( UserHasContrastPreference() ? ui::NativeThemeBase::PreferredContrast::kMore : ui::NativeThemeBase::PreferredContrast::kNoPreference); @@ -206,7 +206,7 @@ ::tolower); bool high_contrast = theme_name.find("high") != std::string::npos && theme_name.find("contrast") != std::string::npos; - set_preferred_contrast( + SetPreferredContrast( high_contrast ? ui::NativeThemeBase::PreferredContrast::kMore : ui::NativeThemeBase::PreferredContrast::kNoPreference);
diff --git a/ui/native_theme/BUILD.gn b/ui/native_theme/BUILD.gn index 051ecc99..33ca89b 100644 --- a/ui/native_theme/BUILD.gn +++ b/ui/native_theme/BUILD.gn
@@ -124,7 +124,7 @@ test("native_theme_unittests") { use_xvfb = use_xvfb_in_this_config - sources = [ "native_theme_features_unittest.cc" ] + sources = [] if (use_aura) { sources += [ "native_theme_aura_unittest.cc" ]
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc index d7be414..03d4a3f 100644 --- a/ui/native_theme/native_theme.cc +++ b/ui/native_theme/native_theme.cc
@@ -97,6 +97,15 @@ observer.OnCaptionStyleUpdated(); } +void NativeTheme::NotifyOnPreferredContrastUpdated() { + // This specific method is prone to being mistakenly called on the wrong + // sequence, because it is often invoked from a platform-specific event + // listener, and those events may be delivered on unexpected sequences. + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + for (NativeThemeObserver& observer : native_theme_observers_) + observer.OnPreferredContrastChanged(); +} + float NativeTheme::AdjustBorderWidthByZoom(float border_width, float zoom_level) const { float zoomed = floorf(border_width * zoom_level); @@ -157,6 +166,14 @@ return preferred_contrast_; } +void NativeTheme::SetPreferredContrast( + NativeTheme::PreferredContrast preferred_contrast) { + if (preferred_contrast_ == preferred_contrast) + return; + preferred_contrast_ = preferred_contrast; + NotifyOnPreferredContrastUpdated(); +} + bool NativeTheme::IsForcedDarkMode() const { static bool kIsForcedDarkMode = base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -261,7 +278,7 @@ notify_observers = true; } if (theme_to_update_->GetPreferredContrast() != preferred_contrast) { - theme_to_update_->set_preferred_contrast(preferred_contrast); + theme_to_update_->SetPreferredContrast(preferred_contrast); notify_observers = true; }
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index bd6a77d..823431fd 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -433,6 +433,9 @@ // Notify observers of caption style changes. virtual void NotifyOnCaptionStyleUpdated(); + // Notify observers of preferred contrast changes. + virtual void NotifyOnPreferredContrastUpdated(); + // Returns whether the user has an explicit contrast preference. virtual bool UserHasContrastPreference() const; @@ -483,9 +486,7 @@ void set_preferred_color_scheme(PreferredColorScheme preferred_color_scheme) { preferred_color_scheme_ = preferred_color_scheme; } - void set_preferred_contrast(PreferredContrast preferred_contrast) { - preferred_contrast_ = preferred_contrast; - } + void SetPreferredContrast(PreferredContrast preferred_contrast); void set_system_colors(const std::map<SystemThemeColor, SkColor>& colors); bool is_custom_system_theme() const { return is_custom_system_theme_; }
diff --git a/ui/native_theme/native_theme_features.cc b/ui/native_theme/native_theme_features.cc index 77a70108..a70f41d2 100644 --- a/ui/native_theme/native_theme_features.cc +++ b/ui/native_theme/native_theme_features.cc
@@ -41,10 +41,10 @@ } bool IsFluentScrollbarEnabled() { -// Currently, the feature is only supported on Windows. +// Currently, the feature is only supported on Windows. Please see more details +// here: https://crbug.com/1353432. #if BUILDFLAG(IS_WIN) - return IsOverlayScrollbarEnabled() && - base::FeatureList::IsEnabled(features::kFluentScrollbar); + return base::FeatureList::IsEnabled(features::kFluentScrollbar); #else return false; #endif
diff --git a/ui/native_theme/native_theme_features_unittest.cc b/ui/native_theme/native_theme_features_unittest.cc deleted file mode 100644 index 9aecc882..0000000 --- a/ui/native_theme/native_theme_features_unittest.cc +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/native_theme/native_theme_features.h" - -#include "base/test/scoped_feature_list.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace ui { - -// The unit test verifies that the Fluent scrollbar feature is enabled -// on Windows when both overlay and fluent scrollbar base features are enabled. -TEST(FluentScrollbarFeatureStateTest, Enabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {features::kOverlayScrollbar, features::kFluentScrollbar}, {}); - - EXPECT_TRUE(IsOverlayScrollbarEnabled()); -#if BUILDFLAG(IS_WIN) - EXPECT_TRUE(IsFluentScrollbarEnabled()); -#else - EXPECT_FALSE(IsFluentScrollbarEnabled()); -#endif -} - -// The unit test verifies that the Fluent scrollbar feature is disabled when -// kOverlayScrollbar base feature is disabled no matter the state of -// kFluentScrollbar. -TEST(FluentScrollbarFeatureStateTest, Disabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures({features::kFluentScrollbar}, - {features::kOverlayScrollbar}); - - EXPECT_FALSE(IsOverlayScrollbarEnabled()); - EXPECT_FALSE(IsFluentScrollbarEnabled()); -} - -// The unit test verifies that the Fluent scrollbar feature is disabled -// by default on all platforms. -TEST(FluentScrollbarFeatureStateTest, DisabledByDefault) { - EXPECT_FALSE(base::FeatureList::IsEnabled(features::kFluentScrollbar)); - EXPECT_FALSE(IsFluentScrollbarEnabled()); -} - -} // namespace ui
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm index d3c6ede..8b7b26d 100644 --- a/ui/native_theme/native_theme_mac.mm +++ b/ui/native_theme/native_theme_mac.mm
@@ -507,7 +507,7 @@ InitializeDarkModeStateAndObserver(); if (!IsForcedHighContrast()) { - set_preferred_contrast(CalculatePreferredContrast()); + SetPreferredContrast(CalculatePreferredContrast()); __block auto theme = this; high_contrast_notification_token_ = [[[NSWorkspace sharedWorkspace] notificationCenter] @@ -516,8 +516,7 @@ object:nil queue:nil usingBlock:^(NSNotification* notification) { - theme->set_preferred_contrast( - CalculatePreferredContrast()); + theme->SetPreferredContrast(CalculatePreferredContrast()); theme->NotifyOnNativeThemeUpdated(); }]; } @@ -558,7 +557,7 @@ NativeTheme* web_instance = NativeTheme::GetInstanceForWeb(); web_instance->set_use_dark_colors(IsDarkMode()); web_instance->set_preferred_color_scheme(CalculatePreferredColorScheme()); - web_instance->set_preferred_contrast(CalculatePreferredContrast()); + web_instance->SetPreferredContrast(CalculatePreferredContrast()); // Add the web native theme as an observer to stay in sync with color scheme // changes.
diff --git a/ui/native_theme/native_theme_mac_unittest.mm b/ui/native_theme/native_theme_mac_unittest.mm index c101744..14ed173 100644 --- a/ui/native_theme/native_theme_mac_unittest.mm +++ b/ui/native_theme/native_theme_mac_unittest.mm
@@ -27,7 +27,7 @@ ASSERT_TRUE(native_theme); native_theme->set_forced_colors(false); - native_theme->set_preferred_contrast(PrefContrast::kNoPreference); + native_theme->SetPreferredContrast(PrefContrast::kNoPreference); native_theme->set_preferred_color_scheme(PrefScheme::kDark); EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone); @@ -35,7 +35,7 @@ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone); native_theme->set_forced_colors(true); - native_theme->set_preferred_contrast(PrefContrast::kMore); + native_theme->SetPreferredContrast(PrefContrast::kMore); native_theme->set_preferred_color_scheme(PrefScheme::kDark); EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone); @@ -43,7 +43,7 @@ EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone); native_theme->set_forced_colors(false); - native_theme->set_preferred_contrast(PrefContrast::kNoPreference); + native_theme->SetPreferredContrast(PrefContrast::kNoPreference); EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone); }
diff --git a/ui/native_theme/native_theme_observer.h b/ui/native_theme/native_theme_observer.h index 0a5431a5..eb2240a 100644 --- a/ui/native_theme/native_theme_observer.h +++ b/ui/native_theme/native_theme_observer.h
@@ -16,11 +16,14 @@ public: // Called when the native theme changes. The observed theme is passed so that // observers may handle changes to their associated native theme instances. - virtual void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) = 0; + virtual void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) {} // Called when the caption style changes. virtual void OnCaptionStyleUpdated() {} + // Called when the system Increased Contrast state changes. + virtual void OnPreferredContrastChanged() {} + protected: virtual ~NativeThemeObserver(); };
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc index b484014..4301448 100644 --- a/ui/native_theme/native_theme_win.cc +++ b/ui/native_theme/native_theme_win.cc
@@ -302,7 +302,7 @@ // Initialize the cached system colors. UpdateSystemColors(); set_preferred_color_scheme(CalculatePreferredColorScheme()); - set_preferred_contrast(CalculatePreferredContrast()); + SetPreferredContrast(CalculatePreferredContrast()); memset(theme_handles_, 0, sizeof(theme_handles_)); @@ -326,7 +326,7 @@ web_instance->set_use_dark_colors(ShouldUseDarkColors()); web_instance->set_forced_colors(InForcedColorsMode()); web_instance->set_preferred_color_scheme(GetPreferredColorScheme()); - web_instance->set_preferred_contrast(GetPreferredContrast()); + web_instance->SetPreferredContrast(GetPreferredContrast()); web_instance->set_system_colors(GetSystemColors()); } @@ -357,7 +357,7 @@ if (!IsForcedHighContrast()) set_forced_colors(IsUsingHighContrastThemeInternal()); set_preferred_color_scheme(CalculatePreferredColorScheme()); - set_preferred_contrast(CalculatePreferredContrast()); + SetPreferredContrast(CalculatePreferredContrast()); NotifyOnNativeThemeUpdated(); }
diff --git a/ui/ozone/platform/wayland/host/wayland_popup.cc b/ui/ozone/platform/wayland/host/wayland_popup.cc index e5e32ef..7ba8780 100644 --- a/ui/ozone/platform/wayland/host/wayland_popup.cc +++ b/ui/ozone/platform/wayland/host/wayland_popup.cc
@@ -198,7 +198,7 @@ void WaylandPopup::HandleSurfaceConfigure(uint32_t serial) { if (schedule_redraw_) { - delegate()->OnDamageRect(gfx::Rect{{0, 0}, size_px()}); + delegate()->OnDamageRect(gfx::Rect{size_px()}); schedule_redraw_ = false; } ProcessPendingBoundsDip(serial); @@ -253,7 +253,7 @@ void WaylandPopup::SetWindowGeometry(gfx::Rect bounds_dip) { DCHECK(shell_popup_); gfx::Point p; - // TODO(crbug.com/1306688): Use DIP for frame_sets. + // TODO(crbug.com/1306688): Use DIP for frame insets. if (frame_insets_px() && !frame_insets_px()->IsEmpty()) { p = gfx::ScaleToRoundedPoint( {frame_insets_px()->left(), frame_insets_px()->top()},
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 4b9e3781..576a3d3 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -298,14 +298,14 @@ } void WaylandWindow::SetBoundsInPixels(const gfx::Rect& bounds_px) { - // TODO(crbug.com/): This is currently used only by unit tests. + // TODO(crbug.com/1306688): This is currently used only by unit tests. // Figure out how to migrate to test only methods. auto bounds_dip = delegate_->ConvertRectToDIP(bounds_px); SetBoundsInDIP(bounds_dip); } gfx::Rect WaylandWindow::GetBoundsInPixels() const { - // TODO(crbug.com/): This is currently used only by unit tests. + // TODO(crbug.com/1306688): This is currently used only by unit tests. // Figure out how to migrate to test only methods. return delegate_->ConvertRectToPixels(bounds_dip_); }
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 603fb3c..c33a1441 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -450,24 +450,24 @@ // requested size by the Wayland compositor. When this is set in SetBounds(), // delegate_->OnBoundsChanged() is called and updates current_surface_size in // Viz. However, it is not guaranteed that the next arriving frame will match - // |bounds_px_|. - // gfx::Rect bounds_px_; - + // |bounds_dip_|. gfx::Rect bounds_dip_; gfx::Size size_px_; // The size presented by the gpu process. This is the visible size of the - // window, which can be different from |bounds_px_| due to renderers taking - // time to produce a compositor frame. + // window, which can be different from |bounds_dip_| * scale due to renderers + // taking time to produce a compositor frame. // The rough flow of size changes: // Wayland compositor -> xdg_surface.configure() // -> WaylandWindow::SetBounds() -> IPC -> DisplayPrivate::Resize() // -> OutputSurface::SwapBuffers() -> WaylandWindow::UpdateVisualSize() // -> xdg_surface.ack_configure() -> Wayland compositor. gfx::Size visual_size_px_; + // Margins between edges of the surface and the window geometry (i.e., the // area of the window that is visible to the user as the actual window). The // areas outside the geometry are used to draw client-side window decorations. + // TODO(crbug.com/1306688): Use DIP for frame insets. absl::optional<gfx::Insets> frame_insets_px_; bool has_touch_focus_ = false;
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc index 7d3f9f7..7722c65 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -891,6 +891,19 @@ GetWidget()->SetBounds(bubble_bounds); } +std::u16string BubbleDialogDelegate::GetSubtitle() const { + return subtitle_; +} + +void BubbleDialogDelegate::SetSubtitle(const std::u16string& subtitle) { + if (subtitle_ == subtitle) + return; + subtitle_ = subtitle; + BubbleFrameView* frame_view = GetBubbleFrameView(); + if (frame_view) + frame_view->UpdateSubtitle(); +} + void BubbleDialogDelegate::UpdateColorsFromTheme() { View* const contents_view = GetContentsView(); DCHECK(contents_view);
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.h b/ui/views/bubble/bubble_dialog_delegate_view.h index 3eb7eca..caab6dfe 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.h +++ b/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -145,6 +145,17 @@ void OnAnchorBoundsChanged(); ////////////////////////////////////////////////////////////////////////////// + // Subtitle: + // + // Bubbles have an optional a Subtitle label under the Title. + // This subtitle label is represented in BubbleFrameView. + + // This method is virtual for BubbleFrameViewUnitTest purposes. + // Not intended to be overridden in production. + virtual std::u16string GetSubtitle() const; + void SetSubtitle(const std::u16string& subtitle); + + ////////////////////////////////////////////////////////////////////////////// // Miscellaneous bubble behaviors: // @@ -388,6 +399,7 @@ bool focus_traversable_from_anchor_view_ = true; ViewTracker highlighted_button_tracker_; ui::ImageModel main_image_; + std::u16string subtitle_; // A flag controlling bubble closure on deactivation. bool close_on_deactivate_ = true;
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc index 5007366..072b45b 100644 --- a/ui/views/bubble/bubble_dialog_model_host.cc +++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -372,6 +372,8 @@ SetTitle(model_->title(GetPassKey())); + SetSubtitle(model_->subtitle(GetPassKey())); + if (!model_->main_image(GetPassKey()).IsEmpty()) SetMainImage(model_->main_image(GetPassKey()));
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index 0f35eebc..9c33e06e 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -106,10 +106,12 @@ footnote_margins_(content_margins_), title_icon_(AddChildView(std::make_unique<ImageView>())), main_image_(AddChildView(std::make_unique<ImageView>())), - default_title_(CreateDefaultTitleLabel(std::u16string()).release()) { + default_title_(AddChildView(CreateDefaultTitleLabel(std::u16string()))), + subtitle_(AddChildView( + CreateLabelWithContext(std::u16string(), style::CONTEXT_LABEL))) { default_title_->SetVisible(false); - AddChildView(default_title_.get()); main_image_->SetVisible(false); + subtitle_->SetVisible(false); auto close = CreateCloseButton(base::BindRepeating( [](BubbleFrameView* view, const ui::Event& event) { @@ -157,11 +159,7 @@ // static std::unique_ptr<Label> BubbleFrameView::CreateDefaultTitleLabel( const std::u16string& title_text) { - auto title = std::make_unique<Label>(title_text, style::CONTEXT_DIALOG_TITLE); - title->SetHorizontalAlignment(gfx::ALIGN_LEFT); - title->SetCollapseWhenHidden(true); - title->SetMultiLine(true); - return title; + return CreateLabelWithContext(title_text, style::CONTEXT_DIALOG_TITLE); } // static @@ -336,6 +334,7 @@ default_title_->SetVisible(delegate->ShouldShowWindowTitle() && !delegate->GetWindowTitle().empty()); default_title_->SetText(delegate->GetWindowTitle()); + UpdateSubtitle(); } // custom_title_'s updates are handled by its creator. InvalidateLayout(); } @@ -359,6 +358,20 @@ AddChildViewAt(title_view.release(), GetIndexOf(title_icon_).value() + 1); } +void BubbleFrameView::UpdateSubtitle() { + if (!subtitle_) + return; + views::BubbleDialogDelegate* const bubble_delegate = + GetWidget()->widget_delegate()->AsBubbleDialogDelegate(); + if (!bubble_delegate) + return; + // Subtitle anchors and margins rely heavily on Title being visible. + subtitle_->SetVisible(!bubble_delegate->GetSubtitle().empty() && + default_title_->GetVisible()); + subtitle_->SetText(bubble_delegate->GetSubtitle()); + InvalidateLayout(); +} + void BubbleFrameView::UpdateMainImage() { views::BubbleDialogDelegate* const bubble_delegate = GetWidget()->widget_delegate()->AsBubbleDialogDelegate(); @@ -539,11 +552,23 @@ main_image_->SetBounds(0, 0, main_image_->GetPreferredSize().width(), main_image_->GetPreferredSize().height()); + + // Set the Subtitle bounds only if it's visible. + // The width of the Subtitle will match the Title so in cases where the Title + // is not visible, the Subtitle will also not be visible + if (subtitle_->GetVisible()) { + const int subtitle_preferred_height = + subtitle_->GetHeightForWidth(title_available_width); + const int subtitle_label_y = bounds.y() + title_height; + subtitle_->SetBounds(title_label_x, subtitle_label_y, title_available_width, + subtitle_preferred_height); + } } void BubbleFrameView::OnThemeChanged() { NonClientFrameView::OnThemeChanged(); UpdateWindowTitle(); + UpdateSubtitle(); ResetWindowControls(); UpdateWindowIcon(); UpdateMainImage(); @@ -1000,9 +1025,17 @@ frame_width - GetTitleLabelInsetsFromFrame().width()); const int title_height = std::max(icon_height, label_height) + title_margins_.height(); + const int subtitle_height = + subtitle_->GetVisible() + ? subtitle_->GetHeightForWidth(frame_width - + GetTitleLabelInsetsFromFrame().width()) + : 0; + return content_margins_ + - gfx::Insets::TLBR(std::max(title_height + header_height, close_height), - GetMainImageLeftInsets(), 0, 0); + gfx::Insets::TLBR( + std::max(title_height + header_height + subtitle_height, + close_height), + GetMainImageLeftInsets(), 0, 0); } int BubbleFrameView::GetHeaderHeightForFrameWidth(int frame_width) const { @@ -1028,6 +1061,17 @@ main_image_->GetBorder()->GetInsets().right(); } +// static +std::unique_ptr<Label> BubbleFrameView::CreateLabelWithContext( + const std::u16string& label_text, + style::TextContext text_context) { + auto label = std::make_unique<Label>(label_text, text_context); + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); + label->SetCollapseWhenHidden(true); + label->SetMultiLine(true); + return label; +} + BEGIN_METADATA(BubbleFrameView, NonClientFrameView) ADD_PROPERTY_METADATA(absl::optional<double>, Progress) ADD_PROPERTY_METADATA(gfx::Insets, ContentMargins)
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h index 7310a9a..2f9504e 100644 --- a/ui/views/bubble/bubble_frame_view.h +++ b/ui/views/bubble/bubble_frame_view.h
@@ -69,6 +69,9 @@ // label. If there is an existing title view it will be deleted. void SetTitleView(std::unique_ptr<View> title_view); + // Updates the subtitle label from the BubbleDialogDelegate. + void UpdateSubtitle(); + // Signals that the main image may have changed and needs to be fetched again. void UpdateMainImage(); @@ -255,6 +258,11 @@ int GetMainImageLeftInsets() const; + // Helper method to create a label with text style + static std::unique_ptr<Label> CreateLabelWithContext( + const std::u16string& label_text, + style::TextContext text_context); + // The bubble border. raw_ptr<BubbleBorder> bubble_border_ = nullptr; @@ -278,7 +286,7 @@ // ownership. Otherwise |default_title_| is used. raw_ptr<Label> default_title_ = nullptr; raw_ptr<View> custom_title_ = nullptr; - + raw_ptr<Label> subtitle_ = nullptr; // The optional close button (the X). raw_ptr<Button> close_ = nullptr;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index 741f943..927933b 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -929,10 +929,17 @@ SizeToContents(); } + void ChangeSubtitle(const std::u16string& subtitle) { + subtitle_ = subtitle; + GetBubbleFrameView()->UpdateSubtitle(); + SizeToContents(); + } + // BubbleDialogDelegateView: using BubbleDialogDelegateView::SetAnchorView; using BubbleDialogDelegateView::SizeToContents; std::u16string GetWindowTitle() const override { return title_; } + std::u16string GetSubtitle() const override { return subtitle_; } bool ShouldShowWindowTitle() const override { return !title_.empty(); } bool ShouldShowCloseButton() const override { return should_show_close_; } void SetShouldShowCloseButton(bool should_show_close) { @@ -950,6 +957,7 @@ private: std::u16string title_; + std::u16string subtitle_; bool should_show_close_ = false; }; @@ -1125,7 +1133,7 @@ frame->GetCloseButtonForTesting()->height() + LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN); - // Set a header view that is 1 dip smaller smaller than the close button. + // Set a header view that is 1 dip smaller than the close button. frame->SetHeaderView( std::make_unique<StaticSizedView>(gfx::Size(10, close_margin - 1))); @@ -1162,6 +1170,56 @@ // When |anchor| goes out of scope it should take |bubble| with it. } +// Layout tests with Subtitle label. +// This will test adding a Subtitle and wrap-around case for Subtitle. +TEST_F(BubbleFrameViewTest, LayoutSubtitleEdgeCases) { + test::TestLayoutProvider provider; + auto delegate_unique = std::make_unique<TestBubbleDialogDelegateView>(); + TestBubbleDialogDelegateView* const delegate = delegate_unique.get(); + TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW)); + delegate->SetAnchorView(anchor.widget().GetContentsView()); + + Widget* bubble = + BubbleDialogDelegateView::CreateBubble(std::move(delegate_unique)); + bubble->Show(); + + // Even though the bubble has default margins, the dialog view should have + // been given its preferred size. + EXPECT_FALSE(delegate->margins().IsEmpty()); + EXPECT_EQ(delegate->size(), delegate->GetPreferredSize()); + + // Add title to bubble frame view. + delegate->ChangeTitle(u"This is a title"); + + int min_bubble_height = bubble->GetWindowBoundsInScreen().height(); + EXPECT_LT(delegate->GetPreferredSize().height(), min_bubble_height); + + // Add a short subtitle to guarantee a one-line addition. + // Line height can vary depending on the platform so check + // boundary where the height diff is between 12 and 18. + // (12 < single_line_height < 18) + std::u16string subtitle(1, 'j'); + delegate->ChangeSubtitle(subtitle); + int line_height_diff = + bubble->GetWindowBoundsInScreen().height() - min_bubble_height; + EXPECT_GT(line_height_diff, 12); + EXPECT_LT(line_height_diff, 18); + + // Set the new min bubble height with a Subtitle added. + min_bubble_height = bubble->GetWindowBoundsInScreen().height(); + // Grow the subtitle incrementally until word wrap is required. + while (bubble->GetWindowBoundsInScreen().height() == min_bubble_height) { + subtitle += u" j"; + delegate->ChangeSubtitle(subtitle); + } + + // Subtitle wrap should have increased by one line. + line_height_diff = + bubble->GetWindowBoundsInScreen().height() - min_bubble_height; + EXPECT_GT(line_height_diff, 12); + EXPECT_LT(line_height_diff, 18); +} + TEST_F(BubbleFrameViewTest, LayoutWithIcon) { auto delegate_unique = std::make_unique<TestBubbleDialogDelegateView>(); TestBubbleDialogDelegateView* const delegate = delegate_unique.get();
diff --git a/ui/webui/resources/cr_components/app_management/app_management.mojom b/ui/webui/resources/cr_components/app_management/app_management.mojom index c19cec68..6ee4e0e 100644 --- a/ui/webui/resources/cr_components/app_management/app_management.mojom +++ b/ui/webui/resources/cr_components/app_management/app_management.mojom
@@ -77,6 +77,7 @@ kSync, // Installed by sync. kUser, // Installed by user action. kSubApp, // Installed by the SubApp API call. + kKiosk, // Installed by Kiosk on Chrome OS. }; // Where the app was installed from.
diff --git a/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc b/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc index ba363db..439f1b4 100644 --- a/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc +++ b/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc
@@ -245,6 +245,8 @@ return InstallReason::kUser; case apps::InstallReason::kSubApp: return InstallReason::kSubApp; + case apps::InstallReason::kKiosk: + return InstallReason::kKiosk; } } @@ -276,6 +278,9 @@ case InstallReason::kSubApp: *output = apps::InstallReason::kSubApp; return true; + case InstallReason::kKiosk: + *output = apps::InstallReason::kKiosk; + return true; } }